@the-portland-company/shell 0.81.2 → 0.84.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +38 -0
- package/dist/app-chrome.cjs +273 -181
- package/dist/app-chrome.cjs.map +1 -1
- package/dist/app-chrome.d.cts +32 -2
- package/dist/app-chrome.d.ts +32 -2
- package/dist/app-chrome.js +51 -13
- package/dist/app-chrome.js.map +1 -1
- package/dist/chrome.css +5 -0
- package/dist/{chunk-L73FZKGE.js → chunk-PRZP2SB6.js} +229 -176
- package/dist/chunk-PRZP2SB6.js.map +1 -0
- package/dist/{chunk-MYY6N6D4.js → chunk-QS3Z4N73.js} +3 -3
- package/dist/chunk-QS3Z4N73.js.map +1 -0
- package/dist/{index-_Y7jOKPN.d.cts → index--q40spnY.d.cts} +66 -4
- package/dist/{index-bYu6DxNt.d.ts → index-C4ob05Pc.d.ts} +66 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/native.cjs +233 -172
- package/dist/native.cjs.map +1 -1
- package/dist/native.d.cts +1 -1
- package/dist/native.d.ts +1 -1
- package/dist/native.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-L73FZKGE.js.map +0 -1
- package/dist/chunk-MYY6N6D4.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/FormColumn.tsx","../src/lib/deprecation.ts","../src/lib/topbarIconSlot.ts","../src/lib/brandGlyphs.tsx","../src/native/credits.ts","../src/notifications/adapter.ts","../src/native/chromeActions.tsx","../src/speculation/emitRules.ts","../src/speculation/SpeculationRulesScript.tsx"],"names":["jsx","useState","useEffect","useMemo"],"mappings":"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","file":"chunk-PRZP2SB6.js","sourcesContent":["import type { ReactNode } from 'react';\nimport clsx from 'clsx';\n\ntype FormColumnProps = {\n children: ReactNode;\n className?: string;\n};\n\n/**\n * The ONE constrained layout inside the frame's fluid `<main>` (Brand guideline\n * \"Content width is fluid\"): a single left-aligned column, 960px max, for form\n * and settings pages — single-record edit forms, Organization Settings tabs,\n * My Profile, activation and setup flows. Data surfaces (tables, dashboards,\n * maps) never use it; they take the full fluid width.\n *\n * It adds no gutter of its own — `<main>` already owns the 24px / 16px gutter —\n * and it is never centered. There is no width prop on purpose: a per-page\n * max-width is exactly what the guideline forbids.\n */\nexport default function FormColumn({ children, className }: FormColumnProps) {\n return (\n <div data-shell-form-column=\"\" className={clsx('w-full max-w-[960px]', className)}>\n {children}\n </div>\n );\n}\n","// One-time console warnings for retired shell API, in development only.\n\nconst warned = new Set<string>()\n\nfunction isDev(): boolean {\n try {\n return typeof process !== 'undefined' && process.env?.NODE_ENV !== 'production'\n } catch {\n return false\n }\n}\n\n/** Warn once per `key` in dev; silent in production builds. */\nexport function warnDeprecated(key: string, message: string): void {\n if (!isDev() || warned.has(key)) return\n warned.add(key)\n console.warn(`[@the-portland-company/shell] ${message}`)\n}\n\n/** Test hook: forget which warnings have fired. */\nexport function resetDeprecationWarnings(): void {\n warned.clear()\n}\n","import { useEffect, useState } from 'react'\n\n/**\n * The six canonical top-bar action slots (Reference/Global-Rules v9 → top-bar\n * icons). Each slot's GLYPH is unique and comes from the Brand API\n * `topbarIcons.items.*` tokens, exposed as `--topbar-icon-<slot>` CSS vars\n * whose value is the brand-icon NAME. Every OTHER property — size, gap, color,\n * hover, selected — is universal across all six slots.\n */\nexport type TopBarIconSlot =\n | 'comms-fuel'\n | 'apps'\n | 'notifications'\n | 'alerts'\n | 'support'\n | 'dark-mode'\n\n/**\n * Reads the glyph NAME for a slot from its `--topbar-icon-<slot>` CSS var.\n *\n * Runs in an effect because the Brand stylesheet is appended to <head> at\n * runtime (Global Rules forbids baking it into the build), so the var is not\n * resolvable during SSR or the first synchronous render. The MutationObserver\n * re-reads once the stylesheet lands so the glyph upgrades from the caller's\n * fallback without a reload.\n *\n * Returns null when the slot has no Brand glyph — callers render their own\n * fallback icon in that case.\n */\nexport function useTopBarIconSlotGlyph(slot: TopBarIconSlot): string | null {\n const [name, setName] = useState<string | null>(null)\n\n useEffect(() => {\n if (typeof window === 'undefined') return\n\n const read = () => {\n const raw = window\n .getComputedStyle(document.documentElement)\n .getPropertyValue(`--topbar-icon-${slot}`)\n .trim()\n // Brand may emit the name quoted (e.g. \"bell\"); strip the quotes.\n .replace(/^['\"]|['\"]$/g, '')\n setName(raw.length > 0 ? raw : null)\n }\n\n read()\n\n const observer = new MutationObserver(read)\n observer.observe(document.head, { childList: true, subtree: true })\n return () => observer.disconnect()\n }, [slot])\n\n return name\n}\n\n/** Path to a brand-icon SVG in the consuming app's public dir. */\nexport function brandIconSrc(name: string, basePath = '/brand/icons/') {\n return `${basePath}${name}.svg`\n}\n","import type { ComponentType } from 'react'\nimport {\n FiAlertCircle,\n FiBattery,\n FiBatteryCharging,\n FiAlertTriangle,\n FiBell,\n FiGrid,\n FiHelpCircle,\n FiInfo,\n FiLifeBuoy,\n FiMail,\n FiMessageSquare,\n FiMoon,\n FiSettings,\n FiSun,\n FiUser,\n FiZap,\n} from 'react-icons/fi'\n\nexport type GlyphComponent = ComponentType<{ size?: number | string; className?: string }>\n\n/**\n * Brand-glyph registry: maps the icon NAME the Brand API emits (e.g.\n * `--topbar-icon-comms-fuel: bolt`) to a component.\n *\n * These names are Feather/Lucide icon names, NOT asset filenames — there is no\n * `/brand/icons/<name>.svg` for them in any app, and treating them as URLs\n * renders a broken image. Resolving them against the icon library the shell\n * already depends on keeps every app consistent with zero vendored assets.\n *\n * Aliases are included where Brand and Feather disagree on a name (`bolt` vs\n * `zap`, `life-buoy` vs `life-ring`).\n */\nconst GLYPHS: Record<string, GlyphComponent> = {\n // Communications Fuel reads as a LEVEL, so its glyph is a battery. `bolt`/\n // `zap` stay mapped for older Brand values.\n 'battery-charging': FiBatteryCharging,\n battery: FiBattery,\n fuel: FiBatteryCharging,\n bolt: FiZap,\n zap: FiZap,\n grid: FiGrid,\n apps: FiGrid,\n bell: FiBell,\n notification: FiBell,\n 'alert-triangle': FiAlertTriangle,\n alert: FiAlertTriangle,\n 'alert-circle': FiAlertCircle,\n 'life-buoy': FiLifeBuoy,\n 'life-ring': FiLifeBuoy,\n support: FiLifeBuoy,\n 'help-circle': FiHelpCircle,\n moon: FiMoon,\n sun: FiSun,\n info: FiInfo,\n mail: FiMail,\n 'message-square': FiMessageSquare,\n settings: FiSettings,\n user: FiUser,\n}\n\n/**\n * Resolve a Brand glyph name to a component. Returns null for an unknown name\n * so the caller renders its own fallback — an unrecognized token must never\n * produce a broken or empty icon.\n */\nexport function resolveBrandGlyph(name: string | null | undefined): GlyphComponent | null {\n if (!name) return null\n return GLYPHS[name.trim().toLowerCase()] ?? null\n}\n\n/** Names the registry knows — exported for tests and tooling. */\nexport const KNOWN_BRAND_GLYPHS = Object.keys(GLYPHS)\n","// Credit health for the top bar's Credits icon, gauges and tooltip.\n// Reference/UI-Platform → Top bar → Credits (decided 2026-10-13, Ben) and\n// VRM-Admin/Pricing-and-Metering §7.5. The credits service publishes each\n// type's `state`, `fullMarkUnits` and `daysOfUseLeft`; the shell only reads\n// them. Nothing here derives a state from a balance: a payload without a\n// state is unknown, drawn neutral.\n\nexport type CreditHealthState = \"good\" | \"low\" | \"out\" | \"not_in_use\";\n\n/** What the icon shows: the worst state among the types in use, or unknown. */\nexport type CreditsIconState = \"good\" | \"low\" | \"out\" | \"unknown\";\n\nexport type CreditTypeKey = \"signal\" | \"broadcast\" | \"ai\" | \"enhancement\";\n\nexport const CREDIT_TYPE_ORDER: readonly CreditTypeKey[] = [\n \"signal\",\n \"broadcast\",\n \"ai\",\n \"enhancement\",\n];\n\nexport const CREDIT_TYPE_LABELS: Record<CreditTypeKey, string> = {\n signal: \"Signal Credits\",\n broadcast: \"Broadcast Credits\",\n ai: \"AI Credits\",\n enhancement: \"Enhancement Credits\",\n};\n\n/** The slice of a channel the health reads. Older payloads carry none of it. */\nexport type CreditHealthFields = {\n remainingUnits: number;\n state?: CreditHealthState | null;\n fullMarkUnits?: number | null;\n daysOfUseLeft?: number | null;\n};\n\nconst RANK: Record<CreditsIconState, number> = {\n unknown: 0,\n good: 1,\n low: 2,\n out: 3,\n};\n\n/**\n * The icon's colour is the worst state among the credit types in use: green\n * when every one is Good, yellow when at least one is Low, red when at least\n * one is Out. Not in use never changes it; a type with no state is unknown.\n * With nothing in use, or nothing known, the icon is neutral.\n */\nexport function creditsIconState(\n channels: ReadonlyArray<CreditHealthFields | null | undefined>,\n): CreditsIconState {\n let worst: CreditsIconState = \"unknown\";\n for (const channel of channels) {\n const state = channel?.state ?? null;\n if (state === null || state === \"not_in_use\") continue;\n if (RANK[state] > RANK[worst]) worst = state;\n }\n return worst;\n}\n\n/**\n * Gauge level against the full mark (0..1), never more than full. Null when\n * there is nothing to draw: not in use, unknown, or no full mark.\n */\nexport function creditGaugeRatio(\n channel: CreditHealthFields | null | undefined,\n): number | null {\n if (!channel || channel.state == null || channel.state === \"not_in_use\")\n return null;\n const fullMark = channel.fullMarkUnits ?? 0;\n if (!(fullMark > 0)) return null;\n return Math.min(1, Math.max(0, channel.remainingUnits / fullMark));\n}\n\nexport function creditStateWord(\n state: CreditHealthState | null | undefined,\n): string {\n switch (state) {\n case \"good\":\n return \"Good\";\n case \"low\":\n return \"Low\";\n case \"out\":\n return \"Out\";\n case \"not_in_use\":\n return \"Not in use\";\n default:\n return \"Unknown\";\n }\n}\n\nfunction daysPhrase(days: number): string {\n if (days < 1) return \"less than a day at your recent pace\";\n const rounded = Math.round(days);\n return `about ${rounded} ${rounded === 1 ? \"day\" : \"days\"} at your recent pace`;\n}\n\n/**\n * One tooltip line per type: \"Signal Credits: 38 left, about 1 day at your\n * recent pace\". A type not in use says so; a type without a state says only\n * what is left.\n */\nexport function creditTooltipLine(\n type: CreditTypeKey,\n channel: CreditHealthFields | null | undefined,\n): string {\n const label = CREDIT_TYPE_LABELS[type];\n if (!channel) return `${label}: unavailable`;\n const left = `${Math.max(0, channel.remainingUnits).toLocaleString()} left`;\n if (channel.state === \"not_in_use\") return `${label}: not in use`;\n if (channel.state == null) return `${label}: ${left}`;\n if (channel.state === \"out\") return `${label}: ${left}, out`;\n const days = channel.daysOfUseLeft;\n const pace =\n typeof days === \"number\" && Number.isFinite(days)\n ? `, ${daysPhrase(days)}`\n : \"\";\n return `${label}: ${left}${pace}`;\n}\n\n/** The icon's accessible name carries the state, so colour is never the only signal. */\nexport function creditsAriaLabel(\n channels: Partial<\n Record<CreditTypeKey, CreditHealthFields | null | undefined>\n >,\n): string {\n const worst = creditsIconState(CREDIT_TYPE_ORDER.map((t) => channels[t]));\n if (worst === \"unknown\") return \"Credits\";\n if (worst === \"good\") return \"Credits: all good\";\n const named = CREDIT_TYPE_ORDER.filter(\n (t) => channels[t]?.state === worst,\n ).map((t) => CREDIT_TYPE_LABELS[t]);\n return `Credits: ${worst === \"low\" ? \"low on\" : \"out of\"} ${named.join(\", \")}`;\n}\n","// ---------------------------------------------------------------------------\n// NotificationsAdapter — the contract the shell's single Notifications bell is\n// fed by (Specs/System-Communications §6.3 and §12.2; UI-Platform → top bar).\n//\n// The bell never calls the Comms service directly. Reads and writes go through\n// the same-origin chrome API proxy with the viewer's session, so the Comms\n// `GET /v1/me/notifications` and `POST /v1/me/notifications/:id/{read,archive,\n// resolve}` routes (politogy-comms PR #14) are reached as `me/notifications…`\n// relative to the proxy base. The proxy's session cookie or bearer is what\n// Comms verifies (`getSubject`, OIDC `sub`); the shell never sends a token.\n//\n// Degradation contract: a missing session (401), an absent route (404), a\n// network failure or a malformed body all resolve to an EMPTY feed or `false`.\n// The bell then renders \"all caught up\" rather than an error state, and nothing\n// is thrown into the chrome.\n// ---------------------------------------------------------------------------\n\nimport type { NavChromeFetcher } from '../native/chromeActions'\n\nexport type CommsNotificationKind = 'notification' | 'alert'\n\n/** One row of the bell feed, as the shell reads it (camelCased). */\nexport type CommsNotification = {\n id: string\n kind: CommsNotificationKind\n title: string\n body: string\n icon: string | null\n link: string | null\n readAt: string | null\n orgId: string | null\n createdAt: string | null\n}\n\nexport type NotificationsFeed = {\n /** Alerts first, then notifications, newest first (Comms sorts them). */\n notifications: CommsNotification[]\n /** One badge number: unread notifications plus unresolved alerts (Spec §6.3). */\n badge: number\n}\n\nexport type NotificationsAdapter = {\n /** Read the signed-in viewer's feed, scoped to an org when one is active. */\n list(orgId: string | null): Promise<NotificationsFeed>\n /** Mark one row read. Resolves false on any failure, never throws. */\n markRead(id: string): Promise<boolean>\n /** Archive one row (hides it from the feed). Resolves false on failure. */\n archive(id: string): Promise<boolean>\n /** Resolve one alert. Comms rejects this for non-alert rows. */\n resolve(id: string): Promise<boolean>\n}\n\n/** The empty bell: what every degraded path renders. Always a fresh object. */\nexport function emptyNotificationsFeed(): NotificationsFeed {\n return { notifications: [], badge: 0 }\n}\n\nfunction asString(value: unknown): string | null {\n return typeof value === 'string' ? value : null\n}\n\n/**\n * Shape a raw Comms body into the feed. Tolerant on purpose: unknown keys are\n * ignored, rows without an id are dropped, and archived rows are never shown.\n */\nexport function normalizeNotificationsFeed(raw: unknown): NotificationsFeed {\n if (!raw || typeof raw !== 'object') return emptyNotificationsFeed()\n const body = raw as { notifications?: unknown; badge?: unknown }\n const rows = Array.isArray(body.notifications) ? body.notifications : []\n const notifications: CommsNotification[] = []\n for (const row of rows) {\n if (!row || typeof row !== 'object') continue\n const r = row as Record<string, unknown>\n const id = asString(r.id)\n if (!id || asString(r.archived_at)) continue\n notifications.push({\n id,\n kind: r.kind === 'alert' ? 'alert' : 'notification',\n title: asString(r.title) ?? '',\n body: asString(r.body) ?? '',\n icon: asString(r.icon),\n link: asString(r.link),\n readAt: asString(r.read_at),\n orgId: asString(r.org_id),\n createdAt: asString(r.created_at),\n })\n }\n const badge =\n typeof body.badge === 'number' && Number.isFinite(body.badge)\n ? Math.max(0, Math.floor(body.badge))\n : notifications.filter((n) => n.kind === 'alert' || n.readAt === null).length\n return { notifications, badge }\n}\n\n/**\n * Build the comms-backed adapter over the app's chrome fetcher. A null fetcher\n * (no chrome proxy wired) yields the empty bell with no network activity.\n */\nexport function createCommsNotificationsAdapter(\n fetchJson: NavChromeFetcher | null,\n): NotificationsAdapter {\n const act = async (id: string, action: 'read' | 'archive' | 'resolve'): Promise<boolean> => {\n if (!fetchJson || !id) return false\n try {\n await fetchJson(`me/notifications/${encodeURIComponent(id)}/${action}`, { method: 'POST' })\n return true\n } catch {\n return false\n }\n }\n return {\n async list(orgId) {\n if (!fetchJson) return emptyNotificationsFeed()\n try {\n const query = orgId ? `?org_id=${encodeURIComponent(orgId)}` : ''\n return normalizeNotificationsFeed(await fetchJson(`me/notifications${query}`))\n } catch {\n return emptyNotificationsFeed()\n }\n },\n markRead: (id) => act(id, 'read'),\n archive: (id) => act(id, 'archive'),\n resolve: (id) => act(id, 'resolve'),\n }\n}\n\n/**\n * Map a feed onto the panel's payload shape so the existing bell UI (alert\n * rows, read toggles, badge) renders adapter rows without a second renderer.\n */\nexport function notificationsFeedToPayload(\n feed: NotificationsFeed,\n orgId: string | null,\n): {\n organizationId: string\n alerts: { id: string; title: string; description: string; href: string | null; kind: string; read: boolean }[]\n replies: never[]\n badge: number\n} {\n return {\n organizationId: orgId ?? '',\n alerts: feed.notifications.map((n) => ({\n id: n.id,\n title: n.title,\n description: n.body,\n href: n.link,\n kind: n.kind,\n read: n.readAt !== null,\n })),\n replies: [],\n badge: feed.badge,\n }\n}\n","// ---------------------------------------------------------------------------\n// Native chrome actions — Tailwind-only top-bar widgets (Fuel, Notifications,\n// Support, Navigation-display) backed by the shared chrome API\n// (politogy-contacts-api on Railway). Zero Chakra, zero router, zero fetch\n// opinion: the consuming app injects ONE fetcher via <NavChromeProvider> —\n// typically a same-origin proxy route that attaches its own session's Bearer\n// token server-side — and every widget in every app runs this exact code.\n//\n// Data endpoints (paths are relative; the app's fetcher owns the base URL):\n// GET communications/fuel-status (header x-contacts-org: <core org id>)\n// GET notifications (header x-contacts-org: <core org id>)\n// GET orgs\n// POST support { message }\n//\n// Loading states follow Global-Rules \"Loading & Async States\": the chrome\n// (button, popover frame, labels) always renders; only the VALUE area shows a\n// skeleton shimmer — never a spinner, never a blank panel.\n// ---------------------------------------------------------------------------\n\n'use client'\n\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n type ComponentType,\n type ReactNode,\n} from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { useTopBarIconSlotGlyph, type TopBarIconSlot } from '../lib/topbarIconSlot'\nimport { resolveBrandGlyph } from '../lib/brandGlyphs'\nimport {\n CREDIT_TYPE_LABELS,\n CREDIT_TYPE_ORDER,\n creditGaugeRatio,\n creditStateWord,\n creditTooltipLine,\n creditsAriaLabel,\n creditsIconState,\n type CreditHealthState,\n type CreditTypeKey,\n type CreditsIconState,\n} from './credits'\nimport {\n createCommsNotificationsAdapter,\n emptyNotificationsFeed,\n notificationsFeedToPayload,\n type NotificationsAdapter,\n} from '../notifications/adapter'\nimport {\n applyThemePreference,\n isThemePreference,\n readThemeCookie,\n writeThemeCookie,\n readPendingThemeChoice,\n markThemeChoicePending,\n clearPendingThemeChoice,\n THEME_STORAGE_KEY,\n type ThemePreference as SharedThemePreference,\n} from '../theme-preference'\n\ntype NavIconLike = ComponentType<{ size?: number; className?: string }>\n\n// ---------------------------------------------------------------------------\n// Deep links. Subscription & billing lives in the Settings app (Reference/\n// UI-Platform \"Retirement of app.politogyvrm.com\": `/organization-settings/*`\n// incl. subscription & billing → `settings.politogyvrm.com`). We would derive\n// the origin from POLITOGY_APPS.settings, but that registry lives in\n// ../app-chrome which imports THIS module — so pulling it in here would create\n// an import cycle. One local constant instead (kept in step with the registry's\n// `settings` origin).\n// ---------------------------------------------------------------------------\n\n/**\n * The retired VRM core origin. Kept ONLY for `resolveOrgLogoUrl`: the signed\n * storage proxy that serves organization logos is part of the data service\n * that stays behind the retired UI.\n */\nexport const CORE_APP_ORIGIN = 'https://app.politogyvrm.com'\nconst SETTINGS_APP_ORIGIN = 'https://settings.politogyvrm.com'\n/** Subscription & Billing tab of Organization Settings (fuel top-up). */\nexport const CORE_BILLING_PATH = '/organization-settings/subscription-billing'\nconst CORE_BILLING_URL = `${SETTINGS_APP_ORIGIN}${CORE_BILLING_PATH}`\nconst QUARANTINED_CONTACTS_URL = `https://contacts.politogyvrm.com/duplicates`\n\n/** Specs origin — same env-aware-constant pattern as CORE_APP_ORIGIN. */\nexport const SPECS_ORIGIN = 'https://specs.politogyvrm.com'\n\n/**\n * Stamp the active org onto a cross-app link, the same `?org=<uuid>` selector\n * the nav tree and Mode pill use. A bare link into VRM core drops a multi-org\n * user into whatever org core defaults to, which is a different account than\n * the one whose fuel / quarantine counts they just clicked.\n */\nfunction withOrgParam(url: string, orgId: string | null | undefined): string {\n if (!orgId) return url\n return `${url}${url.includes('?') ? '&' : '?'}org=${orgId}`\n}\n\n/** Scope the quarantined-contacts view to one sender. */\nfunction withPhoneParam(url: string, phone: string | null | undefined): string {\n if (!phone) return url\n return `${url}${url.includes('?') ? '&' : '?'}phone=${encodeURIComponent(phone)}`\n}\n\n/**\n * Resolve an organization logo URL for rendering in ANY app.\n *\n * `organizations.logo_url` is authored by VRM core and stored as a ROOT-RELATIVE\n * core route — `/api/storage/public?bucket=organization-logos&path=<org>/logo.png`\n * (the signed-storage proxy). VRM core renders it correctly because that path\n * resolves against its own origin; every other app resolves it against its own\n * origin (forms.politogyvrm.com/api/storage/public), gets a 404, and shows a\n * broken image. The chrome API passes the stored value through verbatim, so the\n * resolution belongs here — one definition for every app, core included.\n *\n * Absolute URLs (http/https/data/blob) pass through untouched.\n */\nexport function resolveOrgLogoUrl(url: string | null | undefined): string | undefined {\n const raw = url?.trim()\n if (!raw) return undefined\n if (/^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i.test(raw)) return raw\n return `${CORE_APP_ORIGIN}${raw.startsWith('/') ? '' : '/'}${raw}`\n}\n\n// ---------------------------------------------------------------------------\n// Shared 32×32 circular top-bar button chrome — the ONE definition of the\n// top-bar trigger (Global Rules: no slot hand-rolls its own trigger/badge).\n// NavTopBar's structured actionsList buttons use this same builder.\n// ---------------------------------------------------------------------------\n\n/**\n * Glyph size inside every top-bar icon button — Reference/UI-Platform v30:\n * \"34px buttons / 17px glyph / 6px gap\".\n */\nexport const TOPBAR_GLYPH_SIZE = 17\n\nexport type TopBarIconTone = 'default' | 'ok' | 'low' | 'warning' | 'danger'\n\nexport function topBarIconButtonClass(tone: TopBarIconTone = 'default'): string {\n // `ok` / `low` are the Credits icon's Good (green) and Low (yellow) states\n // (UI-Platform → Top bar → Credits); `warning` / `danger` stay the one red of\n // attention and error (chrome.css `--chrome-danger`).\n const toneClass =\n tone === 'danger' || tone === 'warning'\n ? 'text-[color:var(--chrome-danger)] hover:text-[color:var(--chrome-danger)]'\n : tone === 'ok'\n ? 'text-[color:var(--credits-good,#00783B)] hover:text-[color:var(--credits-good,#00783B)]'\n : tone === 'low'\n ? 'text-[color:var(--credits-low,#B7791F)] hover:text-[color:var(--credits-low,#B7791F)]'\n : 'text-[color:var(--topbar-icon-color,var(--muted))] hover:text-[color:var(--topbar-icon-hover-color,var(--foreground))] hover:bg-[color:var(--topbar-icon-hover-bg,transparent)]'\n return [\n // `group/tbtip` powers the shared <TopBarTooltip> rendered inside the trigger.\n 'group/tbtip relative flex items-center justify-center rounded-[var(--topbar-icon-button-radius,5px)] border border-transparent transition',\n 'h-[var(--topbar-icon-button-size,34px)] w-[var(--topbar-icon-button-size,34px)]',\n toneClass,\n ].join(' ')\n}\n\n/** The shared count badge — one definition, used by every slot. */\n// ---------------------------------------------------------------------------\n// Top-bar panel registry.\n//\n// The top bar hosts two KINDS of surface: panels (opened deliberately by the\n// user from an icon) and transient nudges (the low-fuel hint, the new-reply\n// toast) that appear on their own. They are separate components under separate\n// triggers, so nothing stopped a nudge from covering an open panel — measured\n// in production: the reply toast over the notifications header, and the\n// low-fuel nudge over the same header from the fuel trigger two icons away.\n//\n// A module-scoped counter is enough: any nudge can ask \"is a panel open?\"\n// without the slots having to know about each other.\n// ---------------------------------------------------------------------------\nlet openPanelCount = 0\nconst panelListeners = new Set<() => void>()\nconst emitPanelChange = () => panelListeners.forEach((l) => l())\n\nfunction setPanelOpenGlobal(open: boolean) {\n openPanelCount = Math.max(0, openPanelCount + (open ? 1 : -1))\n emitPanelChange()\n}\n\n/** True while ANY top-bar panel is open. Nudges use it to stay out of the way. */\nexport function useAnyTopBarPanelOpen() {\n return useSyncExternalStore(\n (cb) => {\n panelListeners.add(cb)\n return () => panelListeners.delete(cb)\n },\n () => openPanelCount > 0,\n () => false,\n )\n}\n\nexport function TopBarCountBadge({ count }: { count: number }) {\n if (!(count > 0)) return null\n return (\n <span className=\"absolute -top-[5px] -right-[5px] flex h-4 min-w-4 items-center justify-center rounded-full bg-[color:var(--chrome-danger)] px-1 text-[10px] font-bold leading-4 text-[#FFFFFF]\">\n {count > 99 ? '99+' : count}\n </span>\n )\n}\n\n/**\n * The shared hover tooltip every top-bar control renders BELOW itself: an\n * up-pointing arrow at the icon, a bold title line and a muted description.\n * Pure CSS (group-hover) so it works on <a>, <button> and <summary> triggers.\n * The trigger must carry `group/tbtip relative` (topBarIconButtonClass does).\n */\nexport function TopBarTooltip({\n title,\n description,\n}: {\n title: string\n description?: ReactNode\n}) {\n // Styled ONLY on the Spec tooltip tokens (shellChrome.button.tooltipBg/Fg ->\n // --app-btn-tooltip-bg/-fg; Brand guideline \"Tooltips point at their\n // trigger\", UI-Platform \"Top-bar tooltips and panels - one shared\n // treatment\"). The literal fallbacks are the v150 token values for a page\n // that has not loaded the runtime token sheet yet. The arrow shares the\n // body's fill and border so the two read as one continuous shape, and the\n // tooltip opens on keyboard focus as well as hover (guideline: hover AND\n // focus); the description is the title color at reduced opacity so it\n // stays legible on whatever the token picks.\n return (\n <span\n role=\"tooltip\"\n className=\"pointer-events-none absolute left-1/2 top-full z-50 mt-2 hidden w-max max-w-56 -translate-x-1/2 flex-col rounded-lg border border-[color:var(--app-btn-tooltip-bg,#2F3136)] bg-[color:var(--app-btn-tooltip-bg,#2F3136)] px-3 py-2 text-left shadow-[var(--shadow-soft)] group-hover/tbtip:flex group-focus-visible/tbtip:flex\"\n >\n {/* Arrow pointing up at the icon - same fill and border as the body. */}\n <span\n aria-hidden\n className=\"absolute -top-[5px] left-1/2 h-2.5 w-2.5 -translate-x-1/2 rotate-45 border-l border-t border-[color:var(--app-btn-tooltip-bg,#2F3136)] bg-[color:var(--app-btn-tooltip-bg,#2F3136)]\"\n />\n <span className=\"text-xs font-semibold text-[color:var(--app-btn-tooltip-fg,#FFFFFF)]\">{title}</span>\n {description ? (\n <span className=\"mt-0.5 text-[11px] leading-snug text-[color:var(--app-btn-tooltip-fg,#FFFFFF)] opacity-75\">\n {description}\n </span>\n ) : null}\n </span>\n )\n}\n\n/**\n * The up-pointing arrow every top-bar panel renders, anchored under its\n * trigger icon (panels are right-aligned, so the arrow sits at the trigger's\n * center: 16px in from the panel's right edge). One definition — every menu\n * points at its own icon identically.\n */\nexport function TopBarPanelArrow() {\n return (\n <span\n aria-hidden\n className=\"absolute -top-[5px] right-[11px] h-2.5 w-2.5 rotate-45 border-l border-t border-[color:var(--line)] bg-[color:var(--panel-elevated)]\"\n />\n )\n}\n\n/**\n * Wrapper for third-party top-bar widgets that ship their own launcher button\n * (e.g. DevNotes). Normalizes the trigger to the universal 32px circular slot\n * (chrome.css `.topbar-widget-slot`) and adds the standard tooltip.\n */\nexport function TopBarWidgetSlot({\n title,\n description,\n children,\n}: {\n title: string\n description?: string\n children: ReactNode\n}) {\n return (\n <span className=\"topbar-widget-slot group/tbtip relative inline-flex\">\n {children}\n <TopBarTooltip title={title} description={description} />\n </span>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Theme control — Light / System / Dark, rendered inside the account menu.\n// Controlled: the app owns persistence (profile + cross-subdomain cookie).\n// ---------------------------------------------------------------------------\n\nexport type ThemePreference = SharedThemePreference\n\nconst THEME_OPTIONS: { value: ThemePreference; label: string }[] = [\n { value: 'light', label: 'Light' },\n]\n\nexport function NavThemeControl({\n value,\n onChange,\n}: {\n value: ThemePreference\n onChange: (next: ThemePreference) => void\n}) {\n return (\n <div className=\"px-4 py-3\">\n <p className=\"mb-2 text-[11px] font-semibold uppercase tracking-[0.08em] text-[color:var(--muted)]\">\n Appearance\n </p>\n <div\n role=\"radiogroup\"\n aria-label=\"Appearance\"\n className=\"flex overflow-hidden rounded-full border border-[color:var(--line)]\"\n >\n {THEME_OPTIONS.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={value === opt.value}\n onClick={() => onChange(opt.value)}\n className={[\n 'flex-1 px-3 py-1.5 text-xs font-semibold transition',\n value === opt.value\n ? 'bg-[color:var(--color-accent-bg-safe,var(--color-accent))] text-[#FFFFFF]'\n : 'text-[color:var(--muted)] hover:bg-[color:var(--panel)] hover:text-[color:var(--foreground)]',\n ].join(' ')}\n >\n {opt.label}\n </button>\n ))}\n </div>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Chrome data context — the injected fetcher.\n// ---------------------------------------------------------------------------\n\nexport type NavChromeFetcher = (\n path: string,\n init?: { method?: string; headers?: Record<string, string>; body?: string },\n) => Promise<unknown>\n\n/** GET me — the authenticated user's chrome identity from the shared API.\n * userName prefers the VRM-core profile full name over token claims. */\nexport type ChromeMe = {\n user: string | null\n userName: string | null\n avatarUrl: string | null\n themePreference: string | null\n /** Universal navigation-display choice ('menu'|'tabs'|'both'); null when\n * unset or when the profile column is absent in this environment. */\n navDisplay: string | null\n /** The user's durable active-org preference (full org uuid); null when unset\n * or when the profile column is absent. Adopted only when the request\n * carries no `?org=`/cookie selector — URL → cookie → profile → default. */\n activeOrg?: string | null\n account?: string | null\n accountName?: string | null\n role?: string | null\n /** Contact reply-to, when the profile carries them (optional/tolerant). */\n email?: string | null\n phone?: string | null\n}\n\n/** In-flight-promise + short-TTL cache entry for one (endpoint, orgId) key. */\ntype ChromeFetchCacheEntry = { promise: Promise<unknown>; expiresAt: number }\n\n/** Default freshness window for de-duped chrome reads (orgs/me/notifications/\n * fuel-status). Short enough that a stale value never survives one nav, long\n * enough to collapse every hook mounted on the same page paint into one call. */\nconst CHROME_FETCH_CACHE_TTL_MS = 30_000\n\nfunction chromeCacheKey(path: string, orgId?: string | null): string {\n return orgId === undefined ? path : `${path}::${orgId ?? ''}`\n}\n\n/**\n * A shared read cache scoped to one `<NavChromeProvider>` (one fetcher, one\n * page boot). Every consumer of a given (path, orgId) pair within the TTL\n * window awaits the SAME promise instead of firing its own request — this is\n * what collapsed `/orgs` (2-4x), `/me` (2-3x) and `/notifications` (2-3x) per\n * page load, 1-3.5s each, down to one call apiece (nav-latency-report.md\n * Table 2). Keying by orgId means switching the active org is itself the\n * invalidation: the new org gets a fresh key, never the previous org's cached\n * value. A failed request is evicted immediately so the next consumer retries\n * rather than replaying the same rejection for the rest of the TTL.\n */\nfunction createChromeFetchCache(getFetchJson: () => NavChromeFetcher) {\n const cache = new Map<string, ChromeFetchCacheEntry>()\n\n function dedupedFetch(\n path: string,\n init: Parameters<NavChromeFetcher>[1] | undefined,\n opts: { orgId?: string | null; ttlMs?: number } = {},\n ): Promise<unknown> {\n const key = chromeCacheKey(path, opts.orgId)\n const now = Date.now()\n const hit = cache.get(key)\n if (hit && hit.expiresAt > now) return hit.promise\n // Return the fetcher's own promise (no extra `.catch` hop) so callers see\n // the same microtask depth as a direct fetchJson call; the boot screen's\n // first-tick dismissal (frameBootChrome.test) depends on that.\n const promise = getFetchJson()(path, init)\n promise.catch(() => cache.delete(key))\n cache.set(key, { promise, expiresAt: now + (opts.ttlMs ?? CHROME_FETCH_CACHE_TTL_MS) })\n return promise\n }\n\n /** Force the next read of `path` (any org) to skip the cache. Used after a\n * mutation that changes what an endpoint would return (e.g. marking chrome\n * notifications read server-side, if that ever moves off local storage). */\n function invalidate(path: string) {\n for (const key of cache.keys()) {\n if (key === path || key.startsWith(`${path}::`)) cache.delete(key)\n }\n }\n\n return { dedupedFetch, invalidate }\n}\n\ntype NavChromeContextValue = {\n fetchJson: NavChromeFetcher\n dedupedFetch: ReturnType<typeof createChromeFetchCache>['dedupedFetch']\n invalidateChromeCache: ReturnType<typeof createChromeFetchCache>['invalidate']\n me: ChromeMe | null\n meLoaded: boolean\n /** The bell's feed adapter; null = the legacy contacts-shaped feed. */\n notificationsAdapter: NotificationsAdapter | null\n}\n\nconst NavChromeContext = createContext<NavChromeContextValue | null>(null)\n\nexport function NavChromeProvider({\n fetchJson,\n notificationsAdapter,\n children,\n}: {\n fetchJson: NavChromeFetcher\n /**\n * Omitted: the bell reads the comms feed through the same proxy (default).\n * An app may inject its own adapter; `null` keeps the legacy feed.\n */\n notificationsAdapter?: NotificationsAdapter | null\n children: ReactNode\n}) {\n // The cache outlives re-renders but always calls the LATEST fetchJson (the\n // consuming app may pass a new function identity every render).\n const fetchJsonRef = useRef(fetchJson)\n fetchJsonRef.current = fetchJson\n const cacheRef = useRef<ReturnType<typeof createChromeFetchCache> | null>(null)\n if (!cacheRef.current) {\n cacheRef.current = createChromeFetchCache(() => fetchJsonRef.current)\n }\n const { dedupedFetch, invalidate: invalidateChromeCache } = cacheRef.current\n\n // One stable adapter per provider, built over the latest fetcher.\n const defaultAdapterRef = useRef<NotificationsAdapter | null>(null)\n if (!defaultAdapterRef.current) {\n defaultAdapterRef.current = createCommsNotificationsAdapter((path, init) =>\n fetchJsonRef.current(path, init),\n )\n }\n const adapter = notificationsAdapter === undefined ? defaultAdapterRef.current : notificationsAdapter\n\n // ONE `me` fetch per provider — identity (profile name/avatar) and the\n // theme reconciliation both hang off it.\n const [me, setMe] = useState<ChromeMe | null>(null)\n const [meLoaded, setMeLoaded] = useState(false)\n useEffect(() => {\n let cancelled = false\n dedupedFetch('me', undefined)\n .then((data) => {\n if (!cancelled) setMe(data as ChromeMe)\n })\n .catch(() => {\n /* degraded: session identity stands in */\n })\n .finally(() => {\n if (!cancelled) setMeLoaded(true)\n })\n return () => {\n cancelled = true\n }\n }, [dedupedFetch])\n\n return (\n <NavChromeContext.Provider\n value={{ fetchJson, dedupedFetch, invalidateChromeCache, me, meLoaded, notificationsAdapter: adapter }}\n >\n {children}\n </NavChromeContext.Provider>\n )\n}\n\n/** The authenticated user's chrome identity (profile name / avatar / theme). */\nexport function useChromeMe(): { me: ChromeMe | null; loaded: boolean } {\n const ctx = useContext(NavChromeContext)\n return { me: ctx?.me ?? null, loaded: ctx?.meLoaded ?? false }\n}\n\n/** The provider's de-duped chrome read (null outside <NavChromeProvider>). */\nexport function useNavChromeDedupedFetch(): NavChromeContextValue['dedupedFetch'] | null {\n return useContext(NavChromeContext)?.dedupedFetch ?? null\n}\n\n/** The injected chrome fetcher (null outside <NavChromeProvider>). */\nexport function useNavChromeFetcher(): NavChromeFetcher | null {\n return useContext(NavChromeContext)?.fetchJson ?? null\n}\n\nfunction useNavChrome(component: string): NavChromeContextValue {\n const ctx = useContext(NavChromeContext)\n if (!ctx) {\n throw new Error(\n `${component} must be rendered inside <NavChromeProvider> (inject the chrome API fetcher there).`,\n )\n }\n return ctx\n}\n\n// ---------------------------------------------------------------------------\n// Data shapes (mirror of politogy-contacts-api responses).\n// ---------------------------------------------------------------------------\n\nexport type FuelChannelStatus = {\n remainingUnits: number\n rawBalanceUnits: number\n usedUnits: number\n /** Superseded by `state` (UI-Platform \"Credit health in the payload\"); ignored. */\n lowFuel: boolean\n lowFuelThreshold: number\n /**\n * Credit health (Pricing & Metering §7.5), published by the credits\n * service. Null or absent means unknown: the shell draws neutral and never\n * derives a state from the balance.\n */\n state?: CreditHealthState | null\n fullMarkUnits?: number | null\n daysOfUseLeft?: number | null\n /** The two pools; only the Admin Credit Ledger knows them. */\n includedUnits?: number\n purchasedUnits?: number\n nextGrantAt?: string | null\n}\n\nexport type CommunicationsFuelStatus = {\n organizationId: string\n signal: FuelChannelStatus\n broadcast: FuelChannelStatus\n /** Absent when the balance comes from VRM Core, which never held these. */\n ai?: FuelChannelStatus\n enhancement?: FuelChannelStatus\n combinedAvailableCredits: number\n}\n\nexport type ChromeNotificationAlert = {\n id: string\n title: string\n description: string\n href: string | null\n kind: string\n /** Server read state (adapter feeds only); the local watermark still applies. */\n read?: boolean\n}\n\nexport type ChromeNotificationReply = {\n id: string\n contactId: string | null\n name: string\n preview: string\n /** Optional deep-link to the conversation; the new-reply toast opens it. */\n href?: string\n /**\n * Optional arrival timestamp. Present, it lets the trigger badge count a\n * reply as \"unseen\" only when it is newer than the last time the panel was\n * opened; absent (older payloads), replies simply don't survive the first\n * open as unseen. Tolerated either way.\n */\n createdAt?: string\n}\n\n/** A running or finished contact import surfaced in the notifications panel. */\nexport type ChromeNotificationImport = {\n id: string\n label: string\n /** 0–100 progress, or null when indeterminate (no bar rendered). */\n percent: number | null\n status: 'active' | 'completed'\n href: string | null\n}\n\n/** A cluster of quarantined contacts sharing one phone number. */\nexport type ChromeNotificationQuarantine = {\n phone: string\n count: number\n /** Upstream may omit it; the row already renders conditionally on it. */\n latestAt: string | null\n}\n\nexport type ChromeNotificationsPayload = {\n organizationId: string\n alerts: ChromeNotificationAlert[]\n replies: ChromeNotificationReply[]\n /** Optional — running/finished imports (tolerant when absent). */\n imports?: ChromeNotificationImport[]\n /** Optional — clustered quarantined contacts (tolerant when absent). */\n quarantined?: ChromeNotificationQuarantine[]\n /** Optional — the server's one badge number (adapter feeds only). */\n badge?: number\n}\n\nexport type ChromeOrgSummary = {\n id: string\n name: string | null\n logoUrl: string | null\n brandColor: string | null\n role: string | null\n /** Un-mapped VRM-core membership role (e.g. \"super_admin\"). */\n rawRole?: string | null\n}\n\n/**\n * Fetch the signed-in user's VRM-core organizations through the injected\n * fetcher. Exposed as a hook so the org switcher in the sidebar and the\n * org-scoped widgets share one request.\n */\nexport function useChromeOrgs({ enabled = true }: { enabled?: boolean } = {}): {\n orgs: ChromeOrgSummary[] | null\n loading: boolean\n error: boolean\n} {\n const { dedupedFetch } = useNavChrome('useChromeOrgs')\n const [orgs, setOrgs] = useState<ChromeOrgSummary[] | null>(null)\n const [loading, setLoading] = useState(enabled)\n const [error, setError] = useState(false)\n\n useEffect(() => {\n // Disabled when the app already holds the org list from its token-backed\n // session (auth-owned active org): no per-request chrome `/api/orgs` call.\n if (!enabled) {\n setLoading(false)\n return\n }\n let cancelled = false\n setLoading(true)\n setError(false)\n dedupedFetch('orgs', undefined)\n .then((data) => {\n if (cancelled) return\n const list = (data as { orgs?: ChromeOrgSummary[] })?.orgs ?? []\n setOrgs(list)\n })\n .catch(() => {\n if (!cancelled) setError(true)\n })\n .finally(() => {\n if (!cancelled) setLoading(false)\n })\n return () => {\n cancelled = true\n }\n }, [dedupedFetch, enabled])\n\n return { orgs, loading, error }\n}\n\n// ---------------------------------------------------------------------------\n// Internal building blocks.\n// ---------------------------------------------------------------------------\n\n/** Value-area skeleton shimmer (chrome/labels stay static per Global Rules). */\nfunction ValueSkeleton({ className }: { className?: string }) {\n return (\n <span\n aria-hidden\n className={[\n 'inline-block animate-pulse rounded bg-[color:var(--panel-elevated)]',\n className ?? 'h-4 w-16',\n ].join(' ')}\n />\n )\n}\n\n/** A glyph the caller chose outright (the Credits battery, drawn from its state). */\nfunction IconGlyph({ icon: Icon, size = TOPBAR_GLYPH_SIZE }: { icon: NavIconLike; size?: number }) {\n return <Icon size={size} className=\"text-current\" />\n}\n\n/** Slot-driven glyph: Brand-token name when resolvable, fallback otherwise. */\nfunction SlotGlyph({\n slot,\n fallback: Fallback,\n size = TOPBAR_GLYPH_SIZE,\n}: {\n slot?: TopBarIconSlot\n fallback: NavIconLike\n size?: number\n}) {\n const glyphName = useTopBarIconSlotGlyph(slot ?? 'apps')\n const BrandGlyph = slot ? resolveBrandGlyph(glyphName) : null\n const Glyph = BrandGlyph ?? Fallback\n return <Glyph size={size} className=\"text-current\" />\n}\n\n/**\n * A top-bar popover: the shared circular trigger + a right-aligned panel.\n * Closes on outside click / Escape. Purely presentational.\n *\n * EXPORTED so an app with a richer panel than the stock actions can render it\n * inside the SHARED chrome — same 32px trigger, same tooltip, same badge, same\n * panel surface and arrow — instead of hand-rolling a trigger and drifting.\n * This is the enabling step for folding VRM's Fuel breakdown, import-progress,\n * alerts and reply-feed panels into the shared cluster one at a time, without\n * dropping capability (shell-nav-handoff §4; UI-Platform forbids migrating an\n * app to a rendering that loses an element it already ships).\n */\nexport function TopBarPopover({\n label,\n ariaLabel,\n description,\n tooltip,\n slot,\n fallbackIcon,\n icon,\n badge,\n tone,\n onOpen,\n openToken,\n onOpenChange,\n hideTooltip = false,\n children,\n panelClassName,\n}: {\n label: string\n /** The trigger's accessible name when it must say more than the label (e.g. a state). */\n ariaLabel?: string\n description?: string\n /** Replaces the tooltip's description line with richer content. */\n tooltip?: ReactNode\n slot?: TopBarIconSlot\n fallbackIcon: NavIconLike\n /** A glyph that wins over the slot's Brand token (a state-drawn icon). */\n icon?: NavIconLike\n badge?: number\n tone?: TopBarIconTone\n onOpen?: () => void\n /**\n * Imperative \"open\" signal: whenever this number CHANGES the panel opens\n * (and `onOpen` fires). Lets a sibling — e.g. the notifications toast — open\n * the panel without owning the popover's state. Undefined disables it.\n */\n openToken?: number\n /**\n * Notified on every open/close. A sibling surface anchored to the same\n * trigger (e.g. the notifications toast) must know when the panel is open so\n * the two never render on top of each other — Reference/UI-Platform gives\n * every top-bar panel ONE surface anchored to its trigger, so a second\n * surface at the same anchor always occludes it.\n */\n onOpenChange?: (open: boolean) => void\n /**\n * Hide the trigger's hover tooltip while a transient nudge (the new-reply\n * toast, the low-fuel hint) is up under the same trigger. Both are z-50 and\n * anchored to the trigger, so without this the nudge paints over the\n * tooltip (measured on a2p: the reply toast covered \"Alerts &\n * Notifications\"). Reference/UI-Platform: one surface per trigger.\n */\n hideTooltip?: boolean\n children: ReactNode\n panelClassName?: string\n}) {\n const [open, setOpen] = useState(false)\n const onOpenChangeRef = useRef(onOpenChange)\n onOpenChangeRef.current = onOpenChange\n useEffect(() => {\n onOpenChangeRef.current?.(open)\n if (!open) return\n setPanelOpenGlobal(true)\n return () => setPanelOpenGlobal(false)\n }, [open])\n const rootRef = useRef<HTMLDivElement | null>(null)\n const lastOpenTokenRef = useRef(openToken)\n\n // React to external open signals (skips the initial value on mount).\n useEffect(() => {\n if (openToken === undefined) return\n if (openToken === lastOpenTokenRef.current) return\n lastOpenTokenRef.current = openToken\n setOpen((v) => {\n if (!v) onOpen?.()\n return true\n })\n }, [openToken, onOpen])\n\n useEffect(() => {\n if (!open) return\n const onDocClick = (e: MouseEvent) => {\n if (rootRef.current && !rootRef.current.contains(e.target as Node)) setOpen(false)\n }\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false)\n }\n document.addEventListener('mousedown', onDocClick)\n document.addEventListener('keydown', onKey)\n return () => {\n document.removeEventListener('mousedown', onDocClick)\n document.removeEventListener('keydown', onKey)\n }\n }, [open])\n\n return (\n <div ref={rootRef} className=\"relative\">\n <button\n type=\"button\"\n aria-label={ariaLabel ?? label}\n aria-expanded={open}\n className={topBarIconButtonClass(tone)}\n onClick={() => {\n setOpen((v) => {\n const next = !v\n if (next) onOpen?.()\n return next\n })\n }}\n >\n {icon ? <IconGlyph icon={icon} /> : <SlotGlyph slot={slot} fallback={fallbackIcon} />}\n {typeof badge === 'number' ? <TopBarCountBadge count={badge} /> : null}\n {!open && !hideTooltip ? <TopBarTooltip title={label} description={tooltip ?? description} /> : null}\n </button>\n {open ? (\n <div\n className={[\n 'absolute right-0 z-40 mt-2 rounded-xl border border-[color:var(--line)] bg-[color:var(--panel-elevated)] shadow-[var(--shadow-soft)]',\n panelClassName ?? 'w-80',\n ].join(' ')}\n >\n <TopBarPanelArrow />\n <div className=\"overflow-hidden rounded-xl\">{children}</div>\n </div>\n ) : null}\n </div>\n )\n}\n\n// Inline fallback glyphs (Feather-style paths) so the package needs no icon dep.\nfunction BatteryGlyph({ size = TOPBAR_GLYPH_SIZE, className }: { size?: number; className?: string }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className} aria-hidden>\n <rect x=\"1\" y=\"6\" width=\"18\" height=\"12\" rx=\"2\" ry=\"2\" />\n <line x1=\"23\" y1=\"10\" x2=\"23\" y2=\"14\" />\n <line x1=\"5\" y1=\"10\" x2=\"5\" y2=\"14\" />\n <line x1=\"9\" y1=\"10\" x2=\"9\" y2=\"14\" />\n </svg>\n )\n}\n\nfunction BellGlyph({ size = TOPBAR_GLYPH_SIZE, className }: { size?: number; className?: string }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className} aria-hidden>\n <path d=\"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9\" />\n <path d=\"M13.73 21a2 2 0 0 1-3.46 0\" />\n </svg>\n )\n}\n\nfunction BellOffGlyph({ size = 14, className }: { size?: number; className?: string }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className} aria-hidden>\n <path d=\"M13.73 21a2 2 0 0 1-3.46 0\" />\n <path d=\"M18.63 13A17.9 17.9 0 0 1 18 8\" />\n <path d=\"M6.26 6.26A5.86 5.86 0 0 0 6 8c0 7-3 9-3 9h14\" />\n <path d=\"M18 8a6 6 0 0 0-9.33-5\" />\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n </svg>\n )\n}\n\nfunction LifeBuoyGlyph({ size = TOPBAR_GLYPH_SIZE, className }: { size?: number; className?: string }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className} aria-hidden>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <circle cx=\"12\" cy=\"12\" r=\"4\" />\n <line x1=\"4.93\" y1=\"4.93\" x2=\"9.17\" y2=\"9.17\" />\n <line x1=\"14.83\" y1=\"14.83\" x2=\"19.07\" y2=\"19.07\" />\n <line x1=\"14.83\" y1=\"9.17\" x2=\"19.07\" y2=\"4.93\" />\n <line x1=\"4.93\" y1=\"19.07\" x2=\"9.17\" y2=\"14.83\" />\n </svg>\n )\n}\n\nfunction LayoutGlyph({ size = TOPBAR_GLYPH_SIZE, className }: { size?: number; className?: string }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className} aria-hidden>\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n <line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\" />\n <line x1=\"9\" y1=\"21\" x2=\"9\" y2=\"9\" />\n </svg>\n )\n}\n\nfunction PlusGlyph({ size = 14, className }: { size?: number; className?: string }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className} aria-hidden>\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n )\n}\n\nfunction XGlyph({ size = 14, className }: { size?: number; className?: string }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className} aria-hidden>\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n )\n}\n\nfunction CheckGlyph({ size = 14, className }: { size?: number; className?: string }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className} aria-hidden>\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n )\n}\n\n// ---------------------------------------------------------------------------\n// FuelAction — the Credits icon (battery with the lightning bolt), its gauges\n// and tooltip. Reference/UI-Platform → Top bar → Credits (decided 2026-10-13,\n// Ben); Pricing & Metering §7.5. The credits service publishes each type's\n// state, full mark and days of use left; the shell draws from those and never\n// derives a state from a balance. No pop-up opens by itself: the low-balance\n// hint that hung under the icon is retired. The word is Credits everywhere.\n// ---------------------------------------------------------------------------\n\n/** Battery fill by state: full, part, empty; none when the state is unknown or not in use. */\nfunction batteryFillWidth(state: CreditsIconState): number {\n switch (state) {\n case 'good':\n return 12\n case 'low':\n return 5\n default:\n return 0\n }\n}\n\n/** The battery with the lightning bolt, its fill drained to the icon state. */\nfunction creditsBatteryGlyph(state: CreditsIconState): NavIconLike {\n const fill = batteryFillWidth(state)\n const Glyph = ({ size = TOPBAR_GLYPH_SIZE, className }: { size?: number; className?: string }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n data-credits-state={state}\n aria-hidden\n >\n <rect x=\"1\" y=\"6\" width=\"18\" height=\"12\" rx=\"2\" ry=\"2\" />\n <line x1=\"23\" y1=\"10\" x2=\"23\" y2=\"14\" />\n {fill > 0 ? <rect x=\"4\" y=\"9\" width={fill} height=\"6\" rx=\"1\" fill=\"currentColor\" stroke=\"none\" opacity={0.35} /> : null}\n <path d=\"M11.5 8 8.5 12.5h3L10.5 16l3.5-4.5h-3L11.5 8z\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n )\n Glyph.displayName = `CreditsBatteryGlyph(${state})`\n return Glyph\n}\n\nfunction stateTone(state: CreditsIconState): TopBarIconTone {\n switch (state) {\n case 'good':\n return 'ok'\n case 'low':\n return 'low'\n case 'out':\n return 'danger'\n default:\n return 'default'\n }\n}\n\nfunction stateColorVar(state: CreditHealthState | null | undefined): string {\n switch (state) {\n case 'good':\n return 'var(--credits-good,#00783B)'\n case 'low':\n return 'var(--credits-low,#B7791F)'\n case 'out':\n return 'var(--chrome-danger)'\n default:\n return 'var(--muted)'\n }\n}\n\n/** A gauge filled against the type's full mark; empty track when there is no level to draw. */\nfunction CreditGauge({ channel, className }: { channel: FuelChannelStatus | null; className?: string }) {\n const ratio = creditGaugeRatio(channel)\n return (\n <div\n role=\"meter\"\n aria-label={`${creditStateWord(channel?.state)} level`}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={ratio === null ? undefined : Math.round(ratio * 100)}\n className={['h-1.5 w-full overflow-hidden rounded-full bg-[color:var(--panel)]', className ?? ''].join(' ')}\n >\n {ratio === null ? null : (\n <div\n className=\"h-full rounded-full transition-[width]\"\n style={{ width: `${Math.round(ratio * 100)}%`, backgroundColor: stateColorVar(channel?.state) }}\n />\n )}\n </div>\n )\n}\n\nfunction formatGrantDate(iso: string | null | undefined): string | null {\n if (!iso) return null\n const t = Date.parse(iso)\n if (!Number.isFinite(t)) return null\n return new Date(t).toLocaleDateString('en-US', { month: 'short', day: 'numeric' })\n}\n\nfunction CreditRow({\n type,\n channel,\n loading,\n addHref,\n}: {\n type: CreditTypeKey\n channel: FuelChannelStatus | null\n loading: boolean\n /** Billing deep-link for the small \"+\" top-up button (omit to hide it). */\n addHref?: string\n}) {\n const label = CREDIT_TYPE_LABELS[type]\n const remaining = channel?.remainingUnits ?? 0\n const state = channel?.state ?? null\n const unavailable = !loading && !channel\n const nextGrant = formatGrantDate(channel?.nextGrantAt)\n const pools =\n channel && typeof channel.includedUnits === 'number' && typeof channel.purchasedUnits === 'number'\n ? `Included ${channel.includedUnits.toLocaleString()}${nextGrant ? ` (next ${nextGrant})` : ''} · Purchased ${channel.purchasedUnits.toLocaleString()}`\n : null\n\n return (\n <div className=\"w-full\" data-credit-type={type}>\n <div className=\"mb-1 flex items-center justify-between gap-2\">\n <span className=\"text-xs font-semibold text-[color:var(--foreground)]\">{label}</span>\n <div className=\"flex items-center gap-2\">\n {loading ? (\n <ValueSkeleton className=\"h-3.5 w-14\" />\n ) : unavailable ? (\n <span className=\"text-xs text-[color:var(--muted)]\">Unavailable</span>\n ) : (\n <span className=\"text-xs font-semibold tabular-nums\" style={{ color: stateColorVar(state) }}>\n {remaining.toLocaleString()} left\n {state === 'not_in_use' ? null : <span className=\"font-normal text-[color:var(--muted)]\"> · {creditStateWord(state)}</span>}\n </span>\n )}\n {addHref && !unavailable ? (\n <a\n href={addHref}\n aria-label={`Add ${label}`}\n className=\"flex h-5 w-5 items-center justify-center rounded-full border border-[color:var(--line)] text-[color:var(--muted)] transition hover:border-[color:var(--foreground)] hover:text-[color:var(--foreground)]\"\n >\n <PlusGlyph />\n </a>\n ) : null}\n </div>\n </div>\n {loading ? (\n <div className=\"h-1.5 w-full overflow-hidden rounded-full bg-[color:var(--panel)]\">\n <div className=\"h-full w-full animate-pulse bg-[color:var(--line)]\" />\n </div>\n ) : (\n <CreditGauge channel={unavailable ? null : channel} />\n )}\n {!loading && state === 'not_in_use' ? (\n <p className=\"mt-1 text-[11px] text-[color:var(--muted)]\">Not in use</p>\n ) : pools ? (\n <p className=\"mt-1 text-[11px] text-[color:var(--muted)]\">{pools}</p>\n ) : null}\n </div>\n )\n}\n\n/** The hover/focus tooltip: every type with its name, Available, gauge and state in words. */\nfunction CreditsTooltip({ fuel }: { fuel: CommunicationsFuelStatus | null }) {\n return (\n <span className=\"flex w-56 flex-col gap-1.5\" data-testid=\"credits-tooltip\">\n {CREDIT_TYPE_ORDER.map((type) => {\n const channel = fuel ? (fuel[type] ?? null) : null\n return (\n <span key={type} className=\"flex flex-col gap-0.5\">\n <span>{creditTooltipLine(type, channel)}</span>\n <CreditGauge channel={channel} className=\"bg-[#FFFFFF]/20\" />\n </span>\n )\n })}\n </span>\n )\n}\n\nfunction channelsOf(fuel: CommunicationsFuelStatus | null): Partial<Record<CreditTypeKey, FuelChannelStatus | null | undefined>> {\n if (!fuel) return {}\n return { signal: fuel.signal, broadcast: fuel.broadcast, ai: fuel.ai, enhancement: fuel.enhancement }\n}\n\nexport function FuelAction({ orgId }: { orgId: string | null }) {\n const { dedupedFetch } = useNavChrome('FuelAction')\n const [fuel, setFuel] = useState<CommunicationsFuelStatus | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n // No org yet: wait for it. A header-less read is a second request for\n // the same widget once the org resolves (twice per page load).\n if (!orgId) {\n setLoading(false)\n return\n }\n setLoading(true)\n setError(false)\n setFuel(null)\n dedupedFetch(\n 'communications/fuel-status',\n { headers: orgId ? { 'x-contacts-org': orgId } : undefined },\n { orgId },\n )\n .then((data) => {\n if (cancelled) return\n setFuel((data as { fuel?: CommunicationsFuelStatus | null })?.fuel ?? null)\n })\n .catch(() => {\n if (!cancelled) setError(true)\n })\n .finally(() => {\n if (!cancelled) setLoading(false)\n })\n return () => {\n cancelled = true\n }\n }, [dedupedFetch, orgId])\n\n const channels = channelsOf(fuel)\n const iconState = creditsIconState(CREDIT_TYPE_ORDER.map((t) => channels[t]))\n const Glyph = useMemo(() => creditsBatteryGlyph(iconState), [iconState])\n const addHref = withOrgParam(CORE_BILLING_URL, orgId)\n\n return (\n <TopBarPopover\n label=\"Credits\"\n ariaLabel={creditsAriaLabel(channels)}\n tooltip={<CreditsTooltip fuel={fuel} />}\n slot=\"comms-fuel\"\n fallbackIcon={BatteryGlyph}\n icon={Glyph}\n tone={stateTone(iconState)}\n >\n <div className=\"px-4 py-3\">\n <p className=\"mb-3 text-[11px] font-semibold uppercase tracking-[0.08em] text-[color:var(--muted)]\">\n Credits\n </p>\n {error || (!loading && !fuel) ? (\n <p className=\"text-sm text-[color:var(--muted)]\">Credits are unavailable right now.</p>\n ) : (\n <div className=\"flex flex-col gap-3\">\n {CREDIT_TYPE_ORDER.map((type) => (\n <CreditRow key={type} type={type} channel={channels[type] ?? null} loading={loading} addHref={addHref} />\n ))}\n </div>\n )}\n </div>\n </TopBarPopover>\n )\n}\n\n/** The Credits icon under its spec name; `FuelAction` stays for existing imports. */\nexport const CreditsAction = FuelAction\n\n// ---------------------------------------------------------------------------\n// NotificationsAction — bell + count badge + alerts/replies popover.\n// ---------------------------------------------------------------------------\n\n/** Per-org read/seen state, persisted client-side (localStorage). */\ntype NotifState = {\n readAlertIds: string[]\n lastSeenAt: string | null\n /** Reply ids already surfaced as a toast, so none re-toasts (capped ~50). */\n toastedReplyIds: string[]\n}\n\nfunction notifStateKey(orgId: string | null): string {\n return `politogy_chrome_notif_state:${orgId ?? 'none'}`\n}\n\nfunction readNotifState(orgId: string | null): NotifState {\n const empty: NotifState = { readAlertIds: [], lastSeenAt: null, toastedReplyIds: [] }\n if (typeof window === 'undefined') return empty\n try {\n const raw = window.localStorage.getItem(notifStateKey(orgId))\n if (!raw) return empty\n const parsed = JSON.parse(raw) as Partial<NotifState>\n return {\n readAlertIds: Array.isArray(parsed?.readAlertIds)\n ? parsed.readAlertIds.filter((id): id is string => typeof id === 'string')\n : [],\n lastSeenAt: typeof parsed?.lastSeenAt === 'string' ? parsed.lastSeenAt : null,\n toastedReplyIds: Array.isArray(parsed?.toastedReplyIds)\n ? parsed.toastedReplyIds.filter((id): id is string => typeof id === 'string')\n : [],\n }\n } catch {\n return empty\n }\n}\n\nfunction writeNotifState(orgId: string | null, state: NotifState): void {\n if (typeof window === 'undefined') return\n try {\n window.localStorage.setItem(notifStateKey(orgId), JSON.stringify(state))\n } catch {\n /* unavailable */\n }\n}\n\n/**\n * Session-scoped mute for the rotating new-reply toasts. Session (not local)\n * storage on purpose: silencing is a \"not right now\" gesture, so a reload\n * restores the toasts rather than silently disabling them forever.\n */\nconst TOASTS_MUTED_KEY = 'politogy_chrome_toasts_muted'\n\nfunction readToastsMuted(): boolean {\n if (typeof window === 'undefined') return false\n try {\n return window.sessionStorage.getItem(TOASTS_MUTED_KEY) === '1'\n } catch {\n return false\n }\n}\n\nfunction writeToastsMuted(muted: boolean): void {\n if (typeof window === 'undefined') return\n try {\n if (muted) window.sessionStorage.setItem(TOASTS_MUTED_KEY, '1')\n else window.sessionStorage.removeItem(TOASTS_MUTED_KEY)\n } catch {\n /* unavailable */\n }\n}\n\n/** Format a raw phone into US (XXX) XXX-XXXX; leave anything else as-is. */\nfunction formatPhone(raw: string): string {\n const digits = raw.replace(/\\D/g, '')\n const ten = digits.length === 11 && digits.startsWith('1') ? digits.slice(1) : digits\n if (ten.length === 10) return `(${ten.slice(0, 3)}) ${ten.slice(3, 6)}-${ten.slice(6)}`\n return raw\n}\n\nfunction ImportRow({ imp }: { imp: ChromeNotificationImport }) {\n const pct = imp.percent == null ? null : Math.max(0, Math.min(100, imp.percent))\n return (\n <>\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"truncate text-sm text-[color:var(--foreground)]\">{imp.label}</span>\n {pct != null ? (\n <span className=\"shrink-0 text-xs tabular-nums text-[color:var(--muted)]\">\n {Math.round(pct)}%\n </span>\n ) : null}\n </div>\n {pct != null ? (\n <div className=\"mt-1 h-1 w-full overflow-hidden rounded-full bg-[color:var(--panel)]\">\n <div\n className=\"h-full rounded-full bg-[color:var(--color-accent)] transition-[width]\"\n style={{ width: `${pct}%` }}\n />\n </div>\n ) : null}\n </>\n )\n}\n\n/**\n * Transient \"new reply\" toast anchored below the bell. Dark bubble with an\n * up-arrow, sender + preview; auto-fades after ~12s; clicking activates it.\n * Mirrors VRM's NewTextBellPopup. Purely presentational — the parent owns which\n * reply shows and what a click does.\n */\nfunction NewReplyToast({\n reply,\n onActivate,\n onClose,\n onSilence,\n ttlMs = 12000,\n}: {\n reply: ChromeNotificationReply\n onActivate: () => void\n onClose: () => void\n onSilence: () => void\n ttlMs?: number\n}) {\n const [visible, setVisible] = useState(false)\n const onCloseRef = useRef(onClose)\n onCloseRef.current = onClose\n\n useEffect(() => {\n setVisible(true)\n const fadeAt = Math.max(0, ttlMs - 450)\n const t1 = window.setTimeout(() => setVisible(false), fadeAt)\n const t2 = window.setTimeout(() => onCloseRef.current(), ttlMs)\n return () => {\n window.clearTimeout(t1)\n window.clearTimeout(t2)\n }\n }, [ttlMs])\n\n const activate = () => {\n setVisible(false)\n onActivate()\n }\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n aria-label=\"Open new reply\"\n onClick={activate}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n activate()\n }\n }}\n className=\"absolute right-[-6px] top-[calc(100%+12px)] z-50 min-w-[240px] max-w-[320px] cursor-pointer rounded-xl bg-[#161616] px-4 py-3 text-[#FFFFFF] shadow-[var(--shadow-soft)]\"\n style={{\n opacity: visible ? 1 : 0,\n transform: visible ? 'translateY(0px)' : 'translateY(-4px)',\n transition: 'opacity 250ms ease, transform 250ms ease',\n }}\n >\n {/* Up-arrow pointing at the bell. */}\n <span\n aria-hidden\n className=\"absolute right-[18px] top-[-7px] h-0 w-0 border-x-[8px] border-x-transparent border-b-[8px] border-b-[#161616]\"\n />\n {/* Dismiss this ONE toast without navigating. The bubble itself is the\n activate target, so the close control has to stop propagation or\n \"get rid of it\" would mean \"open it\" (reported 2026-08-12). */}\n <button\n type=\"button\"\n aria-label=\"Dismiss notification\"\n onClick={(e) => {\n e.stopPropagation()\n setVisible(false)\n onClose()\n }}\n className=\"absolute right-2 top-2 flex h-5 w-5 items-center justify-center rounded-full text-[#FFFFFF] opacity-60 transition hover:bg-[#FFFFFF]/10 hover:opacity-100\"\n >\n <XGlyph size={12} />\n </button>\n <p className=\"truncate pr-6 text-sm font-semibold\">{reply.name}</p>\n <p className=\"mt-1 truncate text-xs opacity-85\">{reply.preview}</p>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n setVisible(false)\n onSilence()\n }}\n className=\"mt-2 inline-flex items-center gap-1 text-[11px] font-semibold text-[#FFFFFF] opacity-60 transition hover:opacity-100\"\n >\n <BellOffGlyph size={12} />\n Silence notifications\n </button>\n </div>\n )\n}\n\nexport function NotificationsAction({ orgId }: { orgId: string | null }) {\n const { dedupedFetch, notificationsAdapter } = useNavChrome('NotificationsAction')\n const [payload, setPayload] = useState<ChromeNotificationsPayload | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState(false)\n const [notif, setNotif] = useState<NotifState>(() => readNotifState(orgId))\n const [toastReply, setToastReply] = useState<ChromeNotificationReply | null>(null)\n const [toastsMuted, setToastsMuted] = useState<boolean>(() => readToastsMuted())\n const [openToken, setOpenToken] = useState(0)\n const [panelOpen, setPanelOpen] = useState(false)\n // Bumped after a server write (adapter path) to re-read the feed and badge.\n const [reloadToken, setReloadToken] = useState(0)\n // Also yield to a panel opened from a NEIGHBOURING trigger — the fuel panel\n // is right-aligned and wide enough to sit under the bell.\n const anyPanelOpen = useAnyTopBarPanelOpen()\n\n // Re-hydrate the read/seen watermark whenever the active org changes.\n useEffect(() => {\n setNotif(readNotifState(orgId))\n setToastReply(null)\n }, [orgId])\n\n useEffect(() => {\n let cancelled = false\n // No org yet: wait for it. A header-less read is a second request for\n // the same widget once the org resolves (twice per page load).\n if (!orgId) {\n setLoading(false)\n return\n }\n if (notificationsAdapter) {\n // Comms feed. Never rejects: a missing session or absent route is an\n // empty bell, not an error state.\n setError(false)\n notificationsAdapter\n .list(orgId)\n .then((feed) => {\n if (!cancelled) setPayload(notificationsFeedToPayload(feed, orgId) as ChromeNotificationsPayload)\n })\n .catch(() => {\n if (!cancelled) setPayload(notificationsFeedToPayload(emptyNotificationsFeed(), orgId) as ChromeNotificationsPayload)\n })\n .finally(() => {\n if (!cancelled) setLoading(false)\n })\n return () => {\n cancelled = true\n }\n }\n setLoading(true)\n setError(false)\n setPayload(null)\n dedupedFetch(\n 'notifications',\n { headers: orgId ? { 'x-contacts-org': orgId } : undefined },\n { orgId },\n )\n .then((data) => {\n if (!cancelled) setPayload(data as ChromeNotificationsPayload)\n })\n .catch(() => {\n if (!cancelled) setError(true)\n })\n .finally(() => {\n if (!cancelled) setLoading(false)\n })\n return () => {\n cancelled = true\n }\n }, [dedupedFetch, notificationsAdapter, orgId, reloadToken])\n\n // 10DLC registration alert: surfaced only in the notifications panel/badge\n // (unread state). No auto-redirect — see Decisions in PR for feat/spec-overlay.\n\n const markRead = useCallback(\n (id: string) => {\n // Adapter feeds persist read state on the server, then re-read the feed\n // so the row and the badge reflect it. A failed write is simply a no-op.\n if (notificationsAdapter) {\n void notificationsAdapter.markRead(id).then((ok) => {\n if (ok) setReloadToken((t) => t + 1)\n })\n }\n setNotif((prev) => {\n if (prev.readAlertIds.includes(id)) return prev\n const next = { ...prev, readAlertIds: [...prev.readAlertIds, id] }\n writeNotifState(orgId, next)\n return next\n })\n },\n [orgId, notificationsAdapter],\n )\n\n const markUnread = useCallback(\n (id: string) => {\n setNotif((prev) => {\n if (!prev.readAlertIds.includes(id)) return prev\n const next = { ...prev, readAlertIds: prev.readAlertIds.filter((x) => x !== id) }\n writeNotifState(orgId, next)\n return next\n })\n },\n [orgId],\n )\n\n // Opening the panel advances the \"last seen\" watermark (replies are seen).\n const onOpen = useCallback(() => {\n // The panel shows the reply the toast was previewing, so the toast has\n // nothing left to say — retire it rather than let it cover the panel.\n setToastReply(null)\n setNotif((prev) => {\n const next = { ...prev, lastSeenAt: new Date().toISOString() }\n writeNotifState(orgId, next)\n return next\n })\n }, [orgId])\n\n const alerts = payload?.alerts ?? []\n const replies = payload?.replies ?? []\n const imports = payload?.imports ?? []\n const quarantined = payload?.quarantined ?? []\n\n // New-reply toast: surface the newest reply that is (a) newer than the seen\n // watermark and (b) not already toasted this org. One at a time; the id is\n // recorded so a re-render / re-fetch never re-toasts it (capped at 50).\n useEffect(() => {\n // Silenced for this session — surface nothing new (the badge still counts).\n if (toastsMuted) return\n if (!payload || toastReply || panelOpen) return\n const candidate = replies\n .filter((r) => {\n if (!r.createdAt) return false\n if (notif.lastSeenAt && r.createdAt <= notif.lastSeenAt) return false\n return !notif.toastedReplyIds.includes(r.id)\n })\n .sort((a, b) => (a.createdAt! < b.createdAt! ? 1 : -1))[0]\n if (!candidate) return\n setToastReply(candidate)\n setNotif((prev) => {\n const next = {\n ...prev,\n toastedReplyIds: [candidate.id, ...prev.toastedReplyIds].slice(0, 50),\n }\n writeNotifState(orgId, next)\n return next\n })\n }, [\n payload,\n replies,\n toastReply,\n panelOpen,\n toastsMuted,\n notif.lastSeenAt,\n notif.toastedReplyIds,\n orgId,\n ])\n\n // Toast click: navigate to the reply's href when it carries one; otherwise\n // open the notifications panel (which also advances the seen watermark).\n const setMuted = useCallback((muted: boolean) => {\n writeToastsMuted(muted)\n setToastsMuted(muted)\n }, [])\n\n const onToastSilence = useCallback(() => {\n setMuted(true)\n setToastReply(null)\n }, [setMuted])\n\n const onToastActivate = useCallback(() => {\n const href = toastReply?.href\n setToastReply(null)\n if (href && typeof window !== 'undefined') {\n window.location.assign(href)\n return\n }\n setOpenToken((t) => t + 1)\n }, [toastReply])\n\n // Badge: UNREAD alerts + replies newer than the last-seen watermark. A reply\n // with no timestamp counts before the first open, then is treated as seen.\n const isAlertRead = (a: ChromeNotificationAlert) => a.read === true || notif.readAlertIds.includes(a.id)\n const unreadAlertCount = alerts.filter((a) => !isAlertRead(a)).length\n const unseenReplyCount = replies.filter((r) => {\n if (!notif.lastSeenAt) return true\n if (!r.createdAt) return false\n return r.createdAt > notif.lastSeenAt\n }).length\n // Adapter feeds carry the server's one badge number (unread notifications\n // plus unresolved alerts); the local count is the legacy contacts path only.\n const badgeCount =\n notificationsAdapter && payload?.badge !== undefined\n ? payload.badge\n : unreadAlertCount + unseenReplyCount\n\n const isEmpty =\n alerts.length === 0 && replies.length === 0 && imports.length === 0 && quarantined.length === 0\n\n // The toast yields to any open panel (this one or a neighbour's), and while\n // it is up the bell's hover tooltip yields to it - one surface per trigger.\n const toastVisible = toastReply !== null && !panelOpen && !anyPanelOpen\n\n return (\n // Relative wrapper so the new-reply toast anchors to the bell trigger,\n // outside the popover panel (same pattern as the fuel low-fuel nudge).\n <div className=\"relative inline-flex\">\n <TopBarPopover\n label=\"Alerts & Notifications\"\n description=\"System alerts and recent activity for the active organization.\"\n slot=\"notifications\"\n fallbackIcon={BellGlyph}\n badge={loading ? 0 : badgeCount}\n onOpen={onOpen}\n openToken={openToken}\n onOpenChange={setPanelOpen}\n hideTooltip={toastVisible}\n >\n <div className=\"px-4 py-3\">\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <p className=\"text-[11px] font-semibold uppercase tracking-[0.08em] text-[color:var(--muted)]\">\n Notifications\n </p>\n {/* Only shown once silenced — the way back, in the same session. */}\n {toastsMuted ? (\n <button\n type=\"button\"\n onClick={() => setMuted(false)}\n className=\"text-[11px] font-semibold text-[color:var(--color-accent-fg,var(--color-accent))] hover:underline\"\n >\n Unsilence\n </button>\n ) : null}\n </div>\n {loading ? (\n <div className=\"flex flex-col gap-2 py-1\">\n <ValueSkeleton className=\"h-4 w-full\" />\n <ValueSkeleton className=\"h-4 w-3/4\" />\n </div>\n ) : error ? (\n <p className=\"text-sm text-[color:var(--muted)]\">\n Notifications are unavailable right now.\n </p>\n ) : isEmpty ? (\n <p className=\"py-1 text-sm text-[color:var(--muted)]\">You’re all caught up.</p>\n ) : (\n <div className=\"flex max-h-80 flex-col gap-2 overflow-y-auto\">\n {/* Alerts (with per-item read toggle) + replies — unchanged order. */}\n {alerts.length > 0 || replies.length > 0 ? (\n <ul className=\"flex flex-col gap-1\">\n {alerts.map((a) => {\n const isRead = isAlertRead(a)\n return (\n <li key={a.id} className={isRead ? 'opacity-50' : undefined}>\n <div className=\"flex items-start gap-1 rounded-lg px-2 py-2 hover:bg-[color:var(--panel)]\">\n <a\n href={a.href ?? '#'}\n onClick={() => markRead(a.id)}\n className=\"block min-w-0 flex-1\"\n >\n <p className=\"text-sm font-semibold text-[color:var(--foreground)]\">\n {a.title}\n </p>\n <p className=\"text-xs text-[color:var(--muted)]\">{a.description}</p>\n </a>\n <button\n type=\"button\"\n aria-label={isRead ? 'Mark as unread' : 'Mark as read'}\n onClick={() => (isRead && !notificationsAdapter ? markUnread(a.id) : markRead(a.id))}\n className=\"mt-0.5 flex h-5 w-5 shrink-0 items-center justify-center rounded-full text-[color:var(--muted)] transition hover:bg-[color:var(--panel-elevated)] hover:text-[color:var(--foreground)]\"\n >\n <CheckGlyph />\n </button>\n </div>\n </li>\n )\n })}\n {/* A reply row is a REAL link when it carries a deep-link, so\n the hover highlight leads somewhere: the conversation the\n reply arrived in (reported 2026-08-12). Rows without an\n href stay inert rather than pretending to be clickable. */}\n {replies.map((r) => {\n const body = (\n <>\n <p className=\"text-sm font-semibold text-[color:var(--foreground)]\">\n {r.name}\n </p>\n <p className=\"truncate text-xs text-[color:var(--muted)]\">{r.preview}</p>\n </>\n )\n return (\n <li key={r.id}>\n {r.href ? (\n <a\n href={r.href}\n aria-label={`Open the conversation with ${r.name}`}\n className=\"block rounded-lg px-2 py-2 transition hover:bg-[color:var(--panel)] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[color:var(--color-accent)]\"\n >\n {body}\n </a>\n ) : (\n <div className=\"rounded-lg px-2 py-2\">{body}</div>\n )}\n </li>\n )\n })}\n </ul>\n ) : null}\n\n {/* Imports — running/finished contact imports. */}\n {imports.length > 0 ? (\n <div>\n <p className=\"mb-1 px-2 text-[11px] font-semibold uppercase tracking-[0.08em] text-[color:var(--muted)]\">\n Imports\n </p>\n <ul className=\"flex flex-col gap-1\">\n {imports.map((imp) => (\n <li key={imp.id} className=\"rounded-lg px-2 py-2 hover:bg-[color:var(--panel)]\">\n {imp.href ? (\n <a href={imp.href} className=\"block\">\n <ImportRow imp={imp} />\n </a>\n ) : (\n <ImportRow imp={imp} />\n )}\n </li>\n ))}\n </ul>\n </div>\n ) : null}\n\n {/* Quarantined contact clusters. */}\n {quarantined.length > 0 ? (\n <div>\n <div className=\"mb-1 flex items-center justify-between px-2\">\n <p className=\"text-[11px] font-semibold uppercase tracking-[0.08em] text-[color:var(--muted)]\">\n Quarantined Contacts\n </p>\n <a\n href={withOrgParam(QUARANTINED_CONTACTS_URL, orgId)}\n className=\"text-[11px] font-semibold text-[color:var(--color-accent-fg,var(--color-accent))] hover:underline\"\n >\n View all\n </a>\n </div>\n <ul className=\"flex flex-col gap-1\">\n {/* Each row is a REAL link, not a div with a hover class. It\n used to carry a hover highlight on a non-interactive <li>,\n so the row advertised interactivity and then did nothing\n when clicked (reported 2026-08-03). An affordance has to\n lead somewhere: the row opens the quarantined-contacts\n view filtered to that number — the same destination as\n \"View all\", scoped. Being an <a> makes it keyboard\n focusable and Enter-activatable for free. */}\n {quarantined.map((q) => (\n <li key={q.phone}>\n <a\n href={withPhoneParam(withOrgParam(QUARANTINED_CONTACTS_URL, orgId), q.phone)}\n aria-label={`Review ${q.count} quarantined message${q.count === 1 ? '' : 's'} from ${formatPhone(q.phone)}`}\n className=\"block rounded-lg px-2 py-2 transition hover:bg-[color:var(--nav-row-hover)] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[color:var(--color-accent)]\"\n >\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-sm font-semibold text-[color:var(--foreground)]\">\n {formatPhone(q.phone)}\n </span>\n {/* Same geometry as the shared TopBarCountBadge (16px\n circle, 10px/400, px-1); it sits in flow rather\n than absolutely on a 32px trigger, because this is\n a list row and not a top-bar icon. */}\n <span className=\"flex h-4 min-w-4 items-center justify-center rounded-full bg-[color:var(--panel)] px-1 text-[10px] font-normal leading-none tabular-nums text-[color:var(--muted)]\">\n {q.count > 99 ? '99+' : q.count}\n </span>\n </div>\n {q.latestAt ? (\n <p className=\"text-xs text-[color:var(--muted)]\">\n {new Date(q.latestAt).toLocaleString()}\n </p>\n ) : null}\n </a>\n </li>\n ))}\n </ul>\n </div>\n ) : null}\n </div>\n )}\n </div>\n </TopBarPopover>\n {/* Only ONE surface at this anchor at a time: the toast yields to the panel\n (both hang off the bell trigger, so rendering both means the toast sits\n on the panel's header — Reference/UI-Platform, one surface per trigger). */}\n {toastVisible && toastReply ? (\n <NewReplyToast\n reply={toastReply}\n onActivate={onToastActivate}\n onClose={() => setToastReply(null)}\n onSilence={onToastSilence}\n />\n ) : null}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// SupportAction — life-buoy trigger + the shared support-request modal\n// (never a mailto:, never an app-local form — Reference/UI-Platform).\n// ---------------------------------------------------------------------------\n\n/**\n * Compose the delivered support message: the user's note, then a context block\n * carrying the page, URL and active org — plus a Reply-to line when the user\n * had to supply contact details the profile was missing. The upstream contract\n * stays `POST support { message }`; this just enriches the text (VRM parity).\n */\nfunction composeSupportMessage(input: {\n note: string\n pageTitle: string\n url: string\n orgName?: string | null\n replyEmail?: string\n replyPhone?: string\n}): string {\n const ctx = [`Page: ${input.pageTitle || 'Unknown'}`, `URL: ${input.url}`]\n if (input.orgName) ctx.push(`Org: ${input.orgName}`)\n const reply = [input.replyEmail?.trim(), input.replyPhone?.trim()].filter(Boolean).join(' / ')\n if (reply) ctx.push(`Reply-to: ${reply}`)\n return `${input.note.trim()}\\n\\n---\\n${ctx.join('\\n')}`\n}\n\nexport function SupportAction({\n orgId,\n orgs: knownOrgs,\n}: { orgId?: string | null; orgs?: { id: string; name: string | null }[] } = {}) {\n const { fetchJson } = useNavChrome('SupportAction')\n const { me, loaded } = useChromeMe()\n // A caller that already holds the org list skips the chrome `/api/orgs` call.\n const { orgs: fetchedOrgs } = useChromeOrgs({ enabled: !knownOrgs })\n const orgs = knownOrgs ?? fetchedOrgs\n const [open, setOpen] = useState(false)\n const [message, setMessage] = useState('')\n const [email, setEmail] = useState('')\n const [phone, setPhone] = useState('')\n const [showEmailError, setShowEmailError] = useState(false)\n const [state, setState] = useState<'idle' | 'sending' | 'sent' | 'error'>('idle')\n\n // The profile knows email/phone unless the chrome `me` loaded without them —\n // then we collect the missing one(s) in the modal (email required, phone not).\n const meEmail = me?.email ?? null\n const mePhone = me?.phone ?? null\n const missingEmail = loaded && !meEmail\n const missingPhone = loaded && !mePhone\n\n const activeOrg =\n (orgId ? orgs?.find((o) => o.id === orgId) : null) ??\n (orgs && orgs.length === 1 ? orgs[0] : null)\n const orgName = activeOrg?.name ?? null\n\n const close = useCallback(() => {\n setOpen(false)\n setState('idle')\n setMessage('')\n setShowEmailError(false)\n }, [])\n\n // Seed the contact inputs from the profile whenever the modal opens.\n useEffect(() => {\n if (!open) return\n setEmail(meEmail ?? '')\n setPhone(mePhone ?? '')\n setShowEmailError(false)\n }, [open, meEmail, mePhone])\n\n useEffect(() => {\n if (!open) return\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') close()\n }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [open, close])\n\n const submit = async () => {\n if (!message.trim() || state === 'sending') return\n\n const resolvedEmail = (missingEmail ? email : meEmail ?? '').trim()\n const resolvedPhone = (missingPhone ? phone : mePhone ?? '').trim()\n // Email is required when the profile didn't carry one.\n if (missingEmail && !resolvedEmail) {\n setShowEmailError(true)\n return\n }\n setShowEmailError(false)\n\n const collectedContact = missingEmail || missingPhone\n const fullMessage = composeSupportMessage({\n note: message,\n pageTitle: typeof document !== 'undefined' ? document.title : '',\n url: typeof window !== 'undefined' ? window.location.href : '',\n orgName,\n replyEmail: collectedContact ? resolvedEmail : undefined,\n replyPhone: collectedContact ? resolvedPhone : undefined,\n })\n\n setState('sending')\n try {\n await fetchJson('support', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ message: fullMessage }),\n })\n setState('sent')\n } catch {\n setState('error')\n }\n }\n\n return (\n <>\n <button\n type=\"button\"\n aria-label=\"Support\"\n className={topBarIconButtonClass()}\n onClick={() => setOpen(true)}\n >\n <SlotGlyph slot=\"support\" fallback={LifeBuoyGlyph} />\n <TopBarTooltip\n title=\"Support\"\n description=\"Send a support request to the Politogy team.\"\n />\n </button>\n {open && typeof document !== 'undefined'\n ? createPortal(\n <div\n // Portaled to <body>: the top bar's backdrop-blur creates a CSS\n // containing block, so a fixed-position descendant would center on\n // the HEADER (rendering off-screen) instead of the viewport.\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/40 p-4\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Support request\"\n onMouseDown={(e) => {\n if (e.target === e.currentTarget) close()\n }}\n >\n <div className=\"w-full max-w-md rounded-2xl border border-[color:var(--line)] bg-[color:var(--panel-elevated)] p-6 shadow-[var(--shadow-soft)]\">\n <h2 className=\"text-lg font-bold tracking-[-0.01em] text-[color:var(--foreground)]\">\n Contact Support\n </h2>\n {state === 'sent' ? (\n <>\n <p className=\"mt-3 text-sm text-[color:var(--muted)]\">\n Your request was sent. The team will reply by email.\n </p>\n <div className=\"mt-5 flex justify-end\">\n <button\n type=\"button\"\n onClick={close}\n className=\"rounded-full bg-[color:var(--color-accent-bg-safe,var(--color-accent))] px-4 py-2 text-sm font-semibold text-[#FFFFFF] hover:opacity-90\"\n >\n Done\n </button>\n </div>\n </>\n ) : (\n <>\n <p className=\"mt-1 text-sm text-[color:var(--muted)]\">\n Describe the problem or question. Your account details ride along\n automatically.\n </p>\n {missingEmail ? (\n <label className=\"mt-4 block\">\n <span className=\"mb-1 block text-xs font-semibold text-[color:var(--foreground)]\">\n Your email\n </span>\n <input\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n className=\"w-full rounded-lg border border-[color:var(--line)] bg-[color:var(--panel)] px-3 py-2 text-sm text-[color:var(--foreground)] placeholder:text-[color:var(--muted)] focus:outline-none focus:ring-2 focus:ring-[color:var(--color-accent)]\"\n />\n {showEmailError ? (\n <span className=\"mt-1 block text-xs text-[color:var(--chrome-danger)]\">\n Enter an email so support can reply.\n </span>\n ) : null}\n </label>\n ) : null}\n {missingPhone ? (\n <label className=\"mt-3 block\">\n <span className=\"mb-1 block text-xs font-semibold text-[color:var(--foreground)]\">\n Your phone — optional\n </span>\n <input\n type=\"tel\"\n value={phone}\n onChange={(e) => setPhone(e.target.value)}\n placeholder=\"(503) 555-1212\"\n className=\"w-full rounded-lg border border-[color:var(--line)] bg-[color:var(--panel)] px-3 py-2 text-sm text-[color:var(--foreground)] placeholder:text-[color:var(--muted)] focus:outline-none focus:ring-2 focus:ring-[color:var(--color-accent)]\"\n />\n </label>\n ) : null}\n <textarea\n value={message}\n onChange={(e) => setMessage(e.target.value)}\n rows={5}\n placeholder=\"How can we help?\"\n className=\"mt-4 w-full resize-y rounded-lg border border-[color:var(--line)] bg-[color:var(--panel)] px-3 py-2 text-sm text-[color:var(--foreground)] placeholder:text-[color:var(--muted)] focus:outline-none focus:ring-2 focus:ring-[color:var(--color-accent)]\"\n />\n {state === 'error' ? (\n <p className=\"mt-2 text-sm text-[color:var(--chrome-danger)]\">\n Sending failed — try again.\n </p>\n ) : null}\n <div className=\"mt-4 flex justify-end gap-2\">\n <button\n type=\"button\"\n onClick={close}\n className=\"rounded-full border border-[color:var(--line)] px-4 py-2 text-sm font-semibold text-[color:var(--foreground)] hover:bg-[color:var(--panel)]\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={submit}\n disabled={!message.trim() || state === 'sending'}\n className=\"rounded-full bg-[color:var(--color-accent-bg-safe,var(--color-accent))] px-4 py-2 text-sm font-semibold text-[#FFFFFF] transition hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {state === 'sending' ? 'Sending…' : 'Send request'}\n </button>\n </div>\n </>\n )}\n </div>\n </div>,\n document.body,\n )\n : null}\n </>\n )\n}\n\n// ---------------------------------------------------------------------------\n// SpecOverlayAction — Spencer + Ben only. A top-bar \"Spec\" trigger showing\n// the current page's spec compliance / visual-regression status, from the\n// Specs app's overlay API. Renders NOTHING when the viewer isn't allowed —\n// no icon, no badge, no console noise — so this is invisible to every other\n// user. All calls are plain cross-origin fetches with same-site cookies\n// (credentials: 'include'); this does NOT go through the chrome proxy\n// fetchJson, which is same-origin only.\n// ---------------------------------------------------------------------------\n\ntype SpecOverlayAccess = { allowed: boolean; email?: string }\n\ntype SpecOverlayStatus =\n | {\n matched: true\n spec_slug: string\n spec_title: string\n target_id: string\n label: string\n viewport: string\n /** null when there is no finished compare run yet — never coerce to 0. */\n mismatch_pct: number | null\n finished_at: string | null\n passed: boolean | null\n spec_url: string\n compare_url: string\n overlay_url: string\n live_selector?: string | null\n capture_url?: string\n theme?: 'light' | 'dark' | null\n live_source?: 'worker' | 'viewer' | null\n live_size?: { width: number; height: number } | null\n design_size?: { width: number; height: number } | null\n /** Ready-to-paste repair prompt for an AI agent (latest run). */\n prompt?: string | null\n }\n | { matched: false; search_url: string }\n\nconst SPEC_OVERLAY_ACCESS_CACHE_KEY = 'politogy_spec_overlay_access'\n\nfunction readSpecOverlayAccessCache(): SpecOverlayAccess | null {\n if (typeof window === 'undefined') return null\n try {\n const raw = window.sessionStorage.getItem(SPEC_OVERLAY_ACCESS_CACHE_KEY)\n if (!raw) return null\n const parsed = JSON.parse(raw)\n if (typeof parsed?.allowed === 'boolean') return parsed as SpecOverlayAccess\n } catch {\n /* ignore */\n }\n return null\n}\n\nfunction writeSpecOverlayAccessCache(access: SpecOverlayAccess): void {\n if (typeof window === 'undefined') return\n try {\n window.sessionStorage.setItem(SPEC_OVERLAY_ACCESS_CACHE_KEY, JSON.stringify(access))\n } catch {\n /* ignore */\n }\n}\n\n/**\n * Notifies subscribers whenever the URL changes via pushState, replaceState\n * or a back/forward navigation. Patches `history` exactly once per page\n * (module-level guard) no matter how many components subscribe.\n */\ntype LocationChangeListener = () => void\nconst locationChangeListeners = new Set<LocationChangeListener>()\nlet historyPatched = false\n\nfunction ensureHistoryPatched(): void {\n if (historyPatched || typeof window === 'undefined') return\n historyPatched = true\n const notify = () => locationChangeListeners.forEach((fn) => fn())\n const originalPushState = window.history.pushState.bind(window.history)\n const originalReplaceState = window.history.replaceState.bind(window.history)\n window.history.pushState = (...args: Parameters<History['pushState']>) => {\n originalPushState(...args)\n notify()\n }\n window.history.replaceState = (...args: Parameters<History['replaceState']>) => {\n originalReplaceState(...args)\n notify()\n }\n window.addEventListener('popstate', notify)\n}\n\nfunction useLocationHref(): string {\n const [href, setHref] = useState(() =>\n typeof window === 'undefined' ? '' : window.location.href,\n )\n useEffect(() => {\n ensureHistoryPatched()\n const onChange = () => setHref(window.location.href)\n locationChangeListeners.add(onChange)\n return () => {\n locationChangeListeners.delete(onChange)\n }\n }, [])\n return href\n}\n\nfunction specOverlayFetchJson(path: string): Promise<unknown> {\n // Bounded: this hits a cross-origin app (specs.politogyvrm.com) from every\n // page's top bar. An unbounded call here let a stuck access/status check\n // keep the page's network alive indefinitely — which blocks `networkidle`\n // and tripped visual-regression captures' own 45s navigation timeout on\n // the very pages this widget instruments (seen on a2p 2026-10-02).\n return fetch(`${SPECS_ORIGIN}${path}`, { credentials: 'include', signal: AbortSignal.timeout(10_000) }).then((res) => {\n if (!res.ok) throw new Error(`spec overlay ${path}: ${res.status}`)\n return res.json()\n })\n}\n\n/**\n * True when this page is being driven by an automated capture session\n * (Cloudflare Browser Rendering / CDP-controlled Chromium — the Specs\n * design-compare tool, among others) rather than a real Spencer/Ben\n * session. `navigator.webdriver` is the standard CDP automation flag.\n * SpecOverlayAction must never self-trigger a capture loop in this case:\n * doing so competed with the very capture session rendering the page for\n * network activity, keeping `networkidle` from ever being reached.\n */\nfunction isAutomatedCaptureSession(): boolean {\n return typeof navigator !== 'undefined' && navigator.webdriver === true\n}\n\nfunction currentChromeTheme(): 'light' | 'dark' {\n const root = document.documentElement\n if (root.classList.contains('dark') || root.getAttribute('data-theme') === 'dark') return 'dark'\n if (root.classList.contains('light') || root.getAttribute('data-theme') === 'light') return 'light'\n return 'light'\n}\n\n/** Marks the drawer portal so the page raster leaves it out. */\nconst SPEC_OVERLAY_ROOT_ATTR = 'data-spec-overlay-root'\n\n/**\n * The viewer's real view: rasterize THIS page in the browser (DOM → canvas,\n * no permission prompt) at viewport size, without the Spec drawer, and send it\n * to Specs as the LIVE side of a compare. Their org, data and theme are\n * exactly what is on screen, cropped to the content region. Nothing but the PNG\n * and page facts leaves the browser.\n */\nasync function captureMyView(\n status: Extract<SpecOverlayStatus, { matched: true }>,\n orgId: string | null | undefined,\n orgName: string | null | undefined,\n): Promise<void> {\n const { domToCanvas } = await import('modern-screenshot')\n const w = window.innerWidth\n const h = window.innerHeight\n const theme = currentChromeTheme()\n const bg = getComputedStyle(document.body).backgroundColor || (theme === 'dark' ? '#0b0b0c' : '#ffffff')\n const full = await domToCanvas(document.body, {\n width: w,\n height: h,\n scale: 1,\n backgroundColor: bg,\n // Cross-origin images that refuse CORS render blank instead of failing.\n fetch: { requestInit: { mode: 'cors', credentials: 'omit' }, placeholderImage: '' },\n // Drop the Spec drawer and everything fixed (sidebar, toasts, popovers):\n // the design is the page body only, so chrome would only add noise.\n filter: (node) =>\n !(node instanceof Element) ||\n (!node.hasAttribute(SPEC_OVERLAY_ROOT_ATTR) && getComputedStyle(node).position !== 'fixed'),\n style: { transform: `translate(${-window.scrollX}px, ${-window.scrollY}px)` },\n })\n\n // Score the content region only — the target's live_selector, else the\n // shell's content column (below the top bar and beta banner, right of the\n // sidebar) — so LIVE covers the same region as the design export.\n const el =\n (status.live_selector ? document.querySelector(status.live_selector) : null) ??\n document.querySelector('[data-shell-content]')\n let region = { x: 0, y: 0, width: w, height: h }\n if (el) {\n const r = el.getBoundingClientRect()\n const x = Math.max(0, Math.round(r.left))\n const y = Math.max(0, Math.round(r.top))\n region = { x, y, width: Math.min(w - x, Math.round(r.width)), height: Math.min(h - y, Math.round(r.height)) }\n }\n const out = document.createElement('canvas')\n out.width = region.width\n out.height = region.height\n const ctx = out.getContext('2d')\n if (!ctx) throw new Error('page raster failed')\n ctx.drawImage(full, region.x, region.y, region.width, region.height, 0, 0, region.width, region.height)\n const blob = await new Promise<Blob | null>((resolve) => out.toBlob(resolve, 'image/png'))\n if (!blob) throw new Error('page raster failed')\n const form = new FormData()\n form.append('image', blob, 'live.png')\n form.append(\n 'meta',\n JSON.stringify({ url: window.location.href, theme, org_id: orgId ?? null, org_name: orgName ?? null, crop: null }),\n )\n const res = await fetch(status.capture_url ?? `${SPECS_ORIGIN}/api/overlay/capture`, {\n method: 'POST',\n credentials: 'include',\n headers: { 'X-Spec-Capture': '1' },\n body: form,\n signal: AbortSignal.timeout(10_000),\n })\n if (!res.ok) throw new Error(`capture ${res.status}: ${(await res.text()).slice(0, 160)}`)\n}\n\n/** Spinner + LIVE/DIFF skeletons shown while the capture and compare run. */\nexport function SpecCaptureLoading() {\n return (\n <div data-spec-capture-loading=\"\" role=\"status\" aria-live=\"polite\" className=\"flex-1 overflow-hidden px-4 py-4\">\n <div className=\"mb-4 flex items-center gap-3 text-sm text-[color:var(--foreground)]\">\n <span\n aria-hidden=\"true\"\n className=\"inline-block h-5 w-5 animate-spin rounded-full border-2 border-[color:var(--line)] border-t-[color:var(--color-accent)] motion-reduce:animate-none\"\n />\n Capturing your view and comparing…\n </div>\n {['Live — your view', 'Diff'].map((label) => (\n <div key={label} className=\"mb-4\">\n <p className=\"mb-1 text-xs font-semibold uppercase tracking-wide text-[color:var(--muted)]\">{label}</p>\n <div aria-hidden=\"true\" className=\"h-40 w-full animate-pulse rounded border border-[color:var(--line)] bg-[color:var(--panel)] motion-reduce:animate-none\" />\n </div>\n ))}\n </div>\n )\n}\n\n/** Status URL for this page in the viewer's current theme. */\nfunction specOverlayStatusPath(): string {\n return `/api/overlay/status?url=${encodeURIComponent(window.location.href)}&theme=${currentChromeTheme()}`\n}\n\nexport function SpecOverlayAction({ orgId, orgName }: { orgId?: string | null; orgName?: string | null } = {}) {\n const [access, setAccess] = useState<SpecOverlayAccess | null>(() => readSpecOverlayAccessCache())\n const [status, setStatus] = useState<SpecOverlayStatus | null>(null)\n const [open, setOpen] = useState(false)\n const [capture, setCapture] = useState<{ state: 'idle' | 'busy' | 'error'; message?: string }>({ state: 'idle' })\n const [frameKey, setFrameKey] = useState(0)\n const [copied, setCopied] = useState<'idle' | 'copied' | 'failed'>('idle')\n const href = useLocationHref()\n const automated = isAutomatedCaptureSession()\n\n // Resolve access once per session (cached in sessionStorage).\n useEffect(() => {\n if (access || automated) return\n let cancelled = false\n specOverlayFetchJson('/api/overlay/access')\n .then((data) => {\n if (cancelled) return\n const next: SpecOverlayAccess =\n data && typeof (data as SpecOverlayAccess).allowed === 'boolean'\n ? (data as SpecOverlayAccess)\n : { allowed: false }\n setAccess(next)\n writeSpecOverlayAccessCache(next)\n })\n .catch(() => {\n if (cancelled) return\n const next: SpecOverlayAccess = { allowed: false }\n setAccess(next)\n writeSpecOverlayAccessCache(next)\n })\n return () => {\n cancelled = true\n }\n }, [access])\n\n // Fetch status for the current page, debounced 300ms, on every route\n // change and org change. Only once access is known to be allowed.\n useEffect(() => {\n if (automated || !access?.allowed || typeof window === 'undefined') return\n const timer = window.setTimeout(() => {\n specOverlayFetchJson(specOverlayStatusPath())\n .then((data) => setStatus(data as SpecOverlayStatus))\n .catch(() => setStatus(null))\n }, 300)\n return () => window.clearTimeout(timer)\n }, [access?.allowed, href, orgId])\n\n // Opening the drawer captures the viewer's real view automatically — no\n // click, no prompt. The raster runs while the drawer is open; the drawer is\n // filtered out of the frame. One capture per open.\n const captureRun = useRef(0)\n // Live-read access inside the retry loop below: access can be revoked\n // mid-poll (session expiry, org switch), and the loop must stop hitting\n // /api/overlay/status the moment that happens rather than riding out its\n // full 45 × 3s budget regardless.\n const accessRef = useRef(access)\n accessRef.current = access\n const runCapture = async (s: Extract<SpecOverlayStatus, { matched: true }>) => {\n const run = ++captureRun.current\n const before = s.live_source === 'viewer' ? s.finished_at : null\n setCapture({ state: 'busy' })\n try {\n // Let the drawer paint first so the page is idle while we raster.\n await new Promise((r) => setTimeout(r, 150))\n await captureMyView(s, orgId, orgName)\n for (let i = 0; i < 45; i++) {\n await new Promise((r) => setTimeout(r, 3000))\n if (run !== captureRun.current) return\n // Access lost mid-poll: stop, but never leave the spinner up forever.\n if (!accessRef.current?.allowed) {\n setCapture({ state: 'idle' })\n return\n }\n const next = (await specOverlayFetchJson(specOverlayStatusPath()).catch(() => null)) as SpecOverlayStatus | null\n if (next && next.matched && next.live_source === 'viewer' && next.finished_at !== before) {\n setStatus(next)\n setFrameKey((k) => k + 1)\n setCapture({ state: 'idle' })\n return\n }\n }\n setCapture({ state: 'error', message: 'Compare did not finish in 2 min.' })\n } catch (e) {\n if (run === captureRun.current) setCapture({ state: 'error', message: e instanceof Error ? e.message : String(e) })\n }\n }\n useEffect(() => {\n if (automated || !open || !status || !status.matched) return\n void runCapture(status)\n return () => {\n captureRun.current++\n }\n // Only re-run on open / page change, not on every status refresh.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open, status && status.matched ? status.target_id : null])\n\n\n if (automated || !access?.allowed) return null\n\n const hasScore = status && status.matched && typeof status.mismatch_pct === 'number'\n const badgeLabel =\n hasScore ? `${Math.round((status as Extract<SpecOverlayStatus, { matched: true }>).mismatch_pct as number)}%` : status ? '—' : undefined\n const badgeTone: 'default' | 'warning' | 'danger' =\n hasScore ? (status && status.matched && status.passed ? 'default' : 'danger') : 'default'\n\n return (\n <>\n <button\n type=\"button\"\n aria-label=\"Spec\"\n aria-expanded={open}\n className={topBarIconButtonClass(badgeTone)}\n onClick={() => setOpen(true)}\n >\n <LayoutGlyph size={TOPBAR_GLYPH_SIZE} className=\"text-current\" />\n {badgeLabel ? (\n <span\n className={[\n 'absolute -top-1 -right-1 flex h-4 min-w-4 items-center justify-center rounded-full px-1 text-[10px] font-normal leading-none text-[#FFFFFF]',\n hasScore\n ? status && status.matched && status.passed\n ? 'bg-[color:var(--chrome-success,#2f855a)]'\n : 'bg-[color:var(--chrome-danger)]'\n : 'bg-[color:var(--muted)]',\n ].join(' ')}\n >\n {badgeLabel}\n </span>\n ) : null}\n {!open ? (\n <TopBarTooltip\n title=\"Spec\"\n description=\"Spec design + visual regression for this page.\"\n />\n ) : null}\n </button>\n {open && typeof document !== 'undefined'\n ? createPortal(\n <div\n className=\"fixed inset-0 z-50 flex justify-end bg-black/40\"\n {...{ [SPEC_OVERLAY_ROOT_ATTR]: '' }}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Spec overlay\"\n onMouseDown={(e) => {\n if (e.target === e.currentTarget) setOpen(false)\n }}\n onKeyDown={(e) => {\n if (e.key === 'Escape') setOpen(false)\n }}\n >\n <div className=\"flex h-full w-full max-w-[480px] flex-col border-l border-[color:var(--line)] bg-[color:var(--panel-elevated)] shadow-[var(--shadow-soft)]\">\n <div className=\"flex items-center justify-between gap-2 border-b border-[color:var(--line)] px-4 py-3\">\n <h2 className=\"truncate text-sm font-bold tracking-[-0.01em] text-[color:var(--foreground)]\">\n Spec{status && status.matched ? `: ${status.spec_title}` : ''}\n </h2>\n <button\n type=\"button\"\n aria-label=\"Close\"\n onClick={() => setOpen(false)}\n className=\"rounded-full p-1 text-[color:var(--muted)] hover:bg-[color:var(--panel)] hover:text-[color:var(--foreground)]\"\n >\n <CloseGlyph size={16} />\n </button>\n </div>\n {status && status.matched ? (\n <>\n <div className=\"flex items-center gap-3 border-b border-[color:var(--line)] px-4 py-2 text-xs font-semibold\">\n <a\n href={status.spec_url}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"text-[color:var(--color-accent-fg,var(--color-accent))] hover:underline\"\n >\n Open spec ↗\n </a>\n <a\n href={status.compare_url}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"text-[color:var(--color-accent-fg,var(--color-accent))] hover:underline\"\n >\n Compare tab ↗\n </a>\n <button\n type=\"button\"\n disabled={capture.state === 'busy'}\n onClick={() => void runCapture(status)}\n className=\"ml-auto rounded-md border border-[color:var(--line)] px-2 py-1 text-[color:var(--foreground)] hover:bg-[color:var(--panel)] disabled:opacity-60\"\n title=\"Your view is captured when the drawer opens. Recapture after changing the page.\"\n >\n {capture.state === 'busy' ? 'Capturing…' : 'Recapture'}\n </button>\n <button\n type=\"button\"\n data-spec-copy-prompt=\"\"\n disabled={capture.state === 'busy' || !status.prompt}\n onClick={() => {\n const text = status.prompt\n if (!text) return\n // The prompt is already in hand, so the write stays inside the click gesture.\n navigator.clipboard\n .writeText(text)\n .then(() => setCopied('copied'))\n .catch(() => setCopied('failed'))\n .finally(() => window.setTimeout(() => setCopied('idle'), 2000))\n }}\n className=\"rounded-md border border-[color:var(--line)] px-2 py-1 text-[color:var(--foreground)] hover:bg-[color:var(--panel)] disabled:opacity-60\"\n title=\"Copy a repair prompt for an AI agent: spec, score, image links, top mismatched regions and instructions.\"\n >\n {copied === 'copied' ? 'Copied ✓' : copied === 'failed' ? 'Copy failed' : 'Copy prompt'}\n </button>\n </div>\n {status.live_size && status.design_size && capture.state !== 'busy' ? (\n <p\n data-spec-sizes=\"\"\n className={[\n 'border-b border-[color:var(--line)] px-4 py-1.5 text-xs',\n status.live_size.width === status.design_size.width &&\n status.live_size.height === status.design_size.height\n ? 'text-[color:var(--muted)]'\n : 'font-semibold text-[color:var(--chrome-danger)]',\n ].join(' ')}\n >\n Live {status.live_size.width}×{status.live_size.height} · Design {status.design_size.width}×\n {status.design_size.height}\n {status.live_size.width === status.design_size.width &&\n status.live_size.height === status.design_size.height\n ? ' · sizes match'\n : ' · SIZE MISMATCH'}\n </p>\n ) : null}\n {capture.state === 'error' ? (\n <p className=\"border-b border-[color:var(--line)] px-4 py-2 text-xs text-[color:var(--chrome-danger)]\">\n {capture.message}\n </p>\n ) : null}\n {capture.state === 'busy' ? (\n <SpecCaptureLoading />\n ) : (\n <iframe\n key={frameKey}\n src={status.overlay_url}\n title=\"Spec overlay\"\n className=\"h-full w-full flex-1 border-0\"\n />\n )}\n </>\n ) : status && !status.matched ? (\n <div className=\"p-4 text-sm text-[color:var(--muted)]\">\n <p>No compare target covers this page.</p>\n <a\n href={status.search_url}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"mt-2 inline-block font-semibold text-[color:var(--color-accent-fg,var(--color-accent))] hover:underline\"\n >\n Search specs ↗\n </a>\n </div>\n ) : (\n <div className=\"p-4\">\n <ValueSkeleton className=\"h-4 w-full\" />\n </div>\n )}\n </div>\n </div>,\n document.body,\n )\n : null}\n </>\n )\n}\n\nfunction CloseGlyph({ size = 16, className }: { size?: number; className?: string }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className} aria-hidden>\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n )\n}\n\n// ---------------------------------------------------------------------------\n// NavDisplayAction — the Menu / Tabs / Both navigation-display switcher.\n// Controlled: the app owns persistence (localStorage/profile) and layout\n// consequences (sub-menu visibility, tab strip visibility).\n// ---------------------------------------------------------------------------\n\nexport type NavDisplayMode = 'menu' | 'tabs' | 'both'\n\nexport const NAV_DISPLAY_OPTIONS: { value: NavDisplayMode; label: string }[] = [\n { value: 'menu', label: 'Sub Menu' },\n { value: 'tabs', label: 'Tabs Only' },\n { value: 'both', label: 'Both' },\n]\n\nexport function NavDisplayAction({\n value,\n onChange,\n}: {\n value: NavDisplayMode\n onChange: (next: NavDisplayMode) => void\n}) {\n return (\n <TopBarPopover\n label=\"Navigation Display\"\n description=\"Show navigation as a sub-menu, tabs, or both.\"\n fallbackIcon={LayoutGlyph}\n panelClassName=\"w-44\"\n >\n <div className=\"py-1\" role=\"radiogroup\" aria-label=\"Navigation display\">\n {NAV_DISPLAY_OPTIONS.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={value === opt.value}\n onClick={() => onChange(opt.value)}\n className={[\n 'flex w-full items-center justify-between px-4 py-2 text-left text-sm font-medium',\n value === opt.value\n ? 'text-[color:var(--color-accent-fg,var(--color-accent))]'\n : 'text-[color:var(--foreground)] hover:bg-[color:var(--panel)]',\n ].join(' ')}\n >\n {opt.label}\n {value === opt.value ? <span aria-hidden>✓</span> : null}\n </button>\n ))}\n </div>\n </TopBarPopover>\n )\n}\n\n// ---------------------------------------------------------------------------\n// useThemePreference — the cross-app theme state machine (Task: theme derived\n// from the Auth system, live across tabs and apps).\n//\n// boot : cookie → localStorage → \"system\" (the pre-paint script already\n// painted this), then ONCE per session reconcile against the\n// profile value from `GET me` (authoritative) when a fetcher is\n// available.\n// change : apply + localStorage + cross-subdomain cookie + best-effort\n// `PATCH me/preferences { themePreference }`.\n// sync : same-app tabs via the `storage` event; other-app tabs re-read the\n// shared cookie on focus/visibility; `system` follows live OS\n// changes via matchMedia.\n// ---------------------------------------------------------------------------\n\nexport function useThemePreference(): {\n value: ThemePreference\n setValue: (next: ThemePreference) => void\n} {\n const ctx = useContext(NavChromeContext)\n const fetchJson = ctx?.fetchJson ?? null\n const [value, setValueState] = useState<ThemePreference>('system')\n const reconciled = useRef(false)\n\n // Boot: cookie → localStorage → system.\n useEffect(() => {\n const cookie = readThemeCookie()\n let ls: string | null = null\n try {\n ls = localStorage.getItem(THEME_STORAGE_KEY)\n } catch {\n /* unavailable */\n }\n const pref = cookie ?? (isThemePreference(ls) ? ls : null) ?? 'system'\n setValueState(pref)\n applyThemePreference(pref)\n }, [])\n\n // Once per session: converge on the profile's saved choice (authoritative),\n // reusing the provider's single `me` fetch.\n const meCtx = useContext(NavChromeContext)\n useEffect(() => {\n if (reconciled.current) return\n // A choice made where no chrome-API session exists (Politogy ID's login\n // screen) is still only in the cookie. Push it UP rather than pulling the\n // stale profile value DOWN — otherwise the user's fresh pick is silently\n // reverted on the next app they open (HITL 2026-07-23: \"I set System and it\n // keeps switching back to Light\").\n const pending = readPendingThemeChoice()\n if (pending) {\n // Only latch once the profile write has actually been attempted, so a\n // later `me` arrival still gets a chance to persist it.\n if (meCtx?.me) reconciled.current = true\n setValueState(pending)\n applyThemePreference(pending)\n writeThemeCookie(pending)\n try {\n localStorage.setItem(THEME_STORAGE_KEY, pending)\n } catch {\n /* unavailable */\n }\n if (!meCtx?.me) return\n fetchJson?.('me/preferences', {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ themePreference: pending }),\n })\n .then(() => clearPendingThemeChoice())\n .catch(() => {})\n return\n }\n const pref = meCtx?.me?.themePreference\n if (isThemePreference(pref)) {\n reconciled.current = true\n setValueState(pref)\n applyThemePreference(pref)\n writeThemeCookie(pref)\n try {\n localStorage.setItem(THEME_STORAGE_KEY, pref)\n } catch {\n /* unavailable */\n }\n }\n }, [meCtx?.me])\n\n // Live sync: storage events (same-app tabs), focus/visibility cookie\n // re-reads (other-app tabs), and OS changes while on \"system\".\n useEffect(() => {\n const onStorage = (e: StorageEvent) => {\n if (e.key === THEME_STORAGE_KEY && isThemePreference(e.newValue)) {\n setValueState(e.newValue)\n applyThemePreference(e.newValue)\n }\n }\n const onWake = () => {\n const cookie = readThemeCookie()\n if (cookie) {\n setValueState((prev) => {\n if (cookie !== prev) applyThemePreference(cookie)\n return cookie\n })\n }\n }\n window.addEventListener('storage', onStorage)\n window.addEventListener('focus', onWake)\n document.addEventListener('visibilitychange', onWake)\n return () => {\n window.removeEventListener('storage', onStorage)\n window.removeEventListener('focus', onWake)\n document.removeEventListener('visibilitychange', onWake)\n }\n }, [])\n\n\n const setValue = useCallback(\n (next: ThemePreference) => {\n setValueState(next)\n applyThemePreference(next)\n writeThemeCookie(next)\n try {\n localStorage.setItem(THEME_STORAGE_KEY, next)\n } catch {\n /* unavailable */\n }\n // Best-effort profile persistence — a theme toggle never errors. Until it\n // lands, the choice stays marked pending so the next app pushes it up\n // instead of reconciling the stale profile value back down.\n markThemeChoicePending(next)\n fetchJson?.('me/preferences', {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ themePreference: next }),\n })\n .then(() => clearPendingThemeChoice())\n .catch(() => {})\n },\n [fetchJson],\n )\n\n return { value, setValue }\n}\n","import type { AppRegistryEntry } from '../types'\nimport type { NavItem } from '../native/index'\n\n/**\n * Build a Speculation Rules JSON payload that prerenders other apps in the\n * registry on moderate eagerness. Returns null when there are no eligible\n * other apps to prerender (e.g., this is the only app in the registry).\n *\n * @deprecated Legacy `AppRegistryEntry[]`-based registry is unused by any\n * current consumer. Cross-app sidebar nav now ships real `NavItem[]` trees\n * (`standardPolitogyNav`) — use `buildNavSpeculationRules` instead, which this\n * now delegates to.\n *\n * The host app is expected to render this as\n * `<script type=\"speculationrules\">{json}</script>` in <head> at runtime.\n */\nexport function buildSpeculationRules(\n currentApp: string,\n registry: AppRegistryEntry[],\n): string | null {\n const others = registry.filter(\n (entry) => entry.id !== currentApp && entry.visible !== false,\n )\n if (others.length === 0) return null\n const payload = {\n prerender: [\n {\n urls: others.map((entry) => entry.path),\n eagerness: 'moderate' as const,\n },\n ],\n }\n return JSON.stringify(payload)\n}\n\n/**\n * Labels the shell will never prerender or prefetch, even if a consumer's nav\n * tree somehow carries an `href` for them (sign-out is normally a footer\n * `onClick`, never a `NavItem.href` — this is a second guard, not the primary\n * one). Case-insensitive substring match against the row's label.\n */\nconst DESTRUCTIVE_LABEL_PATTERNS = ['sign out', 'signout', 'log out', 'logout', 'delete']\n\n/** URL substrings that mark a link as destructive/non-idempotent regardless of label. */\nconst DESTRUCTIVE_PATH_PATTERNS = ['/signout', '/sign-out', '/logout', '/log-out']\n\nfunction isDestructive(item: { label: string; href?: string }): boolean {\n const label = item.label.toLowerCase()\n if (DESTRUCTIVE_LABEL_PATTERNS.some((p) => label.includes(p))) return true\n const href = (item.href ?? '').toLowerCase()\n return DESTRUCTIVE_PATH_PATTERNS.some((p) => href.includes(p))\n}\n\n/**\n * Walk a `NavItem[]` tree (as produced by `standardPolitogyNav`) and collect\n * every absolute, cross-origin, non-destructive, GET-safe link — the\n * candidate set for prerender/prefetch. Sections and action rows (`onClick`,\n * no `href`) are skipped; children are walked too (sub-menu rows like\n * \"Command Center\" / \"New Poll\" are real cross-app destinations).\n */\nexport function collectSiblingAppUrls(items: NavItem[], currentOrigin: string): string[] {\n const urls = new Set<string>()\n const walk = (list: NavItem[]) => {\n for (const item of list) {\n if (item.kind === 'section') continue\n if (item.href && !isDestructive(item)) {\n try {\n const url = new URL(item.href, currentOrigin)\n if (url.origin !== currentOrigin && /^https?:$/.test(url.protocol)) {\n urls.add(url.href)\n }\n } catch {\n // Malformed href — skip rather than throw during nav render.\n }\n }\n if (item.children?.length) walk(item.children)\n }\n }\n walk(items)\n return Array.from(urls)\n}\n\nexport interface NavSpeculationRules {\n prerender: [{ source: 'list'; urls: string[]; eagerness: 'moderate' }]\n}\n\n/**\n * Build the Speculation Rules payload for a consumer's real sidebar nav tree:\n * every sibling `*.politogyvrm.com` app link, `eagerness: \"moderate\"` (the\n * browser's own heuristic — prerender starts on hover/pointerdown of a\n * matching `<a>`, not on page load). Sign-out and other destructive rows are\n * excluded by `collectSiblingAppUrls`. Returns `null` when there is nothing\n * to speculate on (e.g., an empty or single-app tree).\n *\n * Each target origin must opt in by sending\n * `Supports-Loading-Mode: credentialed-prerender` on its responses, per the\n * Speculation Rules cross-origin prerender contract — without it the browser\n * silently falls back to a normal navigation. (Other apps are adding this\n * header separately.)\n */\nexport function buildNavSpeculationRules(\n items: NavItem[],\n currentOrigin: string = typeof window !== 'undefined' ? window.location.origin : '',\n): NavSpeculationRules | null {\n const urls = collectSiblingAppUrls(items, currentOrigin)\n if (urls.length === 0) return null\n return {\n prerender: [{ source: 'list', urls, eagerness: 'moderate' }],\n }\n}\n","import { useEffect, useMemo } from 'react'\nimport type { NavItem } from '../native/index'\nimport { buildNavSpeculationRules, collectSiblingAppUrls } from './emitRules'\n\nconst SCRIPT_ID = 'politogy-speculation-rules'\nconst PREFETCH_ATTR = 'data-politogy-speculation-prefetch'\n\n/**\n * Renders the cross-app Speculation Rules `<script>` for the current\n * consumer's sidebar nav tree, and mounts in every `NavAppShell` — so it is\n * never an opt-in an app has to remember. Browsers that support Speculation\n * Rules prerender a sibling `*.politogyvrm.com` app the moment the user\n * hovers or pointers-down on its sidebar link (`eagerness: \"moderate\"`);\n * browsers that don't fall back, after the page goes idle, to plain\n * `<link rel=\"prefetch\">` tags for the same URLs, so the next click is still\n * warmed by a DNS/TLS/HTML fetch even without a prerendered document.\n *\n * Each sibling origin must send `Supports-Loading-Mode:\n * credentialed-prerender` on its responses for the prerender to actually\n * happen while the user is authenticated (cross-origin prerender is opt-in\n * on the destination). Without it, browsers degrade this to a normal\n * navigation — the hover/click still works, it's just not pre-warmed.\n *\n * Renders nothing visible; this is a side-effecting `<script>` injector.\n */\nexport function SpeculationRulesScript({ items }: { items: NavItem[] }) {\n const origin = typeof window !== 'undefined' ? window.location.origin : ''\n const rules = useMemo(() => buildNavSpeculationRules(items, origin), [items, origin])\n const json = rules ? JSON.stringify(rules) : null\n\n // Native Speculation Rules — covers the hover/pointerdown prerender case in\n // supporting browsers (Chromium). Declarative: no listeners needed, the\n // browser applies its own \"moderate\" heuristic to matching <a> elements.\n useEffect(() => {\n if (!json || typeof document === 'undefined') return\n let el = document.getElementById(SCRIPT_ID) as HTMLScriptElement | null\n if (!el) {\n el = document.createElement('script')\n el.id = SCRIPT_ID\n el.type = 'speculationrules'\n document.head.appendChild(el)\n }\n el.textContent = json\n return () => {\n // Leave the tag in place across route changes within the same app —\n // only strip it if this effect instance's app unmounts entirely with no\n // sibling to replace it.\n }\n }, [json])\n\n // Idle-prefetch fallback for browsers without Speculation Rules support\n // (or where the destination hasn't sent the opt-in header): warm the\n // connection/document via <link rel=\"prefetch\"> once the main thread is\n // idle, so it never competes with first-paint work.\n useEffect(() => {\n if (typeof document === 'undefined' || typeof window === 'undefined') return\n const supportsSpecRules =\n typeof HTMLScriptElement !== 'undefined' &&\n typeof (HTMLScriptElement as unknown as { supports?: (t: string) => boolean }).supports ===\n 'function' &&\n (HTMLScriptElement as unknown as { supports: (t: string) => boolean }).supports(\n 'speculationrules',\n )\n if (supportsSpecRules) return\n const urls = collectSiblingAppUrls(items, origin)\n if (urls.length === 0) return\n\n const schedule: (cb: () => void) => void =\n typeof (window as unknown as { requestIdleCallback?: (cb: () => void) => void })\n .requestIdleCallback === 'function'\n ? (window as unknown as { requestIdleCallback: (cb: () => void) => void })\n .requestIdleCallback\n : (cb: () => void) => setTimeout(cb, 2000)\n\n const added: HTMLLinkElement[] = []\n schedule(() => {\n for (const url of urls) {\n if (document.querySelector(`link[${PREFETCH_ATTR}][href=\"${url}\"]`)) continue\n const link = document.createElement('link')\n link.rel = 'prefetch'\n link.href = url\n link.setAttribute(PREFETCH_ATTR, '')\n document.head.appendChild(link)\n added.push(link)\n }\n })\n return () => {\n added.forEach((l) => l.remove())\n }\n }, [items, origin])\n\n return null\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { resolveOrgLogoUrl, topBarIconButtonClass, TopBarTooltip, TopBarPanelArrow, NavThemeControl, NAV_DISPLAY_OPTIONS, useTopBarIconSlotGlyph, resolveBrandGlyph, TOPBAR_GLYPH_SIZE, warnDeprecated, SpeculationRulesScript } from './chunk-
|
|
1
|
+
import { resolveOrgLogoUrl, topBarIconButtonClass, TopBarTooltip, TopBarPanelArrow, NavThemeControl, NAV_DISPLAY_OPTIONS, useTopBarIconSlotGlyph, resolveBrandGlyph, TOPBAR_GLYPH_SIZE, warnDeprecated, SpeculationRulesScript } from './chunk-PRZP2SB6.js';
|
|
2
2
|
import { readRailPreference, writeRailPreference } from './chunk-7YVJ7HQG.js';
|
|
3
3
|
import { orgIdTail, authBaseUrl } from './chunk-5LO5W7W5.js';
|
|
4
4
|
import { createContext, useRef, useEffect, useMemo, useState, Fragment as Fragment$1, useContext } from 'react';
|
|
@@ -1957,5 +1957,5 @@ function NavAppShell({
|
|
|
1957
1957
|
}
|
|
1958
1958
|
|
|
1959
1959
|
export { BETA_BANNER_DISMISS_KEY, CAMPAIGN_FEATURE_AVAILABILITY, NavAppShell, NavBetaBanner, NavSidebar, NavTabStrip, NavTopBar, clearBetaBannerDismissal, envChipClasses, isNavItemActive, modeIdFromLabel, shortEnvLabel, shortUserName, standardNavIcons, standardPolitogyNav };
|
|
1960
|
-
//# sourceMappingURL=chunk-
|
|
1961
|
-
//# sourceMappingURL=chunk-
|
|
1960
|
+
//# sourceMappingURL=chunk-QS3Z4N73.js.map
|
|
1961
|
+
//# sourceMappingURL=chunk-QS3Z4N73.js.map
|