@signalsupport/sdk 0.0.0-stage → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +373 -2
- package/dist/chunks/app-7692BILt.js +2 -0
- package/dist/chunks/app-7692BILt.js.map +1 -0
- package/dist/chunks/constants-ClGbEpjT.js +2 -0
- package/dist/chunks/constants-ClGbEpjT.js.map +1 -0
- package/dist/chunks/support-x7N-k02b.js +4 -0
- package/dist/chunks/support-x7N-k02b.js.map +1 -0
- package/dist/chunks/widget-Bxsz5StK.js +2 -0
- package/dist/chunks/widget-Bxsz5StK.js.map +1 -0
- package/dist/client.d.ts +99 -0
- package/dist/constants.d.ts +2 -0
- package/dist/errors.d.ts +25 -0
- package/dist/evidence.d.ts +87 -0
- package/dist/iife.d.ts +12 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.js +1 -0
- package/dist/model.d.ts +201 -0
- package/dist/react.d.ts +26 -0
- package/dist/react.js +2 -0
- package/dist/react.js.map +1 -0
- package/dist/reporter.d.ts +14 -0
- package/dist/server.d.ts +54 -0
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -0
- package/dist/session.d.ts +29 -0
- package/dist/signal.iife.js +4 -0
- package/dist/signal.iife.js.map +1 -0
- package/dist/support.d.ts +108 -0
- package/dist/trail.d.ts +27 -0
- package/dist/widget/app.d.ts +31 -0
- package/dist/widget/copy.d.ts +104 -0
- package/dist/widget/ctx.d.ts +75 -0
- package/dist/widget/icons.d.ts +38 -0
- package/dist/widget/index.d.ts +111 -0
- package/dist/widget/index.js +1 -0
- package/dist/widget/parts.d.ts +28 -0
- package/dist/widget/pick.d.ts +30 -0
- package/dist/widget/screens/faq.d.ts +8 -0
- package/dist/widget/screens/feedback.d.ts +11 -0
- package/dist/widget/screens/home.d.ts +12 -0
- package/dist/widget/screens/report.d.ts +9 -0
- package/dist/widget/screens/reports.d.ts +26 -0
- package/dist/widget/store.d.ts +31 -0
- package/dist/widget/styles.d.ts +10 -0
- package/dist/widget/theme.d.ts +57 -0
- package/dist/widget/ui.d.ts +58 -0
- package/package.json +73 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal.iife.js","names":["m","k","u","l","C","D","A","i","r","o","e","w","T","d","j","z","s","a","h","v","p","c","B","f","f","n","u","i","r"],"sources":["../src/errors.ts","../src/evidence.ts","../src/session.ts","../src/constants.ts","../src/client.ts","../src/model.ts","../src/reporter.ts","../src/trail.ts","../src/support.ts","../src/widget/copy.ts","../src/widget/ctx.ts","../src/widget/store.ts","../src/widget/theme.ts","../src/widget/parts.ts","../../../node_modules/preact/dist/preact.module.js","../../../node_modules/preact/hooks/dist/hooks.module.js","../../../node_modules/preact/jsx-runtime/dist/jsxRuntime.module.js","../src/widget/icons.tsx","../src/widget/ui.tsx","../src/widget/screens/faq.tsx","../src/widget/screens/feedback.tsx","../src/widget/screens/reports.tsx","../src/widget/screens/home.tsx","../src/widget/screens/report.tsx","../src/widget/pick.ts","../src/widget/styles.ts","../src/widget/app.tsx","../src/widget/index.ts","../src/iife.ts"],"sourcesContent":["/** A refusal the caller can act on, rather than a thrown string. */\nexport class SignalError extends Error {\n readonly code: string;\n readonly status?: number;\n /** The offending field, on a 422. */\n readonly path?: string;\n /** Seconds to wait, on a 429. */\n readonly retryAfter?: number;\n\n constructor(\n code: string,\n message: string,\n opts: { status?: number; path?: string; retryAfter?: number } = {},\n ) {\n super(message);\n this.name = 'SignalError';\n this.code = code;\n this.status = opts.status;\n this.path = opts.path;\n this.retryAfter = opts.retryAfter;\n }\n\n /**\n * Whether trying the same call again could plausibly work.\n *\n * A 422 never can: the body is wrong and will be wrong again. A 401 never\n * can: the key is wrong. Those two are the ones an unattended caller most\n * needs told, because retrying them is how an expensive loop starts.\n */\n get retryable(): boolean {\n return this.status === undefined || this.status === 429 || this.status >= 500;\n }\n}\n\n/** Read Signal's `{ message, data }` / `{ error }` envelope, or throw a SignalError. */\nexport async function readEnvelope<T>(response: Response): Promise<T> {\n const payload = (await response.json().catch(() => null)) as\n | { data?: T; error?: { code?: string; message?: string; path?: string } }\n | null;\n if (!response.ok) {\n const err = payload?.error;\n throw new SignalError(err?.code ?? 'INTERNAL', err?.message ?? `request failed with ${response.status}`, {\n status: response.status,\n path: err?.path,\n retryAfter: Number(response.headers.get('retry-after')) || undefined,\n });\n }\n if (!payload || !('data' in payload)) {\n throw new SignalError('MALFORMED', 'the service answered outside the { message, data } envelope', {\n status: response.status,\n });\n }\n return payload.data as T;\n}\n\nexport function transportError(base: string, cause: unknown): SignalError {\n return new SignalError(\n 'TRANSPORT',\n `could not reach ${base}: ${cause instanceof Error ? cause.message : String(cause)}`,\n );\n}\n","/**\n * What a report can carry besides words, and the reporter's say over each part.\n *\n * # CONSENT IS A DEFAULT YOU CAN SEE, NOT ONE BURIED IN A DOC\n *\n * Screenshot, system, browser, network and the action trail are ON; locale is\n * OFF, because a timezone plus a language narrows a person down a great deal\n * and is never what makes a report actionable. Anything switched off is sent\n * by name in `withheld`, because the console renders \"the reporter declined\n * this\" differently from \"nobody collected this\", and only one of the two is\n * worth asking about.\n */\n\nexport interface Consent {\n /** A screen frame. Only ever one the reporter chose to take. */\n screenshot: boolean;\n /** Platform, device memory, hardware concurrency. */\n system: boolean;\n /** User agent, viewport, pixel ratio. */\n browser: boolean;\n /** Connection type and rough speed, where the browser exposes it. */\n network: boolean;\n /** Timezone and language. OFF by default: it is the one that locates a person. */\n locale: boolean;\n /** The last few things that happened, as the product recorded them. */\n trail: boolean;\n /** The product's own diagnostics (a GPU report, the open project). */\n extra: boolean;\n}\n\n/** The published defaults, exactly. */\nexport const DEFAULT_CONSENT: Readonly<Consent> = Object.freeze({\n screenshot: true,\n system: true,\n browser: true,\n network: true,\n locale: false,\n trail: true,\n extra: true,\n});\n\nexport function resolveConsent(...layers: (Partial<Consent> | undefined)[]): Consent {\n return layers.reduce<Consent>((acc, layer) => (layer ? { ...acc, ...layer } : acc), { ...DEFAULT_CONSENT });\n}\n\ntype Nav = Navigator & {\n userAgentData?: { platform?: string };\n deviceMemory?: number;\n connection?: { effectiveType?: string; downlink?: number; rtt?: number };\n};\n\nconst nav = (): Nav | undefined => (typeof navigator === 'undefined' ? undefined : (navigator as Nav));\nconst win = (): Window | undefined => (typeof window === 'undefined' ? undefined : window);\n\nexport function readSystem(): Record<string, unknown> | undefined {\n const n = nav();\n if (!n) return undefined;\n return { platform: n.userAgentData?.platform ?? n.platform, cores: n.hardwareConcurrency, memory: n.deviceMemory };\n}\n\nexport function readBrowser(): Record<string, unknown> | undefined {\n const n = nav();\n const w = win();\n if (!n || !w) return undefined;\n return { userAgent: n.userAgent, viewport: { width: w.innerWidth, height: w.innerHeight }, pixelRatio: w.devicePixelRatio };\n}\n\nexport function readNetwork(): Record<string, unknown> | undefined {\n const c = nav()?.connection;\n return c ? { effectiveType: c.effectiveType, downlink: c.downlink, rtt: c.rtt } : undefined;\n}\n\nexport function readLocale(): Record<string, unknown> | undefined {\n const n = nav();\n return n ? { language: n.language, timezone: Intl.DateTimeFormat().resolvedOptions().timeZone } : undefined;\n}\n\n/** \"Windows · 8 cores · 16 GB\", for showing the reporter what is about to be sent. */\nexport function describeSystem(s = readSystem()): string {\n if (!s) return 'Not available here';\n return [s.platform, s.cores ? `${String(s.cores)} cores` : null, s.memory ? `${String(s.memory)} GB` : null]\n .filter(Boolean)\n .join(' · ');\n}\n\nexport function describeBrowser(b = readBrowser()): string {\n if (!b) return 'Not available here';\n const ua = String(b.userAgent ?? '');\n const name =\n /Edg\\/(\\d+)/.exec(ua)?.[1] ? `Edge ${/Edg\\/(\\d+)/.exec(ua)![1]}` :\n /Firefox\\/(\\d+)/.exec(ua)?.[1] ? `Firefox ${/Firefox\\/(\\d+)/.exec(ua)![1]}` :\n /Chrome\\/(\\d+)/.exec(ua)?.[1] ? `Chrome ${/Chrome\\/(\\d+)/.exec(ua)![1]}` :\n /Version\\/(\\d+).*Safari/.exec(ua)?.[1] ? `Safari ${/Version\\/(\\d+)/.exec(ua)![1]}` :\n 'Browser';\n const vp = b.viewport as { width: number; height: number } | undefined;\n return vp ? `${name} · ${vp.width}×${vp.height}` : name;\n}\n\n/** Supplied by the host, collected only when the reporter reaches the Attach step. */\nexport type Diagnostics = Record<string, () => unknown | Promise<unknown>>;\n\nexport async function readDiagnostics(d: Diagnostics | undefined): Promise<Record<string, unknown> | undefined> {\n if (!d) return undefined;\n const out: Record<string, unknown> = {};\n for (const [name, read] of Object.entries(d)) {\n try {\n const v = await read();\n if (v !== undefined) out[name] = v;\n } catch (e) {\n // A machine that cannot describe itself must not block a report; that\n // machine is very often the one with the bug worth reporting.\n out[name] = { unavailable: e instanceof Error ? e.message : String(e) };\n }\n }\n return Object.keys(out).length ? out : undefined;\n}\n\nexport interface EvidenceInput {\n /** A frame the reporter chose to take, as a data: URL. */\n screenshot?: string;\n /** A key in the product's own storage, when it uploads frames itself. */\n screenshotKey?: string;\n trail?: unknown;\n extra?: Record<string, unknown>;\n}\n\n/** Collect what consent allows, and name what it does not. */\nexport function collectEvidence(consent: Consent, supplied: EvidenceInput = {}): Record<string, unknown> {\n const withheld: string[] = [];\n const evidence: Record<string, unknown> = {};\n const take = (field: keyof Consent, key: string, value: () => unknown) => {\n if (!consent[field]) {\n withheld.push(field);\n return;\n }\n const v = value();\n if (v !== undefined) evidence[key] = v;\n };\n take('system', 'system', readSystem);\n take('browser', 'browser', readBrowser);\n take('network', 'network', readNetwork);\n take('locale', 'locale', readLocale);\n take('trail', 'trail', () => supplied.trail);\n take('extra', 'extra', () => supplied.extra);\n if (!consent.screenshot) {\n withheld.push('screenshot');\n } else {\n if (supplied.screenshot) evidence.screenshot = supplied.screenshot;\n if (supplied.screenshotKey) evidence.screenshot_key = supplied.screenshotKey;\n }\n evidence.withheld = withheld;\n return evidence;\n}\n\n/* -------------------------------------------------------- one screen frame */\n\nexport const CAPTURE_MAX_EDGE = 1600;\nexport const CAPTURE_QUALITY = 0.72;\n/** Below the service's 2 MB cap with room for base64. */\nexport const CAPTURE_MAX_BYTES = 1_400_000;\n\nexport type CaptureResult =\n | { ok: true; dataUrl: string; width: number; height: number; bytes: number; mime: string }\n | { ok: false; reason: 'unsupported' | 'cancelled' | 'failed'; message: string };\n\n/**\n * Ask the browser for ONE frame of the screen, chosen by the reporter.\n *\n * `getDisplayMedia` always asks the person; this tab is offered first. The\n * stream is stopped as soon as one frame is read, so the \"sharing\" indicator\n * is up for a moment, not for the rest of the session. Downscaled to at most\n * 1600px and re-encoded until it fits under the service's cap.\n *\n * `beforeCapture` / `afterCapture` let the panel step out of its own picture.\n */\n/** Resolve when `p` does, or after `ms` whatever happened (the caller checks what it got). */\nfunction within(p: Promise<unknown>, ms: number): Promise<void> {\n return new Promise((resolve) => {\n const t = setTimeout(resolve, ms);\n p.then(\n () => (clearTimeout(t), resolve()),\n () => (clearTimeout(t), resolve()),\n );\n });\n}\n\n/** One pixel in a corner, all but transparent, changing every frame until stopped. */\nfunction keepPainting(): () => void {\n if (typeof document === 'undefined' || typeof requestAnimationFrame === 'undefined') return () => {};\n const dot = document.createElement('div');\n dot.setAttribute('aria-hidden', 'true');\n dot.style.cssText = 'position:fixed;left:0;top:0;width:1px;height:1px;pointer-events:none;z-index:2147483647;';\n document.body.appendChild(dot);\n let on = true;\n let raf = 0;\n const step = () => {\n on = !on;\n dot.style.background = on ? 'rgba(0,0,0,0.01)' : 'rgba(0,0,0,0.02)';\n raf = requestAnimationFrame(step);\n };\n raf = requestAnimationFrame(step);\n return () => {\n cancelAnimationFrame(raf);\n dot.remove();\n };\n}\n\n/** Wait for `n` new frames from a playing video, or give up after a second (no rVFC, a still page). */\nfunction freshFrames(video: HTMLVideoElement, n: number): Promise<void> {\n const v = video as HTMLVideoElement & { requestVideoFrameCallback?: (cb: () => void) => number };\n if (typeof v.requestVideoFrameCallback !== 'function') return new Promise((r) => setTimeout(r, 150));\n return new Promise((resolve) => {\n const giveUp = setTimeout(resolve, 1000);\n let left = n;\n const tick = () => {\n if (--left <= 0) {\n clearTimeout(giveUp);\n resolve();\n } else v.requestVideoFrameCallback!(tick);\n };\n v.requestVideoFrameCallback!(tick);\n });\n}\n\n/** One frame, downscaled to at most 1600px and re-encoded until it fits under the service's cap. */\nfunction encodeFrame(source: CanvasImageSource, sourceWidth: number, sourceHeight: number): CaptureResult {\n const scale = Math.min(1, CAPTURE_MAX_EDGE / Math.max(sourceWidth, sourceHeight));\n const width = Math.max(1, Math.round(sourceWidth * scale));\n const height = Math.max(1, Math.round(sourceHeight * scale));\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n canvas.getContext('2d')!.drawImage(source, 0, 0, width, height);\n let quality = CAPTURE_QUALITY;\n let dataUrl = canvas.toDataURL('image/webp', quality);\n // Safari encodes webp as png; fall back to jpeg, which every browser has.\n if (!dataUrl.startsWith('data:image/webp')) dataUrl = canvas.toDataURL('image/jpeg', quality);\n while (approxBytes(dataUrl) > CAPTURE_MAX_BYTES && quality > 0.3) {\n quality -= 0.12;\n dataUrl = canvas.toDataURL(dataUrl.startsWith('data:image/webp') ? 'image/webp' : 'image/jpeg', quality);\n }\n const mime = dataUrl.slice(5, dataUrl.indexOf(';'));\n return { ok: true, dataUrl, width, height, bytes: approxBytes(dataUrl), mime };\n}\n\n/**\n * The host's own picture of its own view, in place of `getDisplayMedia`.\n *\n * For a product inside a desktop shell (WebView2, Electron), where the browser's\n * capture opens the shell's own permission dialog, unstyled and often wider than\n * the window. The shell renders its webview itself (`CapturePreview`,\n * `capturePage`) and hands back an image URL; there is no prompt, because it is\n * the product's own pixels taken when the person pressed Capture.\n *\n * Same hide-first contract as `captureScreen`, same encoding, bounded waits.\n */\nexport async function captureFrom(\n source: () => Promise<string>,\n hooks: { beforeCapture?: () => void; afterCapture?: () => void } = {},\n): Promise<CaptureResult> {\n try {\n hooks.beforeCapture?.();\n // Two frames so the page has painted without the bar before the host reads it.\n await new Promise<void>((r) => requestAnimationFrame(() => requestAnimationFrame(() => r())));\n let url = '';\n await within(source().then((u) => void (url = u)), 5000);\n if (!url.startsWith('data:image/') && !url.startsWith('blob:')) {\n throw new Error('The screen could not be captured.');\n }\n const img = new Image();\n img.src = url;\n await img.decode();\n return encodeFrame(img, img.naturalWidth, img.naturalHeight);\n } catch (e) {\n return { ok: false, reason: 'failed', message: e instanceof Error ? e.message : 'The screen could not be captured.' };\n } finally {\n hooks.afterCapture?.();\n }\n}\n\nexport async function captureScreen(hooks: { beforeCapture?: () => void; afterCapture?: () => void } = {}): Promise<CaptureResult> {\n const md = typeof navigator === 'undefined' ? undefined : navigator.mediaDevices;\n if (!md?.getDisplayMedia) {\n return { ok: false, reason: 'unsupported', message: 'This browser cannot capture the screen.' };\n }\n let stream: MediaStream;\n try {\n stream = await md.getDisplayMedia({\n video: { displaySurface: 'browser' } as MediaTrackConstraints,\n audio: false,\n // Chrome: offer this tab first and keep the picker from hiding it.\n preferCurrentTab: true,\n selfBrowserSurface: 'include',\n } as DisplayMediaStreamOptions);\n } catch (e) {\n const name = e instanceof Error ? e.name : '';\n return name === 'NotAllowedError' || name === 'AbortError'\n ? { ok: false, reason: 'cancelled', message: 'Capture was cancelled.' }\n : { ok: false, reason: 'failed', message: e instanceof Error ? e.message : 'The screen could not be captured.' };\n }\n // A tab stream sends a frame only when the page repaints, so on a still\n // page play() can wait forever (measured: the panel never came back). A\n // near-invisible pixel that changes every frame keeps frames coming, and\n // nothing below waits without a limit.\n const pulse = keepPainting();\n try {\n hooks.beforeCapture?.();\n const video = document.createElement('video');\n video.muted = true;\n video.playsInline = true;\n video.srcObject = stream;\n await within(video.play(), 3000);\n if (!video.videoWidth) await within(new Promise((r) => video.addEventListener('loadeddata', r, { once: true })), 3000);\n if (!video.videoWidth) throw new Error('The screen could not be captured: no picture arrived.');\n // Let the page repaint without the panel before the frame is read, then\n // take a frame the stream delivered AFTER that: a fixed wait alone read a\n // frame from before the hide on a heavy page.\n await new Promise((r) => setTimeout(r, 350));\n await freshFrames(video, 2);\n return encodeFrame(video, video.videoWidth, video.videoHeight);\n } catch (e) {\n return { ok: false, reason: 'failed', message: e instanceof Error ? e.message : 'The screen could not be captured.' };\n } finally {\n pulse();\n stream.getTracks().forEach((t) => t.stop());\n hooks.afterCapture?.();\n }\n}\n\nfunction approxBytes(dataUrl: string): number {\n const b64 = dataUrl.slice(dataUrl.indexOf(',') + 1);\n return Math.floor((b64.length * 3) / 4);\n}\n\nexport function formatBytes(n: number): string {\n return n < 1024 ? `${n} B` : n < 1024 * 1024 ? `${Math.round(n / 1024)} KB` : `${(n / 1024 / 1024).toFixed(1)} MB`;\n}\n","/**\n * The reporter session: who this browser is reporting as.\n *\n * The product's SERVER mints it with the secret key (see `./server`) and hands\n * it to the browser; the browser never sees the secret. The SDK asks for one\n * when it first needs it, keeps it until a minute before it expires, and asks\n * again once if the service says it is no longer valid.\n */\n\nexport interface SessionToken {\n /** `rs_…` */\n token: string;\n /** ISO time. Without it the token is kept until the service refuses it. */\n expires_at?: string;\n}\n\n/**\n * Where a session comes from.\n *\n * - a URL on your own server (`'/api/signal/session'`): POSTed with the\n * browser's cookies, answering `{ token, expires_at }`. Anything other than\n * 200 means \"nobody is signed in\", and the panel works anonymously.\n * - a function returning the same, for apps that fetch it their own way.\n */\nexport type SessionSource = string | (() => Promise<SessionToken | string | null | undefined>);\n\nexport interface SessionCache {\n /** The current token, fetching one if needed. Null when nobody is signed in. */\n get(force?: boolean): Promise<string | null>;\n clear(): void;\n}\n\nconst EARLY_MS = 60_000;\n\nexport function createSessionCache(source: SessionSource | undefined, fetchImpl?: typeof fetch): SessionCache {\n let cached: { token: string; expiresAt: number } | null = null;\n let inflight: Promise<string | null> | null = null;\n\n async function fetchOne(): Promise<string | null> {\n if (!source) return null;\n let raw: SessionToken | string | null | undefined;\n if (typeof source === 'function') {\n raw = await source();\n } else {\n const f = fetchImpl ?? globalThis.fetch?.bind(globalThis);\n if (!f) return null;\n const res = await f(source, { method: 'POST', credentials: 'include', headers: { accept: 'application/json' } });\n if (!res.ok) return null;\n const body = (await res.json().catch(() => null)) as\n | (SessionToken & { data?: SessionToken })\n | null;\n raw = body?.data ?? body;\n }\n if (!raw) return null;\n const t = typeof raw === 'string' ? { token: raw } : raw;\n if (!t.token) return null;\n const expiresAt = t.expires_at ? Date.parse(t.expires_at) - EARLY_MS : Number.POSITIVE_INFINITY;\n cached = { token: t.token, expiresAt };\n return t.token;\n }\n\n return {\n async get(force = false) {\n if (!force && cached && Date.now() < cached.expiresAt) return cached.token;\n if (!inflight) {\n inflight = fetchOne()\n .catch(() => null)\n .finally(() => {\n inflight = null;\n });\n }\n return inflight;\n },\n clear() {\n cached = null;\n },\n };\n}\n","/** Signal's hosted API. Every entry defaults to it; each takes `apiBase` to point elsewhere. */\nexport const DEFAULT_API_BASE = 'https://signal-api.character.xyz';\n","import { SignalError, readEnvelope, transportError } from './errors.js';\nimport { collectEvidence, resolveConsent, type Consent } from './evidence.js';\nimport type { Impact, SignalType, Urgency } from './model.js';\nimport { createSessionCache, type SessionCache, type SessionSource } from './session.js';\n\n/**\n * Filing a signal.\n *\n * # THE KEY DECIDES THE SOURCE. THE BODY NEVER DOES.\n *\n * A credential belongs to exactly one source, so the service reads the source\n * off the key (or the reporter session) and the request body cannot name one.\n * `product` is accepted because it is useful for telling apart two call sites\n * that share a key, and it travels in `source_context`, where it cannot change\n * which source a signal is filed against.\n */\n\nexport type ReporterKind = 'person' | 'monitor' | 'agent';\n\nexport interface SignalUser {\n /** The product's own id for this person. Signal never mints one. */\n id?: string;\n name?: string;\n email?: string;\n}\n\nimport { DEFAULT_API_BASE } from './constants.js';\n\nexport { DEFAULT_API_BASE };\n\nexport interface InitOptions {\n /**\n * The publishable key (`sig_pub_…`) in a browser, or a secret key (`sig_live_…`) on a\n * server. Optional when `session` is given: a signed-in person files through\n * their session instead.\n */\n key?: string;\n /**\n * Your server's route that mints a reporter session (see `./server`), or a\n * function returning one. With it, reports are filed as the signed-in person\n * and they can see and follow them; without it, reports are anonymous.\n */\n session?: SessionSource;\n /** Where the API lives. Defaults to Signal's hosted service. */\n apiBase?: string;\n /** A LABEL, not the source. Travels in `source_context`. */\n product?: string;\n /** Who is reporting, when there is no session. */\n user?: SignalUser;\n consent?: Partial<Consent>;\n /** Attached to every report as `source_context`: where, which build, which project. */\n context?: Record<string, unknown>;\n /** Injected by tests. Defaults to the platform `fetch`. */\n fetchImpl?: typeof fetch;\n}\n\nexport interface ReportInput {\n type?: SignalType;\n subject: string;\n body?: string;\n impact?: Impact;\n urgency?: Urgency;\n reporter?: SignalUser;\n /** person | monitor | agent. Software is a first-class reporter. */\n reporterKind?: ReporterKind;\n /** One frame the reporter chose to take, as a data: URL (see `captureScreen`). */\n screenshot?: string;\n /** A key in your own storage, when you upload frames yourself. */\n screenshotKey?: string;\n /** The last few things that happened (see `createTrail`). */\n trail?: unknown;\n /** Your own diagnostics. */\n extra?: Record<string, unknown>;\n consent?: Partial<Consent>;\n context?: Record<string, unknown>;\n /**\n * Safe to retry with. Generated when omitted, so a dropped connection mid-POST\n * cannot file the same report twice: the duplicate a reporter would SEE.\n */\n idempotencyKey?: string;\n}\n\nexport interface ReportResult {\n id: string;\n as_of: string;\n}\n\nexport class SignalClient {\n private options: InitOptions | null = null;\n private sessionCache: SessionCache | null = null;\n\n init(options: InitOptions): this {\n if (!options?.key && !options?.session) {\n throw new SignalError(\n 'CONFIG',\n 'Signal.init needs a key (sig_pub_ in a browser, sig_live_ on a server) or a session source.',\n );\n }\n // A secret key in a browser is the mistake this class of credential exists\n // to prevent, and it is worth saying at the moment somebody makes it.\n if (typeof window !== 'undefined' && options.key?.startsWith('sig_live_')) {\n console.warn(\n '[signal] a sig_live_ key is a SERVER credential and anyone can read it in a browser bundle. Use a sig_pub_ key here.',\n );\n }\n this.options = options;\n this.sessionCache = createSessionCache(options.session, options.fetchImpl);\n return this;\n }\n\n /** Change who is reporting, without re-initialising. */\n setUser(user: SignalUser | null): this {\n if (!this.options) throw notInitialised();\n this.options = { ...this.options, user: user ?? undefined };\n return this;\n }\n\n /** Merge into the context sent with every report. */\n setContext(context: Record<string, unknown>): this {\n if (!this.options) throw notInitialised();\n this.options = { ...this.options, context: { ...this.options.context, ...context } };\n return this;\n }\n\n get initialised(): boolean {\n return this.options !== null;\n }\n\n get apiBase(): string {\n return (this.options?.apiBase ?? DEFAULT_API_BASE).replace(/\\/+$/, '');\n }\n\n /** The session cache, shared with the reporter API. */\n get session(): SessionCache {\n if (!this.sessionCache) throw notInitialised();\n return this.sessionCache;\n }\n\n async report(input: ReportInput): Promise<ReportResult> {\n const options = this.options;\n if (!options) throw notInitialised();\n if (!input?.subject?.trim()) {\n throw new SignalError('VALIDATION', 'a signal needs a subject', { path: 'subject', status: 422 });\n }\n\n const consent = resolveConsent(options.consent, input.consent);\n const reporter = { ...options.user, ...input.reporter };\n const context = {\n ...(options.product ? { product: options.product } : {}),\n ...options.context,\n ...input.context,\n };\n\n const body = {\n // Defaults chosen so the smallest useful call is `report({ subject })`.\n // Impact and urgency default to the middle of each scale: a client that\n // could set priority would set P1 every time, which is why the service\n // derives it from these two and never reads a priority.\n type: input.type ?? 'incident',\n subject: input.subject.trim(),\n body: input.body ?? '',\n impact: input.impact ?? 'moderate',\n urgency: input.urgency ?? 'medium',\n reporter: {\n external_id: reporter.id ?? null,\n name: reporter.name ?? 'Anonymous',\n email: reporter.email ?? null,\n },\n reporter_kind: input.reporterKind ?? 'person',\n evidence: collectEvidence(consent, {\n screenshot: input.screenshot,\n screenshotKey: input.screenshotKey,\n trail: input.trail,\n extra: input.extra,\n }),\n ...(Object.keys(context).length ? { source_context: context } : {}),\n };\n\n const fetchImpl = options.fetchImpl ?? globalThis.fetch?.bind(globalThis);\n if (!fetchImpl) {\n throw new SignalError('CONFIG', 'no fetch is available; pass fetchImpl on a runtime without one');\n }\n\n // A signed-in person files through their session, so the report is theirs\n // and they can follow it. Anyone else files with the key, anonymously.\n const sessionToken = options.session ? await this.session.get() : null;\n const credential = sessionToken ?? options.key;\n if (!credential) {\n throw new SignalError('NO_SESSION', 'nobody is signed in, and no publishable key was given for anonymous reports', {\n status: 401,\n });\n }\n\n const base = this.apiBase;\n const idempotencyKey = input.idempotencyKey ?? newIdempotencyKey();\n const send = (token: string) =>\n fetchImpl(`${base}/v1/intake/signal`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${token}`,\n 'x-idempotency-key': idempotencyKey,\n },\n body: JSON.stringify(body),\n });\n\n let response: Response;\n try {\n response = await send(credential);\n // The session lapsed between being read and being used: ask once more.\n if (response.status === 401 && sessionToken) {\n const fresh = await this.session.get(true);\n if (fresh) response = await send(fresh);\n }\n } catch (cause) {\n // No status at all: the request never completed. Retryable, and said so,\n // because this is the case a caller most wants to distinguish.\n throw transportError(base, cause);\n }\n\n const data = await readEnvelope<ReportResult>(response);\n if (!data?.id) {\n throw new SignalError('MALFORMED', 'the service answered outside the { message, data } envelope', {\n status: response.status,\n });\n }\n return data;\n }\n}\n\nfunction notInitialised(): SignalError {\n return new SignalError('CONFIG', 'call Signal.init({ key }) before reporting');\n}\n\nexport function newIdempotencyKey(): string {\n const c = globalThis.crypto;\n if (c?.randomUUID) return c.randomUUID();\n return `idem_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n}\n\n/**\n * The default instance, which is what the published snippet uses: an install\n * has one key and one product. `createClient()` is there for a server\n * reporting on behalf of several sources.\n */\nexport const Signal = new SignalClient();\n\nexport function createClient(options: InitOptions): SignalClient {\n return new SignalClient().init(options);\n}\n","/**\n * What a report means to the person who filed it.\n *\n * Signal's statuses are written for the team working the queue. A reporter\n * needs the same facts from the other side of the table: \"someone is reading\n * it\", not \"triage\"; \"fixed, check it on your machine\", not \"resolved\". Every\n * rule here is pure and unit-tested, because a status machine enforced inside\n * a click handler is a status machine with one path per button.\n */\n\nexport type SignalType = 'incident' | 'request' | 'feedback';\nexport type Impact = 'extensive' | 'significant' | 'moderate' | 'minor';\nexport type Urgency = 'critical' | 'high' | 'medium' | 'low';\nexport type SignalStatus =\n | 'triage'\n | 'open'\n | 'in_progress'\n | 'waiting_user'\n | 'fix_pending_release'\n | 'deferred'\n | 'resolved'\n | 'rejected'\n | 'under_review'\n | 'planned'\n | 'shipped'\n | 'declined';\n\nexport type Tone = 'neutral' | 'accent' | 'info' | 'warn' | 'danger' | 'success';\n\n/** One of the reporter's own signals, as `GET /v1/reporter/signals` returns it. */\nexport interface ReporterReport {\n id: string;\n ref: string;\n type: SignalType;\n subject: string;\n body: string;\n status: SignalStatus;\n disposition: string | null;\n fixed_in_version: string | null;\n verified_at: string | null;\n reopens: number;\n source_context: Record<string, unknown> | null;\n created_at: string;\n updated_at: string;\n team_replies: number;\n last_team_reply_at: string | null;\n /**\n * The first time somebody on the team opened it. Separate from `status`: a\n * person looking is not a decision about the report. Absent from a Signal\n * that predates it, so read as \"not yet\".\n *\n * Never WHO: the team speaks as one, as it does in its replies. Signal\n * 0.14.0-alpha.1 briefly sent `read_by_name`; it is ignored if present.\n */\n read_at?: string | null;\n}\n\nexport type ReporterEvent =\n | { kind: 'status'; from: SignalStatus | null; to: SignalStatus; at: string; by: 'you' | 'team' }\n | { kind: 'reply'; body: string; at: string; by: 'you' | 'team'; author_name: string };\n\n/**\n * One line of the conversation as the panel draws it: the server's timeline,\n * plus the moment the team first read the report. The read is a field on the\n * report rather than a timeline event, so a panel that predates it is not\n * handed a kind it cannot draw.\n */\nexport type ThreadItem = ReporterEvent | { kind: 'read'; at: string; by: 'team'; name: string | null };\n\nexport interface ReporterReportDetail extends ReporterReport {\n timeline: ReporterEvent[];\n attached: { screenshot: boolean; system: boolean; browser: boolean; trail: boolean; extra: boolean };\n}\n\n/* ------------------------------------------------------------------ journey */\n\n/**\n * The stages a report walks through, as a person would describe them.\n *\n * ⚠ THE LAST STAGE IS THE REPORTER'S, AND DRAWING IT IS THE POINT. The anxiety\n * behind every bug report is \"does this go anywhere\", so the path is shown\n * before anything is filed and again on every report, with the final node\n * belonging to the person reading it.\n */\nexport const DEFECT_STAGES = ['Sent', 'Read', 'Accepted', 'Fixed', 'You check'] as const;\nexport const FEEDBACK_STAGES = ['Sent', 'Read', 'Planned', 'Shipped'] as const;\n\nexport interface StatusView {\n /** Short, for a pill. */\n label: string;\n /** One sentence, written for the reporter: what this state means for THEM. */\n blurb: string;\n tone: Tone;\n stages: readonly string[];\n /** Index into `stages`. */\n stage: number;\n /** Work is happening at this stage right now, so its marker can pulse. */\n active: boolean;\n /** Left the happy path (not taken, duplicate). The rail stops rather than implying a fix. */\n offPath: boolean;\n /** Still able to change, from the reporter's point of view. */\n open: boolean;\n /** Something is waiting on the reporter. Only this badges. */\n needsYou: boolean;\n}\n\n/**\n * Compare two version strings, segment by segment.\n *\n * ⚠ A STRING COMPARE IS WRONG HERE AND WOULD LOOK RIGHT FOR A YEAR. \"0.9.0\"\n * sorts above \"0.24.0\" lexically, so someone on 0.24.0 would be told to update\n * to an older build, and the check would never appear on the reports already\n * fixed for them. A missing segment reads as 0.\n */\nexport function compareVersions(a: string, b: string): number {\n const parse = (v: string): number[] =>\n v\n .trim()\n .replace(/^v/i, '')\n .split(/[.+-]/)\n .map((p) => Number.parseInt(p, 10))\n .filter((n) => Number.isFinite(n));\n const pa = parse(a);\n const pb = parse(b);\n for (let i = 0; i < Math.max(pa.length, pb.length); i++) {\n const d = (pa[i] ?? 0) - (pb[i] ?? 0);\n if (d !== 0) return d < 0 ? -1 : 1;\n }\n return 0;\n}\n\n/**\n * May the reporter confirm the fix on the build they are running?\n *\n * ⚠ ONLY ONCE THEY ACTUALLY HAVE IT. A \"yes, it works\" given on the broken\n * build is worse than none: afterwards it looks exactly like a real one. With\n * no fixed version named, or no running version known, the reporter is the\n * best judge, so they are asked.\n */\nexport function canVerify(r: ReporterReport, runningVersion?: string): boolean {\n if (r.status !== 'resolved' || r.verified_at || !isFixed(r)) return false;\n if (!r.fixed_in_version || !runningVersion) return true;\n return compareVersions(runningVersion, r.fixed_in_version) >= 0;\n}\n\n/** Fixed, but the reporter is still on an older build. */\nexport function awaitingUpdate(r: ReporterReport, runningVersion?: string): boolean {\n return (\n r.status === 'resolved' &&\n !r.verified_at &&\n isFixed(r) &&\n !!r.fixed_in_version &&\n !!runningVersion &&\n compareVersions(runningVersion, r.fixed_in_version) < 0\n );\n}\n\nfunction isFixed(r: ReporterReport): boolean {\n return r.disposition === null || r.disposition === 'fixed';\n}\n\n/** Closed for a reason other than a fix, said the way a person would. */\nconst CLOSED_BECAUSE: Record<string, { label: string; blurb: string; tone: Tone }> = {\n by_design: { label: 'Working as intended', blurb: 'The team looked, and this is how it is meant to work. The reply below says why.', tone: 'neutral' },\n workaround: { label: 'Workaround given', blurb: 'There is a way around this for now. The reply below has it.', tone: 'info' },\n answered: { label: 'Answered', blurb: 'The team answered this. The reply is below.', tone: 'success' },\n cannot_reproduce: { label: 'Could not reproduce', blurb: 'The team could not make it happen. If it happens again, reply with what you did.', tone: 'neutral' },\n wont_fix: { label: 'Not being fixed', blurb: 'The team decided not to change this. The reply below says why.', tone: 'neutral' },\n out_of_scope: { label: 'Out of scope', blurb: 'This is outside what the product covers.', tone: 'neutral' },\n insufficient_info: { label: 'Needs more detail', blurb: 'There was not enough to go on. Reporting it again with steps will reopen the conversation.', tone: 'warn' },\n duplicate: { label: 'Already reported', blurb: 'The same thing is tracked on another report, so the work happens there.', tone: 'neutral' },\n spam: { label: 'Closed', blurb: 'This report was closed.', tone: 'neutral' },\n test: { label: 'Closed', blurb: 'This was a test report.', tone: 'neutral' },\n withdrawn: { label: 'Withdrawn', blurb: 'You withdrew this report, so the team is no longer working on it. If it comes back, report it again.', tone: 'neutral' },\n};\n\n/**\n * Whether the reporter may still take this report back. Not once it is\n * closed, and not while its fix is on its way: by then the work is done and\n * the useful next step is checking it.\n */\nexport function canWithdraw(r: ReporterReport): boolean {\n return statusView(r).open && r.status !== 'fix_pending_release';\n}\n\nexport function statusView(r: ReporterReport, runningVersion?: string): StatusView {\n if (r.type === 'feedback') return feedbackView(r);\n const base = { stages: DEFECT_STAGES, active: false, offPath: false, open: true, needsYou: false };\n const fixedIn = r.fixed_in_version ? ` in ${r.fixed_in_version}` : '';\n switch (r.status) {\n case 'triage':\n if (r.team_replies > 0) {\n return { ...base, label: 'Being read', blurb: 'Someone on the team is reading this now.', tone: 'info', stage: 1, active: true };\n }\n if (r.read_at) {\n return { ...base, label: 'Read', blurb: 'Someone on the team has read it. Next, they decide what happens with it.', tone: 'info', stage: 1 };\n }\n return { ...base, label: 'Received', blurb: 'The team has your report. Nobody has picked it up yet.', tone: 'info', stage: 0 };\n case 'open':\n return { ...base, label: r.reopens > 0 ? 'Reopened' : 'Accepted', blurb: r.reopens > 0 ? 'You told the team it is still wrong, so it went back on the list.' : 'Taken as a real issue. It is on the list to fix.', tone: r.reopens > 0 ? 'warn' : 'accent', stage: 2 };\n case 'in_progress':\n return { ...base, label: 'Being fixed', blurb: 'Someone is working on this right now.', tone: 'accent', stage: 2, active: true };\n case 'waiting_user':\n return { ...base, label: 'Waiting for you', blurb: 'The team asked you something. Reply below and it goes straight back to them.', tone: 'warn', stage: 2, needsYou: true };\n case 'deferred':\n return { ...base, label: 'On hold', blurb: 'Accepted, but not being worked on right now.', tone: 'neutral', stage: 2 };\n case 'fix_pending_release':\n return { ...base, label: 'Fixed, shipping soon', blurb: `The fix is done and goes out${fixedIn}. You will be asked to check it once you have it.`, tone: 'success', stage: 3 };\n case 'resolved': {\n if (r.verified_at) {\n return { ...base, label: 'Closed, you confirmed it', blurb: 'You confirmed the fix on your own machine. Thank you.', tone: 'success', stage: 4, open: false };\n }\n if (!isFixed(r)) {\n const why = CLOSED_BECAUSE[r.disposition ?? ''] ?? CLOSED_BECAUSE.answered!;\n return { ...base, ...why, stage: 1, offPath: true, open: false };\n }\n if (awaitingUpdate(r, runningVersion)) {\n return { ...base, label: `Fixed${fixedIn}`, blurb: `Fixed${fixedIn}; you are on ${runningVersion}. Update, and this will ask you to check it.`, tone: 'success', stage: 3 };\n }\n return { ...base, label: 'Fixed: check it', blurb: 'The team believes this is fixed. Try what went wrong and tell them what you find.', tone: 'success', stage: 4, needsYou: true };\n }\n case 'rejected': {\n const why = CLOSED_BECAUSE[r.disposition ?? ''] ?? { label: 'Not taken', blurb: 'The team is not treating this as a bug. The reply below says why.', tone: 'danger' as Tone };\n return { ...base, ...why, stage: 1, offPath: true, open: false };\n }\n default:\n return feedbackView(r);\n }\n}\n\nfunction feedbackView(r: ReporterReport): StatusView {\n const base = { stages: FEEDBACK_STAGES, active: false, offPath: false, open: true, needsYou: false };\n if (r.disposition === 'withdrawn') return { ...base, ...CLOSED_BECAUSE.withdrawn!, stage: 1, offPath: true, open: false };\n switch (r.status) {\n case 'under_review':\n return { ...base, label: 'Being read', blurb: 'The team is reading this.', tone: 'info', stage: 1, active: true };\n case 'planned':\n return { ...base, label: 'Planned', blurb: 'This is on the plan.', tone: 'accent', stage: 2 };\n case 'in_progress':\n return { ...base, label: 'Being built', blurb: 'Someone is building this now.', tone: 'accent', stage: 2, active: true };\n case 'shipped':\n return { ...base, label: 'Shipped', blurb: 'This is out. Thank you for asking for it.', tone: 'success', stage: 3, open: false };\n case 'declined':\n return { ...base, label: 'Not planned', blurb: 'The team decided not to build this. The reply below says why.', tone: 'neutral', stage: 1, offPath: true, open: false };\n case 'deferred':\n return { ...base, label: 'Later', blurb: 'Not now, but not forgotten.', tone: 'neutral', stage: 1 };\n default:\n return r.read_at\n ? { ...base, label: 'Read', blurb: 'Someone on the team has read it.', tone: 'info', stage: 1 }\n : { ...base, label: 'Received', blurb: 'The team has your feedback.', tone: 'info', stage: 0 };\n }\n}\n\n/**\n * The conversation in the order things happened, with the team's first read\n * placed where it fell. Accepting a report usually follows reading it within\n * minutes, and without this line the two arrive as one.\n *\n * A read recorded AFTER the team had already acted is left out: the action\n * already said somebody looked, and \"Accepted\" followed by \"Read\" reads as\n * nonsense. It happens to reports acted on before reads were recorded.\n */\nexport function threadOf(d: ReporterReportDetail): ThreadItem[] {\n const items: ThreadItem[] = [...d.timeline];\n if (!d.read_at) return items;\n const at = Date.parse(d.read_at);\n if (items.some((e) => e.by === 'team' && Date.parse(e.at) < at)) return items;\n const read: ThreadItem = { kind: 'read', at: d.read_at, by: 'team', name: null };\n // After what came before it (the filing, at least), and ahead of an action\n // taken in the same instant: acting on a report records the read with it.\n const i = items.findIndex((e) => Date.parse(e.at) >= at);\n items.splice(i < 0 ? items.length : i, 0, read);\n return items;\n}\n\n/** The read line, said from the reporter's side. */\nexport function readWords(name: string | null): string {\n return name ? `Read by ${name}` : 'Read by the team';\n}\n\n/* ------------------------------------------------------------ what you send */\n\nexport type Severity = 'blocking' | 'major' | 'minor' | 'cosmetic';\n\n/**\n * How much a problem is holding the reporter up, in their words, and what the\n * team's queue needs from it. The team's priority is derived from impact and\n * urgency on the server; a reporter is never asked for a priority, because\n * every reporter would pick the top one.\n */\nexport const SEVERITY: Record<Severity, { label: string; hint: string; tone: Tone; impact: Impact; urgency: Urgency }> = {\n blocking: { label: 'Blocks me', hint: 'I cannot carry on working', tone: 'danger', impact: 'moderate', urgency: 'critical' },\n major: { label: 'Major', hint: 'A real problem, I have a workaround', tone: 'warn', impact: 'moderate', urgency: 'high' },\n minor: { label: 'Minor', hint: 'Annoying, but small', tone: 'info', impact: 'minor', urgency: 'medium' },\n cosmetic: { label: 'Cosmetic', hint: 'It just looks wrong', tone: 'neutral', impact: 'minor', urgency: 'low' },\n};\n\nexport type FeedbackKind = 'idea' | 'praise' | 'confusing' | 'complaint';\n\nexport const FEEDBACK_KINDS: Record<FeedbackKind, { label: string; hint: string }> = {\n idea: { label: 'An idea', hint: 'Something you wish this did' },\n praise: { label: 'This works well', hint: 'Tell us what to protect' },\n confusing: { label: 'This confused me', hint: 'You could not tell what it would do' },\n complaint: { label: 'This frustrates me', hint: 'It works, and it is painful' },\n};\n\nexport const MIN_DESCRIPTION = 12;\n\n/**\n * Which field stops a report being sent, if any.\n *\n * Names the field rather than returning a boolean, because \"Submit is disabled\n * and I cannot see why\" is the most common way a form wastes someone's time.\n */\nexport function validateIssue(d: { what: string; expected: string }): { field: 'what' | 'expected'; message: string } | null {\n if (d.what.trim().length < MIN_DESCRIPTION) {\n return { field: 'what', message: 'Say what happened. A sentence is enough, but one word is not.' };\n }\n if (d.expected.trim().length < MIN_DESCRIPTION) {\n return { field: 'expected', message: 'Say what you expected instead. This is the half that says what to build.' };\n }\n return null;\n}\n\n/** Open reports above closed ones whatever their age: the list exists to be acted on. */\nexport function sortReports<T extends ReporterReport>(reports: readonly T[], runningVersion?: string): T[] {\n return [...reports].sort((a, b) => {\n const va = statusView(a, runningVersion);\n const vb = statusView(b, runningVersion);\n if (va.needsYou !== vb.needsYou) return va.needsYou ? -1 : 1;\n if (va.open !== vb.open) return va.open ? -1 : 1;\n return Date.parse(b.created_at) - Date.parse(a.created_at);\n });\n}\n\n/** \"3m ago\". One phrasing for every duration on the panel. */\nexport function formatAgo(then: string | number, now = Date.now()): string {\n const t = typeof then === 'number' ? then : Date.parse(then);\n const s = Math.max(0, Math.round((now - t) / 1000));\n if (s < 10) return 'just now';\n if (s < 60) return `${s}s ago`;\n const m = Math.round(s / 60);\n if (m < 60) return `${m}m ago`;\n const h = Math.round(m / 60);\n if (h < 24) return `${h}h ago`;\n return `${Math.round(h / 24)}d ago`;\n}\n\n/**\n * One status move, said from the reporter's side.\n *\n * The same move reads differently depending on who made it and where it came\n * from: the reporter's own filing is \"you sent this\", not \"received by you\";\n * answering the team's question is \"back with the team\", not \"accepted by you\".\n */\nexport function eventWords(e: { from: SignalStatus | null; to: SignalStatus; by: 'you' | 'team' }): string {\n if (e.by === 'you') {\n if (!e.from) return 'You sent this';\n if (e.from === 'resolved' || e.from === 'shipped') return 'You reopened it';\n if (e.from === 'waiting_user') return 'Back with the team after your reply';\n if (e.to === 'rejected' || e.to === 'declined' || e.to === 'resolved') return 'You withdrew it';\n return 'You moved it';\n }\n if (e.to === 'open' && (e.from === 'resolved' || e.from === 'rejected')) return 'Reopened';\n return TEAM_WORDS[e.to] ?? e.to;\n}\n\nconst TEAM_WORDS: Partial<Record<SignalStatus, string>> = {\n triage: 'Received',\n open: 'Accepted',\n in_progress: 'Being worked on',\n waiting_user: 'The team is waiting for you',\n fix_pending_release: 'Fixed, shipping soon',\n deferred: 'On hold',\n resolved: 'Marked fixed',\n rejected: 'Closed',\n under_review: 'Being read',\n planned: 'Planned',\n shipped: 'Shipped',\n declined: 'Not planned',\n};\n\n/**\n * A report's body as the parts it was written in: the SDK files \"What\n * happened\" and \"Expected instead\" as labelled blocks, and other producers\n * send free text, which comes back as one unlabelled part.\n */\nexport function reportParts(body: string): { label: string | null; text: string }[] {\n return body\n .split(/\\n{2,}/)\n .map((block) => {\n const [first, ...rest] = block.split('\\n');\n return rest.length && /^(What happened|Expected instead)$/.test(first!.trim())\n ? { label: first!.trim(), text: rest.join('\\n').trim() }\n : { label: null, text: block.trim() };\n })\n .filter((p) => p.text);\n}\n","import { SignalError, readEnvelope, transportError } from './errors.js';\nimport type { ReporterReport, ReporterReportDetail } from './model.js';\nimport type { SessionCache } from './session.js';\n\n/**\n * The reporter's own reports, through their session: list, read, reply, and\n * say whether a fix works. Nothing here can reach anyone else's.\n */\nexport interface ReporterApi {\n list(): Promise<ReporterReport[]>;\n get(id: string): Promise<ReporterReportDetail>;\n reply(id: string, body: string): Promise<ReporterReportDetail>;\n verify(id: string, works: boolean, note?: string): Promise<ReporterReportDetail>;\n withdraw(id: string, note?: string): Promise<ReporterReportDetail>;\n}\n\nexport function createReporterApi(base: string, session: SessionCache, fetchImpl?: typeof fetch): ReporterApi {\n const f = () => {\n const impl = fetchImpl ?? globalThis.fetch?.bind(globalThis);\n if (!impl) throw new SignalError('CONFIG', 'no fetch is available; pass fetchImpl on a runtime without one');\n return impl;\n };\n\n async function call<T>(method: string, path: string, body?: unknown, retried = false): Promise<T> {\n const token = await session.get(retried);\n if (!token) {\n throw new SignalError('NO_SESSION', 'nobody is signed in, so there are no reports to read', { status: 401 });\n }\n let res: Response;\n try {\n res = await f()(`${base}${path}`, {\n method,\n headers: {\n authorization: `Bearer ${token}`,\n accept: 'application/json',\n ...(body !== undefined ? { 'content-type': 'application/json' } : {}),\n },\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n } catch (cause) {\n throw transportError(base, cause);\n }\n // An expired or revoked session: ask the product's server once more.\n if (res.status === 401 && !retried) return call<T>(method, path, body, true);\n return readEnvelope<T>(res);\n }\n\n return {\n list: () => call<ReporterReport[]>('GET', '/v1/reporter/signals'),\n get: (id) => call<ReporterReportDetail>('GET', `/v1/reporter/signals/${encodeURIComponent(id)}`),\n reply: (id, body) =>\n call<ReporterReportDetail>('POST', `/v1/reporter/signals/${encodeURIComponent(id)}/replies`, { body }),\n verify: (id, works, note) =>\n call<ReporterReportDetail>('POST', `/v1/reporter/signals/${encodeURIComponent(id)}/verify`, {\n works,\n ...(note ? { note } : {}),\n }),\n withdraw: (id, note) =>\n call<ReporterReportDetail>('POST', `/v1/reporter/signals/${encodeURIComponent(id)}/withdraw`, note ? { note } : {}),\n };\n}\n","/**\n * The last few things that happened, kept in memory and attached to a report\n * only if the reporter keeps it.\n *\n * ⚠ IT ONLY OBSERVES. The error hooks append a line and do nothing else: they\n * never swallow, never `preventDefault`, and never send anything anywhere. A\n * listener that quietly transmitted would break the promise the report form\n * makes on its own Attach step, and would be the first thing someone found in\n * their DevTools.\n */\n\nexport type TrailKind = 'click' | 'navigate' | 'edit' | 'error' | 'note' | (string & {});\n\nexport interface TrailEntry {\n /** Epoch milliseconds. */\n at: number;\n kind: TrailKind;\n label: string;\n}\n\nexport interface Trail {\n record(kind: TrailKind, label: string, at?: number): void;\n /** The most recent `count`, oldest first. */\n recent(count?: number): TrailEntry[];\n size(): number;\n clear(): void;\n /** Put uncaught errors and unhandled rejections into the trail. Returns the undo. */\n captureErrors(target?: Window): () => void;\n}\n\nexport function createTrail(capacity = 60): Trail {\n const ring: TrailEntry[] = [];\n return {\n record(kind, label, at = Date.now()) {\n const text = String(label).trim().slice(0, 300);\n if (!text) return;\n // An edit repeated in a burst is one thing the person did, not forty.\n const last = ring[ring.length - 1];\n if (last && last.kind === kind && last.label === text && at - last.at < 1500) {\n last.at = at;\n return;\n }\n ring.push({ at, kind, label: text });\n if (ring.length > capacity) ring.splice(0, ring.length - capacity);\n },\n recent(count = 10) {\n return ring.slice(-count).map((e) => ({ ...e }));\n },\n size: () => ring.length,\n clear() {\n ring.length = 0;\n },\n captureErrors(target = typeof window === 'undefined' ? undefined : window) {\n if (!target) return () => {};\n const onError = (e: ErrorEvent) => this.record('error', e.message || 'Uncaught error');\n const onRejection = (e: PromiseRejectionEvent) => {\n const r = e.reason as { message?: string } | string | undefined;\n this.record('error', typeof r === 'string' ? r : (r?.message ?? 'Unhandled promise rejection'));\n };\n target.addEventListener('error', onError);\n target.addEventListener('unhandledrejection', onRejection);\n return () => {\n target.removeEventListener('error', onError);\n target.removeEventListener('unhandledrejection', onRejection);\n };\n },\n };\n}\n","import { SignalClient, type InitOptions } from './client.js';\nimport { SignalError } from './errors.js';\nimport {\n readBrowser,\n readDiagnostics,\n readSystem,\n type Consent,\n type Diagnostics,\n} from './evidence.js';\nimport {\n FEEDBACK_KINDS,\n SEVERITY,\n sortReports,\n statusView,\n type FeedbackKind,\n type ReporterReport,\n type ReporterReportDetail,\n type Severity,\n} from './model.js';\nimport { createReporterApi, type ReporterApi } from './reporter.js';\nimport { createTrail, type Trail, type TrailEntry } from './trail.js';\n\n/**\n * Support, without a UI.\n *\n * Everything the panel does, as plain functions and one subscribable state, so\n * a product can draw its own panel and still get the whole loop: file with\n * evidence, follow the report, read and answer the team, and confirm the fix.\n * The widget (`@signalsupport/sdk/widget`) is built on exactly this.\n */\n\nexport interface SupportConfig extends InitOptions {\n /**\n * The build the person is running. Sent with every report, and what decides\n * whether \"does the fix work?\" can be asked yet.\n */\n appVersion?: string;\n /** Your own diagnostics, read only when the reporter reaches the Attach step. */\n diagnostics?: Diagnostics;\n /** Pass your own trail to share it, or `false` to keep none. */\n trail?: Trail | false;\n /** Put uncaught errors in the trail. Observes only; never reports by itself. Default true. */\n captureErrors?: boolean;\n /** How often to refresh the reporter's reports while the page is visible. Default 2 minutes. */\n refreshMs?: number;\n}\n\nexport interface SupportState {\n /** Null until known. False means reports are anonymous and cannot be followed. */\n signedIn: boolean | null;\n loading: boolean;\n reports: ReporterReport[];\n /** Reports wanting something from the reporter, or carrying an unread team reply. */\n attention: number;\n error: string | null;\n /** When the reports were last fetched successfully (ms since epoch), for \"Updated 12s ago\". */\n updatedAt: number | null;\n}\n\nexport interface IssueDraft {\n what: string;\n expected: string;\n severity: Severity;\n /** Where in the product. Prefilled from the context's `area`. */\n area?: string;\n screenshot?: string;\n /** What the reporter chose to attach, after seeing it. */\n include?: Partial<Pick<Consent, 'system' | 'browser' | 'trail' | 'extra' | 'screenshot'>>;\n /** For an anonymous report: how to reach them, if they want to be reached. */\n contact?: { name?: string; email?: string };\n}\n\nexport interface FeedbackDraft {\n kind: FeedbackKind;\n body: string;\n area?: string;\n screenshot?: string;\n contact?: { name?: string; email?: string };\n}\n\n/** What the Attach step shows, read when the reporter gets there and not before. */\nexport interface Collected {\n system?: Record<string, unknown>;\n browser?: Record<string, unknown>;\n trail: TrailEntry[];\n extra?: Record<string, unknown>;\n}\n\nexport interface Support {\n readonly client: SignalClient;\n readonly reporter: ReporterApi;\n readonly trail: Trail;\n readonly appVersion?: string;\n getState(): SupportState;\n subscribe(listener: (state: SupportState) => void): () => void;\n refresh(): Promise<void>;\n context(): Record<string, unknown>;\n setContext(context: Record<string, unknown>): void;\n /** Record something the person did, for the trail a report may carry. */\n record(kind: string, label: string): void;\n collect(): Promise<Collected>;\n submitIssue(draft: IssueDraft): Promise<{ id: string; ref: string }>;\n submitFeedback(draft: FeedbackDraft): Promise<{ id: string; ref: string }>;\n detail(id: string): Promise<ReporterReportDetail>;\n reply(id: string, body: string): Promise<ReporterReportDetail>;\n verify(id: string, works: boolean, note?: string): Promise<ReporterReportDetail>;\n /**\n * Take a report back: it sorted itself out, or they no longer need it. A\n * close, never a delete; the team keeps the report and sees why.\n */\n withdraw(id: string, note?: string): Promise<ReporterReportDetail>;\n /** Whether a report carries a team reply this browser has not opened. */\n unread(report: ReporterReport): boolean;\n markSeen(id: string): void;\n destroy(): void;\n}\n\n/** The short reference a person can quote: the tail of the id, as the service derives it. */\nexport function refOf(id: string): string {\n return `SG-${id.slice(-6).toUpperCase()}`;\n}\n\nconst SEEN_KEY = 'signal.seen.v1';\n\nexport function createSupport(config: SupportConfig): Support {\n const client = new SignalClient().init({\n ...config,\n context: { ...(config.appVersion ? { app_version: config.appVersion } : {}), ...config.context },\n });\n const reporter = createReporterApi(client.apiBase, client.session, config.fetchImpl);\n const trail = config.trail === false ? createTrail(0) : (config.trail ?? createTrail());\n const releaseErrors = config.captureErrors === false ? () => {} : trail.captureErrors();\n let ctx: Record<string, unknown> = { ...config.context };\n let seen: Record<string, number> = readSeen();\n\n let state: SupportState = { signedIn: config.session ? null : false, loading: false, reports: [], attention: 0, error: null, updatedAt: null };\n const listeners = new Set<(s: SupportState) => void>();\n const set = (patch: Partial<SupportState>) => {\n state = { ...state, ...patch };\n state.attention = attentionOf(state.reports);\n for (const l of listeners) l(state);\n };\n\n function attentionOf(reports: ReporterReport[]): number {\n return reports.filter((r) => statusView(r, config.appVersion).needsYou || unread(r)).length;\n }\n\n function unread(r: ReporterReport): boolean {\n if (!r.last_team_reply_at) return false;\n return Date.parse(r.last_team_reply_at) > (seen[r.id] ?? 0);\n }\n\n let lastRefresh = 0;\n async function refresh(): Promise<void> {\n if (!config.session) return;\n lastRefresh = Date.now();\n set({ loading: true });\n try {\n const token = await client.session.get();\n if (!token) {\n set({ signedIn: false, loading: false, reports: [], error: null });\n return;\n }\n const reports = await reporter.list();\n set({ signedIn: true, loading: false, reports: sortReports(reports, config.appVersion), error: null, updatedAt: Date.now() });\n } catch (e) {\n // A session that lapsed and could not be renewed means the person signed\n // out of the host product: their reports go with them, exactly as when\n // there was never a session, or the next person at this browser sees them.\n const signedOut = e instanceof SignalError && e.code === 'NO_SESSION';\n if (signedOut) set({ signedIn: false, loading: false, reports: [], error: null });\n else set({ loading: false, error: messageOf(e) });\n }\n }\n\n // Keep the badge honest while the panel is closed: a fix the team just\n // shipped should light it without anyone opening anything.\n let timer: ReturnType<typeof setInterval> | null = null;\n const onVisible = () => {\n if (document.visibilityState === 'visible') void refresh();\n };\n // ⚠ FOCUS, NOT ONLY VISIBILITY. The usual way a reporter learns something\n // changed is by acting somewhere else (the team's console in another window,\n // side by side) and coming back. The page never stopped being visible, so\n // visibilitychange never fires; the window regaining focus is the moment.\n // Throttled, because focus also bounces on every alt-tab.\n const onFocus = () => {\n if (Date.now() - lastRefresh > 5_000) void refresh();\n };\n if (config.session && typeof window !== 'undefined') {\n void refresh();\n timer = setInterval(() => {\n if (document.visibilityState === 'visible') void refresh();\n }, config.refreshMs ?? 120_000);\n document.addEventListener('visibilitychange', onVisible);\n window.addEventListener('focus', onFocus);\n }\n\n function upsert(d: ReporterReportDetail) {\n const { timeline: _t, attached: _a, ...row } = d;\n const rest = state.reports.filter((r) => r.id !== row.id);\n set({ reports: sortReports([row, ...rest], config.appVersion) });\n }\n\n const context = () => ({ ...ctx });\n\n return {\n client,\n reporter,\n trail,\n appVersion: config.appVersion,\n getState: () => state,\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n refresh,\n context,\n setContext(next) {\n ctx = { ...ctx, ...next };\n },\n record: (kind, label) => trail.record(kind, label),\n async collect() {\n return {\n system: readSystem(),\n browser: readBrowser(),\n trail: trail.recent(10),\n extra: await readDiagnostics(config.diagnostics),\n };\n },\n async submitIssue(draft) {\n const s = SEVERITY[draft.severity];\n const include = { system: true, browser: true, trail: true, extra: true, screenshot: true, ...draft.include };\n const collected = include.extra ? await readDiagnostics(config.diagnostics) : undefined;\n const area = draft.area?.trim() || (ctx.area as string | undefined);\n const res = await client.report({\n type: 'incident',\n subject: firstLine(draft.what),\n body: `What happened\\n${draft.what.trim()}\\n\\nExpected instead\\n${draft.expected.trim()}`,\n impact: s.impact,\n urgency: s.urgency,\n reporter: draft.contact,\n screenshot: include.screenshot ? draft.screenshot : undefined,\n trail: include.trail ? trail.recent(10) : undefined,\n extra: collected,\n consent: { system: include.system, browser: include.browser, trail: include.trail, extra: include.extra, screenshot: include.screenshot },\n context: { ...ctx, ...(area ? { area } : {}), severity: draft.severity },\n });\n trail.record('note', `Reported an issue (${refOf(res.id)})`);\n void refresh();\n return { id: res.id, ref: refOf(res.id) };\n },\n async submitFeedback(draft) {\n const area = draft.area?.trim() || (ctx.area as string | undefined);\n const res = await client.report({\n type: 'feedback',\n subject: `${FEEDBACK_KINDS[draft.kind].label}: ${firstLine(draft.body, 100)}`,\n body: draft.body.trim(),\n impact: 'minor',\n urgency: 'low',\n reporter: draft.contact,\n screenshot: draft.screenshot,\n consent: { trail: false, extra: false },\n context: { ...ctx, ...(area ? { area } : {}), feedback_kind: draft.kind },\n });\n void refresh();\n return { id: res.id, ref: refOf(res.id) };\n },\n async detail(id) {\n const d = await reporter.get(id);\n upsert(d);\n return d;\n },\n async reply(id, body) {\n const d = await reporter.reply(id, body);\n upsert(d);\n return d;\n },\n async verify(id, works, note) {\n const d = await reporter.verify(id, works, note);\n trail.record('note', works ? `Confirmed the fix for ${refOf(id)}` : `Said ${refOf(id)} is still happening`);\n upsert(d);\n return d;\n },\n async withdraw(id, note) {\n const d = await reporter.withdraw(id, note);\n trail.record('note', `Withdrew ${refOf(id)}`);\n upsert(d);\n return d;\n },\n unread,\n markSeen(id) {\n seen = { ...seen, [id]: Date.now() };\n try {\n localStorage.setItem(SEEN_KEY, JSON.stringify(seen));\n } catch {\n // Without storage the unread mark lasts for this page.\n }\n set({});\n },\n destroy() {\n releaseErrors();\n if (timer) clearInterval(timer);\n if (typeof document !== 'undefined') document.removeEventListener('visibilitychange', onVisible);\n if (typeof window !== 'undefined') window.removeEventListener('focus', onFocus);\n listeners.clear();\n },\n };\n}\n\nfunction readSeen(): Record<string, number> {\n try {\n const raw = JSON.parse(localStorage.getItem(SEEN_KEY) ?? '{}') as unknown;\n return raw && typeof raw === 'object' ? (raw as Record<string, number>) : {};\n } catch {\n return {};\n }\n}\n\nfunction firstLine(text: string, max = 120): string {\n const line = text.trim().split(/\\r?\\n/)[0] ?? '';\n return line.length > max ? `${line.slice(0, max - 1).trimEnd()}…` : line;\n}\n\nfunction messageOf(e: unknown): string {\n return e instanceof Error ? e.message : String(e);\n}\n","/**\n * Every word the panel says, overridable one at a time.\n *\n * Written from the reporter's side of the table. A product can rename\n * anything to fit its voice (\"Help\" instead of \"Support\", \"Ticket\" instead of\n * \"Report\") without touching layout.\n */\nexport const DEFAULT_COPY = {\n launcher: 'Help',\n title: 'Support',\n homeTitle: 'How can we help?',\n reportAction: 'Report an issue',\n reportHint: 'Something is broken or does the wrong thing',\n feedbackAction: 'Share feedback',\n feedbackHint: 'An idea, a frustration, or something that works well',\n faqAction: 'Browse the FAQs',\n faqHint: 'Answers to what people ask most',\n yourReports: 'Your reports',\n refresh: 'Check for updates',\n updatedAgo: 'Updated {ago}',\n upToDate: 'Up to date',\n seeAll: 'See all',\n signedOutReports: 'Sign in to follow your reports here.',\n fixesWaitingOne: 'A fix for one of your reports is ready. It needs your check.',\n fixesWaitingMany: 'Fixes for {n} of your reports are ready. They need your check.',\n questionWaiting: 'The team asked you something.',\n\n stepDescribe: 'Describe',\n stepAttach: 'Attach',\n stepReview: 'Review',\n whatLabel: 'What happened?',\n whatHint: 'What you did, and what the product did. Plain words are perfect.',\n whatPlaceholder: 'I selected three items and pressed Delete. Only one went away.',\n expectedLabel: 'What did you expect instead?',\n expectedHint: 'This is the half that says what to build. Two lines is plenty.',\n expectedPlaceholder: 'All three should have been deleted, the way they are from the menu.',\n severityLabel: 'How much is it holding you up?',\n whereLabel: 'Where in the product?',\n whereHint: 'Filled in from where you are. Change it if the problem is elsewhere.',\n attachIntro: 'Attach as much or as little as you like. Everything is shown before it is sent, and nothing is collected in the background.',\n screenshot: 'Screen capture',\n screenshotNone: 'Not captured. You choose what to share; this tab is offered first.',\n capture: 'Capture screen',\n retake: 'Retake',\n capturing: 'Capturing…',\n pickHint: 'Go to the screen you want to show',\n pickCapture: 'Capture',\n system: 'System and browser',\n trail: 'Your last steps',\n trailNone: 'Nothing recorded yet.',\n diagnostics: 'Diagnostics from the product',\n contactLabel: 'How can the team reach you?',\n contactHint: 'Optional. Without it, the team cannot reply to you.',\n namePlaceholder: 'Your name',\n emailPlaceholder: 'you@example.com',\n attached: 'Attached',\n notAttached: 'not attached',\n next: 'Next',\n back: 'Back',\n cancel: 'Cancel',\n submitReport: 'Send report',\n reportSent: 'Report sent',\n reportSentBody: 'You can follow it from here. When the team believes it is fixed, this is where you will be asked to check it.',\n reportSentAnon: 'Keep this reference. Quote it if you contact the team about this.',\n track: 'Follow this report',\n done: 'Done',\n\n feedbackKindLabel: 'What kind of feedback?',\n feedbackLabel: 'Tell us',\n feedbackPlaceholder: 'What you would change, and why it matters to you.',\n sendFeedback: 'Send feedback',\n thanks: 'Thank you',\n thanksBody: 'Feedback is read, and it is what decides what gets built next.',\n\n faqSearch: 'Search the FAQs',\n faqEmpty: 'Nothing matches.',\n faqNotFound: 'Did not find it?',\n\n allReports: 'All reports',\n noReports: 'Nothing reported yet',\n noReportsBody: 'When something does not behave the way you expect, this is where it goes, and where you watch what happens to it.',\n conversation: 'Conversation',\n replyPlaceholder: 'Reply to the team',\n send: 'Send',\n closedNote: 'This report is closed. Reporting it again opens a new one.',\n withdrawAction: 'Withdraw this report',\n withdrawTitle: 'Withdraw this report?',\n withdrawBody: 'The team stops working on it. This cannot be undone, but you can always report it again.',\n withdrawPlaceholder: 'Anything the team should know? (optional)',\n withdrawConfirm: 'Withdraw',\n withdrawKeep: 'Keep it',\n closedReports: 'Closed',\n nothingOpen: 'Nothing open right now.',\n verifyTitle: 'This should be fixed in the build you are running.',\n verifyBody: 'Try what went wrong and tell the team what you find. The report stays open until you do.',\n verifyYes: 'Yes, it works now',\n verifyNo: 'No, still happening',\n verifyNoPlaceholder: 'What is still happening? Anything that changed since you reported it helps.',\n verifySend: 'Send',\n updateTitle: 'Fixed in {version}. You are on {running}.',\n updateBody: 'Update to get the fix, then this report will ask you to check it.',\n whatYouReported: 'What you reported',\n team: 'Team',\n you: 'You',\n error: 'Something went wrong. Try again.',\n};\n\nexport type Copy = typeof DEFAULT_COPY;\n\nexport function fill(text: string, vars: Record<string, string | number>): string {\n return text.replace(/\\{(\\w+)\\}/g, (_, k: string) => String(vars[k] ?? `{${k}}`));\n}\n","import type { CaptureResult } from '../evidence.js';\nimport type { Support, SupportState } from '../support.js';\nimport type { Copy } from './copy.js';\n\nexport interface FaqItem {\n q: string;\n a: string;\n /** Extra words the search should match. */\n tags?: string[];\n}\n\nexport interface Features {\n report: boolean;\n feedback: boolean;\n faq: boolean;\n /** \"Your reports\". Needs a session; hidden when nobody is signed in. */\n reports: boolean;\n /** Offer a screen capture in the report and feedback forms. */\n screenshot: boolean;\n}\n\nexport type Screen =\n | { name: 'home' }\n | { name: 'report' }\n | { name: 'feedback' }\n | { name: 'faq' }\n | { name: 'reports' }\n | { name: 'detail'; id: string }\n | { name: 'sent'; id: string; ref: string }\n | { name: 'thanks' };\n\nexport type View = 'home' | 'report' | 'feedback' | 'faq' | 'reports';\n\n/**\n * Where a host's own content can go. Each is a native `<slot>`: what the host\n * puts there stays in ITS document, so its own CSS and its own framework\n * render it.\n */\nexport type SlotName = 'header' | 'home-top' | 'home-bottom' | 'report-top' | 'feedback-top' | 'sent' | 'footer';\nexport const SLOT_NAMES: readonly SlotName[] = ['header', 'home-top', 'home-bottom', 'report-top', 'feedback-top', 'sent', 'footer'];\n\n/** An extra entry under \"How can we help?\": a status page, a community, a sales line. */\nexport interface HomeAction {\n label: string;\n hint?: string;\n /** A built-in icon name (`external`, `book`, `message`, …) or an image URL. */\n icon?: string;\n /** Opened in a new tab. */\n href?: string;\n /** Called on press. The panel stays open; call the widget's `close()` to leave it. */\n onClick?: () => void;\n}\n\n/** What every screen is handed. */\nexport interface Ctx {\n support: Support;\n state: SupportState;\n /** Changes when the person asks for fresh data; a screen with its own copy reloads on it. */\n tick: number;\n copy: Copy;\n features: Features;\n faq: FaqItem[];\n actions: HomeAction[];\n /** The slots the host has filled; an empty one renders nothing, not a gap. */\n slots: ReadonlySet<string>;\n appVersion?: string;\n go: (screen: Screen) => void;\n /** Take one frame, stepping the panel out of its own picture. */\n capture: () => Promise<CaptureResult>;\n emit: (event: 'submitted' | 'verified' | 'withdrawn', detail: unknown) => void;\n}\n","import type { Screen } from './ctx.js';\nimport type { ThemeInput } from './theme.js';\n\n/**\n * The panel's own state, outside Preact.\n *\n * ⚠ IT LIVES IN THE SMALL SHELL, NOT IN THE PANEL CHUNK. The panel is loaded\n * lazily (see `index.ts`), and a product can call `open()` before that chunk\n * has arrived. Keeping the state here means the call is remembered and the\n * panel opens where it was asked to the moment it renders.\n */\n\nexport type Layout = 'drawer' | 'modal' | 'popover' | 'sheet';\n\nexport interface UiState {\n open: boolean;\n history: Screen[];\n /** Bumped per open: every open starts fresh, never mid-way through an abandoned form. */\n session: number;\n hidden: boolean;\n /** Capture mode: the panel is stepped aside (still mounted) and the capture bar is up. See `pick.ts`. */\n picking: boolean;\n theme: ThemeInput | undefined;\n /** Slot names the host has filled, so the panel only makes room for those. */\n slots: string[];\n /** Bumped by the refresh button: a screen holding its own copy (a report) reloads on it. */\n tick: number;\n}\n\nexport interface UiStore {\n get(): UiState;\n set(patch: Partial<UiState>): void;\n subscribe(fn: () => void): () => void;\n}\n\nexport function createUiStore(initial: UiState): UiStore {\n let state = initial;\n const listeners = new Set<() => void>();\n return {\n get: () => state,\n set(patch) {\n state = { ...state, ...patch };\n for (const l of listeners) l();\n },\n subscribe(fn) {\n listeners.add(fn);\n return () => listeners.delete(fn);\n },\n };\n}\n","/**\n * How the panel looks, as data.\n *\n * A theme is a set of tokens, and every pixel of the panel is drawn from them,\n * so a brand changes the whole thing by naming a few colours. Presets cover\n * the common kinds of product; anything not named falls back to the preset.\n * `scheme: 'auto'` follows the operating system and switches live.\n */\n\nexport interface Theme {\n /** `auto` follows the operating system. */\n scheme: 'dark' | 'light' | 'auto';\n /** The brand colour: primary buttons, the active step, focus. */\n accent: string;\n /** Text on the accent. */\n accentText: string;\n /** The panel itself. */\n background: string;\n /** Cards and inputs on the panel. */\n surface: string;\n /** A card on a card, hover. */\n raised: string;\n border: string;\n text: string;\n muted: string;\n dim: string;\n success: string;\n warning: string;\n danger: string;\n info: string;\n /** Corner radius of cards, in px. Buttons and inputs follow it. */\n radius: number;\n /** `inherit` uses the product's own font, which is usually what looks native. */\n font: string;\n mono: string;\n /** Base text size, in px. */\n fontSize: number;\n /** Panel width for the drawer and popover, in px. */\n width: number;\n shadow: string;\n /** The dimming behind a drawer, modal or sheet. */\n scrim: string;\n}\n\nexport type PresetName = 'midnight' | 'daylight' | 'studio' | 'paper';\n\nconst BASE = {\n radius: 12,\n font: 'inherit',\n mono: 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',\n fontSize: 13,\n width: 440,\n};\n\n/** Dark and neutral, for tools people stare at all day. */\nconst midnight: Theme = {\n ...BASE,\n scheme: 'dark',\n accent: '#6d5efc',\n accentText: '#ffffff',\n background: '#0e1017',\n surface: '#151824',\n raised: '#1c2030',\n border: 'rgba(255,255,255,0.09)',\n text: '#eef1f8',\n muted: '#a3abc0',\n dim: '#7f889d',\n success: '#3ccf91',\n warning: '#f5a524',\n danger: '#ff5a6a',\n info: '#4fb8ff',\n shadow: '0 24px 70px -20px rgba(0,0,0,0.75)',\n scrim: 'rgba(4,5,10,0.55)',\n};\n\n/** Light and quiet, for SaaS and marketing sites. */\nconst daylight: Theme = {\n ...BASE,\n scheme: 'light',\n accent: '#2563eb',\n accentText: '#ffffff',\n background: '#ffffff',\n surface: '#f6f7f9',\n raised: '#eef0f4',\n border: 'rgba(15,23,42,0.11)',\n text: '#0f172a',\n muted: '#475569',\n dim: '#64748b',\n success: '#15803d',\n warning: '#b45309',\n danger: '#dc2626',\n info: '#0369a1',\n shadow: '0 24px 60px -24px rgba(15,23,42,0.35)',\n scrim: 'rgba(15,23,42,0.35)',\n};\n\n/** Creative tools: deep, saturated, compact. Close to Character XYZ. */\nconst studio: Theme = {\n ...BASE,\n scheme: 'dark',\n accent: '#7a50dd',\n accentText: '#ffffff',\n background: '#0d0b12',\n surface: '#15121d',\n raised: '#1d1927',\n border: 'rgba(255,255,255,0.08)',\n text: '#f3f0fa',\n muted: '#b4abc8',\n dim: '#8a819e',\n success: '#34d399',\n warning: '#fbbf24',\n danger: '#fb7185',\n info: '#a78bfa',\n radius: 10,\n fontSize: 12.5,\n width: 480,\n shadow: '-24px 0 60px -20px rgba(0,0,0,0.9)',\n scrim: 'rgba(0,0,0,0.55)',\n};\n\n/** Warm and editorial, for consumer apps and content products. */\nconst paper: Theme = {\n ...BASE,\n scheme: 'light',\n accent: '#c2410c',\n accentText: '#ffffff',\n background: '#fffdf8',\n surface: '#f7f2e8',\n raised: '#efe8da',\n border: 'rgba(68,48,20,0.14)',\n text: '#2b2118',\n muted: '#5c4b3a',\n dim: '#7a6754',\n success: '#3f7d3a',\n warning: '#a16207',\n danger: '#b91c1c',\n info: '#1d4ed8',\n radius: 18,\n fontSize: 14,\n width: 420,\n shadow: '0 30px 60px -30px rgba(68,48,20,0.45)',\n scrim: 'rgba(43,33,24,0.3)',\n};\n\nexport const PRESETS: Record<PresetName, Theme> = { midnight, daylight, studio, paper };\n\nexport type ThemeInput = PresetName | (Partial<Theme> & { preset?: PresetName });\n\n/**\n * The theme to draw with, right now.\n *\n * With `scheme: 'auto'` the colours come from the dark or light preset\n * matching the system, and only the brand colours the caller named carry\n * across, so a single `accent` produces a good panel in both.\n */\nexport function resolveTheme(input: ThemeInput | undefined, prefersDark: boolean): Theme {\n const spec = typeof input === 'string' ? { preset: input } : (input ?? {});\n const base = PRESETS[spec.preset ?? 'midnight'];\n const merged: Theme = { ...base, ...stripUndefined(spec) };\n if (merged.scheme !== 'auto') return merged;\n const scheme = prefersDark ? midnight : daylight;\n // Only what the caller named survives a scheme switch; everything else is\n // the matching preset, so text and surfaces always contrast.\n return { ...scheme, ...BASE, ...pick(spec, ['accent', 'accentText', 'radius', 'font', 'mono', 'fontSize', 'width']), scheme: 'auto' };\n}\n\nfunction stripUndefined<T extends object>(o: T): Partial<T> {\n return Object.fromEntries(Object.entries(o).filter(([k, v]) => v !== undefined && k !== 'preset')) as Partial<T>;\n}\n\nfunction pick<T extends object>(o: T, keys: string[]): Partial<T> {\n return Object.fromEntries(Object.entries(o).filter(([k, v]) => keys.includes(k) && v !== undefined)) as Partial<T>;\n}\n\n/** The theme as CSS custom properties on the panel's root. */\nexport function themeVars(t: Theme): string {\n const r = t.radius;\n return [\n `--sg-accent:${t.accent}`,\n `--sg-accent-text:${t.accentText}`,\n `--sg-bg:${t.background}`,\n `--sg-surface:${t.surface}`,\n `--sg-raised:${t.raised}`,\n `--sg-border:${t.border}`,\n `--sg-text:${t.text}`,\n `--sg-muted:${t.muted}`,\n `--sg-dim:${t.dim}`,\n `--sg-success:${t.success}`,\n `--sg-warning:${t.warning}`,\n `--sg-danger:${t.danger}`,\n `--sg-info:${t.info}`,\n `--sg-radius:${r}px`,\n `--sg-radius-sm:${Math.max(4, Math.round(r * 0.6))}px`,\n `--sg-font:${t.font}`,\n `--sg-mono:${t.mono}`,\n `--sg-size:${t.fontSize}px`,\n `--sg-width:${t.width}px`,\n `--sg-shadow:${t.shadow}`,\n `--sg-scrim:${t.scrim}`,\n `color-scheme:${t.scheme === 'light' ? 'light' : t.scheme === 'dark' ? 'dark' : 'light dark'}`,\n ].join(';');\n}\n","/**\n * The panel's PUBLIC styling surface: which internal elements are exposed to\n * the host page as `::part()` names.\n *\n * ```css\n * [data-signal-support]::part(launcher) { border-radius: 8px; }\n * [data-signal-support]::part(button-primary):hover { filter: none; }\n * ```\n *\n * ⚠ THE PART NAMES ARE THE CONTRACT; THE `sg-` CLASSES ARE NOT. Classes get\n * renamed when a screen is reworked. A part name only ever gains members, and\n * removing one is a breaking change to the package. That is why this is one\n * table, applied from one place, rather than a `part=` typed by hand on each\n * element: the next screen inherits it without anyone remembering to.\n *\n * `::part()` cannot be followed by an attribute selector, so states a host may\n * want to style differently get a part of their own (`chip-selected`,\n * `message-you`).\n */\nexport const PARTS: Record<string, string> = {\n 'sg-launcher': 'launcher',\n 'sg-pickbar': 'capture-bar',\n 'sg-badge': 'badge',\n 'sg-scrim': 'scrim',\n 'sg-panel': 'panel',\n 'sg-header': 'header',\n 'sg-title': 'title',\n 'sg-sub': 'subtitle',\n 'sg-iconbtn': 'icon-button',\n 'sg-body': 'body',\n 'sg-footer': 'footer',\n 'sg-section': 'section',\n 'sg-section-title': 'section-title',\n 'sg-action': 'action',\n 'sg-action-label': 'action-label',\n 'sg-action-hint': 'action-hint',\n 'sg-tile': 'tile',\n 'sg-btn': 'button',\n 'sg-btn-ghost': 'button-ghost',\n 'sg-btn-danger': 'button-danger',\n 'sg-link': 'link',\n 'sg-label': 'label',\n 'sg-hint': 'hint',\n 'sg-err': 'error',\n 'sg-input': 'input',\n 'sg-textarea': 'textarea',\n 'sg-chip': 'chip',\n 'sg-switch': 'switch',\n 'sg-pill': 'pill',\n 'sg-banner': 'banner',\n 'sg-card': 'card',\n 'sg-steps': 'steps',\n 'sg-row': 'row',\n 'sg-row-title': 'row-title',\n 'sg-rail': 'rail',\n 'sg-msg': 'message',\n 'sg-team': 'message-team',\n 'sg-you': 'message-you',\n 'sg-composer': 'composer',\n 'sg-faq': 'faq-item',\n 'sg-confirm': 'confirmation',\n 'sg-ref': 'reference',\n};\n\n/** The part names one element carries, from its classes and its state. */\nexport function partsFor(el: Element): string {\n const out: string[] = [];\n for (const c of el.classList) {\n const p = PARTS[c];\n if (p) out.push(p);\n }\n if (el.classList.contains('sg-btn') && !el.classList.contains('sg-btn-ghost') && !el.classList.contains('sg-btn-danger')) {\n out.push('button-primary');\n }\n if (el.classList.contains('sg-chip') && (el.getAttribute('aria-checked') === 'true' || el.getAttribute('aria-pressed') === 'true')) {\n out.push('chip-selected');\n }\n return out.join(' ');\n}\n\nfunction stamp(el: Element): void {\n const parts = partsFor(el);\n if (parts) {\n if (el.getAttribute('part') !== parts) el.setAttribute('part', parts);\n } else if (el.hasAttribute('part')) {\n el.removeAttribute('part');\n }\n}\n\n/**\n * Keep every element's `part` in step with its classes for the life of the\n * panel. Preact re-renders change classes and aria state in place, so this\n * watches those attributes as well as new elements.\n */\nexport function exposeParts(root: ShadowRoot): () => void {\n const walk = (node: Node) => {\n if (node instanceof Element) {\n stamp(node);\n for (const el of node.querySelectorAll('[class]')) stamp(el);\n }\n };\n for (const child of root.children) walk(child);\n const observer = new MutationObserver((records) => {\n for (const r of records) {\n if (r.type === 'attributes') stamp(r.target as Element);\n else for (const n of r.addedNodes) walk(n);\n }\n });\n observer.observe(root, { subtree: true, childList: true, attributes: true, attributeFilter: ['class', 'aria-checked', 'aria-pressed'] });\n return () => observer.disconnect();\n}\n","var n,l,u,t,i,r,o,e,f,c,a,s,h,p,v,y,d={},w=[],_=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,g=Array.isArray;function m(n,l){for(var u in l)n[u]=l[u];return n}function b(n){n&&n.parentNode&&n.parentNode.removeChild(n)}function k(l,u,t){var i,r,o,e={};for(o in u)\"key\"==o?i=u[o]:\"ref\"==o?r=u[o]:e[o]=u[o];if(arguments.length>2&&(e.children=arguments.length>3?n.call(arguments,2):t),\"function\"==typeof l&&null!=l.defaultProps)for(o in l.defaultProps)void 0===e[o]&&(e[o]=l.defaultProps[o]);return x(l,e,i,r,null)}function x(n,t,i,r,o){var e={type:n,props:t,key:i,ref:r,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:null==o?++u:o,__i:-1,__u:0};return null==o&&null!=l.vnode&&l.vnode(e),e}function M(){return{current:null}}function S(n){return n.children}function C(n,l){this.props=n,this.context=l}function $(n,l){if(null==l)return n.__?$(n.__,n.__i+1):null;for(var u;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e)return u.__e;return\"function\"==typeof n.type?$(n):null}function I(n){if(n.__P&&n.__d){var u=n.__v,t=u.__e,i=[],r=[],o=m({},u);o.__v=u.__v+1,l.vnode&&l.vnode(o),q(n.__P,o,u,n.__n,n.__P.namespaceURI,32&u.__u?[t]:null,i,null==t?$(u):t,!!(32&u.__u),r),o.__v=u.__v,o.__.__k[o.__i]=o,D(i,o,r),u.__e=u.__=null,o.__e!=t&&P(o)}}function P(n){if(null!=(n=n.__)&&null!=n.__c)return n.__e=n.__c.base=null,n.__k.some(function(l){if(null!=l&&null!=l.__e)return n.__e=n.__c.base=l.__e}),P(n)}function A(n){(!n.__d&&(n.__d=!0)&&i.push(n)&&!H.__r++||r!=l.debounceRendering)&&((r=l.debounceRendering)||o)(H)}function H(){try{for(var n,l=1;i.length;)i.length>l&&i.sort(e),n=i.shift(),l=i.length,I(n)}finally{i.length=H.__r=0}}function L(n,l,u,t,i,r,o,e,f,c,a){var s,h,p,v,y,_,g=t&&t.__k||w,m=l.length;for(f=T(u,l,g,f,m),s=0;s<m;s++)null!=(p=u.__k[s])&&(h=-1!=p.__i&&g[p.__i]||d,p.__i=s,_=q(n,p,h,i,r,o,e,f,c,a),v=p.__e,p.ref&&h.ref!=p.ref&&(h.ref&&J(h.ref,null,p),a.push(p.ref,p.__c||v,p)),null==y&&null!=v&&(y=v),4&p.__u?(f=j(p,f,n),h.__e&&(h.__e=null)):\"function\"==typeof p.type&&void 0!==_?f=_:v&&(f=v.nextSibling),p.__u&=-7);return u.__e=y,f}function T(n,l,u,t,i){var r,o,e,f,c,a=u.length,s=a,h=0;for(n.__k=new Array(i),r=0;r<i;r++)null!=(o=l[r])&&\"boolean\"!=typeof o&&\"function\"!=typeof o?(\"string\"==typeof o||\"number\"==typeof o||\"bigint\"==typeof o||o.constructor==String?o=n.__k[r]=x(null,o,null,null,null):g(o)?o=n.__k[r]=x(S,{children:o},null,null,null):void 0===o.constructor&&o.__b>0?o=n.__k[r]=x(o.type,o.props,o.key,o.ref?o.ref:null,o.__v):n.__k[r]=o,f=r+h,o.__=n,o.__b=n.__b+1,e=null,-1!=(c=o.__i=O(o,u,f,s))&&(s--,(e=u[c])&&(e.__u|=2)),null==e||null==e.__v?(-1==c&&(i>a?h--:i<a&&h++),\"function\"!=typeof o.type&&(o.__u|=4)):c!=f&&(c==f-1?h--:c==f+1?h++:(c>f?h--:h++,o.__u|=4))):n.__k[r]=null;if(s)for(r=0;r<a;r++)null!=(e=u[r])&&0==(2&e.__u)&&(e.__e==t&&(t=$(e)),K(e,e));return t}function j(n,l,u){var t,i;if(\"function\"==typeof n.type){for(t=n.__k,i=0;t&&i<t.length;i++)t[i]&&(t[i].__=n,l=j(t[i],l,u));return l}n.__e!=l&&(l&&n.type&&!l.parentNode&&(l=$(n)),l=u.insertBefore(n.__e,l||null));do{l=l&&l.nextSibling}while(null!=l&&8==l.nodeType);return l}function F(n,l){return l=l||[],null==n||\"boolean\"==typeof n||(g(n)?n.some(function(n){F(n,l)}):l.push(n)),l}function O(n,l,u,t){var i,r,o,e=n.key,f=n.type,c=l[u],a=null!=c&&0==(2&c.__u);if(null===c&&null==e||a&&e==c.key&&f==c.type)return u;if(t>(a?1:0))for(i=u-1,r=u+1;i>=0||r<l.length;)if(null!=(c=l[o=i>=0?i--:r++])&&0==(2&c.__u)&&e==c.key&&f==c.type)return o;return-1}function z(n,l,u){\"-\"==l[0]?n.setProperty(l,null==u?\"\":u):n[l]=null==u?\"\":\"number\"!=typeof u||_.test(l)?u:u+\"px\"}function N(n,l,u,t,i){var r,o;n:if(\"style\"==l)if(\"string\"==typeof u)n.style.cssText=u;else{if(\"string\"==typeof t&&(n.style.cssText=t=\"\"),t)for(l in t)u&&l in u||z(n.style,l,\"\");if(u)for(l in u)t&&u[l]==t[l]||z(n.style,l,u[l])}else if(\"o\"==l[0]&&\"n\"==l[1])r=l!=(l=l.replace(s,\"$1\")),o=l.toLowerCase(),l=o in n||\"onFocusOut\"==l||\"onFocusIn\"==l?o.slice(2):l.slice(2),n.l||(n.l={}),n.l[l+r]=u,u?t?u[a]=t[a]:(u[a]=h,n.addEventListener(l,r?v:p,r)):n.removeEventListener(l,r?v:p,r);else{if(\"http://www.w3.org/2000/svg\"==i)l=l.replace(/xlink(H|:h)/,\"h\").replace(/sName$/,\"s\");else if(\"width\"!=l&&\"height\"!=l&&\"href\"!=l&&\"list\"!=l&&\"form\"!=l&&\"tabIndex\"!=l&&\"download\"!=l&&\"rowSpan\"!=l&&\"colSpan\"!=l&&\"role\"!=l&&\"popover\"!=l&&l in n)try{n[l]=null==u?\"\":u;break n}catch(n){}\"function\"==typeof u||(null==u||!1===u&&\"-\"!=l[4]?n.removeAttribute(l):n.setAttribute(l,\"popover\"==l&&1==u?\"\":u))}}function V(n){return function(u){if(this.l){var t=this.l[u.type+n];if(null==u[c])u[c]=h++;else if(u[c]<t[a])return;return t(l.event?l.event(u):u)}}}function q(n,u,t,i,r,o,e,f,c,a){var s,h,p,v,y,d,_,k,x,M,I,P,A,H,T,j,F=u.type;if(void 0!==u.constructor)return null;128&t.__u&&(c=!!(32&t.__u),o=[f=u.__e=t.__e]),(s=l.__b)&&s(u);n:if(\"function\"==typeof F){h=e.length;try{if(x=u.props,M=F.prototype&&F.prototype.render,I=(s=F.contextType)&&i[s.__c],P=s?I?I.props.value:s.__:i,t.__c?k=(p=u.__c=t.__c).__=p.__E:(M?u.__c=p=new F(x,P):(u.__c=p=new C(x,P),p.constructor=F,p.render=Q),I&&I.sub(p),p.state||(p.state={}),p.__n=i,v=p.__d=!0,p.__h=[],p._sb=[]),M&&null==p.__s&&(p.__s=p.state),M&&null!=F.getDerivedStateFromProps&&(p.__s==p.state&&(p.__s=m({},p.__s)),m(p.__s,F.getDerivedStateFromProps(x,p.__s))),y=p.props,d=p.state,p.__v=u,v)M&&null==F.getDerivedStateFromProps&&null!=p.componentWillMount&&p.componentWillMount(),M&&null!=p.componentDidMount&&p.__h.push(p.componentDidMount);else{if(M&&null==F.getDerivedStateFromProps&&x!==y&&null!=p.componentWillReceiveProps&&p.componentWillReceiveProps(x,P),u.__v==t.__v||!p.__e&&null!=p.shouldComponentUpdate&&!1===p.shouldComponentUpdate(x,p.__s,P)){u.__v!=t.__v&&(p.props=x,p.state=p.__s,p.__d=!1),u.__e=t.__e,u.__k=t.__k,u.__k.some(function(n){n&&(n.__=u)}),w.push.apply(p.__h,p._sb),p._sb=[],p.__h.length&&e.push(p),f=$(t);break n}null!=p.componentWillUpdate&&p.componentWillUpdate(x,p.__s,P),M&&null!=p.componentDidUpdate&&p.__h.push(function(){p.componentDidUpdate(y,d,_)})}if(p.context=P,p.props=x,p.__P=n,p.__e=!1,A=l.__r,H=0,M)p.state=p.__s,p.__d=!1,A&&A(u),s=p.render(p.props,p.state,p.context),w.push.apply(p.__h,p._sb),p._sb=[];else do{p.__d=!1,A&&A(u),s=p.render(p.props,p.state,p.context),p.state=p.__s}while(p.__d&&++H<25);p.state=p.__s,null!=p.getChildContext&&(i=m(m({},i),p.getChildContext())),M&&!v&&null!=p.getSnapshotBeforeUpdate&&(_=p.getSnapshotBeforeUpdate(y,d)),T=null!=s&&s.type===S&&null==s.key?E(s.props.children):s,f=L(n,g(T)?T:[T],u,t,i,r,o,e,f,c,a),p.base=u.__e,u.__u&=-161,p.__h.length&&e.push(p),k&&(p.__E=p.__=null)}catch(n){if(e.length=h,u.__v=null,c||null!=o){if(n.then){for(u.__u|=c?160:128;f&&8==f.nodeType&&f.nextSibling;)f=f.nextSibling;null!=o&&(o[o.indexOf(f)]=null),u.__e=f}else if(null!=o)for(j=o.length;j--;)b(o[j])}else u.__e=t.__e;null==u.__k&&(u.__k=t.__k||[]),n.then||B(u),l.__e(n,u,t)}}else null==o&&u.__v==t.__v?(u.__k=t.__k,u.__e=t.__e):f=u.__e=G(t.__e,u,t,i,r,o,e,c,a);return(s=l.diffed)&&s(u),128&u.__u?void 0:f}function B(n){n&&(n.__c&&(n.__c.__e=!0),n.__k&&n.__k.some(B))}function D(n,u,t){for(var i=0;i<t.length;i++)J(t[i],t[++i],t[++i]);l.__c&&l.__c(u,n),n.some(function(u){try{n=u.__h,u.__h=[],n.some(function(n){n.call(u)})}catch(n){l.__e(n,u.__v)}})}function E(n){return\"object\"!=typeof n||null==n||n.__b>0?n:g(n)?n.map(E):void 0!==n.constructor?null:m({},n)}function G(u,t,i,r,o,e,f,c,a){var s,h,p,v,y,w,_,m=i.props||d,k=t.props,x=t.type;if(\"svg\"==x?o=\"http://www.w3.org/2000/svg\":\"math\"==x?o=\"http://www.w3.org/1998/Math/MathML\":o||(o=\"http://www.w3.org/1999/xhtml\"),null!=e)for(s=0;s<e.length;s++)if((y=e[s])&&\"setAttribute\"in y==!!x&&(x?y.localName==x:3==y.nodeType)){u=y,e[s]=null;break}if(null==u){if(null==x)return document.createTextNode(k);u=document.createElementNS(o,x,k.is&&k),c&&(l.__m&&l.__m(t,e),c=!1),e=null}if(null==x)m===k||c&&u.data==k||(u.data=k);else{if(e=\"textarea\"==x&&null!=k.defaultValue?null:e&&n.call(u.childNodes),!c&&null!=e)for(m={},s=0;s<u.attributes.length;s++)m[(y=u.attributes[s]).name]=y.value;for(s in m)y=m[s],\"dangerouslySetInnerHTML\"==s?p=y:\"children\"==s||s in k||\"value\"==s&&\"defaultValue\"in k||\"checked\"==s&&\"defaultChecked\"in k||N(u,s,null,y,o);for(s in k)y=k[s],\"children\"==s?v=y:\"dangerouslySetInnerHTML\"==s?h=y:\"value\"==s?w=y:\"checked\"==s?_=y:c&&\"function\"!=typeof y||m[s]===y||N(u,s,y,m[s],o);if(h)c||p&&(h.__html==p.__html||h.__html==u.innerHTML)||(u.innerHTML=h.__html),t.__k=[];else if(p&&(u.innerHTML=\"\"),L(\"template\"==t.type?u.content:u,g(v)?v:[v],t,i,r,\"foreignObject\"==x?\"http://www.w3.org/1999/xhtml\":o,e,f,e?e[0]:i.__k&&$(i,0),c,a),null!=e)for(s=e.length;s--;)b(e[s]);c&&\"textarea\"!=x||(s=\"value\",\"progress\"==x&&null==w?u.removeAttribute(\"value\"):null!=w&&(w!==u[s]||\"progress\"==x&&!w||\"option\"==x&&w!=m[s])&&N(u,s,w,m[s],o),s=\"checked\",null!=_&&_!=u[s]&&N(u,s,_,m[s],o))}return u}function J(n,u,t){try{if(\"function\"==typeof n){var i=\"function\"==typeof n.__u;i&&n.__u(),i&&null==u||(n.__u=n(u))}else n.current=u}catch(n){l.__e(n,t)}}function K(n,u,t){var i,r;if(l.unmount&&l.unmount(n),(i=n.ref)&&(i.current&&i.current!=n.__e||J(i,null,u)),null!=(i=n.__c)){if(i.componentWillUnmount)try{i.componentWillUnmount()}catch(n){l.__e(n,u)}i.base=i.__P=i.__n=null}if(i=n.__k)for(r=0;r<i.length;r++)i[r]&&K(i[r],u,t||\"function\"!=typeof n.type);t||b(n.__e),n.__c=n.__=n.__e=void 0}function Q(n,l,u){return this.constructor(n,u)}function R(u,t,i){var r,o,e,f;t==document&&(t=document.documentElement),l.__&&l.__(u,t),o=(r=\"function\"==typeof i)?null:i&&i.__k||t.__k,e=[],f=[],q(t,u=(!r&&i||t).__k=k(S,null,[u]),o||d,d,t.namespaceURI,!r&&i?[i]:o?null:t.firstChild?n.call(t.childNodes):null,e,!r&&i?i:o?o.__e:t.firstChild,r,f),D(e,u,f),u.props.children=null}function U(n,l){R(n,l,U)}function W(l,u,t){var i,r,o,e,f=m({},l.props);for(o in l.type&&l.type.defaultProps&&(e=l.type.defaultProps),u)\"key\"==o?i=u[o]:\"ref\"==o?r=u[o]:f[o]=void 0===u[o]&&null!=e?e[o]:u[o];return arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):t),x(l.type,f,i||l.key,r||l.ref,null)}function X(n){function l(n){var u,t;return this.getChildContext||(u=new Set,(t={})[l.__c]=this,this.getChildContext=function(){return t},this.componentWillUnmount=function(){u=null},this.shouldComponentUpdate=function(n){this.props.value!=n.value&&u.forEach(function(n){n.__e=!0,A(n)})},this.sub=function(n){u.add(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){u&&u.delete(n),l&&l.call(n)}}),n.children}return l.__c=\"__cC\"+y++,l.__=n,l.Provider=l.__l=(l.Consumer=function(n,l){return n.children(l)}).contextType=l,l}n=w.slice,l={__e:function(n,l,u,t){for(var i,r,o;l=l.__;)if((i=l.__c)&&!i.__)try{if((r=i.constructor)&&null!=r.getDerivedStateFromError&&(i.setState(r.getDerivedStateFromError(n)),o=i.__d),null!=i.componentDidCatch&&(i.componentDidCatch(n,t||{}),o=i.__d),o)return i.__E=i}catch(l){n=l}throw n}},u=0,t=function(n){return null!=n&&void 0===n.constructor},C.prototype.setState=function(n,l){var u;u=null!=this.__s&&this.__s!=this.state?this.__s:this.__s=m({},this.state),\"function\"==typeof n&&(n=n(m({},u),this.props)),n&&m(u,n),null!=n&&this.__v&&(l&&this._sb.push(l),A(this))},C.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),A(this))},C.prototype.render=S,i=[],o=\"function\"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,e=function(n,l){return n.__v.__b-l.__v.__b},H.__r=0,f=Math.random().toString(8),c=\"__d\"+f,a=\"__a\"+f,s=/(PointerCapture)$|Capture$/i,h=0,p=V(!1),v=V(!0),y=0;export{C as Component,S as Fragment,W as cloneElement,X as createContext,k as createElement,M as createRef,k as h,U as hydrate,t as isValidElement,l as options,R as render,F as toChildArray};\n//# sourceMappingURL=preact.module.js.map\n","import{options as n}from\"preact\";var t,r,u,i,o=0,f=[],c=n,e=c.__b,a=c.__r,v=c.diffed,l=c.__c,m=c.unmount,p=c.__;function s(n,t){c.__h&&c.__h(r,n,o||t),o=0;var u=r.__H||(r.__H={__:[],__h:[]});return n>=u.__.length&&u.__.push({}),u.__[n]}function d(n){return o=1,y(D,n)}function y(n,u,i){var o=s(t++,2);if(o.t=n,!o.__c&&(o.__=[i?i(u):D(void 0,u),function(n){var t=o.__N?o.__N[0]:o.__[0],r=o.t(t,n);t!==r&&(o.__N=[r,o.__[1]],o.__c.setState({}))}],o.__c=r,!r.__f)){var f=function(n,t,r){if(!o.__c.__H)return!0;var u=!1,i=o.__c.props!==n;if(o.__c.__H.__.some(function(n){if(n.__N){u=!0;var t=n.__[0];n.__=n.__N,n.__N=void 0,t!==n.__[0]&&(i=!0)}}),c){var f=c.call(this,n,t,r);return u?f||i:f}return!u||i};r.__f=!0;var c=r.shouldComponentUpdate,e=r.componentWillUpdate;r.componentWillUpdate=function(n,t,r){if(this.__e){var u=c;c=void 0,f(n,t,r),c=u}e&&e.call(this,n,t,r)},r.shouldComponentUpdate=f}return o.__N||o.__}function h(n,u){var i=s(t++,3);!c.__s&&C(i.__H,u)&&(i.__=n,i.u=u,r.__H.__h.push(i))}function _(n,u){var i=s(t++,4);!c.__s&&C(i.__H,u)&&(i.__=n,i.u=u,r.__h.push(i))}function A(n){return o=5,T(function(){return{current:n}},[])}function F(n,t,r){o=6,_(function(){if(\"function\"==typeof n){var r=n(t());return function(){n(null),r&&\"function\"==typeof r&&r()}}if(n)return n.current=t(),function(){return n.current=null}},null==r?r:r.concat(n))}function T(n,r){var u=s(t++,7);return C(u.__H,r)&&(u.__=n(),u.__H=r,u.__h=n),u.__}function q(n,t){return o=8,T(function(){return n},t)}function x(n){var u=r.context[n.__c],i=s(t++,9);return i.c=n,u?(null==i.__&&(i.__=!0,u.sub(r)),u.props.value):n.__}function P(n,t){c.useDebugValue&&c.useDebugValue(t?t(n):n)}function b(n){var u=s(t++,10),i=d();return u.__=n,r.componentDidCatch||(r.componentDidCatch=function(n,t){u.__&&u.__(n,t),i[1](n)}),[i[0],function(){i[1](void 0)}]}function g(){var n=s(t++,11);if(!n.__){for(var u=r.__v;null!==u&&!u.__m&&null!==u.__;)u=u.__;var i=u.__m||(u.__m=[0,0]);n.__=\"P\"+i[0]+\"-\"+i[1]++}return n.__}function j(){for(var n;n=f.shift();){var t=n.__H;if(n.__P&&t)try{t.__h.some(z),t.__h.some(B),t.__h=[]}catch(r){t.__h=[],c.__e(r,n.__v)}}}c.__b=function(n){r=null,e&&e(n)},c.__=function(n,t){n&&t.__k&&t.__k.__m&&(n.__m=t.__k.__m),p&&p(n,t)},c.__r=function(n){a&&a(n),t=0;var i=(r=n.__c).__H;i&&(u===r?(i.__h=[],r.__h=[],i.__.some(function(n){n.__N&&(n.__=n.__N),n.u=n.__N=void 0})):(i.__h.some(z),i.__h.some(B),i.__h=[],t=0)),u=r},c.diffed=function(n){v&&v(n);var t=n.__c;t&&t.__H&&(t.__H.__h.length&&(1!==f.push(t)&&i===c.requestAnimationFrame||((i=c.requestAnimationFrame)||w)(j)),t.__H.__.some(function(n){n.u&&(n.__H=n.u,n.u=void 0)})),u=r=null},c.__c=function(n,t){t.some(function(n){try{n.__h.some(z),n.__h=n.__h.filter(function(n){return!n.__||B(n)})}catch(r){t.some(function(n){n.__h&&(n.__h=[])}),t=[],c.__e(r,n.__v)}}),l&&l(n,t)},c.unmount=function(n){m&&m(n);var t,r=n.__c;r&&r.__H&&(r.__H.__.some(function(n){try{z(n)}catch(n){t=n}}),r.__H=void 0,t&&c.__e(t,r.__v))};var k=\"function\"==typeof requestAnimationFrame;function w(n){var t,r=function(){clearTimeout(u),k&&cancelAnimationFrame(t),setTimeout(n)},u=setTimeout(r,35);k&&(t=requestAnimationFrame(r))}function z(n){var t=r,u=n.__c;\"function\"==typeof u&&(n.__c=void 0,u()),r=t}function B(n){var t=r;n.__c=n.__(),r=t}function C(n,t){return!n||n.length!==t.length||t.some(function(t,r){return t!==n[r]})}function D(n,t){return\"function\"==typeof t?t(n):t}export{q as useCallback,x as useContext,P as useDebugValue,h as useEffect,b as useErrorBoundary,g as useId,F as useImperativeHandle,_ as useLayoutEffect,T as useMemo,y as useReducer,A as useRef,d as useState};\n//# sourceMappingURL=hooks.module.js.map\n","import{options as r,Fragment as e}from\"preact\";export{Fragment}from\"preact\";var t=/[\"&<]/;function n(r){if(0===r.length||!1===t.test(r))return r;for(var e=0,n=0,o=\"\",f=\"\";n<r.length;n++){switch(r.charCodeAt(n)){case 34:f=\""\";break;case 38:f=\"&\";break;case 60:f=\"<\";break;default:continue}n!==e&&(o+=r.slice(e,n)),o+=f,e=n+1}return n!==e&&(o+=r.slice(e,n)),o}var o=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,f=0,i=Array.isArray;function u(e,t,n,o,i,u){t||(t={});var a,c,p=t;if(\"ref\"in p)for(c in p={},t)\"ref\"==c?a=t[c]:p[c]=t[c];var l={type:e,props:p,key:n,ref:a,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--f,__i:-1,__u:0,__source:i,__self:u};if(\"function\"==typeof e&&(a=e.defaultProps))for(c in a)void 0===p[c]&&(p[c]=a[c]);return r.vnode&&r.vnode(l),l}function a(r){var t=u(e,{tpl:r,exprs:[].slice.call(arguments,1)});return t.key=t.__v,t}var c={},p=/[A-Z]/g;function l(e,t){if(r.attr){var f=r.attr(e,t);if(\"string\"==typeof f)return f}if(t=function(r){return null!==r&&\"object\"==typeof r&&\"function\"==typeof r.valueOf?r.valueOf():r}(t),\"ref\"===e||\"key\"===e)return\"\";if(\"style\"===e&&\"object\"==typeof t){var i=\"\";for(var u in t){var a=t[u];if(null!=a&&\"\"!==a){var l=\"-\"==u[0]?u:c[u]||(c[u]=u.replace(p,\"-$&\").toLowerCase()),s=\";\";\"number\"!=typeof a||l.startsWith(\"--\")||o.test(l)||(s=\"px;\"),i=i+l+\":\"+a+s}}return e+'=\"'+n(i)+'\"'}return null==t||!1===t||\"function\"==typeof t||\"object\"==typeof t?\"\":!0===t?e:e+'=\"'+n(\"\"+t)+'\"'}function s(r){if(null==r||\"boolean\"==typeof r||\"function\"==typeof r)return null;if(\"object\"==typeof r){if(void 0===r.constructor)return r;if(i(r)){for(var e=0;e<r.length;e++)r[e]=s(r[e]);return r}}return n(\"\"+r)}export{u as jsx,l as jsxAttr,u as jsxDEV,s as jsxEscape,a as jsxTemplate,u as jsxs};\n//# sourceMappingURL=jsxRuntime.module.js.map\n","/** @jsxImportSource preact */\n/**\n * The panel's icons: stroked, 24px grid, inheriting `currentColor`, so a theme\n * colours them without a second set.\n */\n\nconst PATHS = {\n lifebuoy: 'M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18Zm0-5a4 4 0 1 0 0-8 4 4 0 0 0 0 8Zm2.8-6.8L18.4 5.6M9.2 9.2 5.6 5.6m3.6 9.2-3.6 3.6m9.2-3.6 3.6 3.6',\n bug: 'M9 9V8a3 3 0 0 1 6 0v1M8 9h8a6 6 0 0 1 1 3v3a5 5 0 0 1-10 0v-3a6 6 0 0 1 1-3ZM3 13h4m10 0h4M12 20v-6M4 19l3.35-2M20 19l-3.35-2M4 7l3.75 2.4M20 7l-3.75 2.4',\n bulb: 'M3 12h1m8-9v1m8 8h1M5.6 5.6l.7.7m12.1-.7-.7.7M9 16a5 5 0 1 1 6 0 3.5 3.5 0 0 0-1 3 2 2 0 0 1-4 0 3.5 3.5 0 0 0-1-3M9.7 17h4.6',\n question: 'M8 9h8M8 13h6M9 18H6a3 3 0 0 1-3-3V7a3 3 0 0 1 3-3h12a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3h-3l-3 3-3-3Z',\n chevronRight: 'm9 6 6 6-6 6',\n chevronLeft: 'm15 6-6 6 6 6',\n arrowLeft: 'M5 12h14M5 12l6 6M5 12l6-6',\n x: 'M18 6 6 18M6 6l12 12',\n check: 'm5 12 5 5L20 7',\n checkCircle: 'M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18Zm-3-9 2 2 4-4',\n camera: 'M5 7h1a2 2 0 0 0 2-2 1 1 0 0 1 1-1h6a1 1 0 0 1 1 1 2 2 0 0 0 2 2h1a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2Zm7 9a3 3 0 1 0 0-6 3 3 0 0 0 0 6Z',\n monitor: 'M3 5a1 1 0 0 1 1-1h16a1 1 0 0 1 1 1v10a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V5Zm4 15h10M9 16v4m6-4v4',\n history: 'M12 8v4l2 2M3.05 11a9 9 0 1 1 .5 4m-.5 5v-5h5',\n cpu: 'M5 6a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1V6Zm4 3h6v6H9V9ZM3 10h2m-2 4h2m14-4h2m-2 4h2M10 3v2m4-2v2m-4 14v2m4-2v2',\n send: 'M10 14 21 3M21 3l-6.5 18a.55.55 0 0 1-1 0L10 14l-7-3.5a.55.55 0 0 1 0-1L21 3',\n search: 'M10 17a7 7 0 1 0 0-14 7 7 0 0 0 0 14Zm11 4-6-6',\n thumbUp: 'M7 11v8a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1v-7a1 1 0 0 1 1-1h3Zm0 0a4 4 0 0 0 4-4V6a2 2 0 0 1 4 0v5h3a2 2 0 0 1 2 2l-1 5a2 3 0 0 1-2 2h-7a3 3 0 0 1-3-3',\n refresh: 'M20 11A8.1 8.1 0 0 0 4.5 9M4 5v4h4m-4 4a8.1 8.1 0 0 0 15.5 2m.5 4v-4h-4',\n download: 'M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2M7 11l5 5 5-5M12 4v12',\n external: 'M12 6H6a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-6m-7 1 9-9m-5 0h5v5',\n book: 'M3 19a9 9 0 0 1 9 0 9 9 0 0 1 9 0M3 6a9 9 0 0 1 9 0 9 9 0 0 1 9 0M3 6v13M12 6v13M21 6v13',\n message:'M8 9h8M8 13h6M18 4a3 3 0 0 1 3 3v8a3 3 0 0 1-3 3h-5l-5 3v-3H6a3 3 0 0 1-3-3V7a3 3 0 0 1 3-3h12Z',\n} as const;\n\nexport type IconName = keyof typeof PATHS;\n\n/** Whether a host-supplied name is one of ours, rather than an image URL. */\nexport function isIconName(name: string): name is IconName {\n return Object.prototype.hasOwnProperty.call(PATHS, name);\n}\n\nexport function Icon({ name, size = 16, stroke = 1.8 }: { name: IconName; size?: number; stroke?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width={stroke} stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d={PATHS[name]} />\n </svg>\n );\n}\n","/** @jsxImportSource preact */\nimport type { ComponentChildren, Ref } from 'preact';\n\nimport type { StatusView, Tone } from '../model.js';\nimport { Icon, type IconName } from './icons.js';\n\n/** The few pieces every screen shares. Classes only; every value is a theme token. */\n\nexport function Tile({ icon, tone, small }: { icon: IconName; tone: Tone; small?: boolean }) {\n return (\n <span class={`sg-tile sg-t-${tone}${small ? ' sg-sm' : ''}`}>\n <Icon name={icon} size={small ? 14 : 17} />\n </span>\n );\n}\n\nexport function Pill({ tone, children }: { tone: Tone; children: ComponentChildren }) {\n return <span class={`sg-pill sg-t-${tone}`}>{children}</span>;\n}\n\nexport function Button({\n children,\n onClick,\n variant = 'primary',\n disabled,\n busy,\n icon,\n type = 'button',\n testId,\n btnRef,\n label,\n}: {\n children: ComponentChildren;\n onClick?: () => void;\n variant?: 'primary' | 'ghost' | 'danger';\n disabled?: boolean;\n busy?: boolean;\n icon?: IconName;\n type?: 'button' | 'submit';\n testId?: string;\n btnRef?: Ref<HTMLButtonElement>;\n /** An accessible name, for when the visible label can be hidden (the capture bar's Cancel on a phone). */\n label?: string;\n}) {\n return (\n <button\n ref={btnRef}\n type={type}\n class={variant === 'primary' ? 'sg-btn' : variant === 'ghost' ? 'sg-btn sg-btn-ghost' : 'sg-btn sg-btn-danger'}\n onClick={onClick}\n disabled={disabled || busy}\n data-testid={testId}\n aria-label={label}\n >\n {busy ? <span class=\"sg-spin\" aria-hidden=\"true\" /> : icon ? <Icon name={icon} size={15} /> : null}\n {children}\n </button>\n );\n}\n\nexport function Field({\n label,\n hint,\n error,\n children,\n}: {\n label: string;\n hint?: string;\n error?: string | null;\n children: ComponentChildren;\n}) {\n return (\n <label class=\"sg-field\">\n <span class=\"sg-label\">{label}</span>\n {children}\n {error ? <span class=\"sg-err\" role=\"alert\">{error}</span> : hint ? <span class=\"sg-hint\">{hint}</span> : null}\n </label>\n );\n}\n\n/**\n * Where a host's own content appears. A native `<slot>`, so the content stays\n * in the host's document: its CSS styles it and its framework renders it. Only\n * drawn when filled, so an unused slot leaves no gap.\n */\nexport function SlotPoint({ name, filled }: { name: string; filled: ReadonlySet<string> }) {\n if (!filled.has(name)) return null;\n return (\n <div class={`sg-slot sg-slot-${name}`} data-testid={`sg-slot-${name}`}>\n <slot name={name} />\n </div>\n );\n}\n\nexport function Switch({ on, onChange, label }: { on: boolean; onChange: (on: boolean) => void; label: string }) {\n return (\n <button type=\"button\" role=\"switch\" aria-checked={on} aria-label={label} class=\"sg-switch\" onClick={() => onChange(!on)} />\n );\n}\n\n/**\n * A report's journey as a drawn path.\n *\n * The line between the nodes is the information: \"how far along is this, and\n * what comes next\" is the question someone opening their own report has, and\n * a status word alone cannot answer it. The last node is theirs, dashed until\n * it is their turn.\n */\nexport function Rail({ view }: { view: StatusView }) {\n const n = view.stages.length;\n return (\n <div class={`sg-rail sg-t-${view.offPath ? 'neutral' : view.tone}`} role=\"img\" aria-label={`${view.label}: stage ${view.stage + 1} of ${n}`}>\n {view.stages.map((label, i) => {\n const reached = i <= view.stage;\n const here = i === view.stage;\n const yours = i === n - 1 && !view.offPath && i > view.stage;\n return (\n <div class=\"sg-rail-stage\" key={label}>\n <div class=\"sg-rail-line\">\n <span class={`sg-rail-seg ${i === 0 ? 'sg-none' : i <= view.stage ? 'sg-on' : ''}`} />\n <span\n class={`sg-rail-node${reached ? ' sg-on' : ''}${here ? ' sg-here' : ''}${here && view.active ? ' sg-pulse' : ''}${yours ? ' sg-yours' : ''}`}\n />\n <span class={`sg-rail-seg ${i === n - 1 ? 'sg-none' : i < view.stage ? 'sg-on' : ''}`} />\n </div>\n <span class={`sg-rail-label${reached ? ' sg-on' : ''}`}>{view.offPath && i > view.stage ? '' : label}</span>\n </div>\n );\n })}\n </div>\n );\n}\n","/** @jsxImportSource preact */\nimport { useMemo, useState } from 'preact/hooks';\n\nimport type { Ctx } from '../ctx.js';\nimport { Icon } from '../icons.js';\nimport { Button } from '../ui.js';\n\n/**\n * Answers first, a report second. Built on <details>, so it is keyboard\n * operable, announced correctly, and findable by the browser's own search.\n */\nexport function Faq({ w }: { w: Ctx }) {\n const [q, setQ] = useState('');\n const items = useMemo(() => {\n const needle = q.trim().toLowerCase();\n if (!needle) return w.faq;\n return w.faq.filter((f) => `${f.q} ${f.a} ${(f.tags ?? []).join(' ')}`.toLowerCase().includes(needle));\n }, [q, w.faq]);\n\n return (\n <div class=\"sg-body\">\n <div class=\"sg-pad\">\n <div style={{ position: 'relative', marginBottom: '12px' }}>\n <span class=\"sg-dim\" style={{ position: 'absolute', left: '10px', top: '9px' }}>\n <Icon name=\"search\" size={15} />\n </span>\n <input\n class=\"sg-input\"\n style={{ paddingLeft: '32px' }}\n placeholder={w.copy.faqSearch}\n aria-label={w.copy.faqSearch}\n value={q}\n onInput={(e) => setQ(e.currentTarget.value)}\n data-testid=\"sg-faq-search\"\n />\n </div>\n {items.length === 0 && <p class=\"sg-p sg-dim sg-small\">{w.copy.faqEmpty}</p>}\n {items.map((f) => (\n <details class=\"sg-faq\" key={f.q}>\n <summary>\n {f.q}\n <span class=\"sg-chev\"><Icon name=\"chevronRight\" size={14} /></span>\n </summary>\n <div class=\"sg-faq-a\">{f.a}</div>\n </details>\n ))}\n {w.features.report && (\n <div class=\"sg-banner sg-t-accent\" style={{ marginTop: '16px', alignItems: 'center' }}>\n <span style={{ flex: 1 }} class=\"sg-banner-title\">{w.copy.faqNotFound}</span>\n <Button variant=\"ghost\" icon=\"bug\" onClick={() => w.go({ name: 'report' })}>\n {w.copy.reportAction}\n </Button>\n </div>\n )}\n </div>\n </div>\n );\n}\n","/** @jsxImportSource preact */\nimport { useState } from 'preact/hooks';\n\nimport { FEEDBACK_KINDS, type FeedbackKind } from '../../model.js';\nimport type { Ctx } from '../ctx.js';\nimport { Button, Field, SlotPoint } from '../ui.js';\n\n/**\n * Feedback: an idea, a frustration, or something worth protecting.\n *\n * Deliberately lighter than a report. It is not a fault to be tracked, so it\n * asks for one kind and one box, and offers a picture only if the reporter\n * wants to point at something.\n */\nexport function FeedbackForm({ w }: { w: Ctx }) {\n const { copy, support, state, features } = w;\n const [kind, setKind] = useState<FeedbackKind>('idea');\n const [body, setBody] = useState('');\n const [shot, setShot] = useState<string | null>(null);\n const [contact, setContact] = useState({ name: '', email: '' });\n const [busy, setBusy] = useState(false);\n const [touched, setTouched] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const tooShort = body.trim().length < 4;\n const anonymous = state.signedIn !== true;\n\n async function send() {\n setTouched(true);\n if (tooShort) return;\n setBusy(true);\n setError(null);\n try {\n const res = await support.submitFeedback({\n kind,\n body,\n screenshot: shot ?? undefined,\n contact: anonymous && (contact.name || contact.email) ? { name: contact.name || undefined, email: contact.email || undefined } : undefined,\n });\n w.emit('submitted', { ...res, type: 'feedback' });\n w.go({ name: 'thanks' });\n } catch (e) {\n setError(e instanceof Error ? e.message : copy.error);\n } finally {\n setBusy(false);\n }\n }\n\n return (\n <>\n <div class=\"sg-body\">\n <SlotPoint name=\"feedback-top\" filled={w.slots} />\n <div class=\"sg-pad sg-stack\">\n <div>\n <span class=\"sg-label\">{copy.feedbackKindLabel}</span>\n <div class=\"sg-chips\" role=\"radiogroup\" aria-label={copy.feedbackKindLabel}>\n {(Object.keys(FEEDBACK_KINDS) as FeedbackKind[]).map((k) => (\n <button key={k} type=\"button\" class=\"sg-chip\" role=\"radio\" aria-checked={kind === k} onClick={() => setKind(k)} data-testid={`sg-kind-${k}`}>\n {FEEDBACK_KINDS[k].label}\n </button>\n ))}\n </div>\n <span class=\"sg-hint\">{FEEDBACK_KINDS[kind].hint}</span>\n </div>\n <Field label={copy.feedbackLabel} error={touched && tooShort ? 'Say a little more.' : null}>\n <textarea\n class={`sg-textarea${touched && tooShort ? ' sg-invalid' : ''}`}\n value={body}\n onInput={(e) => setBody(e.currentTarget.value)}\n placeholder={copy.feedbackPlaceholder}\n data-testid=\"sg-feedback-body\"\n autoFocus\n />\n </Field>\n {features.screenshot && (\n <div>\n {shot ? (\n <>\n <img class=\"sg-shot\" src={shot} alt=\"The frame that will be attached\" />\n <button type=\"button\" class=\"sg-link\" style={{ marginTop: '6px' }} onClick={() => setShot(null)}>\n Remove\n </button>\n </>\n ) : (\n <button\n type=\"button\"\n class=\"sg-link\"\n onClick={async () => {\n const r = await w.capture();\n if (r.ok) setShot(r.dataUrl);\n }}\n >\n + {copy.capture}\n </button>\n )}\n </div>\n )}\n {anonymous && (\n <div>\n <span class=\"sg-label\">{copy.contactLabel}</span>\n <div class=\"sg-stack\">\n <input class=\"sg-input\" placeholder={copy.namePlaceholder} value={contact.name} onInput={(e) => setContact((c) => ({ ...c, name: e.currentTarget.value }))} />\n <input class=\"sg-input\" type=\"email\" placeholder={copy.emailPlaceholder} value={contact.email} onInput={(e) => setContact((c) => ({ ...c, email: e.currentTarget.value }))} />\n </div>\n <span class=\"sg-hint\">{copy.contactHint}</span>\n </div>\n )}\n {error && <p class=\"sg-err\" role=\"alert\">{error}</p>}\n </div>\n </div>\n <div class=\"sg-footer\">\n <Button variant=\"ghost\" onClick={() => w.go({ name: 'home' })}>\n {copy.cancel}\n </Button>\n <Button onClick={() => void send()} busy={busy} icon=\"send\" testId=\"sg-send-feedback\">\n {copy.sendFeedback}\n </Button>\n </div>\n </>\n );\n}\n","/** @jsxImportSource preact */\nimport { useEffect, useRef, useState } from 'preact/hooks';\n\nimport { awaitingUpdate, canVerify, canWithdraw, eventWords, formatAgo, readWords, reportParts, statusView, threadOf, type ReporterReport, type ReporterReportDetail } from '../../model.js';\nimport { fill } from '../copy.js';\nimport type { Ctx } from '../ctx.js';\nimport { Icon } from '../icons.js';\nimport { Button, Pill, Rail, Tile } from '../ui.js';\n\n/**\n * The reporter's own reports: the list, one report, the conversation, and the\n * check that closes the loop.\n *\n * ⚠ THE CHECK IS THE REASON THIS SCREEN EXISTS. \"We think we fixed it, you are\n * running the build that has the fix, does it work?\" can only be asked in the\n * product, to the person already looking at the thing, and it turns a tracker\n * into a loop that closes.\n */\n\n/**\n * Open reports first; closed ones folded away under \"Closed\".\n *\n * A closed report is history, and a list where \"Closed, you confirmed it\"\n * sits between two live ones makes the live ones harder to see. Folded, not\n * hidden: one tap shows them, nothing is lost. On the home screen only the\n * open ones are listed, with a way through to the rest.\n */\nexport function ReportList({ w, compact = false }: { w: Ctx; compact?: boolean }) {\n const all = w.state.reports;\n if (all.length === 0) {\n return (\n <div class=\"sg-empty\">\n <span class=\"sg-empty-icon\"><Icon name=\"bug\" size={20} /></span>\n <p class=\"sg-p\" style={{ marginTop: '10px', fontWeight: 600 }}>{w.copy.noReports}</p>\n <p class=\"sg-p sg-small sg-dim\" style={{ marginTop: '4px' }}>{w.copy.noReportsBody}</p>\n {w.features.report && (\n <div style={{ marginTop: '14px' }}>\n <Button variant=\"ghost\" icon=\"bug\" onClick={() => w.go({ name: 'report' })}>{w.copy.reportAction}</Button>\n </div>\n )}\n </div>\n );\n }\n const open = all.filter((r) => statusView(r, w.appVersion).open);\n const closed = all.filter((r) => !statusView(r, w.appVersion).open);\n\n if (compact) {\n return (\n <>\n {open.length > 0 ? <Rows w={w} reports={open.slice(0, 3)} /> : <p class=\"sg-p sg-small sg-dim sg-pad\">{w.copy.nothingOpen}</p>}\n {closed.length > 0 && (\n <button type=\"button\" class=\"sg-closed-link\" onClick={() => w.go({ name: 'reports' })} data-testid=\"sg-closed-link\">\n {w.copy.closedReports} · {closed.length}\n <Icon name=\"chevronRight\" size={14} />\n </button>\n )}\n </>\n );\n }\n return (\n <>\n {open.length > 0 ? <Rows w={w} reports={open} /> : <p class=\"sg-p sg-small sg-dim sg-pad\">{w.copy.nothingOpen}</p>}\n {closed.length > 0 && (\n <details class=\"sg-closed\" data-testid=\"sg-closed\">\n <summary>\n <Icon name=\"chevronRight\" size={14} />\n {w.copy.closedReports} · {closed.length}\n </summary>\n <Rows w={w} reports={closed} />\n </details>\n )}\n </>\n );\n}\n\nfunction Rows({ w, reports }: { w: Ctx; reports: ReporterReport[] }) {\n return (\n <ul class=\"sg-list\" data-testid=\"sg-report-list\">\n {reports.map((r) => {\n const v = statusView(r, w.appVersion);\n const unread = w.support.unread(r);\n const area = typeof r.source_context?.area === 'string' ? r.source_context.area : null;\n return (\n <li key={r.id}>\n <button type=\"button\" class=\"sg-row\" onClick={() => w.go({ name: 'detail', id: r.id })} data-testid=\"sg-report-row\">\n <div class=\"sg-row-main\">\n <div class=\"sg-row-top\">\n {unread && <span class=\"sg-dot\" style={{ marginTop: '7px' }} aria-label=\"New reply\" />}\n <span class=\"sg-row-title\">{r.subject}</span>\n <Pill tone={v.tone}>{v.label}</Pill>\n </div>\n <div class=\"sg-row-meta\">\n <span class=\"sg-mono\">{r.ref}</span>\n {area && <span>· {area}</span>}\n <span>· {formatAgo(r.created_at)}</span>\n </div>\n {v.needsYou && (\n <span class={`sg-row-cta sg-t-${r.status === 'waiting_user' ? 'warn' : 'success'}`}>\n <Icon name={r.status === 'waiting_user' ? 'message' : 'checkCircle'} size={13} />\n {r.status === 'waiting_user' ? 'Reply to the team' : 'Check the fix and tell the team'}\n </span>\n )}\n </div>\n <span class=\"sg-chev\" style={{ paddingTop: '2px' }}><Icon name=\"chevronRight\" /></span>\n </button>\n </li>\n );\n })}\n </ul>\n );\n}\n\n\nexport function ReportDetail({ w, id }: { w: Ctx; id: string }) {\n const { copy, support } = w;\n const [d, setD] = useState<ReporterReportDetail | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [reply, setReply] = useState('');\n const [sending, setSending] = useState(false);\n const [rejecting, setRejecting] = useState(false);\n const [note, setNote] = useState('');\n const [deciding, setDeciding] = useState(false);\n const [withdrawing, setWithdrawing] = useState(false);\n const [why, setWhy] = useState('');\n const [leaving, setLeaving] = useState(false);\n const end = useRef<HTMLDivElement>(null);\n\n // Fetched when opened, every 10 seconds while it stays open and visible,\n // when the window comes back into focus (the reporter was just acting\n // somewhere else, often the very change they are waiting for), and on the\n // header's refresh button, so a move or a reply from the team appears\n // without anyone reloading the page.\n useEffect(() => {\n let alive = true;\n const load = () =>\n support\n .detail(id)\n .then((next) => {\n if (!alive) return;\n setD(next);\n support.markSeen(id);\n })\n .catch((e: unknown) => alive && setError(e instanceof Error ? e.message : copy.error));\n void load();\n const t = setInterval(() => {\n if (document.visibilityState === 'visible') void load();\n }, 10_000);\n const onBack = () => {\n if (document.visibilityState === 'visible') void load();\n };\n window.addEventListener('focus', onBack);\n document.addEventListener('visibilitychange', onBack);\n return () => {\n alive = false;\n clearInterval(t);\n window.removeEventListener('focus', onBack);\n document.removeEventListener('visibilitychange', onBack);\n };\n }, [id, support, copy.error, w.tick]);\n\n const count = d?.timeline.length ?? 0;\n useEffect(() => {\n end.current?.scrollIntoView({ block: 'end' });\n }, [count]);\n\n if (!d) {\n return (\n <div class=\"sg-body\" aria-busy=\"true\">\n {error ? <p class=\"sg-err sg-pad\">{error}</p> : <><div class=\"sg-skeleton\" /><div class=\"sg-skeleton\" /></>}\n </div>\n );\n }\n\n const v = statusView(d, w.appVersion);\n const parts = reportParts(d.body);\n const verifying = canVerify(d, w.appVersion);\n const updating = awaitingUpdate(d, w.appVersion);\n const area = typeof d.source_context?.area === 'string' ? d.source_context.area : null;\n const reportedOn = typeof d.source_context?.app_version === 'string' ? d.source_context.app_version : null;\n\n async function decide(works: boolean) {\n setDeciding(true);\n setError(null);\n try {\n const next = await support.verify(id, works, works ? undefined : note.trim() || undefined);\n setD(next);\n setRejecting(false);\n setNote('');\n w.emit('verified', { id, works });\n } catch (e) {\n setError(e instanceof Error ? e.message : copy.error);\n } finally {\n setDeciding(false);\n }\n }\n\n async function withdraw() {\n setLeaving(true);\n setError(null);\n try {\n const next = await support.withdraw(id, why.trim() || undefined);\n setD(next);\n setWithdrawing(false);\n setWhy('');\n w.emit('withdrawn', { id });\n } catch (e) {\n setError(e instanceof Error ? e.message : copy.error);\n } finally {\n setLeaving(false);\n }\n }\n\n async function send() {\n const text = reply.trim();\n if (!text) return;\n setSending(true);\n setError(null);\n try {\n setD(await support.reply(id, text));\n setReply('');\n } catch (e) {\n setError(e instanceof Error ? e.message : copy.error);\n } finally {\n setSending(false);\n }\n }\n\n return (\n <>\n <div class=\"sg-body\" data-testid=\"sg-detail\">\n <div class=\"sg-pad sg-stack\">\n <div class=\"sg-rail-box\">\n <Rail view={v} />\n </div>\n <div>\n <Pill tone={v.tone}>{v.label}</Pill>\n <p class=\"sg-p sg-muted\" style={{ marginTop: '6px' }}>{v.blurb}</p>\n </div>\n\n {verifying && (\n <div class=\"sg-banner sg-t-success\" style={{ display: 'block' }} data-testid=\"sg-verify\">\n <p class=\"sg-banner-title\" style={{ display: 'flex', gap: '8px', alignItems: 'center' }}>\n <Icon name=\"checkCircle\" /> {copy.verifyTitle}\n </p>\n <p class=\"sg-banner-body\">\n {d.fixed_in_version && w.appVersion ? `Fixed in ${d.fixed_in_version}; you are on ${w.appVersion}. ` : ''}\n {copy.verifyBody}\n </p>\n {rejecting ? (\n <div style={{ marginTop: '10px' }} class=\"sg-stack\">\n <textarea class=\"sg-textarea\" value={note} onInput={(e) => setNote(e.currentTarget.value)} placeholder={copy.verifyNoPlaceholder} autoFocus data-testid=\"sg-verify-note\" />\n <div style={{ display: 'flex', gap: '8px' }}>\n <Button variant=\"danger\" onClick={() => void decide(false)} busy={deciding} testId=\"sg-verify-send-no\">{copy.verifySend}</Button>\n <Button variant=\"ghost\" onClick={() => setRejecting(false)}>{copy.cancel}</Button>\n </div>\n </div>\n ) : (\n <div style={{ marginTop: '10px', display: 'flex', gap: '8px', flexWrap: 'wrap' }}>\n <Button icon=\"thumbUp\" onClick={() => void decide(true)} busy={deciding} testId=\"sg-verify-yes\">{copy.verifyYes}</Button>\n <Button variant=\"danger\" onClick={() => setRejecting(true)} testId=\"sg-verify-no\">{copy.verifyNo}</Button>\n </div>\n )}\n </div>\n )}\n\n {updating && (\n <div class=\"sg-banner sg-t-warn\">\n <Tile icon=\"download\" tone=\"warn\" small />\n <div>\n <p class=\"sg-banner-title\">{fill(copy.updateTitle, { version: d.fixed_in_version ?? '', running: w.appVersion ?? '' })}</p>\n <p class=\"sg-banner-body\">{copy.updateBody}</p>\n </div>\n </div>\n )}\n\n <div>\n <span class=\"sg-label\">{copy.whatYouReported}</span>\n {parts.some((x) => x.label) ? (\n <dl class=\"sg-review\" style={{ margin: '4px 0 0' }}>\n {parts.map((x, i) => (\n <>\n {x.label && <dt key={`l${i}`}>{x.label}</dt>}\n <dd key={`t${i}`}>{x.text}</dd>\n </>\n ))}\n </dl>\n ) : (\n <>\n <p class=\"sg-p\" style={{ fontWeight: 600 }}>{d.subject}</p>\n {d.body && <p class=\"sg-p sg-muted\" style={{ whiteSpace: 'pre-wrap', marginTop: '4px' }}>{d.body}</p>}\n </>\n )}\n <div class=\"sg-row-meta\" style={{ marginTop: '6px' }}>\n <span class=\"sg-mono\">{d.ref}</span>\n {area && <span>· {area}</span>}\n {reportedOn && <span>· reported on {reportedOn}</span>}\n <span>· {formatAgo(d.created_at)}</span>\n </div>\n </div>\n\n <div>\n <span class=\"sg-label\">{copy.conversation}</span>\n <div class=\"sg-thread\" data-testid=\"sg-thread\">\n {threadOf(d).map((e, i) =>\n e.kind === 'read' ? (\n <div class=\"sg-event\" key={i} data-testid=\"sg-read\">\n {readWords(e.name)} · {formatAgo(e.at)}\n </div>\n ) : e.kind === 'status' ? (\n <div class=\"sg-event\" key={i}>\n {eventWords(e)} · {formatAgo(e.at)}\n </div>\n ) : (\n <div class={`sg-msg ${e.by === 'you' ? 'sg-you' : 'sg-team'}`} key={i} data-testid={`sg-msg-${e.by}`}>\n <span class=\"sg-msg-meta\">\n {e.by === 'you' ? copy.you : e.author_name} · {formatAgo(e.at)}\n </span>\n {e.body}\n </div>\n ),\n )}\n <div ref={end} />\n </div>\n </div>\n\n {/* Quiet on purpose: a way out, not a call to action. The confirm\n says what happens before anything does. */}\n {canWithdraw(d) && !verifying && (withdrawing ? (\n <div class=\"sg-banner\" style={{ display: 'block' }} data-testid=\"sg-withdraw\">\n <p class=\"sg-banner-title\">{copy.withdrawTitle}</p>\n <p class=\"sg-banner-body\">{copy.withdrawBody}</p>\n <div style={{ marginTop: '10px' }} class=\"sg-stack\">\n <textarea class=\"sg-textarea\" value={why} onInput={(e) => setWhy(e.currentTarget.value)} placeholder={copy.withdrawPlaceholder} autoFocus data-testid=\"sg-withdraw-note\" />\n <div style={{ display: 'flex', gap: '8px' }}>\n <Button variant=\"danger\" onClick={() => void withdraw()} busy={leaving} testId=\"sg-withdraw-confirm\">{copy.withdrawConfirm}</Button>\n <Button variant=\"ghost\" onClick={() => setWithdrawing(false)}>{copy.withdrawKeep}</Button>\n </div>\n </div>\n </div>\n ) : (\n <button type=\"button\" class=\"sg-quiet-link\" onClick={() => setWithdrawing(true)} data-testid=\"sg-withdraw-open\">\n {copy.withdrawAction}\n </button>\n ))}\n {error && <p class=\"sg-err\" role=\"alert\">{error}</p>}\n </div>\n </div>\n\n {v.open ? (\n <form\n class=\"sg-composer\"\n onSubmit={(e) => {\n e.preventDefault();\n void send();\n }}\n >\n <textarea\n class=\"sg-textarea\"\n rows={1}\n value={reply}\n onInput={(e) => setReply(e.currentTarget.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n void send();\n }\n }}\n placeholder={copy.replyPlaceholder}\n aria-label={copy.replyPlaceholder}\n data-testid=\"sg-reply\"\n />\n <Button type=\"submit\" icon=\"send\" busy={sending} disabled={!reply.trim()} testId=\"sg-reply-send\">\n {copy.send}\n </Button>\n </form>\n ) : (\n <div class=\"sg-footer sg-small sg-dim\">{copy.closedNote}</div>\n )}\n </>\n );\n}\n","/** @jsxImportSource preact */\nimport { statusView } from '../../model.js';\nimport { fill } from '../copy.js';\nimport type { Ctx, HomeAction } from '../ctx.js';\nimport { Icon, isIconName } from '../icons.js';\nimport { Rail, SlotPoint, Tile } from '../ui.js';\nimport { ReportList } from './reports.js';\n\n/**\n * The first screen: what can be done, and what is waiting on you.\n *\n * ⚠ THE EMPTY STATE DRAWS THE JOURNEY. \"You have not reported anything\" over\n * an empty panel argues for doing nothing; the same space spent showing what a\n * report actually does, ending with the reporter's own check, is the strongest\n * case for filing one, and the only moment it gets read unhurried.\n */\nexport function Home({ w }: { w: Ctx }) {\n const { copy, features, state } = w;\n const reports = state.reports;\n const fixes = reports.filter((r) => r.status === 'resolved' && statusView(r, w.appVersion).needsYou);\n const asked = reports.filter((r) => r.status === 'waiting_user');\n const showReports = features.reports && state.signedIn !== false;\n // The heading counts what is still going on; closed ones are folded below.\n const openCount = reports.filter((r) => statusView(r, w.appVersion).open).length;\n\n return (\n <div class=\"sg-body\" data-testid=\"sg-home\">\n <SlotPoint name=\"home-top\" filled={w.slots} />\n <section class=\"sg-section\">\n <div class=\"sg-section-head\">\n <h3 class=\"sg-section-title\">{copy.homeTitle}</h3>\n </div>\n {features.report && (\n <button type=\"button\" class=\"sg-action\" onClick={() => w.go({ name: 'report' })} data-testid=\"sg-open-report\">\n <Tile icon=\"bug\" tone=\"danger\" />\n <span class=\"sg-action-text\">\n <span class=\"sg-action-label\">{copy.reportAction}</span>\n <span class=\"sg-action-hint\">{copy.reportHint}</span>\n </span>\n <span class=\"sg-chev\"><Icon name=\"chevronRight\" /></span>\n </button>\n )}\n {features.feedback && (\n <button type=\"button\" class=\"sg-action\" onClick={() => w.go({ name: 'feedback' })} data-testid=\"sg-open-feedback\">\n <Tile icon=\"bulb\" tone=\"warn\" />\n <span class=\"sg-action-text\">\n <span class=\"sg-action-label\">{copy.feedbackAction}</span>\n <span class=\"sg-action-hint\">{copy.feedbackHint}</span>\n </span>\n <span class=\"sg-chev\"><Icon name=\"chevronRight\" /></span>\n </button>\n )}\n {features.faq && w.faq.length > 0 && (\n <button type=\"button\" class=\"sg-action\" onClick={() => w.go({ name: 'faq' })} data-testid=\"sg-open-faq\">\n <Tile icon=\"question\" tone=\"accent\" />\n <span class=\"sg-action-text\">\n <span class=\"sg-action-label\">{copy.faqAction}</span>\n <span class=\"sg-action-hint\">{copy.faqHint}</span>\n </span>\n <span class=\"sg-chev\"><Icon name=\"chevronRight\" /></span>\n </button>\n )}\n {w.actions.map((a, i) => (\n <HostAction key={`${a.label}-${i}`} action={a} index={i} />\n ))}\n </section>\n\n {showReports && (\n <section class=\"sg-section\" style={{ paddingLeft: 0, paddingRight: 0 }}>\n <div class=\"sg-section-head\" style={{ padding: '0 16px' }}>\n <h3 class=\"sg-section-title\">\n {copy.yourReports}\n {openCount ? ` · ${openCount}` : ''}\n </h3>\n {openCount > 3 && (\n <button type=\"button\" class=\"sg-link\" onClick={() => w.go({ name: 'reports' })}>\n {copy.seeAll} {openCount}\n </button>\n )}\n </div>\n\n {(fixes.length > 0 || asked.length > 0) && (\n <div style={{ padding: '0 16px 10px' }}>\n <button\n type=\"button\"\n class={`sg-banner sg-t-${fixes.length ? 'success' : 'warn'}`}\n onClick={() => w.go(fixes.length + asked.length === 1 ? { name: 'detail', id: (fixes[0] ?? asked[0])!.id } : { name: 'reports' })}\n data-testid=\"sg-attention\"\n >\n <Tile icon={fixes.length ? 'checkCircle' : 'message'} tone={fixes.length ? 'success' : 'warn'} small />\n <span>\n <span class=\"sg-banner-title\">\n {fixes.length\n ? fixes.length === 1\n ? copy.fixesWaitingOne\n : fill(copy.fixesWaitingMany, { n: fixes.length })\n : copy.questionWaiting}\n </span>\n </span>\n </button>\n </div>\n )}\n\n {state.signedIn === null || (state.loading && reports.length === 0) ? (\n <div aria-busy=\"true\">\n <div class=\"sg-skeleton\" />\n <div class=\"sg-skeleton\" />\n </div>\n ) : reports.length === 0 ? (\n <Explainer w={w} />\n ) : (\n <ReportList w={w} compact />\n )}\n </section>\n )}\n\n {features.reports && state.signedIn === false && (\n <section class=\"sg-section\">\n <p class=\"sg-p sg-small sg-dim\">{copy.signedOutReports}</p>\n </section>\n )}\n <SlotPoint name=\"home-bottom\" filled={w.slots} />\n </div>\n );\n}\n\n/**\n * A host's own entry, drawn exactly like the built-in ones so it reads as part\n * of the panel. A link opens in a new tab; anything else is the host's click.\n */\nfunction HostAction({ action: a, index }: { action: HomeAction; index: number }) {\n const icon = a.icon && isIconName(a.icon) ? a.icon : null;\n const image = a.icon && !icon ? a.icon : null;\n const inner = (\n <>\n {image ? (\n <span class=\"sg-tile sg-t-accent\"><img src={image} alt=\"\" class=\"sg-tile-img\" /></span>\n ) : (\n <Tile icon={icon ?? (a.href ? 'external' : 'chevronRight')} tone=\"accent\" />\n )}\n <span class=\"sg-action-text\">\n <span class=\"sg-action-label\">{a.label}</span>\n {a.hint && <span class=\"sg-action-hint\">{a.hint}</span>}\n </span>\n <span class=\"sg-chev\"><Icon name={a.href ? 'external' : 'chevronRight'} /></span>\n </>\n );\n return a.href ? (\n <a class=\"sg-action\" href={a.href} target=\"_blank\" rel=\"noopener noreferrer\" data-testid={`sg-host-action-${index}`}>\n {inner}\n </a>\n ) : (\n <button type=\"button\" class=\"sg-action\" onClick={() => a.onClick?.()} data-testid={`sg-host-action-${index}`}>\n {inner}\n </button>\n );\n}\n\n/** What happens to a report, drawn before anyone has filed one. */\nfunction Explainer({ w }: { w: Ctx }) {\n return (\n <div style={{ padding: '0 16px' }}>\n <div class=\"sg-rail-box\">\n <Rail\n view={{\n label: 'How a report travels',\n blurb: '',\n tone: 'accent',\n stages: ['Sent', 'Read', 'Accepted', 'Fixed', 'You check'],\n // Nothing filed yet, so no stage is reached; the last node is still drawn as theirs.\n stage: -1,\n active: false,\n offPath: false,\n open: true,\n needsYou: false,\n }}\n />\n <p class=\"sg-p sg-small sg-muted\" style={{ marginTop: '10px' }}>\n {w.copy.noReportsBody}\n </p>\n </div>\n </div>\n );\n}\n","/** @jsxImportSource preact */\nimport { useState } from 'preact/hooks';\n\nimport { describeBrowser, describeSystem, formatBytes } from '../../evidence.js';\nimport { SEVERITY, formatAgo, validateIssue, type Severity } from '../../model.js';\nimport type { Collected } from '../../support.js';\nimport type { Ctx } from '../ctx.js';\nimport { Icon, type IconName } from '../icons.js';\nimport { Button, Field, SlotPoint, Switch } from '../ui.js';\n\n/**\n * Report an issue: describe, then choose what to attach, then send.\n *\n * ⚠ THREE STEPS RATHER THAN ONE FORM, AND THE ORDER IS THE ARGUMENT. Someone\n * opens this because something just went wrong; the first thing in front of\n * them has to be the box to say so, not a consent checklist. Evidence comes\n * second, when the urgent part is written down and they have the patience to\n * read what is being attached. Review comes third, because \"what exactly am I\n * sending\" deserves a page, not a footnote.\n *\n * ⚠ EVIDENCE IS READ ON THE PRESS THAT OPENS STEP 2, never in the background.\n * The button the reporter pressed says what is about to happen.\n */\n\ntype Step = 1 | 2 | 3;\ninterface Shot {\n dataUrl: string;\n width: number;\n height: number;\n bytes: number;\n mime: string;\n}\ninterface Include {\n screenshot: boolean;\n system: boolean;\n trail: boolean;\n extra: boolean;\n}\n\nconst SEVERITIES: Severity[] = ['blocking', 'major', 'minor', 'cosmetic'];\n\nexport function ReportFlow({ w }: { w: Ctx }) {\n const { copy, support, state, features } = w;\n const [step, setStep] = useState<Step>(1);\n const [what, setWhat] = useState('');\n const [expected, setExpected] = useState('');\n const [severity, setSeverity] = useState<Severity>('major');\n const [where, setWhere] = useState(String(support.context().area ?? ''));\n const [touched, setTouched] = useState(false);\n const [collected, setCollected] = useState<Collected | null>(null);\n const [shot, setShot] = useState<Shot | null>(null);\n const [shotError, setShotError] = useState<string | null>(null);\n const [capturing, setCapturing] = useState(false);\n const [include, setInclude] = useState<Include>({ screenshot: true, system: true, trail: true, extra: true });\n const [contact, setContact] = useState({ name: '', email: '' });\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const anonymous = state.signedIn !== true;\n\n const problem = validateIssue({ what, expected });\n\n async function toAttach() {\n setTouched(true);\n if (problem) return;\n setBusy(true);\n try {\n setCollected(await support.collect());\n } catch {\n setCollected({ trail: support.trail.recent(10) });\n } finally {\n setBusy(false);\n setStep(2);\n }\n }\n\n async function capture() {\n setCapturing(true);\n setShotError(null);\n const r = await w.capture();\n setCapturing(false);\n if (r.ok) {\n setShot({ dataUrl: r.dataUrl, width: r.width, height: r.height, bytes: r.bytes, mime: r.mime });\n setInclude((p) => ({ ...p, screenshot: true }));\n } else if (r.reason !== 'cancelled') {\n setShotError(r.message);\n }\n }\n\n async function send() {\n setBusy(true);\n setError(null);\n try {\n const res = await support.submitIssue({\n what,\n expected,\n severity,\n area: where,\n screenshot: include.screenshot && shot ? shot.dataUrl : undefined,\n include: { screenshot: include.screenshot && !!shot, system: include.system, browser: include.system, trail: include.trail, extra: include.extra },\n contact: anonymous && (contact.name || contact.email) ? { name: contact.name || undefined, email: contact.email || undefined } : undefined,\n });\n w.emit('submitted', { ...res, type: 'incident' });\n w.go({ name: 'sent', id: res.id, ref: res.ref });\n } catch (e) {\n setError(e instanceof Error ? e.message : copy.error);\n } finally {\n setBusy(false);\n }\n }\n\n const trail = collected?.trail ?? [];\n const extraKeys = collected?.extra ? Object.keys(collected.extra) : [];\n\n return (\n <>\n <Steps step={step} labels={[copy.stepDescribe, copy.stepAttach, copy.stepReview]} />\n <div class=\"sg-body\">\n {step === 1 && <SlotPoint name=\"report-top\" filled={w.slots} />}\n {step === 1 && (\n <div class=\"sg-pad sg-stack\">\n <Field label={copy.whatLabel} hint={copy.whatHint} error={touched && problem?.field === 'what' ? problem.message : null}>\n <textarea\n class={`sg-textarea${touched && problem?.field === 'what' ? ' sg-invalid' : ''}`}\n value={what}\n onInput={(e) => setWhat(e.currentTarget.value)}\n placeholder={copy.whatPlaceholder}\n data-testid=\"sg-what\"\n autoFocus\n />\n </Field>\n <Field label={copy.expectedLabel} hint={copy.expectedHint} error={touched && problem?.field === 'expected' ? problem.message : null}>\n <textarea\n class={`sg-textarea${touched && problem?.field === 'expected' ? ' sg-invalid' : ''}`}\n value={expected}\n onInput={(e) => setExpected(e.currentTarget.value)}\n placeholder={copy.expectedPlaceholder}\n data-testid=\"sg-expected\"\n />\n </Field>\n <div>\n <span class=\"sg-label\">{copy.severityLabel}</span>\n <div class=\"sg-chips\" role=\"radiogroup\" aria-label={copy.severityLabel}>\n {SEVERITIES.map((s) => (\n <button\n key={s}\n type=\"button\"\n class=\"sg-chip\"\n role=\"radio\"\n aria-checked={severity === s}\n onClick={() => setSeverity(s)}\n data-testid={`sg-sev-${s}`}\n >\n <span class={`sg-dot sg-t-${SEVERITY[s].tone}`} />\n {SEVERITY[s].label}\n </button>\n ))}\n </div>\n <span class=\"sg-hint\">{SEVERITY[severity].hint}</span>\n </div>\n <Field label={copy.whereLabel} hint={copy.whereHint}>\n <input class=\"sg-input\" value={where} onInput={(e) => setWhere(e.currentTarget.value)} data-testid=\"sg-where\" />\n </Field>\n </div>\n )}\n\n {step === 2 && (\n <div class=\"sg-pad\">\n <p class=\"sg-p sg-small sg-muted\" style={{ marginBottom: '12px' }}>{copy.attachIntro}</p>\n\n {features.screenshot && (\n <Card\n icon=\"camera\"\n title={copy.screenshot}\n summary={shot ? `${shot.width}×${shot.height} · ${formatBytes(shot.bytes)}` : copy.screenshotNone}\n on={include.screenshot && !!shot}\n onToggle={(on) => (shot ? setInclude((p) => ({ ...p, screenshot: on })) : void capture())}\n accessory={\n <button type=\"button\" class=\"sg-link\" onClick={() => void capture()} disabled={capturing} data-testid=\"sg-capture\">\n {capturing ? copy.capturing : shot ? copy.retake : copy.capture}\n </button>\n }\n >\n {shot && <img class=\"sg-shot\" src={shot.dataUrl} alt=\"The frame that will be attached\" data-testid=\"sg-shot\" />}\n {shotError && <span class=\"sg-err\">{shotError}</span>}\n </Card>\n )}\n\n <Card\n icon=\"monitor\"\n title={copy.system}\n summary={`${describeSystem(collected?.system)} · ${describeBrowser(collected?.browser)}`}\n on={include.system}\n onToggle={(on) => setInclude((p) => ({ ...p, system: on }))}\n >\n <pre class=\"sg-json\">{JSON.stringify({ system: collected?.system, browser: collected?.browser }, null, 2)}</pre>\n </Card>\n\n <Card\n icon=\"history\"\n title={copy.trail}\n summary={trail.length ? `${trail.length} steps, ending with “${trail[trail.length - 1]!.label}”` : copy.trailNone}\n on={include.trail && trail.length > 0}\n onToggle={(on) => setInclude((p) => ({ ...p, trail: on }))}\n >\n {trail.length > 0 && (\n <ol class=\"sg-steplist\">\n {trail.map((t, i) => (\n <li key={i}>\n <span class=\"sg-when\">{formatAgo(t.at)}</span>\n <span class={t.kind === 'error' ? 'sg-err-step' : ''}>{t.label}</span>\n </li>\n ))}\n </ol>\n )}\n </Card>\n\n {extraKeys.length > 0 && (\n <Card\n icon=\"cpu\"\n title={copy.diagnostics}\n summary={extraKeys.join(', ')}\n on={include.extra}\n onToggle={(on) => setInclude((p) => ({ ...p, extra: on }))}\n >\n <pre class=\"sg-json\">{JSON.stringify(collected?.extra, null, 2)}</pre>\n </Card>\n )}\n </div>\n )}\n\n {step === 3 && (\n <div class=\"sg-pad\">\n <dl class=\"sg-review\" style={{ margin: 0 }}>\n <dt>{copy.whatLabel}</dt>\n <dd>{what.trim()}</dd>\n <dt>{copy.expectedLabel}</dt>\n <dd>{expected.trim()}</dd>\n <dt>{copy.severityLabel}</dt>\n <dd>{SEVERITY[severity].label}</dd>\n {where.trim() && (\n <>\n <dt>{copy.whereLabel}</dt>\n <dd>{where.trim()}</dd>\n </>\n )}\n {w.appVersion && (\n <>\n <dt>Version</dt>\n <dd>{w.appVersion}</dd>\n </>\n )}\n </dl>\n <span class=\"sg-label\">{copy.attached}</span>\n <ul class=\"sg-attached\">\n {features.screenshot && <Attached on={include.screenshot && !!shot} label={copy.screenshot} copy={copy.notAttached} />}\n <Attached on={include.system} label={copy.system} copy={copy.notAttached} />\n <Attached on={include.trail && trail.length > 0} label={copy.trail} copy={copy.notAttached} />\n {extraKeys.length > 0 && <Attached on={include.extra} label={copy.diagnostics} copy={copy.notAttached} />}\n </ul>\n {anonymous && (\n <div style={{ marginTop: '16px' }}>\n <span class=\"sg-label\">{copy.contactLabel}</span>\n <div class=\"sg-stack\">\n <input class=\"sg-input\" placeholder={copy.namePlaceholder} value={contact.name} onInput={(e) => setContact((c) => ({ ...c, name: e.currentTarget.value }))} />\n <input class=\"sg-input\" type=\"email\" placeholder={copy.emailPlaceholder} value={contact.email} onInput={(e) => setContact((c) => ({ ...c, email: e.currentTarget.value }))} />\n </div>\n <span class=\"sg-hint\">{copy.contactHint}</span>\n </div>\n )}\n {error && <p class=\"sg-err\" role=\"alert\" style={{ marginTop: '12px' }}>{error}</p>}\n </div>\n )}\n </div>\n\n <div class=\"sg-footer\">\n <Button variant=\"ghost\" icon={step === 1 ? undefined : 'chevronLeft'} onClick={() => (step === 1 ? w.go({ name: 'home' }) : setStep((s) => (s - 1) as Step))}>\n {step === 1 ? copy.cancel : copy.back}\n </Button>\n {step === 1 && (\n <Button onClick={() => void toAttach()} busy={busy} testId=\"sg-next\">\n {copy.next}\n </Button>\n )}\n {step === 2 && (\n <Button onClick={() => setStep(3)} testId=\"sg-next\">\n {copy.next}\n </Button>\n )}\n {step === 3 && (\n <Button onClick={() => void send()} busy={busy} icon=\"send\" testId=\"sg-submit\">\n {copy.submitReport}\n </Button>\n )}\n </div>\n </>\n );\n}\n\n/** The step rail: a line that fills, because \"how much is left\" is the question mid-form. */\nexport function Steps({ step, labels }: { step: number; labels: string[] }) {\n return (\n <div class=\"sg-steps\" aria-label={`Step ${step} of ${labels.length}`}>\n {labels.map((label, i) => {\n const n = i + 1;\n const done = n < step;\n const now = n === step;\n return (\n <div class=\"sg-step\" key={label}>\n <div class=\"sg-step-line\">\n <span class={`sg-step-seg ${i === 0 ? 'sg-none' : done || now ? 'sg-on' : ''}`} />\n <span class={`sg-step-node${now ? ' sg-now' : done ? ' sg-done' : ''}`}>{done ? <Icon name=\"check\" size={11} stroke={2.6} /> : n}</span>\n <span class={`sg-step-seg ${i === labels.length - 1 ? 'sg-none' : done ? 'sg-on' : ''}`} />\n </div>\n <span class={`sg-step-label${now ? ' sg-now' : ''}`}>{label}</span>\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction Card({\n icon,\n title,\n summary,\n on,\n onToggle,\n accessory,\n children,\n}: {\n icon: IconName;\n title: string;\n summary: string;\n on: boolean;\n onToggle: (on: boolean) => void;\n accessory?: preact.ComponentChildren;\n children?: preact.ComponentChildren;\n}) {\n return (\n <div class={`sg-card${on ? '' : ' sg-off'}`}>\n <div class=\"sg-card-head\">\n <span class=\"sg-dim\" style={{ paddingTop: '2px' }}><Icon name={icon} /></span>\n <div class=\"sg-card-text\">\n <p class=\"sg-card-title\">{title}</p>\n <p class=\"sg-card-sum\">{summary}</p>\n {accessory && <div style={{ marginTop: '4px' }}>{accessory}</div>}\n </div>\n <Switch on={on} onChange={onToggle} label={`Attach ${title}`} />\n </div>\n {children && <div class=\"sg-card-body\">{children}</div>}\n </div>\n );\n}\n\nfunction Attached({ on, label, copy }: { on: boolean; label: string; copy: string }) {\n return (\n <li class={on ? '' : 'sg-dim'}>\n <span style={{ color: on ? 'var(--sg-success)' : 'var(--sg-dim)' }}>{on ? <Icon name=\"check\" size={14} stroke={2.4} /> : '–'}</span>\n {label}\n {!on && <span class=\"sg-small sg-dim\">{copy}</span>}\n </li>\n );\n}\n","import type { CaptureResult } from '../evidence.js';\nimport type { UiStore } from './store.js';\n\n/**\n * Capture mode: the panel steps aside so the person can go to the screen they\n * mean, and a small bar stays up with Capture and Cancel.\n *\n * A capture taken from inside the panel shows whatever was behind it, which is\n * rarely the screen the report is about. Here the panel is only HIDDEN (still\n * mounted), so the half-written report survives the person changing tabs,\n * scrolling or opening a menu in the product, and the panel comes back on the\n * same step with the frame in it.\n *\n * The browser's permission prompt is asked on Capture, not on entering the\n * mode: Capture is the user gesture `getDisplayMedia` needs, and the stream is\n * live for one frame rather than for the whole walk round the product.\n *\n * `start()` resolves once: with the frame, with `cancelled` (Cancel, Escape,\n * the panel closed), or with the error that ended it. Declining the browser's\n * own prompt is NOT an end: the bar stays up, to try again or cancel.\n */\nexport interface Picker {\n start(): Promise<CaptureResult>;\n capture(): Promise<void>;\n cancel(): void;\n readonly active: boolean;\n}\n\nconst CANCELLED: CaptureResult = { ok: false, reason: 'cancelled', message: 'Capture was cancelled.' };\n\nexport function createPicker(\n ui: UiStore,\n grab: (hooks: { beforeCapture: () => void; afterCapture: () => void }) => Promise<CaptureResult>,\n supported: () => boolean,\n): Picker {\n let settle: ((r: CaptureResult) => void) | null = null;\n let busy = false;\n\n function end(r: CaptureResult) {\n const done = settle;\n settle = null;\n busy = false;\n ui.set({ picking: false, hidden: false });\n done?.(r);\n }\n\n return {\n get active() {\n return settle !== null;\n },\n start() {\n if (!supported()) {\n return Promise.resolve({ ok: false, reason: 'unsupported', message: 'This browser cannot capture the screen.' });\n }\n // A second start while one is open answers the first as cancelled.\n if (settle) end(CANCELLED);\n return new Promise<CaptureResult>((resolve) => {\n settle = resolve;\n ui.set({ picking: true, hidden: false });\n });\n },\n async capture() {\n if (!settle || busy) return;\n busy = true;\n // The bar leaves the picture BEFORE the stream exists, not once it does:\n // a tab stream's first frames can predate a hide made after it started\n // (measured in Roster: the bar was in the frame), and the browser's\n // prompt draws over the page anyway.\n ui.set({ hidden: true });\n const r = await grab({\n beforeCapture: () => ui.set({ hidden: true }),\n afterCapture: () => {},\n });\n busy = false;\n if (!settle) return; // cancelled while the prompt was up\n if (!r.ok && r.reason === 'cancelled') {\n ui.set({ hidden: false }); // the prompt was declined: the bar comes back\n return;\n }\n end(r);\n },\n cancel() {\n if (settle) end(CANCELLED);\n },\n };\n}\n","/**\n * The panel's stylesheet, inside its own shadow root.\n *\n * ⚠ SHADOW DOM, SO NOTHING LEAKS EITHER WAY. The product's CSS cannot reach in\n * (a global `button { … }` or a reset will not restyle the panel) and nothing\n * here can reach out. The product's font still inherits through, which is what\n * makes `font: inherit` look native. Every colour, radius and size is a token\n * from the theme.\n */\nexport const STYLES = /* css */ `\n/* Reset everything the page could push in, except the font: the panel should\n speak in the product's typeface, so that one is inherited on purpose. */\n:host { all: initial; font-family: inherit; }\n.sg-root { font-family: var(--sg-font); font-size: var(--sg-size); line-height: 1.5; color: var(--sg-text);\n -webkit-font-smoothing: antialiased; }\n.sg-root *, .sg-root *::before, .sg-root *::after { box-sizing: border-box; }\n.sg-root button, .sg-root input, .sg-root textarea { font: inherit; color: inherit; }\n.sg-root :focus-visible { outline: 2px solid var(--sg-accent); outline-offset: 2px; }\n\n/* ---------------------------------------------------------- launcher */\n.sg-launcher { position: fixed; bottom: 20px; z-index: var(--sg-z); display: inline-flex; align-items: center; gap: 8px;\n height: 44px; padding: 0 16px 0 14px; border: 0; border-radius: 999px; cursor: pointer;\n background: var(--sg-accent); color: var(--sg-accent-text); font-weight: 600; font-size: calc(var(--sg-size) + 0.5px);\n box-shadow: 0 10px 30px -10px color-mix(in srgb, var(--sg-accent) 70%, black), 0 2px 6px rgba(0,0,0,0.18);\n transition: transform .16s ease, box-shadow .16s ease; }\n.sg-launcher:hover { transform: translateY(-1px); }\n.sg-launcher.sg-right { right: 20px; } .sg-launcher.sg-left { left: 20px; }\n.sg-launcher[data-hidden=\"true\"] { opacity: 0; pointer-events: none; transform: scale(.9); }\n.sg-badge { min-width: 18px; height: 18px; padding: 0 5px; border-radius: 999px; background: var(--sg-danger); color: #fff;\n font-size: 11px; font-weight: 700; display: inline-flex; align-items: center; justify-content: center; line-height: 1; }\n.sg-launcher .sg-badge { margin-left: 2px; box-shadow: 0 0 0 2px var(--sg-accent); }\n\n/* ------------------------------------------------------------ frame */\n.sg-scrim { position: fixed; inset: 0; z-index: var(--sg-z); background: var(--sg-scrim); opacity: 0; transition: opacity .18s ease;\n backdrop-filter: blur(1.5px); }\n.sg-open .sg-scrim { opacity: 1; }\n.sg-panel { position: fixed; z-index: calc(var(--sg-z) + 1); display: flex; flex-direction: column; overflow: hidden;\n background: var(--sg-bg); color: var(--sg-text); border: 1px solid var(--sg-border); box-shadow: var(--sg-shadow);\n transition: transform .24s cubic-bezier(.22,1,.36,1), opacity .2s ease; }\n.sg-panel[hidden] { display: none; }\n/* The panel takes focus on open so Tab starts inside it; the container itself needs no ring. */\n.sg-panel:focus { outline: none; }\n.sg-drawer { top: 0; bottom: 0; width: min(var(--sg-width), 100vw); border-top: 0; border-bottom: 0; }\n.sg-drawer.sg-right { right: 0; border-right: 0; transform: translateX(100%); }\n.sg-drawer.sg-left { left: 0; border-left: 0; transform: translateX(-100%); }\n.sg-open .sg-drawer { transform: none; }\n.sg-modal { left: 50%; top: 50%; width: min(560px, calc(100vw - 32px)); height: min(720px, calc(100vh - 48px));\n border-radius: calc(var(--sg-radius) + 4px); transform: translate(-50%, -48%) scale(.98); opacity: 0; }\n.sg-open .sg-modal { transform: translate(-50%, -50%); opacity: 1; }\n.sg-popover { bottom: 80px; width: min(calc(var(--sg-width) - 40px), calc(100vw - 32px)); height: min(680px, calc(100vh - 110px));\n border-radius: calc(var(--sg-radius) + 4px); transform: translateY(12px) scale(.98); opacity: 0; transform-origin: bottom right; }\n.sg-popover.sg-right { right: 20px; } .sg-popover.sg-left { left: 20px; transform-origin: bottom left; }\n.sg-open .sg-popover { transform: none; opacity: 1; }\n.sg-sheet { left: 0; right: 0; bottom: 0; height: min(88vh, 760px); border-radius: calc(var(--sg-radius) + 6px) calc(var(--sg-radius) + 6px) 0 0;\n border-bottom: 0; transform: translateY(100%); }\n.sg-open .sg-sheet { transform: none; }\n.sg-grabber { width: 36px; height: 4px; border-radius: 4px; background: var(--sg-border); margin: 8px auto 0; flex: none; }\n.sg-accentline { position: absolute; inset: 0 0 auto 0; height: 1px; pointer-events: none;\n background: linear-gradient(90deg, var(--sg-accent), color-mix(in srgb, var(--sg-accent) 30%, transparent), transparent); }\n\n/* -------------------------------------------------------- structure */\n.sg-header { display: flex; align-items: center; gap: 10px; padding: 12px 14px; border-bottom: 1px solid var(--sg-border); flex: none; position: relative; }\n.sg-brand { width: 28px; height: 28px; border-radius: var(--sg-radius-sm); object-fit: contain; flex: none; }\n.sg-head-text { min-width: 0; flex: 1; }\n.sg-title { margin: 0; font-size: calc(var(--sg-size) + 1.5px); font-weight: 650; letter-spacing: -0.01em; line-height: 1.25;\n white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.sg-sub { margin: 1px 0 0; font-size: calc(var(--sg-size) - 2.5px); color: var(--sg-dim); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.sg-iconbtn { width: 30px; height: 30px; border: 0; background: transparent; border-radius: var(--sg-radius-sm); color: var(--sg-muted);\n display: inline-flex; align-items: center; justify-content: center; cursor: pointer; flex: none; }\n.sg-iconbtn:hover { background: var(--sg-raised); color: var(--sg-text); }\n.sg-body { flex: 1; min-height: 0; overflow-y: auto; overscroll-behavior: contain; }\n.sg-pad { padding: 14px 16px; }\n.sg-stack > * + * { margin-top: 14px; }\n.sg-footer { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 10px 14px;\n border-top: 1px solid var(--sg-border); flex: none; }\n.sg-section { padding: 14px 16px; }\n.sg-section + .sg-section { border-top: 1px solid var(--sg-border); }\n.sg-section-head { display: flex; align-items: baseline; justify-content: space-between; margin-bottom: 10px; }\n.sg-section-title { margin: 0; font-size: calc(var(--sg-size) - 2px); font-weight: 650; letter-spacing: .06em; text-transform: uppercase; color: var(--sg-dim); }\n.sg-muted { color: var(--sg-muted); } .sg-dim { color: var(--sg-dim); }\n.sg-small { font-size: calc(var(--sg-size) - 1.5px); }\n.sg-mono { font-family: var(--sg-mono); font-size: calc(var(--sg-size) - 2px); letter-spacing: .02em; }\n.sg-p { margin: 0; }\n\n/* ----------------------------------------------------------- actions */\n.sg-action { width: 100%; display: flex; align-items: center; gap: 12px; padding: 11px 12px; border: 1px solid var(--sg-border);\n border-radius: var(--sg-radius); background: var(--sg-surface); cursor: pointer; text-align: left; transition: background .12s ease, border-color .12s ease; }\n.sg-action + .sg-action { margin-top: 8px; }\n.sg-action:hover { background: var(--sg-raised); border-color: color-mix(in srgb, var(--sg-accent) 35%, var(--sg-border)); }\n.sg-action-text { flex: 1; min-width: 0; }\n.sg-action-label { display: block; font-weight: 600; }\n.sg-action-hint { display: block; font-size: calc(var(--sg-size) - 1.5px); color: var(--sg-dim); }\n.sg-chev { color: var(--sg-dim); flex: none; }\n.sg-tile { width: 34px; height: 34px; border-radius: var(--sg-radius-sm); display: inline-flex; align-items: center; justify-content: center; flex: none; }\n.sg-tile.sg-sm { width: 28px; height: 28px; }\n.sg-tile-img { width: 20px; height: 20px; object-fit: contain; }\na.sg-action { color: inherit; text-decoration: none; }\n\n/* Host content, in the host's own styles. The wrapper only spaces it. */\n.sg-slot { padding: 12px 16px 0; }\n.sg-slot-header { padding: 0; display: flex; align-items: center; flex: none; }\n.sg-slot-footer { padding: 10px 14px; border-top: 1px solid var(--sg-border); flex: none; }\n.sg-slot-sent { padding: 18px 0 0; width: 100%; }\n.sg-slot-home-bottom { padding: 12px 16px 16px; }\n\n/* tones */\n.sg-t-accent { --sg-tone: var(--sg-accent); } .sg-t-info { --sg-tone: var(--sg-info); } .sg-t-warn { --sg-tone: var(--sg-warning); }\n.sg-t-danger { --sg-tone: var(--sg-danger); } .sg-t-success { --sg-tone: var(--sg-success); } .sg-t-neutral { --sg-tone: var(--sg-muted); }\n.sg-tile[class*=\"sg-t-\"] { color: var(--sg-tone); background: color-mix(in srgb, var(--sg-tone) 15%, transparent); }\n.sg-pill { display: inline-flex; align-items: center; gap: 5px; padding: 2px 8px; border-radius: 999px; white-space: nowrap;\n font-size: calc(var(--sg-size) - 2.5px); font-weight: 600; color: var(--sg-tone); background: color-mix(in srgb, var(--sg-tone) 14%, transparent);\n border: 1px solid color-mix(in srgb, var(--sg-tone) 30%, transparent); }\n.sg-banner { display: flex; gap: 10px; align-items: flex-start; padding: 11px 12px; border-radius: var(--sg-radius);\n background: color-mix(in srgb, var(--sg-tone) 11%, transparent); border: 1px solid color-mix(in srgb, var(--sg-tone) 32%, transparent); }\n.sg-banner-title { margin: 0; font-weight: 600; } .sg-banner-body { margin: 2px 0 0; color: var(--sg-muted); font-size: calc(var(--sg-size) - 1px); }\nbutton.sg-banner { width: 100%; text-align: left; cursor: pointer; }\n\n/* ---------------------------------------------------------- controls */\n.sg-btn { display: inline-flex; align-items: center; justify-content: center; gap: 7px; height: 34px; padding: 0 14px; border-radius: var(--sg-radius-sm);\n border: 1px solid transparent; background: var(--sg-accent); color: var(--sg-accent-text); font-weight: 600; cursor: pointer; white-space: nowrap;\n transition: filter .12s ease, opacity .12s ease; }\n.sg-btn:hover { filter: brightness(1.08); }\n.sg-btn:disabled { opacity: .45; cursor: default; filter: none; }\n.sg-btn-ghost { background: transparent; color: var(--sg-muted); border-color: var(--sg-border); }\n.sg-btn-ghost:hover { background: var(--sg-raised); color: var(--sg-text); filter: none; }\n.sg-btn-danger { background: transparent; color: var(--sg-danger); border-color: color-mix(in srgb, var(--sg-danger) 40%, transparent); }\n.sg-link { border: 0; background: none; padding: 0; color: var(--sg-accent); cursor: pointer; font-weight: 600; font-size: calc(var(--sg-size) - 1px); }\n.sg-link:hover { text-decoration: underline; }\n.sg-quiet-link { align-self: flex-start; border: 0; background: none; padding: 0; color: var(--sg-dim); cursor: pointer; font: inherit; font-size: calc(var(--sg-size) - 1.5px); text-decoration: underline; text-underline-offset: 3px; text-decoration-color: color-mix(in srgb, currentColor 40%, transparent); }\n.sg-quiet-link:hover { color: var(--sg-text); }\n.sg-closed { border-top: 1px solid var(--sg-border); }\n.sg-closed > summary, .sg-closed-link { display: flex; align-items: center; gap: 6px; width: 100%; padding: 12px 16px; list-style: none; cursor: pointer;\n border: 0; background: none; color: var(--sg-muted); font: inherit; font-weight: 600; font-size: calc(var(--sg-size) - 1.5px); text-align: left; }\n.sg-closed > summary::-webkit-details-marker { display: none; }\n.sg-closed > summary:hover, .sg-closed-link:hover { color: var(--sg-text); }\n.sg-closed > summary svg { transition: transform .15s ease; }\n.sg-closed[open] > summary svg { transform: rotate(90deg); }\n.sg-closed-link { justify-content: space-between; border-top: 1px solid var(--sg-border); }\n.sg-back { border: 0; background: none; padding: 0; color: var(--sg-muted); cursor: pointer; display: inline-flex; align-items: center; gap: 4px; }\n.sg-back:hover { color: var(--sg-text); }\n.sg-field { display: block; }\n.sg-label { display: block; font-weight: 600; margin-bottom: 4px; }\n.sg-hint { display: block; color: var(--sg-dim); font-size: calc(var(--sg-size) - 1.5px); margin-top: 4px; }\n.sg-err { display: block; color: var(--sg-danger); font-size: calc(var(--sg-size) - 1.5px); margin-top: 4px; }\n.sg-input, .sg-textarea { width: 100%; border: 1px solid var(--sg-border); background: var(--sg-surface); border-radius: var(--sg-radius-sm);\n padding: 8px 10px; outline: none; transition: border-color .12s ease, box-shadow .12s ease; }\n.sg-textarea { min-height: 84px; resize: vertical; line-height: 1.45; }\n.sg-input:focus, .sg-textarea:focus { border-color: var(--sg-accent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--sg-accent) 22%, transparent); }\n.sg-input::placeholder, .sg-textarea::placeholder { color: var(--sg-dim); }\n.sg-invalid { border-color: var(--sg-danger) !important; }\n.sg-chips { display: flex; flex-wrap: wrap; gap: 6px; }\n.sg-chip { display: inline-flex; align-items: center; gap: 6px; padding: 5px 10px; border-radius: 999px; border: 1px solid var(--sg-border);\n background: var(--sg-surface); cursor: pointer; font-size: calc(var(--sg-size) - 1px); }\n.sg-chip:hover { background: var(--sg-raised); }\n.sg-chip[aria-pressed=\"true\"], .sg-chip[aria-checked=\"true\"] { border-color: var(--sg-accent); background: color-mix(in srgb, var(--sg-accent) 16%, transparent); color: var(--sg-text); }\n.sg-dot { width: 7px; height: 7px; border-radius: 999px; background: var(--sg-tone, var(--sg-accent)); flex: none; display: inline-block; }\n\n/* -------------------------------------------------------- step rail */\n.sg-steps { display: flex; padding: 12px 16px 10px; border-bottom: 1px solid var(--sg-border); flex: none; }\n.sg-step { flex: 1; min-width: 0; display: flex; flex-direction: column; align-items: center; }\n.sg-step-line { display: flex; align-items: center; width: 100%; }\n.sg-step-seg { flex: 1; height: 1px; background: var(--sg-border); }\n.sg-step-seg.sg-on { background: color-mix(in srgb, var(--sg-accent) 70%, transparent); }\n.sg-step-seg.sg-none { background: transparent; }\n.sg-step-node { width: 20px; height: 20px; border-radius: 999px; border: 1px solid var(--sg-border); display: inline-flex; align-items: center;\n justify-content: center; font-size: 10px; font-weight: 700; color: var(--sg-dim); flex: none; }\n.sg-step-node.sg-now { background: var(--sg-accent); border-color: var(--sg-accent); color: var(--sg-accent-text);\n box-shadow: 0 0 14px -2px color-mix(in srgb, var(--sg-accent) 85%, transparent); }\n.sg-step-node.sg-done { background: color-mix(in srgb, var(--sg-accent) 20%, transparent); border-color: color-mix(in srgb, var(--sg-accent) 60%, transparent); color: var(--sg-accent); }\n.sg-step-label { margin-top: 5px; font-size: calc(var(--sg-size) - 3px); color: var(--sg-dim); letter-spacing: .02em; }\n.sg-step-label.sg-now { color: var(--sg-text); font-weight: 600; }\n\n/* --------------------------------------------------- evidence cards */\n.sg-card { border: 1px solid var(--sg-border); border-radius: var(--sg-radius); background: var(--sg-surface); overflow: hidden; }\n.sg-card + .sg-card { margin-top: 8px; }\n.sg-card-head { display: flex; align-items: flex-start; gap: 10px; padding: 10px 12px; }\n.sg-card-text { flex: 1; min-width: 0; }\n.sg-card-title { margin: 0; font-weight: 600; }\n.sg-card-sum { margin: 1px 0 0; color: var(--sg-dim); font-size: calc(var(--sg-size) - 1.5px); }\n.sg-card-body { padding: 0 12px 12px; }\n.sg-card.sg-off .sg-card-body, .sg-card.sg-off .sg-card-title { opacity: .55; }\n.sg-switch { position: relative; width: 34px; height: 20px; border-radius: 999px; border: 0; background: var(--sg-raised); cursor: pointer; flex: none;\n box-shadow: inset 0 0 0 1px var(--sg-border); transition: background .15s ease; }\n.sg-switch::after { content: ''; position: absolute; top: 3px; left: 3px; width: 14px; height: 14px; border-radius: 999px; background: var(--sg-muted);\n transition: transform .15s ease, background .15s ease; }\n.sg-switch[aria-checked=\"true\"] { background: var(--sg-accent); box-shadow: none; }\n.sg-switch[aria-checked=\"true\"]::after { transform: translateX(14px); background: var(--sg-accent-text); }\n.sg-shot { display: block; width: 100%; max-height: 220px; object-fit: contain; border-radius: var(--sg-radius-sm); border: 1px solid var(--sg-border); background: var(--sg-bg); }\n.sg-json { margin: 0; max-height: 180px; overflow: auto; padding: 8px 10px; border-radius: var(--sg-radius-sm); background: var(--sg-bg);\n border: 1px solid var(--sg-border); font-family: var(--sg-mono); font-size: calc(var(--sg-size) - 2.5px); line-height: 1.5; color: var(--sg-muted); white-space: pre-wrap; word-break: break-word; }\n.sg-steplist { margin: 0; padding: 0; list-style: none; }\n.sg-steplist li { display: flex; gap: 8px; font-size: calc(var(--sg-size) - 1px); padding: 2px 0; }\n.sg-steplist .sg-when { width: 54px; flex: none; text-align: right; color: var(--sg-dim); font-size: calc(var(--sg-size) - 2.5px); padding-top: 1px; }\n.sg-steplist .sg-err-step { color: var(--sg-danger); }\n.sg-review dt { font-size: calc(var(--sg-size) - 3px); text-transform: uppercase; letter-spacing: .07em; color: var(--sg-dim); font-weight: 650; }\n.sg-review dd { margin: 2px 0 12px; white-space: pre-wrap; word-break: break-word; }\n.sg-attached { margin: 0; padding: 0; list-style: none; }\n.sg-attached li { display: flex; gap: 8px; align-items: center; padding: 2px 0; }\n\n/* ------------------------------------------------------------ lists */\n.sg-list { margin: 0; padding: 0; list-style: none; }\n.sg-row { width: 100%; display: flex; gap: 10px; align-items: flex-start; padding: 11px 16px; border: 0; background: transparent; cursor: pointer; text-align: left; }\n.sg-row:hover { background: var(--sg-surface); }\n.sg-list li + li .sg-row { border-top: 1px solid var(--sg-border); }\n.sg-row-main { flex: 1; min-width: 0; }\n.sg-row-top { display: flex; align-items: flex-start; gap: 8px; }\n.sg-row-title { flex: 1; min-width: 0; font-weight: 550; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.sg-row-meta { margin-top: 2px; color: var(--sg-dim); font-size: calc(var(--sg-size) - 2.5px); display: flex; gap: 6px; flex-wrap: wrap; align-items: center; }\n.sg-row-cta { margin-top: 6px; display: inline-flex; align-items: center; gap: 6px; padding: 3px 8px; border-radius: var(--sg-radius-sm);\n font-size: calc(var(--sg-size) - 2px); font-weight: 600; color: var(--sg-tone); background: color-mix(in srgb, var(--sg-tone) 13%, transparent); }\n.sg-empty { text-align: center; padding: 34px 20px; }\n.sg-empty-icon { width: 44px; height: 44px; border-radius: 999px; border: 1px solid var(--sg-border); display: inline-flex; align-items: center; justify-content: center; color: var(--sg-dim); }\n\n/* ---------------------------------------------------- lifecycle rail */\n.sg-rail { display: flex; align-items: flex-start; }\n.sg-rail-stage { flex: 1; min-width: 0; display: flex; flex-direction: column; align-items: center; text-align: center; }\n.sg-rail-line { display: flex; align-items: center; width: 100%; }\n.sg-rail-seg { flex: 1; height: 2px; border-radius: 2px; background: var(--sg-border); }\n.sg-rail-seg.sg-on { background: var(--sg-tone, var(--sg-accent)); }\n.sg-rail-seg.sg-none { background: transparent; }\n.sg-rail-node { width: 12px; height: 12px; border-radius: 999px; border: 2px solid var(--sg-border); background: var(--sg-bg); flex: none; }\n.sg-rail-node.sg-on { border-color: var(--sg-tone, var(--sg-accent)); background: var(--sg-tone, var(--sg-accent)); }\n.sg-rail-node.sg-here { box-shadow: 0 0 0 4px color-mix(in srgb, var(--sg-tone, var(--sg-accent)) 25%, transparent); }\n.sg-rail-node.sg-yours { border-color: var(--sg-tone, var(--sg-accent)); border-style: dashed; }\n.sg-rail-node.sg-pulse { animation: sg-pulse 1.6s ease-in-out infinite; }\n.sg-rail-label { margin-top: 6px; font-size: calc(var(--sg-size) - 3px); color: var(--sg-dim); line-height: 1.2; }\n.sg-rail-label.sg-on { color: var(--sg-text); }\n.sg-rail-box { padding: 12px 10px 10px; border-radius: var(--sg-radius); border: 1px solid var(--sg-border);\n background: linear-gradient(180deg, var(--sg-surface), transparent); }\n@keyframes sg-pulse { 0%,100% { box-shadow: 0 0 0 3px color-mix(in srgb, var(--sg-tone, var(--sg-accent)) 15%, transparent); }\n 50% { box-shadow: 0 0 0 7px color-mix(in srgb, var(--sg-tone, var(--sg-accent)) 28%, transparent); } }\n\n/* ----------------------------------------------------- conversation */\n.sg-thread { display: flex; flex-direction: column; gap: 10px; }\n.sg-event { display: flex; align-items: center; gap: 8px; color: var(--sg-dim); font-size: calc(var(--sg-size) - 2px); }\n.sg-event::before, .sg-event::after { content: ''; flex: 1; height: 1px; background: var(--sg-border); }\n.sg-msg { max-width: 88%; padding: 9px 11px; border-radius: var(--sg-radius); white-space: pre-wrap; word-break: break-word; }\n.sg-msg-meta { display: block; font-size: calc(var(--sg-size) - 3px); color: var(--sg-dim); margin-bottom: 2px; }\n.sg-msg.sg-team { align-self: flex-start; background: var(--sg-surface); border: 1px solid var(--sg-border); border-top-left-radius: 4px; }\n.sg-msg.sg-you { align-self: flex-end; background: color-mix(in srgb, var(--sg-accent) 18%, var(--sg-bg));\n border: 1px solid color-mix(in srgb, var(--sg-accent) 35%, transparent); border-top-right-radius: 4px; }\n.sg-composer { display: flex; gap: 8px; align-items: flex-end; padding: 10px 14px; border-top: 1px solid var(--sg-border); flex: none; }\n.sg-composer .sg-textarea { min-height: 38px; max-height: 140px; }\n\n/* -------------------------------------------------------- confirmed */\n.sg-confirm { height: 100%; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; padding: 24px; }\n.sg-ring { width: 50px; height: 50px; border-radius: 999px; display: inline-flex; align-items: center; justify-content: center; color: var(--sg-success);\n background: color-mix(in srgb, var(--sg-success) 12%, transparent); border: 1px solid color-mix(in srgb, var(--sg-success) 40%, transparent); }\n.sg-ref { margin-top: 8px; padding: 3px 10px; border-radius: 999px; border: 1px solid var(--sg-border); background: var(--sg-surface); font-family: var(--sg-mono); font-size: calc(var(--sg-size) - 2px); }\n\n/* ------------------------------------------------------------- faq */\n.sg-faq { border: 1px solid var(--sg-border); border-radius: var(--sg-radius); background: var(--sg-surface); }\n.sg-faq + .sg-faq { margin-top: 8px; }\n.sg-faq summary { list-style: none; cursor: pointer; padding: 10px 12px; font-weight: 600; display: flex; gap: 8px; align-items: center; }\n.sg-faq summary::-webkit-details-marker { display: none; }\n.sg-faq summary .sg-chev { margin-left: auto; transition: transform .15s ease; }\n.sg-faq[open] summary .sg-chev { transform: rotate(90deg); }\n.sg-faq-a { padding: 0 12px 12px; color: var(--sg-muted); white-space: pre-wrap; }\n\n.sg-skeleton { height: 46px; border-radius: var(--sg-radius-sm); background: var(--sg-surface); margin: 8px 16px; animation: sg-shimmer 1.2s ease-in-out infinite; }\n@keyframes sg-shimmer { 50% { opacity: .55; } }\n.sg-spin { width: 14px; height: 14px; border-radius: 999px; border: 2px solid currentColor; border-right-color: transparent; animation: sg-rot .7s linear infinite; }\n@keyframes sg-rot { to { transform: rotate(360deg); } }\n.sg-refresh.sg-busy svg { animation: sg-rot .7s linear infinite; }\n.sg-sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }\n\n/* A phone gets a sheet whatever the layout asked for: a drawer at 375px is\n a full screen without a way to see what is behind it. */\n@media (max-width: 560px) {\n .sg-panel.sg-drawer, .sg-panel.sg-modal, .sg-panel.sg-popover { left: 0; right: 0; top: auto; bottom: 0; width: 100%; height: min(90vh, 760px);\n border-radius: calc(var(--sg-radius) + 6px) calc(var(--sg-radius) + 6px) 0 0; border: 1px solid var(--sg-border); border-bottom: 0;\n transform: translateY(100%); opacity: 1; }\n .sg-open .sg-panel { transform: none; }\n .sg-launcher { bottom: calc(16px + env(safe-area-inset-bottom)); }\n}\n/* ------------------------------------------------------------ capture mode */\n/* The bar sits over the product while the person goes to the screen they mean.\n The root is visibility:hidden then; this opts back in. Small and centred so it\n covers as little of the product as it can. */\n.sg-pickbar { visibility: visible; position: fixed; top: 12px; left: 50%; transform: translateX(-50%);\n z-index: calc(var(--sg-z) + 2); display: flex; align-items: center; gap: 10px; max-width: calc(100vw - 24px);\n padding: 6px 6px 6px 14px; border-radius: 999px; background: var(--sg-bg); color: var(--sg-text);\n border: 1px solid var(--sg-border); box-shadow: var(--sg-shadow); }\n.sg-pickdot { flex: none; width: 8px; height: 8px; border-radius: 50%; background: var(--sg-accent);\n box-shadow: 0 0 0 0 color-mix(in srgb, var(--sg-accent) 60%, transparent); animation: sg-pickpulse 1.6s ease-out infinite; }\n@keyframes sg-pickpulse { 70% { box-shadow: 0 0 0 7px transparent; } 100% { box-shadow: 0 0 0 0 transparent; } }\n.sg-pickhint { min-width: 0; font-size: calc(var(--sg-size) - 0.5px); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n.sg-pickbar .sg-btn { border-radius: 999px; }\n.sg-pickbar .sg-btn-ghost { padding: 0 12px; }\n/* A phone: the bar takes the width, the hint gets two lines, Cancel is its × alone. */\n@media (max-width: 480px) {\n .sg-pickbar { left: 12px; right: 12px; transform: none; border-radius: 22px; }\n .sg-pickhint { flex: 1; white-space: normal; line-height: 1.25; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }\n .sg-pick-cancel-label { display: none; }\n .sg-pickbar .sg-btn-ghost { padding: 0; width: 34px; }\n}\n@media (max-width: 480px) and (pointer: coarse) { .sg-pickbar .sg-btn-ghost { width: 44px; } }\n/* A finger, not a cursor: every control gets a 44px target (WCAG 2.5.5, Apple\n HIG), and text fields at least 16px so iOS does not zoom the page on focus.\n Visual sizes stay; where a control is drawn small, its hit area grows. */\n@media (pointer: coarse) {\n .sg-iconbtn { width: 44px; height: 44px; }\n .sg-btn { height: 44px; padding: 0 16px; }\n .sg-chip { min-height: 44px; padding: 8px 14px; }\n .sg-link, .sg-back, .sg-quiet-link { min-height: 44px; display: inline-flex; align-items: center; }\n .sg-closed > summary, .sg-closed-link { min-height: 44px; }\n .sg-switch::before { content: ''; position: absolute; inset: -12px -5px; }\n /* .sg-root-qualified: the base rule giving form fields \"font: inherit\" is\n .sg-root input, which outranks a bare class and kept them at 12.5px. */\n .sg-root .sg-input, .sg-root .sg-textarea { font-size: max(16px, var(--sg-size)); }\n .sg-input { min-height: 44px; }\n .sg-composer .sg-textarea { min-height: 44px; }\n .sg-faq summary { min-height: 44px; }\n .sg-row, .sg-action { min-height: 44px; }\n}\n@media (prefers-reduced-motion: reduce) {\n .sg-panel, .sg-scrim, .sg-launcher { transition: none; }\n .sg-rail-node.sg-pulse, .sg-skeleton, .sg-spin, .sg-refresh.sg-busy svg, .sg-pickdot { animation: none; }\n}\n`;\n","/** @jsxImportSource preact */\nimport { render } from 'preact';\nimport { useEffect, useMemo, useRef, useState } from 'preact/hooks';\n\nimport { captureFrom, captureScreen } from '../evidence.js';\nimport { formatAgo } from '../model.js';\nimport type { Support, SupportState } from '../support.js';\nimport { fill, type Copy } from './copy.js';\nimport type { Ctx, FaqItem, Features, HomeAction, Screen } from './ctx.js';\nimport { Icon } from './icons.js';\nimport { Faq } from './screens/faq.js';\nimport { FeedbackForm } from './screens/feedback.js';\nimport { Home } from './screens/home.js';\nimport { ReportFlow } from './screens/report.js';\nimport { ReportDetail, ReportList } from './screens/reports.js';\nimport { resolveTheme, themeVars, type ThemeInput } from './theme.js';\nimport { Button, SlotPoint, Tile } from './ui.js';\nimport { exposeParts } from './parts.js';\nimport { createPicker } from './pick.js';\nimport { STYLES } from './styles.js';\nimport type { Layout, UiStore } from './store.js';\n\nexport type { Layout } from './store.js';\n\nexport interface AppProps {\n ui: UiStore;\n support: Support;\n copy: Copy;\n features: Features;\n faq: FaqItem[];\n actions: HomeAction[];\n layout: Layout;\n side: 'left' | 'right';\n launcher: false | { position: 'bottom-right' | 'bottom-left'; label?: string };\n brand?: { name?: string; logo?: string };\n zIndex: number;\n /** The host's own frame source (a desktop shell); `WidgetConfig.captureFrame`. */\n captureFrame?: () => Promise<string>;\n emit: (event: string, detail?: unknown) => void;\n root: ShadowRoot;\n}\n\nfunction useStore<T>(subscribe: (fn: () => void) => () => void, get: () => T): T {\n const [, force] = useState(0);\n useEffect(() => subscribe(() => force((n) => n + 1)), [subscribe]);\n return get();\n}\n\nfunction usePrefersDark(): boolean {\n const query = typeof matchMedia === 'undefined' ? null : matchMedia('(prefers-color-scheme: dark)');\n const [dark, setDark] = useState(query?.matches ?? true);\n useEffect(() => {\n if (!query) return;\n const on = () => setDark(query.matches);\n query.addEventListener('change', on);\n return () => query.removeEventListener('change', on);\n }, []);\n return dark;\n}\n\nexport function App(p: AppProps) {\n const ui = useStore(p.ui.subscribe, p.ui.get);\n const state: SupportState = useStore(p.support.subscribe, p.support.getState);\n const prefersDark = usePrefersDark();\n const theme = useMemo(() => resolveTheme(ui.theme, prefersDark), [ui.theme, prefersDark]);\n const panel = useRef<HTMLDivElement>(null);\n const openerRef = useRef<Element | null>(null);\n const screen = ui.history[ui.history.length - 1] ?? { name: 'home' };\n const picker = useMemo(\n () => {\n const own = p.captureFrame;\n return own\n ? createPicker(p.ui, (hooks) => captureFrom(own, hooks), () => true)\n : createPicker(p.ui, captureScreen, () => typeof navigator !== 'undefined' && !!navigator.mediaDevices?.getDisplayMedia);\n },\n [p.ui],\n );\n const captureBtn = useRef<HTMLButtonElement>(null);\n const pickbar = useRef<HTMLDivElement>(null);\n\n const go = (s: Screen) =>\n p.ui.set({ history: s.name === 'home' ? [s] : [...ui.history.filter((h) => h.name !== s.name || s.name === 'detail'), s] });\n const back = () => p.ui.set({ history: ui.history.length > 1 ? ui.history.slice(0, -1) : [{ name: 'home' }] });\n const close = () => p.ui.set({ open: false });\n\n // Fresh data each time it opens; the badge has its own slower refresh.\n useEffect(() => {\n if (ui.open) void p.support.refresh();\n }, [ui.open, ui.session]);\n\n // While it is open, the list is what the person is looking at, so it keeps\n // up far faster than the closed badge's two minutes.\n useEffect(() => {\n if (!ui.open) return;\n const t = setInterval(() => {\n if (document.visibilityState === 'visible') void p.support.refresh();\n }, 15_000);\n return () => clearInterval(t);\n }, [ui.open, p.support]);\n\n // The refresh button. Spins for at least a beat, so a fast answer still\n // reads as \"checked\" rather than as a button that did nothing.\n const [checking, setChecking] = useState(false);\n const [checked, setChecked] = useState(0);\n async function check() {\n if (checking) return;\n setChecking(true);\n p.ui.set({ tick: ui.tick + 1 });\n await Promise.all([p.support.refresh(), new Promise((r) => setTimeout(r, 600))]);\n setChecking(false);\n setChecked(Date.now());\n }\n\n // Signed out while reading their reports: the detail screen holds its own\n // copy of the report, so leave those screens rather than keep showing it.\n useEffect(() => {\n if (state.signedIn !== false) return;\n const kept = ui.history.filter((h) => h.name !== 'reports' && h.name !== 'detail');\n if (kept.length !== ui.history.length) p.ui.set({ history: kept.length ? kept : [{ name: 'home' }] });\n }, [state.signedIn, ui.history, p.ui]);\n\n // Focus in on open, back where it was on close; Escape closes; Tab stays in.\n useEffect(() => {\n if (!ui.open) return;\n openerRef.current = document.activeElement;\n const t = setTimeout(() => {\n // A form's own first field when it asks for one; otherwise the panel\n // itself, so nothing looks pre-selected and Tab starts at the top.\n const first = panel.current?.querySelector<HTMLElement>('[autofocus]');\n (first ?? panel.current)?.focus({ preventScroll: true });\n }, 60);\n const onKey = (e: KeyboardEvent) => {\n // In capture mode the product is the person's to use: Escape leaves the\n // mode (back to the panel), and Tab is not held inside a hidden panel.\n if (p.ui.get().picking) {\n if (e.key === 'Escape') {\n e.stopPropagation();\n e.preventDefault();\n picker.cancel();\n }\n return;\n }\n if (e.key === 'Escape') {\n e.stopPropagation();\n e.preventDefault();\n close();\n return;\n }\n if (e.key !== 'Tab' || !panel.current || p.layout === 'popover') return;\n const focusables = [...panel.current.querySelectorAll<HTMLElement>('button:not([disabled]), input, textarea, summary, [tabindex=\"0\"]')].filter(\n (el) => el.offsetParent !== null,\n );\n if (!focusables.length) return;\n const active = p.root.activeElement;\n const first = focusables[0]!;\n const last = focusables[focusables.length - 1]!;\n if (e.shiftKey && active === first) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && active === last) {\n e.preventDefault();\n first.focus();\n }\n };\n // Capture: the product has its own Escape handlers, and an open panel owns Escape.\n window.addEventListener('keydown', onKey, true);\n return () => {\n clearTimeout(t);\n window.removeEventListener('keydown', onKey, true);\n (openerRef.current as HTMLElement | null)?.focus?.({ preventScroll: true });\n };\n }, [ui.open]);\n\n // Closed from outside (the host's close(), a sign-out) while picking: the form waiting on it hears cancelled.\n useEffect(() => {\n if (!ui.open && picker.active) picker.cancel();\n }, [ui.open, picker]);\n\n // Into capture mode: the bar's Capture takes focus. Back out: the panel does.\n const wasPickingRef = useRef(false);\n useEffect(() => {\n if (ui.picking && !wasPickingRef.current) captureBtn.current?.focus({ preventScroll: true });\n if (!ui.picking && wasPickingRef.current) panel.current?.focus({ preventScroll: true });\n wasPickingRef.current = ui.picking;\n }, [ui.picking]);\n\n // While the bar is up, the page makes room for it: whatever sat under the\n // bar (a header, its buttons) moves below it and stays reachable. Taken off\n // for the frame itself (hidden), so the capture shows the page as it is.\n // Reported 2026-10-09 in Roster's tray: the bar covered the header's buttons.\n useEffect(() => {\n if (!ui.picking || ui.hidden || !pickbar.current) return;\n const html = document.documentElement;\n const prev = html.style.getPropertyValue('padding-top');\n const prevPriority = html.style.getPropertyPriority('padding-top');\n const base = parseFloat(getComputedStyle(html).paddingTop) || 0;\n const room = Math.ceil(pickbar.current.getBoundingClientRect().bottom) + 8;\n html.style.setProperty('padding-top', `${base + room}px`, 'important');\n return () => {\n if (prev) html.style.setProperty('padding-top', prev, prevPriority);\n else html.style.removeProperty('padding-top');\n };\n }, [ui.picking, ui.hidden]);\n\n const w: Ctx = {\n support: p.support,\n state,\n tick: ui.tick,\n copy: p.copy,\n features: { ...p.features, reports: p.features.reports },\n faq: p.faq,\n actions: p.actions,\n slots: new Set(ui.slots),\n appVersion: p.support.appVersion,\n go,\n capture: () => picker.start(),\n emit: p.emit,\n };\n\n const title =\n screen.name === 'report' ? p.copy.reportAction :\n screen.name === 'feedback' ? p.copy.feedbackAction :\n screen.name === 'faq' ? 'FAQs' :\n screen.name === 'reports' ? p.copy.yourReports :\n screen.name === 'detail' ? (state.reports.find((r) => r.id === screen.id)?.ref ?? 'Report') :\n p.copy.title;\n const ctx = p.support.context();\n const subtitle = [ctx.area, p.support.appVersion ? `v${p.support.appVersion}` : null].filter(Boolean).join(' · ') || p.brand?.name || '';\n const showBack = screen.name === 'faq' || screen.name === 'reports' || screen.name === 'detail';\n // Only where there is something of theirs to be out of date: their reports.\n const showRefresh = state.signedIn === true && (screen.name === 'reports' || screen.name === 'detail' || (screen.name === 'home' && state.reports.length > 0));\n const refreshLabel = state.updatedAt ? `${p.copy.refresh} · ${fill(p.copy.updatedAgo, { ago: formatAgo(new Date(state.updatedAt).toISOString()) })}` : p.copy.refresh;\n const scrim = p.layout !== 'popover';\n const launcherSide = p.launcher ? (p.launcher.position === 'bottom-left' ? 'sg-left' : 'sg-right') : 'sg-right';\n const panelSide = p.layout === 'popover' && p.launcher ? launcherSide : p.side === 'left' ? 'sg-left' : 'sg-right';\n\n return (\n <div\n class={`sg-root${ui.open ? ' sg-open' : ''}`}\n style={`${themeVars(theme)};--sg-z:${p.zIndex};${ui.hidden || ui.picking ? 'visibility:hidden;' : ''}`}\n data-theme={theme.scheme}\n >\n {p.launcher && !(ui.open && scrim) && (\n <button\n type=\"button\"\n class={`sg-launcher ${launcherSide}`}\n onClick={() => (ui.open ? close() : p.ui.set({ open: true, history: [{ name: 'home' }], session: ui.session + 1 }))}\n aria-label={state.attention ? `${p.launcher.label ?? p.copy.launcher}, ${state.attention} need you` : (p.launcher.label ?? p.copy.launcher)}\n aria-expanded={ui.open}\n data-testid=\"sg-launcher\"\n >\n <Icon name={ui.open ? 'x' : 'lifebuoy'} size={18} stroke={2} />\n {p.launcher.label ?? p.copy.launcher}\n {state.attention > 0 && !ui.open && <span class=\"sg-badge\">{state.attention > 9 ? '9+' : state.attention}</span>}\n </button>\n )}\n\n {scrim && ui.open && <div class=\"sg-scrim\" onClick={close} aria-hidden=\"true\" />}\n\n <div\n ref={panel}\n class={`sg-panel sg-${p.layout} ${panelSide}`}\n role=\"dialog\"\n aria-modal={scrim ? 'true' : undefined}\n aria-label={p.copy.title}\n hidden={!ui.open}\n tabIndex={-1}\n data-testid=\"sg-panel\"\n >\n {p.layout === 'sheet' && <span class=\"sg-grabber\" aria-hidden=\"true\" />}\n <span class=\"sg-accentline\" aria-hidden=\"true\" />\n <div class=\"sg-header\">\n {showBack ? (\n <button type=\"button\" class=\"sg-iconbtn\" onClick={back} aria-label=\"Back\" data-testid=\"sg-back\">\n <Icon name=\"arrowLeft\" />\n </button>\n ) : p.brand?.logo ? (\n <img class=\"sg-brand\" src={p.brand.logo} alt=\"\" />\n ) : (\n <Tile icon=\"lifebuoy\" tone=\"accent\" small />\n )}\n <div class=\"sg-head-text\">\n <h2 class=\"sg-title\">{title}</h2>\n {subtitle && <p class=\"sg-sub\">{subtitle}</p>}\n </div>\n <SlotPoint name=\"header\" filled={w.slots} />\n {showRefresh && (\n <button\n type=\"button\"\n class={`sg-iconbtn sg-refresh${checking ? ' sg-busy' : ''}`}\n onClick={() => void check()}\n aria-label={refreshLabel}\n title={refreshLabel}\n aria-busy={checking ? 'true' : undefined}\n data-testid=\"sg-refresh\"\n >\n <Icon name=\"refresh\" />\n </button>\n )}\n <span class=\"sg-sr\" aria-live=\"polite\">{checked && !checking ? p.copy.upToDate : ''}</span>\n <button type=\"button\" class=\"sg-iconbtn\" onClick={close} aria-label=\"Close\" data-testid=\"sg-close\">\n <Icon name=\"x\" />\n </button>\n </div>\n\n {ui.open && <Body key={ui.session} w={w} screen={screen} />}\n <SlotPoint name=\"footer\" filled={w.slots} />\n </div>\n\n {/* The capture bar opts back into visibility inside the hidden root, and\n is not rendered at all while the frame is read. */}\n {ui.picking && !ui.hidden && (\n <div ref={pickbar} class=\"sg-pickbar\" role=\"toolbar\" aria-label={p.copy.screenshot} data-testid=\"sg-pickbar\">\n <span class=\"sg-pickdot\" aria-hidden=\"true\" />\n <span class=\"sg-pickhint\">{p.copy.pickHint}</span>\n <Button onClick={() => void picker.capture()} icon=\"camera\" testId=\"sg-pick-capture\" btnRef={captureBtn}>\n {p.copy.pickCapture}\n </Button>\n <Button variant=\"ghost\" onClick={() => picker.cancel()} testId=\"sg-pick-cancel\" icon=\"x\" label={p.copy.cancel}>\n <span class=\"sg-pick-cancel-label\">{p.copy.cancel}</span>\n </Button>\n </div>\n )}\n </div>\n );\n}\n\nfunction Body({ w, screen }: { w: Ctx; screen: Screen }) {\n switch (screen.name) {\n case 'report':\n return <ReportFlow w={w} />;\n case 'feedback':\n return <FeedbackForm w={w} />;\n case 'faq':\n return <Faq w={w} />;\n case 'reports':\n return (\n <div class=\"sg-body\">\n <ReportList w={w} />\n </div>\n );\n case 'detail':\n return <ReportDetail w={w} id={screen.id} />;\n case 'sent':\n return (\n <Confirmation\n heading={w.copy.reportSent}\n reference={screen.ref}\n body={w.state.signedIn ? w.copy.reportSentBody : w.copy.reportSentAnon}\n primary={w.state.signedIn ? { label: w.copy.track, onClick: () => w.go({ name: 'detail', id: screen.id }) } : undefined}\n onDone={() => w.go({ name: 'home' })}\n doneLabel={w.copy.done}\n slots={w.slots}\n />\n );\n case 'thanks':\n return <Confirmation heading={w.copy.thanks} body={w.copy.thanksBody} onDone={() => w.go({ name: 'home' })} doneLabel={w.copy.done} />;\n default:\n return <Home w={w} />;\n }\n}\n\nfunction Confirmation({\n heading,\n body,\n reference,\n primary,\n onDone,\n doneLabel,\n slots,\n}: {\n heading: string;\n body: string;\n reference?: string;\n primary?: { label: string; onClick: () => void };\n onDone: () => void;\n doneLabel: string;\n /** Only the \"report sent\" confirmation offers the `sent` slot. */\n slots?: ReadonlySet<string>;\n}) {\n return (\n <div class=\"sg-body\">\n <div class=\"sg-confirm\" data-testid=\"sg-confirm\">\n {/* A ring, not a filled disc: it should read as calm and finished, not as an alert. */}\n <span class=\"sg-ring\"><Icon name=\"checkCircle\" size={24} stroke={1.6} /></span>\n <p class=\"sg-p\" style={{ marginTop: '12px', fontWeight: 650, fontSize: 'calc(var(--sg-size) + 2px)' }}>{heading}</p>\n {reference && <span class=\"sg-ref\" data-testid=\"sg-ref\">{reference}</span>}\n <p class=\"sg-p sg-muted\" style={{ marginTop: '10px', maxWidth: '36ch' }}>{body}</p>\n <div style={{ marginTop: '18px', display: 'flex', gap: '8px' }}>\n {primary && <Button onClick={primary.onClick}>{primary.label}</Button>}\n <Button variant=\"ghost\" onClick={onDone}>{doneLabel}</Button>\n </div>\n {slots && <SlotPoint name=\"sent\" filled={slots} />}\n </div>\n </div>\n );\n}\n\n/**\n * Render the panel into its shadow root. This module is the lazily loaded\n * chunk: the shell (`index.ts`) imports it after the page has settled, or the\n * moment someone opens the panel, whichever comes first.\n *\n * Styles go in as a constructable stylesheet where the browser has them, so a\n * page with a strict Content-Security-Policy (no 'unsafe-inline' styles) still\n * gets a styled panel. Older browsers fall back to a <style> element.\n */\nconst stopParts = new WeakMap<HTMLElement, () => void>();\n\nexport function renderPanel(mountPoint: HTMLElement, root: ShadowRoot, props: AppProps): void {\n try {\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(STYLES);\n // FIRST, ahead of any sheet the host already adopted through the `css`\n // option: at equal specificity the later sheet wins, and the host's must.\n root.adoptedStyleSheets = [sheet, ...root.adoptedStyleSheets];\n } catch {\n const style = document.createElement('style');\n style.textContent = STYLES;\n root.insertBefore(style, root.firstChild);\n }\n render(<App {...props} />, mountPoint);\n stopParts.set(mountPoint, exposeParts(root));\n}\n\nexport function unmountPanel(mountPoint: HTMLElement): void {\n stopParts.get(mountPoint)?.();\n render(null, mountPoint);\n}\n","/**\n * `@signalsupport/sdk/widget` — the support panel, in any page.\n *\n * ```ts\n * import { mountSupport } from '@signalsupport/sdk/widget';\n *\n * const support = mountSupport({\n * key: process.env.NEXT_PUBLIC_SIGNAL_KEY_ID, // anonymous reports\n * session: '/api/signal/session', // signed-in reporters follow theirs\n * appVersion: '2.4.0',\n * context: { area: 'Editor' },\n * theme: { preset: 'midnight', accent: '#7a50dd' },\n * layout: 'drawer',\n * });\n *\n * support.open('report');\n * support.on('attention', (n) => badge(n));\n * ```\n *\n * It renders into a Shadow DOM: your CSS cannot restyle it by accident and\n * none of its CSS reaches your page. It works in React, Vue, Svelte or plain\n * HTML alike, because it owns its own element.\n *\n * # IT COSTS ALMOST NOTHING UNTIL SOMEONE NEEDS HELP\n *\n * This module is the shell: the element, the state and the badge count. The\n * panel itself (Preact, every screen, the stylesheet) is a separate chunk,\n * fetched when the browser is idle after the page has loaded, or the moment\n * `open()` is called, whichever comes first. A product's first paint never\n * waits for its support panel.\n */\nimport { createSupport, type Support, type SupportConfig } from '../support.js';\nimport { DEFAULT_COPY, type Copy } from './copy.js';\nimport { SLOT_NAMES, type FaqItem, type Features, type HomeAction, type SlotName, type View } from './ctx.js';\nimport { createUiStore, type Layout } from './store.js';\nimport type { ThemeInput } from './theme.js';\n\nexport { PRESETS, resolveTheme, type PresetName, type Theme, type ThemeInput } from './theme.js';\nexport { DEFAULT_COPY, type Copy } from './copy.js';\nexport type { FaqItem, Features, HomeAction, SlotName, View } from './ctx.js';\nexport { PARTS } from './parts.js';\nexport type { Layout } from './store.js';\n\nexport interface WidgetConfig extends SupportConfig {\n /** A preset name, or tokens on top of one: `{ preset: 'daylight', accent: '#e11d48' }`. */\n theme?: ThemeInput;\n /** `drawer` from the side (default), `modal`, `popover` above the launcher, or `sheet` from the bottom. Phones always get a sheet. */\n layout?: Layout;\n /** Which side a drawer slides from. */\n side?: 'left' | 'right';\n /** A floating button, or `false` when your own control calls `open()`. */\n launcher?: false | { position?: 'bottom-right' | 'bottom-left'; label?: string };\n brand?: { name?: string; logo?: string };\n features?: Partial<Features>;\n faq?: FaqItem[];\n copy?: Partial<Copy>;\n /** Where the panel's element goes. Default `document.body`. */\n container?: HTMLElement;\n zIndex?: number;\n /** Share a support instance you already created headlessly. */\n support?: Support;\n /** Load the panel immediately rather than when the browser is idle. */\n eager?: boolean;\n /**\n * Your own CSS, applied INSIDE the panel after its own, so it wins at equal\n * specificity. Target the `::part()` names from outside, or `[part~=\"button\"]`\n * and friends from here. The `sg-` class names are internal and may change.\n */\n css?: string;\n /** Your own content in the panel: an element per slot name. See `slot()`. */\n slots?: Partial<Record<SlotName, HTMLElement>>;\n /** Extra entries under \"How can we help?\", after the built-in ones. */\n actions?: HomeAction[];\n /**\n * Your own picture of your own view, for Capture, in place of the browser's\n * screen capture. For a product in a desktop shell, where `getDisplayMedia`\n * opens the shell's own permission dialog: resolve to an image data URL of\n * the window (WebView2 `CapturePreview`, Electron `capturePage`). Capture\n * mode is unchanged; there is simply no prompt. Omit it in a browser.\n */\n captureFrame?: () => Promise<string>;\n}\n\nexport type WidgetEvent = 'open' | 'close' | 'submitted' | 'verified' | 'withdrawn' | 'attention';\n\nexport interface SupportWidget {\n open(view?: View): void;\n close(): void;\n toggle(view?: View): void;\n isOpen(): boolean;\n /** Merge into the context sent with reports (where in the product, which project). */\n setContext(context: Record<string, unknown>): void;\n setTheme(theme: ThemeInput): void;\n /** Replace the CSS given as `css`, live. An empty string removes it. */\n setCss(css: string): void;\n /**\n * The element for one slot, created on first ask. Render into it with\n * anything: plain DOM, a React portal, Vue's Teleport. It lives in YOUR\n * document, so your CSS styles it.\n */\n slot(name: SlotName): HTMLElement;\n on(event: WidgetEvent, fn: (detail: unknown) => void): () => void;\n /** Resolves once the panel's code has loaded and rendered. */\n ready(): Promise<void>;\n /** The headless core, for your own badges and buttons. */\n readonly support: Support;\n destroy(): void;\n}\n\nexport function mountSupport(config: WidgetConfig): SupportWidget {\n if (typeof document === 'undefined') {\n throw new Error('mountSupport runs in a browser. On a server, use @signalsupport/sdk/server.');\n }\n const ownsSupport = !config.support;\n const support = config.support ?? createSupport(config);\n const features: Features = { report: true, feedback: true, faq: true, reports: !!config.session, screenshot: true, ...config.features };\n const copy: Copy = { ...DEFAULT_COPY, ...config.copy };\n const launcher =\n config.launcher === false ? false : { position: config.launcher?.position ?? 'bottom-right', label: config.launcher?.label };\n\n const host = document.createElement('div');\n host.setAttribute('data-signal-support', '');\n (config.container ?? document.body).appendChild(host);\n const root = host.attachShadow({ mode: 'open' });\n const mountPoint = document.createElement('div');\n root.appendChild(mountPoint);\n\n const ui = createUiStore({ open: false, history: [{ name: 'home' }], session: 0, hidden: false, picking: false, theme: config.theme, slots: [], tick: 0 });\n\n // The host's CSS. A constructable sheet where the browser has them, so a\n // strict Content-Security-Policy still applies it; the panel adds its own\n // sheet AHEAD of this one when it loads, so this one keeps winning.\n let hostSheet: CSSStyleSheet | null = null;\n let hostStyle: HTMLStyleElement | null = null;\n const setCss = (css: string) => {\n try {\n if (!hostSheet) {\n hostSheet = new CSSStyleSheet();\n root.adoptedStyleSheets = [...root.adoptedStyleSheets, hostSheet];\n }\n hostSheet.replaceSync(css);\n } catch {\n if (!hostStyle) {\n hostStyle = document.createElement('style');\n root.appendChild(hostStyle);\n }\n hostStyle.textContent = css;\n }\n };\n if (config.css) setCss(config.css);\n\n const slotEls = new Map<SlotName, HTMLElement>();\n const slot = (name: SlotName): HTMLElement => {\n if (!SLOT_NAMES.includes(name)) throw new Error(`Unknown slot \"${name}\". Slots: ${SLOT_NAMES.join(', ')}.`);\n let el = slotEls.get(name);\n if (!el) {\n el = document.createElement('div');\n el.setAttribute('slot', name);\n host.appendChild(el);\n slotEls.set(name, el);\n ui.set({ slots: [...slotEls.keys()] });\n }\n return el;\n };\n for (const [name, content] of Object.entries(config.slots ?? {}) as [SlotName, HTMLElement][]) {\n if (content) slot(name).appendChild(content);\n }\n const listeners = new Map<WidgetEvent, Set<(d: unknown) => void>>();\n const emit = (event: string, detail?: unknown) => {\n for (const fn of listeners.get(event as WidgetEvent) ?? []) fn(detail);\n };\n\n let wasOpen = false;\n const offUi = ui.subscribe(() => {\n const open = ui.get().open;\n if (open !== wasOpen) emit(open ? 'open' : 'close');\n wasOpen = open;\n });\n let lastAttention = support.getState().attention;\n const offAttention = support.subscribe((s) => {\n if (s.attention !== lastAttention) emit('attention', s.attention);\n lastAttention = s.attention;\n });\n\n let destroyed = false;\n let panel: typeof import('./app.js') | null = null;\n let loading: Promise<void> | null = null;\n const load = (): Promise<void> => {\n loading ??= import('./app.js').then((m) => {\n if (destroyed) return;\n panel = m;\n m.renderPanel(mountPoint, root, {\n ui,\n support,\n copy,\n features,\n faq: config.faq ?? [],\n actions: config.actions ?? [],\n layout: config.layout ?? 'drawer',\n side: config.side ?? 'right',\n launcher,\n brand: config.brand,\n zIndex: config.zIndex ?? 2147483000,\n captureFrame: config.captureFrame,\n emit,\n root,\n });\n });\n return loading;\n };\n\n // After the page has settled, so the panel never competes with the\n // product's own first paint. `open()` short-circuits this.\n let idle: number | null = null;\n if (config.eager) {\n void load();\n } else {\n const ric = (globalThis as { requestIdleCallback?: (cb: () => void, o?: { timeout: number }) => number }).requestIdleCallback;\n idle = ric ? ric(() => void load(), { timeout: 3000 }) : (setTimeout(() => void load(), 1500) as unknown as number);\n }\n\n const openAt = (view: View = 'home') => {\n ui.set({\n open: true,\n history: view === 'home' ? [{ name: 'home' }] : [{ name: 'home' }, { name: view }],\n session: ui.get().session + 1,\n });\n void load();\n };\n\n return {\n open: openAt,\n close: () => ui.set({ open: false }),\n toggle: (view) => (ui.get().open ? ui.set({ open: false }) : openAt(view)),\n isOpen: () => ui.get().open,\n setContext: (context) => support.setContext(context),\n setTheme: (theme) => ui.set({ theme }),\n setCss,\n slot,\n on(event, fn) {\n const set = listeners.get(event) ?? new Set();\n set.add(fn);\n listeners.set(event, set);\n if (event === 'attention') fn(support.getState().attention);\n return () => set.delete(fn);\n },\n ready: load,\n support,\n destroy() {\n destroyed = true;\n const cancel = (globalThis as { cancelIdleCallback?: (id: number) => void }).cancelIdleCallback;\n if (idle !== null) (cancel ?? clearTimeout)(idle);\n offUi();\n offAttention();\n panel?.unmountPanel(mountPoint);\n host.remove();\n if (ownsSupport) support.destroy();\n listeners.clear();\n },\n };\n}\n","/**\n * The script-tag build: `window.SignalSupport`, for pages without a bundler.\n *\n * ```html\n * <script src=\"https://unpkg.com/@signalsupport/sdk/dist/signal.iife.js\"></script>\n * <script>\n * SignalSupport.mountSupport({ key: 'sig_pub_…', theme: 'daylight', layout: 'popover' });\n * </script>\n * ```\n */\nexport { mountSupport, PRESETS, DEFAULT_COPY } from './widget/index.js';\nexport { createSupport, Signal, createClient, captureScreen, statusView } from './index.js';\n"],"x_google_ignoreList":[14,15,16],"mappings":"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"}
|