@guidelytech/guide-runtime 0.11.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/messenger.ts","../src/howto-view.ts","../src/complaint-view.ts","../src/ideas-view.ts","../src/render-safe.ts","../src/messenger-styles.ts"],"sourcesContent":["import type {\n ConversationMessagesResponse,\n FileComplaintResponse,\n MessengerComplaint,\n MessengerComplaintCategory,\n MessengerConfig,\n MessengerConversation,\n MessengerMessage,\n MessengerPageContent,\n MessengerStatus,\n PublicFeedbackRequestDetail,\n ResourceCenterArticle,\n ResourceCenterConfig,\n ResourceCenterModuleId,\n RuleGroup,\n SdkArticlesResponse,\n SdkHowTo,\n SdkHowToSummary,\n SdkHowTosResponse,\n} from \"@guidelytech/shared\";\nimport { foldPathIds, matchesHelpQuery, orderedModules, pageLabel } from \"@guidelytech/shared/runtime\";\nimport { createHelpView, el, resultRow, startableGuide, type HelpData, type HelpGuideRef, type HelpSuggestion } from \"./help-view\";\nimport { renderHowTo } from \"./howto-view\";\nimport { categoryList, complaintAnswers, complaintForm, complaintProblem, complaintSent, emptyComplaintDraft, readScreenshot, statusPill, type ComplaintDraft, type ComplaintInput } from \"./complaint-view\";\nimport { createIdeas, IDEA_ICON, type IdeasApi } from \"./ideas-view\";\nimport { MESSENGER_STYLES } from \"./messenger-styles\";\nimport { renderSafeText } from \"./render-safe\";\n\n/** Callbacks the transport invokes while a message is sent and Scout replies. */\nexport interface MessengerStreamHandlers {\n /** A new conversation was created (first message only). */\n onConversation?(conversation: MessengerConversation): void;\n onMessage(message: MessengerMessage): void;\n onDelta(messageId: string, text: string): void;\n onDone(message: MessengerMessage | null, conversation: MessengerConversation): void;\n onError(message: string): void;\n}\n\nexport type { IdeaInput, IdeaListQuery, IdeaVoteInput, IdeasApi } from \"./ideas-view\";\n\n/** Server access for the messenger; implemented by sdk-core over the public SDK API. The Ideas methods ({@link IdeasApi}) are optional. */\nexport interface MessengerApi extends IdeasApi {\n listConversations(): Promise<MessengerConversation[]>;\n loadMessages(conversationId: string, since?: string | null): Promise<ConversationMessagesResponse>;\n start(text: string, handlers: MessengerStreamHandlers): Promise<void>;\n send(conversationId: string, text: string, handlers: MessengerStreamHandlers): Promise<void>;\n handoff(conversationId: string): Promise<ConversationMessagesResponse>;\n rate(conversationId: string, rating: number): Promise<void>;\n listArticles(): Promise<SdkArticlesResponse>;\n getArticle(id: string): Promise<ResourceCenterArticle | null>;\n searchArticles(q: string): Promise<ResourceCenterArticle[]>;\n /** How-tos available in the app, and the ones for the page the user is on (optional: older transports). */\n listHowTos?(): Promise<SdkHowTosResponse>;\n getHowTo?(id: string): Promise<SdkHowTo | null>;\n /** Page-matched how-tos, articles and common questions (servers before the personalised home lack it). */\n pageContent?(path: string): Promise<MessengerPageContent>;\n /** Files a complaint (transports before complaints lack it; the messenger then hides the form). */\n fileComplaint?(input: ComplaintInput): Promise<FileComplaintResponse>;\n}\n\nexport type MessengerTab = \"home\" | \"messages\" | \"help\" | \"ideas\" | \"news\";\n\n/** A guide the visitor started and didn't finish. */\nexport interface MessengerResumeGuide {\n id: string;\n name: string;\n stepId: string;\n /** Zero-based index of the step they reached. */\n stepIndex: number;\n stepCount: number;\n}\n\nexport interface MessengerChecklistProgress {\n id: string;\n name: string;\n done: number;\n total: number;\n /** Title of the first unfinished task. */\n nextTask: string | null;\n}\n\n/** A live announcement, shown on Home and in the News tab. */\nexport interface MessengerNewsItem {\n id: string;\n key: string;\n title: string;\n /** Plain text. */\n body: string;\n imageUrl: string | null;\n publishedAt: string;\n unread: boolean;\n /** Resource-center \"What's new\" entries: open this help article, or this link, instead of starting a guide. */\n articleId?: string | null;\n url?: string | null;\n}\n\n/** What the SDK knows about the visitor right now, read each time the messenger renders. */\nexport interface MessengerVisitor {\n firstName: string | null;\n /** The app identified the visitor (`identify()`); false for anonymous visitors. Unknown counts as identified. */\n identified?: boolean;\n /** Current page path (no query or fragment); null when unknown. */\n path: string | null;\n /** Live guides targeted at this page that the visitor can start. */\n pageGuides: HelpGuideRef[];\n resumeGuide: MessengerResumeGuide | null;\n checklist: MessengerChecklistProgress | null;\n news: MessengerNewsItem[];\n}\n\nexport interface MessengerOptions {\n scope: HTMLElement;\n config: MessengerConfig;\n api: MessengerApi;\n /** Resource center extras (recommended guides, checklists, FAQs, links) shown in the Help tab. */\n resourceCenter?: ResourceCenterConfig | null;\n /** The visitor's audiences (for audience-targeted articles and collections in the Help tab). */\n audienceIds?: () => ReadonlySet<string> | readonly string[];\n guides?: HelpGuideRef[];\n onStartGuide?: (guideKeyOrId: string) => void;\n onOpenChecklist?: (guideId: string) => void;\n onArticleView?: (article: ResourceCenterArticle) => void;\n onOpen?: () => void;\n onClose?: () => void;\n onMessage?: (message: MessengerMessage, conversation: MessengerConversation) => void;\n /** Personalisation: name, page, progress and announcements. Without it the home screen is generic. */\n visitor?: () => MessengerVisitor;\n /** Logo and name shown at the top of the home screen (project theme). */\n brand?: { logoUrl?: string | null; name?: string | null };\n onResumeGuide?: (guideId: string, stepId: string) => void;\n /** Evaluates a resource-center section's targeting for the current visitor (absent = every section shows). */\n evaluate?: (rules: RuleGroup) => boolean;\n /** The visitor saw these announcements (News tab opened). */\n onNewsSeen?: (ids: string[]) => void;\n hideLauncher?: boolean;\n /** Poll intervals (ms): open thread, and unread badge while closed. */\n pollMs?: { thread: number; background: number };\n}\n\nexport interface MessengerWidget {\n el: HTMLElement;\n open(tab?: MessengerTab): void;\n close(): void;\n toggle(): void;\n isOpen(): boolean;\n /** Opens a new conversation, optionally pre-filling the composer. */\n showNewMessage(text?: string): void;\n openArticle(id: string): void;\n /** Opens the complaint form, optionally with a category picked (when the project takes complaints). */\n openComplaint(categoryId?: string): void;\n /** Opens the Ideas tab, or one idea (when the project turned Ideas on). */\n openIdeas(requestId?: string): void;\n /** Re-reads the visitor (page changed, progress made) and re-renders what is showing. */\n refresh(): void;\n destroy(): void;\n}\n\ntype View =\n | { kind: \"tab\"; tab: MessengerTab }\n | { kind: \"thread\"; conversationId: string | null }\n | { kind: \"howto\"; id: string; from: View }\n /** Filing a complaint: pick a category, fill in the form (in `conversationId` when Scout offered it), then the reference. */\n | { kind: \"complaint-category\"; conversationId: string | null; from: View }\n | { kind: \"complaint-form\"; categoryId: string; conversationId: string | null; from: View }\n | { kind: \"complaint-sent\"; complaint: MessengerComplaint; conversationId: string; answers: Array<[string, string]> }\n /** Ideas (the list is the \"ideas\" tab): one idea, the \"Suggest an idea\" form, its confirmation, updates. */\n | { kind: \"idea\"; id: string; from: View }\n | { kind: \"idea-new\"; from: View }\n | { kind: \"idea-sent\"; idea: PublicFeedbackRequestDetail }\n | { kind: \"idea-updates\"; from: View };\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\nfunction chatIcon(doc: Document): SVGSVGElement {\n const svg = doc.createElementNS(SVG_NS, \"svg\");\n svg.setAttribute(\"viewBox\", \"0 0 24 24\");\n svg.setAttribute(\"aria-hidden\", \"true\");\n const path = doc.createElementNS(SVG_NS, \"path\");\n path.setAttribute(\"d\", \"M12 3C6.5 3 2 6.8 2 11.5c0 2.4 1.2 4.6 3.1 6.1L4.5 21l3.9-2c1.1.3 2.3.5 3.6.5 5.5 0 10-3.8 10-8.5S17.5 3 12 3z\");\n svg.appendChild(path);\n return svg;\n}\n\n/** Stroke icons (24×24 viewBox), drawn with currentColor. */\nconst ICONS: Record<string, string[]> = {\n home: [\"M3 10.5 12 3l9 7.5V20a1 1 0 0 1-1 1h-5v-6H9v6H4a1 1 0 0 1-1-1z\"],\n messages: [\"M4 5h16v11H8l-4 4z\"],\n help: [\"M12 3a9 9 0 1 0 0 18 9 9 0 0 0 0-18z\", \"M9.5 9.5a2.5 2.5 0 1 1 3.5 2.3c-.6.3-1 .8-1 1.5V14\", \"M12 17h.01\"],\n news: [\"M3 11v2a1 1 0 0 0 1 1h2l5 4V6L6 10H4a1 1 0 0 0-1 1z\", \"M15 9a4 4 0 0 1 0 6\", \"M18 6a8 8 0 0 1 0 12\"],\n arrow: [\"M5 12h14\", \"M13 6l6 6-6 6\"],\n close: [\"M6 6l12 12\", \"M18 6 6 18\"],\n back: [\"M15 6l-6 6 6 6\"],\n chevron: [\"m9 6 6 6-6 6\"],\n check: [\"M12 3a9 9 0 1 0 0 18 9 9 0 0 0 0-18z\", \"m8 12 3 3 5-6\"],\n alert: [\"M12 3a9 9 0 1 0 0 18 9 9 0 0 0 0-18z\", \"M12 8v4\", \"M12 16h.01\"],\n wrench: [\"M14.7 6.3a4 4 0 0 0-5.4 5.4L4 17l3 3 5.3-5.3a4 4 0 0 0 5.4-5.4l-2.5 2.5-2.4-.6-.6-2.4z\"],\n play: [\"M8 5v14l11-7z\"],\n steps: [\"M9 6h11\", \"M9 12h11\", \"M9 18h11\", \"M4 6h.01\", \"M4 12h.01\", \"M4 18h.01\"],\n article: [\"M6 3h9l4 4v14H6z\", \"M9 12h6\", \"M9 16h6\"],\n ask: [\"M4 5h16v11H8l-4 4z\", \"M9 9.5h6\", \"M9 12.5h4\"],\n search: [\"M11 4a7 7 0 1 0 0 14 7 7 0 0 0 0-14z\", \"m20 20-3.5-3.5\"],\n circle: [\"M12 3a9 9 0 1 0 0 18 9 9 0 0 0 0-18z\"],\n expand: [\"M15 3h6v6\", \"M21 3l-7 7\", \"M9 21H3v-6\", \"M3 21l7-7\"],\n flag: [\"M5 21V4\", \"M5 4h12l-2.5 4L17 12H5\"],\n collapse: [\"M4 14h6v6\", \"M3 21l7-7\", \"M20 10h-6V4\", \"M21 3l-7 7\"],\n idea: IDEA_ICON,\n};\n\nfunction icon(doc: Document, name: keyof typeof ICONS, cls = \"g-m-ico\"): SVGSVGElement {\n const svg = doc.createElementNS(SVG_NS, \"svg\");\n svg.setAttribute(\"viewBox\", \"0 0 24 24\");\n svg.setAttribute(\"aria-hidden\", \"true\");\n svg.setAttribute(\"class\", cls);\n for (const d of ICONS[name] ?? []) {\n const path = doc.createElementNS(SVG_NS, \"path\");\n path.setAttribute(\"d\", d);\n svg.appendChild(path);\n }\n return svg;\n}\n\nconst REPLY_TIME_TEXT: Record<string, string> = {\n minutes: \"typically replies in a few minutes\",\n hour: \"typically replies within an hour\",\n hours: \"typically replies in a few hours\",\n day: \"typically replies within a day\",\n};\n\nconst STATUS_TEXT: Record<MessengerStatus[\"level\"], { title: string; icon: keyof typeof ICONS }> = {\n operational: { title: \"All systems operational\", icon: \"check\" },\n degraded: { title: \"Degraded performance\", icon: \"alert\" },\n outage: { title: \"Service outage\", icon: \"alert\" },\n maintenance: { title: \"Scheduled maintenance\", icon: \"wrench\" },\n};\n\n/** \"Oct 18, 08:12\" in the visitor's locale and time zone. */\nfunction shortDateTime(iso: string): string {\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return \"\";\n try {\n return d.toLocaleString(undefined, { month: \"short\", day: \"numeric\", hour: \"2-digit\", minute: \"2-digit\" });\n } catch {\n return d.toISOString().slice(0, 16).replace(\"T\", \" \");\n }\n}\n\nfunction shortDate(iso: string): string {\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return \"\";\n try {\n return d.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" });\n } catch {\n return d.toISOString().slice(0, 10);\n }\n}\n\n/** Initials for an avatar fallback (\"Jordan\" → \"J\"). */\nconst initialOf = (name: string) => (name.trim().match(/\\p{L}/u)?.[0] ?? \"?\").toUpperCase();\n\n/** The greeting with a leading \"Hi!\" swapped for the visitor's name (\"Hi! I'm Scout.\" → \"Hi Maya! I'm Scout.\"). */\nexport function personalGreeting(greeting: string, firstName: string | null): string {\n if (!firstName) return greeting;\n const rest = greeting.replace(/^\\s*(hi|hello|hey)( there)?\\s*[!,.]?\\s*/i, \"\");\n return rest ? `Hi ${firstName}! ${rest}` : `Hi ${firstName}!`;\n}\n\nexport function relativeTime(iso: string, now = Date.now()): string {\n const s = Math.max(0, Math.round((now - Date.parse(iso)) / 1000));\n if (!Number.isFinite(s) || s < 60) return \"now\";\n if (s < 3600) return `${Math.floor(s / 60)}m`;\n if (s < 86400) return `${Math.floor(s / 3600)}h`;\n return `${Math.floor(s / 86400)}d`;\n}\n\nfunction ensureStyles(scope: HTMLElement) {\n const root = scope.getRootNode() as ShadowRoot | Document;\n const container = \"host\" in root ? root : scope.ownerDocument.head;\n if (container.querySelector?.(\"style[data-g-messenger]\")) return;\n const style = scope.ownerDocument.createElement(\"style\");\n style.setAttribute(\"data-g-messenger\", \"\");\n style.textContent = MESSENGER_STYLES;\n container.appendChild(style);\n}\n\n/** Intercom-style messenger: launcher + panel with Home, Messages (chat with Scout / the team) and Help tabs. */\nexport function renderMessenger(options: MessengerOptions): MessengerWidget {\n const { scope, config, api } = options;\n const doc = scope.ownerDocument;\n const poll = options.pollMs ?? { thread: 5000, background: 60000 };\n ensureStyles(scope);\n\n let open = false;\n let destroyed = false;\n let view: View = { kind: \"tab\", tab: \"home\" };\n let conversations: MessengerConversation[] = [];\n let messages: MessengerMessage[] = [];\n let current: MessengerConversation | null = null;\n const streaming = new Map<string, string>();\n let sending = false;\n let complaintDraft: ComplaintDraft = emptyComplaintDraft();\n let draft = \"\";\n let articles: SdkArticlesResponse | null = null;\n let articlesLoading = false;\n let threadTimer: ReturnType<typeof setTimeout> | null = null;\n let backgroundTimer: ReturnType<typeof setInterval> | null = null;\n let threadSeq = 0;\n let howTos: SdkHowTosResponse | null = null;\n let howTosSeq = 0;\n /** Loaded how-tos by id; null when it couldn't be loaded (switched off, deleted). */\n const howToCache = new Map<string, SdkHowTo | null>();\n // Page-matched content for the page the visitor is on, refetched when the page changes.\n let page: MessengerPageContent | null = null;\n let pageKey: string | null = null;\n let pageAt = 0;\n let pageSeq = 0;\n let pageLoading = false;\n const PAGE_TTL_MS = 120_000;\n\n const cards = { suggestions: config.home?.suggestions !== false, progress: config.home?.progress !== false, news: config.home?.news !== false };\n const visitor = (): MessengerVisitor => {\n try {\n const v = options.visitor?.();\n if (v) return v;\n } catch {\n /* a broken host callback must not break the messenger */\n }\n return { firstName: null, path: null, pageGuides: [], resumeGuide: null, checklist: null, news: [] };\n };\n const news = () => (cards.news ? visitor().news : []);\n\n const pos = `g-pos-${config.launcher.position}`;\n // Other launchers (checklists, resource center) in the same corner move aside for the chat bubble.\n const rootNode = scope.getRootNode();\n const shadowHost = \"host\" in rootNode ? (rootNode.host as HTMLElement) : null;\n shadowHost?.setAttribute(\"data-g-messenger\", config.launcher.position);\n const root = el(doc, \"div\", \"g-messenger-root\");\n const launcher = el(doc, \"button\", `g-m-launcher ${pos}`);\n launcher.type = \"button\";\n launcher.setAttribute(\"aria-label\", `Open ${config.name}`);\n launcher.setAttribute(\"aria-expanded\", \"false\");\n launcher.appendChild(chatIcon(doc));\n const badge = el(doc, \"span\", \"g-m-badge\");\n badge.hidden = true;\n launcher.appendChild(badge);\n if (options.hideLauncher) launcher.hidden = true;\n\n const panel = el(doc, \"div\", `g-panel g-messenger ${pos}`);\n panel.setAttribute(\"role\", \"dialog\");\n panel.setAttribute(\"aria-label\", config.name);\n panel.hidden = true;\n const head = el(doc, \"div\", \"g-m-head\");\n const main = el(doc, \"div\", \"g-m-main\");\n const tabs = el(doc, \"div\", \"g-m-tabs\");\n tabs.setAttribute(\"role\", \"tablist\");\n panel.append(head, main, tabs);\n root.append(launcher, panel);\n scope.appendChild(root);\n\n /** Live article and collection lists take their (translated) texts from the resource center the SDK localized. */\n function withRcText<T extends { id: string }, R extends { id: string }>(items: T[], rc: readonly R[] | undefined, apply: (item: T, rcItem: R) => T): T[] {\n if (!rc?.length) return items;\n const byId = new Map(rc.map((x) => [x.id, x]));\n return items.map((i) => (byId.has(i.id) ? apply(i, byId.get(i.id)!) : i));\n }\n /** The resource center's sections in its order (on, and targeted at this visitor); What's new lives in the News tab. */\n const helpModules = () =>\n options.resourceCenter?.modules?.length\n ? orderedModules(options.resourceCenter.modules)\n .filter((m) => m.id !== \"announcements\" && m.enabled && (!(\"targeting\" in m) || !m.targeting || !options.evaluate || options.evaluate(m.targeting)))\n .map((m) => m.id as ResourceCenterModuleId)\n : undefined;\n const rcExtras = (ids: string[] = []) => ids.map((id) => options.guides?.find((g) => g.id === id || g.key === id)).filter((g): g is HelpGuideRef => !!g);\n const help = createHelpView({\n doc,\n data: (): HelpData => ({\n collections: withRcText(articles?.collections ?? options.resourceCenter?.collections ?? [], options.resourceCenter?.collections, (c, t) => ({ ...c, name: t.name, description: t.description })),\n articles: withRcText<HelpData[\"articles\"][number], ResourceCenterArticle>(articles?.articles ?? options.resourceCenter?.articles ?? [], options.resourceCenter?.articles, (a, t) => ({ ...a, title: t.title, summary: t.summary })),\n suggested: helpSuggestions(),\n recommended: rcExtras(options.resourceCenter?.recommendedGuideIds),\n checklists: rcExtras(options.resourceCenter?.checklistGuideIds),\n faqs: options.resourceCenter?.faqs,\n links: options.resourceCenter?.links,\n modules: helpModules(),\n }),\n search: (q) => api.searchArticles(q),\n audienceIds: options.audienceIds,\n loadArticle: (id) => api.getArticle(id),\n onStartGuide: (id) => {\n setOpen(false);\n options.onStartGuide?.(id);\n },\n onOpenChecklist: (id) => {\n setOpen(false);\n options.onOpenChecklist?.(id);\n },\n onArticleView: options.onArticleView,\n extra: (q) => howToItems(q),\n guides: () => options.guides ?? [],\n onShowMe: (key) => startWalkthrough(key),\n onArticleChange: () => syncSize(),\n });\n\n // Ideas (feature requests): the tab, Home cards and Scout's offers, when the project turned it on.\n const ideasOn = () => !!config.ideas && !!api.listIdeas;\n const ideasTab: View = { kind: \"tab\", tab: \"ideas\" };\n const ideas = createIdeas({\n doc,\n api,\n config: () => config.ideas,\n identified: () => visitor().identified !== false,\n openIdea: (id) => go({ kind: \"idea\", id, from: view.kind === \"idea\" ? view.from : view }),\n openForm: () => go({ kind: \"idea-new\", from: view }),\n openSent: (idea) => go({ kind: \"idea-sent\", idea }),\n openList: () => go(ideasTab),\n openUpdates: () => go({ kind: \"idea-updates\", from: view }),\n onUnreadChange: () => {\n if (!open || destroyed) return;\n if (view.kind === \"tab\" && view.tab === \"home\") render();\n else renderTabs();\n },\n });\n\n // Articles and how-tos open in a larger panel (like Intercom); the head button shrinks it back for this document.\n let docCollapsed = false;\n let sizeButton: HTMLButtonElement | null = null;\n const readingDoc = () => open && (view.kind === \"howto\" || (view.kind === \"tab\" && view.tab === \"help\" && help.isArticleOpen()));\n function syncSize() {\n const reading = readingDoc();\n if (!reading) docCollapsed = false;\n panel.classList.toggle(\"g-m-expanded\", reading && !docCollapsed);\n head.classList.toggle(\"g-m-sizable\", reading);\n if (!reading) {\n sizeButton?.remove();\n sizeButton = null;\n return;\n }\n if (!sizeButton) {\n sizeButton = el(doc, \"button\", \"g-m-size\");\n sizeButton.type = \"button\";\n sizeButton.addEventListener(\"click\", () => {\n docCollapsed = !docCollapsed;\n syncSize();\n });\n head.appendChild(sizeButton);\n }\n sizeButton.textContent = \"\";\n sizeButton.appendChild(icon(doc, docCollapsed ? \"expand\" : \"collapse\"));\n sizeButton.setAttribute(\"aria-label\", docCollapsed ? \"Expand\" : \"Collapse\");\n sizeButton.title = docCollapsed ? \"Expand\" : \"Collapse\";\n }\n\n const unreadTotal = () => conversations.reduce((n, c) => n + (c.unread > 0 ? 1 : 0), 0);\n const updateBadge = () => {\n const n = unreadTotal();\n badge.hidden = n === 0 || open;\n badge.textContent = n > 9 ? \"9+\" : String(n);\n launcher.setAttribute(\"aria-label\", n ? `Open ${config.name}, ${n} unread` : `Open ${config.name}`);\n };\n\n /** Responses that predate a complaint (or skip it) keep the one already known for the conversation. */\n const withComplaint = (c: MessengerConversation): MessengerConversation => {\n if (c.complaint) return c;\n const known = conversations.find((x) => x.id === c.id)?.complaint ?? (current?.id === c.id ? current.complaint : undefined);\n return known ? { ...c, complaint: known } : c;\n };\n const upsertConversation = (incoming: MessengerConversation) => {\n const c = withComplaint(incoming);\n conversations = [c, ...conversations.filter((x) => x.id !== c.id)].sort((a, b) => b.lastMessageAt.localeCompare(a.lastMessageAt));\n if (current?.id === c.id) current = c;\n updateBadge();\n };\n const upsertMessage = (m: MessengerMessage) => {\n const i = messages.findIndex((x) => x.id === m.id);\n if (i >= 0) messages[i] = m;\n else messages.push(m);\n messages.sort((a, b) => a.createdAt.localeCompare(b.createdAt));\n if (m.status !== \"pending\") streaming.delete(m.id);\n };\n\n const loadArticles = () => {\n if (articles || articlesLoading) return;\n articlesLoading = true;\n api\n .listArticles()\n .then((res) => {\n articles = res;\n if (view.kind === \"tab\" && view.tab === \"help\") help.render();\n })\n .catch(() => {})\n .finally(() => (articlesLoading = false));\n };\n\n // How-tos: refreshed on every open, since the page (and so \"Help for this page\") may have changed.\n const loadHowTos = () => {\n if (!api.listHowTos) return;\n const seq = ++howTosSeq;\n api\n .listHowTos()\n .then((res) => {\n if (seq !== howTosSeq || destroyed) return;\n howTos = res;\n if (open && view.kind === \"tab\" && view.tab === \"home\") render();\n else if (open && view.kind === \"tab\" && view.tab === \"help\") help.render();\n })\n .catch(() => {});\n };\n const pageHowTos = (): SdkHowToSummary[] => (howTos?.forPage ?? []).map((id) => howTos?.howTos.find((h) => h.id === id)).filter((h): h is SdkHowToSummary => !!h);\n const stepsLabel = (h: SdkHowToSummary) => `${h.stepCount} ${h.stepCount === 1 ? \"step\" : \"steps\"}`;\n const openHowTo = (id: string) => go({ kind: \"howto\", id, from: view });\n\n /** Closes the messenger and runs a walkthrough (\"Show me\"), so the highlights aren't hidden behind it. */\n const startWalkthrough = (guideKey: string) => {\n setOpen(false);\n options.onStartGuide?.(guideKey);\n };\n\n /**\n * Help tab search: how-tos matching every word of the query (the page's own are in \"Suggested for\n * this page\"), with \"Show me\" when the tour made from one is live and a note when it has a video.\n */\n function howToItems(q: string): Node[] {\n const list = q ? (howTos?.howTos ?? []).filter((h) => matchesHelpQuery(`${h.title} ${h.description}`, q)).slice(0, 10) : [];\n if (!list.length) return [];\n return [\n el(doc, \"div\", \"g-rc-section\", `How-tos (${list.length})`),\n ...list.map((h) => {\n const key = h.guideKey && startableGuide(options.guides, h.guideKey) ? h.guideKey : null;\n const sub = [h.hasVideo ? \"Video\" : \"\", stepsLabel(h)].filter(Boolean).join(\" · \");\n return resultRow(doc, \"📋\", h.title, h.description ? `${sub} · ${h.description}` : sub, () => openHowTo(h.id), key ? () => startWalkthrough(key) : undefined);\n }),\n ];\n }\n\n const refreshConversations = () =>\n api\n .listConversations()\n .then((list) => {\n conversations = [...list].sort((a, b) => b.lastMessageAt.localeCompare(a.lastMessageAt));\n updateBadge();\n // Help and Ideas keep their search box (and what's typed in it).\n if (open && view.kind === \"tab\" && view.tab !== \"help\" && view.tab !== \"ideas\") render();\n })\n .catch(() => {});\n\n // ---------------------------------------------------------------------------\n // Rendering\n // ---------------------------------------------------------------------------\n\n function renderHead(title: string, back?: () => void) {\n head.textContent = \"\";\n sizeButton = null;\n head.hidden = false;\n if (back) {\n const b = el(doc, \"button\", \"g-m-back\");\n b.type = \"button\";\n b.setAttribute(\"aria-label\", \"Back\");\n b.appendChild(icon(doc, \"back\"));\n b.addEventListener(\"click\", back);\n head.appendChild(b);\n }\n head.appendChild(el(doc, \"h2\", \"\", title));\n head.appendChild(closeButton(\"g-close\"));\n }\n\n function closeButton(cls: string): HTMLButtonElement {\n const close = el(doc, \"button\", cls);\n close.type = \"button\";\n close.setAttribute(\"aria-label\", \"Close\");\n close.appendChild(icon(doc, \"close\"));\n close.addEventListener(\"click\", () => setOpen(false));\n return close;\n }\n\n function renderTabs() {\n tabs.textContent = \"\";\n tabs.hidden = view.kind !== \"tab\";\n const items: Array<[MessengerTab, keyof typeof ICONS, string]> = [\n [\"home\", \"home\", \"Home\"],\n [\"messages\", \"messages\", \"Messages\"],\n [\"help\", \"help\", \"Help\"],\n ];\n if (ideasOn()) items.push([\"ideas\", \"idea\", config.ideas!.title || \"Ideas\"]);\n const latest = news();\n if (latest.length) items.push([\"news\", \"news\", \"News\"]);\n for (const [tab, ico, label] of items) {\n const b = el(doc, \"button\", \"g-m-tab\");\n b.type = \"button\";\n b.setAttribute(\"role\", \"tab\");\n b.setAttribute(\"aria-selected\", String(view.kind === \"tab\" && view.tab === tab));\n const i = el(doc, \"span\", \"g-m-tab-icon\");\n i.appendChild(icon(doc, ico));\n b.append(i, el(doc, \"span\", \"\", label));\n if ((tab === \"news\" && latest.some((n) => n.unread)) || (tab === \"ideas\" && ideas.unread() > 0)) {\n const dot = el(doc, \"span\", \"g-m-tab-dot\");\n dot.setAttribute(\"aria-label\", \"New\");\n i.appendChild(dot);\n }\n b.addEventListener(\"click\", () => go({ kind: \"tab\", tab }));\n tabs.appendChild(b);\n }\n }\n\n function conversationCard(c: MessengerConversation, label?: string): HTMLButtonElement {\n const card = el(doc, \"button\", \"g-m-card\");\n card.type = \"button\";\n const row = el(doc, \"div\", \"g-m-row\");\n if (c.unread > 0) row.appendChild(el(doc, \"span\", \"g-m-dot\"));\n const text = el(doc, \"div\", \"g-m-grow\");\n if (label) text.appendChild(el(doc, \"div\", \"g-m-card-label\", label));\n text.append(el(doc, \"div\", \"g-m-card-title g-m-ellipsis\", c.subject || \"Conversation\"), el(doc, \"div\", \"g-m-card-sub g-m-ellipsis\", c.lastMessagePreview));\n const side = el(doc, \"span\", \"g-m-side\");\n side.appendChild(el(doc, \"span\", \"g-m-time\", relativeTime(c.lastMessageAt)));\n if (c.complaint) side.appendChild(statusPill(doc, c.complaint.status));\n row.append(text, side);\n card.appendChild(row);\n card.setAttribute(\"aria-label\", `${label ? `${label}: ` : \"\"}${c.subject || \"Conversation\"}${c.unread ? \", unread\" : \"\"}`);\n card.addEventListener(\"click\", () => go({ kind: \"thread\", conversationId: c.id }));\n return card;\n }\n\n /** A full-width card: optional leading icon, title, subtitle and a trailing arrow. */\n function actionCard(opts: { title: string; sub?: string; lead?: SVGSVGElement | HTMLElement; trail?: boolean; onClick: () => void; cls?: string }): HTMLButtonElement {\n const card = el(doc, \"button\", `g-m-card g-m-row g-m-center${opts.cls ? ` ${opts.cls}` : \"\"}`);\n card.type = \"button\";\n if (opts.lead) card.appendChild(opts.lead);\n const text = el(doc, \"span\", \"g-m-grow\");\n text.appendChild(el(doc, \"span\", \"g-m-card-title\", opts.title));\n if (opts.sub) text.appendChild(el(doc, \"span\", \"g-m-card-sub\", opts.sub));\n card.appendChild(text);\n if (opts.trail) card.appendChild(icon(doc, \"arrow\", \"g-m-ico g-m-trail\"));\n card.addEventListener(\"click\", opts.onClick);\n return card;\n }\n\n function progressBar(done: number, total: number): HTMLElement {\n const bar = el(doc, \"span\", \"g-m-bar\");\n bar.setAttribute(\"role\", \"progressbar\");\n bar.setAttribute(\"aria-valuemin\", \"0\");\n bar.setAttribute(\"aria-valuemax\", String(total));\n bar.setAttribute(\"aria-valuenow\", String(done));\n const fill = el(doc, \"span\", \"g-m-bar-fill\");\n fill.style.width = `${total ? Math.round((Math.min(done, total) / total) * 100) : 0}%`;\n bar.appendChild(fill);\n return bar;\n }\n\n function teamAvatars(): HTMLElement | null {\n const team = (config.team ?? []).slice(0, 3);\n if (!team.length) return null;\n const wrap = el(doc, \"div\", \"g-m-team\");\n wrap.setAttribute(\"role\", \"img\");\n wrap.setAttribute(\"aria-label\", `The team: ${team.map((t) => t.name).join(\", \")}`);\n team.forEach((t, i) => {\n const a = el(doc, \"span\", `g-m-avatar g-m-avatar-${i % 3}`);\n if (t.avatarUrl) {\n const img = el(doc, \"img\");\n img.src = t.avatarUrl;\n img.alt = \"\";\n img.referrerPolicy = \"no-referrer\";\n img.addEventListener(\"error\", () => {\n img.remove();\n a.textContent = initialOf(t.name);\n });\n a.appendChild(img);\n } else a.textContent = initialOf(t.name);\n wrap.appendChild(a);\n });\n return wrap;\n }\n\n function brandMark(): HTMLElement {\n const name = options.brand?.name || config.name;\n const mark = el(doc, \"span\", \"g-m-logo\");\n const url = options.brand?.logoUrl;\n if (url && /^(https?:)?\\/\\//.test(url)) {\n const img = el(doc, \"img\");\n img.src = url;\n img.alt = name;\n img.addEventListener(\"error\", () => {\n img.remove();\n mark.textContent = initialOf(name);\n });\n mark.appendChild(img);\n } else {\n mark.textContent = initialOf(name);\n mark.setAttribute(\"aria-label\", name);\n mark.setAttribute(\"role\", \"img\");\n }\n return mark;\n }\n\n function messageSub(): string {\n const reply = config.replyTime ? REPLY_TIME_TEXT[config.replyTime] : null;\n if (config.aiAvailable) return reply ? `${config.name} answers right away. The team ${reply}.` : `${config.name} answers right away, and the team can help too.`;\n return reply ? `The team ${reply}.` : \"The team will reply here.\";\n }\n\n function statusCard(status: MessengerStatus): HTMLElement {\n const meta = STATUS_TEXT[status.level] ?? STATUS_TEXT.operational;\n const card = el(doc, \"div\", `g-m-card g-m-static g-m-row g-m-center g-m-status g-m-status-${status.level}`);\n card.setAttribute(\"role\", \"status\");\n card.appendChild(icon(doc, meta.icon, \"g-m-ico g-m-status-ico\"));\n const text = el(doc, \"span\", \"g-m-grow\");\n text.appendChild(el(doc, \"span\", \"g-m-card-title\", status.message || meta.title));\n const when = shortDateTime(status.updatedAt);\n if (when) text.appendChild(el(doc, \"span\", \"g-m-card-sub\", `Updated ${when}`));\n card.appendChild(text);\n return card;\n }\n\n function progressCards(v: MessengerVisitor): HTMLElement[] {\n const out: HTMLElement[] = [];\n if (v.resumeGuide) {\n const g = v.resumeGuide;\n const card = el(doc, \"button\", \"g-m-card\");\n card.type = \"button\";\n const row = el(doc, \"span\", \"g-m-row g-m-center\");\n row.appendChild(iconTile(\"play\", true));\n const text = el(doc, \"span\", \"g-m-grow\");\n text.append(el(doc, \"span\", \"g-m-card-label\", \"Pick up where you left off\"), el(doc, \"span\", \"g-m-card-title g-m-ellipsis\", g.name), el(doc, \"span\", \"g-m-card-sub\", `Step ${g.stepIndex + 1} of ${g.stepCount}`));\n row.append(text, el(doc, \"span\", \"g-m-link\", \"Resume\"));\n card.append(row, progressBar(g.stepIndex, g.stepCount));\n card.addEventListener(\"click\", () => {\n setOpen(false);\n options.onResumeGuide?.(g.id, g.stepId);\n });\n out.push(card);\n }\n if (v.checklist && v.checklist.total > 0) {\n const c = v.checklist;\n const card = el(doc, \"button\", \"g-m-card\");\n card.type = \"button\";\n const top = el(doc, \"span\", \"g-m-row g-m-baseline\");\n top.append(el(doc, \"span\", \"g-m-card-title g-m-grow g-m-ellipsis\", c.name), el(doc, \"span\", \"g-m-time\", `${c.done} of ${c.total} done`));\n card.append(top, progressBar(c.done, c.total));\n if (c.nextTask) card.appendChild(el(doc, \"span\", \"g-m-card-sub\", `Next: ${c.nextTask}`));\n card.addEventListener(\"click\", () => {\n setOpen(false);\n options.onOpenChecklist?.(c.id);\n });\n out.push(card);\n }\n return out;\n }\n\n function iconTile(name: keyof typeof ICONS, accent = false): HTMLElement {\n const b = el(doc, \"span\", `g-m-badge-ico${accent ? \" g-m-accent\" : \"\"}`);\n b.appendChild(icon(doc, name));\n return b;\n }\n\n interface Suggestion {\n icon: keyof typeof ICONS;\n title: string;\n sub: string;\n accent?: boolean;\n run: () => void;\n }\n\n /**\n * Page-aware suggestions: guides targeted here, how-tos made available in the app that were recorded\n * on this page (they open right here), then how-tos and articles matched by the server.\n */\n function pageSuggestions(v: MessengerVisitor, max = 4): Suggestion[] {\n if (!cards.suggestions) return [];\n const out: Suggestion[] = [];\n for (const g of v.pageGuides.slice(0, 2)) {\n out.push({ icon: \"play\", title: g.name, sub: g.kind === \"checklist\" ? \"Checklist\" : \"Interactive guide\", accent: true, run: () => (g.kind === \"checklist\" ? openChecklist(g.id) : startGuide(g.key || g.id)) });\n }\n const inApp = new Set<string>();\n for (const h of pageHowTos()) {\n if (out.length >= max) break;\n inApp.add(h.title.toLowerCase());\n out.push({ icon: \"steps\", title: h.title, sub: `How-to · ${stepsLabel(h)}`, run: () => openHowTo(h.id) });\n }\n for (const s of page?.suggestions ?? []) {\n if (out.length >= max) break;\n // The same how-to's help article, when it's already listed to open in place.\n if (s.type === \"howto\" && inApp.has(s.title.toLowerCase())) continue;\n if (s.type === \"howto\") out.push({ icon: \"steps\", title: s.title, sub: `How-to · ${s.steps} ${s.steps === 1 ? \"step\" : \"steps\"}`, run: () => openArticle(s.articleId) });\n else out.push({ icon: \"article\", title: s.title, sub: s.summary || \"Article\", run: () => openArticle(s.articleId) });\n }\n return out.slice(0, max);\n }\n\n function startGuide(keyOrId: string) {\n setOpen(false);\n options.onStartGuide?.(keyOrId);\n }\n\n function openChecklist(id: string) {\n setOpen(false);\n options.onOpenChecklist?.(id);\n }\n\n /** Asks Scout one of the page's common questions in a new conversation. */\n function ask(question: string) {\n go({ kind: \"thread\", conversationId: null });\n if (!textarea) return;\n textarea.value = question;\n submit();\n }\n\n function suggestionButton(s: Suggestion): HTMLButtonElement {\n const b = el(doc, \"button\", \"g-m-item\");\n b.type = \"button\";\n b.appendChild(iconTile(s.icon, s.accent));\n const text = el(doc, \"span\", \"g-m-grow\");\n text.append(el(doc, \"span\", \"g-m-item-title\", s.title), el(doc, \"span\", \"g-m-card-sub g-m-ellipsis\", s.sub));\n b.appendChild(text);\n b.addEventListener(\"click\", s.run);\n return b;\n }\n\n function newsCard(n: MessengerNewsItem): HTMLButtonElement {\n const card = el(doc, \"button\", \"g-m-card g-m-news\");\n card.type = \"button\";\n if (n.imageUrl && /^https?:\\/\\//.test(n.imageUrl)) {\n const img = el(doc, \"img\", \"g-m-news-img\");\n img.src = n.imageUrl;\n img.alt = \"\";\n img.loading = \"lazy\";\n img.addEventListener(\"error\", () => img.remove());\n card.appendChild(img);\n }\n const body = el(doc, \"span\", \"g-m-news-body\");\n const meta = el(doc, \"span\", \"g-m-row g-m-center g-m-news-meta\");\n if (n.unread) meta.appendChild(el(doc, \"span\", \"g-m-tag\", \"New\"));\n meta.appendChild(el(doc, \"span\", \"g-m-time\", shortDate(n.publishedAt)));\n body.append(meta, el(doc, \"span\", \"g-m-card-title\", n.title));\n if (n.body) body.appendChild(el(doc, \"span\", \"g-m-card-sub g-m-clamp\", n.body));\n card.appendChild(body);\n card.addEventListener(\"click\", () => {\n if (n.key) startGuide(n.key);\n else if (n.articleId) openArticle(n.articleId);\n else if (n.url && /^https?:\\/\\//i.test(n.url)) window.open(n.url, \"_blank\", \"noopener,noreferrer\");\n else startGuide(n.id);\n });\n return card;\n }\n\n function renderHome() {\n head.hidden = true;\n const v = visitor();\n loadPage();\n const scroll = el(doc, \"div\", \"g-m-scroll g-m-home\");\n const hero = el(doc, \"div\", \"g-m-hero-bg\");\n hero.setAttribute(\"aria-hidden\", \"true\");\n const inner = el(doc, \"div\", \"g-m-home-inner\");\n const top = el(doc, \"div\", \"g-m-hero-top\");\n const right = el(doc, \"div\", \"g-m-row g-m-center\");\n const team = teamAvatars();\n if (team) right.appendChild(team);\n right.appendChild(closeButton(\"g-m-hero-close\"));\n top.append(brandMark(), right);\n const hello = el(doc, \"h2\", \"g-m-hello\");\n hello.append(el(doc, \"span\", \"g-m-hello-1\", v.firstName ? `Hi ${v.firstName}.` : \"Hi there.\"), el(doc, \"span\", \"g-m-hello-2\", \"How can we help?\"));\n inner.append(top, hello);\n\n inner.appendChild(actionCard({ title: \"Send us a message\", sub: messageSub(), trail: true, onClick: () => go({ kind: \"thread\", conversationId: null }) }));\n if (canComplain()) inner.appendChild(actionCard({ title: \"File a complaint\", sub: \"Tell us what went wrong. You'll get a reference.\", lead: iconTile(\"flag\"), onClick: () => startComplaint(null), cls: \"g-m-complain\" }));\n const filed = latestComplaint();\n if (filed) inner.appendChild(conversationCard(filed, \"Your complaint\"));\n const recent = conversations.find((c) => c.id !== filed?.id);\n if (recent) inner.appendChild(conversationCard(recent, recent.status === \"closed\" && !recent.unread ? \"Recent conversation\" : \"Continue the conversation\"));\n const ideaUpdates = ideasOn() ? ideas.unread() : 0;\n if (ideaUpdates) inner.appendChild(actionCard({ title: \"Updates on your ideas\", sub: ideaUpdates === 1 ? \"1 new update\" : `${ideaUpdates} new updates`, lead: iconTile(\"idea\", true), trail: true, onClick: () => go({ kind: \"idea-updates\", from: view }) }));\n if (config.status) inner.appendChild(statusCard(config.status));\n if (cards.progress) progressCards(v).forEach((c) => inner.appendChild(c));\n\n const suggestions = pageSuggestions(v);\n const questions = cards.suggestions ? (page?.questions ?? []).slice(0, 2) : [];\n const label = v.path ? pageLabel(v.path) : null;\n const fallback = !suggestions.length && !questions.length ? rcExtras(options.resourceCenter?.recommendedGuideIds).slice(0, 3) : [];\n if (suggestions.length || questions.length || fallback.length) {\n const box = el(doc, \"div\", \"g-m-card g-m-static g-m-suggest\");\n box.appendChild(el(doc, \"div\", \"g-m-card-title\", fallback.length ? \"Recommended\" : \"Suggested for you\"));\n if (!fallback.length && label) box.appendChild(el(doc, \"div\", \"g-m-card-sub\", `For the ${label} page`));\n const list = el(doc, \"div\", \"g-m-items\");\n suggestions.forEach((s) => list.appendChild(suggestionButton(s)));\n questions.forEach((q) => list.appendChild(suggestionButton({ icon: \"ask\", title: q, sub: config.aiAvailable ? `Ask ${config.name}` : \"Ask the team\", run: () => ask(q) })));\n fallback.forEach((g) => list.appendChild(suggestionButton({ icon: \"play\", title: g.name, sub: \"Interactive guide\", accent: true, run: () => startGuide(g.key || g.id) })));\n box.appendChild(list);\n inner.appendChild(box);\n }\n\n const latest = news()[0];\n if (latest) inner.appendChild(newsCard(latest));\n if (ideasOn()) {\n const canWrite = !ideas.blocked();\n inner.appendChild(actionCard({ title: canWrite ? \"Share an idea\" : \"Browse ideas\", sub: canWrite ? \"Suggest a feature or vote for what's next.\" : \"See what people are asking for and what's planned.\", lead: iconTile(\"idea\"), onClick: () => go(ideasTab) }));\n }\n inner.appendChild(actionCard({ title: \"Search for help\", sub: \"Articles, guides and how-tos\", lead: icon(doc, \"search\", \"g-m-ico g-m-lead\"), onClick: () => go({ kind: \"tab\", tab: \"help\" }) }));\n scroll.append(hero, inner);\n main.appendChild(scroll);\n }\n\n // ---------------------------------------------------------------------------\n // Complaints\n // ---------------------------------------------------------------------------\n\n const complaintCategories = (): MessengerComplaintCategory[] => config.complaints?.categories ?? [];\n /** Visitors the app hasn't identified file complaints only when the project allows it (with an email). */\n const needsEmail = () => visitor().identified === false;\n const canComplain = () => !!api.fileComplaint && complaintCategories().length > 0 && (!needsEmail() || !!config.complaints?.anonymous);\n\n /** The conversation of the most recent complaint, for the home screen. */\n function latestComplaint(): MessengerConversation | null {\n let best: MessengerConversation | null = null;\n for (const c of conversations) if (c.complaint && (!best || c.complaint.createdAt > best.complaint!.createdAt)) best = c;\n return best;\n }\n\n /** What the person told Scout in this conversation, to start the complaint form with. */\n function userMessagesText(): string {\n return messages\n .filter((m) => m.author === \"user\" && m.body.trim())\n .slice(-3)\n .map((m) => m.body.trim())\n .join(\"\\n\\n\")\n .slice(0, 4000);\n }\n\n function startComplaint(categoryId: string | null) {\n const cats = complaintCategories();\n const picked = categoryId ? cats.find((c) => c.id === categoryId) : cats.length === 1 ? cats[0] : undefined;\n const from: View = view.kind === \"tab\" || view.kind === \"thread\" ? view : { kind: \"tab\", tab: \"home\" };\n complaintDraft = emptyComplaintDraft(complaintDraft.description);\n if (picked) go({ kind: \"complaint-form\", categoryId: picked.id, conversationId: null, from });\n else go({ kind: \"complaint-category\", conversationId: null, from });\n }\n\n function complaintBanner(c: MessengerComplaint): HTMLElement {\n const b = el(doc, \"div\", \"g-m-complaint g-m-row g-m-center\");\n b.setAttribute(\"role\", \"status\");\n b.appendChild(icon(doc, \"flag\", \"g-m-ico g-m-lead\"));\n const text = el(doc, \"span\", \"g-m-grow\");\n text.append(el(doc, \"span\", \"g-m-card-title\", c.reference), el(doc, \"span\", \"g-m-card-sub\", c.categoryName));\n b.append(text, statusPill(doc, c.status));\n return b;\n }\n\n function renderComplaintCategories(v: Extract<View, { kind: \"complaint-category\" }>) {\n renderHead(\"File a complaint\", () => go(v.from));\n const scroll = el(doc, \"div\", \"g-m-scroll\");\n scroll.appendChild(categoryList(doc, complaintCategories(), (c) => go({ kind: \"complaint-form\", categoryId: c.id, conversationId: v.conversationId, from: v.from })));\n main.appendChild(scroll);\n }\n\n function renderComplaintForm(v: Extract<View, { kind: \"complaint-form\" }>) {\n const category = complaintCategories().find((c) => c.id === v.categoryId);\n if (!category) return go({ kind: \"complaint-category\", conversationId: v.conversationId, from: v.from });\n const back = () => (complaintCategories().length > 1 && !v.conversationId ? go({ kind: \"complaint-category\", conversationId: v.conversationId, from: v.from }) : go(v.from));\n renderHead(\"File a complaint\", back);\n const scroll = el(doc, \"div\", \"g-m-scroll\");\n const draft = complaintDraft;\n scroll.appendChild(\n complaintForm(doc, {\n category,\n draft,\n needsEmail: needsEmail(),\n canChangeCategory: complaintCategories().length > 1,\n onChangeCategory: () => go({ kind: \"complaint-category\", conversationId: v.conversationId, from: v.from }),\n onPickFile: (file) => {\n draft.error = null;\n readScreenshot(doc, file)\n .then((a) => (draft.attachment = a))\n .catch((e: unknown) => (draft.error = e instanceof Error ? e.message : \"That image couldn't be attached.\"))\n .finally(() => {\n if (view === v) render();\n });\n },\n onRemoveFile: () => {\n draft.attachment = null;\n render();\n },\n onSubmit: () => submitComplaint(v, category),\n }),\n );\n main.appendChild(scroll);\n }\n\n function submitComplaint(v: Extract<View, { kind: \"complaint-form\" }>, category: MessengerComplaintCategory) {\n const draft = complaintDraft;\n const problem = complaintProblem(category, draft, needsEmail());\n draft.checked = true;\n draft.error = problem;\n if (problem || !api.fileComplaint) return render();\n draft.sending = true;\n render();\n const answers = complaintAnswers(category, draft);\n api\n .fileComplaint({\n categoryId: category.id,\n description: draft.description.trim(),\n answers,\n email: needsEmail() ? draft.email.trim() : null,\n conversationId: v.conversationId,\n attachment: draft.attachment ? { fileName: draft.attachment.fileName, data: draft.attachment.data } : null,\n })\n .then((res) => {\n upsertConversation({ ...res.conversation, unread: 0 });\n complaintDraft = emptyComplaintDraft();\n const labels = category.fields.filter((f) => answers[f.id]).map((f): [string, string] => [f.label, answers[f.id]!]);\n if (view === v) go({ kind: \"complaint-sent\", complaint: res.complaint, conversationId: res.conversation.id, answers: labels });\n })\n .catch((e: unknown) => {\n draft.sending = false;\n draft.error = (e instanceof Error && e.message ? e.message : \"Your complaint couldn't be sent.\").replace(/^[\\w.]+: /, \"\");\n if (view === v) render();\n });\n }\n\n function renderComplaintSent(v: Extract<View, { kind: \"complaint-sent\" }>) {\n renderHead(v.complaint.reference, () => go({ kind: \"tab\", tab: \"home\" }));\n const scroll = el(doc, \"div\", \"g-m-scroll\");\n scroll.appendChild(complaintSent(doc, { complaint: v.complaint, answers: v.answers, onOpenConversation: () => go({ kind: \"thread\", conversationId: v.conversationId }), onHome: () => go({ kind: \"tab\", tab: \"home\" }) }));\n main.appendChild(scroll);\n }\n\n function renderIdeasView(v: View) {\n const title = config.ideas?.title || \"Ideas\";\n if (v.kind === \"idea\") {\n renderHead(title, () => go(v.from));\n main.appendChild(ideas.detailScreen(v.id));\n } else if (v.kind === \"idea-new\") {\n renderHead(\"Suggest an idea\", () => go(v.from));\n main.appendChild(ideas.formScreen());\n } else if (v.kind === \"idea-sent\") {\n renderHead(title, () => go(ideasTab));\n main.appendChild(ideas.sentScreen(v.idea));\n } else if (v.kind === \"idea-updates\") {\n renderHead(\"Updates on your ideas\", () => go(v.from));\n main.appendChild(ideas.updatesScreen());\n } else {\n renderHead(title);\n main.appendChild(ideas.listScreen());\n }\n }\n\n function renderHowToView(id: string, from: View) {\n const cached = howToCache.get(id);\n renderHead(cached?.title ?? \"How-to\", () => go(from));\n const scroll = el(doc, \"div\", \"g-m-scroll\");\n if (cached) {\n scroll.appendChild(\n renderHowTo(doc, cached, (key) => {\n setOpen(false);\n options.onStartGuide?.(key);\n }),\n );\n } else scroll.appendChild(el(doc, \"div\", \"g-m-empty\", cached === null ? \"This how-to isn't available any more.\" : \"Loading…\"));\n main.appendChild(scroll);\n if (cached !== undefined || !api.getHowTo) return;\n const seq = threadSeq;\n api\n .getHowTo(id)\n .catch(() => null)\n .then((h) => {\n howToCache.set(id, h);\n if (seq === threadSeq && view.kind === \"howto\" && view.id === id) render();\n });\n }\n\n function renderMessagesTab() {\n renderHead(\"Messages\");\n const scroll = el(doc, \"div\", \"g-m-scroll\");\n if (!conversations.length) scroll.appendChild(el(doc, \"div\", \"g-m-empty\", \"No conversations yet.\"));\n conversations.forEach((c) => scroll.appendChild(conversationCard(c)));\n const start = el(doc, \"button\", \"g-btn g-btn-primary g-m-wide\", \"Send us a message\");\n start.type = \"button\";\n start.addEventListener(\"click\", () => go({ kind: \"thread\", conversationId: null }));\n scroll.appendChild(start);\n main.appendChild(scroll);\n }\n\n /** The Help tab's \"Suggested for this page\" section. */\n function helpSuggestions(): HelpData[\"suggested\"] {\n const v = visitor();\n const items = pageSuggestions(v, 5).map<HelpSuggestion>((s) => ({ kind: s.icon === \"play\" ? \"guide\" : s.icon === \"steps\" ? \"howto\" : \"article\", title: s.title, summary: s.sub, run: s.run }));\n if (!items.length) return undefined;\n const label = v.path ? pageLabel(v.path) : null;\n return { title: label ? `For the ${label} page` : \"Suggested for you\", items };\n }\n\n function renderHelpTab() {\n renderHead(\"Help\");\n loadArticles();\n loadPage();\n help.render();\n main.appendChild(help.el);\n }\n\n function renderNewsTab() {\n renderHead(\"News\");\n const scroll = el(doc, \"div\", \"g-m-scroll\");\n const items = news();\n if (!items.length) scroll.appendChild(el(doc, \"div\", \"g-m-empty\", \"No news yet.\"));\n items.forEach((n) => scroll.appendChild(newsCard(n)));\n main.appendChild(scroll);\n const unread = items.filter((n) => n.unread).map((n) => n.id);\n if (unread.length) options.onNewsSeen?.(unread);\n }\n\n /** Fetches page-matched content when the page changed (or it went stale), then re-renders. */\n function loadPage(force = false) {\n const path = visitor().path;\n if (!path || !api.pageContent || !cards.suggestions) {\n page = null;\n pageKey = null;\n return;\n }\n const key = foldPathIds(path).toLowerCase();\n if (!force && key === pageKey && (pageLoading || Date.now() - pageAt < PAGE_TTL_MS)) return;\n if (key !== pageKey) page = null;\n pageKey = key;\n pageLoading = true;\n const seq = ++pageSeq;\n api\n .pageContent(path)\n .then((res) => {\n if (seq !== pageSeq) return;\n page = res;\n pageAt = Date.now();\n if (!open) return;\n if (view.kind === \"tab\" && view.tab === \"home\") render();\n else if (view.kind === \"tab\" && view.tab === \"help\") help.render();\n else if (view.kind === \"thread\" && !messages.length) renderLog();\n })\n .catch(() => {\n if (seq === pageSeq) pageAt = Date.now();\n })\n .finally(() => {\n if (seq === pageSeq) pageLoading = false;\n });\n }\n\n let log: HTMLElement | null = null;\n let foot: HTMLElement | null = null;\n let textarea: HTMLTextAreaElement | null = null;\n let sendButton: HTMLButtonElement | null = null;\n\n function messageNode(m: MessengerMessage): HTMLElement {\n const wrap = el(doc, \"div\", `g-m-msg g-from-${m.author}${m.status === \"failed\" ? \" g-m-failed\" : \"\"}`);\n if (m.author === \"system\") {\n wrap.textContent = m.body;\n return wrap;\n }\n if (m.author !== \"user\") {\n const author = el(doc, \"div\", \"g-m-author\", m.author === \"scout\" ? config.name : m.authorName || \"Support team\");\n if (m.author === \"scout\") author.appendChild(el(doc, \"span\", \"g-m-ai\", \"AI\"));\n wrap.appendChild(author);\n }\n const bubble = el(doc, \"div\", \"g-m-bubble\");\n const live = streaming.get(m.id);\n if (m.status === \"pending\" && !live) {\n const dots = el(doc, \"span\", \"g-m-typing\");\n dots.setAttribute(\"aria-label\", `${config.name} is typing`);\n dots.append(el(doc, \"span\"), el(doc, \"span\"), el(doc, \"span\"));\n bubble.appendChild(dots);\n } else if (m.status === \"failed\") {\n bubble.textContent = \"This reply couldn't be completed.\";\n } else {\n bubble.appendChild(renderSafeText(doc, live ?? m.body));\n }\n if (m.status === \"pending\") bubble.setAttribute(\"aria-busy\", \"true\");\n bubble.dataset.messageId = m.id;\n wrap.appendChild(bubble);\n const offer = m.complaintOffer && canComplain() ? complaintCategories().find((c) => c.id === m.complaintOffer!.categoryId) : undefined;\n const ideaChip = m.ideaOffer && ideasOn() ? ideas.offerChip(m.ideaOffer, current?.id ?? null, () => icon(doc, \"idea\", \"g-m-ico g-m-chip-ico\")) : null;\n if (m.citations.length || m.suggestedGuides.length || m.howTos?.length || offer || ideaChip) {\n const chips = el(doc, \"div\", \"g-m-chips\");\n if (offer) {\n const b = el(doc, \"button\", \"g-m-chip g-m-guide g-m-offer\");\n b.type = \"button\";\n b.append(icon(doc, \"flag\", \"g-m-ico g-m-chip-ico\"), el(doc, \"span\", \"\", `File a complaint · ${offer.name}`));\n b.addEventListener(\"click\", () => {\n const conversationId = current?.id ?? null;\n complaintDraft = emptyComplaintDraft(userMessagesText());\n go({ kind: \"complaint-form\", categoryId: offer.id, conversationId, from: view });\n });\n chips.appendChild(b);\n }\n if (ideaChip) chips.appendChild(ideaChip);\n for (const g of m.suggestedGuides) {\n const b = el(doc, \"button\", \"g-m-chip g-m-guide\", `▶ Show me: ${g.name}`);\n b.type = \"button\";\n b.addEventListener(\"click\", () => {\n setOpen(false);\n options.onStartGuide?.(g.key);\n });\n chips.appendChild(b);\n }\n for (const c of m.citations) {\n const b = el(doc, \"button\", \"g-m-chip\", `📄 ${c.title}`);\n b.type = \"button\";\n b.addEventListener(\"click\", () => openArticle(c.articleId));\n chips.appendChild(b);\n }\n for (const h of m.howTos ?? []) {\n const b = el(doc, \"button\", \"g-m-chip\", `📋 ${h.title}`);\n b.type = \"button\";\n b.addEventListener(\"click\", () => openHowTo(h.howToId));\n chips.appendChild(b);\n }\n wrap.appendChild(chips);\n }\n return wrap;\n }\n\n function renderLog() {\n if (!log) return;\n const atBottom = log.scrollHeight - log.scrollTop - log.clientHeight < 40;\n log.textContent = \"\";\n if (current?.complaint) log.appendChild(complaintBanner(current.complaint));\n if (!messages.length) {\n const v = visitor();\n const label = v.path ? pageLabel(v.path) : null;\n if (label && config.aiAvailable && !current) log.appendChild(el(doc, \"div\", \"g-m-context\", `Asking from the ${label} page`));\n const intro: MessengerMessage = { id: \"intro\", author: config.aiAvailable ? \"scout\" : \"agent\", authorName: \"Support team\", body: personalGreeting(config.greeting, v.firstName), citations: [], suggestedGuides: [], status: \"complete\", createdAt: new Date().toISOString() };\n log.appendChild(messageNode(intro));\n const questions = !current && cards.suggestions ? (page?.questions ?? []) : [];\n if (questions.length && !sending) {\n const chips = el(doc, \"div\", \"g-m-chips g-m-asks\");\n chips.setAttribute(\"aria-label\", \"Common questions on this page\");\n for (const q of questions) {\n const b = el(doc, \"button\", \"g-m-chip g-m-ask\", q);\n b.type = \"button\";\n b.addEventListener(\"click\", () => {\n if (!textarea || sending) return;\n textarea.value = q;\n submit();\n });\n chips.appendChild(b);\n }\n log.appendChild(chips);\n }\n }\n messages.forEach((m) => log!.appendChild(messageNode(m)));\n if (atBottom || sending) log.scrollTop = log.scrollHeight;\n renderFoot();\n }\n\n function renderFoot() {\n if (!foot || !textarea || !sendButton) return;\n sendButton.disabled = sending || !textarea.value.trim();\n textarea.disabled = sending;\n for (const extra of Array.from(foot.querySelectorAll(\".g-m-human,.g-m-rate,.g-m-note\"))) extra.remove();\n if (current?.status === \"closed\" && current.rating == null) {\n const rate = el(doc, \"div\", \"g-m-rate\", \"How was this conversation? \");\n for (const [score, face, label] of [\n [1, \"😞\", \"Bad\"],\n [3, \"😐\", \"OK\"],\n [5, \"😀\", \"Great\"],\n ] as const) {\n const b = el(doc, \"button\", \"\", face);\n b.type = \"button\";\n b.setAttribute(\"aria-label\", label);\n b.addEventListener(\"click\", () => {\n if (!current) return;\n const id = current.id;\n current = { ...current, rating: score };\n upsertConversation(current);\n renderFoot();\n api.rate(id, score).catch(() => {});\n });\n rate.appendChild(b);\n }\n foot.prepend(rate);\n } else if (current && current.rating != null && current.status === \"closed\") {\n foot.prepend(el(doc, \"div\", \"g-m-note\", \"Thanks for the feedback!\"));\n }\n if (config.handoffEnabled && config.aiAvailable && current?.status === \"bot\" && !sending) {\n const human = el(doc, \"button\", \"g-m-human\", \"Talk to a person\");\n human.type = \"button\";\n human.addEventListener(\"click\", () => {\n if (!current) return;\n const id = current.id;\n human.disabled = true;\n api\n .handoff(id)\n .then((res) => {\n if (current?.id !== id) return;\n upsertConversation(res.conversation);\n res.messages.forEach(upsertMessage);\n renderLog();\n })\n .catch(() => (human.disabled = false));\n });\n foot.appendChild(human);\n }\n }\n\n function renderThread(conversationId: string | null) {\n renderHead(current?.subject || (conversationId ? \"Conversation\" : \"New conversation\"), () => go({ kind: \"tab\", tab: \"messages\" }));\n log = el(doc, \"div\", \"g-m-log\");\n log.setAttribute(\"role\", \"log\");\n log.setAttribute(\"aria-live\", \"polite\");\n foot = el(doc, \"div\", \"g-m-foot\");\n const compose = el(doc, \"form\", \"g-m-compose\");\n textarea = el(doc, \"textarea\");\n textarea.rows = 1;\n textarea.maxLength = 4000;\n textarea.placeholder = current?.status === \"open\" ? \"Reply to the team…\" : \"Ask a question…\";\n textarea.setAttribute(\"aria-label\", \"Message\");\n textarea.value = draft;\n sendButton = el(doc, \"button\", \"g-m-send\");\n sendButton.appendChild(icon(doc, \"arrow\"));\n sendButton.type = \"submit\";\n sendButton.setAttribute(\"aria-label\", \"Send\");\n compose.append(textarea, sendButton);\n foot.appendChild(compose);\n textarea.addEventListener(\"input\", () => {\n draft = textarea!.value;\n if (sendButton) sendButton.disabled = sending || !draft.trim();\n });\n textarea.addEventListener(\"keydown\", (e) => {\n if (e.key === \"Enter\" && !e.shiftKey && !e.isComposing) {\n e.preventDefault();\n submit();\n }\n });\n compose.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n submit();\n });\n main.append(log, foot);\n renderLog();\n textarea.focus?.({ preventScroll: true });\n }\n\n function render() {\n if (destroyed) return;\n main.textContent = \"\";\n log = foot = null;\n textarea = null;\n sendButton = null;\n if (view.kind === \"thread\") renderThread(view.conversationId);\n else if (view.kind === \"howto\") renderHowToView(view.id, view.from);\n else if (view.kind === \"complaint-category\") renderComplaintCategories(view);\n else if (view.kind === \"complaint-form\") renderComplaintForm(view);\n else if (view.kind === \"complaint-sent\") renderComplaintSent(view);\n else if (view.kind !== \"tab\" || view.tab === \"ideas\") {\n if (ideasOn()) renderIdeasView(view);\n else {\n view = { kind: \"tab\", tab: \"home\" };\n renderHome();\n }\n } else if (view.tab === \"home\") renderHome();\n else if (view.tab === \"messages\") renderMessagesTab();\n else if (view.tab === \"news\" && news().length) renderNewsTab();\n else if (view.tab === \"news\") {\n view = { kind: \"tab\", tab: \"home\" };\n renderHome();\n } else renderHelpTab();\n renderTabs();\n syncSize();\n }\n\n // ---------------------------------------------------------------------------\n // Behaviour\n // ---------------------------------------------------------------------------\n\n const handlers = (seq: number): MessengerStreamHandlers => ({\n onConversation(c) {\n if (seq !== threadSeq) return;\n current = c;\n view = { kind: \"thread\", conversationId: c.id };\n upsertConversation(c);\n },\n onMessage(m) {\n if (seq !== threadSeq) return;\n upsertMessage(m);\n renderLog();\n },\n onDelta(id, text) {\n if (seq !== threadSeq) return;\n streaming.set(id, (streaming.get(id) ?? \"\") + text);\n const bubble = log?.querySelector<HTMLElement>(`[data-message-id=\"${id}\"]`);\n if (!bubble) return renderLog();\n bubble.textContent = \"\";\n bubble.appendChild(renderSafeText(doc, streaming.get(id)!));\n if (log) log.scrollTop = log.scrollHeight;\n },\n onDone(m, c) {\n if (seq !== threadSeq) return;\n if (m) {\n upsertMessage(m);\n options.onMessage?.(m, c);\n }\n current = withComplaint({ ...c, unread: 0 });\n upsertConversation(current);\n },\n onError() {\n /* the server also stores a system message explaining what happened */\n },\n });\n\n function submit() {\n if (!textarea || sending) return;\n const text = textarea.value.trim();\n if (!text) return;\n sending = true;\n draft = \"\";\n textarea.value = \"\";\n renderFoot();\n const seq = threadSeq;\n const h = handlers(seq);\n const done = current ? api.send(current.id, text, h) : api.start(text, h);\n done\n .catch(() => {\n if (seq !== threadSeq) return;\n draft = text;\n if (textarea) textarea.value = text;\n const note: MessengerMessage = { id: `local_${Date.now()}`, author: \"system\", body: \"Your message couldn't be sent. Please try again.\", citations: [], suggestedGuides: [], status: \"complete\", createdAt: new Date().toISOString() };\n upsertMessage(note);\n })\n .finally(() => {\n if (seq !== threadSeq) return;\n sending = false;\n streaming.clear();\n if (view.kind === \"thread\") {\n if (current) renderHead(current.subject || \"Conversation\", () => go({ kind: \"tab\", tab: \"messages\" }));\n renderLog();\n }\n scheduleThreadPoll();\n });\n }\n\n function scheduleThreadPoll() {\n if (threadTimer) clearTimeout(threadTimer);\n threadTimer = null;\n if (!open || view.kind !== \"thread\" || !current || destroyed) return;\n threadTimer = setTimeout(pollThread, poll.thread);\n }\n\n function pollThread() {\n if (!current || sending) return scheduleThreadPoll();\n const seq = threadSeq;\n const pending = messages.find((m) => m.status === \"pending\");\n const last = messages.filter((m) => !m.id.startsWith(\"local_\")).at(-1);\n // Re-fetch from a pending reply (its body changes in place); otherwise only newer messages.\n const since = pending ? new Date(Date.parse(pending.createdAt) - 1).toISOString() : (last?.createdAt ?? null);\n api\n .loadMessages(current.id, since)\n .then((res) => {\n if (seq !== threadSeq) return;\n const before = messages.length;\n const changed = res.messages.some((m) => {\n const prev = messages.find((x) => x.id === m.id);\n return !prev || prev.status !== m.status || prev.body !== m.body;\n });\n res.messages.forEach(upsertMessage);\n current = withComplaint({ ...res.conversation, unread: 0 });\n upsertConversation(current);\n if (changed || messages.length !== before) {\n renderLog();\n res.messages.filter((m) => m.author !== \"user\").forEach((m) => options.onMessage?.(m, res.conversation));\n } else renderFoot();\n })\n .catch(() => {})\n .finally(scheduleThreadPoll);\n }\n\n function go(next: View) {\n threadSeq++;\n if (threadTimer) clearTimeout(threadTimer);\n threadTimer = null;\n // Opening a how-to from Help keeps the search, so Back returns to the same results.\n if (view.kind === \"tab\" && view.tab === \"help\" && !(next.kind === \"tab\" && next.tab === \"help\") && next.kind !== \"howto\") help.reset();\n view = next;\n if (next.kind === \"thread\") {\n messages = [];\n streaming.clear();\n sending = false;\n current = next.conversationId ? (conversations.find((c) => c.id === next.conversationId) ?? null) : null;\n if (!next.conversationId) loadPage();\n render();\n if (next.conversationId) {\n const seq = threadSeq;\n api\n .loadMessages(next.conversationId)\n .then((res) => {\n if (seq !== threadSeq) return;\n res.messages.forEach(upsertMessage);\n current = withComplaint({ ...res.conversation, unread: 0 });\n upsertConversation(current);\n renderHead(current.subject || \"Conversation\", () => go({ kind: \"tab\", tab: \"messages\" }));\n renderLog();\n })\n .catch(() => {})\n .finally(scheduleThreadPoll);\n }\n } else {\n draft = \"\";\n render();\n }\n }\n\n function openArticle(id: string) {\n go({ kind: \"tab\", tab: \"help\" });\n help.openArticle(id);\n }\n\n function startBackgroundPoll() {\n if (backgroundTimer) clearInterval(backgroundTimer);\n backgroundTimer = setInterval(() => {\n if (!open && conversations.length && !destroyed) void refreshConversations();\n }, poll.background);\n }\n\n const setOpen = (v: boolean) => {\n if (open === v || destroyed) return;\n open = v;\n panel.hidden = !v;\n launcher.setAttribute(\"aria-expanded\", String(v));\n launcher.setAttribute(\"aria-label\", v ? `Close ${config.name}` : `Open ${config.name}`);\n updateBadge();\n if (v) {\n render();\n void refreshConversations();\n loadHowTos();\n if (ideasOn()) ideas.loadUpdates();\n if (view.kind === \"thread\") scheduleThreadPoll();\n options.onOpen?.();\n } else {\n if (threadTimer) clearTimeout(threadTimer);\n threadTimer = null;\n syncSize();\n options.onClose?.();\n }\n };\n launcher.addEventListener(\"click\", () => setOpen(!open));\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 void refreshConversations();\n startBackgroundPoll();\n\n return {\n el: root,\n open(tab?: MessengerTab) {\n if (tab) view = { kind: \"tab\", tab };\n if (open && tab) render();\n setOpen(true);\n },\n close: () => setOpen(false),\n toggle: () => setOpen(!open),\n isOpen: () => open,\n showNewMessage(text?: string) {\n setOpen(true);\n go({ kind: \"thread\", conversationId: null });\n if (text && textarea) {\n textarea.value = text.slice(0, 4000);\n draft = textarea.value;\n renderFoot();\n }\n },\n openArticle(id: string) {\n setOpen(true);\n openArticle(id);\n },\n openComplaint(categoryId?: string) {\n if (!canComplain()) return;\n setOpen(true);\n startComplaint(categoryId ?? null);\n },\n openIdeas(requestId?: string) {\n if (!ideasOn()) return;\n setOpen(true);\n go(requestId ? { kind: \"idea\", id: requestId, from: ideasTab } : ideasTab);\n },\n refresh() {\n if (destroyed) return;\n if (ideasOn()) ideas.sync(open);\n if (!open) {\n // Refetched on the next open; the tab bar (News) may change meanwhile.\n pageKey = null;\n return;\n }\n loadPage();\n // The Ideas tab isn't rebuilt (it would drop the search being typed); its tab bar may change.\n if (view.kind === \"tab\" && view.tab !== \"ideas\") render();\n else if (view.kind === \"tab\") renderTabs();\n else if (view.kind === \"thread\" && !messages.length) renderLog();\n },\n destroy() {\n destroyed = true;\n if (threadTimer) clearTimeout(threadTimer);\n if (backgroundTimer) clearInterval(backgroundTimer);\n panel.removeEventListener(\"keydown\", onKey);\n help.destroy();\n ideas.destroy();\n shadowHost?.removeAttribute(\"data-g-messenger\");\n root.remove();\n },\n };\n}\n","import type { NormalizedRect, SdkHowTo, SdkHowToStep } from \"@guidelytech/shared\";\nimport { el } from \"./help-view\";\n\n// A how-to inside the messenger: numbered steps with their screenshots and the element highlighted.\n// Built from DOM nodes and textContent only (step text is plain text), so nothing in it is parsed as HTML.\n\nconst pct = (v: number) => `${(v * 100).toFixed(3)}%`;\nconst place = (node: HTMLElement, r: NormalizedRect) =>\n Object.assign(node.style, {\n left: pct(r.x),\n top: pct(r.y),\n width: pct(r.width),\n height: pct(r.height),\n });\n\n/** Plain text as paragraphs (blank lines) with line breaks kept by CSS. */\nfunction paragraphs(doc: Document, text: string, cls: string): HTMLElement | null {\n const parts = text\n .split(/\\n{2,}/)\n .map((p) => p.trim())\n .filter(Boolean);\n if (!parts.length) return null;\n const wrap = el(doc, \"div\", cls);\n for (const p of parts) wrap.appendChild(el(doc, \"p\", \"\", p));\n return wrap;\n}\n\n/** The screenshot, cropped to `crop` when zoomed, with the highlight drawn over it. Only http(s) images load. */\nfunction screenshot(\n doc: Document,\n image: NonNullable<SdkHowToStep[\"image\"]>,\n alt: string,\n): HTMLElement | null {\n if (!/^https?:\\/\\//i.test(image.url)) return null;\n const frame = el(doc, \"div\", \"g-howto-shot\");\n const img = (cls: string) => {\n const i = el(doc, \"img\", cls);\n i.src = image.url;\n i.alt = alt;\n i.loading = \"lazy\";\n i.decoding = \"async\";\n return i;\n };\n const crop = image.crop;\n if (crop && crop.width > 0 && crop.height > 0) {\n // An invisible full-width copy gives the frame the screenshot's aspect ratio (the crop has the same one).\n const ghost = img(\"g-howto-ghost\");\n ghost.alt = \"\";\n ghost.setAttribute(\"aria-hidden\", \"true\");\n const zoomed = img(\"g-howto-zoomed\");\n Object.assign(zoomed.style, {\n width: pct(1 / crop.width),\n left: pct(-crop.x / crop.width),\n top: pct(-crop.y / crop.height),\n });\n frame.append(ghost, zoomed);\n } else frame.appendChild(img(\"\"));\n if (image.highlight) {\n const mark = el(doc, \"div\", \"g-howto-mark\");\n mark.setAttribute(\"aria-hidden\", \"true\");\n place(mark, image.highlight);\n frame.appendChild(mark);\n }\n return frame;\n}\n\n/** Renders a how-to; `onShowMe` starts its tour when it has one live in this environment. */\nexport function renderHowTo(\n doc: Document,\n howTo: SdkHowTo,\n onShowMe?: (guideKey: string) => void,\n): HTMLElement {\n const wrap = el(doc, \"div\", \"g-howto\");\n wrap.appendChild(el(doc, \"h3\", \"g-title\", howTo.title));\n const description = paragraphs(doc, howTo.description, \"g-howto-desc\");\n if (description) wrap.appendChild(description);\n const guideKey = howTo.guideKey;\n if (guideKey && onShowMe) {\n const show = el(doc, \"button\", \"g-btn g-btn-primary g-howto-show\", \"▶ Show me in the app\");\n show.type = \"button\";\n show.addEventListener(\"click\", () => onShowMe(guideKey));\n wrap.appendChild(show);\n }\n // The video made from the how-to, when there is one (http(s) only; never autoplays).\n if (howTo.video && /^https?:\\/\\//i.test(howTo.video.url)) {\n const video = el(doc, \"video\", \"g-howto-video\");\n video.src = howTo.video.url;\n video.controls = true;\n video.preload = \"metadata\";\n video.playsInline = true;\n video.setAttribute(\"aria-label\", `Video: ${howTo.title}`);\n wrap.appendChild(video);\n }\n const list = el(doc, \"ol\", \"g-howto-steps\");\n let n = 0;\n for (const s of howTo.steps) {\n const li = el(doc, \"li\", `g-howto-step g-howto-${s.kind}`);\n if (s.kind === \"heading\") li.appendChild(el(doc, \"h4\", \"\", s.title));\n else if (s.kind === \"tip\" || s.kind === \"alert\") {\n li.appendChild(el(doc, \"strong\", \"\", s.title || (s.kind === \"tip\" ? \"Tip\" : \"Important\")));\n const body = paragraphs(doc, s.body, \"\");\n if (body) li.appendChild(body);\n } else if (s.kind === \"text\") {\n if (s.title) li.appendChild(el(doc, \"strong\", \"\", s.title));\n const body = paragraphs(doc, s.body, \"g-howto-note\");\n if (body) li.appendChild(body);\n } else {\n const row = el(doc, \"div\", \"g-howto-row\");\n const num = el(doc, \"span\", \"g-howto-num\", String(++n));\n const text = el(doc, \"div\", \"g-howto-text\");\n text.appendChild(el(doc, \"p\", \"g-howto-title\", s.title));\n const body = paragraphs(doc, s.body, \"g-howto-note\");\n if (body) text.appendChild(body);\n row.append(num, text);\n li.appendChild(row);\n const shot = s.image ? screenshot(doc, s.image, s.title) : null;\n if (shot) li.appendChild(shot);\n }\n list.appendChild(li);\n }\n if (!list.childNodes.length)\n wrap.appendChild(el(doc, \"div\", \"g-rc-empty\", \"This how-to has no steps yet.\"));\n else wrap.appendChild(list);\n return wrap;\n}\n","import type { ComplaintStatus, MessengerComplaint, MessengerComplaintCategory } from \"@guidelytech/shared\";\nimport { MAX_COMPLAINT_ANSWER_LENGTH, MAX_COMPLAINT_ATTACHMENT_BYTES, MAX_COMPLAINT_LENGTH } from \"@guidelytech/shared/runtime\";\nimport { el } from \"./help-view\";\n\n/** What the messenger sends to file a complaint (the transport adds the visitor and page). */\nexport interface ComplaintInput {\n categoryId: string;\n description: string;\n answers: Record<string, string>;\n email?: string | null;\n /** File it in this conversation (Scout offered the form there). */\n conversationId?: string | null;\n attachment?: { fileName: string; data: string } | null;\n}\n\n/** The form as the person filled it in so far; kept while they move between screens. */\nexport interface ComplaintDraft {\n description: string;\n answers: Record<string, string>;\n email: string;\n attachment: { fileName: string; data: string; previewUrl: string } | null;\n error: string | null;\n sending: boolean;\n /** Validation failed once: show which fields need attention. */\n checked: boolean;\n}\n\nexport const emptyComplaintDraft = (description = \"\"): ComplaintDraft => ({ description, answers: {}, email: \"\", attachment: null, error: null, sending: false, checked: false });\n\n/** The person's view of where their complaint is. */\nexport const COMPLAINT_STEPS: Array<[ComplaintStatus, string]> = [\n [\"open\", \"Received\"],\n [\"in_review\", \"In review\"],\n [\"resolved\", \"Resolved\"],\n];\nexport const complaintStatusLabel = (s: ComplaintStatus) => COMPLAINT_STEPS.find(([k]) => k === s)?.[1] ?? s;\n\nconst EMAIL = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\n/** The first thing missing or wrong in the form, or null when it can be sent. */\nexport function complaintProblem(category: MessengerComplaintCategory, draft: ComplaintDraft, needsEmail: boolean): string | null {\n for (const f of category.fields) if (f.required && !(draft.answers[f.id] ?? \"\").trim()) return `${f.label} is required.`;\n if (!draft.description.trim()) return \"Tell us what happened.\";\n if (needsEmail && !EMAIL.test(draft.email.trim())) return \"Enter your email address so the team can reply.\";\n return null;\n}\n\n/** The answers worth sending: trimmed, non-empty, only for the category's questions. */\nexport function complaintAnswers(category: MessengerComplaintCategory, draft: ComplaintDraft): Record<string, string> {\n const out: Record<string, string> = {};\n for (const f of category.fields) {\n const v = (draft.answers[f.id] ?? \"\").trim();\n if (v) out[f.id] = v.slice(0, MAX_COMPLAINT_ANSWER_LENGTH);\n }\n return out;\n}\n\nexport function statusPill(doc: Document, status: ComplaintStatus): HTMLElement {\n return el(doc, \"span\", `g-m-pill g-m-pill-${status}`, complaintStatusLabel(status));\n}\n\nfunction dot(doc: Document, color: string): HTMLElement {\n const d = el(doc, \"span\", \"g-m-cat-dot\");\n if (/^#[0-9a-fA-F]{6}$/.test(color)) d.style.background = color;\n d.setAttribute(\"aria-hidden\", \"true\");\n return d;\n}\n\n/** Step 1: the categories, as configured in Complaints → Categories. */\nexport function categoryList(doc: Document, categories: MessengerComplaintCategory[], onPick: (c: MessengerComplaintCategory) => void): HTMLElement {\n const wrap = el(doc, \"div\", \"g-m-form\");\n const intro = el(doc, \"div\");\n intro.append(el(doc, \"h3\", \"g-m-form-title\", \"What's it about?\"), el(doc, \"p\", \"g-m-card-sub\", \"Picking the right one gets it to the right team faster.\"));\n wrap.appendChild(intro);\n const list = el(doc, \"div\", \"g-m-cats\");\n list.setAttribute(\"role\", \"list\");\n for (const c of categories) {\n const b = el(doc, \"button\", \"g-m-card g-m-row g-m-center g-m-cat\");\n b.type = \"button\";\n b.setAttribute(\"role\", \"listitem\");\n b.appendChild(dot(doc, c.color));\n const text = el(doc, \"span\", \"g-m-grow\");\n text.appendChild(el(doc, \"span\", \"g-m-card-title\", c.name));\n if (c.description) text.appendChild(el(doc, \"span\", \"g-m-card-sub\", c.description));\n b.appendChild(text);\n b.addEventListener(\"click\", () => onPick(c));\n list.appendChild(b);\n }\n wrap.appendChild(list);\n return wrap;\n}\n\nlet fieldSeq = 0;\n\nfunction field(doc: Document, label: string, control: HTMLElement, opts: { optional?: boolean; hint?: string; invalid?: boolean } = {}): HTMLElement {\n const id = `g-m-f${++fieldSeq}`;\n control.id = id;\n const wrap = el(doc, \"div\", \"g-m-field\");\n const l = el(doc, \"label\", \"g-m-label\", label);\n l.htmlFor = id;\n if (opts.optional) l.appendChild(el(doc, \"span\", \"g-m-optional\", \" (optional)\"));\n wrap.append(l, control);\n if (opts.hint) {\n const hint = el(doc, \"span\", \"g-m-hint\", opts.hint);\n hint.id = `${id}-hint`;\n control.setAttribute(\"aria-describedby\", hint.id);\n wrap.appendChild(hint);\n }\n if (opts.invalid) control.setAttribute(\"aria-invalid\", \"true\");\n return wrap;\n}\n\nexport interface ComplaintFormOptions {\n category: MessengerComplaintCategory;\n draft: ComplaintDraft;\n /** Visitors the app hasn't identified give an email address. */\n needsEmail: boolean;\n /** More than one category: show \"Change\". */\n canChangeCategory: boolean;\n onChangeCategory: () => void;\n onPickFile: (file: File) => void;\n onRemoveFile: () => void;\n onSubmit: () => void;\n}\n\n/** Step 2: the category's extra questions, what happened, an optional screenshot. */\nexport function complaintForm(doc: Document, o: ComplaintFormOptions): HTMLFormElement {\n const { category, draft } = o;\n const form = el(doc, \"form\", \"g-m-form\");\n form.noValidate = true;\n\n const picked = el(doc, \"div\", \"g-m-picked g-m-row g-m-center\");\n picked.append(dot(doc, category.color), el(doc, \"span\", \"g-m-grow g-m-card-title\", category.name));\n if (o.canChangeCategory) {\n const change = el(doc, \"button\", \"g-m-text-btn\", \"Change\");\n change.type = \"button\";\n change.setAttribute(\"aria-label\", `Change category (${category.name})`);\n change.addEventListener(\"click\", o.onChangeCategory);\n picked.appendChild(change);\n }\n form.appendChild(picked);\n\n for (const f of category.fields) {\n const missing = draft.checked && f.required && !(draft.answers[f.id] ?? \"\").trim();\n let control: HTMLInputElement | HTMLSelectElement;\n if (f.type === \"choice\") {\n const select = el(doc, \"select\", \"g-input\");\n const option = (label: string, value: string) => {\n const o = el(doc, \"option\", \"\", label);\n o.value = value;\n return o;\n };\n select.appendChild(option(f.required ? \"Choose one\" : \"Choose one (optional)\", \"\"));\n for (const opt of f.options ?? []) select.appendChild(option(opt, opt));\n select.value = draft.answers[f.id] ?? \"\";\n select.addEventListener(\"change\", () => (draft.answers[f.id] = select.value));\n control = select;\n } else {\n const input = el(doc, \"input\", \"g-input\");\n input.type = \"text\";\n input.maxLength = MAX_COMPLAINT_ANSWER_LENGTH;\n input.value = draft.answers[f.id] ?? \"\";\n input.addEventListener(\"input\", () => (draft.answers[f.id] = input.value));\n control = input;\n }\n if (f.required) control.required = true;\n form.appendChild(field(doc, f.label, control, { optional: !f.required, invalid: missing }));\n }\n\n const what = el(doc, \"textarea\", \"g-input g-m-textarea\");\n what.rows = 5;\n what.maxLength = MAX_COMPLAINT_LENGTH;\n what.required = true;\n what.value = draft.description;\n what.placeholder = \"What went wrong, and when?\";\n what.addEventListener(\"input\", () => (draft.description = what.value));\n form.appendChild(field(doc, \"What happened?\", what, { invalid: draft.checked && !draft.description.trim() }));\n\n if (o.needsEmail) {\n const email = el(doc, \"input\", \"g-input\");\n email.type = \"email\";\n email.autocomplete = \"email\";\n email.required = true;\n email.value = draft.email;\n email.addEventListener(\"input\", () => (draft.email = email.value));\n form.appendChild(field(doc, \"Your email\", email, { hint: \"So the team can reply to you.\", invalid: draft.checked && !EMAIL.test(draft.email.trim()) }));\n }\n\n const files = el(doc, \"div\", \"g-m-attach\");\n if (draft.attachment) {\n const a = draft.attachment;\n const row = el(doc, \"div\", \"g-m-row g-m-center g-m-attached\");\n if (a.previewUrl) {\n const img = el(doc, \"img\", \"g-m-thumb\");\n img.src = a.previewUrl;\n img.alt = \"\";\n img.addEventListener(\"error\", () => img.remove());\n row.appendChild(img);\n }\n row.appendChild(el(doc, \"span\", \"g-m-grow g-m-ellipsis\", a.fileName));\n const remove = el(doc, \"button\", \"g-m-text-btn\", \"Remove\");\n remove.type = \"button\";\n remove.setAttribute(\"aria-label\", `Remove ${a.fileName}`);\n remove.addEventListener(\"click\", o.onRemoveFile);\n row.appendChild(remove);\n files.appendChild(row);\n } else {\n const input = el(doc, \"input\", \"g-m-file\");\n input.type = \"file\";\n input.accept = \"image/png,image/jpeg,image/webp,image/gif\";\n input.tabIndex = -1;\n input.setAttribute(\"aria-hidden\", \"true\");\n input.addEventListener(\"change\", () => {\n const file = input.files?.[0];\n if (file) o.onPickFile(file);\n });\n const pick = el(doc, \"button\", \"g-m-attach-btn\", \"Attach a screenshot\");\n pick.type = \"button\";\n pick.addEventListener(\"click\", () => input.click());\n files.append(input, pick);\n }\n form.appendChild(files);\n\n const foot = el(doc, \"div\", \"g-m-form-foot\");\n foot.appendChild(el(doc, \"p\", \"g-m-hint\", \"We'll include the page you're on so the team can look into it.\"));\n if (draft.error) {\n const err = el(doc, \"p\", \"g-m-error\", draft.error);\n err.setAttribute(\"role\", \"alert\");\n foot.appendChild(err);\n }\n const submit = el(doc, \"button\", \"g-btn g-btn-primary g-m-wide\", draft.sending ? \"Sending…\" : \"Submit complaint\");\n submit.type = \"submit\";\n submit.disabled = draft.sending;\n foot.appendChild(submit);\n form.appendChild(foot);\n form.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n if (!draft.sending) o.onSubmit();\n });\n return form;\n}\n\n/** Received → In review → Resolved, with the current step marked. */\nexport function statusTracker(doc: Document, status: ComplaintStatus): HTMLElement {\n const list = el(doc, \"ol\", \"g-m-steps\");\n list.setAttribute(\"aria-label\", \"Progress\");\n const at = COMPLAINT_STEPS.findIndex(([k]) => k === status);\n COMPLAINT_STEPS.forEach(([, label], i) => {\n const li = el(doc, \"li\", `g-m-step${i <= at ? \" g-m-step-done\" : \"\"}`);\n if (i === at) li.setAttribute(\"aria-current\", \"step\");\n li.append(el(doc, \"span\", \"g-m-step-dot\"), el(doc, \"span\", \"g-m-step-label\", label));\n list.appendChild(li);\n });\n return list;\n}\n\n/** Step 3: the reference and where it is. */\nexport function complaintSent(doc: Document, o: { complaint: MessengerComplaint; answers: Array<[string, string]>; onOpenConversation: () => void; onHome: () => void }): HTMLElement {\n const wrap = el(doc, \"div\", \"g-m-form g-m-sent\");\n const top = el(doc, \"div\", \"g-m-sent-top\");\n const tick = el(doc, \"span\", \"g-m-sent-tick\");\n tick.setAttribute(\"aria-hidden\", \"true\");\n tick.textContent = \"✓\";\n const p = el(doc, \"p\", \"g-m-card-sub\");\n p.append(\"Your reference is \", el(doc, \"strong\", \"\", o.complaint.reference), \". The team will reply in this conversation, so check back here.\");\n top.append(tick, el(doc, \"h3\", \"g-m-form-title\", \"We've got your complaint\"), p);\n wrap.appendChild(top);\n const details = el(doc, \"dl\", \"g-m-card g-m-static g-m-details\");\n const row = (k: string, v: string) => {\n const r = el(doc, \"div\", \"g-m-detail\");\n r.append(el(doc, \"dt\", \"\", k), el(doc, \"dd\", \"\", v));\n details.appendChild(r);\n };\n row(\"Category\", o.complaint.categoryName);\n o.answers.slice(0, 3).forEach(([k, v]) => row(k, v));\n wrap.appendChild(details);\n wrap.appendChild(statusTracker(doc, o.complaint.status));\n const open = el(doc, \"button\", \"g-btn g-btn-primary g-m-wide\", \"Add more detail\");\n open.type = \"button\";\n open.addEventListener(\"click\", o.onOpenConversation);\n const home = el(doc, \"button\", \"g-btn g-btn-secondary g-m-wide\", \"Back to home\");\n home.type = \"button\";\n home.addEventListener(\"click\", o.onHome);\n wrap.append(open, home);\n return wrap;\n}\n\nconst MAX_SIDE = 1600;\n\n/**\n * Reads a picked image for upload: scaled to at most 1600 px a side and re-encoded as JPEG, so a\n * phone screenshot fits the 2 MB limit. Returns base64 data (no `data:` prefix) and a preview URL.\n */\nexport async function readScreenshot(doc: Document, file: File): Promise<{ fileName: string; data: string; previewUrl: string }> {\n if (!/^image\\/(png|jpeg|webp|gif)$/.test(file.type)) throw new Error(\"Attach a PNG, JPEG, WebP or GIF image.\");\n if (file.size > 25 * 1024 * 1024) throw new Error(\"That image is too large.\");\n const win = doc.defaultView;\n const asDataUrl = (blob: Blob) =>\n new Promise<string>((resolve, reject) => {\n const r = new FileReader();\n r.onload = () => resolve(String(r.result));\n r.onerror = () => reject(new Error(\"The image couldn't be read.\"));\n r.readAsDataURL(blob);\n });\n let dataUrl: string | null = null;\n let scaled = false;\n try {\n const url = win?.URL.createObjectURL(file);\n if (!url) throw new Error(\"no URL\");\n const img = await new Promise<HTMLImageElement>((resolve, reject) => {\n const i = new Image();\n i.onload = () => resolve(i);\n i.onerror = () => reject(new Error(\"decode\"));\n i.src = url;\n }).finally(() => win?.URL.revokeObjectURL(url));\n const scale = Math.min(1, MAX_SIDE / Math.max(img.naturalWidth || 1, img.naturalHeight || 1));\n const canvas = doc.createElement(\"canvas\");\n canvas.width = Math.max(1, Math.round(img.naturalWidth * scale));\n canvas.height = Math.max(1, Math.round(img.naturalHeight * scale));\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) throw new Error(\"no canvas\");\n ctx.fillStyle = \"#fff\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n for (const q of [0.85, 0.7, 0.5]) {\n dataUrl = canvas.toDataURL(\"image/jpeg\", q);\n if ((dataUrl.length - dataUrl.indexOf(\",\") - 1) * 0.75 <= MAX_COMPLAINT_ATTACHMENT_BYTES) break;\n }\n scaled = true;\n } catch {\n // Can't scale here (no canvas, odd format): send the file as it is if it fits.\n dataUrl = file.size <= MAX_COMPLAINT_ATTACHMENT_BYTES ? await asDataUrl(file) : null;\n }\n if (!dataUrl) throw new Error(\"That image is too large. Screenshots can be up to 2 MB.\");\n const data = dataUrl.slice(dataUrl.indexOf(\",\") + 1);\n if (data.length * 0.75 > MAX_COMPLAINT_ATTACHMENT_BYTES) throw new Error(\"That image is too large. Screenshots can be up to 2 MB.\");\n const name = (file.name || \"screenshot\").slice(0, 180);\n return { fileName: scaled ? `${name.replace(/\\.[a-z0-9]+$/i, \"\")}.jpg` : name, data, previewUrl: dataUrl };\n}\n","import type { FeedbackPriority, FeedbackStatus, FeedbackUpdate, FeedbackUpdatesResponse, MessengerIdeaOffer, MessengerIdeasConfig, PublicFeedbackComment, PublicFeedbackList, PublicFeedbackRequest, PublicFeedbackRequestDetail } from \"@guidelytech/shared\";\nimport { FEEDBACK_PRIORITIES, FEEDBACK_PRIORITY_LABEL, FEEDBACK_STATUS_LABEL, MAX_FEEDBACK_COMMENT, MAX_FEEDBACK_DESCRIPTION, MAX_FEEDBACK_NOTE, MAX_FEEDBACK_TITLE, feedbackReference } from \"@guidelytech/shared\";\nimport { el } from \"./help-view\";\nimport { renderSafeText, safeHttpUrl } from \"./render-safe\";\n\n// ---------------------------------------------------------------------------\n// Transport\n// ---------------------------------------------------------------------------\n\nexport type IdeaSort = \"top\" | \"new\" | \"trending\";\nexport type IdeaFilter = \"open\" | \"all\" | \"mine\" | \"following\";\n\n/** What the Ideas tab asks for (the transport adds the visitor). */\nexport interface IdeaListQuery {\n q?: string;\n sort: IdeaSort;\n filter: IdeaFilter;\n status?: FeedbackStatus;\n productArea?: string;\n page: number;\n}\n\n/** A new idea (the transport adds the visitor and the page). */\nexport interface IdeaInput {\n title: string;\n description: string;\n productArea?: string | null;\n priority: FeedbackPriority;\n /** Suggested from this Scout conversation (Scout offered it). */\n conversationId?: string | null;\n}\n\nexport interface IdeaVoteInput {\n priority: FeedbackPriority;\n note?: string;\n conversationId?: string | null;\n}\n\n/** Server access for the Ideas tab. Every method is optional: transports before Ideas lack them. */\nexport interface IdeasApi {\n listIdeas?(query: IdeaListQuery): Promise<PublicFeedbackList>;\n /** Reads one idea with its comments (and counts the view). */\n getIdea?(id: string): Promise<PublicFeedbackRequestDetail>;\n submitIdea?(input: IdeaInput): Promise<PublicFeedbackRequestDetail>;\n voteIdea?(id: string, vote: IdeaVoteInput): Promise<PublicFeedbackRequest>;\n unvoteIdea?(id: string): Promise<PublicFeedbackRequest>;\n followIdea?(id: string, follow: boolean): Promise<PublicFeedbackRequest>;\n commentIdea?(id: string, body: string): Promise<PublicFeedbackRequestDetail>;\n similarIdeas?(title: string): Promise<PublicFeedbackRequest[]>;\n ideaUpdates?(): Promise<FeedbackUpdatesResponse>;\n markIdeaUpdatesRead?(ids?: string[]): Promise<FeedbackUpdatesResponse>;\n /** A short-lived link into the hosted feedback portal. */\n ideaPortalLink?(): Promise<string>;\n}\n\n// ---------------------------------------------------------------------------\n// Pure builders\n// ---------------------------------------------------------------------------\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n/** Lightbulb, drawn like the messenger's other stroke icons. */\nexport const IDEA_ICON = [\"M9 18h6\", \"M10 21h4\", \"M12 3a6 6 0 0 0-3.6 10.8c.7.5 1.1 1.3 1.1 2.1V16h5v-.1c0-.8.4-1.6 1.1-2.1A6 6 0 0 0 12 3z\"];\nconst UP_ICON = [\"m6 15 6-6 6 6\"];\n\nfunction svgIcon(doc: Document, paths: string[], cls = \"g-m-ico\"): SVGSVGElement {\n const svg = doc.createElementNS(SVG_NS, \"svg\");\n svg.setAttribute(\"viewBox\", \"0 0 24 24\");\n svg.setAttribute(\"aria-hidden\", \"true\");\n svg.setAttribute(\"class\", cls);\n for (const d of paths) {\n const p = doc.createElementNS(SVG_NS, \"path\");\n p.setAttribute(\"d\", d);\n svg.appendChild(p);\n }\n return svg;\n}\n\nexport const ideaIcon = (doc: Document, cls?: string) => svgIcon(doc, IDEA_ICON, cls);\n\nconst plural = (n: number, one: string, many = `${one}s`) => `${n} ${n === 1 ? one : many}`;\n\nfunction shortDate(iso: string): string {\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return \"\";\n try {\n return d.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" });\n } catch {\n return d.toISOString().slice(0, 10);\n }\n}\n\n/** The server's message for a failed call (\"title: Give your idea a short title\" → the message). */\nexport const errorText = (e: unknown, fallback: string) => (e instanceof Error && e.message ? e.message : fallback).replace(/^[\\w.]+: /, \"\");\n\nexport function ideaStatusPill(doc: Document, status: FeedbackStatus): HTMLElement {\n return el(doc, \"span\", `g-m-pill g-m-idea-pill g-m-idea-${status}`, FEEDBACK_STATUS_LABEL[status] ?? status);\n}\n\n/** The vote count, as a toggle when the visitor can vote and as a plain count otherwise. */\nexport function voteControl(doc: Document, idea: PublicFeedbackRequest, o: { canVote: boolean; busy?: boolean; onToggle?: () => void }): HTMLElement {\n const count = el(doc, \"span\", \"g-m-vote-count\", String(idea.votes));\n if (!o.canVote) {\n const box = el(doc, \"span\", \"g-m-vote g-m-vote-static\");\n box.setAttribute(\"aria-label\", plural(idea.votes, \"vote\"));\n box.append(svgIcon(doc, UP_ICON, \"g-m-ico g-m-vote-ico\"), count);\n return box;\n }\n const b = el(doc, \"button\", `g-m-vote${idea.myVote ? \" g-m-voted\" : \"\"}`);\n b.type = \"button\";\n b.setAttribute(\"aria-pressed\", String(!!idea.myVote));\n b.setAttribute(\"aria-label\", `${idea.myVote ? \"Remove your vote for\" : \"Vote for\"} ${idea.title} (${plural(idea.votes, \"vote\")})`);\n b.disabled = !!o.busy;\n b.append(svgIcon(doc, UP_ICON, \"g-m-ico g-m-vote-ico\"), count);\n b.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n o.onToggle?.();\n });\n return b;\n}\n\n/** One idea in a list: vote control, then title, status and comment count (opens the idea). */\nexport function ideaRow(doc: Document, idea: PublicFeedbackRequest, o: { canVote: boolean; busy?: boolean; onVote: () => void; onOpen: () => void }): HTMLElement {\n const row = el(doc, \"div\", \"g-m-idea\");\n row.setAttribute(\"role\", \"listitem\");\n row.appendChild(voteControl(doc, idea, { canVote: o.canVote, busy: o.busy, onToggle: o.onVote }));\n const open = el(doc, \"button\", \"g-m-idea-open\");\n open.type = \"button\";\n open.appendChild(el(doc, \"span\", \"g-m-idea-title\", idea.title));\n const meta = el(doc, \"span\", \"g-m-idea-meta\");\n meta.appendChild(ideaStatusPill(doc, idea.status));\n if (idea.comments) meta.appendChild(el(doc, \"span\", \"g-m-time\", plural(idea.comments, \"comment\")));\n if (idea.productArea) meta.appendChild(el(doc, \"span\", \"g-m-time\", idea.productArea));\n if (idea.mine) meta.appendChild(el(doc, \"span\", \"g-m-time\", \"Yours\"));\n open.appendChild(meta);\n open.addEventListener(\"click\", o.onOpen);\n row.appendChild(open);\n return row;\n}\n\nconst FILTERS: Array<[IdeaFilter, string]> = [\n [\"open\", \"Open\"],\n [\"all\", \"All\"],\n [\"mine\", \"Mine\"],\n [\"following\", \"Following\"],\n];\nconst SORTS: Array<[IdeaSort, string]> = [\n [\"top\", \"Top\"],\n [\"new\", \"New\"],\n [\"trending\", \"Trending\"],\n];\n\nexport function filterChips(doc: Document, current: IdeaFilter, onPick: (f: IdeaFilter) => void): HTMLElement {\n const wrap = el(doc, \"div\", \"g-m-filters\");\n wrap.setAttribute(\"role\", \"group\");\n wrap.setAttribute(\"aria-label\", \"Show\");\n for (const [f, label] of FILTERS) {\n const b = el(doc, \"button\", \"g-m-filter\", label);\n b.type = \"button\";\n b.dataset.filter = f;\n b.setAttribute(\"aria-pressed\", String(f === current));\n b.addEventListener(\"click\", () => {\n wrap.querySelectorAll(\"button\").forEach((x) => x.setAttribute(\"aria-pressed\", String(x === b)));\n onPick(f);\n });\n wrap.appendChild(b);\n }\n return wrap;\n}\n\nexport function sortSelect(doc: Document, current: IdeaSort, onChange: (s: IdeaSort) => void): HTMLSelectElement {\n const select = el(doc, \"select\", \"g-input g-m-sort\");\n select.setAttribute(\"aria-label\", \"Sort ideas\");\n for (const [s, label] of SORTS) {\n const opt = el(doc, \"option\", \"\", label);\n opt.value = s;\n select.appendChild(opt);\n }\n select.value = current;\n select.addEventListener(\"change\", () => onChange(select.value as IdeaSort));\n return select;\n}\n\n/** Nice to have / Important / Critical, as a radio group of buttons. */\nexport function priorityChoice(doc: Document, current: FeedbackPriority, onPick: (p: FeedbackPriority) => void, label = \"How important is this to you?\"): HTMLElement {\n const wrap = el(doc, \"div\", \"g-m-field\");\n const id = `g-m-prio${++fieldSeq}`;\n const l = el(doc, \"span\", \"g-m-label\", label);\n l.id = id;\n const group = el(doc, \"div\", \"g-m-seg\");\n group.setAttribute(\"role\", \"radiogroup\");\n group.setAttribute(\"aria-labelledby\", id);\n for (const p of FEEDBACK_PRIORITIES) {\n const b = el(doc, \"button\", \"g-m-seg-btn\", FEEDBACK_PRIORITY_LABEL[p]);\n b.type = \"button\";\n b.dataset.priority = p;\n b.setAttribute(\"role\", \"radio\");\n b.setAttribute(\"aria-checked\", String(p === current));\n b.addEventListener(\"click\", () => {\n group.querySelectorAll(\"button\").forEach((x) => x.setAttribute(\"aria-checked\", String(x === b)));\n onPick(p);\n });\n group.appendChild(b);\n }\n wrap.append(l, group);\n return wrap;\n}\n\nlet fieldSeq = 0;\n\nfunction field(doc: Document, label: string, control: HTMLElement, opts: { optional?: boolean; invalid?: boolean } = {}): HTMLElement {\n const id = `g-m-i${++fieldSeq}`;\n control.id = id;\n const wrap = el(doc, \"div\", \"g-m-field\");\n const l = el(doc, \"label\", \"g-m-label\", label);\n l.htmlFor = id;\n if (opts.optional) l.appendChild(el(doc, \"span\", \"g-m-optional\", \" (optional)\"));\n if (opts.invalid) control.setAttribute(\"aria-invalid\", \"true\");\n wrap.append(l, control);\n return wrap;\n}\n\nfunction errorLine(doc: Document, text: string): HTMLElement {\n const p = el(doc, \"p\", \"g-m-error\", text);\n p.setAttribute(\"role\", \"alert\");\n return p;\n}\n\nfunction button(doc: Document, cls: string, text: string, onClick: () => void): HTMLButtonElement {\n const b = el(doc, \"button\", cls, text);\n b.type = \"button\";\n b.addEventListener(\"click\", onClick);\n return b;\n}\n\n/** Why the visitor can only browse, and the portal when it's on. */\nexport function writeNotice(doc: Document, reason: string, onPortal?: () => void): HTMLElement {\n const box = el(doc, \"div\", \"g-m-idea-notice\");\n box.setAttribute(\"role\", \"note\");\n box.appendChild(el(doc, \"span\", \"\", reason));\n if (onPortal) box.appendChild(button(doc, \"g-m-text-btn\", \"Open the feedback portal\", onPortal));\n return box;\n}\n\nfunction comment(doc: Document, c: PublicFeedbackComment): HTMLElement {\n const li = el(doc, \"li\", `g-m-comment${c.authorType === \"team\" ? \" g-m-comment-team\" : \"\"}`);\n const who = el(doc, \"div\", \"g-m-row g-m-center g-m-comment-meta\");\n who.appendChild(el(doc, \"span\", \"g-m-comment-author\", c.authorName || (c.authorType === \"team\" ? \"Team\" : \"Someone\")));\n if (c.authorType === \"team\") who.appendChild(el(doc, \"span\", \"g-m-ai\", \"Team\"));\n who.appendChild(el(doc, \"span\", \"g-m-time\", shortDate(c.createdAt)));\n const body = el(doc, \"div\", \"g-m-comment-body\");\n body.appendChild(renderSafeText(doc, c.body));\n li.append(who, body);\n return li;\n}\n\nexport interface IdeaDetailOptions {\n idea: PublicFeedbackRequestDetail;\n /** Null when the visitor may vote and comment; otherwise why not. */\n blocked: string | null;\n onPortal?: () => void;\n busy: boolean;\n error: string | null;\n vote: { priority: FeedbackPriority; note: string };\n commentDraft: string;\n onVote: (priority: FeedbackPriority, note: string) => void;\n onUnvote: () => void;\n onFollow: (follow: boolean) => void;\n onCommentInput: (text: string) => void;\n onComment: () => void;\n}\n\n/** An idea: status and the team's note, description, voting with a priority, following and comments. */\nexport function ideaDetail(doc: Document, o: IdeaDetailOptions): HTMLElement {\n const { idea } = o;\n const wrap = el(doc, \"div\", \"g-m-form g-m-idea-detail\");\n const meta = el(doc, \"div\", \"g-m-row g-m-center g-m-idea-meta\");\n meta.append(el(doc, \"span\", \"g-m-time\", feedbackReference(idea.number)), ideaStatusPill(doc, idea.status));\n if (idea.productArea) meta.appendChild(el(doc, \"span\", \"g-m-time\", idea.productArea));\n wrap.append(meta, el(doc, \"h3\", \"g-m-form-title\", idea.title));\n if (idea.description.trim()) {\n const d = el(doc, \"div\", \"g-m-idea-desc\");\n d.appendChild(renderSafeText(doc, idea.description));\n wrap.appendChild(d);\n }\n if (idea.statusNote.trim()) {\n const note = el(doc, \"div\", \"g-m-idea-note\");\n note.appendChild(el(doc, \"span\", \"g-m-card-label\", `${FEEDBACK_STATUS_LABEL[idea.status] ?? idea.status} · from the team`));\n note.appendChild(renderSafeText(doc, idea.statusNote));\n wrap.appendChild(note);\n }\n\n const panel = el(doc, \"div\", \"g-m-card g-m-static g-m-idea-vote\");\n const top = el(doc, \"div\", \"g-m-row g-m-center\");\n top.appendChild(voteControl(doc, idea, { canVote: false }));\n const said = el(doc, \"span\", \"g-m-grow\");\n said.appendChild(el(doc, \"span\", \"g-m-card-title\", plural(idea.votes, \"vote\")));\n if (idea.myVote) said.appendChild(el(doc, \"span\", \"g-m-card-sub\", `You voted · ${FEEDBACK_PRIORITY_LABEL[idea.myVote.priority]}`));\n top.appendChild(said);\n if (!o.blocked) {\n const follow = button(doc, `g-m-follow${idea.following ? \" g-m-following\" : \"\"}`, idea.following ? \"Following\" : \"Follow\", () => o.onFollow(!idea.following));\n follow.setAttribute(\"aria-pressed\", String(idea.following));\n follow.disabled = o.busy;\n follow.title = idea.following ? \"Stop getting updates about this idea\" : \"Get updates here when it changes\";\n top.appendChild(follow);\n }\n panel.appendChild(top);\n if (o.error) panel.appendChild(errorLine(doc, o.error));\n if (o.blocked) panel.appendChild(writeNotice(doc, o.blocked, o.onPortal));\n else if (idea.myVote) {\n // Picking another priority changes the vote.\n panel.appendChild(priorityChoice(doc, idea.myVote.priority, (p) => p !== idea.myVote?.priority && o.onVote(p, \"\"), \"How much do you need it?\"));\n const remove = button(doc, \"g-m-text-btn g-m-unvote\", \"Remove my vote\", o.onUnvote);\n remove.disabled = o.busy;\n panel.appendChild(remove);\n } else {\n const vote = o.vote;\n panel.appendChild(priorityChoice(doc, vote.priority, (p) => (vote.priority = p)));\n const note = el(doc, \"textarea\", \"g-input g-m-idea-why\");\n note.rows = 2;\n note.maxLength = MAX_FEEDBACK_NOTE;\n note.value = vote.note;\n note.placeholder = \"What would it let you do?\";\n note.addEventListener(\"input\", () => (vote.note = note.value));\n panel.appendChild(field(doc, \"Why it matters\", note, { optional: true }));\n const go = button(doc, \"g-btn g-btn-primary g-m-wide g-m-vote-submit\", o.busy ? \"Voting…\" : \"Vote for this idea\", () => o.onVote(vote.priority, vote.note.trim()));\n go.disabled = o.busy;\n panel.appendChild(go);\n }\n wrap.appendChild(panel);\n\n const comments = el(doc, \"div\", \"g-m-comments\");\n comments.appendChild(el(doc, \"h4\", \"g-m-comments-title\", idea.thread.length ? `Comments (${idea.thread.length})` : \"Comments\"));\n if (idea.thread.length) {\n const list = el(doc, \"ul\", \"g-m-comment-list\");\n idea.thread.forEach((c) => list.appendChild(comment(doc, c)));\n comments.appendChild(list);\n } else comments.appendChild(el(doc, \"p\", \"g-m-hint\", \"No comments yet.\"));\n if (!o.blocked) {\n const form = el(doc, \"form\", \"g-m-comment-form\");\n form.noValidate = true;\n const box = el(doc, \"textarea\", \"g-input\");\n box.rows = 2;\n box.maxLength = MAX_FEEDBACK_COMMENT;\n box.placeholder = \"Add a comment…\";\n box.setAttribute(\"aria-label\", \"Comment\");\n box.value = o.commentDraft;\n const post = el(doc, \"button\", \"g-btn g-btn-secondary\", \"Post\");\n post.type = \"submit\";\n post.disabled = o.busy || !o.commentDraft.trim();\n box.addEventListener(\"input\", () => {\n o.onCommentInput(box.value);\n post.disabled = o.busy || !box.value.trim();\n });\n form.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n if (box.value.trim() && !o.busy) o.onComment();\n });\n form.append(box, post);\n comments.appendChild(form);\n }\n wrap.appendChild(comments);\n return wrap;\n}\n\n/** The \"Suggest an idea\" form as filled in so far. */\nexport interface IdeaDraft {\n title: string;\n description: string;\n productArea: string;\n priority: FeedbackPriority;\n /** Suggested from a Scout conversation. */\n conversationId: string | null;\n /** Ideas like the title so far; null until looked up. */\n similar: PublicFeedbackRequest[] | null;\n /** The title `similar` was looked up for. */\n similarFor: string;\n error: string | null;\n sending: boolean;\n checked: boolean;\n}\n\nexport const emptyIdeaDraft = (over: Partial<IdeaDraft> = {}): IdeaDraft => ({ title: \"\", description: \"\", productArea: \"\", priority: \"nice_to_have\", conversationId: null, similar: null, similarFor: \"\", error: null, sending: false, checked: false, ...over });\n\n/** The first thing missing in the form, or null when it can be sent. */\nexport function ideaProblem(draft: IdeaDraft): string | null {\n return draft.title.trim().length < 3 ? \"Give your idea a short title.\" : null;\n}\n\nexport interface IdeaFormOptions {\n draft: IdeaDraft;\n productAreas: string[];\n onTitleInput: () => void;\n onSubmit: () => void;\n}\n\n/** \"Suggest an idea\": title (with similar ideas under it), description, product area and priority. */\nexport function ideaForm(doc: Document, o: IdeaFormOptions): { form: HTMLFormElement; similar: HTMLElement } {\n const { draft } = o;\n const form = el(doc, \"form\", \"g-m-form g-m-idea-form\");\n form.noValidate = true;\n const title = el(doc, \"input\", \"g-input\");\n title.type = \"text\";\n title.maxLength = MAX_FEEDBACK_TITLE;\n title.required = true;\n title.value = draft.title;\n title.placeholder = \"Your idea in a few words\";\n title.addEventListener(\"input\", () => {\n draft.title = title.value;\n o.onTitleInput();\n });\n form.appendChild(field(doc, \"Idea\", title, { invalid: draft.checked && !!ideaProblem(draft) }));\n const similar = el(doc, \"div\", \"g-m-similar\");\n similar.setAttribute(\"aria-live\", \"polite\");\n form.appendChild(similar);\n\n const desc = el(doc, \"textarea\", \"g-input g-m-textarea\");\n desc.rows = 4;\n desc.maxLength = MAX_FEEDBACK_DESCRIPTION;\n desc.value = draft.description;\n desc.placeholder = \"What are you trying to do, and what gets in the way?\";\n desc.addEventListener(\"input\", () => (draft.description = desc.value));\n form.appendChild(field(doc, \"Details\", desc, { optional: true }));\n\n if (o.productAreas.length) {\n const select = el(doc, \"select\", \"g-input\");\n const opt = (label: string, value: string) => {\n const x = el(doc, \"option\", \"\", label);\n x.value = value;\n return x;\n };\n select.appendChild(opt(\"Choose one (optional)\", \"\"));\n o.productAreas.forEach((a) => select.appendChild(opt(a, a)));\n select.value = o.productAreas.includes(draft.productArea) ? draft.productArea : \"\";\n select.addEventListener(\"change\", () => (draft.productArea = select.value));\n form.appendChild(field(doc, \"Product area\", select, { optional: true }));\n }\n form.appendChild(priorityChoice(doc, draft.priority, (p) => (draft.priority = p)));\n\n const foot = el(doc, \"div\", \"g-m-form-foot\");\n if (draft.error) foot.appendChild(errorLine(doc, draft.error));\n const submit = el(doc, \"button\", \"g-btn g-btn-primary g-m-wide\", draft.sending ? \"Sending…\" : \"Submit idea\");\n submit.type = \"submit\";\n submit.disabled = draft.sending;\n foot.appendChild(submit);\n form.appendChild(foot);\n form.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n if (!draft.sending) o.onSubmit();\n });\n return { form, similar };\n}\n\n/** \"Similar ideas — vote instead?\" under the title. */\nexport function similarIdeas(doc: Document, ideas: PublicFeedbackRequest[], row: (idea: PublicFeedbackRequest) => HTMLElement): HTMLElement | null {\n if (!ideas.length) return null;\n const box = el(doc, \"div\", \"g-m-similar-box\");\n box.appendChild(el(doc, \"div\", \"g-m-card-label\", \"Similar ideas — vote instead?\"));\n const list = el(doc, \"div\", \"g-m-idea-list\");\n list.setAttribute(\"role\", \"list\");\n ideas.slice(0, 5).forEach((i) => list.appendChild(row(i)));\n box.appendChild(list);\n return box;\n}\n\n/** After submitting: the idea's number and what happens next. */\nexport function ideaSent(doc: Document, o: { idea: PublicFeedbackRequestDetail; onView: () => void; onBack: () => void }): HTMLElement {\n const wrap = el(doc, \"div\", \"g-m-form g-m-sent\");\n const top = el(doc, \"div\", \"g-m-sent-top\");\n const tick = el(doc, \"span\", \"g-m-sent-tick\", \"✓\");\n tick.setAttribute(\"aria-hidden\", \"true\");\n const p = el(doc, \"p\", \"g-m-card-sub\");\n p.append(el(doc, \"strong\", \"\", `${feedbackReference(o.idea.number)} · ${o.idea.title}`), o.idea.following ? \". You're following it: updates show up here when its status changes.\" : \". Others can now vote for it.\");\n top.append(tick, el(doc, \"h3\", \"g-m-form-title\", \"Thanks for your idea\"), p);\n wrap.append(top, button(doc, \"g-btn g-btn-primary g-m-wide\", \"View your idea\", o.onView), button(doc, \"g-btn g-btn-secondary g-m-wide\", \"Back to ideas\", o.onBack));\n return wrap;\n}\n\n/** Updates about ideas the visitor follows, newest first. */\nexport function updatesList(doc: Document, updates: FeedbackUpdate[], onOpen: (u: FeedbackUpdate) => void): HTMLElement {\n const wrap = el(doc, \"div\", \"g-m-idea-updates\");\n if (!updates.length) {\n wrap.appendChild(el(doc, \"div\", \"g-m-empty\", \"No updates yet. Follow or vote for an idea to hear when it changes.\"));\n return wrap;\n }\n for (const u of updates) {\n const card = el(doc, \"button\", \"g-m-card g-m-update\");\n card.type = \"button\";\n card.disabled = !u.requestId;\n const row = el(doc, \"span\", \"g-m-row\");\n if (!u.read) row.appendChild(el(doc, \"span\", \"g-m-dot\"));\n const text = el(doc, \"span\", \"g-m-grow\");\n text.appendChild(el(doc, \"span\", \"g-m-card-title\", u.title));\n if (u.body) text.appendChild(el(doc, \"span\", \"g-m-card-sub g-m-clamp\", u.body));\n row.append(text, el(doc, \"span\", \"g-m-time\", shortDate(u.createdAt)));\n card.appendChild(row);\n card.setAttribute(\"aria-label\", `${u.title}${u.read ? \"\" : \", new\"}`);\n card.addEventListener(\"click\", () => onOpen(u));\n wrap.appendChild(card);\n }\n return wrap;\n}\n\n// ---------------------------------------------------------------------------\n// State and behaviour (the messenger owns the views and calls in here)\n// ---------------------------------------------------------------------------\n\nexport interface IdeasOptions {\n doc: Document;\n api: IdeasApi;\n config: () => MessengerIdeasConfig | null | undefined;\n /** The app identified the visitor (`identify()`). */\n identified: () => boolean;\n openIdea: (id: string) => void;\n openForm: () => void;\n openSent: (idea: PublicFeedbackRequestDetail) => void;\n openList: () => void;\n openUpdates: () => void;\n /** The number of unread updates changed (tab dot, home card). */\n onUnreadChange: () => void;\n}\n\nexport interface Ideas {\n /** Null when the visitor may vote, comment and suggest; otherwise why not. */\n blocked(): string | null;\n unread(): number;\n listScreen(): HTMLElement;\n detailScreen(id: string): HTMLElement;\n formScreen(): HTMLElement;\n sentScreen(idea: PublicFeedbackRequestDetail): HTMLElement;\n updatesScreen(): HTMLElement;\n /** Starts a new draft (Scout's \"Suggest this idea\" prefills it). */\n startDraft(prefill?: { title?: string; description?: string; conversationId?: string | null }): void;\n /** Scout's offer in a reply, or null when there is nothing the visitor can do with it. */\n offerChip(offer: MessengerIdeaOffer, conversationId: string | null, lead: () => SVGSVGElement): HTMLButtonElement | null;\n /** Fetches updates unless they're younger than `maxAgeMs`. */\n loadUpdates(maxAgeMs?: number): void;\n /** Identity may have changed: drop what belonged to the previous visitor. */\n sync(open: boolean): void;\n destroy(): void;\n}\n\nconst LIST_TTL_MS = 15_000;\n\n/** An idea with the text fields and thread the detail screen relies on, whatever the server left out. */\nconst asDetail = (d: PublicFeedbackRequestDetail): PublicFeedbackRequestDetail => ({ ...d, title: d.title ?? \"\", description: d.description ?? \"\", statusNote: d.statusNote ?? \"\", votes: d.votes ?? 0, thread: Array.isArray(d.thread) ? d.thread : [] });\n\nexport function createIdeas(o: IdeasOptions): Ideas {\n const { doc, api } = o;\n let query: IdeaListQuery = { sort: \"top\", filter: \"open\", page: 1 };\n let list: PublicFeedbackRequest[] | null = null;\n let hasMore = false;\n let listAt = 0;\n let listLoading = false;\n let listError: string | null = null;\n let listSeq = 0;\n /** An action on the list failed (vote). */\n let listActionError: string | null = null;\n const details = new Map<string, PublicFeedbackRequestDetail>();\n const detailErrors = new Map<string, string>();\n const actionErrors = new Map<string, string>();\n const voteDrafts = new Map<string, { priority: FeedbackPriority; note: string }>();\n const commentDrafts = new Map<string, string>();\n const busy = new Set<string>();\n const offers = new Map<string, \"voting\" | \"voted\" | \"failed\">();\n let updates: FeedbackUpdatesResponse | null = null;\n let updatesAt = 0;\n let updatesLoading = false;\n let updatesSeq = 0;\n let draft = emptyIdeaDraft();\n let similarTimer: ReturnType<typeof setTimeout> | null = null;\n let similarSeq = 0;\n let searchTimer: ReturnType<typeof setTimeout> | null = null;\n let who = o.identified();\n /** The screen showing now; async results repaint it while it's still on screen. */\n let mounted: { root: HTMLElement; paint: () => void } | null = null;\n const mount = (root: HTMLElement, paint: () => void) => {\n mounted = { root, paint };\n paint();\n };\n const repaint = () => {\n if (mounted?.root.isConnected) mounted.paint();\n };\n const showing = (root: HTMLElement) => mounted?.root === root && root.isConnected;\n\n const cfg = () => o.config() ?? { title: \"Ideas\", anonymous: false, readOnly: true, productAreas: [], portal: false };\n function blocked(): string | null {\n const c = cfg();\n if (c.readOnly || !api.voteIdea) return c.portal ? \"Voting and new ideas happen in our feedback portal.\" : \"You can browse ideas here. Voting isn't open in the app.\";\n if (!c.anonymous && !o.identified()) return \"Log in to vote, comment or share an idea.\";\n return null;\n }\n const canPortal = () => cfg().portal && !!api.ideaPortalLink;\n\n /** Opens the hosted portal. The window opens right away (popup blockers), then goes to the link. */\n function openPortal() {\n if (!api.ideaPortalLink) return;\n const win = doc.defaultView;\n let tab: Window | null = null;\n try {\n tab = win?.open(\"about:blank\", \"_blank\") ?? null;\n if (tab) tab.opener = null;\n } catch {\n tab = null;\n }\n api\n .ideaPortalLink()\n .then((raw) => {\n const url = safeHttpUrl(raw);\n if (!url) throw new Error(\"The portal link isn't available.\");\n if (tab) tab.location.href = url;\n else win?.open(url, \"_blank\", \"noopener\");\n })\n .catch((e: unknown) => {\n tab?.close();\n listActionError = errorText(e, \"The feedback portal couldn't be opened.\");\n repaint();\n });\n }\n const portal = () => (canPortal() ? openPortal : undefined);\n\n /** A changed idea from the server: update it wherever it's shown. */\n function patch(idea: PublicFeedbackRequest) {\n if (list) list = list.map((x) => (x.id === idea.id ? { ...x, ...idea } : x));\n const d = details.get(idea.id);\n if (d) details.set(idea.id, { ...d, ...idea, thread: \"thread\" in idea ? (idea as PublicFeedbackRequestDetail).thread : d.thread });\n if (draft.similar) draft.similar = draft.similar.map((x) => (x.id === idea.id ? { ...x, ...idea } : x));\n }\n const find = (id: string) => details.get(id) ?? list?.find((x) => x.id === id) ?? draft.similar?.find((x) => x.id === id);\n\n /** Votes (nice to have) or takes the vote back, from a list row. */\n function toggleVote(idea: PublicFeedbackRequest) {\n if (busy.has(idea.id) || blocked() || !api.voteIdea || (idea.myVote && !api.unvoteIdea)) return;\n busy.add(idea.id);\n listActionError = null;\n const voted = !!idea.myVote;\n patch({ ...idea, votes: Math.max(0, idea.votes + (voted ? -1 : 1)), myVote: voted ? null : { priority: \"nice_to_have\" } });\n repaint();\n (voted ? api.unvoteIdea!(idea.id) : api.voteIdea(idea.id, { priority: \"nice_to_have\" }))\n .then(patch)\n .catch((e: unknown) => {\n patch(idea);\n listActionError = errorText(e, \"Your vote couldn't be saved.\");\n })\n .finally(() => {\n busy.delete(idea.id);\n repaint();\n });\n }\n\n function loadList(append = false) {\n if (!api.listIdeas) return;\n const seq = ++listSeq;\n listLoading = true;\n listError = null;\n const q = { ...query };\n api\n .listIdeas(q)\n .then((res) => {\n if (seq !== listSeq) return;\n const got = Array.isArray(res?.requests) ? res.requests : [];\n list = append && list ? [...list, ...got.filter((r) => !list!.some((x) => x.id === r.id))] : got;\n hasMore = !!res?.hasMore;\n listAt = Date.now();\n })\n .catch((e: unknown) => {\n if (seq === listSeq) listError = errorText(e, \"Ideas couldn't be loaded.\");\n })\n .finally(() => {\n if (seq !== listSeq) return;\n listLoading = false;\n repaint();\n });\n }\n const requery = (change: Partial<IdeaListQuery>) => {\n query = { ...query, ...change, page: 1 };\n loadList();\n repaint();\n };\n\n function listScreen(): HTMLElement {\n const root = el(doc, \"div\", \"g-m-scroll g-m-ideas\");\n const top = el(doc, \"div\", \"g-m-ideas-top\");\n const why = blocked();\n if (why) top.appendChild(writeNotice(doc, why, portal()));\n else top.appendChild(button(doc, \"g-btn g-btn-primary g-m-wide\", \"Suggest an idea\", o.openForm));\n const updatesLink = el(doc, \"div\");\n top.appendChild(updatesLink);\n const search = el(doc, \"input\", \"g-input g-m-idea-search\");\n search.type = \"search\";\n search.placeholder = \"Search ideas\";\n search.setAttribute(\"aria-label\", \"Search ideas\");\n search.maxLength = 200;\n search.value = query.q ?? \"\";\n search.addEventListener(\"input\", () => {\n if (searchTimer) clearTimeout(searchTimer);\n searchTimer = setTimeout(() => requery({ q: search.value.trim() || undefined }), 300);\n });\n const tools = el(doc, \"div\", \"g-m-row g-m-center g-m-idea-tools\");\n tools.append(filterChips(doc, query.filter, (filter) => requery({ filter })), sortSelect(doc, query.sort, (sort) => requery({ sort })));\n top.append(search, tools);\n const results = el(doc, \"div\", \"g-m-idea-results\");\n root.append(top, results);\n\n mount(root, () => {\n updatesLink.textContent = \"\";\n const n = updates?.unread ?? 0;\n if (updates?.updates.length) updatesLink.appendChild(button(doc, \"g-m-text-btn g-m-updates-link\", n ? `Updates on your ideas (${n} new)` : \"Updates on your ideas\", o.openUpdates));\n results.textContent = \"\";\n if (listActionError) results.appendChild(errorLine(doc, listActionError));\n if (!list) {\n if (listError) {\n results.append(errorLine(doc, listError), button(doc, \"g-m-text-btn\", \"Try again\", () => loadList()));\n } else results.appendChild(el(doc, \"div\", \"g-m-empty\", \"Loading ideas…\"));\n return;\n }\n if (!list.length) {\n const empty = query.q ? `No ideas match “${query.q}”.` : query.filter === \"mine\" ? \"You haven't suggested any ideas yet.\" : query.filter === \"following\" ? \"You aren't following any ideas yet.\" : \"No ideas yet. Be the first to suggest one.\";\n results.appendChild(el(doc, \"div\", \"g-m-empty\", empty));\n } else {\n const rows = el(doc, \"div\", \"g-m-idea-list\");\n rows.setAttribute(\"role\", \"list\");\n rows.setAttribute(\"aria-busy\", String(listLoading));\n const canVote = !blocked();\n list.forEach((idea) => rows.appendChild(ideaRow(doc, idea, { canVote, busy: busy.has(idea.id), onVote: () => toggleVote(idea), onOpen: () => o.openIdea(idea.id) })));\n results.appendChild(rows);\n }\n if (listError) results.appendChild(errorLine(doc, listError));\n if (hasMore) {\n const more = button(doc, \"g-btn g-btn-secondary g-m-wide\", listLoading ? \"Loading…\" : \"Show more\", () => {\n query = { ...query, page: query.page + 1 };\n loadList(true);\n repaint();\n });\n more.disabled = listLoading;\n results.appendChild(more);\n }\n if (!why && canPortal()) results.appendChild(button(doc, \"g-m-text-btn g-m-portal-link\", \"Open the feedback portal\", openPortal));\n });\n if (!list || Date.now() - listAt > LIST_TTL_MS || query.page > 1) {\n query = { ...query, page: 1 };\n loadList();\n }\n return root;\n }\n\n function act(id: string, call: () => Promise<PublicFeedbackRequest | PublicFeedbackRequestDetail> | undefined, fallback: string, done?: () => void) {\n if (busy.has(id)) return;\n const p = call();\n if (!p) return;\n busy.add(id);\n actionErrors.delete(id);\n repaint();\n p.then((res) => {\n patch(res);\n done?.();\n })\n .catch((e: unknown) => actionErrors.set(id, errorText(e, fallback)))\n .finally(() => {\n busy.delete(id);\n repaint();\n });\n }\n\n function detailScreen(id: string): HTMLElement {\n const root = el(doc, \"div\", \"g-m-scroll\");\n mount(root, () => {\n root.textContent = \"\";\n const idea = details.get(id);\n if (!idea) {\n const err = detailErrors.get(id);\n root.appendChild(err ? errorLine(doc, err) : el(doc, \"div\", \"g-m-empty\", \"Loading…\"));\n return;\n }\n if (!voteDrafts.has(id)) voteDrafts.set(id, { priority: \"nice_to_have\", note: \"\" });\n root.appendChild(\n ideaDetail(doc, {\n idea,\n blocked: blocked(),\n onPortal: portal(),\n busy: busy.has(id),\n error: actionErrors.get(id) ?? null,\n vote: voteDrafts.get(id)!,\n commentDraft: commentDrafts.get(id) ?? \"\",\n onVote: (priority, note) => act(id, () => api.voteIdea?.(id, { priority, ...(note ? { note } : {}) }), \"Your vote couldn't be saved.\", () => voteDrafts.delete(id)),\n onUnvote: () => act(id, () => api.unvoteIdea?.(id), \"Your vote couldn't be removed.\"),\n onFollow: (follow) => act(id, () => api.followIdea?.(id, follow), \"That didn't work. Please try again.\"),\n onCommentInput: (text) => commentDrafts.set(id, text),\n onComment: () => act(id, () => api.commentIdea?.(id, (commentDrafts.get(id) ?? \"\").trim()), \"Your comment couldn't be posted.\", () => commentDrafts.delete(id)),\n }),\n );\n });\n if (api.getIdea) {\n detailErrors.delete(id);\n api\n .getIdea(id)\n .then((d) => {\n details.set(id, asDetail(d));\n patch(d);\n })\n .catch((e: unknown) => {\n if (!details.has(id)) detailErrors.set(id, errorText(e, \"This idea couldn't be loaded.\"));\n })\n .finally(() => {\n if (showing(root)) mounted!.paint();\n });\n }\n return root;\n }\n\n function lookUpSimilar(paint: () => void) {\n const title = draft.title.trim();\n if (title.length < 3 || !api.similarIdeas) {\n draft.similar = null;\n draft.similarFor = \"\";\n return paint();\n }\n if (title === draft.similarFor) return;\n const seq = ++similarSeq;\n api\n .similarIdeas(title)\n .then((res) => {\n if (seq !== similarSeq) return;\n draft.similar = res;\n draft.similarFor = title;\n paint();\n })\n .catch(() => {});\n }\n\n function formScreen(): HTMLElement {\n const root = el(doc, \"div\", \"g-m-scroll\");\n let similarBox: HTMLElement | null = null;\n const paintSimilar = () => {\n if (!similarBox) return;\n similarBox.textContent = \"\";\n const canVote = !blocked();\n const box = similarIdeas(doc, draft.similar ?? [], (idea) => ideaRow(doc, idea, { canVote, busy: busy.has(idea.id), onVote: () => toggleVote(idea), onOpen: () => o.openIdea(idea.id) }));\n if (box) similarBox.appendChild(box);\n if (listActionError) similarBox.appendChild(errorLine(doc, listActionError));\n };\n const paintAll = () => {\n root.textContent = \"\";\n const why = blocked();\n if (why) {\n root.appendChild(writeNotice(doc, why, portal()));\n similarBox = null;\n return;\n }\n const { form, similar } = ideaForm(doc, {\n draft,\n productAreas: cfg().productAreas ?? [],\n onTitleInput: () => {\n if (similarTimer) clearTimeout(similarTimer);\n similarTimer = setTimeout(() => {\n if (showing(root)) lookUpSimilar(paintSimilar);\n }, 300);\n },\n onSubmit: () => submit(root, paintAll),\n });\n root.appendChild(form);\n similarBox = similar;\n paintSimilar();\n };\n mounted = { root, paint: paintSimilar };\n paintAll();\n // A prefilled title (Scout's offer) is checked straight away.\n if (draft.title.trim() && draft.title.trim() !== draft.similarFor) lookUpSimilar(paintSimilar);\n return root;\n }\n\n function submit(root: HTMLElement, paintAll: () => void) {\n const d = draft;\n d.checked = true;\n d.error = ideaProblem(d);\n if (d.error || !api.submitIdea) return paintAll();\n d.sending = true;\n paintAll();\n api\n .submitIdea({ title: d.title.trim(), description: d.description.trim(), productArea: d.productArea || null, priority: d.priority, conversationId: d.conversationId })\n .then((idea) => {\n details.set(idea.id, asDetail(idea));\n listAt = 0; // show it in the list next time\n if (draft === d) draft = emptyIdeaDraft();\n if (showing(root)) o.openSent(idea);\n })\n .catch((e: unknown) => {\n d.sending = false;\n d.error = errorText(e, \"Your idea couldn't be sent.\");\n if (showing(root)) paintAll();\n });\n }\n\n function updatesScreen(): HTMLElement {\n const root = el(doc, \"div\", \"g-m-scroll g-m-idea-updates-screen\");\n mount(root, () => {\n root.textContent = \"\";\n if (!updates) {\n root.appendChild(el(doc, \"div\", \"g-m-empty\", updatesLoading || api.ideaUpdates ? \"Loading…\" : \"No updates yet.\"));\n return;\n }\n root.appendChild(updatesList(doc, updates.updates, (u) => u.requestId && o.openIdea(u.requestId)));\n });\n if (!updates) loadUpdates();\n else markRead();\n return root;\n }\n\n /** Shown on the updates screen: mark them read (the dot stays on each until next time). */\n function markRead() {\n const ids = updates?.updates.filter((u) => !u.read).map((u) => u.id) ?? [];\n if (!ids.length || !api.markIdeaUpdatesRead) return;\n const seq = updatesSeq;\n api\n .markIdeaUpdatesRead(ids)\n .then((res) => {\n if (seq !== updatesSeq || !updates) return;\n // Keep the \"new\" dots on screen; the count goes to zero for the tab and home.\n updates = { updates: updates.updates, unread: res.unread };\n o.onUnreadChange();\n })\n .catch(() => {});\n }\n\n function loadUpdates(maxAgeMs = 0) {\n if (!api.ideaUpdates || updatesLoading || Date.now() - updatesAt < maxAgeMs) return;\n updatesLoading = true;\n const seq = ++updatesSeq;\n api\n .ideaUpdates()\n .then((res) => {\n if (seq !== updatesSeq) return;\n const before = updates?.unread ?? 0;\n updates = { updates: Array.isArray(res?.updates) ? res.updates : [], unread: Number(res?.unread) || 0 };\n updatesAt = Date.now();\n if (updates.unread !== before) o.onUnreadChange();\n if (mounted?.root.isConnected) {\n mounted.paint();\n if (mounted.root.classList.contains(\"g-m-idea-updates-screen\")) markRead();\n }\n })\n .catch(() => {})\n .finally(() => {\n if (seq === updatesSeq) updatesLoading = false;\n });\n }\n\n function offerChip(offer: MessengerIdeaOffer, conversationId: string | null, lead: () => SVGSVGElement): HTMLButtonElement | null {\n const canWrite = !blocked();\n const b = el(doc, \"button\", \"g-m-chip g-m-guide g-m-offer g-m-idea-offer\");\n b.type = \"button\";\n const label = el(doc, \"span\");\n b.append(lead(), label);\n const id = offer.requestId;\n if (!id) {\n if (!canWrite || !api.submitIdea) return null;\n label.textContent = \"Suggest this idea\";\n b.addEventListener(\"click\", () => {\n startDraft({ title: offer.title, description: offer.description, conversationId });\n o.openForm();\n });\n return b;\n }\n const paint = () => {\n const state = offers.get(id) ?? (find(id)?.myVote ? \"voted\" : undefined);\n b.disabled = state === \"voting\";\n label.textContent = !canWrite ? `View “${offer.title}”` : state === \"voting\" ? \"Voting…\" : state === \"voted\" ? \"Voted · View the idea\" : state === \"failed\" ? \"Couldn't vote · View the idea\" : `Vote for “${offer.title}”`;\n return state;\n };\n paint();\n b.addEventListener(\"click\", () => {\n const state = paint();\n if (!canWrite || state === \"voted\" || state === \"failed\" || !api.voteIdea) return o.openIdea(id);\n if (state === \"voting\") return;\n offers.set(id, \"voting\");\n paint();\n api\n .voteIdea(id, { priority: \"nice_to_have\", conversationId })\n .then((idea) => {\n patch(idea);\n offers.set(id, \"voted\");\n })\n .catch(() => offers.set(id, \"failed\"))\n .finally(paint);\n });\n return b;\n }\n\n function startDraft(prefill: { title?: string; description?: string; conversationId?: string | null } = {}) {\n draft = emptyIdeaDraft({ title: (prefill.title ?? \"\").slice(0, MAX_FEEDBACK_TITLE), description: (prefill.description ?? \"\").slice(0, MAX_FEEDBACK_DESCRIPTION), conversationId: prefill.conversationId ?? null });\n }\n\n return {\n blocked,\n unread: () => updates?.unread ?? 0,\n listScreen,\n detailScreen,\n formScreen,\n sentScreen: (idea) => {\n mounted = null;\n const root = el(doc, \"div\", \"g-m-scroll\");\n root.appendChild(ideaSent(doc, { idea, onView: () => o.openIdea(idea.id), onBack: o.openList }));\n return root;\n },\n updatesScreen,\n startDraft,\n offerChip,\n loadUpdates,\n sync(open) {\n const now = o.identified();\n if (now !== who) {\n who = now;\n list = null;\n listAt = 0;\n details.clear();\n offers.clear();\n updates = null;\n updatesAt = 0;\n updatesSeq++;\n updatesLoading = false;\n o.onUnreadChange();\n }\n if (open) loadUpdates(30_000);\n },\n destroy() {\n if (similarTimer) clearTimeout(similarTimer);\n if (searchTimer) clearTimeout(searchTimer);\n mounted = null;\n },\n };\n}\n","/**\n * Renders untrusted chat text (Scout replies, user and teammate messages) with createElement and\n * textContent only. Supports paragraphs, line breaks, `- ` / `1. ` lists, **bold**, `code` and\n * http(s) links. Never creates images, raw HTML or non-http links, so a prompt-injected reply can't\n * load remote resources or run script.\n */\n\nconst CITATION = /\\s*\\[\\[article:[^\\]]*\\]\\]/g;\n// Inline tokens: **bold**, `code`, [label](url), bare https?:// URLs.\nconst INLINE = /\\*\\*([^*\\n]+)\\*\\*|`([^`\\n]+)`|(!?)\\[([^\\]\\n]{1,200})\\]\\((https?:\\/\\/[^\\s)]+)\\)|(https?:\\/\\/[^\\s<>()\"']+[^\\s<>().,;:!?'\"])/g;\n\n/** Removes `[[article:ID]]` markers (citations are rendered from structured data instead). */\nexport function stripCitationMarkers(text: string): string {\n return text.replace(CITATION, \"\");\n}\n\nexport function safeHttpUrl(raw: string): string | null {\n try {\n const u = new URL(raw);\n return u.protocol === \"http:\" || u.protocol === \"https:\" ? u.href : null;\n } catch {\n return null;\n }\n}\n\nfunction link(doc: Document, label: string, href: string): Node {\n const url = safeHttpUrl(href);\n if (!url) return doc.createTextNode(label);\n const a = doc.createElement(\"a\");\n a.href = url;\n a.target = \"_blank\";\n a.rel = \"noopener noreferrer nofollow\";\n a.textContent = label;\n return a;\n}\n\nfunction appendInline(doc: Document, parent: Node, text: string) {\n let last = 0;\n for (const m of text.matchAll(INLINE)) {\n const start = m.index ?? 0;\n if (start > last) parent.appendChild(doc.createTextNode(text.slice(last, start)));\n if (m[1] !== undefined) {\n const b = doc.createElement(\"strong\");\n b.textContent = m[1];\n parent.appendChild(b);\n } else if (m[2] !== undefined) {\n const c = doc.createElement(\"code\");\n c.textContent = m[2];\n parent.appendChild(c);\n } else if (m[4] !== undefined && m[5] !== undefined) {\n // Markdown images (![alt](url)) are never loaded or linked: keep the alt text only.\n parent.appendChild(m[3] ? doc.createTextNode(m[4]) : link(doc, m[4], m[5]));\n } else if (m[6] !== undefined) {\n parent.appendChild(link(doc, m[6], m[6]));\n }\n last = start + m[0].length;\n }\n if (last < text.length) parent.appendChild(doc.createTextNode(text.slice(last)));\n}\n\nconst BULLET = /^\\s*[-*•]\\s+/;\nconst NUMBERED = /^\\s*\\d{1,3}[.)]\\s+/;\n\n/** Builds a fragment for `text`. Safe for any input. */\nexport function renderSafeText(doc: Document, text: string): DocumentFragment {\n const frag = doc.createDocumentFragment();\n const blocks = stripCitationMarkers(text).replace(/\\r\\n?/g, \"\\n\").trim().split(/\\n{2,}/);\n for (const block of blocks) {\n if (!block.trim()) continue;\n const lines = block.split(\"\\n\");\n if (lines.every((l) => BULLET.test(l)) || lines.every((l) => NUMBERED.test(l))) {\n const ordered = NUMBERED.test(lines[0]!);\n const list = doc.createElement(ordered ? \"ol\" : \"ul\");\n for (const line of lines) {\n const li = doc.createElement(\"li\");\n appendInline(doc, li, line.replace(ordered ? NUMBERED : BULLET, \"\"));\n list.appendChild(li);\n }\n frag.appendChild(list);\n continue;\n }\n const p = doc.createElement(\"p\");\n lines.forEach((line, i) => {\n if (i) p.appendChild(doc.createElement(\"br\"));\n appendInline(doc, p, line);\n });\n frag.appendChild(p);\n }\n return frag;\n}\n","/** Messenger styles, injected into the Guidely shadow root the first time the messenger renders. */\nexport const MESSENGER_STYLES = `\n:host([data-g-messenger=\"bottom-right\"]) .g-launcher.g-pos-bottom-right{right:72px}\n:host([data-g-messenger=\"bottom-left\"]) .g-launcher.g-pos-bottom-left{left:72px}\n.g-m-launcher{position:fixed;z-index:calc(var(--g-z) + 1);pointer-events:auto;width:56px;height:56px;margin:16px;border-radius:999px;border:0;background:var(--g-primary);color:var(--g-primary-text);cursor:pointer;box-shadow:var(--g-shadow);display:inline-flex;align-items:center;justify-content:center;padding:0;transition:transform .15s}\n.g-m-launcher:hover{transform:scale(1.05)}\n.g-m-launcher:focus-visible{outline:2px solid var(--g-primary);outline-offset:3px}\n.g-m-launcher svg{width:26px;height:26px;fill:currentColor}\n.g-m-badge{position:absolute;top:-2px;right:-2px;min-width:20px;height:20px;padding:0 5px;border-radius:999px;background:#e11d48;color:#fff;font-size:11px;font-weight:700;display:inline-flex;align-items:center;justify-content:center;border:2px solid var(--g-bg)}\n.g-messenger{bottom:76px;height:min(640px,calc(100vh - 110px));transition:width .2s ease,height .2s ease,max-height .2s ease}\n.g-messenger.g-m-expanded{width:min(720px,calc(100vw - 32px));height:calc(100vh - 110px);max-height:calc(100vh - 110px)}\n.g-m-expanded .g-rc-article,.g-m-expanded .g-m-scroll{padding:24px clamp(20px,5vw,40px)}\n.g-m-expanded .g-rc-article>.g-title{font-size:24px;line-height:1.25;margin-bottom:12px}\n.g-m-expanded .g-rc-article .g-body{font-size:15px}\n.g-m-head.g-m-sizable{padding-right:92px}\n.g-m-size{position:absolute;right:48px;top:50%;transform:translateY(-50%);width:40px;height:40px;border:0;border-radius:999px;background:transparent;color:inherit;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;padding:0}\n.g-m-size .g-m-ico{width:18px;height:18px}\n.g-m-size:hover,.g-m-size:focus-visible{background:rgba(255,255,255,.18);outline:none}\n.g-m-head{padding:16px 48px 14px 20px;background:var(--g-primary);color:var(--g-primary-text);position:relative;display:flex;align-items:center;gap:8px;min-height:56px}\n.g-m-head .g-close{color:inherit;top:50%;transform:translateY(-50%)}\n.g-m-head .g-close:hover,.g-m-head .g-close:focus-visible{background:rgba(255,255,255,.18);color:inherit}\n.g-m-head h2{margin:0;font-size:16px;font-weight:600;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.g-m-back{border:0;background:transparent;color:inherit;font:inherit;cursor:pointer;width:32px;height:32px;border-radius:999px;margin-left:-8px;display:inline-flex;align-items:center;justify-content:center;padding:0}\n.g-m-back:hover,.g-m-back:focus-visible{background:rgba(255,255,255,.18);outline:none}\n.g-m-main{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden}\n.g-m-scroll{flex:1;overflow:auto;padding:16px}\n.g-m-card{display:block;width:100%;text-align:left;border:1px solid var(--g-border);background:var(--g-bg);color:var(--g-text);border-radius:calc(var(--g-radius) * .8);padding:14px 16px;margin:0 0 12px;font:inherit;cursor:pointer;box-shadow:0 1px 2px rgba(0,0,0,.04)}\n.g-m-card:hover{background:var(--g-subtle)}\n.g-m-card:focus-visible{outline:2px solid var(--g-primary);outline-offset:2px}\n.g-m-card-title{display:block;font-weight:600}\n.g-m-card-sub{display:block;color:var(--g-muted);font-size:13px;margin-top:2px}\n.g-m-card-label{display:block;font-size:12px;color:var(--g-muted);font-weight:500}\n.g-m-row{display:flex;align-items:flex-start;gap:10px}\n.g-m-row .g-m-grow{flex:1;min-width:0}\n.g-m-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.g-m-time{color:var(--g-muted);font-size:12px;flex:none}\n.g-m-dot{width:8px;height:8px;border-radius:999px;background:var(--g-primary);flex:none;margin-top:6px}\n.g-m-tabs{display:flex;border-top:1px solid var(--g-border);background:var(--g-bg)}\n.g-m-tab{flex:1;border:0;background:transparent;color:var(--g-muted);font:inherit;font-size:12px;font-weight:600;padding:10px 4px 12px;cursor:pointer;display:flex;flex-direction:column;align-items:center;gap:2px}\n.g-m-tab[aria-selected=\"true\"]{color:var(--g-primary)}\n.g-m-tab:focus-visible{outline:2px solid var(--g-primary);outline-offset:-2px}\n.g-m-tab-icon{position:relative;display:inline-flex;line-height:1}\n.g-m-tab-icon .g-m-ico{width:22px;height:22px}\n.g-m-tab-dot{position:absolute;top:-2px;right:-4px;width:8px;height:8px;border-radius:999px;background:#e11d48;border:2px solid var(--g-bg);box-sizing:content-box}\n.g-m-log{flex:1;overflow:auto;padding:16px;display:flex;flex-direction:column;gap:10px}\n.g-m-msg{max-width:85%;display:flex;flex-direction:column;gap:4px}\n.g-m-msg.g-from-user{align-self:flex-end;align-items:flex-end}\n.g-m-msg.g-from-system{align-self:center;max-width:95%;text-align:center;color:var(--g-muted);font-size:12px}\n.g-m-author{font-size:12px;color:var(--g-muted);display:flex;align-items:center;gap:6px}\n.g-m-ai{font-size:10px;font-weight:700;letter-spacing:.04em;padding:1px 5px;border-radius:4px;background:var(--g-subtle);color:var(--g-muted)}\n.g-m-bubble{padding:10px 12px;border-radius:14px;background:var(--g-subtle);color:var(--g-text);overflow-wrap:anywhere}\n.g-from-user .g-m-bubble{background:var(--g-primary);color:var(--g-primary-text)}\n.g-from-user .g-m-bubble a{color:inherit}\n.g-m-bubble p{margin:0 0 8px}.g-m-bubble p:last-child{margin:0}\n.g-m-bubble ul,.g-m-bubble ol{margin:4px 0 8px;padding-left:20px}\n.g-m-bubble code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;background:color-mix(in srgb,var(--g-text) 8%,transparent);padding:1px 4px;border-radius:4px}\n.g-m-bubble a{color:var(--g-primary)}\n.g-m-failed .g-m-bubble{opacity:.7;font-style:italic}\n.g-m-typing{display:inline-flex;gap:4px;padding:4px 0}\n.g-m-typing span{width:6px;height:6px;border-radius:999px;background:var(--g-muted);animation:g-m-bounce 1s infinite}\n.g-m-typing span:nth-child(2){animation-delay:.15s}.g-m-typing span:nth-child(3){animation-delay:.3s}\n@keyframes g-m-bounce{0%,60%,100%{opacity:.3;transform:translateY(0)}30%{opacity:1;transform:translateY(-3px)}}\n@media (prefers-reduced-motion: reduce){.g-m-typing span{animation:none}.g-m-launcher{transition:none}}\n.g-m-chips{display:flex;flex-direction:column;gap:6px;margin-top:2px}\n.g-m-chip{display:flex;align-items:center;gap:8px;text-align:left;border:1px solid var(--g-border);background:var(--g-bg);color:var(--g-text);border-radius:10px;padding:8px 10px;font:inherit;font-size:13px;cursor:pointer}\n.g-m-chip:hover{background:var(--g-subtle)}\n.g-m-chip:focus-visible{outline:2px solid var(--g-primary);outline-offset:2px}\n.g-m-chip.g-m-guide{border-color:var(--g-primary);color:var(--g-primary);font-weight:600}\n.g-m-foot{border-top:1px solid var(--g-border);padding:10px 12px 12px;background:var(--g-bg)}\n.g-m-compose{display:flex;align-items:flex-end;gap:8px}\n.g-m-compose textarea{flex:1;resize:none;min-height:40px;max-height:120px;border:1px solid var(--g-border);border-radius:10px;padding:9px 10px;font:inherit;font-size:14px;color:var(--g-text);background:var(--g-bg)}\n.g-m-compose textarea:focus-visible{outline:2px solid var(--g-primary);outline-offset:1px}\n.g-m-send{width:40px;height:40px;border-radius:999px;border:0;background:var(--g-primary);color:var(--g-primary-text);cursor:pointer;flex:none;display:inline-flex;align-items:center;justify-content:center;padding:0}\n.g-m-send .g-m-ico{width:18px;height:18px}\n.g-m-send:disabled{opacity:.45;cursor:not-allowed}\n.g-m-send:focus-visible{outline:2px solid var(--g-primary);outline-offset:2px}\n.g-m-human{border:0;background:transparent;color:var(--g-muted);font:inherit;font-size:12px;cursor:pointer;padding:6px 2px 0;text-decoration:underline}\n.g-m-human:hover{color:var(--g-text)}\n.g-m-rate{text-align:center;padding:4px 0 2px;font-size:13px;color:var(--g-muted)}\n.g-m-rate button{border:0;background:transparent;font-size:22px;cursor:pointer;padding:4px 8px;border-radius:8px}\n.g-m-rate button:hover,.g-m-rate button:focus-visible{background:var(--g-subtle);outline:none}\n.g-m-note{color:var(--g-muted);font-size:12px;margin-top:6px}\n.g-m-empty{color:var(--g-muted);text-align:center;padding:24px 8px}\n.g-howto .g-title{margin:0 0 6px}\n.g-howto-desc,.g-howto-note{color:var(--g-muted);font-size:13px}\n.g-howto p{margin:0 0 6px;white-space:pre-line}\n.g-howto-show{width:100%;margin:6px 0 4px}\n.g-howto-video{display:block;width:100%;max-height:260px;margin:8px 0 4px;border-radius:8px;background:#000}\n.g-howto-steps{list-style:none;margin:12px 0 0;padding:0;display:flex;flex-direction:column;gap:16px}\n.g-howto-step h4{margin:4px 0 0;font-size:15px}\n.g-howto-tip,.g-howto-alert{border-left:3px solid var(--g-primary);background:var(--g-subtle);border-radius:6px;padding:8px 10px;font-size:13px}\n.g-howto-alert{border-left-color:#d97706}\n.g-howto-row{display:flex;gap:10px;align-items:flex-start}\n.g-howto-num{flex:none;width:24px;height:24px;border-radius:999px;background:var(--g-primary);color:var(--g-primary-text);font-size:12px;font-weight:700;display:inline-flex;align-items:center;justify-content:center}\n.g-howto-text{flex:1;min-width:0;padding-top:2px}\n.g-howto-title{font-weight:600}\n.g-howto-shot{position:relative;overflow:hidden;margin-top:8px;border:1px solid var(--g-border);border-radius:8px;background:var(--g-subtle)}\n.g-howto-shot img{display:block;width:100%;height:auto}\n.g-howto-shot .g-howto-ghost{visibility:hidden}\n.g-howto-shot .g-howto-zoomed{position:absolute;max-width:none}\n.g-howto-mark{position:absolute;pointer-events:none;border:3px solid var(--g-primary);border-radius:6px;box-shadow:0 0 0 3px color-mix(in srgb,var(--g-primary) 25%,transparent)}\n.g-m-ico{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;flex:none}\n.g-close .g-m-ico,.g-m-back .g-m-ico{width:18px;height:18px}\n.g-m-row.g-m-center{align-items:center}\n.g-m-row.g-m-baseline{align-items:baseline}\n.g-m-static{cursor:default}\n.g-m-static:hover{background:var(--g-bg)}\n.g-m-wide{width:100%}\n.g-m-home{position:relative;padding:0}\n.g-m-hero-bg{position:absolute;top:0;left:0;right:0;height:300px;pointer-events:none;background:linear-gradient(180deg,var(--g-primary) 0%,var(--g-primary) 52%,color-mix(in srgb,var(--g-primary) 30%,var(--g-bg)) 84%,var(--g-bg) 100%)}\n.g-m-home-inner{position:relative;padding:16px;display:flex;flex-direction:column;gap:12px}\n.g-m-home .g-m-card{margin:0;box-shadow:0 1px 2px rgba(0,0,0,.04),0 4px 14px rgba(17,24,39,.06)}\n.g-m-hero-top{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:40px;padding:2px 4px 0}\n.g-m-logo{width:36px;height:36px;border-radius:9px;background:var(--g-bg);color:var(--g-primary);display:inline-flex;align-items:center;justify-content:center;font-weight:700;font-size:17px;overflow:hidden;flex:none}\n.g-m-logo img{width:100%;height:100%;object-fit:contain}\n.g-m-team{display:flex}\n.g-m-avatar{width:32px;height:32px;border-radius:999px;border:2px solid var(--g-primary);display:inline-flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;overflow:hidden;margin-left:-8px;background:#fde7c7;color:#7a4a0a}\n.g-m-avatar:first-child{margin-left:0}\n.g-m-avatar-1{background:#d9f0e3;color:#1f5e3b}\n.g-m-avatar-2{background:#e3e1fa;color:#3b3486}\n.g-m-avatar img{width:100%;height:100%;object-fit:cover}\n.g-m-hero-close{width:36px;height:36px;border:0;border-radius:999px;background:rgba(255,255,255,.16);color:var(--g-primary-text);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;padding:0;margin-left:10px}\n.g-m-hero-close .g-m-ico{width:18px;height:18px}\n.g-m-hero-close:hover{background:rgba(255,255,255,.28)}\n.g-m-hero-close:focus-visible{outline:2px solid var(--g-primary-text);outline-offset:2px}\n.g-m-hello{margin:36px 4px 6px;color:var(--g-primary-text);font-size:26px;font-weight:700;line-height:1.2;letter-spacing:-.01em;display:flex;flex-direction:column}\n.g-m-hello-1{opacity:.8}\n.g-m-trail{color:var(--g-primary)}\n.g-m-lead{color:var(--g-muted)}\n.g-m-status-ico{width:26px;height:26px}\n.g-m-status-operational .g-m-status-ico{color:#15803d}\n.g-m-status-degraded .g-m-status-ico{color:#b45309}\n.g-m-status-outage .g-m-status-ico{color:#b91c1c}\n.g-m-status-maintenance .g-m-status-ico{color:#1d4ed8}\n.g-m-bar{display:block;height:6px;border-radius:999px;background:var(--g-border);margin-top:10px;overflow:hidden}\n.g-m-bar-fill{display:block;height:100%;background:var(--g-primary);border-radius:999px}\n.g-m-link{color:var(--g-primary);font-weight:600;font-size:13px;flex:none}\n.g-m-badge-ico{width:32px;height:32px;border-radius:8px;background:var(--g-subtle);color:color-mix(in srgb,var(--g-text) 78%,transparent);display:inline-flex;align-items:center;justify-content:center;flex:none}\n.g-m-badge-ico .g-m-ico{width:16px;height:16px}\n.g-m-badge-ico.g-m-accent{background:color-mix(in srgb,var(--g-primary) 12%,var(--g-bg));color:var(--g-primary)}\n.g-m-suggest{padding-bottom:4px}\n.g-m-items{display:flex;flex-direction:column;margin-top:8px}\n.g-m-item{display:flex;align-items:center;gap:12px;width:100%;text-align:left;border:0;border-top:1px solid var(--g-border);background:transparent;color:var(--g-text);padding:10px 0;font:inherit;cursor:pointer;min-height:44px}\n.g-m-item:hover .g-m-item-title{color:var(--g-primary)}\n.g-m-item:focus-visible{outline:2px solid var(--g-primary);outline-offset:2px;border-radius:4px}\n.g-m-item .g-m-grow{flex:1;min-width:0}\n.g-m-item-title{display:block;font-weight:600;overflow-wrap:anywhere}\n.g-m-news{padding:0;overflow:hidden}\n.g-m-news-img{display:block;width:100%;height:150px;object-fit:cover;background:var(--g-subtle)}\n.g-m-news-body{display:block;padding:14px 16px}\n.g-m-news-meta{gap:8px;margin-bottom:4px}\n.g-m-tag{font-size:11px;font-weight:700;color:var(--g-primary-text);background:var(--g-primary);border-radius:4px;padding:1px 6px;text-transform:uppercase;letter-spacing:.03em}\n.g-m-clamp{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}\n.g-m-context{align-self:center;font-size:12px;color:var(--g-muted);background:var(--g-subtle);border-radius:999px;padding:3px 10px}\n.g-m-asks{align-items:flex-start}\n.g-m-chip.g-m-ask{border-color:var(--g-primary);color:var(--g-primary);font-weight:600;border-radius:999px;padding:8px 14px;min-height:36px}\n.g-m-chip.g-m-ask:disabled{opacity:.5;cursor:not-allowed}\n.g-m-side{display:flex;flex-direction:column;align-items:flex-end;gap:4px;flex:none}\n.g-m-pill{display:inline-block;font-size:11px;font-weight:700;line-height:1.5;padding:1px 8px;border-radius:999px;white-space:nowrap;background:#fef3c7;color:#92400e}\n.g-m-pill-in_review{background:#e0e7ff;color:#3730a3}\n.g-m-pill-resolved{background:#dcfce7;color:#166534}\n.g-m-complain .g-m-badge-ico{background:#fef3e2;color:#b45309}\n.g-m-complaint{align-self:stretch;gap:10px;border:1px solid var(--g-border);background:var(--g-subtle);border-radius:10px;padding:10px 12px}\n.g-m-chip-ico{width:16px;height:16px}\n.g-m-offer{gap:6px}\n.g-m-form{display:flex;flex-direction:column;gap:14px;margin:0}\n.g-m-form-title{margin:0;font-size:17px;font-weight:600}\n.g-m-cats{display:flex;flex-direction:column;gap:10px}\n.g-m-cats .g-m-card{margin:0;gap:12px;min-height:44px}\n.g-m-cat-dot{width:10px;height:10px;border-radius:999px;background:var(--g-muted);flex:none}\n.g-m-picked{gap:8px;border:1px solid var(--g-border);background:var(--g-subtle);border-radius:10px;padding:8px 12px}\n.g-m-text-btn{border:0;background:transparent;color:var(--g-primary);font:inherit;font-size:13px;font-weight:600;cursor:pointer;padding:6px 4px;min-height:32px}\n.g-m-text-btn:hover{text-decoration:underline}\n.g-m-text-btn:focus-visible{outline:2px solid var(--g-primary);outline-offset:2px;border-radius:4px}\n.g-m-field{display:flex;flex-direction:column;gap:4px}\n.g-m-label{font-weight:600;font-size:13px}\n.g-m-optional{font-weight:400;color:var(--g-muted)}\n.g-m-hint{color:var(--g-muted);font-size:12px;margin:0}\n.g-m-error{color:#b91c1c;font-size:13px;margin:0}\n.g-scope[data-theme=\"dark\"] .g-m-error{color:#fca5a5}\n.g-m-field .g-input[aria-invalid=\"true\"]{border-color:#dc2626}\n.g-m-textarea{min-height:110px}\n.g-m-file{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}\n.g-m-attach-btn{align-self:flex-start;border:1px dashed var(--g-border);background:var(--g-bg);color:var(--g-text);font:inherit;font-size:13px;border-radius:8px;padding:8px 12px;cursor:pointer;min-height:36px}\n.g-m-attach-btn:hover{background:var(--g-subtle)}\n.g-m-attach-btn:focus-visible{outline:2px solid var(--g-primary);outline-offset:2px}\n.g-m-attached{gap:10px;border:1px solid var(--g-border);border-radius:8px;padding:6px 8px;font-size:13px}\n.g-m-thumb{width:40px;height:40px;object-fit:cover;border-radius:6px;background:var(--g-subtle);flex:none}\n.g-m-form-foot{display:flex;flex-direction:column;gap:10px;margin-top:4px}\n.g-m-sent{gap:12px}\n.g-m-sent-top{display:flex;flex-direction:column;align-items:center;text-align:center;gap:6px;padding-top:8px}\n.g-m-sent-top p{max-width:300px;margin:0}\n.g-m-sent-tick{width:52px;height:52px;border-radius:999px;background:#dcfce7;color:#15803d;display:inline-flex;align-items:center;justify-content:center;font-size:26px;font-weight:700}\n.g-m-details{margin:0;display:flex;flex-direction:column;gap:8px}\n.g-m-detail{display:flex;justify-content:space-between;gap:12px;font-size:13px}\n.g-m-detail dt{color:var(--g-muted)}\n.g-m-detail dd{margin:0;font-weight:600;text-align:right;overflow-wrap:anywhere}\n.g-m-steps{list-style:none;margin:4px 0;padding:0;display:flex;justify-content:space-between;position:relative}\n.g-m-steps::before{content:\"\";position:absolute;top:6px;left:12%;right:12%;height:2px;background:var(--g-border)}\n.g-m-step{position:relative;display:flex;flex-direction:column;align-items:center;gap:4px;flex:1;font-size:12px;color:var(--g-muted)}\n.g-m-step-dot{width:14px;height:14px;border-radius:999px;border:2px solid var(--g-border);background:var(--g-bg);box-sizing:border-box}\n.g-m-step-done{color:var(--g-text);font-weight:600}\n.g-m-step-done .g-m-step-dot{background:var(--g-primary);border-color:var(--g-primary)}\n.g-m-ideas-top{display:flex;flex-direction:column;gap:10px;margin-bottom:12px}\n.g-m-ideas-top:empty{display:none}\n.g-m-idea-tools{justify-content:space-between;gap:8px;flex-wrap:wrap}\n.g-m-filters{display:flex;gap:6px;flex-wrap:wrap}\n.g-m-filter{border:1px solid var(--g-border);background:var(--g-bg);color:var(--g-text);font:inherit;font-size:12px;font-weight:600;border-radius:999px;padding:5px 11px;cursor:pointer;min-height:30px}\n.g-m-filter:hover{background:var(--g-subtle)}\n.g-m-filter[aria-pressed=\"true\"]{background:var(--g-primary);border-color:var(--g-primary);color:var(--g-primary-text)}\n.g-m-filter:focus-visible,.g-m-seg-btn:focus-visible,.g-m-vote:focus-visible,.g-m-idea-open:focus-visible,.g-m-follow:focus-visible{outline:2px solid var(--g-primary);outline-offset:2px}\n.g-m-sort{width:auto;min-width:0;min-height:30px;padding:4px 8px;font-size:12px}\n.g-m-idea-list{display:flex;flex-direction:column;border:1px solid var(--g-border);border-radius:calc(var(--g-radius) * .8);background:var(--g-bg);overflow:hidden;margin-bottom:12px}\n.g-m-idea{display:flex;align-items:flex-start;gap:12px;padding:12px 14px;border-top:1px solid var(--g-border)}\n.g-m-idea:first-child{border-top:0}\n.g-m-vote{flex:none;width:44px;min-height:48px;border:1px solid var(--g-border);border-radius:10px;background:var(--g-bg);color:var(--g-text);font:inherit;display:inline-flex;flex-direction:column;align-items:center;justify-content:center;gap:0;padding:4px 0;cursor:pointer}\nbutton.g-m-vote:hover{border-color:var(--g-primary);color:var(--g-primary)}\n.g-m-vote:disabled{opacity:.6;cursor:progress}\n.g-m-vote.g-m-voted{background:color-mix(in srgb,var(--g-primary) 12%,var(--g-bg));border-color:var(--g-primary);color:var(--g-primary)}\n.g-m-vote-static{cursor:default;background:var(--g-subtle)}\n.g-m-vote-ico{width:16px;height:16px;stroke-width:2.4}\n.g-m-vote-count{font-size:13px;font-weight:700;line-height:1.2}\n.g-m-idea-open{flex:1;min-width:0;border:0;background:transparent;color:var(--g-text);font:inherit;text-align:left;padding:2px 0;cursor:pointer;display:flex;flex-direction:column;gap:6px;border-radius:4px}\n.g-m-idea-open:hover .g-m-idea-title{color:var(--g-primary)}\n.g-m-idea-title{font-weight:600;overflow-wrap:anywhere}\n.g-m-idea-meta{display:flex;align-items:center;gap:8px;flex-wrap:wrap}\n.g-m-idea-pill.g-m-idea-new{background:var(--g-subtle);color:var(--g-muted)}\n.g-m-idea-pill.g-m-idea-under_review{background:#e0e7ff;color:#3730a3}\n.g-m-idea-pill.g-m-idea-planned{background:#dbeafe;color:#1e40af}\n.g-m-idea-pill.g-m-idea-in_progress{background:#fef3c7;color:#92400e}\n.g-m-idea-pill.g-m-idea-released{background:#dcfce7;color:#166534}\n.g-m-idea-pill.g-m-idea-declined{background:#fee2e2;color:#991b1b}\n.g-m-idea-notice{display:flex;flex-direction:column;align-items:flex-start;gap:2px;border:1px solid var(--g-border);background:var(--g-subtle);border-radius:10px;padding:10px 12px;font-size:13px;color:var(--g-text)}\n.g-m-idea-notice .g-m-text-btn{padding:4px 0;min-height:0}\n.g-m-updates-link,.g-m-portal-link{align-self:flex-start;padding-left:0}\n.g-m-portal-link{display:block;margin:0 auto}\n.g-m-idea-detail{gap:12px}\n.g-m-idea-desc,.g-m-idea-note{font-size:14px;overflow-wrap:anywhere}\n.g-m-idea-desc p,.g-m-idea-note p,.g-m-comment-body p{margin:0 0 8px}\n.g-m-idea-desc p:last-child,.g-m-idea-note p:last-child,.g-m-comment-body p:last-child{margin:0}\n.g-m-idea-note{border-left:3px solid var(--g-primary);background:var(--g-subtle);border-radius:6px;padding:8px 10px}\n.g-m-idea-vote{display:flex;flex-direction:column;gap:12px;margin:0}\n.g-m-idea-vote .g-m-vote{min-height:44px}\n.g-m-follow{flex:none;border:1px solid var(--g-border);background:var(--g-bg);color:var(--g-text);font:inherit;font-size:13px;font-weight:600;border-radius:999px;padding:6px 12px;cursor:pointer;min-height:32px}\n.g-m-follow:hover{background:var(--g-subtle)}\n.g-m-follow.g-m-following{border-color:var(--g-primary);color:var(--g-primary)}\n.g-m-follow:disabled{opacity:.6}\n.g-m-seg{display:flex;border:1px solid var(--g-border);border-radius:10px;overflow:hidden}\n.g-m-seg-btn{flex:1;border:0;border-left:1px solid var(--g-border);background:var(--g-bg);color:var(--g-text);font:inherit;font-size:12px;font-weight:600;padding:8px 4px;cursor:pointer;min-height:36px}\n.g-m-seg-btn:first-child{border-left:0}\n.g-m-seg-btn:hover{background:var(--g-subtle)}\n.g-m-seg-btn[aria-checked=\"true\"]{background:var(--g-primary);color:var(--g-primary-text)}\n.g-m-unvote{align-self:flex-start;padding-left:0;color:var(--g-muted)}\n.g-m-comments{display:flex;flex-direction:column;gap:8px}\n.g-m-comments-title{margin:4px 0 0;font-size:14px}\n.g-m-comment-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:10px}\n.g-m-comment{border:1px solid var(--g-border);border-radius:10px;padding:8px 10px;font-size:13px}\n.g-m-comment-team{background:var(--g-subtle);border-color:color-mix(in srgb,var(--g-primary) 35%,var(--g-border))}\n.g-m-comment-meta{gap:6px;margin-bottom:4px}\n.g-m-comment-author{font-weight:600}\n.g-m-comment-body{overflow-wrap:anywhere}\n.g-m-comment-form{display:flex;flex-direction:column;align-items:flex-end;gap:6px}\n.g-m-comment-form textarea{resize:vertical;min-height:56px}\n.g-m-similar:empty{display:none}\n.g-m-similar-box{display:flex;flex-direction:column;gap:6px}\n.g-m-similar-box .g-m-idea-list{margin:0}\n.g-m-update{display:block}\n.g-m-update:disabled{cursor:default}\n.g-m-update:disabled:hover{background:var(--g-bg)}\n`;\n"],"mappings":"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","names":["o","fieldSeq","field","SVG_NS","shortDate","dot","draft"]}
1
+ {"version":3,"sources":["../src/messenger.ts","../src/howto-view.ts","../src/complaint-view.ts","../src/ideas-view.ts","../src/render-safe.ts","../src/launcher-drag.ts","../src/messenger-styles.ts"],"sourcesContent":["import type {\n ConversationMessagesResponse,\n FileComplaintResponse,\n MessengerComplaint,\n MessengerComplaintCategory,\n MessengerConfig,\n MessengerConversation,\n MessengerMessage,\n MessengerPageContent,\n MessengerStatus,\n PublicFeedbackRequestDetail,\n ResourceCenterArticle,\n ResourceCenterConfig,\n ResourceCenterModuleId,\n RuleGroup,\n SdkArticlesResponse,\n SdkHowTo,\n SdkHowToSummary,\n SdkHowTosResponse,\n} from \"@guidelytech/shared\";\nimport { foldPathIds, matchesHelpQuery, orderedModules, pageLabel } from \"@guidelytech/shared/runtime\";\nimport { createHelpView, el, resultRow, startableGuide, type HelpData, type HelpGuideRef, type HelpSuggestion } from \"./help-view\";\nimport { renderHowTo } from \"./howto-view\";\nimport { categoryList, complaintAnswers, complaintForm, complaintProblem, complaintSent, emptyComplaintDraft, readScreenshot, statusPill, type ComplaintDraft, type ComplaintInput } from \"./complaint-view\";\nimport { createIdeas, IDEA_ICON, type IdeasApi } from \"./ideas-view\";\nimport { enableLauncherDrag, maxLauncherBottom, type LauncherSpot } from \"./launcher-drag\";\n\nexport { parseLauncherSpot, type LauncherSpot } from \"./launcher-drag\";\nimport { MESSENGER_STYLES } from \"./messenger-styles\";\nimport { renderSafeText } from \"./render-safe\";\n\n/** Callbacks the transport invokes while a message is sent and Scout replies. */\nexport interface MessengerStreamHandlers {\n /** A new conversation was created (first message only). */\n onConversation?(conversation: MessengerConversation): void;\n onMessage(message: MessengerMessage): void;\n onDelta(messageId: string, text: string): void;\n onDone(message: MessengerMessage | null, conversation: MessengerConversation): void;\n onError(message: string): void;\n}\n\nexport type { IdeaInput, IdeaListQuery, IdeaVoteInput, IdeasApi } from \"./ideas-view\";\n\n/** Server access for the messenger; implemented by sdk-core over the public SDK API. The Ideas methods ({@link IdeasApi}) are optional. */\nexport interface MessengerApi extends IdeasApi {\n listConversations(): Promise<MessengerConversation[]>;\n loadMessages(conversationId: string, since?: string | null): Promise<ConversationMessagesResponse>;\n start(text: string, handlers: MessengerStreamHandlers): Promise<void>;\n send(conversationId: string, text: string, handlers: MessengerStreamHandlers): Promise<void>;\n handoff(conversationId: string): Promise<ConversationMessagesResponse>;\n rate(conversationId: string, rating: number): Promise<void>;\n listArticles(): Promise<SdkArticlesResponse>;\n getArticle(id: string): Promise<ResourceCenterArticle | null>;\n searchArticles(q: string): Promise<ResourceCenterArticle[]>;\n /** How-tos available in the app, and the ones for the page the user is on (optional: older transports). */\n listHowTos?(): Promise<SdkHowTosResponse>;\n getHowTo?(id: string): Promise<SdkHowTo | null>;\n /** Page-matched how-tos, articles and common questions (servers before the personalised home lack it). */\n pageContent?(path: string): Promise<MessengerPageContent>;\n /** Files a complaint (transports before complaints lack it; the messenger then hides the form). */\n fileComplaint?(input: ComplaintInput): Promise<FileComplaintResponse>;\n}\n\nexport type MessengerTab = \"home\" | \"messages\" | \"help\" | \"ideas\" | \"news\";\n\n/** A guide the visitor started and didn't finish. */\nexport interface MessengerResumeGuide {\n id: string;\n name: string;\n stepId: string;\n /** Zero-based index of the step they reached. */\n stepIndex: number;\n stepCount: number;\n}\n\nexport interface MessengerChecklistProgress {\n id: string;\n name: string;\n done: number;\n total: number;\n /** Title of the first unfinished task. */\n nextTask: string | null;\n}\n\n/** A live announcement, shown on Home and in the News tab. */\nexport interface MessengerNewsItem {\n id: string;\n key: string;\n title: string;\n /** Plain text. */\n body: string;\n imageUrl: string | null;\n publishedAt: string;\n unread: boolean;\n /** Resource-center \"What's new\" entries: open this help article, or this link, instead of starting a guide. */\n articleId?: string | null;\n url?: string | null;\n}\n\n/** What the SDK knows about the visitor right now, read each time the messenger renders. */\nexport interface MessengerVisitor {\n firstName: string | null;\n /** The app identified the visitor (`identify()`); false for anonymous visitors. Unknown counts as identified. */\n identified?: boolean;\n /** Current page path (no query or fragment); null when unknown. */\n path: string | null;\n /** Live guides targeted at this page that the visitor can start. */\n pageGuides: HelpGuideRef[];\n resumeGuide: MessengerResumeGuide | null;\n checklist: MessengerChecklistProgress | null;\n news: MessengerNewsItem[];\n}\n\nexport interface MessengerOptions {\n scope: HTMLElement;\n config: MessengerConfig;\n api: MessengerApi;\n /** Resource center extras (recommended guides, checklists, FAQs, links) shown in the Help tab. */\n resourceCenter?: ResourceCenterConfig | null;\n /** The visitor's audiences (for audience-targeted articles and collections in the Help tab). */\n audienceIds?: () => ReadonlySet<string> | readonly string[];\n guides?: HelpGuideRef[];\n onStartGuide?: (guideKeyOrId: string) => void;\n onOpenChecklist?: (guideId: string) => void;\n onArticleView?: (article: ResourceCenterArticle) => void;\n onOpen?: () => void;\n onClose?: () => void;\n onMessage?: (message: MessengerMessage, conversation: MessengerConversation) => void;\n /** Personalisation: name, page, progress and announcements. Without it the home screen is generic. */\n visitor?: () => MessengerVisitor;\n /** Logo and name shown at the top of the home screen (project theme). */\n brand?: { logoUrl?: string | null; name?: string | null };\n onResumeGuide?: (guideId: string, stepId: string) => void;\n /** Evaluates a resource-center section's targeting for the current visitor (absent = every section shows). */\n evaluate?: (rules: RuleGroup) => boolean;\n /** The visitor saw these announcements (News tab opened). */\n onNewsSeen?: (ids: string[]) => void;\n hideLauncher?: boolean;\n /** Where the visitor last dragged the launcher on this device (null = the configured corner). */\n launcherSpot?: LauncherSpot | null;\n /** The visitor dragged the launcher somewhere else (save it for next time). */\n onLauncherMove?: (spot: LauncherSpot) => void;\n /** Poll intervals (ms): open thread, and unread badge while closed. */\n pollMs?: { thread: number; background: number };\n}\n\nexport interface MessengerWidget {\n el: HTMLElement;\n open(tab?: MessengerTab): void;\n close(): void;\n toggle(): void;\n isOpen(): boolean;\n /** Opens a new conversation, optionally pre-filling the composer. */\n showNewMessage(text?: string): void;\n openArticle(id: string): void;\n /** Opens the complaint form, optionally with a category picked (when the project takes complaints). */\n openComplaint(categoryId?: string): void;\n /** Opens the Ideas tab, or one idea (when the project turned Ideas on). */\n openIdeas(requestId?: string): void;\n /** Re-reads the visitor (page changed, progress made) and re-renders what is showing. */\n refresh(): void;\n destroy(): void;\n}\n\ntype View =\n | { kind: \"tab\"; tab: MessengerTab }\n | { kind: \"thread\"; conversationId: string | null }\n | { kind: \"howto\"; id: string; from: View }\n /** Filing a complaint: pick a category, fill in the form (in `conversationId` when Scout offered it), then the reference. */\n | { kind: \"complaint-category\"; conversationId: string | null; from: View }\n | { kind: \"complaint-form\"; categoryId: string; conversationId: string | null; from: View }\n | { kind: \"complaint-sent\"; complaint: MessengerComplaint; conversationId: string; answers: Array<[string, string]> }\n /** Ideas (the list is the \"ideas\" tab): one idea, the \"Suggest an idea\" form, its confirmation, updates. */\n | { kind: \"idea\"; id: string; from: View }\n | { kind: \"idea-new\"; from: View }\n | { kind: \"idea-sent\"; idea: PublicFeedbackRequestDetail }\n | { kind: \"idea-updates\"; from: View };\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\nfunction chatIcon(doc: Document): SVGSVGElement {\n const svg = doc.createElementNS(SVG_NS, \"svg\");\n svg.setAttribute(\"viewBox\", \"0 0 24 24\");\n svg.setAttribute(\"aria-hidden\", \"true\");\n const path = doc.createElementNS(SVG_NS, \"path\");\n path.setAttribute(\"d\", \"M12 3C6.5 3 2 6.8 2 11.5c0 2.4 1.2 4.6 3.1 6.1L4.5 21l3.9-2c1.1.3 2.3.5 3.6.5 5.5 0 10-3.8 10-8.5S17.5 3 12 3z\");\n svg.appendChild(path);\n return svg;\n}\n\n/** Stroke icons (24×24 viewBox), drawn with currentColor. */\nconst ICONS: Record<string, string[]> = {\n home: [\"M3 10.5 12 3l9 7.5V20a1 1 0 0 1-1 1h-5v-6H9v6H4a1 1 0 0 1-1-1z\"],\n messages: [\"M4 5h16v11H8l-4 4z\"],\n help: [\"M12 3a9 9 0 1 0 0 18 9 9 0 0 0 0-18z\", \"M9.5 9.5a2.5 2.5 0 1 1 3.5 2.3c-.6.3-1 .8-1 1.5V14\", \"M12 17h.01\"],\n news: [\"M3 11v2a1 1 0 0 0 1 1h2l5 4V6L6 10H4a1 1 0 0 0-1 1z\", \"M15 9a4 4 0 0 1 0 6\", \"M18 6a8 8 0 0 1 0 12\"],\n arrow: [\"M5 12h14\", \"M13 6l6 6-6 6\"],\n close: [\"M6 6l12 12\", \"M18 6 6 18\"],\n back: [\"M15 6l-6 6 6 6\"],\n chevron: [\"m9 6 6 6-6 6\"],\n check: [\"M12 3a9 9 0 1 0 0 18 9 9 0 0 0 0-18z\", \"m8 12 3 3 5-6\"],\n alert: [\"M12 3a9 9 0 1 0 0 18 9 9 0 0 0 0-18z\", \"M12 8v4\", \"M12 16h.01\"],\n wrench: [\"M14.7 6.3a4 4 0 0 0-5.4 5.4L4 17l3 3 5.3-5.3a4 4 0 0 0 5.4-5.4l-2.5 2.5-2.4-.6-.6-2.4z\"],\n play: [\"M8 5v14l11-7z\"],\n steps: [\"M9 6h11\", \"M9 12h11\", \"M9 18h11\", \"M4 6h.01\", \"M4 12h.01\", \"M4 18h.01\"],\n article: [\"M6 3h9l4 4v14H6z\", \"M9 12h6\", \"M9 16h6\"],\n ask: [\"M4 5h16v11H8l-4 4z\", \"M9 9.5h6\", \"M9 12.5h4\"],\n search: [\"M11 4a7 7 0 1 0 0 14 7 7 0 0 0 0-14z\", \"m20 20-3.5-3.5\"],\n circle: [\"M12 3a9 9 0 1 0 0 18 9 9 0 0 0 0-18z\"],\n expand: [\"M15 3h6v6\", \"M21 3l-7 7\", \"M9 21H3v-6\", \"M3 21l7-7\"],\n flag: [\"M5 21V4\", \"M5 4h12l-2.5 4L17 12H5\"],\n collapse: [\"M4 14h6v6\", \"M3 21l7-7\", \"M20 10h-6V4\", \"M21 3l-7 7\"],\n idea: IDEA_ICON,\n};\n\nfunction icon(doc: Document, name: keyof typeof ICONS, cls = \"g-m-ico\"): SVGSVGElement {\n const svg = doc.createElementNS(SVG_NS, \"svg\");\n svg.setAttribute(\"viewBox\", \"0 0 24 24\");\n svg.setAttribute(\"aria-hidden\", \"true\");\n svg.setAttribute(\"class\", cls);\n for (const d of ICONS[name] ?? []) {\n const path = doc.createElementNS(SVG_NS, \"path\");\n path.setAttribute(\"d\", d);\n svg.appendChild(path);\n }\n return svg;\n}\n\nconst REPLY_TIME_TEXT: Record<string, string> = {\n minutes: \"typically replies in a few minutes\",\n hour: \"typically replies within an hour\",\n hours: \"typically replies in a few hours\",\n day: \"typically replies within a day\",\n};\n\nconst STATUS_TEXT: Record<MessengerStatus[\"level\"], { title: string; icon: keyof typeof ICONS }> = {\n operational: { title: \"All systems operational\", icon: \"check\" },\n degraded: { title: \"Degraded performance\", icon: \"alert\" },\n outage: { title: \"Service outage\", icon: \"alert\" },\n maintenance: { title: \"Scheduled maintenance\", icon: \"wrench\" },\n};\n\n/** \"Oct 18, 08:12\" in the visitor's locale and time zone. */\nfunction shortDateTime(iso: string): string {\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return \"\";\n try {\n return d.toLocaleString(undefined, { month: \"short\", day: \"numeric\", hour: \"2-digit\", minute: \"2-digit\" });\n } catch {\n return d.toISOString().slice(0, 16).replace(\"T\", \" \");\n }\n}\n\nfunction shortDate(iso: string): string {\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return \"\";\n try {\n return d.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" });\n } catch {\n return d.toISOString().slice(0, 10);\n }\n}\n\n/** Initials for an avatar fallback (\"Jordan\" → \"J\"). */\nconst initialOf = (name: string) => (name.trim().match(/\\p{L}/u)?.[0] ?? \"?\").toUpperCase();\n\n/** The greeting with a leading \"Hi!\" swapped for the visitor's name (\"Hi! I'm Scout.\" → \"Hi Maya! I'm Scout.\"). */\nexport function personalGreeting(greeting: string, firstName: string | null): string {\n if (!firstName) return greeting;\n const rest = greeting.replace(/^\\s*(hi|hello|hey)( there)?\\s*[!,.]?\\s*/i, \"\");\n return rest ? `Hi ${firstName}! ${rest}` : `Hi ${firstName}!`;\n}\n\nexport function relativeTime(iso: string, now = Date.now()): string {\n const s = Math.max(0, Math.round((now - Date.parse(iso)) / 1000));\n if (!Number.isFinite(s) || s < 60) return \"now\";\n if (s < 3600) return `${Math.floor(s / 60)}m`;\n if (s < 86400) return `${Math.floor(s / 3600)}h`;\n return `${Math.floor(s / 86400)}d`;\n}\n\nfunction ensureStyles(scope: HTMLElement) {\n const root = scope.getRootNode() as ShadowRoot | Document;\n const container = \"host\" in root ? root : scope.ownerDocument.head;\n if (container.querySelector?.(\"style[data-g-messenger]\")) return;\n const style = scope.ownerDocument.createElement(\"style\");\n style.setAttribute(\"data-g-messenger\", \"\");\n style.textContent = MESSENGER_STYLES;\n container.appendChild(style);\n}\n\n/** Intercom-style messenger: launcher + panel with Home, Messages (chat with Scout / the team) and Help tabs. */\nexport function renderMessenger(options: MessengerOptions): MessengerWidget {\n const { scope, config, api } = options;\n const doc = scope.ownerDocument;\n const poll = options.pollMs ?? { thread: 5000, background: 60000 };\n ensureStyles(scope);\n\n let open = false;\n let destroyed = false;\n let view: View = { kind: \"tab\", tab: \"home\" };\n let conversations: MessengerConversation[] = [];\n let messages: MessengerMessage[] = [];\n let current: MessengerConversation | null = null;\n const streaming = new Map<string, string>();\n let sending = false;\n let complaintDraft: ComplaintDraft = emptyComplaintDraft();\n let draft = \"\";\n let articles: SdkArticlesResponse | null = null;\n let articlesLoading = false;\n let threadTimer: ReturnType<typeof setTimeout> | null = null;\n let backgroundTimer: ReturnType<typeof setInterval> | null = null;\n let threadSeq = 0;\n let howTos: SdkHowTosResponse | null = null;\n let howTosSeq = 0;\n /** Loaded how-tos by id; null when it couldn't be loaded (switched off, deleted). */\n const howToCache = new Map<string, SdkHowTo | null>();\n // Page-matched content for the page the visitor is on, refetched when the page changes.\n let page: MessengerPageContent | null = null;\n let pageKey: string | null = null;\n let pageAt = 0;\n let pageSeq = 0;\n let pageLoading = false;\n const PAGE_TTL_MS = 120_000;\n\n const cards = { suggestions: config.home?.suggestions !== false, progress: config.home?.progress !== false, news: config.home?.news !== false };\n const visitor = (): MessengerVisitor => {\n try {\n const v = options.visitor?.();\n if (v) return v;\n } catch {\n /* a broken host callback must not break the messenger */\n }\n return { firstName: null, path: null, pageGuides: [], resumeGuide: null, checklist: null, news: [] };\n };\n const news = () => (cards.news ? visitor().news : []);\n\n const pos = `g-pos-${config.launcher.position}`;\n const rootNode = scope.getRootNode();\n const shadowHost = \"host\" in rootNode ? (rootNode.host as HTMLElement) : null;\n const root = el(doc, \"div\", \"g-messenger-root\");\n const launcher = el(doc, \"button\", `g-m-launcher ${pos}`);\n launcher.type = \"button\";\n launcher.setAttribute(\"aria-label\", `Open ${config.name}`);\n launcher.setAttribute(\"aria-expanded\", \"false\");\n launcher.appendChild(chatIcon(doc));\n const badge = el(doc, \"span\", \"g-m-badge\");\n badge.hidden = true;\n launcher.appendChild(badge);\n if (options.hideLauncher) launcher.hidden = true;\n\n const panel = el(doc, \"div\", `g-panel g-messenger ${pos}`);\n // Visitors can drag the launcher out of the way; the panel opens next to wherever it sits.\n let spot: LauncherSpot | null = options.launcherSpot ?? null;\n const win = doc.defaultView ?? window;\n function placeLauncher() {\n const side = spot?.side ?? (config.launcher.position === \"bottom-left\" ? \"left\" : \"right\");\n for (const node of [launcher, panel]) {\n node.classList.toggle(\"g-pos-bottom-left\", side === \"left\");\n node.classList.toggle(\"g-pos-bottom-right\", side === \"right\");\n }\n const size = launcher.offsetWidth || 56;\n const bottom = spot && !options.hideLauncher ? Math.round(spot.y * maxLauncherBottom(win.innerHeight, size)) : 0;\n launcher.style.bottom = bottom ? `${bottom}px` : \"\";\n // Other launchers (checklists, resource center) in the same corner move aside for the chat bubble.\n if (bottom < size + 16) shadowHost?.setAttribute(\"data-g-messenger\", `bottom-${side}`);\n else shadowHost?.removeAttribute(\"data-g-messenger\");\n // The panel opens above the launcher, or below it when the launcher sits high with more room underneath.\n const launcherTop = win.innerHeight - 16 - size - bottom;\n const below = bottom > 0 && launcherTop < 480 && bottom > launcherTop;\n panel.classList.toggle(\"g-m-below\", below);\n if (!bottom) {\n panel.style.removeProperty(\"--g-m-bottom\");\n panel.style.removeProperty(\"--g-m-top\");\n panel.style.removeProperty(\"--g-m-reserve\");\n } else if (below) {\n // The panel's 16px margin puts its top edge 4px under the launcher.\n const top = launcherTop + size - 12;\n panel.style.setProperty(\"--g-m-top\", `${top}px`);\n panel.style.setProperty(\"--g-m-reserve\", `${top + 40}px`);\n } else {\n panel.style.setProperty(\"--g-m-bottom\", `${bottom + 76}px`);\n panel.style.setProperty(\"--g-m-reserve\", `${bottom + 110}px`);\n }\n }\n const stopDrag = enableLauncherDrag({\n launcher,\n onMove(next) {\n spot = next;\n placeLauncher();\n options.onLauncherMove?.(next);\n },\n });\n const onResize = () => {\n if (spot) placeLauncher();\n };\n win.addEventListener(\"resize\", onResize);\n panel.setAttribute(\"role\", \"dialog\");\n panel.setAttribute(\"aria-label\", config.name);\n panel.hidden = true;\n const head = el(doc, \"div\", \"g-m-head\");\n const main = el(doc, \"div\", \"g-m-main\");\n const tabs = el(doc, \"div\", \"g-m-tabs\");\n tabs.setAttribute(\"role\", \"tablist\");\n panel.append(head, main, tabs);\n root.append(launcher, panel);\n scope.appendChild(root);\n placeLauncher();\n\n /** Live article and collection lists take their (translated) texts from the resource center the SDK localized. */\n function withRcText<T extends { id: string }, R extends { id: string }>(items: T[], rc: readonly R[] | undefined, apply: (item: T, rcItem: R) => T): T[] {\n if (!rc?.length) return items;\n const byId = new Map(rc.map((x) => [x.id, x]));\n return items.map((i) => (byId.has(i.id) ? apply(i, byId.get(i.id)!) : i));\n }\n /** The resource center's sections in its order (on, and targeted at this visitor); What's new lives in the News tab. */\n const helpModules = () =>\n options.resourceCenter?.modules?.length\n ? orderedModules(options.resourceCenter.modules)\n .filter((m) => m.id !== \"announcements\" && m.enabled && (!(\"targeting\" in m) || !m.targeting || !options.evaluate || options.evaluate(m.targeting)))\n .map((m) => m.id as ResourceCenterModuleId)\n : undefined;\n const rcExtras = (ids: string[] = []) => ids.map((id) => options.guides?.find((g) => g.id === id || g.key === id)).filter((g): g is HelpGuideRef => !!g);\n const help = createHelpView({\n doc,\n data: (): HelpData => ({\n collections: withRcText(articles?.collections ?? options.resourceCenter?.collections ?? [], options.resourceCenter?.collections, (c, t) => ({ ...c, name: t.name, description: t.description })),\n articles: withRcText<HelpData[\"articles\"][number], ResourceCenterArticle>(articles?.articles ?? options.resourceCenter?.articles ?? [], options.resourceCenter?.articles, (a, t) => ({ ...a, title: t.title, summary: t.summary })),\n suggested: helpSuggestions(),\n recommended: rcExtras(options.resourceCenter?.recommendedGuideIds),\n checklists: rcExtras(options.resourceCenter?.checklistGuideIds),\n faqs: options.resourceCenter?.faqs,\n links: options.resourceCenter?.links,\n modules: helpModules(),\n }),\n search: (q) => api.searchArticles(q),\n audienceIds: options.audienceIds,\n loadArticle: (id) => api.getArticle(id),\n onStartGuide: (id) => {\n setOpen(false);\n options.onStartGuide?.(id);\n },\n onOpenChecklist: (id) => {\n setOpen(false);\n options.onOpenChecklist?.(id);\n },\n onArticleView: options.onArticleView,\n extra: (q) => howToItems(q),\n guides: () => options.guides ?? [],\n onShowMe: (key) => startWalkthrough(key),\n onArticleChange: () => syncSize(),\n });\n\n // Ideas (feature requests): the tab, Home cards and Scout's offers, when the project turned it on.\n const ideasOn = () => !!config.ideas && !!api.listIdeas;\n const ideasTab: View = { kind: \"tab\", tab: \"ideas\" };\n const ideas = createIdeas({\n doc,\n api,\n config: () => config.ideas,\n identified: () => visitor().identified !== false,\n openIdea: (id) => go({ kind: \"idea\", id, from: view.kind === \"idea\" ? view.from : view }),\n openForm: () => go({ kind: \"idea-new\", from: view }),\n openSent: (idea) => go({ kind: \"idea-sent\", idea }),\n openList: () => go(ideasTab),\n openUpdates: () => go({ kind: \"idea-updates\", from: view }),\n onUnreadChange: () => {\n if (!open || destroyed) return;\n if (view.kind === \"tab\" && view.tab === \"home\") render();\n else renderTabs();\n },\n });\n\n // Articles and how-tos open in a larger panel (like Intercom); the head button shrinks it back for this document.\n let docCollapsed = false;\n let sizeButton: HTMLButtonElement | null = null;\n const readingDoc = () => open && (view.kind === \"howto\" || (view.kind === \"tab\" && view.tab === \"help\" && help.isArticleOpen()));\n function syncSize() {\n const reading = readingDoc();\n if (!reading) docCollapsed = false;\n panel.classList.toggle(\"g-m-expanded\", reading && !docCollapsed);\n head.classList.toggle(\"g-m-sizable\", reading);\n if (!reading) {\n sizeButton?.remove();\n sizeButton = null;\n return;\n }\n if (!sizeButton) {\n sizeButton = el(doc, \"button\", \"g-m-size\");\n sizeButton.type = \"button\";\n sizeButton.addEventListener(\"click\", () => {\n docCollapsed = !docCollapsed;\n syncSize();\n });\n head.appendChild(sizeButton);\n }\n sizeButton.textContent = \"\";\n sizeButton.appendChild(icon(doc, docCollapsed ? \"expand\" : \"collapse\"));\n sizeButton.setAttribute(\"aria-label\", docCollapsed ? \"Expand\" : \"Collapse\");\n sizeButton.title = docCollapsed ? \"Expand\" : \"Collapse\";\n }\n\n const unreadTotal = () => conversations.reduce((n, c) => n + (c.unread > 0 ? 1 : 0), 0);\n const updateBadge = () => {\n const n = unreadTotal();\n badge.hidden = n === 0 || open;\n badge.textContent = n > 9 ? \"9+\" : String(n);\n launcher.setAttribute(\"aria-label\", n ? `Open ${config.name}, ${n} unread` : `Open ${config.name}`);\n };\n\n /** Responses that predate a complaint (or skip it) keep the one already known for the conversation. */\n const withComplaint = (c: MessengerConversation): MessengerConversation => {\n if (c.complaint) return c;\n const known = conversations.find((x) => x.id === c.id)?.complaint ?? (current?.id === c.id ? current.complaint : undefined);\n return known ? { ...c, complaint: known } : c;\n };\n const upsertConversation = (incoming: MessengerConversation) => {\n const c = withComplaint(incoming);\n conversations = [c, ...conversations.filter((x) => x.id !== c.id)].sort((a, b) => b.lastMessageAt.localeCompare(a.lastMessageAt));\n if (current?.id === c.id) current = c;\n updateBadge();\n };\n const upsertMessage = (m: MessengerMessage) => {\n const i = messages.findIndex((x) => x.id === m.id);\n if (i >= 0) messages[i] = m;\n else messages.push(m);\n messages.sort((a, b) => a.createdAt.localeCompare(b.createdAt));\n if (m.status !== \"pending\") streaming.delete(m.id);\n };\n\n const loadArticles = () => {\n if (articles || articlesLoading) return;\n articlesLoading = true;\n api\n .listArticles()\n .then((res) => {\n articles = res;\n if (view.kind === \"tab\" && view.tab === \"help\") help.render();\n })\n .catch(() => {})\n .finally(() => (articlesLoading = false));\n };\n\n // How-tos: refreshed on every open, since the page (and so \"Help for this page\") may have changed.\n const loadHowTos = () => {\n if (!api.listHowTos) return;\n const seq = ++howTosSeq;\n api\n .listHowTos()\n .then((res) => {\n if (seq !== howTosSeq || destroyed) return;\n howTos = res;\n if (open && view.kind === \"tab\" && view.tab === \"home\") render();\n else if (open && view.kind === \"tab\" && view.tab === \"help\") help.render();\n })\n .catch(() => {});\n };\n const pageHowTos = (): SdkHowToSummary[] => (howTos?.forPage ?? []).map((id) => howTos?.howTos.find((h) => h.id === id)).filter((h): h is SdkHowToSummary => !!h);\n const stepsLabel = (h: SdkHowToSummary) => `${h.stepCount} ${h.stepCount === 1 ? \"step\" : \"steps\"}`;\n const openHowTo = (id: string) => go({ kind: \"howto\", id, from: view });\n\n /** Closes the messenger and runs a walkthrough (\"Show me\"), so the highlights aren't hidden behind it. */\n const startWalkthrough = (guideKey: string) => {\n setOpen(false);\n options.onStartGuide?.(guideKey);\n };\n\n /**\n * Help tab search: how-tos matching every word of the query (the page's own are in \"Suggested for\n * this page\"), with \"Show me\" when the tour made from one is live and a note when it has a video.\n */\n function howToItems(q: string): Node[] {\n const list = q ? (howTos?.howTos ?? []).filter((h) => matchesHelpQuery(`${h.title} ${h.description}`, q)).slice(0, 10) : [];\n if (!list.length) return [];\n return [\n el(doc, \"div\", \"g-rc-section\", `How-tos (${list.length})`),\n ...list.map((h) => {\n const key = h.guideKey && startableGuide(options.guides, h.guideKey) ? h.guideKey : null;\n const sub = [h.hasVideo ? \"Video\" : \"\", stepsLabel(h)].filter(Boolean).join(\" · \");\n return resultRow(doc, \"📋\", h.title, h.description ? `${sub} · ${h.description}` : sub, () => openHowTo(h.id), key ? () => startWalkthrough(key) : undefined);\n }),\n ];\n }\n\n const refreshConversations = () =>\n api\n .listConversations()\n .then((list) => {\n conversations = [...list].sort((a, b) => b.lastMessageAt.localeCompare(a.lastMessageAt));\n updateBadge();\n // Help and Ideas keep their search box (and what's typed in it).\n if (open && view.kind === \"tab\" && view.tab !== \"help\" && view.tab !== \"ideas\") render();\n })\n .catch(() => {});\n\n // ---------------------------------------------------------------------------\n // Rendering\n // ---------------------------------------------------------------------------\n\n function renderHead(title: string, back?: () => void) {\n head.textContent = \"\";\n sizeButton = null;\n head.hidden = false;\n if (back) {\n const b = el(doc, \"button\", \"g-m-back\");\n b.type = \"button\";\n b.setAttribute(\"aria-label\", \"Back\");\n b.appendChild(icon(doc, \"back\"));\n b.addEventListener(\"click\", back);\n head.appendChild(b);\n }\n head.appendChild(el(doc, \"h2\", \"\", title));\n head.appendChild(closeButton(\"g-close\"));\n }\n\n function closeButton(cls: string): HTMLButtonElement {\n const close = el(doc, \"button\", cls);\n close.type = \"button\";\n close.setAttribute(\"aria-label\", \"Close\");\n close.appendChild(icon(doc, \"close\"));\n close.addEventListener(\"click\", () => setOpen(false));\n return close;\n }\n\n function renderTabs() {\n tabs.textContent = \"\";\n tabs.hidden = view.kind !== \"tab\";\n const items: Array<[MessengerTab, keyof typeof ICONS, string]> = [\n [\"home\", \"home\", \"Home\"],\n [\"messages\", \"messages\", \"Messages\"],\n [\"help\", \"help\", \"Help\"],\n ];\n if (ideasOn()) items.push([\"ideas\", \"idea\", config.ideas!.title || \"Ideas\"]);\n const latest = news();\n if (latest.length) items.push([\"news\", \"news\", \"News\"]);\n for (const [tab, ico, label] of items) {\n const b = el(doc, \"button\", \"g-m-tab\");\n b.type = \"button\";\n b.setAttribute(\"role\", \"tab\");\n b.setAttribute(\"aria-selected\", String(view.kind === \"tab\" && view.tab === tab));\n const i = el(doc, \"span\", \"g-m-tab-icon\");\n i.appendChild(icon(doc, ico));\n b.append(i, el(doc, \"span\", \"\", label));\n if ((tab === \"news\" && latest.some((n) => n.unread)) || (tab === \"ideas\" && ideas.unread() > 0)) {\n const dot = el(doc, \"span\", \"g-m-tab-dot\");\n dot.setAttribute(\"aria-label\", \"New\");\n i.appendChild(dot);\n }\n b.addEventListener(\"click\", () => go({ kind: \"tab\", tab }));\n tabs.appendChild(b);\n }\n }\n\n function conversationCard(c: MessengerConversation, label?: string): HTMLButtonElement {\n const card = el(doc, \"button\", \"g-m-card\");\n card.type = \"button\";\n const row = el(doc, \"div\", \"g-m-row\");\n if (c.unread > 0) row.appendChild(el(doc, \"span\", \"g-m-dot\"));\n const text = el(doc, \"div\", \"g-m-grow\");\n if (label) text.appendChild(el(doc, \"div\", \"g-m-card-label\", label));\n text.append(el(doc, \"div\", \"g-m-card-title g-m-ellipsis\", c.subject || \"Conversation\"), el(doc, \"div\", \"g-m-card-sub g-m-ellipsis\", c.lastMessagePreview));\n const side = el(doc, \"span\", \"g-m-side\");\n side.appendChild(el(doc, \"span\", \"g-m-time\", relativeTime(c.lastMessageAt)));\n if (c.complaint) side.appendChild(statusPill(doc, c.complaint.status));\n row.append(text, side);\n card.appendChild(row);\n card.setAttribute(\"aria-label\", `${label ? `${label}: ` : \"\"}${c.subject || \"Conversation\"}${c.unread ? \", unread\" : \"\"}`);\n card.addEventListener(\"click\", () => go({ kind: \"thread\", conversationId: c.id }));\n return card;\n }\n\n /** A full-width card: optional leading icon, title, subtitle and a trailing arrow. */\n function actionCard(opts: { title: string; sub?: string; lead?: SVGSVGElement | HTMLElement; trail?: boolean; onClick: () => void; cls?: string }): HTMLButtonElement {\n const card = el(doc, \"button\", `g-m-card g-m-row g-m-center${opts.cls ? ` ${opts.cls}` : \"\"}`);\n card.type = \"button\";\n if (opts.lead) card.appendChild(opts.lead);\n const text = el(doc, \"span\", \"g-m-grow\");\n text.appendChild(el(doc, \"span\", \"g-m-card-title\", opts.title));\n if (opts.sub) text.appendChild(el(doc, \"span\", \"g-m-card-sub\", opts.sub));\n card.appendChild(text);\n if (opts.trail) card.appendChild(icon(doc, \"arrow\", \"g-m-ico g-m-trail\"));\n card.addEventListener(\"click\", opts.onClick);\n return card;\n }\n\n function progressBar(done: number, total: number): HTMLElement {\n const bar = el(doc, \"span\", \"g-m-bar\");\n bar.setAttribute(\"role\", \"progressbar\");\n bar.setAttribute(\"aria-valuemin\", \"0\");\n bar.setAttribute(\"aria-valuemax\", String(total));\n bar.setAttribute(\"aria-valuenow\", String(done));\n const fill = el(doc, \"span\", \"g-m-bar-fill\");\n fill.style.width = `${total ? Math.round((Math.min(done, total) / total) * 100) : 0}%`;\n bar.appendChild(fill);\n return bar;\n }\n\n function teamAvatars(): HTMLElement | null {\n const team = (config.team ?? []).slice(0, 3);\n if (!team.length) return null;\n const wrap = el(doc, \"div\", \"g-m-team\");\n wrap.setAttribute(\"role\", \"img\");\n wrap.setAttribute(\"aria-label\", `The team: ${team.map((t) => t.name).join(\", \")}`);\n team.forEach((t, i) => {\n const a = el(doc, \"span\", `g-m-avatar g-m-avatar-${i % 3}`);\n if (t.avatarUrl) {\n const img = el(doc, \"img\");\n img.src = t.avatarUrl;\n img.alt = \"\";\n img.referrerPolicy = \"no-referrer\";\n img.addEventListener(\"error\", () => {\n img.remove();\n a.textContent = initialOf(t.name);\n });\n a.appendChild(img);\n } else a.textContent = initialOf(t.name);\n wrap.appendChild(a);\n });\n return wrap;\n }\n\n function brandMark(): HTMLElement {\n const name = options.brand?.name || config.name;\n const mark = el(doc, \"span\", \"g-m-logo\");\n const url = options.brand?.logoUrl;\n if (url && /^(https?:)?\\/\\//.test(url)) {\n const img = el(doc, \"img\");\n img.src = url;\n img.alt = name;\n img.addEventListener(\"error\", () => {\n img.remove();\n mark.textContent = initialOf(name);\n });\n mark.appendChild(img);\n } else {\n mark.textContent = initialOf(name);\n mark.setAttribute(\"aria-label\", name);\n mark.setAttribute(\"role\", \"img\");\n }\n return mark;\n }\n\n function messageSub(): string {\n const reply = config.replyTime ? REPLY_TIME_TEXT[config.replyTime] : null;\n if (config.aiAvailable) return reply ? `${config.name} answers right away. The team ${reply}.` : `${config.name} answers right away, and the team can help too.`;\n return reply ? `The team ${reply}.` : \"The team will reply here.\";\n }\n\n function statusCard(status: MessengerStatus): HTMLElement {\n const meta = STATUS_TEXT[status.level] ?? STATUS_TEXT.operational;\n const card = el(doc, \"div\", `g-m-card g-m-static g-m-row g-m-center g-m-status g-m-status-${status.level}`);\n card.setAttribute(\"role\", \"status\");\n card.appendChild(icon(doc, meta.icon, \"g-m-ico g-m-status-ico\"));\n const text = el(doc, \"span\", \"g-m-grow\");\n text.appendChild(el(doc, \"span\", \"g-m-card-title\", status.message || meta.title));\n const when = shortDateTime(status.updatedAt);\n if (when) text.appendChild(el(doc, \"span\", \"g-m-card-sub\", `Updated ${when}`));\n card.appendChild(text);\n return card;\n }\n\n function progressCards(v: MessengerVisitor): HTMLElement[] {\n const out: HTMLElement[] = [];\n if (v.resumeGuide) {\n const g = v.resumeGuide;\n const card = el(doc, \"button\", \"g-m-card\");\n card.type = \"button\";\n const row = el(doc, \"span\", \"g-m-row g-m-center\");\n row.appendChild(iconTile(\"play\", true));\n const text = el(doc, \"span\", \"g-m-grow\");\n text.append(el(doc, \"span\", \"g-m-card-label\", \"Pick up where you left off\"), el(doc, \"span\", \"g-m-card-title g-m-ellipsis\", g.name), el(doc, \"span\", \"g-m-card-sub\", `Step ${g.stepIndex + 1} of ${g.stepCount}`));\n row.append(text, el(doc, \"span\", \"g-m-link\", \"Resume\"));\n card.append(row, progressBar(g.stepIndex, g.stepCount));\n card.addEventListener(\"click\", () => {\n setOpen(false);\n options.onResumeGuide?.(g.id, g.stepId);\n });\n out.push(card);\n }\n if (v.checklist && v.checklist.total > 0) {\n const c = v.checklist;\n const card = el(doc, \"button\", \"g-m-card\");\n card.type = \"button\";\n const top = el(doc, \"span\", \"g-m-row g-m-baseline\");\n top.append(el(doc, \"span\", \"g-m-card-title g-m-grow g-m-ellipsis\", c.name), el(doc, \"span\", \"g-m-time\", `${c.done} of ${c.total} done`));\n card.append(top, progressBar(c.done, c.total));\n if (c.nextTask) card.appendChild(el(doc, \"span\", \"g-m-card-sub\", `Next: ${c.nextTask}`));\n card.addEventListener(\"click\", () => {\n setOpen(false);\n options.onOpenChecklist?.(c.id);\n });\n out.push(card);\n }\n return out;\n }\n\n function iconTile(name: keyof typeof ICONS, accent = false): HTMLElement {\n const b = el(doc, \"span\", `g-m-badge-ico${accent ? \" g-m-accent\" : \"\"}`);\n b.appendChild(icon(doc, name));\n return b;\n }\n\n interface Suggestion {\n icon: keyof typeof ICONS;\n title: string;\n sub: string;\n accent?: boolean;\n run: () => void;\n }\n\n /**\n * Page-aware suggestions: guides targeted here, how-tos made available in the app that were recorded\n * on this page (they open right here), then how-tos and articles matched by the server.\n */\n function pageSuggestions(v: MessengerVisitor, max = 4): Suggestion[] {\n if (!cards.suggestions) return [];\n const out: Suggestion[] = [];\n for (const g of v.pageGuides.slice(0, 2)) {\n out.push({ icon: \"play\", title: g.name, sub: g.kind === \"checklist\" ? \"Checklist\" : \"Interactive guide\", accent: true, run: () => (g.kind === \"checklist\" ? openChecklist(g.id) : startGuide(g.key || g.id)) });\n }\n const inApp = new Set<string>();\n for (const h of pageHowTos()) {\n if (out.length >= max) break;\n inApp.add(h.title.toLowerCase());\n out.push({ icon: \"steps\", title: h.title, sub: `How-to · ${stepsLabel(h)}`, run: () => openHowTo(h.id) });\n }\n for (const s of page?.suggestions ?? []) {\n if (out.length >= max) break;\n // The same how-to's help article, when it's already listed to open in place.\n if (s.type === \"howto\" && inApp.has(s.title.toLowerCase())) continue;\n if (s.type === \"howto\") out.push({ icon: \"steps\", title: s.title, sub: `How-to · ${s.steps} ${s.steps === 1 ? \"step\" : \"steps\"}`, run: () => openArticle(s.articleId) });\n else out.push({ icon: \"article\", title: s.title, sub: s.summary || \"Article\", run: () => openArticle(s.articleId) });\n }\n return out.slice(0, max);\n }\n\n function startGuide(keyOrId: string) {\n setOpen(false);\n options.onStartGuide?.(keyOrId);\n }\n\n function openChecklist(id: string) {\n setOpen(false);\n options.onOpenChecklist?.(id);\n }\n\n /** Asks Scout one of the page's common questions in a new conversation. */\n function ask(question: string) {\n go({ kind: \"thread\", conversationId: null });\n if (!textarea) return;\n textarea.value = question;\n submit();\n }\n\n function suggestionButton(s: Suggestion): HTMLButtonElement {\n const b = el(doc, \"button\", \"g-m-item\");\n b.type = \"button\";\n b.appendChild(iconTile(s.icon, s.accent));\n const text = el(doc, \"span\", \"g-m-grow\");\n text.append(el(doc, \"span\", \"g-m-item-title\", s.title), el(doc, \"span\", \"g-m-card-sub g-m-ellipsis\", s.sub));\n b.appendChild(text);\n b.addEventListener(\"click\", s.run);\n return b;\n }\n\n function newsCard(n: MessengerNewsItem): HTMLButtonElement {\n const card = el(doc, \"button\", \"g-m-card g-m-news\");\n card.type = \"button\";\n if (n.imageUrl && /^https?:\\/\\//.test(n.imageUrl)) {\n const img = el(doc, \"img\", \"g-m-news-img\");\n img.src = n.imageUrl;\n img.alt = \"\";\n img.loading = \"lazy\";\n img.addEventListener(\"error\", () => img.remove());\n card.appendChild(img);\n }\n const body = el(doc, \"span\", \"g-m-news-body\");\n const meta = el(doc, \"span\", \"g-m-row g-m-center g-m-news-meta\");\n if (n.unread) meta.appendChild(el(doc, \"span\", \"g-m-tag\", \"New\"));\n meta.appendChild(el(doc, \"span\", \"g-m-time\", shortDate(n.publishedAt)));\n body.append(meta, el(doc, \"span\", \"g-m-card-title\", n.title));\n if (n.body) body.appendChild(el(doc, \"span\", \"g-m-card-sub g-m-clamp\", n.body));\n card.appendChild(body);\n card.addEventListener(\"click\", () => {\n if (n.key) startGuide(n.key);\n else if (n.articleId) openArticle(n.articleId);\n else if (n.url && /^https?:\\/\\//i.test(n.url)) window.open(n.url, \"_blank\", \"noopener,noreferrer\");\n else startGuide(n.id);\n });\n return card;\n }\n\n function renderHome() {\n head.hidden = true;\n const v = visitor();\n loadPage();\n const scroll = el(doc, \"div\", \"g-m-scroll g-m-home\");\n const hero = el(doc, \"div\", \"g-m-hero-bg\");\n hero.setAttribute(\"aria-hidden\", \"true\");\n const inner = el(doc, \"div\", \"g-m-home-inner\");\n const top = el(doc, \"div\", \"g-m-hero-top\");\n const right = el(doc, \"div\", \"g-m-row g-m-center\");\n const team = teamAvatars();\n if (team) right.appendChild(team);\n right.appendChild(closeButton(\"g-m-hero-close\"));\n top.append(brandMark(), right);\n const hello = el(doc, \"h2\", \"g-m-hello\");\n hello.append(el(doc, \"span\", \"g-m-hello-1\", v.firstName ? `Hi ${v.firstName}.` : \"Hi there.\"), el(doc, \"span\", \"g-m-hello-2\", \"How can we help?\"));\n inner.append(top, hello);\n\n inner.appendChild(actionCard({ title: \"Send us a message\", sub: messageSub(), trail: true, onClick: () => go({ kind: \"thread\", conversationId: null }) }));\n if (canComplain()) inner.appendChild(actionCard({ title: \"File a complaint\", sub: \"Tell us what went wrong. You'll get a reference.\", lead: iconTile(\"flag\"), onClick: () => startComplaint(null), cls: \"g-m-complain\" }));\n const filed = latestComplaint();\n if (filed) inner.appendChild(conversationCard(filed, \"Your complaint\"));\n const recent = conversations.find((c) => c.id !== filed?.id);\n if (recent) inner.appendChild(conversationCard(recent, recent.status === \"closed\" && !recent.unread ? \"Recent conversation\" : \"Continue the conversation\"));\n const ideaUpdates = ideasOn() ? ideas.unread() : 0;\n if (ideaUpdates) inner.appendChild(actionCard({ title: \"Updates on your ideas\", sub: ideaUpdates === 1 ? \"1 new update\" : `${ideaUpdates} new updates`, lead: iconTile(\"idea\", true), trail: true, onClick: () => go({ kind: \"idea-updates\", from: view }) }));\n if (config.status) inner.appendChild(statusCard(config.status));\n if (cards.progress) progressCards(v).forEach((c) => inner.appendChild(c));\n\n const suggestions = pageSuggestions(v);\n const questions = cards.suggestions ? (page?.questions ?? []).slice(0, 2) : [];\n const label = v.path ? pageLabel(v.path) : null;\n const fallback = !suggestions.length && !questions.length ? rcExtras(options.resourceCenter?.recommendedGuideIds).slice(0, 3) : [];\n if (suggestions.length || questions.length || fallback.length) {\n const box = el(doc, \"div\", \"g-m-card g-m-static g-m-suggest\");\n box.appendChild(el(doc, \"div\", \"g-m-card-title\", fallback.length ? \"Recommended\" : \"Suggested for you\"));\n if (!fallback.length && label) box.appendChild(el(doc, \"div\", \"g-m-card-sub\", `For the ${label} page`));\n const list = el(doc, \"div\", \"g-m-items\");\n suggestions.forEach((s) => list.appendChild(suggestionButton(s)));\n questions.forEach((q) => list.appendChild(suggestionButton({ icon: \"ask\", title: q, sub: config.aiAvailable ? `Ask ${config.name}` : \"Ask the team\", run: () => ask(q) })));\n fallback.forEach((g) => list.appendChild(suggestionButton({ icon: \"play\", title: g.name, sub: \"Interactive guide\", accent: true, run: () => startGuide(g.key || g.id) })));\n box.appendChild(list);\n inner.appendChild(box);\n }\n\n const latest = news()[0];\n if (latest) inner.appendChild(newsCard(latest));\n if (ideasOn()) {\n const canWrite = !ideas.blocked();\n inner.appendChild(actionCard({ title: canWrite ? \"Share an idea\" : \"Browse ideas\", sub: canWrite ? \"Suggest a feature or vote for what's next.\" : \"See what people are asking for and what's planned.\", lead: iconTile(\"idea\"), onClick: () => go(ideasTab) }));\n }\n inner.appendChild(actionCard({ title: \"Search for help\", sub: \"Articles, guides and how-tos\", lead: icon(doc, \"search\", \"g-m-ico g-m-lead\"), onClick: () => go({ kind: \"tab\", tab: \"help\" }) }));\n scroll.append(hero, inner);\n main.appendChild(scroll);\n }\n\n // ---------------------------------------------------------------------------\n // Complaints\n // ---------------------------------------------------------------------------\n\n const complaintCategories = (): MessengerComplaintCategory[] => config.complaints?.categories ?? [];\n /** Visitors the app hasn't identified file complaints only when the project allows it (with an email). */\n const needsEmail = () => visitor().identified === false;\n const canComplain = () => !!api.fileComplaint && complaintCategories().length > 0 && (!needsEmail() || !!config.complaints?.anonymous);\n\n /** The conversation of the most recent complaint, for the home screen. */\n function latestComplaint(): MessengerConversation | null {\n let best: MessengerConversation | null = null;\n for (const c of conversations) if (c.complaint && (!best || c.complaint.createdAt > best.complaint!.createdAt)) best = c;\n return best;\n }\n\n /** What the person told Scout in this conversation, to start the complaint form with. */\n function userMessagesText(): string {\n return messages\n .filter((m) => m.author === \"user\" && m.body.trim())\n .slice(-3)\n .map((m) => m.body.trim())\n .join(\"\\n\\n\")\n .slice(0, 4000);\n }\n\n function startComplaint(categoryId: string | null) {\n const cats = complaintCategories();\n const picked = categoryId ? cats.find((c) => c.id === categoryId) : cats.length === 1 ? cats[0] : undefined;\n const from: View = view.kind === \"tab\" || view.kind === \"thread\" ? view : { kind: \"tab\", tab: \"home\" };\n complaintDraft = emptyComplaintDraft(complaintDraft.description);\n if (picked) go({ kind: \"complaint-form\", categoryId: picked.id, conversationId: null, from });\n else go({ kind: \"complaint-category\", conversationId: null, from });\n }\n\n function complaintBanner(c: MessengerComplaint): HTMLElement {\n const b = el(doc, \"div\", \"g-m-complaint g-m-row g-m-center\");\n b.setAttribute(\"role\", \"status\");\n b.appendChild(icon(doc, \"flag\", \"g-m-ico g-m-lead\"));\n const text = el(doc, \"span\", \"g-m-grow\");\n text.append(el(doc, \"span\", \"g-m-card-title\", c.reference), el(doc, \"span\", \"g-m-card-sub\", c.categoryName));\n b.append(text, statusPill(doc, c.status));\n return b;\n }\n\n function renderComplaintCategories(v: Extract<View, { kind: \"complaint-category\" }>) {\n renderHead(\"File a complaint\", () => go(v.from));\n const scroll = el(doc, \"div\", \"g-m-scroll\");\n scroll.appendChild(categoryList(doc, complaintCategories(), (c) => go({ kind: \"complaint-form\", categoryId: c.id, conversationId: v.conversationId, from: v.from })));\n main.appendChild(scroll);\n }\n\n function renderComplaintForm(v: Extract<View, { kind: \"complaint-form\" }>) {\n const category = complaintCategories().find((c) => c.id === v.categoryId);\n if (!category) return go({ kind: \"complaint-category\", conversationId: v.conversationId, from: v.from });\n const back = () => (complaintCategories().length > 1 && !v.conversationId ? go({ kind: \"complaint-category\", conversationId: v.conversationId, from: v.from }) : go(v.from));\n renderHead(\"File a complaint\", back);\n const scroll = el(doc, \"div\", \"g-m-scroll\");\n const draft = complaintDraft;\n scroll.appendChild(\n complaintForm(doc, {\n category,\n draft,\n needsEmail: needsEmail(),\n canChangeCategory: complaintCategories().length > 1,\n onChangeCategory: () => go({ kind: \"complaint-category\", conversationId: v.conversationId, from: v.from }),\n onPickFile: (file) => {\n draft.error = null;\n readScreenshot(doc, file)\n .then((a) => (draft.attachment = a))\n .catch((e: unknown) => (draft.error = e instanceof Error ? e.message : \"That image couldn't be attached.\"))\n .finally(() => {\n if (view === v) render();\n });\n },\n onRemoveFile: () => {\n draft.attachment = null;\n render();\n },\n onSubmit: () => submitComplaint(v, category),\n }),\n );\n main.appendChild(scroll);\n }\n\n function submitComplaint(v: Extract<View, { kind: \"complaint-form\" }>, category: MessengerComplaintCategory) {\n const draft = complaintDraft;\n const problem = complaintProblem(category, draft, needsEmail());\n draft.checked = true;\n draft.error = problem;\n if (problem || !api.fileComplaint) return render();\n draft.sending = true;\n render();\n const answers = complaintAnswers(category, draft);\n api\n .fileComplaint({\n categoryId: category.id,\n description: draft.description.trim(),\n answers,\n email: needsEmail() ? draft.email.trim() : null,\n conversationId: v.conversationId,\n attachment: draft.attachment ? { fileName: draft.attachment.fileName, data: draft.attachment.data } : null,\n })\n .then((res) => {\n upsertConversation({ ...res.conversation, unread: 0 });\n complaintDraft = emptyComplaintDraft();\n const labels = category.fields.filter((f) => answers[f.id]).map((f): [string, string] => [f.label, answers[f.id]!]);\n if (view === v) go({ kind: \"complaint-sent\", complaint: res.complaint, conversationId: res.conversation.id, answers: labels });\n })\n .catch((e: unknown) => {\n draft.sending = false;\n draft.error = (e instanceof Error && e.message ? e.message : \"Your complaint couldn't be sent.\").replace(/^[\\w.]+: /, \"\");\n if (view === v) render();\n });\n }\n\n function renderComplaintSent(v: Extract<View, { kind: \"complaint-sent\" }>) {\n renderHead(v.complaint.reference, () => go({ kind: \"tab\", tab: \"home\" }));\n const scroll = el(doc, \"div\", \"g-m-scroll\");\n scroll.appendChild(complaintSent(doc, { complaint: v.complaint, answers: v.answers, onOpenConversation: () => go({ kind: \"thread\", conversationId: v.conversationId }), onHome: () => go({ kind: \"tab\", tab: \"home\" }) }));\n main.appendChild(scroll);\n }\n\n function renderIdeasView(v: View) {\n const title = config.ideas?.title || \"Ideas\";\n if (v.kind === \"idea\") {\n renderHead(title, () => go(v.from));\n main.appendChild(ideas.detailScreen(v.id));\n } else if (v.kind === \"idea-new\") {\n renderHead(\"Suggest an idea\", () => go(v.from));\n main.appendChild(ideas.formScreen());\n } else if (v.kind === \"idea-sent\") {\n renderHead(title, () => go(ideasTab));\n main.appendChild(ideas.sentScreen(v.idea));\n } else if (v.kind === \"idea-updates\") {\n renderHead(\"Updates on your ideas\", () => go(v.from));\n main.appendChild(ideas.updatesScreen());\n } else {\n renderHead(title);\n main.appendChild(ideas.listScreen());\n }\n }\n\n function renderHowToView(id: string, from: View) {\n const cached = howToCache.get(id);\n renderHead(cached?.title ?? \"How-to\", () => go(from));\n const scroll = el(doc, \"div\", \"g-m-scroll\");\n if (cached) {\n scroll.appendChild(\n renderHowTo(doc, cached, (key) => {\n setOpen(false);\n options.onStartGuide?.(key);\n }),\n );\n } else scroll.appendChild(el(doc, \"div\", \"g-m-empty\", cached === null ? \"This how-to isn't available any more.\" : \"Loading…\"));\n main.appendChild(scroll);\n if (cached !== undefined || !api.getHowTo) return;\n const seq = threadSeq;\n api\n .getHowTo(id)\n .catch(() => null)\n .then((h) => {\n howToCache.set(id, h);\n if (seq === threadSeq && view.kind === \"howto\" && view.id === id) render();\n });\n }\n\n function renderMessagesTab() {\n renderHead(\"Messages\");\n const scroll = el(doc, \"div\", \"g-m-scroll\");\n if (!conversations.length) scroll.appendChild(el(doc, \"div\", \"g-m-empty\", \"No conversations yet.\"));\n conversations.forEach((c) => scroll.appendChild(conversationCard(c)));\n const start = el(doc, \"button\", \"g-btn g-btn-primary g-m-wide\", \"Send us a message\");\n start.type = \"button\";\n start.addEventListener(\"click\", () => go({ kind: \"thread\", conversationId: null }));\n scroll.appendChild(start);\n main.appendChild(scroll);\n }\n\n /** The Help tab's \"Suggested for this page\" section. */\n function helpSuggestions(): HelpData[\"suggested\"] {\n const v = visitor();\n const items = pageSuggestions(v, 5).map<HelpSuggestion>((s) => ({ kind: s.icon === \"play\" ? \"guide\" : s.icon === \"steps\" ? \"howto\" : \"article\", title: s.title, summary: s.sub, run: s.run }));\n if (!items.length) return undefined;\n const label = v.path ? pageLabel(v.path) : null;\n return { title: label ? `For the ${label} page` : \"Suggested for you\", items };\n }\n\n function renderHelpTab() {\n renderHead(\"Help\");\n loadArticles();\n loadPage();\n help.render();\n main.appendChild(help.el);\n }\n\n function renderNewsTab() {\n renderHead(\"News\");\n const scroll = el(doc, \"div\", \"g-m-scroll\");\n const items = news();\n if (!items.length) scroll.appendChild(el(doc, \"div\", \"g-m-empty\", \"No news yet.\"));\n items.forEach((n) => scroll.appendChild(newsCard(n)));\n main.appendChild(scroll);\n const unread = items.filter((n) => n.unread).map((n) => n.id);\n if (unread.length) options.onNewsSeen?.(unread);\n }\n\n /** Fetches page-matched content when the page changed (or it went stale), then re-renders. */\n function loadPage(force = false) {\n const path = visitor().path;\n if (!path || !api.pageContent || !cards.suggestions) {\n page = null;\n pageKey = null;\n return;\n }\n const key = foldPathIds(path).toLowerCase();\n if (!force && key === pageKey && (pageLoading || Date.now() - pageAt < PAGE_TTL_MS)) return;\n if (key !== pageKey) page = null;\n pageKey = key;\n pageLoading = true;\n const seq = ++pageSeq;\n api\n .pageContent(path)\n .then((res) => {\n if (seq !== pageSeq) return;\n page = res;\n pageAt = Date.now();\n if (!open) return;\n if (view.kind === \"tab\" && view.tab === \"home\") render();\n else if (view.kind === \"tab\" && view.tab === \"help\") help.render();\n else if (view.kind === \"thread\" && !messages.length) renderLog();\n })\n .catch(() => {\n if (seq === pageSeq) pageAt = Date.now();\n })\n .finally(() => {\n if (seq === pageSeq) pageLoading = false;\n });\n }\n\n let log: HTMLElement | null = null;\n let foot: HTMLElement | null = null;\n let textarea: HTMLTextAreaElement | null = null;\n let sendButton: HTMLButtonElement | null = null;\n\n function messageNode(m: MessengerMessage): HTMLElement {\n const wrap = el(doc, \"div\", `g-m-msg g-from-${m.author}${m.status === \"failed\" ? \" g-m-failed\" : \"\"}`);\n if (m.author === \"system\") {\n wrap.textContent = m.body;\n return wrap;\n }\n if (m.author !== \"user\") {\n const author = el(doc, \"div\", \"g-m-author\", m.author === \"scout\" ? config.name : m.authorName || \"Support team\");\n if (m.author === \"scout\") author.appendChild(el(doc, \"span\", \"g-m-ai\", \"AI\"));\n wrap.appendChild(author);\n }\n const bubble = el(doc, \"div\", \"g-m-bubble\");\n const live = streaming.get(m.id);\n if (m.status === \"pending\" && !live) {\n const dots = el(doc, \"span\", \"g-m-typing\");\n dots.setAttribute(\"aria-label\", `${config.name} is typing`);\n dots.append(el(doc, \"span\"), el(doc, \"span\"), el(doc, \"span\"));\n bubble.appendChild(dots);\n } else if (m.status === \"failed\") {\n bubble.textContent = \"This reply couldn't be completed.\";\n } else {\n bubble.appendChild(renderSafeText(doc, live ?? m.body));\n }\n if (m.status === \"pending\") bubble.setAttribute(\"aria-busy\", \"true\");\n bubble.dataset.messageId = m.id;\n wrap.appendChild(bubble);\n const offer = m.complaintOffer && canComplain() ? complaintCategories().find((c) => c.id === m.complaintOffer!.categoryId) : undefined;\n const ideaChip = m.ideaOffer && ideasOn() ? ideas.offerChip(m.ideaOffer, current?.id ?? null, () => icon(doc, \"idea\", \"g-m-ico g-m-chip-ico\")) : null;\n if (m.citations.length || m.suggestedGuides.length || m.howTos?.length || offer || ideaChip) {\n const chips = el(doc, \"div\", \"g-m-chips\");\n if (offer) {\n const b = el(doc, \"button\", \"g-m-chip g-m-guide g-m-offer\");\n b.type = \"button\";\n b.append(icon(doc, \"flag\", \"g-m-ico g-m-chip-ico\"), el(doc, \"span\", \"\", `File a complaint · ${offer.name}`));\n b.addEventListener(\"click\", () => {\n const conversationId = current?.id ?? null;\n complaintDraft = emptyComplaintDraft(userMessagesText());\n go({ kind: \"complaint-form\", categoryId: offer.id, conversationId, from: view });\n });\n chips.appendChild(b);\n }\n if (ideaChip) chips.appendChild(ideaChip);\n for (const g of m.suggestedGuides) {\n const b = el(doc, \"button\", \"g-m-chip g-m-guide\", `▶ Show me: ${g.name}`);\n b.type = \"button\";\n b.addEventListener(\"click\", () => {\n setOpen(false);\n options.onStartGuide?.(g.key);\n });\n chips.appendChild(b);\n }\n for (const c of m.citations) {\n const b = el(doc, \"button\", \"g-m-chip\", `📄 ${c.title}`);\n b.type = \"button\";\n b.addEventListener(\"click\", () => openArticle(c.articleId));\n chips.appendChild(b);\n }\n for (const h of m.howTos ?? []) {\n const b = el(doc, \"button\", \"g-m-chip\", `📋 ${h.title}`);\n b.type = \"button\";\n b.addEventListener(\"click\", () => openHowTo(h.howToId));\n chips.appendChild(b);\n }\n wrap.appendChild(chips);\n }\n return wrap;\n }\n\n function renderLog() {\n if (!log) return;\n const atBottom = log.scrollHeight - log.scrollTop - log.clientHeight < 40;\n log.textContent = \"\";\n if (current?.complaint) log.appendChild(complaintBanner(current.complaint));\n if (!messages.length) {\n const v = visitor();\n const label = v.path ? pageLabel(v.path) : null;\n if (label && config.aiAvailable && !current) log.appendChild(el(doc, \"div\", \"g-m-context\", `Asking from the ${label} page`));\n const intro: MessengerMessage = { id: \"intro\", author: config.aiAvailable ? \"scout\" : \"agent\", authorName: \"Support team\", body: personalGreeting(config.greeting, v.firstName), citations: [], suggestedGuides: [], status: \"complete\", createdAt: new Date().toISOString() };\n log.appendChild(messageNode(intro));\n const questions = !current && cards.suggestions ? (page?.questions ?? []) : [];\n if (questions.length && !sending) {\n const chips = el(doc, \"div\", \"g-m-chips g-m-asks\");\n chips.setAttribute(\"aria-label\", \"Common questions on this page\");\n for (const q of questions) {\n const b = el(doc, \"button\", \"g-m-chip g-m-ask\", q);\n b.type = \"button\";\n b.addEventListener(\"click\", () => {\n if (!textarea || sending) return;\n textarea.value = q;\n submit();\n });\n chips.appendChild(b);\n }\n log.appendChild(chips);\n }\n }\n messages.forEach((m) => log!.appendChild(messageNode(m)));\n if (atBottom || sending) log.scrollTop = log.scrollHeight;\n renderFoot();\n }\n\n function renderFoot() {\n if (!foot || !textarea || !sendButton) return;\n sendButton.disabled = sending || !textarea.value.trim();\n textarea.disabled = sending;\n for (const extra of Array.from(foot.querySelectorAll(\".g-m-human,.g-m-rate,.g-m-note\"))) extra.remove();\n if (current?.status === \"closed\" && current.rating == null) {\n const rate = el(doc, \"div\", \"g-m-rate\", \"How was this conversation? \");\n for (const [score, face, label] of [\n [1, \"😞\", \"Bad\"],\n [3, \"😐\", \"OK\"],\n [5, \"😀\", \"Great\"],\n ] as const) {\n const b = el(doc, \"button\", \"\", face);\n b.type = \"button\";\n b.setAttribute(\"aria-label\", label);\n b.addEventListener(\"click\", () => {\n if (!current) return;\n const id = current.id;\n current = { ...current, rating: score };\n upsertConversation(current);\n renderFoot();\n api.rate(id, score).catch(() => {});\n });\n rate.appendChild(b);\n }\n foot.prepend(rate);\n } else if (current && current.rating != null && current.status === \"closed\") {\n foot.prepend(el(doc, \"div\", \"g-m-note\", \"Thanks for the feedback!\"));\n }\n if (config.handoffEnabled && config.aiAvailable && current?.status === \"bot\" && !sending) {\n const human = el(doc, \"button\", \"g-m-human\", \"Talk to a person\");\n human.type = \"button\";\n human.addEventListener(\"click\", () => {\n if (!current) return;\n const id = current.id;\n human.disabled = true;\n api\n .handoff(id)\n .then((res) => {\n if (current?.id !== id) return;\n upsertConversation(res.conversation);\n res.messages.forEach(upsertMessage);\n renderLog();\n })\n .catch(() => (human.disabled = false));\n });\n foot.appendChild(human);\n }\n }\n\n function renderThread(conversationId: string | null) {\n renderHead(current?.subject || (conversationId ? \"Conversation\" : \"New conversation\"), () => go({ kind: \"tab\", tab: \"messages\" }));\n log = el(doc, \"div\", \"g-m-log\");\n log.setAttribute(\"role\", \"log\");\n log.setAttribute(\"aria-live\", \"polite\");\n foot = el(doc, \"div\", \"g-m-foot\");\n const compose = el(doc, \"form\", \"g-m-compose\");\n textarea = el(doc, \"textarea\");\n textarea.rows = 1;\n textarea.maxLength = 4000;\n textarea.placeholder = current?.status === \"open\" ? \"Reply to the team…\" : \"Ask a question…\";\n textarea.setAttribute(\"aria-label\", \"Message\");\n textarea.value = draft;\n sendButton = el(doc, \"button\", \"g-m-send\");\n sendButton.appendChild(icon(doc, \"arrow\"));\n sendButton.type = \"submit\";\n sendButton.setAttribute(\"aria-label\", \"Send\");\n compose.append(textarea, sendButton);\n foot.appendChild(compose);\n textarea.addEventListener(\"input\", () => {\n draft = textarea!.value;\n if (sendButton) sendButton.disabled = sending || !draft.trim();\n });\n textarea.addEventListener(\"keydown\", (e) => {\n if (e.key === \"Enter\" && !e.shiftKey && !e.isComposing) {\n e.preventDefault();\n submit();\n }\n });\n compose.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n submit();\n });\n main.append(log, foot);\n renderLog();\n textarea.focus?.({ preventScroll: true });\n }\n\n function render() {\n if (destroyed) return;\n main.textContent = \"\";\n log = foot = null;\n textarea = null;\n sendButton = null;\n if (view.kind === \"thread\") renderThread(view.conversationId);\n else if (view.kind === \"howto\") renderHowToView(view.id, view.from);\n else if (view.kind === \"complaint-category\") renderComplaintCategories(view);\n else if (view.kind === \"complaint-form\") renderComplaintForm(view);\n else if (view.kind === \"complaint-sent\") renderComplaintSent(view);\n else if (view.kind !== \"tab\" || view.tab === \"ideas\") {\n if (ideasOn()) renderIdeasView(view);\n else {\n view = { kind: \"tab\", tab: \"home\" };\n renderHome();\n }\n } else if (view.tab === \"home\") renderHome();\n else if (view.tab === \"messages\") renderMessagesTab();\n else if (view.tab === \"news\" && news().length) renderNewsTab();\n else if (view.tab === \"news\") {\n view = { kind: \"tab\", tab: \"home\" };\n renderHome();\n } else renderHelpTab();\n renderTabs();\n syncSize();\n }\n\n // ---------------------------------------------------------------------------\n // Behaviour\n // ---------------------------------------------------------------------------\n\n const handlers = (seq: number): MessengerStreamHandlers => ({\n onConversation(c) {\n if (seq !== threadSeq) return;\n current = c;\n view = { kind: \"thread\", conversationId: c.id };\n upsertConversation(c);\n },\n onMessage(m) {\n if (seq !== threadSeq) return;\n upsertMessage(m);\n renderLog();\n },\n onDelta(id, text) {\n if (seq !== threadSeq) return;\n streaming.set(id, (streaming.get(id) ?? \"\") + text);\n const bubble = log?.querySelector<HTMLElement>(`[data-message-id=\"${id}\"]`);\n if (!bubble) return renderLog();\n bubble.textContent = \"\";\n bubble.appendChild(renderSafeText(doc, streaming.get(id)!));\n if (log) log.scrollTop = log.scrollHeight;\n },\n onDone(m, c) {\n if (seq !== threadSeq) return;\n if (m) {\n upsertMessage(m);\n options.onMessage?.(m, c);\n }\n current = withComplaint({ ...c, unread: 0 });\n upsertConversation(current);\n },\n onError() {\n /* the server also stores a system message explaining what happened */\n },\n });\n\n function submit() {\n if (!textarea || sending) return;\n const text = textarea.value.trim();\n if (!text) return;\n sending = true;\n draft = \"\";\n textarea.value = \"\";\n renderFoot();\n const seq = threadSeq;\n const h = handlers(seq);\n const done = current ? api.send(current.id, text, h) : api.start(text, h);\n done\n .catch(() => {\n if (seq !== threadSeq) return;\n draft = text;\n if (textarea) textarea.value = text;\n const note: MessengerMessage = { id: `local_${Date.now()}`, author: \"system\", body: \"Your message couldn't be sent. Please try again.\", citations: [], suggestedGuides: [], status: \"complete\", createdAt: new Date().toISOString() };\n upsertMessage(note);\n })\n .finally(() => {\n if (seq !== threadSeq) return;\n sending = false;\n streaming.clear();\n if (view.kind === \"thread\") {\n if (current) renderHead(current.subject || \"Conversation\", () => go({ kind: \"tab\", tab: \"messages\" }));\n renderLog();\n }\n scheduleThreadPoll();\n });\n }\n\n function scheduleThreadPoll() {\n if (threadTimer) clearTimeout(threadTimer);\n threadTimer = null;\n if (!open || view.kind !== \"thread\" || !current || destroyed) return;\n threadTimer = setTimeout(pollThread, poll.thread);\n }\n\n function pollThread() {\n if (!current || sending) return scheduleThreadPoll();\n const seq = threadSeq;\n const pending = messages.find((m) => m.status === \"pending\");\n const last = messages.filter((m) => !m.id.startsWith(\"local_\")).at(-1);\n // Re-fetch from a pending reply (its body changes in place); otherwise only newer messages.\n const since = pending ? new Date(Date.parse(pending.createdAt) - 1).toISOString() : (last?.createdAt ?? null);\n api\n .loadMessages(current.id, since)\n .then((res) => {\n if (seq !== threadSeq) return;\n const before = messages.length;\n const changed = res.messages.some((m) => {\n const prev = messages.find((x) => x.id === m.id);\n return !prev || prev.status !== m.status || prev.body !== m.body;\n });\n res.messages.forEach(upsertMessage);\n current = withComplaint({ ...res.conversation, unread: 0 });\n upsertConversation(current);\n if (changed || messages.length !== before) {\n renderLog();\n res.messages.filter((m) => m.author !== \"user\").forEach((m) => options.onMessage?.(m, res.conversation));\n } else renderFoot();\n })\n .catch(() => {})\n .finally(scheduleThreadPoll);\n }\n\n function go(next: View) {\n threadSeq++;\n if (threadTimer) clearTimeout(threadTimer);\n threadTimer = null;\n // Opening a how-to from Help keeps the search, so Back returns to the same results.\n if (view.kind === \"tab\" && view.tab === \"help\" && !(next.kind === \"tab\" && next.tab === \"help\") && next.kind !== \"howto\") help.reset();\n view = next;\n if (next.kind === \"thread\") {\n messages = [];\n streaming.clear();\n sending = false;\n current = next.conversationId ? (conversations.find((c) => c.id === next.conversationId) ?? null) : null;\n if (!next.conversationId) loadPage();\n render();\n if (next.conversationId) {\n const seq = threadSeq;\n api\n .loadMessages(next.conversationId)\n .then((res) => {\n if (seq !== threadSeq) return;\n res.messages.forEach(upsertMessage);\n current = withComplaint({ ...res.conversation, unread: 0 });\n upsertConversation(current);\n renderHead(current.subject || \"Conversation\", () => go({ kind: \"tab\", tab: \"messages\" }));\n renderLog();\n })\n .catch(() => {})\n .finally(scheduleThreadPoll);\n }\n } else {\n draft = \"\";\n render();\n }\n }\n\n function openArticle(id: string) {\n go({ kind: \"tab\", tab: \"help\" });\n help.openArticle(id);\n }\n\n function startBackgroundPoll() {\n if (backgroundTimer) clearInterval(backgroundTimer);\n backgroundTimer = setInterval(() => {\n if (!open && conversations.length && !destroyed) void refreshConversations();\n }, poll.background);\n }\n\n const setOpen = (v: boolean) => {\n if (open === v || destroyed) return;\n open = v;\n panel.hidden = !v;\n launcher.setAttribute(\"aria-expanded\", String(v));\n launcher.setAttribute(\"aria-label\", v ? `Close ${config.name}` : `Open ${config.name}`);\n updateBadge();\n if (v) {\n render();\n void refreshConversations();\n loadHowTos();\n if (ideasOn()) ideas.loadUpdates();\n if (view.kind === \"thread\") scheduleThreadPoll();\n options.onOpen?.();\n } else {\n if (threadTimer) clearTimeout(threadTimer);\n threadTimer = null;\n syncSize();\n options.onClose?.();\n }\n };\n launcher.addEventListener(\"click\", () => setOpen(!open));\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 void refreshConversations();\n startBackgroundPoll();\n\n return {\n el: root,\n open(tab?: MessengerTab) {\n if (tab) view = { kind: \"tab\", tab };\n if (open && tab) render();\n setOpen(true);\n },\n close: () => setOpen(false),\n toggle: () => setOpen(!open),\n isOpen: () => open,\n showNewMessage(text?: string) {\n setOpen(true);\n go({ kind: \"thread\", conversationId: null });\n if (text && textarea) {\n textarea.value = text.slice(0, 4000);\n draft = textarea.value;\n renderFoot();\n }\n },\n openArticle(id: string) {\n setOpen(true);\n openArticle(id);\n },\n openComplaint(categoryId?: string) {\n if (!canComplain()) return;\n setOpen(true);\n startComplaint(categoryId ?? null);\n },\n openIdeas(requestId?: string) {\n if (!ideasOn()) return;\n setOpen(true);\n go(requestId ? { kind: \"idea\", id: requestId, from: ideasTab } : ideasTab);\n },\n refresh() {\n if (destroyed) return;\n if (ideasOn()) ideas.sync(open);\n if (!open) {\n // Refetched on the next open; the tab bar (News) may change meanwhile.\n pageKey = null;\n return;\n }\n loadPage();\n // The Ideas tab isn't rebuilt (it would drop the search being typed); its tab bar may change.\n if (view.kind === \"tab\" && view.tab !== \"ideas\") render();\n else if (view.kind === \"tab\") renderTabs();\n else if (view.kind === \"thread\" && !messages.length) renderLog();\n },\n destroy() {\n destroyed = true;\n if (threadTimer) clearTimeout(threadTimer);\n if (backgroundTimer) clearInterval(backgroundTimer);\n panel.removeEventListener(\"keydown\", onKey);\n stopDrag();\n win.removeEventListener(\"resize\", onResize);\n help.destroy();\n ideas.destroy();\n shadowHost?.removeAttribute(\"data-g-messenger\");\n root.remove();\n },\n };\n}\n","import type { NormalizedRect, SdkHowTo, SdkHowToStep } from \"@guidelytech/shared\";\nimport { el } from \"./help-view\";\n\n// A how-to inside the messenger: numbered steps with their screenshots and the element highlighted.\n// Built from DOM nodes and textContent only (step text is plain text), so nothing in it is parsed as HTML.\n\nconst pct = (v: number) => `${(v * 100).toFixed(3)}%`;\nconst place = (node: HTMLElement, r: NormalizedRect) =>\n Object.assign(node.style, {\n left: pct(r.x),\n top: pct(r.y),\n width: pct(r.width),\n height: pct(r.height),\n });\n\n/** Plain text as paragraphs (blank lines) with line breaks kept by CSS. */\nfunction paragraphs(doc: Document, text: string, cls: string): HTMLElement | null {\n const parts = text\n .split(/\\n{2,}/)\n .map((p) => p.trim())\n .filter(Boolean);\n if (!parts.length) return null;\n const wrap = el(doc, \"div\", cls);\n for (const p of parts) wrap.appendChild(el(doc, \"p\", \"\", p));\n return wrap;\n}\n\n/** The screenshot, cropped to `crop` when zoomed, with the highlight drawn over it. Only http(s) images load. */\nfunction screenshot(\n doc: Document,\n image: NonNullable<SdkHowToStep[\"image\"]>,\n alt: string,\n): HTMLElement | null {\n if (!/^https?:\\/\\//i.test(image.url)) return null;\n const frame = el(doc, \"div\", \"g-howto-shot\");\n const img = (cls: string) => {\n const i = el(doc, \"img\", cls);\n i.src = image.url;\n i.alt = alt;\n i.loading = \"lazy\";\n i.decoding = \"async\";\n return i;\n };\n const crop = image.crop;\n if (crop && crop.width > 0 && crop.height > 0) {\n // An invisible full-width copy gives the frame the screenshot's aspect ratio (the crop has the same one).\n const ghost = img(\"g-howto-ghost\");\n ghost.alt = \"\";\n ghost.setAttribute(\"aria-hidden\", \"true\");\n const zoomed = img(\"g-howto-zoomed\");\n Object.assign(zoomed.style, {\n width: pct(1 / crop.width),\n left: pct(-crop.x / crop.width),\n top: pct(-crop.y / crop.height),\n });\n frame.append(ghost, zoomed);\n } else frame.appendChild(img(\"\"));\n if (image.highlight) {\n const mark = el(doc, \"div\", \"g-howto-mark\");\n mark.setAttribute(\"aria-hidden\", \"true\");\n place(mark, image.highlight);\n frame.appendChild(mark);\n }\n return frame;\n}\n\n/** Renders a how-to; `onShowMe` starts its tour when it has one live in this environment. */\nexport function renderHowTo(\n doc: Document,\n howTo: SdkHowTo,\n onShowMe?: (guideKey: string) => void,\n): HTMLElement {\n const wrap = el(doc, \"div\", \"g-howto\");\n wrap.appendChild(el(doc, \"h3\", \"g-title\", howTo.title));\n const description = paragraphs(doc, howTo.description, \"g-howto-desc\");\n if (description) wrap.appendChild(description);\n const guideKey = howTo.guideKey;\n if (guideKey && onShowMe) {\n const show = el(doc, \"button\", \"g-btn g-btn-primary g-howto-show\", \"▶ Show me in the app\");\n show.type = \"button\";\n show.addEventListener(\"click\", () => onShowMe(guideKey));\n wrap.appendChild(show);\n }\n // The video made from the how-to, when there is one (http(s) only; never autoplays).\n if (howTo.video && /^https?:\\/\\//i.test(howTo.video.url)) {\n const video = el(doc, \"video\", \"g-howto-video\");\n video.src = howTo.video.url;\n video.controls = true;\n video.preload = \"metadata\";\n video.playsInline = true;\n video.setAttribute(\"aria-label\", `Video: ${howTo.title}`);\n wrap.appendChild(video);\n }\n const list = el(doc, \"ol\", \"g-howto-steps\");\n let n = 0;\n for (const s of howTo.steps) {\n const li = el(doc, \"li\", `g-howto-step g-howto-${s.kind}`);\n if (s.kind === \"heading\") li.appendChild(el(doc, \"h4\", \"\", s.title));\n else if (s.kind === \"tip\" || s.kind === \"alert\") {\n li.appendChild(el(doc, \"strong\", \"\", s.title || (s.kind === \"tip\" ? \"Tip\" : \"Important\")));\n const body = paragraphs(doc, s.body, \"\");\n if (body) li.appendChild(body);\n } else if (s.kind === \"text\") {\n if (s.title) li.appendChild(el(doc, \"strong\", \"\", s.title));\n const body = paragraphs(doc, s.body, \"g-howto-note\");\n if (body) li.appendChild(body);\n } else {\n const row = el(doc, \"div\", \"g-howto-row\");\n const num = el(doc, \"span\", \"g-howto-num\", String(++n));\n const text = el(doc, \"div\", \"g-howto-text\");\n text.appendChild(el(doc, \"p\", \"g-howto-title\", s.title));\n const body = paragraphs(doc, s.body, \"g-howto-note\");\n if (body) text.appendChild(body);\n row.append(num, text);\n li.appendChild(row);\n const shot = s.image ? screenshot(doc, s.image, s.title) : null;\n if (shot) li.appendChild(shot);\n }\n list.appendChild(li);\n }\n if (!list.childNodes.length)\n wrap.appendChild(el(doc, \"div\", \"g-rc-empty\", \"This how-to has no steps yet.\"));\n else wrap.appendChild(list);\n return wrap;\n}\n","import type { ComplaintStatus, MessengerComplaint, MessengerComplaintCategory } from \"@guidelytech/shared\";\nimport { MAX_COMPLAINT_ANSWER_LENGTH, MAX_COMPLAINT_ATTACHMENT_BYTES, MAX_COMPLAINT_LENGTH } from \"@guidelytech/shared/runtime\";\nimport { el } from \"./help-view\";\n\n/** What the messenger sends to file a complaint (the transport adds the visitor and page). */\nexport interface ComplaintInput {\n categoryId: string;\n description: string;\n answers: Record<string, string>;\n email?: string | null;\n /** File it in this conversation (Scout offered the form there). */\n conversationId?: string | null;\n attachment?: { fileName: string; data: string } | null;\n}\n\n/** The form as the person filled it in so far; kept while they move between screens. */\nexport interface ComplaintDraft {\n description: string;\n answers: Record<string, string>;\n email: string;\n attachment: { fileName: string; data: string; previewUrl: string } | null;\n error: string | null;\n sending: boolean;\n /** Validation failed once: show which fields need attention. */\n checked: boolean;\n}\n\nexport const emptyComplaintDraft = (description = \"\"): ComplaintDraft => ({ description, answers: {}, email: \"\", attachment: null, error: null, sending: false, checked: false });\n\n/** The person's view of where their complaint is. */\nexport const COMPLAINT_STEPS: Array<[ComplaintStatus, string]> = [\n [\"open\", \"Received\"],\n [\"in_review\", \"In review\"],\n [\"resolved\", \"Resolved\"],\n];\nexport const complaintStatusLabel = (s: ComplaintStatus) => COMPLAINT_STEPS.find(([k]) => k === s)?.[1] ?? s;\n\nconst EMAIL = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\n/** The first thing missing or wrong in the form, or null when it can be sent. */\nexport function complaintProblem(category: MessengerComplaintCategory, draft: ComplaintDraft, needsEmail: boolean): string | null {\n for (const f of category.fields) if (f.required && !(draft.answers[f.id] ?? \"\").trim()) return `${f.label} is required.`;\n if (!draft.description.trim()) return \"Tell us what happened.\";\n if (needsEmail && !EMAIL.test(draft.email.trim())) return \"Enter your email address so the team can reply.\";\n return null;\n}\n\n/** The answers worth sending: trimmed, non-empty, only for the category's questions. */\nexport function complaintAnswers(category: MessengerComplaintCategory, draft: ComplaintDraft): Record<string, string> {\n const out: Record<string, string> = {};\n for (const f of category.fields) {\n const v = (draft.answers[f.id] ?? \"\").trim();\n if (v) out[f.id] = v.slice(0, MAX_COMPLAINT_ANSWER_LENGTH);\n }\n return out;\n}\n\nexport function statusPill(doc: Document, status: ComplaintStatus): HTMLElement {\n return el(doc, \"span\", `g-m-pill g-m-pill-${status}`, complaintStatusLabel(status));\n}\n\nfunction dot(doc: Document, color: string): HTMLElement {\n const d = el(doc, \"span\", \"g-m-cat-dot\");\n if (/^#[0-9a-fA-F]{6}$/.test(color)) d.style.background = color;\n d.setAttribute(\"aria-hidden\", \"true\");\n return d;\n}\n\n/** Step 1: the categories, as configured in Complaints → Categories. */\nexport function categoryList(doc: Document, categories: MessengerComplaintCategory[], onPick: (c: MessengerComplaintCategory) => void): HTMLElement {\n const wrap = el(doc, \"div\", \"g-m-form\");\n const intro = el(doc, \"div\");\n intro.append(el(doc, \"h3\", \"g-m-form-title\", \"What's it about?\"), el(doc, \"p\", \"g-m-card-sub\", \"Picking the right one gets it to the right team faster.\"));\n wrap.appendChild(intro);\n const list = el(doc, \"div\", \"g-m-cats\");\n list.setAttribute(\"role\", \"list\");\n for (const c of categories) {\n const b = el(doc, \"button\", \"g-m-card g-m-row g-m-center g-m-cat\");\n b.type = \"button\";\n b.setAttribute(\"role\", \"listitem\");\n b.appendChild(dot(doc, c.color));\n const text = el(doc, \"span\", \"g-m-grow\");\n text.appendChild(el(doc, \"span\", \"g-m-card-title\", c.name));\n if (c.description) text.appendChild(el(doc, \"span\", \"g-m-card-sub\", c.description));\n b.appendChild(text);\n b.addEventListener(\"click\", () => onPick(c));\n list.appendChild(b);\n }\n wrap.appendChild(list);\n return wrap;\n}\n\nlet fieldSeq = 0;\n\nfunction field(doc: Document, label: string, control: HTMLElement, opts: { optional?: boolean; hint?: string; invalid?: boolean } = {}): HTMLElement {\n const id = `g-m-f${++fieldSeq}`;\n control.id = id;\n const wrap = el(doc, \"div\", \"g-m-field\");\n const l = el(doc, \"label\", \"g-m-label\", label);\n l.htmlFor = id;\n if (opts.optional) l.appendChild(el(doc, \"span\", \"g-m-optional\", \" (optional)\"));\n wrap.append(l, control);\n if (opts.hint) {\n const hint = el(doc, \"span\", \"g-m-hint\", opts.hint);\n hint.id = `${id}-hint`;\n control.setAttribute(\"aria-describedby\", hint.id);\n wrap.appendChild(hint);\n }\n if (opts.invalid) control.setAttribute(\"aria-invalid\", \"true\");\n return wrap;\n}\n\nexport interface ComplaintFormOptions {\n category: MessengerComplaintCategory;\n draft: ComplaintDraft;\n /** Visitors the app hasn't identified give an email address. */\n needsEmail: boolean;\n /** More than one category: show \"Change\". */\n canChangeCategory: boolean;\n onChangeCategory: () => void;\n onPickFile: (file: File) => void;\n onRemoveFile: () => void;\n onSubmit: () => void;\n}\n\n/** Step 2: the category's extra questions, what happened, an optional screenshot. */\nexport function complaintForm(doc: Document, o: ComplaintFormOptions): HTMLFormElement {\n const { category, draft } = o;\n const form = el(doc, \"form\", \"g-m-form\");\n form.noValidate = true;\n\n const picked = el(doc, \"div\", \"g-m-picked g-m-row g-m-center\");\n picked.append(dot(doc, category.color), el(doc, \"span\", \"g-m-grow g-m-card-title\", category.name));\n if (o.canChangeCategory) {\n const change = el(doc, \"button\", \"g-m-text-btn\", \"Change\");\n change.type = \"button\";\n change.setAttribute(\"aria-label\", `Change category (${category.name})`);\n change.addEventListener(\"click\", o.onChangeCategory);\n picked.appendChild(change);\n }\n form.appendChild(picked);\n\n for (const f of category.fields) {\n const missing = draft.checked && f.required && !(draft.answers[f.id] ?? \"\").trim();\n let control: HTMLInputElement | HTMLSelectElement;\n if (f.type === \"choice\") {\n const select = el(doc, \"select\", \"g-input\");\n const option = (label: string, value: string) => {\n const o = el(doc, \"option\", \"\", label);\n o.value = value;\n return o;\n };\n select.appendChild(option(f.required ? \"Choose one\" : \"Choose one (optional)\", \"\"));\n for (const opt of f.options ?? []) select.appendChild(option(opt, opt));\n select.value = draft.answers[f.id] ?? \"\";\n select.addEventListener(\"change\", () => (draft.answers[f.id] = select.value));\n control = select;\n } else {\n const input = el(doc, \"input\", \"g-input\");\n input.type = \"text\";\n input.maxLength = MAX_COMPLAINT_ANSWER_LENGTH;\n input.value = draft.answers[f.id] ?? \"\";\n input.addEventListener(\"input\", () => (draft.answers[f.id] = input.value));\n control = input;\n }\n if (f.required) control.required = true;\n form.appendChild(field(doc, f.label, control, { optional: !f.required, invalid: missing }));\n }\n\n const what = el(doc, \"textarea\", \"g-input g-m-textarea\");\n what.rows = 5;\n what.maxLength = MAX_COMPLAINT_LENGTH;\n what.required = true;\n what.value = draft.description;\n what.placeholder = \"What went wrong, and when?\";\n what.addEventListener(\"input\", () => (draft.description = what.value));\n form.appendChild(field(doc, \"What happened?\", what, { invalid: draft.checked && !draft.description.trim() }));\n\n if (o.needsEmail) {\n const email = el(doc, \"input\", \"g-input\");\n email.type = \"email\";\n email.autocomplete = \"email\";\n email.required = true;\n email.value = draft.email;\n email.addEventListener(\"input\", () => (draft.email = email.value));\n form.appendChild(field(doc, \"Your email\", email, { hint: \"So the team can reply to you.\", invalid: draft.checked && !EMAIL.test(draft.email.trim()) }));\n }\n\n const files = el(doc, \"div\", \"g-m-attach\");\n if (draft.attachment) {\n const a = draft.attachment;\n const row = el(doc, \"div\", \"g-m-row g-m-center g-m-attached\");\n if (a.previewUrl) {\n const img = el(doc, \"img\", \"g-m-thumb\");\n img.src = a.previewUrl;\n img.alt = \"\";\n img.addEventListener(\"error\", () => img.remove());\n row.appendChild(img);\n }\n row.appendChild(el(doc, \"span\", \"g-m-grow g-m-ellipsis\", a.fileName));\n const remove = el(doc, \"button\", \"g-m-text-btn\", \"Remove\");\n remove.type = \"button\";\n remove.setAttribute(\"aria-label\", `Remove ${a.fileName}`);\n remove.addEventListener(\"click\", o.onRemoveFile);\n row.appendChild(remove);\n files.appendChild(row);\n } else {\n const input = el(doc, \"input\", \"g-m-file\");\n input.type = \"file\";\n input.accept = \"image/png,image/jpeg,image/webp,image/gif\";\n input.tabIndex = -1;\n input.setAttribute(\"aria-hidden\", \"true\");\n input.addEventListener(\"change\", () => {\n const file = input.files?.[0];\n if (file) o.onPickFile(file);\n });\n const pick = el(doc, \"button\", \"g-m-attach-btn\", \"Attach a screenshot\");\n pick.type = \"button\";\n pick.addEventListener(\"click\", () => input.click());\n files.append(input, pick);\n }\n form.appendChild(files);\n\n const foot = el(doc, \"div\", \"g-m-form-foot\");\n foot.appendChild(el(doc, \"p\", \"g-m-hint\", \"We'll include the page you're on so the team can look into it.\"));\n if (draft.error) {\n const err = el(doc, \"p\", \"g-m-error\", draft.error);\n err.setAttribute(\"role\", \"alert\");\n foot.appendChild(err);\n }\n const submit = el(doc, \"button\", \"g-btn g-btn-primary g-m-wide\", draft.sending ? \"Sending…\" : \"Submit complaint\");\n submit.type = \"submit\";\n submit.disabled = draft.sending;\n foot.appendChild(submit);\n form.appendChild(foot);\n form.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n if (!draft.sending) o.onSubmit();\n });\n return form;\n}\n\n/** Received → In review → Resolved, with the current step marked. */\nexport function statusTracker(doc: Document, status: ComplaintStatus): HTMLElement {\n const list = el(doc, \"ol\", \"g-m-steps\");\n list.setAttribute(\"aria-label\", \"Progress\");\n const at = COMPLAINT_STEPS.findIndex(([k]) => k === status);\n COMPLAINT_STEPS.forEach(([, label], i) => {\n const li = el(doc, \"li\", `g-m-step${i <= at ? \" g-m-step-done\" : \"\"}`);\n if (i === at) li.setAttribute(\"aria-current\", \"step\");\n li.append(el(doc, \"span\", \"g-m-step-dot\"), el(doc, \"span\", \"g-m-step-label\", label));\n list.appendChild(li);\n });\n return list;\n}\n\n/** Step 3: the reference and where it is. */\nexport function complaintSent(doc: Document, o: { complaint: MessengerComplaint; answers: Array<[string, string]>; onOpenConversation: () => void; onHome: () => void }): HTMLElement {\n const wrap = el(doc, \"div\", \"g-m-form g-m-sent\");\n const top = el(doc, \"div\", \"g-m-sent-top\");\n const tick = el(doc, \"span\", \"g-m-sent-tick\");\n tick.setAttribute(\"aria-hidden\", \"true\");\n tick.textContent = \"✓\";\n const p = el(doc, \"p\", \"g-m-card-sub\");\n p.append(\"Your reference is \", el(doc, \"strong\", \"\", o.complaint.reference), \". The team will reply in this conversation, so check back here.\");\n top.append(tick, el(doc, \"h3\", \"g-m-form-title\", \"We've got your complaint\"), p);\n wrap.appendChild(top);\n const details = el(doc, \"dl\", \"g-m-card g-m-static g-m-details\");\n const row = (k: string, v: string) => {\n const r = el(doc, \"div\", \"g-m-detail\");\n r.append(el(doc, \"dt\", \"\", k), el(doc, \"dd\", \"\", v));\n details.appendChild(r);\n };\n row(\"Category\", o.complaint.categoryName);\n o.answers.slice(0, 3).forEach(([k, v]) => row(k, v));\n wrap.appendChild(details);\n wrap.appendChild(statusTracker(doc, o.complaint.status));\n const open = el(doc, \"button\", \"g-btn g-btn-primary g-m-wide\", \"Add more detail\");\n open.type = \"button\";\n open.addEventListener(\"click\", o.onOpenConversation);\n const home = el(doc, \"button\", \"g-btn g-btn-secondary g-m-wide\", \"Back to home\");\n home.type = \"button\";\n home.addEventListener(\"click\", o.onHome);\n wrap.append(open, home);\n return wrap;\n}\n\nconst MAX_SIDE = 1600;\n\n/**\n * Reads a picked image for upload: scaled to at most 1600 px a side and re-encoded as JPEG, so a\n * phone screenshot fits the 2 MB limit. Returns base64 data (no `data:` prefix) and a preview URL.\n */\nexport async function readScreenshot(doc: Document, file: File): Promise<{ fileName: string; data: string; previewUrl: string }> {\n if (!/^image\\/(png|jpeg|webp|gif)$/.test(file.type)) throw new Error(\"Attach a PNG, JPEG, WebP or GIF image.\");\n if (file.size > 25 * 1024 * 1024) throw new Error(\"That image is too large.\");\n const win = doc.defaultView;\n const asDataUrl = (blob: Blob) =>\n new Promise<string>((resolve, reject) => {\n const r = new FileReader();\n r.onload = () => resolve(String(r.result));\n r.onerror = () => reject(new Error(\"The image couldn't be read.\"));\n r.readAsDataURL(blob);\n });\n let dataUrl: string | null = null;\n let scaled = false;\n try {\n const url = win?.URL.createObjectURL(file);\n if (!url) throw new Error(\"no URL\");\n const img = await new Promise<HTMLImageElement>((resolve, reject) => {\n const i = new Image();\n i.onload = () => resolve(i);\n i.onerror = () => reject(new Error(\"decode\"));\n i.src = url;\n }).finally(() => win?.URL.revokeObjectURL(url));\n const scale = Math.min(1, MAX_SIDE / Math.max(img.naturalWidth || 1, img.naturalHeight || 1));\n const canvas = doc.createElement(\"canvas\");\n canvas.width = Math.max(1, Math.round(img.naturalWidth * scale));\n canvas.height = Math.max(1, Math.round(img.naturalHeight * scale));\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) throw new Error(\"no canvas\");\n ctx.fillStyle = \"#fff\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n for (const q of [0.85, 0.7, 0.5]) {\n dataUrl = canvas.toDataURL(\"image/jpeg\", q);\n if ((dataUrl.length - dataUrl.indexOf(\",\") - 1) * 0.75 <= MAX_COMPLAINT_ATTACHMENT_BYTES) break;\n }\n scaled = true;\n } catch {\n // Can't scale here (no canvas, odd format): send the file as it is if it fits.\n dataUrl = file.size <= MAX_COMPLAINT_ATTACHMENT_BYTES ? await asDataUrl(file) : null;\n }\n if (!dataUrl) throw new Error(\"That image is too large. Screenshots can be up to 2 MB.\");\n const data = dataUrl.slice(dataUrl.indexOf(\",\") + 1);\n if (data.length * 0.75 > MAX_COMPLAINT_ATTACHMENT_BYTES) throw new Error(\"That image is too large. Screenshots can be up to 2 MB.\");\n const name = (file.name || \"screenshot\").slice(0, 180);\n return { fileName: scaled ? `${name.replace(/\\.[a-z0-9]+$/i, \"\")}.jpg` : name, data, previewUrl: dataUrl };\n}\n","import type { FeedbackPriority, FeedbackStatus, FeedbackUpdate, FeedbackUpdatesResponse, MessengerIdeaOffer, MessengerIdeasConfig, PublicFeedbackComment, PublicFeedbackList, PublicFeedbackRequest, PublicFeedbackRequestDetail } from \"@guidelytech/shared\";\nimport { FEEDBACK_PRIORITIES, FEEDBACK_PRIORITY_LABEL, FEEDBACK_STATUS_LABEL, MAX_FEEDBACK_COMMENT, MAX_FEEDBACK_DESCRIPTION, MAX_FEEDBACK_NOTE, MAX_FEEDBACK_TITLE, feedbackReference } from \"@guidelytech/shared\";\nimport { el } from \"./help-view\";\nimport { renderSafeText, safeHttpUrl } from \"./render-safe\";\n\n// ---------------------------------------------------------------------------\n// Transport\n// ---------------------------------------------------------------------------\n\nexport type IdeaSort = \"top\" | \"new\" | \"trending\";\nexport type IdeaFilter = \"open\" | \"all\" | \"mine\" | \"following\";\n\n/** What the Ideas tab asks for (the transport adds the visitor). */\nexport interface IdeaListQuery {\n q?: string;\n sort: IdeaSort;\n filter: IdeaFilter;\n status?: FeedbackStatus;\n productArea?: string;\n page: number;\n}\n\n/** A new idea (the transport adds the visitor and the page). */\nexport interface IdeaInput {\n title: string;\n description: string;\n productArea?: string | null;\n priority: FeedbackPriority;\n /** Suggested from this Scout conversation (Scout offered it). */\n conversationId?: string | null;\n}\n\nexport interface IdeaVoteInput {\n priority: FeedbackPriority;\n note?: string;\n conversationId?: string | null;\n}\n\n/** Server access for the Ideas tab. Every method is optional: transports before Ideas lack them. */\nexport interface IdeasApi {\n listIdeas?(query: IdeaListQuery): Promise<PublicFeedbackList>;\n /** Reads one idea with its comments (and counts the view). */\n getIdea?(id: string): Promise<PublicFeedbackRequestDetail>;\n submitIdea?(input: IdeaInput): Promise<PublicFeedbackRequestDetail>;\n voteIdea?(id: string, vote: IdeaVoteInput): Promise<PublicFeedbackRequest>;\n unvoteIdea?(id: string): Promise<PublicFeedbackRequest>;\n followIdea?(id: string, follow: boolean): Promise<PublicFeedbackRequest>;\n commentIdea?(id: string, body: string): Promise<PublicFeedbackRequestDetail>;\n similarIdeas?(title: string): Promise<PublicFeedbackRequest[]>;\n ideaUpdates?(): Promise<FeedbackUpdatesResponse>;\n markIdeaUpdatesRead?(ids?: string[]): Promise<FeedbackUpdatesResponse>;\n /** A short-lived link into the hosted feedback portal. */\n ideaPortalLink?(): Promise<string>;\n}\n\n// ---------------------------------------------------------------------------\n// Pure builders\n// ---------------------------------------------------------------------------\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n/** Lightbulb, drawn like the messenger's other stroke icons. */\nexport const IDEA_ICON = [\"M9 18h6\", \"M10 21h4\", \"M12 3a6 6 0 0 0-3.6 10.8c.7.5 1.1 1.3 1.1 2.1V16h5v-.1c0-.8.4-1.6 1.1-2.1A6 6 0 0 0 12 3z\"];\nconst UP_ICON = [\"m6 15 6-6 6 6\"];\n\nfunction svgIcon(doc: Document, paths: string[], cls = \"g-m-ico\"): SVGSVGElement {\n const svg = doc.createElementNS(SVG_NS, \"svg\");\n svg.setAttribute(\"viewBox\", \"0 0 24 24\");\n svg.setAttribute(\"aria-hidden\", \"true\");\n svg.setAttribute(\"class\", cls);\n for (const d of paths) {\n const p = doc.createElementNS(SVG_NS, \"path\");\n p.setAttribute(\"d\", d);\n svg.appendChild(p);\n }\n return svg;\n}\n\nexport const ideaIcon = (doc: Document, cls?: string) => svgIcon(doc, IDEA_ICON, cls);\n\nconst plural = (n: number, one: string, many = `${one}s`) => `${n} ${n === 1 ? one : many}`;\n\nfunction shortDate(iso: string): string {\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return \"\";\n try {\n return d.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" });\n } catch {\n return d.toISOString().slice(0, 10);\n }\n}\n\n/** The server's message for a failed call (\"title: Give your idea a short title\" → the message). */\nexport const errorText = (e: unknown, fallback: string) => (e instanceof Error && e.message ? e.message : fallback).replace(/^[\\w.]+: /, \"\");\n\nexport function ideaStatusPill(doc: Document, status: FeedbackStatus): HTMLElement {\n return el(doc, \"span\", `g-m-pill g-m-idea-pill g-m-idea-${status}`, FEEDBACK_STATUS_LABEL[status] ?? status);\n}\n\n/** The vote count, as a toggle when the visitor can vote and as a plain count otherwise. */\nexport function voteControl(doc: Document, idea: PublicFeedbackRequest, o: { canVote: boolean; busy?: boolean; onToggle?: () => void }): HTMLElement {\n const count = el(doc, \"span\", \"g-m-vote-count\", String(idea.votes));\n if (!o.canVote) {\n const box = el(doc, \"span\", \"g-m-vote g-m-vote-static\");\n box.setAttribute(\"aria-label\", plural(idea.votes, \"vote\"));\n box.append(svgIcon(doc, UP_ICON, \"g-m-ico g-m-vote-ico\"), count);\n return box;\n }\n const b = el(doc, \"button\", `g-m-vote${idea.myVote ? \" g-m-voted\" : \"\"}`);\n b.type = \"button\";\n b.setAttribute(\"aria-pressed\", String(!!idea.myVote));\n b.setAttribute(\"aria-label\", `${idea.myVote ? \"Remove your vote for\" : \"Vote for\"} ${idea.title} (${plural(idea.votes, \"vote\")})`);\n b.disabled = !!o.busy;\n b.append(svgIcon(doc, UP_ICON, \"g-m-ico g-m-vote-ico\"), count);\n b.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n o.onToggle?.();\n });\n return b;\n}\n\n/** One idea in a list: vote control, then title, status and comment count (opens the idea). */\nexport function ideaRow(doc: Document, idea: PublicFeedbackRequest, o: { canVote: boolean; busy?: boolean; onVote: () => void; onOpen: () => void }): HTMLElement {\n const row = el(doc, \"div\", \"g-m-idea\");\n row.setAttribute(\"role\", \"listitem\");\n row.appendChild(voteControl(doc, idea, { canVote: o.canVote, busy: o.busy, onToggle: o.onVote }));\n const open = el(doc, \"button\", \"g-m-idea-open\");\n open.type = \"button\";\n open.appendChild(el(doc, \"span\", \"g-m-idea-title\", idea.title));\n const meta = el(doc, \"span\", \"g-m-idea-meta\");\n meta.appendChild(ideaStatusPill(doc, idea.status));\n if (idea.comments) meta.appendChild(el(doc, \"span\", \"g-m-time\", plural(idea.comments, \"comment\")));\n if (idea.productArea) meta.appendChild(el(doc, \"span\", \"g-m-time\", idea.productArea));\n if (idea.mine) meta.appendChild(el(doc, \"span\", \"g-m-time\", \"Yours\"));\n open.appendChild(meta);\n open.addEventListener(\"click\", o.onOpen);\n row.appendChild(open);\n return row;\n}\n\nconst FILTERS: Array<[IdeaFilter, string]> = [\n [\"open\", \"Open\"],\n [\"all\", \"All\"],\n [\"mine\", \"Mine\"],\n [\"following\", \"Following\"],\n];\nconst SORTS: Array<[IdeaSort, string]> = [\n [\"top\", \"Top\"],\n [\"new\", \"New\"],\n [\"trending\", \"Trending\"],\n];\n\nexport function filterChips(doc: Document, current: IdeaFilter, onPick: (f: IdeaFilter) => void): HTMLElement {\n const wrap = el(doc, \"div\", \"g-m-filters\");\n wrap.setAttribute(\"role\", \"group\");\n wrap.setAttribute(\"aria-label\", \"Show\");\n for (const [f, label] of FILTERS) {\n const b = el(doc, \"button\", \"g-m-filter\", label);\n b.type = \"button\";\n b.dataset.filter = f;\n b.setAttribute(\"aria-pressed\", String(f === current));\n b.addEventListener(\"click\", () => {\n wrap.querySelectorAll(\"button\").forEach((x) => x.setAttribute(\"aria-pressed\", String(x === b)));\n onPick(f);\n });\n wrap.appendChild(b);\n }\n return wrap;\n}\n\nexport function sortSelect(doc: Document, current: IdeaSort, onChange: (s: IdeaSort) => void): HTMLSelectElement {\n const select = el(doc, \"select\", \"g-input g-m-sort\");\n select.setAttribute(\"aria-label\", \"Sort ideas\");\n for (const [s, label] of SORTS) {\n const opt = el(doc, \"option\", \"\", label);\n opt.value = s;\n select.appendChild(opt);\n }\n select.value = current;\n select.addEventListener(\"change\", () => onChange(select.value as IdeaSort));\n return select;\n}\n\n/** Nice to have / Important / Critical, as a radio group of buttons. */\nexport function priorityChoice(doc: Document, current: FeedbackPriority, onPick: (p: FeedbackPriority) => void, label = \"How important is this to you?\"): HTMLElement {\n const wrap = el(doc, \"div\", \"g-m-field\");\n const id = `g-m-prio${++fieldSeq}`;\n const l = el(doc, \"span\", \"g-m-label\", label);\n l.id = id;\n const group = el(doc, \"div\", \"g-m-seg\");\n group.setAttribute(\"role\", \"radiogroup\");\n group.setAttribute(\"aria-labelledby\", id);\n for (const p of FEEDBACK_PRIORITIES) {\n const b = el(doc, \"button\", \"g-m-seg-btn\", FEEDBACK_PRIORITY_LABEL[p]);\n b.type = \"button\";\n b.dataset.priority = p;\n b.setAttribute(\"role\", \"radio\");\n b.setAttribute(\"aria-checked\", String(p === current));\n b.addEventListener(\"click\", () => {\n group.querySelectorAll(\"button\").forEach((x) => x.setAttribute(\"aria-checked\", String(x === b)));\n onPick(p);\n });\n group.appendChild(b);\n }\n wrap.append(l, group);\n return wrap;\n}\n\nlet fieldSeq = 0;\n\nfunction field(doc: Document, label: string, control: HTMLElement, opts: { optional?: boolean; invalid?: boolean } = {}): HTMLElement {\n const id = `g-m-i${++fieldSeq}`;\n control.id = id;\n const wrap = el(doc, \"div\", \"g-m-field\");\n const l = el(doc, \"label\", \"g-m-label\", label);\n l.htmlFor = id;\n if (opts.optional) l.appendChild(el(doc, \"span\", \"g-m-optional\", \" (optional)\"));\n if (opts.invalid) control.setAttribute(\"aria-invalid\", \"true\");\n wrap.append(l, control);\n return wrap;\n}\n\nfunction errorLine(doc: Document, text: string): HTMLElement {\n const p = el(doc, \"p\", \"g-m-error\", text);\n p.setAttribute(\"role\", \"alert\");\n return p;\n}\n\nfunction button(doc: Document, cls: string, text: string, onClick: () => void): HTMLButtonElement {\n const b = el(doc, \"button\", cls, text);\n b.type = \"button\";\n b.addEventListener(\"click\", onClick);\n return b;\n}\n\n/** Why the visitor can only browse, and the portal when it's on. */\nexport function writeNotice(doc: Document, reason: string, onPortal?: () => void): HTMLElement {\n const box = el(doc, \"div\", \"g-m-idea-notice\");\n box.setAttribute(\"role\", \"note\");\n box.appendChild(el(doc, \"span\", \"\", reason));\n if (onPortal) box.appendChild(button(doc, \"g-m-text-btn\", \"Open the feedback portal\", onPortal));\n return box;\n}\n\nfunction comment(doc: Document, c: PublicFeedbackComment): HTMLElement {\n const li = el(doc, \"li\", `g-m-comment${c.authorType === \"team\" ? \" g-m-comment-team\" : \"\"}`);\n const who = el(doc, \"div\", \"g-m-row g-m-center g-m-comment-meta\");\n who.appendChild(el(doc, \"span\", \"g-m-comment-author\", c.authorName || (c.authorType === \"team\" ? \"Team\" : \"Someone\")));\n if (c.authorType === \"team\") who.appendChild(el(doc, \"span\", \"g-m-ai\", \"Team\"));\n who.appendChild(el(doc, \"span\", \"g-m-time\", shortDate(c.createdAt)));\n const body = el(doc, \"div\", \"g-m-comment-body\");\n body.appendChild(renderSafeText(doc, c.body));\n li.append(who, body);\n return li;\n}\n\nexport interface IdeaDetailOptions {\n idea: PublicFeedbackRequestDetail;\n /** Null when the visitor may vote and comment; otherwise why not. */\n blocked: string | null;\n onPortal?: () => void;\n busy: boolean;\n error: string | null;\n vote: { priority: FeedbackPriority; note: string };\n commentDraft: string;\n onVote: (priority: FeedbackPriority, note: string) => void;\n onUnvote: () => void;\n onFollow: (follow: boolean) => void;\n onCommentInput: (text: string) => void;\n onComment: () => void;\n}\n\n/** An idea: status and the team's note, description, voting with a priority, following and comments. */\nexport function ideaDetail(doc: Document, o: IdeaDetailOptions): HTMLElement {\n const { idea } = o;\n const wrap = el(doc, \"div\", \"g-m-form g-m-idea-detail\");\n const meta = el(doc, \"div\", \"g-m-row g-m-center g-m-idea-meta\");\n meta.append(el(doc, \"span\", \"g-m-time\", feedbackReference(idea.number)), ideaStatusPill(doc, idea.status));\n if (idea.productArea) meta.appendChild(el(doc, \"span\", \"g-m-time\", idea.productArea));\n wrap.append(meta, el(doc, \"h3\", \"g-m-form-title\", idea.title));\n if (idea.description.trim()) {\n const d = el(doc, \"div\", \"g-m-idea-desc\");\n d.appendChild(renderSafeText(doc, idea.description));\n wrap.appendChild(d);\n }\n if (idea.statusNote.trim()) {\n const note = el(doc, \"div\", \"g-m-idea-note\");\n note.appendChild(el(doc, \"span\", \"g-m-card-label\", `${FEEDBACK_STATUS_LABEL[idea.status] ?? idea.status} · from the team`));\n note.appendChild(renderSafeText(doc, idea.statusNote));\n wrap.appendChild(note);\n }\n\n const panel = el(doc, \"div\", \"g-m-card g-m-static g-m-idea-vote\");\n const top = el(doc, \"div\", \"g-m-row g-m-center\");\n top.appendChild(voteControl(doc, idea, { canVote: false }));\n const said = el(doc, \"span\", \"g-m-grow\");\n said.appendChild(el(doc, \"span\", \"g-m-card-title\", plural(idea.votes, \"vote\")));\n if (idea.myVote) said.appendChild(el(doc, \"span\", \"g-m-card-sub\", `You voted · ${FEEDBACK_PRIORITY_LABEL[idea.myVote.priority]}`));\n top.appendChild(said);\n if (!o.blocked) {\n const follow = button(doc, `g-m-follow${idea.following ? \" g-m-following\" : \"\"}`, idea.following ? \"Following\" : \"Follow\", () => o.onFollow(!idea.following));\n follow.setAttribute(\"aria-pressed\", String(idea.following));\n follow.disabled = o.busy;\n follow.title = idea.following ? \"Stop getting updates about this idea\" : \"Get updates here when it changes\";\n top.appendChild(follow);\n }\n panel.appendChild(top);\n if (o.error) panel.appendChild(errorLine(doc, o.error));\n if (o.blocked) panel.appendChild(writeNotice(doc, o.blocked, o.onPortal));\n else if (idea.myVote) {\n // Picking another priority changes the vote.\n panel.appendChild(priorityChoice(doc, idea.myVote.priority, (p) => p !== idea.myVote?.priority && o.onVote(p, \"\"), \"How much do you need it?\"));\n const remove = button(doc, \"g-m-text-btn g-m-unvote\", \"Remove my vote\", o.onUnvote);\n remove.disabled = o.busy;\n panel.appendChild(remove);\n } else {\n const vote = o.vote;\n panel.appendChild(priorityChoice(doc, vote.priority, (p) => (vote.priority = p)));\n const note = el(doc, \"textarea\", \"g-input g-m-idea-why\");\n note.rows = 2;\n note.maxLength = MAX_FEEDBACK_NOTE;\n note.value = vote.note;\n note.placeholder = \"What would it let you do?\";\n note.addEventListener(\"input\", () => (vote.note = note.value));\n panel.appendChild(field(doc, \"Why it matters\", note, { optional: true }));\n const go = button(doc, \"g-btn g-btn-primary g-m-wide g-m-vote-submit\", o.busy ? \"Voting…\" : \"Vote for this idea\", () => o.onVote(vote.priority, vote.note.trim()));\n go.disabled = o.busy;\n panel.appendChild(go);\n }\n wrap.appendChild(panel);\n\n const comments = el(doc, \"div\", \"g-m-comments\");\n comments.appendChild(el(doc, \"h4\", \"g-m-comments-title\", idea.thread.length ? `Comments (${idea.thread.length})` : \"Comments\"));\n if (idea.thread.length) {\n const list = el(doc, \"ul\", \"g-m-comment-list\");\n idea.thread.forEach((c) => list.appendChild(comment(doc, c)));\n comments.appendChild(list);\n } else comments.appendChild(el(doc, \"p\", \"g-m-hint\", \"No comments yet.\"));\n if (!o.blocked) {\n const form = el(doc, \"form\", \"g-m-comment-form\");\n form.noValidate = true;\n const box = el(doc, \"textarea\", \"g-input\");\n box.rows = 2;\n box.maxLength = MAX_FEEDBACK_COMMENT;\n box.placeholder = \"Add a comment…\";\n box.setAttribute(\"aria-label\", \"Comment\");\n box.value = o.commentDraft;\n const post = el(doc, \"button\", \"g-btn g-btn-secondary\", \"Post\");\n post.type = \"submit\";\n post.disabled = o.busy || !o.commentDraft.trim();\n box.addEventListener(\"input\", () => {\n o.onCommentInput(box.value);\n post.disabled = o.busy || !box.value.trim();\n });\n form.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n if (box.value.trim() && !o.busy) o.onComment();\n });\n form.append(box, post);\n comments.appendChild(form);\n }\n wrap.appendChild(comments);\n return wrap;\n}\n\n/** The \"Suggest an idea\" form as filled in so far. */\nexport interface IdeaDraft {\n title: string;\n description: string;\n productArea: string;\n priority: FeedbackPriority;\n /** Suggested from a Scout conversation. */\n conversationId: string | null;\n /** Ideas like the title so far; null until looked up. */\n similar: PublicFeedbackRequest[] | null;\n /** The title `similar` was looked up for. */\n similarFor: string;\n error: string | null;\n sending: boolean;\n checked: boolean;\n}\n\nexport const emptyIdeaDraft = (over: Partial<IdeaDraft> = {}): IdeaDraft => ({ title: \"\", description: \"\", productArea: \"\", priority: \"nice_to_have\", conversationId: null, similar: null, similarFor: \"\", error: null, sending: false, checked: false, ...over });\n\n/** The first thing missing in the form, or null when it can be sent. */\nexport function ideaProblem(draft: IdeaDraft): string | null {\n return draft.title.trim().length < 3 ? \"Give your idea a short title.\" : null;\n}\n\nexport interface IdeaFormOptions {\n draft: IdeaDraft;\n productAreas: string[];\n onTitleInput: () => void;\n onSubmit: () => void;\n}\n\n/** \"Suggest an idea\": title (with similar ideas under it), description, product area and priority. */\nexport function ideaForm(doc: Document, o: IdeaFormOptions): { form: HTMLFormElement; similar: HTMLElement } {\n const { draft } = o;\n const form = el(doc, \"form\", \"g-m-form g-m-idea-form\");\n form.noValidate = true;\n const title = el(doc, \"input\", \"g-input\");\n title.type = \"text\";\n title.maxLength = MAX_FEEDBACK_TITLE;\n title.required = true;\n title.value = draft.title;\n title.placeholder = \"Your idea in a few words\";\n title.addEventListener(\"input\", () => {\n draft.title = title.value;\n o.onTitleInput();\n });\n form.appendChild(field(doc, \"Idea\", title, { invalid: draft.checked && !!ideaProblem(draft) }));\n const similar = el(doc, \"div\", \"g-m-similar\");\n similar.setAttribute(\"aria-live\", \"polite\");\n form.appendChild(similar);\n\n const desc = el(doc, \"textarea\", \"g-input g-m-textarea\");\n desc.rows = 4;\n desc.maxLength = MAX_FEEDBACK_DESCRIPTION;\n desc.value = draft.description;\n desc.placeholder = \"What are you trying to do, and what gets in the way?\";\n desc.addEventListener(\"input\", () => (draft.description = desc.value));\n form.appendChild(field(doc, \"Details\", desc, { optional: true }));\n\n if (o.productAreas.length) {\n const select = el(doc, \"select\", \"g-input\");\n const opt = (label: string, value: string) => {\n const x = el(doc, \"option\", \"\", label);\n x.value = value;\n return x;\n };\n select.appendChild(opt(\"Choose one (optional)\", \"\"));\n o.productAreas.forEach((a) => select.appendChild(opt(a, a)));\n select.value = o.productAreas.includes(draft.productArea) ? draft.productArea : \"\";\n select.addEventListener(\"change\", () => (draft.productArea = select.value));\n form.appendChild(field(doc, \"Product area\", select, { optional: true }));\n }\n form.appendChild(priorityChoice(doc, draft.priority, (p) => (draft.priority = p)));\n\n const foot = el(doc, \"div\", \"g-m-form-foot\");\n if (draft.error) foot.appendChild(errorLine(doc, draft.error));\n const submit = el(doc, \"button\", \"g-btn g-btn-primary g-m-wide\", draft.sending ? \"Sending…\" : \"Submit idea\");\n submit.type = \"submit\";\n submit.disabled = draft.sending;\n foot.appendChild(submit);\n form.appendChild(foot);\n form.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n if (!draft.sending) o.onSubmit();\n });\n return { form, similar };\n}\n\n/** \"Similar ideas — vote instead?\" under the title. */\nexport function similarIdeas(doc: Document, ideas: PublicFeedbackRequest[], row: (idea: PublicFeedbackRequest) => HTMLElement): HTMLElement | null {\n if (!ideas.length) return null;\n const box = el(doc, \"div\", \"g-m-similar-box\");\n box.appendChild(el(doc, \"div\", \"g-m-card-label\", \"Similar ideas — vote instead?\"));\n const list = el(doc, \"div\", \"g-m-idea-list\");\n list.setAttribute(\"role\", \"list\");\n ideas.slice(0, 5).forEach((i) => list.appendChild(row(i)));\n box.appendChild(list);\n return box;\n}\n\n/** After submitting: the idea's number and what happens next. */\nexport function ideaSent(doc: Document, o: { idea: PublicFeedbackRequestDetail; onView: () => void; onBack: () => void }): HTMLElement {\n const wrap = el(doc, \"div\", \"g-m-form g-m-sent\");\n const top = el(doc, \"div\", \"g-m-sent-top\");\n const tick = el(doc, \"span\", \"g-m-sent-tick\", \"✓\");\n tick.setAttribute(\"aria-hidden\", \"true\");\n const p = el(doc, \"p\", \"g-m-card-sub\");\n p.append(el(doc, \"strong\", \"\", `${feedbackReference(o.idea.number)} · ${o.idea.title}`), o.idea.following ? \". You're following it: updates show up here when its status changes.\" : \". Others can now vote for it.\");\n top.append(tick, el(doc, \"h3\", \"g-m-form-title\", \"Thanks for your idea\"), p);\n wrap.append(top, button(doc, \"g-btn g-btn-primary g-m-wide\", \"View your idea\", o.onView), button(doc, \"g-btn g-btn-secondary g-m-wide\", \"Back to ideas\", o.onBack));\n return wrap;\n}\n\n/** Updates about ideas the visitor follows, newest first. */\nexport function updatesList(doc: Document, updates: FeedbackUpdate[], onOpen: (u: FeedbackUpdate) => void): HTMLElement {\n const wrap = el(doc, \"div\", \"g-m-idea-updates\");\n if (!updates.length) {\n wrap.appendChild(el(doc, \"div\", \"g-m-empty\", \"No updates yet. Follow or vote for an idea to hear when it changes.\"));\n return wrap;\n }\n for (const u of updates) {\n const card = el(doc, \"button\", \"g-m-card g-m-update\");\n card.type = \"button\";\n card.disabled = !u.requestId;\n const row = el(doc, \"span\", \"g-m-row\");\n if (!u.read) row.appendChild(el(doc, \"span\", \"g-m-dot\"));\n const text = el(doc, \"span\", \"g-m-grow\");\n text.appendChild(el(doc, \"span\", \"g-m-card-title\", u.title));\n if (u.body) text.appendChild(el(doc, \"span\", \"g-m-card-sub g-m-clamp\", u.body));\n row.append(text, el(doc, \"span\", \"g-m-time\", shortDate(u.createdAt)));\n card.appendChild(row);\n card.setAttribute(\"aria-label\", `${u.title}${u.read ? \"\" : \", new\"}`);\n card.addEventListener(\"click\", () => onOpen(u));\n wrap.appendChild(card);\n }\n return wrap;\n}\n\n// ---------------------------------------------------------------------------\n// State and behaviour (the messenger owns the views and calls in here)\n// ---------------------------------------------------------------------------\n\nexport interface IdeasOptions {\n doc: Document;\n api: IdeasApi;\n config: () => MessengerIdeasConfig | null | undefined;\n /** The app identified the visitor (`identify()`). */\n identified: () => boolean;\n openIdea: (id: string) => void;\n openForm: () => void;\n openSent: (idea: PublicFeedbackRequestDetail) => void;\n openList: () => void;\n openUpdates: () => void;\n /** The number of unread updates changed (tab dot, home card). */\n onUnreadChange: () => void;\n}\n\nexport interface Ideas {\n /** Null when the visitor may vote, comment and suggest; otherwise why not. */\n blocked(): string | null;\n unread(): number;\n listScreen(): HTMLElement;\n detailScreen(id: string): HTMLElement;\n formScreen(): HTMLElement;\n sentScreen(idea: PublicFeedbackRequestDetail): HTMLElement;\n updatesScreen(): HTMLElement;\n /** Starts a new draft (Scout's \"Suggest this idea\" prefills it). */\n startDraft(prefill?: { title?: string; description?: string; conversationId?: string | null }): void;\n /** Scout's offer in a reply, or null when there is nothing the visitor can do with it. */\n offerChip(offer: MessengerIdeaOffer, conversationId: string | null, lead: () => SVGSVGElement): HTMLButtonElement | null;\n /** Fetches updates unless they're younger than `maxAgeMs`. */\n loadUpdates(maxAgeMs?: number): void;\n /** Identity may have changed: drop what belonged to the previous visitor. */\n sync(open: boolean): void;\n destroy(): void;\n}\n\nconst LIST_TTL_MS = 15_000;\n\n/** An idea with the text fields and thread the detail screen relies on, whatever the server left out. */\nconst asDetail = (d: PublicFeedbackRequestDetail): PublicFeedbackRequestDetail => ({ ...d, title: d.title ?? \"\", description: d.description ?? \"\", statusNote: d.statusNote ?? \"\", votes: d.votes ?? 0, thread: Array.isArray(d.thread) ? d.thread : [] });\n\nexport function createIdeas(o: IdeasOptions): Ideas {\n const { doc, api } = o;\n let query: IdeaListQuery = { sort: \"top\", filter: \"open\", page: 1 };\n let list: PublicFeedbackRequest[] | null = null;\n let hasMore = false;\n let listAt = 0;\n let listLoading = false;\n let listError: string | null = null;\n let listSeq = 0;\n /** An action on the list failed (vote). */\n let listActionError: string | null = null;\n const details = new Map<string, PublicFeedbackRequestDetail>();\n const detailErrors = new Map<string, string>();\n const actionErrors = new Map<string, string>();\n const voteDrafts = new Map<string, { priority: FeedbackPriority; note: string }>();\n const commentDrafts = new Map<string, string>();\n const busy = new Set<string>();\n const offers = new Map<string, \"voting\" | \"voted\" | \"failed\">();\n let updates: FeedbackUpdatesResponse | null = null;\n let updatesAt = 0;\n let updatesLoading = false;\n let updatesSeq = 0;\n let draft = emptyIdeaDraft();\n let similarTimer: ReturnType<typeof setTimeout> | null = null;\n let similarSeq = 0;\n let searchTimer: ReturnType<typeof setTimeout> | null = null;\n let who = o.identified();\n /** The screen showing now; async results repaint it while it's still on screen. */\n let mounted: { root: HTMLElement; paint: () => void } | null = null;\n const mount = (root: HTMLElement, paint: () => void) => {\n mounted = { root, paint };\n paint();\n };\n const repaint = () => {\n if (mounted?.root.isConnected) mounted.paint();\n };\n const showing = (root: HTMLElement) => mounted?.root === root && root.isConnected;\n\n const cfg = () => o.config() ?? { title: \"Ideas\", anonymous: false, readOnly: true, productAreas: [], portal: false };\n function blocked(): string | null {\n const c = cfg();\n if (c.readOnly || !api.voteIdea) return c.portal ? \"Voting and new ideas happen in our feedback portal.\" : \"You can browse ideas here. Voting isn't open in the app.\";\n if (!c.anonymous && !o.identified()) return \"Log in to vote, comment or share an idea.\";\n return null;\n }\n const canPortal = () => cfg().portal && !!api.ideaPortalLink;\n\n /** Opens the hosted portal. The window opens right away (popup blockers), then goes to the link. */\n function openPortal() {\n if (!api.ideaPortalLink) return;\n const win = doc.defaultView;\n let tab: Window | null = null;\n try {\n tab = win?.open(\"about:blank\", \"_blank\") ?? null;\n if (tab) tab.opener = null;\n } catch {\n tab = null;\n }\n api\n .ideaPortalLink()\n .then((raw) => {\n const url = safeHttpUrl(raw);\n if (!url) throw new Error(\"The portal link isn't available.\");\n if (tab) tab.location.href = url;\n else win?.open(url, \"_blank\", \"noopener\");\n })\n .catch((e: unknown) => {\n tab?.close();\n listActionError = errorText(e, \"The feedback portal couldn't be opened.\");\n repaint();\n });\n }\n const portal = () => (canPortal() ? openPortal : undefined);\n\n /** A changed idea from the server: update it wherever it's shown. */\n function patch(idea: PublicFeedbackRequest) {\n if (list) list = list.map((x) => (x.id === idea.id ? { ...x, ...idea } : x));\n const d = details.get(idea.id);\n if (d) details.set(idea.id, { ...d, ...idea, thread: \"thread\" in idea ? (idea as PublicFeedbackRequestDetail).thread : d.thread });\n if (draft.similar) draft.similar = draft.similar.map((x) => (x.id === idea.id ? { ...x, ...idea } : x));\n }\n const find = (id: string) => details.get(id) ?? list?.find((x) => x.id === id) ?? draft.similar?.find((x) => x.id === id);\n\n /** Votes (nice to have) or takes the vote back, from a list row. */\n function toggleVote(idea: PublicFeedbackRequest) {\n if (busy.has(idea.id) || blocked() || !api.voteIdea || (idea.myVote && !api.unvoteIdea)) return;\n busy.add(idea.id);\n listActionError = null;\n const voted = !!idea.myVote;\n patch({ ...idea, votes: Math.max(0, idea.votes + (voted ? -1 : 1)), myVote: voted ? null : { priority: \"nice_to_have\" } });\n repaint();\n (voted ? api.unvoteIdea!(idea.id) : api.voteIdea(idea.id, { priority: \"nice_to_have\" }))\n .then(patch)\n .catch((e: unknown) => {\n patch(idea);\n listActionError = errorText(e, \"Your vote couldn't be saved.\");\n })\n .finally(() => {\n busy.delete(idea.id);\n repaint();\n });\n }\n\n function loadList(append = false) {\n if (!api.listIdeas) return;\n const seq = ++listSeq;\n listLoading = true;\n listError = null;\n const q = { ...query };\n api\n .listIdeas(q)\n .then((res) => {\n if (seq !== listSeq) return;\n const got = Array.isArray(res?.requests) ? res.requests : [];\n list = append && list ? [...list, ...got.filter((r) => !list!.some((x) => x.id === r.id))] : got;\n hasMore = !!res?.hasMore;\n listAt = Date.now();\n })\n .catch((e: unknown) => {\n if (seq === listSeq) listError = errorText(e, \"Ideas couldn't be loaded.\");\n })\n .finally(() => {\n if (seq !== listSeq) return;\n listLoading = false;\n repaint();\n });\n }\n const requery = (change: Partial<IdeaListQuery>) => {\n query = { ...query, ...change, page: 1 };\n loadList();\n repaint();\n };\n\n function listScreen(): HTMLElement {\n const root = el(doc, \"div\", \"g-m-scroll g-m-ideas\");\n const top = el(doc, \"div\", \"g-m-ideas-top\");\n const why = blocked();\n if (why) top.appendChild(writeNotice(doc, why, portal()));\n else top.appendChild(button(doc, \"g-btn g-btn-primary g-m-wide\", \"Suggest an idea\", o.openForm));\n const updatesLink = el(doc, \"div\");\n top.appendChild(updatesLink);\n const search = el(doc, \"input\", \"g-input g-m-idea-search\");\n search.type = \"search\";\n search.placeholder = \"Search ideas\";\n search.setAttribute(\"aria-label\", \"Search ideas\");\n search.maxLength = 200;\n search.value = query.q ?? \"\";\n search.addEventListener(\"input\", () => {\n if (searchTimer) clearTimeout(searchTimer);\n searchTimer = setTimeout(() => requery({ q: search.value.trim() || undefined }), 300);\n });\n const tools = el(doc, \"div\", \"g-m-row g-m-center g-m-idea-tools\");\n tools.append(filterChips(doc, query.filter, (filter) => requery({ filter })), sortSelect(doc, query.sort, (sort) => requery({ sort })));\n top.append(search, tools);\n const results = el(doc, \"div\", \"g-m-idea-results\");\n root.append(top, results);\n\n mount(root, () => {\n updatesLink.textContent = \"\";\n const n = updates?.unread ?? 0;\n if (updates?.updates.length) updatesLink.appendChild(button(doc, \"g-m-text-btn g-m-updates-link\", n ? `Updates on your ideas (${n} new)` : \"Updates on your ideas\", o.openUpdates));\n results.textContent = \"\";\n if (listActionError) results.appendChild(errorLine(doc, listActionError));\n if (!list) {\n if (listError) {\n results.append(errorLine(doc, listError), button(doc, \"g-m-text-btn\", \"Try again\", () => loadList()));\n } else results.appendChild(el(doc, \"div\", \"g-m-empty\", \"Loading ideas…\"));\n return;\n }\n if (!list.length) {\n const empty = query.q ? `No ideas match “${query.q}”.` : query.filter === \"mine\" ? \"You haven't suggested any ideas yet.\" : query.filter === \"following\" ? \"You aren't following any ideas yet.\" : \"No ideas yet. Be the first to suggest one.\";\n results.appendChild(el(doc, \"div\", \"g-m-empty\", empty));\n } else {\n const rows = el(doc, \"div\", \"g-m-idea-list\");\n rows.setAttribute(\"role\", \"list\");\n rows.setAttribute(\"aria-busy\", String(listLoading));\n const canVote = !blocked();\n list.forEach((idea) => rows.appendChild(ideaRow(doc, idea, { canVote, busy: busy.has(idea.id), onVote: () => toggleVote(idea), onOpen: () => o.openIdea(idea.id) })));\n results.appendChild(rows);\n }\n if (listError) results.appendChild(errorLine(doc, listError));\n if (hasMore) {\n const more = button(doc, \"g-btn g-btn-secondary g-m-wide\", listLoading ? \"Loading…\" : \"Show more\", () => {\n query = { ...query, page: query.page + 1 };\n loadList(true);\n repaint();\n });\n more.disabled = listLoading;\n results.appendChild(more);\n }\n if (!why && canPortal()) results.appendChild(button(doc, \"g-m-text-btn g-m-portal-link\", \"Open the feedback portal\", openPortal));\n });\n if (!list || Date.now() - listAt > LIST_TTL_MS || query.page > 1) {\n query = { ...query, page: 1 };\n loadList();\n }\n return root;\n }\n\n function act(id: string, call: () => Promise<PublicFeedbackRequest | PublicFeedbackRequestDetail> | undefined, fallback: string, done?: () => void) {\n if (busy.has(id)) return;\n const p = call();\n if (!p) return;\n busy.add(id);\n actionErrors.delete(id);\n repaint();\n p.then((res) => {\n patch(res);\n done?.();\n })\n .catch((e: unknown) => actionErrors.set(id, errorText(e, fallback)))\n .finally(() => {\n busy.delete(id);\n repaint();\n });\n }\n\n function detailScreen(id: string): HTMLElement {\n const root = el(doc, \"div\", \"g-m-scroll\");\n mount(root, () => {\n root.textContent = \"\";\n const idea = details.get(id);\n if (!idea) {\n const err = detailErrors.get(id);\n root.appendChild(err ? errorLine(doc, err) : el(doc, \"div\", \"g-m-empty\", \"Loading…\"));\n return;\n }\n if (!voteDrafts.has(id)) voteDrafts.set(id, { priority: \"nice_to_have\", note: \"\" });\n root.appendChild(\n ideaDetail(doc, {\n idea,\n blocked: blocked(),\n onPortal: portal(),\n busy: busy.has(id),\n error: actionErrors.get(id) ?? null,\n vote: voteDrafts.get(id)!,\n commentDraft: commentDrafts.get(id) ?? \"\",\n onVote: (priority, note) => act(id, () => api.voteIdea?.(id, { priority, ...(note ? { note } : {}) }), \"Your vote couldn't be saved.\", () => voteDrafts.delete(id)),\n onUnvote: () => act(id, () => api.unvoteIdea?.(id), \"Your vote couldn't be removed.\"),\n onFollow: (follow) => act(id, () => api.followIdea?.(id, follow), \"That didn't work. Please try again.\"),\n onCommentInput: (text) => commentDrafts.set(id, text),\n onComment: () => act(id, () => api.commentIdea?.(id, (commentDrafts.get(id) ?? \"\").trim()), \"Your comment couldn't be posted.\", () => commentDrafts.delete(id)),\n }),\n );\n });\n if (api.getIdea) {\n detailErrors.delete(id);\n api\n .getIdea(id)\n .then((d) => {\n details.set(id, asDetail(d));\n patch(d);\n })\n .catch((e: unknown) => {\n if (!details.has(id)) detailErrors.set(id, errorText(e, \"This idea couldn't be loaded.\"));\n })\n .finally(() => {\n if (showing(root)) mounted!.paint();\n });\n }\n return root;\n }\n\n function lookUpSimilar(paint: () => void) {\n const title = draft.title.trim();\n if (title.length < 3 || !api.similarIdeas) {\n draft.similar = null;\n draft.similarFor = \"\";\n return paint();\n }\n if (title === draft.similarFor) return;\n const seq = ++similarSeq;\n api\n .similarIdeas(title)\n .then((res) => {\n if (seq !== similarSeq) return;\n draft.similar = res;\n draft.similarFor = title;\n paint();\n })\n .catch(() => {});\n }\n\n function formScreen(): HTMLElement {\n const root = el(doc, \"div\", \"g-m-scroll\");\n let similarBox: HTMLElement | null = null;\n const paintSimilar = () => {\n if (!similarBox) return;\n similarBox.textContent = \"\";\n const canVote = !blocked();\n const box = similarIdeas(doc, draft.similar ?? [], (idea) => ideaRow(doc, idea, { canVote, busy: busy.has(idea.id), onVote: () => toggleVote(idea), onOpen: () => o.openIdea(idea.id) }));\n if (box) similarBox.appendChild(box);\n if (listActionError) similarBox.appendChild(errorLine(doc, listActionError));\n };\n const paintAll = () => {\n root.textContent = \"\";\n const why = blocked();\n if (why) {\n root.appendChild(writeNotice(doc, why, portal()));\n similarBox = null;\n return;\n }\n const { form, similar } = ideaForm(doc, {\n draft,\n productAreas: cfg().productAreas ?? [],\n onTitleInput: () => {\n if (similarTimer) clearTimeout(similarTimer);\n similarTimer = setTimeout(() => {\n if (showing(root)) lookUpSimilar(paintSimilar);\n }, 300);\n },\n onSubmit: () => submit(root, paintAll),\n });\n root.appendChild(form);\n similarBox = similar;\n paintSimilar();\n };\n mounted = { root, paint: paintSimilar };\n paintAll();\n // A prefilled title (Scout's offer) is checked straight away.\n if (draft.title.trim() && draft.title.trim() !== draft.similarFor) lookUpSimilar(paintSimilar);\n return root;\n }\n\n function submit(root: HTMLElement, paintAll: () => void) {\n const d = draft;\n d.checked = true;\n d.error = ideaProblem(d);\n if (d.error || !api.submitIdea) return paintAll();\n d.sending = true;\n paintAll();\n api\n .submitIdea({ title: d.title.trim(), description: d.description.trim(), productArea: d.productArea || null, priority: d.priority, conversationId: d.conversationId })\n .then((idea) => {\n details.set(idea.id, asDetail(idea));\n listAt = 0; // show it in the list next time\n if (draft === d) draft = emptyIdeaDraft();\n if (showing(root)) o.openSent(idea);\n })\n .catch((e: unknown) => {\n d.sending = false;\n d.error = errorText(e, \"Your idea couldn't be sent.\");\n if (showing(root)) paintAll();\n });\n }\n\n function updatesScreen(): HTMLElement {\n const root = el(doc, \"div\", \"g-m-scroll g-m-idea-updates-screen\");\n mount(root, () => {\n root.textContent = \"\";\n if (!updates) {\n root.appendChild(el(doc, \"div\", \"g-m-empty\", updatesLoading || api.ideaUpdates ? \"Loading…\" : \"No updates yet.\"));\n return;\n }\n root.appendChild(updatesList(doc, updates.updates, (u) => u.requestId && o.openIdea(u.requestId)));\n });\n if (!updates) loadUpdates();\n else markRead();\n return root;\n }\n\n /** Shown on the updates screen: mark them read (the dot stays on each until next time). */\n function markRead() {\n const ids = updates?.updates.filter((u) => !u.read).map((u) => u.id) ?? [];\n if (!ids.length || !api.markIdeaUpdatesRead) return;\n const seq = updatesSeq;\n api\n .markIdeaUpdatesRead(ids)\n .then((res) => {\n if (seq !== updatesSeq || !updates) return;\n // Keep the \"new\" dots on screen; the count goes to zero for the tab and home.\n updates = { updates: updates.updates, unread: res.unread };\n o.onUnreadChange();\n })\n .catch(() => {});\n }\n\n function loadUpdates(maxAgeMs = 0) {\n if (!api.ideaUpdates || updatesLoading || Date.now() - updatesAt < maxAgeMs) return;\n updatesLoading = true;\n const seq = ++updatesSeq;\n api\n .ideaUpdates()\n .then((res) => {\n if (seq !== updatesSeq) return;\n const before = updates?.unread ?? 0;\n updates = { updates: Array.isArray(res?.updates) ? res.updates : [], unread: Number(res?.unread) || 0 };\n updatesAt = Date.now();\n if (updates.unread !== before) o.onUnreadChange();\n if (mounted?.root.isConnected) {\n mounted.paint();\n if (mounted.root.classList.contains(\"g-m-idea-updates-screen\")) markRead();\n }\n })\n .catch(() => {})\n .finally(() => {\n if (seq === updatesSeq) updatesLoading = false;\n });\n }\n\n function offerChip(offer: MessengerIdeaOffer, conversationId: string | null, lead: () => SVGSVGElement): HTMLButtonElement | null {\n const canWrite = !blocked();\n const b = el(doc, \"button\", \"g-m-chip g-m-guide g-m-offer g-m-idea-offer\");\n b.type = \"button\";\n const label = el(doc, \"span\");\n b.append(lead(), label);\n const id = offer.requestId;\n if (!id) {\n if (!canWrite || !api.submitIdea) return null;\n label.textContent = \"Suggest this idea\";\n b.addEventListener(\"click\", () => {\n startDraft({ title: offer.title, description: offer.description, conversationId });\n o.openForm();\n });\n return b;\n }\n const paint = () => {\n const state = offers.get(id) ?? (find(id)?.myVote ? \"voted\" : undefined);\n b.disabled = state === \"voting\";\n label.textContent = !canWrite ? `View “${offer.title}”` : state === \"voting\" ? \"Voting…\" : state === \"voted\" ? \"Voted · View the idea\" : state === \"failed\" ? \"Couldn't vote · View the idea\" : `Vote for “${offer.title}”`;\n return state;\n };\n paint();\n b.addEventListener(\"click\", () => {\n const state = paint();\n if (!canWrite || state === \"voted\" || state === \"failed\" || !api.voteIdea) return o.openIdea(id);\n if (state === \"voting\") return;\n offers.set(id, \"voting\");\n paint();\n api\n .voteIdea(id, { priority: \"nice_to_have\", conversationId })\n .then((idea) => {\n patch(idea);\n offers.set(id, \"voted\");\n })\n .catch(() => offers.set(id, \"failed\"))\n .finally(paint);\n });\n return b;\n }\n\n function startDraft(prefill: { title?: string; description?: string; conversationId?: string | null } = {}) {\n draft = emptyIdeaDraft({ title: (prefill.title ?? \"\").slice(0, MAX_FEEDBACK_TITLE), description: (prefill.description ?? \"\").slice(0, MAX_FEEDBACK_DESCRIPTION), conversationId: prefill.conversationId ?? null });\n }\n\n return {\n blocked,\n unread: () => updates?.unread ?? 0,\n listScreen,\n detailScreen,\n formScreen,\n sentScreen: (idea) => {\n mounted = null;\n const root = el(doc, \"div\", \"g-m-scroll\");\n root.appendChild(ideaSent(doc, { idea, onView: () => o.openIdea(idea.id), onBack: o.openList }));\n return root;\n },\n updatesScreen,\n startDraft,\n offerChip,\n loadUpdates,\n sync(open) {\n const now = o.identified();\n if (now !== who) {\n who = now;\n list = null;\n listAt = 0;\n details.clear();\n offers.clear();\n updates = null;\n updatesAt = 0;\n updatesSeq++;\n updatesLoading = false;\n o.onUnreadChange();\n }\n if (open) loadUpdates(30_000);\n },\n destroy() {\n if (similarTimer) clearTimeout(similarTimer);\n if (searchTimer) clearTimeout(searchTimer);\n mounted = null;\n },\n };\n}\n","/**\n * Renders untrusted chat text (Scout replies, user and teammate messages) with createElement and\n * textContent only. Supports paragraphs, line breaks, `- ` / `1. ` lists, **bold**, `code` and\n * http(s) links. Never creates images, raw HTML or non-http links, so a prompt-injected reply can't\n * load remote resources or run script.\n */\n\nconst CITATION = /\\s*\\[\\[article:[^\\]]*\\]\\]/g;\n// Inline tokens: **bold**, `code`, [label](url), bare https?:// URLs.\nconst INLINE = /\\*\\*([^*\\n]+)\\*\\*|`([^`\\n]+)`|(!?)\\[([^\\]\\n]{1,200})\\]\\((https?:\\/\\/[^\\s)]+)\\)|(https?:\\/\\/[^\\s<>()\"']+[^\\s<>().,;:!?'\"])/g;\n\n/** Removes `[[article:ID]]` markers (citations are rendered from structured data instead). */\nexport function stripCitationMarkers(text: string): string {\n return text.replace(CITATION, \"\");\n}\n\nexport function safeHttpUrl(raw: string): string | null {\n try {\n const u = new URL(raw);\n return u.protocol === \"http:\" || u.protocol === \"https:\" ? u.href : null;\n } catch {\n return null;\n }\n}\n\nfunction link(doc: Document, label: string, href: string): Node {\n const url = safeHttpUrl(href);\n if (!url) return doc.createTextNode(label);\n const a = doc.createElement(\"a\");\n a.href = url;\n a.target = \"_blank\";\n a.rel = \"noopener noreferrer nofollow\";\n a.textContent = label;\n return a;\n}\n\nfunction appendInline(doc: Document, parent: Node, text: string) {\n let last = 0;\n for (const m of text.matchAll(INLINE)) {\n const start = m.index ?? 0;\n if (start > last) parent.appendChild(doc.createTextNode(text.slice(last, start)));\n if (m[1] !== undefined) {\n const b = doc.createElement(\"strong\");\n b.textContent = m[1];\n parent.appendChild(b);\n } else if (m[2] !== undefined) {\n const c = doc.createElement(\"code\");\n c.textContent = m[2];\n parent.appendChild(c);\n } else if (m[4] !== undefined && m[5] !== undefined) {\n // Markdown images (![alt](url)) are never loaded or linked: keep the alt text only.\n parent.appendChild(m[3] ? doc.createTextNode(m[4]) : link(doc, m[4], m[5]));\n } else if (m[6] !== undefined) {\n parent.appendChild(link(doc, m[6], m[6]));\n }\n last = start + m[0].length;\n }\n if (last < text.length) parent.appendChild(doc.createTextNode(text.slice(last)));\n}\n\nconst BULLET = /^\\s*[-*•]\\s+/;\nconst NUMBERED = /^\\s*\\d{1,3}[.)]\\s+/;\n\n/** Builds a fragment for `text`. Safe for any input. */\nexport function renderSafeText(doc: Document, text: string): DocumentFragment {\n const frag = doc.createDocumentFragment();\n const blocks = stripCitationMarkers(text).replace(/\\r\\n?/g, \"\\n\").trim().split(/\\n{2,}/);\n for (const block of blocks) {\n if (!block.trim()) continue;\n const lines = block.split(\"\\n\");\n if (lines.every((l) => BULLET.test(l)) || lines.every((l) => NUMBERED.test(l))) {\n const ordered = NUMBERED.test(lines[0]!);\n const list = doc.createElement(ordered ? \"ol\" : \"ul\");\n for (const line of lines) {\n const li = doc.createElement(\"li\");\n appendInline(doc, li, line.replace(ordered ? NUMBERED : BULLET, \"\"));\n list.appendChild(li);\n }\n frag.appendChild(list);\n continue;\n }\n const p = doc.createElement(\"p\");\n lines.forEach((line, i) => {\n if (i) p.appendChild(doc.createElement(\"br\"));\n appendInline(doc, p, line);\n });\n frag.appendChild(p);\n }\n return frag;\n}\n","// Drag-to-move for the messenger launcher: visitors can push the chat bubble out of the way. It\n// snaps to the nearer side edge at the height it was dropped, and the spot is remembered per device.\n\n/** Where the visitor left the launcher. `y`: 0 = the default bottom spot, 1 = as high as it goes. */\nexport interface LauncherSpot {\n side: \"left\" | \"right\";\n y: number;\n}\n\n/** Pointer travel (px) before a press becomes a drag; anything shorter is a click. */\nexport const DRAG_THRESHOLD = 6;\n/** The launcher's CSS margin (px) from the viewport edges. */\nconst MARGIN = 16;\n\n/** Reads a stored spot, ignoring anything malformed. */\nexport function parseLauncherSpot(raw: unknown): LauncherSpot | null {\n let v = raw;\n if (typeof v === \"string\") {\n try {\n v = JSON.parse(v);\n } catch {\n return null;\n }\n }\n if (!v || typeof v !== \"object\") return null;\n const { side, y } = v as Record<string, unknown>;\n if ((side !== \"left\" && side !== \"right\") || typeof y !== \"number\" || !Number.isFinite(y)) return null;\n return { side, y: Math.min(1, Math.max(0, y)) };\n}\n\n/** Highest `bottom` offset (px, on top of the margin) the launcher can take in a viewport this tall. */\nexport function maxLauncherBottom(viewportHeight: number, size: number): number {\n return Math.max(0, viewportHeight - size - MARGIN * 2);\n}\n\n/** The spot a launcher dropped with its top-left corner at (left, top) snaps to. */\nexport function snapLauncher(drop: { left: number; top: number }, viewport: { width: number; height: number }, size: number): LauncherSpot {\n const side = drop.left + size / 2 < viewport.width / 2 ? \"left\" : \"right\";\n const max = maxLauncherBottom(viewport.height, size);\n const bottom = Math.min(max, Math.max(0, viewport.height - MARGIN - size - drop.top));\n return { side, y: max ? bottom / max : 0 };\n}\n\nexport interface LauncherDragOptions {\n launcher: HTMLElement;\n /** Called after a drag with the new spot (to save it). */\n onMove: (spot: LauncherSpot) => void;\n}\n\n/**\n * Makes the launcher draggable. A press that moves less than DRAG_THRESHOLD stays a click; a drag\n * swallows the click that follows it. Returns a cleanup function.\n */\nexport function enableLauncherDrag({ launcher, onMove }: LauncherDragOptions): () => void {\n const win = launcher.ownerDocument.defaultView ?? window;\n let start: { id: number; x: number; y: number; left: number; top: number } | null = null;\n let dragging = false;\n let swallowClickUntil = 0;\n\n const onDown = (e: PointerEvent) => {\n if (e.button !== 0) return;\n const r = launcher.getBoundingClientRect();\n start = { id: e.pointerId, x: e.clientX, y: e.clientY, left: r.left, top: r.top };\n dragging = false;\n // A quick flick leaves the bubble before it counts as a drag; keep its moves coming here.\n try {\n launcher.setPointerCapture(e.pointerId);\n } catch {\n /* the pointer may already be gone */\n }\n };\n const onMovePointer = (e: PointerEvent) => {\n if (!start || e.pointerId !== start.id) return;\n const dx = e.clientX - start.x;\n const dy = e.clientY - start.y;\n if (!dragging) {\n if (Math.hypot(dx, dy) < DRAG_THRESHOLD) return;\n dragging = true;\n launcher.classList.add(\"g-m-dragging\");\n }\n e.preventDefault();\n const size = launcher.offsetWidth || 56;\n const left = Math.min(win.innerWidth - size - MARGIN, Math.max(MARGIN, start.left + dx));\n const top = Math.min(win.innerHeight - size - MARGIN, Math.max(MARGIN, start.top + dy));\n Object.assign(launcher.style, { left: `${left}px`, top: `${top}px`, right: \"auto\", bottom: \"auto\", margin: \"0\" });\n };\n const onUp = (e: PointerEvent) => {\n if (!start || e.pointerId !== start.id) return;\n start = null;\n if (!dragging) return;\n dragging = false;\n swallowClickUntil = Date.now() + 400;\n const before = launcher.getBoundingClientRect();\n launcher.classList.remove(\"g-m-dragging\");\n Object.assign(launcher.style, { left: \"\", top: \"\", right: \"\", margin: \"\" });\n onMove(snapLauncher({ left: before.left, top: before.top }, { width: win.innerWidth, height: win.innerHeight }, before.width || 56));\n // Glide from where it was dropped to the edge it snapped to.\n const after = launcher.getBoundingClientRect();\n const dx = before.left - after.left;\n const dy = before.top - after.top;\n if (!dx && !dy) return;\n launcher.style.transition = \"none\";\n launcher.style.transform = `translate(${dx}px, ${dy}px)`;\n void launcher.offsetWidth;\n launcher.style.transition = \"\";\n launcher.classList.add(\"g-m-snapping\");\n launcher.style.transform = \"\";\n const done = () => launcher.classList.remove(\"g-m-snapping\");\n launcher.addEventListener(\"transitionend\", done, { once: true });\n win.setTimeout(done, 400);\n };\n const onClick = (e: MouseEvent) => {\n if (Date.now() < swallowClickUntil) {\n swallowClickUntil = 0;\n e.preventDefault();\n e.stopImmediatePropagation();\n }\n };\n\n launcher.addEventListener(\"pointerdown\", onDown);\n launcher.addEventListener(\"pointermove\", onMovePointer);\n launcher.addEventListener(\"pointerup\", onUp);\n launcher.addEventListener(\"pointercancel\", onUp);\n launcher.addEventListener(\"click\", onClick, true);\n return () => {\n launcher.removeEventListener(\"pointerdown\", onDown);\n launcher.removeEventListener(\"pointermove\", onMovePointer);\n launcher.removeEventListener(\"pointerup\", onUp);\n launcher.removeEventListener(\"pointercancel\", onUp);\n launcher.removeEventListener(\"click\", onClick, true);\n };\n}\n","/** Messenger styles, injected into the Guidely shadow root the first time the messenger renders. */\nexport const MESSENGER_STYLES = `\n:host([data-g-messenger=\"bottom-right\"]) .g-launcher.g-pos-bottom-right{right:72px}\n:host([data-g-messenger=\"bottom-left\"]) .g-launcher.g-pos-bottom-left{left:72px}\n.g-m-launcher{position:fixed;z-index:calc(var(--g-z) + 1);pointer-events:auto;width:56px;height:56px;margin:16px;border-radius:999px;border:0;background:var(--g-primary);color:var(--g-primary-text);cursor:pointer;box-shadow:var(--g-shadow);display:inline-flex;align-items:center;justify-content:center;padding:0;transition:transform .15s}\n.g-m-launcher:hover{transform:scale(1.05)}\n.g-m-launcher:focus-visible{outline:2px solid var(--g-primary);outline-offset:3px}\n.g-m-launcher svg{width:26px;height:26px;fill:currentColor}\n.g-m-launcher{touch-action:none;-webkit-user-select:none;user-select:none}\n.g-m-launcher.g-m-dragging{transition:none;cursor:grabbing;transform:scale(1.08)}\n.g-m-launcher.g-m-snapping{transition:transform .3s cubic-bezier(.2,.8,.2,1)}\n.g-m-badge{position:absolute;top:-2px;right:-2px;min-width:20px;height:20px;padding:0 5px;border-radius:999px;background:#e11d48;color:#fff;font-size:11px;font-weight:700;display:inline-flex;align-items:center;justify-content:center;border:2px solid var(--g-bg)}\n.g-messenger{bottom:var(--g-m-bottom,76px);height:min(640px,calc(100vh - var(--g-m-reserve,110px)));transition:width .2s ease,height .2s ease,max-height .2s ease}\n.g-messenger.g-m-expanded{width:min(720px,calc(100vw - 32px));height:calc(100vh - var(--g-m-reserve,110px));max-height:calc(100vh - var(--g-m-reserve,110px))}\n.g-messenger.g-m-below{bottom:auto;top:var(--g-m-top)}\n.g-m-expanded .g-rc-article,.g-m-expanded .g-m-scroll{padding:24px clamp(20px,5vw,40px)}\n.g-m-expanded .g-rc-article>.g-title{font-size:24px;line-height:1.25;margin-bottom:12px}\n.g-m-expanded .g-rc-article .g-body{font-size:15px}\n.g-m-head.g-m-sizable{padding-right:92px}\n.g-m-size{position:absolute;right:48px;top:50%;transform:translateY(-50%);width:40px;height:40px;border:0;border-radius:999px;background:transparent;color:inherit;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;padding:0}\n.g-m-size .g-m-ico{width:18px;height:18px}\n.g-m-size:hover,.g-m-size:focus-visible{background:rgba(255,255,255,.18);outline:none}\n.g-m-head{padding:16px 48px 14px 20px;background:var(--g-primary);color:var(--g-primary-text);position:relative;display:flex;align-items:center;gap:8px;min-height:56px}\n.g-m-head .g-close{color:inherit;top:50%;transform:translateY(-50%)}\n.g-m-head .g-close:hover,.g-m-head .g-close:focus-visible{background:rgba(255,255,255,.18);color:inherit}\n.g-m-head h2{margin:0;font-size:16px;font-weight:600;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.g-m-back{border:0;background:transparent;color:inherit;font:inherit;cursor:pointer;width:32px;height:32px;border-radius:999px;margin-left:-8px;display:inline-flex;align-items:center;justify-content:center;padding:0}\n.g-m-back:hover,.g-m-back:focus-visible{background:rgba(255,255,255,.18);outline:none}\n.g-m-main{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden}\n.g-m-scroll{flex:1;overflow:auto;padding:16px}\n.g-m-card{display:block;width:100%;text-align:left;border:1px solid var(--g-border);background:var(--g-bg);color:var(--g-text);border-radius:calc(var(--g-radius) * .8);padding:14px 16px;margin:0 0 12px;font:inherit;cursor:pointer;box-shadow:0 1px 2px rgba(0,0,0,.04)}\n.g-m-card:hover{background:var(--g-subtle)}\n.g-m-card:focus-visible{outline:2px solid var(--g-primary);outline-offset:2px}\n.g-m-card-title{display:block;font-weight:600}\n.g-m-card-sub{display:block;color:var(--g-muted);font-size:13px;margin-top:2px}\n.g-m-card-label{display:block;font-size:12px;color:var(--g-muted);font-weight:500}\n.g-m-row{display:flex;align-items:flex-start;gap:10px}\n.g-m-row .g-m-grow{flex:1;min-width:0}\n.g-m-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.g-m-time{color:var(--g-muted);font-size:12px;flex:none}\n.g-m-dot{width:8px;height:8px;border-radius:999px;background:var(--g-primary);flex:none;margin-top:6px}\n.g-m-tabs{display:flex;border-top:1px solid var(--g-border);background:var(--g-bg)}\n.g-m-tab{flex:1;border:0;background:transparent;color:var(--g-muted);font:inherit;font-size:12px;font-weight:600;padding:10px 4px 12px;cursor:pointer;display:flex;flex-direction:column;align-items:center;gap:2px}\n.g-m-tab[aria-selected=\"true\"]{color:var(--g-primary)}\n.g-m-tab:focus-visible{outline:2px solid var(--g-primary);outline-offset:-2px}\n.g-m-tab-icon{position:relative;display:inline-flex;line-height:1}\n.g-m-tab-icon .g-m-ico{width:22px;height:22px}\n.g-m-tab-dot{position:absolute;top:-2px;right:-4px;width:8px;height:8px;border-radius:999px;background:#e11d48;border:2px solid var(--g-bg);box-sizing:content-box}\n.g-m-log{flex:1;overflow:auto;padding:16px;display:flex;flex-direction:column;gap:10px}\n.g-m-msg{max-width:85%;display:flex;flex-direction:column;gap:4px}\n.g-m-msg.g-from-user{align-self:flex-end;align-items:flex-end}\n.g-m-msg.g-from-system{align-self:center;max-width:95%;text-align:center;color:var(--g-muted);font-size:12px}\n.g-m-author{font-size:12px;color:var(--g-muted);display:flex;align-items:center;gap:6px}\n.g-m-ai{font-size:10px;font-weight:700;letter-spacing:.04em;padding:1px 5px;border-radius:4px;background:var(--g-subtle);color:var(--g-muted)}\n.g-m-bubble{padding:10px 12px;border-radius:14px;background:var(--g-subtle);color:var(--g-text);overflow-wrap:anywhere}\n.g-from-user .g-m-bubble{background:var(--g-primary);color:var(--g-primary-text)}\n.g-from-user .g-m-bubble a{color:inherit}\n.g-m-bubble p{margin:0 0 8px}.g-m-bubble p:last-child{margin:0}\n.g-m-bubble ul,.g-m-bubble ol{margin:4px 0 8px;padding-left:20px}\n.g-m-bubble code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;background:color-mix(in srgb,var(--g-text) 8%,transparent);padding:1px 4px;border-radius:4px}\n.g-m-bubble a{color:var(--g-primary)}\n.g-m-failed .g-m-bubble{opacity:.7;font-style:italic}\n.g-m-typing{display:inline-flex;gap:4px;padding:4px 0}\n.g-m-typing span{width:6px;height:6px;border-radius:999px;background:var(--g-muted);animation:g-m-bounce 1s infinite}\n.g-m-typing span:nth-child(2){animation-delay:.15s}.g-m-typing span:nth-child(3){animation-delay:.3s}\n@keyframes g-m-bounce{0%,60%,100%{opacity:.3;transform:translateY(0)}30%{opacity:1;transform:translateY(-3px)}}\n@media (prefers-reduced-motion: reduce){.g-m-typing span{animation:none}.g-m-launcher,.g-m-launcher.g-m-snapping{transition:none}}\n.g-m-chips{display:flex;flex-direction:column;gap:6px;margin-top:2px}\n.g-m-chip{display:flex;align-items:center;gap:8px;text-align:left;border:1px solid var(--g-border);background:var(--g-bg);color:var(--g-text);border-radius:10px;padding:8px 10px;font:inherit;font-size:13px;cursor:pointer}\n.g-m-chip:hover{background:var(--g-subtle)}\n.g-m-chip:focus-visible{outline:2px solid var(--g-primary);outline-offset:2px}\n.g-m-chip.g-m-guide{border-color:var(--g-primary);color:var(--g-primary);font-weight:600}\n.g-m-foot{border-top:1px solid var(--g-border);padding:10px 12px 12px;background:var(--g-bg)}\n.g-m-compose{display:flex;align-items:flex-end;gap:8px}\n.g-m-compose textarea{flex:1;resize:none;min-height:40px;max-height:120px;border:1px solid var(--g-border);border-radius:10px;padding:9px 10px;font:inherit;font-size:14px;color:var(--g-text);background:var(--g-bg)}\n.g-m-compose textarea:focus-visible{outline:2px solid var(--g-primary);outline-offset:1px}\n.g-m-send{width:40px;height:40px;border-radius:999px;border:0;background:var(--g-primary);color:var(--g-primary-text);cursor:pointer;flex:none;display:inline-flex;align-items:center;justify-content:center;padding:0}\n.g-m-send .g-m-ico{width:18px;height:18px}\n.g-m-send:disabled{opacity:.45;cursor:not-allowed}\n.g-m-send:focus-visible{outline:2px solid var(--g-primary);outline-offset:2px}\n.g-m-human{border:0;background:transparent;color:var(--g-muted);font:inherit;font-size:12px;cursor:pointer;padding:6px 2px 0;text-decoration:underline}\n.g-m-human:hover{color:var(--g-text)}\n.g-m-rate{text-align:center;padding:4px 0 2px;font-size:13px;color:var(--g-muted)}\n.g-m-rate button{border:0;background:transparent;font-size:22px;cursor:pointer;padding:4px 8px;border-radius:8px}\n.g-m-rate button:hover,.g-m-rate button:focus-visible{background:var(--g-subtle);outline:none}\n.g-m-note{color:var(--g-muted);font-size:12px;margin-top:6px}\n.g-m-empty{color:var(--g-muted);text-align:center;padding:24px 8px}\n.g-howto .g-title{margin:0 0 6px}\n.g-howto-desc,.g-howto-note{color:var(--g-muted);font-size:13px}\n.g-howto p{margin:0 0 6px;white-space:pre-line}\n.g-howto-show{width:100%;margin:6px 0 4px}\n.g-howto-video{display:block;width:100%;max-height:260px;margin:8px 0 4px;border-radius:8px;background:#000}\n.g-howto-steps{list-style:none;margin:12px 0 0;padding:0;display:flex;flex-direction:column;gap:16px}\n.g-howto-step h4{margin:4px 0 0;font-size:15px}\n.g-howto-tip,.g-howto-alert{border-left:3px solid var(--g-primary);background:var(--g-subtle);border-radius:6px;padding:8px 10px;font-size:13px}\n.g-howto-alert{border-left-color:#d97706}\n.g-howto-row{display:flex;gap:10px;align-items:flex-start}\n.g-howto-num{flex:none;width:24px;height:24px;border-radius:999px;background:var(--g-primary);color:var(--g-primary-text);font-size:12px;font-weight:700;display:inline-flex;align-items:center;justify-content:center}\n.g-howto-text{flex:1;min-width:0;padding-top:2px}\n.g-howto-title{font-weight:600}\n.g-howto-shot{position:relative;overflow:hidden;margin-top:8px;border:1px solid var(--g-border);border-radius:8px;background:var(--g-subtle)}\n.g-howto-shot img{display:block;width:100%;height:auto}\n.g-howto-shot .g-howto-ghost{visibility:hidden}\n.g-howto-shot .g-howto-zoomed{position:absolute;max-width:none}\n.g-howto-mark{position:absolute;pointer-events:none;border:3px solid var(--g-primary);border-radius:6px;box-shadow:0 0 0 3px color-mix(in srgb,var(--g-primary) 25%,transparent)}\n.g-m-ico{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;flex:none}\n.g-close .g-m-ico,.g-m-back .g-m-ico{width:18px;height:18px}\n.g-m-row.g-m-center{align-items:center}\n.g-m-row.g-m-baseline{align-items:baseline}\n.g-m-static{cursor:default}\n.g-m-static:hover{background:var(--g-bg)}\n.g-m-wide{width:100%}\n.g-m-home{position:relative;padding:0}\n.g-m-hero-bg{position:absolute;top:0;left:0;right:0;height:300px;pointer-events:none;background:linear-gradient(180deg,var(--g-primary) 0%,var(--g-primary) 52%,color-mix(in srgb,var(--g-primary) 30%,var(--g-bg)) 84%,var(--g-bg) 100%)}\n.g-m-home-inner{position:relative;padding:16px;display:flex;flex-direction:column;gap:12px}\n.g-m-home .g-m-card{margin:0;box-shadow:0 1px 2px rgba(0,0,0,.04),0 4px 14px rgba(17,24,39,.06)}\n.g-m-hero-top{display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:40px;padding:2px 4px 0}\n.g-m-logo{width:36px;height:36px;border-radius:9px;background:var(--g-bg);color:var(--g-primary);display:inline-flex;align-items:center;justify-content:center;font-weight:700;font-size:17px;overflow:hidden;flex:none}\n.g-m-logo img{width:100%;height:100%;object-fit:contain}\n.g-m-team{display:flex}\n.g-m-avatar{width:32px;height:32px;border-radius:999px;border:2px solid var(--g-primary);display:inline-flex;align-items:center;justify-content:center;font-size:12px;font-weight:700;overflow:hidden;margin-left:-8px;background:#fde7c7;color:#7a4a0a}\n.g-m-avatar:first-child{margin-left:0}\n.g-m-avatar-1{background:#d9f0e3;color:#1f5e3b}\n.g-m-avatar-2{background:#e3e1fa;color:#3b3486}\n.g-m-avatar img{width:100%;height:100%;object-fit:cover}\n.g-m-hero-close{width:36px;height:36px;border:0;border-radius:999px;background:rgba(255,255,255,.16);color:var(--g-primary-text);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;padding:0;margin-left:10px}\n.g-m-hero-close .g-m-ico{width:18px;height:18px}\n.g-m-hero-close:hover{background:rgba(255,255,255,.28)}\n.g-m-hero-close:focus-visible{outline:2px solid var(--g-primary-text);outline-offset:2px}\n.g-m-hello{margin:36px 4px 6px;color:var(--g-primary-text);font-size:26px;font-weight:700;line-height:1.2;letter-spacing:-.01em;display:flex;flex-direction:column}\n.g-m-hello-1{opacity:.8}\n.g-m-trail{color:var(--g-primary)}\n.g-m-lead{color:var(--g-muted)}\n.g-m-status-ico{width:26px;height:26px}\n.g-m-status-operational .g-m-status-ico{color:#15803d}\n.g-m-status-degraded .g-m-status-ico{color:#b45309}\n.g-m-status-outage .g-m-status-ico{color:#b91c1c}\n.g-m-status-maintenance .g-m-status-ico{color:#1d4ed8}\n.g-m-bar{display:block;height:6px;border-radius:999px;background:var(--g-border);margin-top:10px;overflow:hidden}\n.g-m-bar-fill{display:block;height:100%;background:var(--g-primary);border-radius:999px}\n.g-m-link{color:var(--g-primary);font-weight:600;font-size:13px;flex:none}\n.g-m-badge-ico{width:32px;height:32px;border-radius:8px;background:var(--g-subtle);color:color-mix(in srgb,var(--g-text) 78%,transparent);display:inline-flex;align-items:center;justify-content:center;flex:none}\n.g-m-badge-ico .g-m-ico{width:16px;height:16px}\n.g-m-badge-ico.g-m-accent{background:color-mix(in srgb,var(--g-primary) 12%,var(--g-bg));color:var(--g-primary)}\n.g-m-suggest{padding-bottom:4px}\n.g-m-items{display:flex;flex-direction:column;margin-top:8px}\n.g-m-item{display:flex;align-items:center;gap:12px;width:100%;text-align:left;border:0;border-top:1px solid var(--g-border);background:transparent;color:var(--g-text);padding:10px 0;font:inherit;cursor:pointer;min-height:44px}\n.g-m-item:hover .g-m-item-title{color:var(--g-primary)}\n.g-m-item:focus-visible{outline:2px solid var(--g-primary);outline-offset:2px;border-radius:4px}\n.g-m-item .g-m-grow{flex:1;min-width:0}\n.g-m-item-title{display:block;font-weight:600;overflow-wrap:anywhere}\n.g-m-news{padding:0;overflow:hidden}\n.g-m-news-img{display:block;width:100%;height:150px;object-fit:cover;background:var(--g-subtle)}\n.g-m-news-body{display:block;padding:14px 16px}\n.g-m-news-meta{gap:8px;margin-bottom:4px}\n.g-m-tag{font-size:11px;font-weight:700;color:var(--g-primary-text);background:var(--g-primary);border-radius:4px;padding:1px 6px;text-transform:uppercase;letter-spacing:.03em}\n.g-m-clamp{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}\n.g-m-context{align-self:center;font-size:12px;color:var(--g-muted);background:var(--g-subtle);border-radius:999px;padding:3px 10px}\n.g-m-asks{align-items:flex-start}\n.g-m-chip.g-m-ask{border-color:var(--g-primary);color:var(--g-primary);font-weight:600;border-radius:999px;padding:8px 14px;min-height:36px}\n.g-m-chip.g-m-ask:disabled{opacity:.5;cursor:not-allowed}\n.g-m-side{display:flex;flex-direction:column;align-items:flex-end;gap:4px;flex:none}\n.g-m-pill{display:inline-block;font-size:11px;font-weight:700;line-height:1.5;padding:1px 8px;border-radius:999px;white-space:nowrap;background:#fef3c7;color:#92400e}\n.g-m-pill-in_review{background:#e0e7ff;color:#3730a3}\n.g-m-pill-resolved{background:#dcfce7;color:#166534}\n.g-m-complain .g-m-badge-ico{background:#fef3e2;color:#b45309}\n.g-m-complaint{align-self:stretch;gap:10px;border:1px solid var(--g-border);background:var(--g-subtle);border-radius:10px;padding:10px 12px}\n.g-m-chip-ico{width:16px;height:16px}\n.g-m-offer{gap:6px}\n.g-m-form{display:flex;flex-direction:column;gap:14px;margin:0}\n.g-m-form-title{margin:0;font-size:17px;font-weight:600}\n.g-m-cats{display:flex;flex-direction:column;gap:10px}\n.g-m-cats .g-m-card{margin:0;gap:12px;min-height:44px}\n.g-m-cat-dot{width:10px;height:10px;border-radius:999px;background:var(--g-muted);flex:none}\n.g-m-picked{gap:8px;border:1px solid var(--g-border);background:var(--g-subtle);border-radius:10px;padding:8px 12px}\n.g-m-text-btn{border:0;background:transparent;color:var(--g-primary);font:inherit;font-size:13px;font-weight:600;cursor:pointer;padding:6px 4px;min-height:32px}\n.g-m-text-btn:hover{text-decoration:underline}\n.g-m-text-btn:focus-visible{outline:2px solid var(--g-primary);outline-offset:2px;border-radius:4px}\n.g-m-field{display:flex;flex-direction:column;gap:4px}\n.g-m-label{font-weight:600;font-size:13px}\n.g-m-optional{font-weight:400;color:var(--g-muted)}\n.g-m-hint{color:var(--g-muted);font-size:12px;margin:0}\n.g-m-error{color:#b91c1c;font-size:13px;margin:0}\n.g-scope[data-theme=\"dark\"] .g-m-error{color:#fca5a5}\n.g-m-field .g-input[aria-invalid=\"true\"]{border-color:#dc2626}\n.g-m-textarea{min-height:110px}\n.g-m-file{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}\n.g-m-attach-btn{align-self:flex-start;border:1px dashed var(--g-border);background:var(--g-bg);color:var(--g-text);font:inherit;font-size:13px;border-radius:8px;padding:8px 12px;cursor:pointer;min-height:36px}\n.g-m-attach-btn:hover{background:var(--g-subtle)}\n.g-m-attach-btn:focus-visible{outline:2px solid var(--g-primary);outline-offset:2px}\n.g-m-attached{gap:10px;border:1px solid var(--g-border);border-radius:8px;padding:6px 8px;font-size:13px}\n.g-m-thumb{width:40px;height:40px;object-fit:cover;border-radius:6px;background:var(--g-subtle);flex:none}\n.g-m-form-foot{display:flex;flex-direction:column;gap:10px;margin-top:4px}\n.g-m-sent{gap:12px}\n.g-m-sent-top{display:flex;flex-direction:column;align-items:center;text-align:center;gap:6px;padding-top:8px}\n.g-m-sent-top p{max-width:300px;margin:0}\n.g-m-sent-tick{width:52px;height:52px;border-radius:999px;background:#dcfce7;color:#15803d;display:inline-flex;align-items:center;justify-content:center;font-size:26px;font-weight:700}\n.g-m-details{margin:0;display:flex;flex-direction:column;gap:8px}\n.g-m-detail{display:flex;justify-content:space-between;gap:12px;font-size:13px}\n.g-m-detail dt{color:var(--g-muted)}\n.g-m-detail dd{margin:0;font-weight:600;text-align:right;overflow-wrap:anywhere}\n.g-m-steps{list-style:none;margin:4px 0;padding:0;display:flex;justify-content:space-between;position:relative}\n.g-m-steps::before{content:\"\";position:absolute;top:6px;left:12%;right:12%;height:2px;background:var(--g-border)}\n.g-m-step{position:relative;display:flex;flex-direction:column;align-items:center;gap:4px;flex:1;font-size:12px;color:var(--g-muted)}\n.g-m-step-dot{width:14px;height:14px;border-radius:999px;border:2px solid var(--g-border);background:var(--g-bg);box-sizing:border-box}\n.g-m-step-done{color:var(--g-text);font-weight:600}\n.g-m-step-done .g-m-step-dot{background:var(--g-primary);border-color:var(--g-primary)}\n.g-m-ideas-top{display:flex;flex-direction:column;gap:10px;margin-bottom:12px}\n.g-m-ideas-top:empty{display:none}\n.g-m-idea-tools{justify-content:space-between;gap:8px;flex-wrap:wrap}\n.g-m-filters{display:flex;gap:6px;flex-wrap:wrap}\n.g-m-filter{border:1px solid var(--g-border);background:var(--g-bg);color:var(--g-text);font:inherit;font-size:12px;font-weight:600;border-radius:999px;padding:5px 11px;cursor:pointer;min-height:30px}\n.g-m-filter:hover{background:var(--g-subtle)}\n.g-m-filter[aria-pressed=\"true\"]{background:var(--g-primary);border-color:var(--g-primary);color:var(--g-primary-text)}\n.g-m-filter:focus-visible,.g-m-seg-btn:focus-visible,.g-m-vote:focus-visible,.g-m-idea-open:focus-visible,.g-m-follow:focus-visible{outline:2px solid var(--g-primary);outline-offset:2px}\n.g-m-sort{width:auto;min-width:0;min-height:30px;padding:4px 8px;font-size:12px}\n.g-m-idea-list{display:flex;flex-direction:column;border:1px solid var(--g-border);border-radius:calc(var(--g-radius) * .8);background:var(--g-bg);overflow:hidden;margin-bottom:12px}\n.g-m-idea{display:flex;align-items:flex-start;gap:12px;padding:12px 14px;border-top:1px solid var(--g-border)}\n.g-m-idea:first-child{border-top:0}\n.g-m-vote{flex:none;width:44px;min-height:48px;border:1px solid var(--g-border);border-radius:10px;background:var(--g-bg);color:var(--g-text);font:inherit;display:inline-flex;flex-direction:column;align-items:center;justify-content:center;gap:0;padding:4px 0;cursor:pointer}\nbutton.g-m-vote:hover{border-color:var(--g-primary);color:var(--g-primary)}\n.g-m-vote:disabled{opacity:.6;cursor:progress}\n.g-m-vote.g-m-voted{background:color-mix(in srgb,var(--g-primary) 12%,var(--g-bg));border-color:var(--g-primary);color:var(--g-primary)}\n.g-m-vote-static{cursor:default;background:var(--g-subtle)}\n.g-m-vote-ico{width:16px;height:16px;stroke-width:2.4}\n.g-m-vote-count{font-size:13px;font-weight:700;line-height:1.2}\n.g-m-idea-open{flex:1;min-width:0;border:0;background:transparent;color:var(--g-text);font:inherit;text-align:left;padding:2px 0;cursor:pointer;display:flex;flex-direction:column;gap:6px;border-radius:4px}\n.g-m-idea-open:hover .g-m-idea-title{color:var(--g-primary)}\n.g-m-idea-title{font-weight:600;overflow-wrap:anywhere}\n.g-m-idea-meta{display:flex;align-items:center;gap:8px;flex-wrap:wrap}\n.g-m-idea-pill.g-m-idea-new{background:var(--g-subtle);color:var(--g-muted)}\n.g-m-idea-pill.g-m-idea-under_review{background:#e0e7ff;color:#3730a3}\n.g-m-idea-pill.g-m-idea-planned{background:#dbeafe;color:#1e40af}\n.g-m-idea-pill.g-m-idea-in_progress{background:#fef3c7;color:#92400e}\n.g-m-idea-pill.g-m-idea-released{background:#dcfce7;color:#166534}\n.g-m-idea-pill.g-m-idea-declined{background:#fee2e2;color:#991b1b}\n.g-m-idea-notice{display:flex;flex-direction:column;align-items:flex-start;gap:2px;border:1px solid var(--g-border);background:var(--g-subtle);border-radius:10px;padding:10px 12px;font-size:13px;color:var(--g-text)}\n.g-m-idea-notice .g-m-text-btn{padding:4px 0;min-height:0}\n.g-m-updates-link,.g-m-portal-link{align-self:flex-start;padding-left:0}\n.g-m-portal-link{display:block;margin:0 auto}\n.g-m-idea-detail{gap:12px}\n.g-m-idea-desc,.g-m-idea-note{font-size:14px;overflow-wrap:anywhere}\n.g-m-idea-desc p,.g-m-idea-note p,.g-m-comment-body p{margin:0 0 8px}\n.g-m-idea-desc p:last-child,.g-m-idea-note p:last-child,.g-m-comment-body p:last-child{margin:0}\n.g-m-idea-note{border-left:3px solid var(--g-primary);background:var(--g-subtle);border-radius:6px;padding:8px 10px}\n.g-m-idea-vote{display:flex;flex-direction:column;gap:12px;margin:0}\n.g-m-idea-vote .g-m-vote{min-height:44px}\n.g-m-follow{flex:none;border:1px solid var(--g-border);background:var(--g-bg);color:var(--g-text);font:inherit;font-size:13px;font-weight:600;border-radius:999px;padding:6px 12px;cursor:pointer;min-height:32px}\n.g-m-follow:hover{background:var(--g-subtle)}\n.g-m-follow.g-m-following{border-color:var(--g-primary);color:var(--g-primary)}\n.g-m-follow:disabled{opacity:.6}\n.g-m-seg{display:flex;border:1px solid var(--g-border);border-radius:10px;overflow:hidden}\n.g-m-seg-btn{flex:1;border:0;border-left:1px solid var(--g-border);background:var(--g-bg);color:var(--g-text);font:inherit;font-size:12px;font-weight:600;padding:8px 4px;cursor:pointer;min-height:36px}\n.g-m-seg-btn:first-child{border-left:0}\n.g-m-seg-btn:hover{background:var(--g-subtle)}\n.g-m-seg-btn[aria-checked=\"true\"]{background:var(--g-primary);color:var(--g-primary-text)}\n.g-m-unvote{align-self:flex-start;padding-left:0;color:var(--g-muted)}\n.g-m-comments{display:flex;flex-direction:column;gap:8px}\n.g-m-comments-title{margin:4px 0 0;font-size:14px}\n.g-m-comment-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:10px}\n.g-m-comment{border:1px solid var(--g-border);border-radius:10px;padding:8px 10px;font-size:13px}\n.g-m-comment-team{background:var(--g-subtle);border-color:color-mix(in srgb,var(--g-primary) 35%,var(--g-border))}\n.g-m-comment-meta{gap:6px;margin-bottom:4px}\n.g-m-comment-author{font-weight:600}\n.g-m-comment-body{overflow-wrap:anywhere}\n.g-m-comment-form{display:flex;flex-direction:column;align-items:flex-end;gap:6px}\n.g-m-comment-form textarea{resize:vertical;min-height:56px}\n.g-m-similar:empty{display:none}\n.g-m-similar-box{display:flex;flex-direction:column;gap:6px}\n.g-m-similar-box .g-m-idea-list{margin:0}\n.g-m-update{display:block}\n.g-m-update:disabled{cursor:default}\n.g-m-update:disabled:hover{background:var(--g-bg)}\n`;\n"],"mappings":"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","names":["o","fieldSeq","field","SVG_NS","shortDate","dot","draft"]}