@the-portland-company/shell 0.35.2 → 0.35.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/topbarIconSlot.ts","../src/lib/brandGlyphs.tsx","../src/native/chromeActions.tsx","../src/native/standardNav.ts","../src/native/index.tsx"],"names":["useState","useEffect","base","jsx","jsxs","Fragment"],"mappings":"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","file":"chunk-HZXYGEEA.js","sourcesContent":["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","// ---------------------------------------------------------------------------\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 useRef,\n useState,\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 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// Core-app deep links. The billing surface lives on the VRM-core app; we would\n// derive its origin from POLITOGY_APPS.vrm, 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// `vrm` origin).\n// ---------------------------------------------------------------------------\n\nexport const CORE_APP_ORIGIN = 'https://app.politogyvrm.com'\n/** Text/Email fuel top-up page (SMS Signal + Email Broadcast). */\nexport const CORE_BILLING_PATH = '/organization-settings/subscription-billing/text-email'\nconst CORE_BILLING_URL = `${CORE_APP_ORIGIN}${CORE_BILLING_PATH}`\nconst QUARANTINED_CONTACTS_URL = `${CORE_APP_ORIGIN}/relationship/contacts/quarantined`\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\nexport function topBarIconButtonClass(tone: 'default' | 'warning' | 'danger' = 'default'): string {\n const toneClass =\n tone === 'danger' || tone === 'warning'\n ? 'text-[color:var(--color-race-red)] hover:text-[color:var(--color-race-red)]'\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-full border border-[color:var(--line)] transition',\n 'h-[var(--topbar-icon-button-size,32px)] w-[var(--topbar-icon-button-size,32px)]',\n toneClass,\n ].join(' ')\n}\n\n/** The shared count badge — one definition, used by every slot. */\nexport function TopBarCountBadge({ count }: { count: number }) {\n if (!(count > 0)) return null\n return (\n <span className=\"absolute -top-1 -right-1 flex h-4 min-w-4 items-center justify-center rounded-full bg-[color:var(--color-race-red)] px-1 text-[10px] text-white\">\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 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(--line)] bg-[color:var(--panel-elevated)] px-3 py-2 text-left shadow-[var(--shadow-soft)] group-hover/tbtip:flex\"\n >\n {/* Arrow pointing up at the icon */}\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(--line)] bg-[color:var(--panel-elevated)]\"\n />\n <span className=\"text-xs font-semibold text-[color:var(--foreground)]\">{title}</span>\n {description ? (\n <span className=\"mt-0.5 text-[11px] leading-snug text-[color:var(--muted)]\">\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 { value: 'system', label: 'System' },\n { value: 'dark', label: 'Dark' },\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-race-red)] text-white'\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 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\ntype NavChromeContextValue = {\n fetchJson: NavChromeFetcher\n me: ChromeMe | null\n meLoaded: boolean\n}\n\nconst NavChromeContext = createContext<NavChromeContextValue | null>(null)\n\nexport function NavChromeProvider({\n fetchJson,\n children,\n}: {\n fetchJson: NavChromeFetcher\n children: ReactNode\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 fetchJson('me')\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 }, [fetchJson])\n\n return (\n <NavChromeContext.Provider value={{ fetchJson, me, meLoaded }}>\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 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 lowFuel: boolean\n lowFuelThreshold: number\n}\n\nexport type CommunicationsFuelStatus = {\n organizationId: string\n signal: FuelChannelStatus\n broadcast: 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}\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 latestAt: string\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}\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(): {\n orgs: ChromeOrgSummary[] | null\n loading: boolean\n error: boolean\n} {\n const { fetchJson } = useNavChrome('useChromeOrgs')\n const [orgs, setOrgs] = useState<ChromeOrgSummary[] | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState(false)\n\n useEffect(() => {\n let cancelled = false\n setLoading(true)\n setError(false)\n fetchJson('orgs')\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 }, [fetchJson])\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/** Slot-driven glyph: Brand-token name when resolvable, fallback otherwise. */\nfunction SlotGlyph({\n slot,\n fallback: Fallback,\n size = 20,\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 description,\n slot,\n fallbackIcon,\n badge,\n tone,\n onOpen,\n openToken,\n children,\n panelClassName,\n}: {\n label: string\n description?: string\n slot?: TopBarIconSlot\n fallbackIcon: NavIconLike\n badge?: number\n tone?: 'default' | 'warning' | 'danger'\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 children: ReactNode\n panelClassName?: string\n}) {\n const [open, setOpen] = useState(false)\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={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 <SlotGlyph slot={slot} fallback={fallbackIcon} />\n {typeof badge === 'number' ? <TopBarCountBadge count={badge} /> : null}\n {!open ? <TopBarTooltip title={label} description={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 = 20, 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 = 20, 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 LifeBuoyGlyph({ size = 20, 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 = 20, 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 — Communications Fuel balance (battery glyph + popover meters).\n// ---------------------------------------------------------------------------\n\nconst LOW_FUEL_HINT_DISMISSED_KEY = 'politogy_low_fuel_hint_dismissed'\n\nfunction FuelRow({\n label,\n channel,\n loading,\n addHref,\n addLabel,\n}: {\n label: string\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 addLabel?: string\n}) {\n const remaining = channel?.remainingUnits ?? 0\n const total = channel ? Math.max(channel.rawBalanceUnits, channel.remainingUnits) : 0\n const ratio = total > 0 ? Math.min(100, Math.max(0, (remaining / total) * 100)) : 0\n const low = channel?.lowFuel ?? false\n\n return (\n <div className=\"w-full\">\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 ) : (\n <span\n className={[\n 'text-xs font-semibold tabular-nums',\n low ? 'text-[color:var(--color-race-red)]' : 'text-[color:var(--muted)]',\n ].join(' ')}\n >\n {remaining.toLocaleString()} left\n </span>\n )}\n {addHref ? (\n <a\n href={addHref}\n aria-label={addLabel}\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 <div className=\"h-1.5 w-full overflow-hidden rounded-full bg-[color:var(--panel)]\">\n {loading ? (\n <div className=\"h-full w-full animate-pulse bg-[color:var(--line)]\" />\n ) : (\n <div\n className={[\n 'h-full rounded-full transition-[width]',\n low ? 'bg-[color:var(--color-race-red)]' : 'bg-[color:var(--color-ok,#00A651)]',\n ].join(' ')}\n style={{ width: `${ratio}%` }}\n />\n )}\n </div>\n </div>\n )\n}\n\n/**\n * The low-fuel nudge: a small bubble anchored below the fuel trigger (arrow up)\n * with a \"Buy More Fuel\" deep-link. Dismissible; the dismissal persists for the\n * session (sessionStorage) so it never re-appears until a fresh session — and\n * the flag clears once fuel is no longer low, so a later drain can nudge again.\n */\nfunction LowFuelHint({ lowFuel }: { lowFuel: boolean }) {\n const [dismissed, setDismissed] = useState<boolean>(() => {\n if (typeof window === 'undefined') return false\n try {\n return window.sessionStorage.getItem(LOW_FUEL_HINT_DISMISSED_KEY) === '1'\n } catch {\n return false\n }\n })\n\n useEffect(() => {\n if (lowFuel) return\n try {\n window.sessionStorage.removeItem(LOW_FUEL_HINT_DISMISSED_KEY)\n } catch {\n /* unavailable */\n }\n }, [lowFuel])\n\n if (!lowFuel || dismissed) return null\n\n const dismiss = () => {\n try {\n window.sessionStorage.setItem(LOW_FUEL_HINT_DISMISSED_KEY, '1')\n } catch {\n /* unavailable */\n }\n setDismissed(true)\n }\n\n return (\n <div\n role=\"status\"\n className=\"absolute right-0 top-[calc(100%+10px)] z-50 w-60 rounded-lg border border-[color:var(--color-race-red)] bg-[color:var(--color-race-red)] px-3 py-2 text-white shadow-[var(--shadow-soft)]\"\n onClick={(e) => e.stopPropagation()}\n >\n {/* Arrow pointing up at the fuel button (mirrors TopBarPanelArrow's offset). */}\n <span\n aria-hidden\n className=\"absolute -top-[5px] right-[11px] h-2.5 w-2.5 rotate-45 bg-[color:var(--color-race-red)]\"\n />\n <div className=\"flex items-start gap-2\">\n <div className=\"flex-1\">\n <p className=\"text-sm font-semibold\">You&rsquo;re low on fuel</p>\n <a\n href={CORE_BILLING_URL}\n className=\"mt-1 inline-block text-sm font-bold underline hover:opacity-90\"\n >\n Buy More Fuel\n </a>\n </div>\n <button\n type=\"button\"\n aria-label=\"Dismiss low fuel notice\"\n onClick={dismiss}\n className=\"flex h-5 w-5 shrink-0 items-center justify-center rounded-full text-white/90 transition hover:bg-white/20\"\n >\n <XGlyph />\n </button>\n </div>\n </div>\n )\n}\n\nexport function FuelAction({ orgId }: { orgId: string | null }) {\n const { fetchJson } = 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 setLoading(true)\n setError(false)\n setFuel(null)\n fetchJson('communications/fuel-status', {\n headers: orgId ? { 'x-contacts-org': orgId } : undefined,\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 }, [fetchJson, orgId])\n\n const low = !!fuel && (fuel.signal.lowFuel || fuel.broadcast.lowFuel)\n\n return (\n // The nudge anchors to the trigger, so it sits OUTSIDE the popover panel in\n // its own relative wrapper (same shape the VRM widget used).\n <div className=\"relative inline-flex\">\n <TopBarPopover\n label=\"Communications Fuel\"\n description=\"Remaining SMS and email sending balance for the active organization.\"\n slot=\"comms-fuel\"\n fallbackIcon={BatteryGlyph}\n tone={low ? 'warning' : 'default'}\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 Communications Fuel\n </p>\n {error || (!loading && !fuel) ? (\n <p className=\"text-sm text-[color:var(--muted)]\">\n Fuel balance is unavailable right now.\n </p>\n ) : (\n <div className=\"flex flex-col gap-3\">\n <FuelRow\n label=\"SMS Signal\"\n channel={fuel?.signal ?? null}\n loading={loading}\n addHref={CORE_BILLING_URL}\n addLabel=\"Add SMS Signal fuel\"\n />\n <FuelRow\n label=\"Email Broadcast\"\n channel={fuel?.broadcast ?? null}\n loading={loading}\n addHref={CORE_BILLING_URL}\n addLabel=\"Add Email Broadcast fuel\"\n />\n </div>\n )}\n </div>\n </TopBarPopover>\n <LowFuelHint lowFuel={low} />\n </div>\n )\n}\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\nconst TEN_DLC_REDIRECTED_KEY = 'politogy_10dlc_redirected'\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-race-red)] 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 ttlMs = 12000,\n}: {\n reply: ChromeNotificationReply\n onActivate: () => void\n onClose: () => 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-white 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 <p className=\"truncate text-sm font-semibold\">{reply.name}</p>\n <p className=\"mt-1 truncate text-xs opacity-85\">{reply.preview}</p>\n </div>\n )\n}\n\nexport function NotificationsAction({ orgId }: { orgId: string | null }) {\n const { fetchJson } = 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 [openToken, setOpenToken] = useState(0)\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 setLoading(true)\n setError(false)\n setPayload(null)\n fetchJson('notifications', {\n headers: orgId ? { 'x-contacts-org': orgId } : undefined,\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 }, [fetchJson, orgId])\n\n // 10DLC registration auto-redirect — once per session, and ONLY when the\n // alert's href is same-origin with the current page (other origins just show\n // the alert; the core app navigates to its own settings). Mirrors VRM.\n useEffect(() => {\n if (!payload || typeof window === 'undefined') return\n const alert = payload.alerts.find((a) => a.kind === '10dlc_registration' && a.href)\n if (!alert?.href) return\n try {\n if (window.sessionStorage.getItem(TEN_DLC_REDIRECTED_KEY) === '1') return\n } catch {\n return\n }\n let target: URL\n try {\n target = new URL(alert.href, window.location.href)\n } catch {\n return\n }\n if (target.origin !== window.location.origin) return\n try {\n window.sessionStorage.setItem(TEN_DLC_REDIRECTED_KEY, '1')\n } catch {\n /* unavailable */\n }\n window.location.assign(alert.href)\n }, [payload])\n\n const markRead = useCallback(\n (id: string) => {\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],\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 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 if (!payload || toastReply) 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 }, [payload, replies, toastReply, notif.lastSeenAt, notif.toastedReplyIds, orgId])\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 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 unreadAlertCount = alerts.filter((a) => !notif.readAlertIds.includes(a.id)).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 const badgeCount = unreadAlertCount + unseenReplyCount\n\n const isEmpty =\n alerts.length === 0 && replies.length === 0 && imports.length === 0 && quarantined.length === 0\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 >\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 Notifications\n </p>\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&rsquo;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 = notif.readAlertIds.includes(a.id)\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 ? 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 {replies.map((r) => (\n <li key={r.id} className=\"rounded-lg px-2 py-2 hover:bg-[color:var(--panel)]\">\n <p className=\"text-sm font-semibold text-[color:var(--foreground)]\">{r.name}</p>\n <p className=\"truncate text-xs text-[color:var(--muted)]\">{r.preview}</p>\n </li>\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={QUARANTINED_CONTACTS_URL}\n className=\"text-[11px] font-semibold text-[color:var(--color-race-red)] hover:underline\"\n >\n View all\n </a>\n </div>\n <ul className=\"flex flex-col gap-1\">\n {quarantined.map((q) => (\n <li key={q.phone} className=\"rounded-lg px-2 py-2 hover:bg-[color:var(--panel)]\">\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 <span className=\"flex h-4 min-w-4 items-center justify-center rounded-full bg-[color:var(--panel)] px-1 text-[10px] tabular-nums text-[color:var(--muted)]\">\n {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 </li>\n ))}\n </ul>\n </div>\n ) : null}\n </div>\n )}\n </div>\n </TopBarPopover>\n {toastReply ? (\n <NewReplyToast\n reply={toastReply}\n onActivate={onToastActivate}\n onClose={() => setToastReply(null)}\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({ orgId }: { orgId?: string | null } = {}) {\n const { fetchJson } = useNavChrome('SupportAction')\n const { me, loaded } = useChromeMe()\n const { orgs } = useChromeOrgs()\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-race-red)] px-4 py-2 text-sm font-semibold text-white 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-race-red)]\"\n />\n {showEmailError ? (\n <span className=\"mt-1 block text-xs text-[color:var(--color-race-red)]\">\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-race-red)]\"\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-race-red)]\"\n />\n {state === 'error' ? (\n <p className=\"mt-2 text-sm text-[color:var(--color-race-red)]\">\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-race-red)] px-4 py-2 text-sm font-semibold text-white 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// 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\nconst 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-race-red)]'\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 // Follow the OS while set to \"system\".\n useEffect(() => {\n if (value !== 'system') return\n let mq: MediaQueryList\n try {\n mq = window.matchMedia('(prefers-color-scheme: dark)')\n } catch {\n return\n }\n const onChange = () => applyThemePreference('system')\n mq.addEventListener('change', onChange)\n return () => mq.removeEventListener('change', onChange)\n }, [value])\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 { NavIcon, NavItem } from './index'\n\n// ---------------------------------------------------------------------------\n// standardPolitogyNav — the canonical Politogy VRM menu, per operating Mode.\n//\n// This is the single source of truth for the navigation every politogy app\n// renders. The RELATIONSHIP tree is extracted verbatim from VRM core's\n// relationship-mode sidebar (`getRelationshipLinkItems`); the CAMPAIGN and\n// PETITION trees mirror VRM core's mode-scoped menus. Apps consume the same\n// menu everywhere; an app that owns one of the items (e.g. the standalone\n// Contacts app) nests its own pages as that item's children while every other\n// entry links out to another *.politogyvrm.com app as an absolute URL —\n// full-page navigation with SSO shared across the domain.\n//\n// Which tree an app renders is NOT the user's live mode selection — it is the\n// app's own mode, mapped from the app registry (see `POLITOGY_APPS[app].mode`).\n// A campaign-scoped app (a2p / phonebank / canvass / signs) always renders the\n// Campaign tree; an unscoped app (forms / surveys / polls / contacts) always\n// renders Relationship, exactly as before. Switching modes is a full-page\n// navigation between mode homes (the Mode pill's job), and each destination is\n// itself pinned — so the tree is deterministic from app identity, never a\n// value an app has to pass.\n// ---------------------------------------------------------------------------\n\n/**\n * Icon slots used by the standard menus. The shell stays icon-library-agnostic:\n * callers map each key to their own icon components (lucide, react-icons, …).\n * A missing key simply renders that row without an icon.\n */\nexport type StandardNavIconKey =\n | 'home'\n | 'users'\n | 'mail'\n | 'messageSquare'\n | 'layout'\n | 'activity'\n | 'lifeBuoy'\n | 'grid'\n | 'list'\n | 'upload'\n | 'edit'\n | 'fileText'\n | 'send'\n | 'clock'\n | 'user'\n | 'barChart'\n | 'briefcase'\n | 'settings'\n | 'creditCard'\n | 'dollarSign'\n | 'share'\n // Campaign / Petition mode slots.\n | 'phone'\n | 'map'\n | 'mapPin'\n | 'target'\n | 'flag'\n\n/** The operating Mode whose nav tree to build. Defaults to `relationship`. */\nexport type StandardNavMode = 'relationship' | 'campaign' | 'petition'\n\n/**\n * Per-feature availability for the Campaign tree. Campaign Mode ships its apps\n * incrementally: a disabled feature is omitted from the nav entirely (rather\n * than rendered as a dead/disabled row), and its flag flips to `true` in a\n * later patch release as the app goes live. Dashboard and Voter Contact are\n * core-hosted and always present, so they carry no flag.\n */\nexport interface CampaignFeatureAvailability {\n a2p: boolean\n phonebank: boolean\n canvass: boolean\n signs: boolean\n tribes: boolean\n polling: boolean\n}\n\n/**\n * Launch state at this shell version: every Campaign feature is deployed and\n * live (a2p / phonebank / canvass / signs .politogyvrm.com all serve the app\n * behind SSO as of 2026-07-24), so no row is hidden. The flags remain so a\n * future feature can ship dark, and so a caller can hide one per-deployment.\n */\nexport const CAMPAIGN_FEATURE_AVAILABILITY: CampaignFeatureAvailability = {\n a2p: true,\n phonebank: true,\n canvass: true,\n signs: true,\n tribes: true,\n polling: true,\n}\n\n/** Absolute origins for the standalone Campaign / Petition apps. */\nconst A2P_ORIGIN = 'https://a2p.politogyvrm.com/'\nconst PHONEBANK_ORIGIN = 'https://phonebank.politogyvrm.com/'\nconst CANVASS_ORIGIN = 'https://canvass.politogyvrm.com/'\nconst SIGNS_ORIGIN = 'https://signs.politogyvrm.com/'\nconst POLLS_ORIGIN = 'https://polls.politogyvrm.com/'\n// Tribes is a page inside the standalone Contacts app (Specs/Tribes: Tribes is\n// implemented as an extension of Contacts). Matches app-shell.tsx's `/tribes`.\nconst CONTACTS_TRIBES = 'https://contacts.politogyvrm.com/tribes'\n// Petition Mode is its own standalone app on its own subdomain (the petitions\n// repo deploys production to petition-mode.politogyvrm.com).\nconst PETITION_MODE_ORIGIN = 'https://petition-mode.politogyvrm.com/'\n\nexport interface StandardNavOptions {\n /** VRM core origin, e.g. \"https://app.politogyvrm.com\". Trailing slash OK. */\n coreBaseUrl: string\n /** Icon component per slot; omitted slots render icon-less rows. */\n icons?: Partial<Record<StandardNavIconKey, NavIcon>>\n /**\n * App-local override for the \"Contacts\" item. `children` are used verbatim\n * (NOT absolutized) so the owning app nests its own routes; `href` (also\n * verbatim) feeds active-detection for the group header. When omitted, the\n * item carries VRM core's own contacts sub-pages as absolute links.\n * (Relationship tree only.)\n */\n contactsItem?: { href?: string; children?: NavItem[] }\n /**\n * The trailing \"Support\" row. VRM core opens its SupportRequestModal here;\n * other apps supply their own handler (`onClick`) or a link (`href`).\n * Omitted or `false` → no Support row. Appended to every mode's tree.\n */\n supportItem?: { onClick?: () => void; href?: string } | false\n /**\n * Which mode's tree to build. Default `relationship`, whose output is\n * byte-for-byte what this function produced before modes existed.\n */\n mode?: StandardNavMode\n /**\n * Active organization id. Cross-app links in the Campaign/Petition trees\n * carry it as `?org=<last6>` — the same convention the Mode switcher and My\n * Account menu use — so the destination app opens on the same org. The\n * Relationship tree ignores this (its links never carried an org).\n */\n activeOrgId?: string | null\n /**\n * Per-feature Campaign availability overrides, merged over\n * `CAMPAIGN_FEATURE_AVAILABILITY`. Only meaningful for the Campaign tree.\n */\n campaignAvailability?: Partial<CampaignFeatureAvailability>\n}\n\n/** Core-relative route + icon slot for one standard entry. */\ntype CoreLeaf = { label: string; icon: StandardNavIconKey; path: string }\n\n/**\n * One sub-item of a standalone app, as a path RELATIVE to that app's origin\n * (`''` is the app root). Resolved against the origin and given the active-org\n * query param, exactly like the parent row it hangs under.\n */\ntype CrossAppLeaf = { label: string; icon: StandardNavIconKey; path: string }\n\nconst CONTACTS_DEFAULT_CHILDREN: CoreLeaf[] = [\n { label: 'Dashboard', icon: 'grid', path: '/relationship/contacts/dashboard' },\n { label: 'All Contacts', icon: 'list', path: '/relationship/contacts/all' },\n { label: 'Tribes', icon: 'users', path: '/relationship/contacts/groups' },\n { label: 'Import', icon: 'upload', path: '/relationship/contacts/import' },\n { label: 'Import History', icon: 'fileText', path: '/relationship/contacts/import-history' },\n { label: 'Merge Rules', icon: 'layout', path: '/relationship/contacts/merge-rules' },\n]\n\nconst EMAIL_CHILDREN: CoreLeaf[] = [\n { label: 'Dashboard', icon: 'grid', path: '/relationship/email/dashboard' },\n { label: 'Create & Edit', icon: 'edit', path: '/relationship/email/create-and-edit' },\n { label: 'Sender Information', icon: 'mail', path: '/relationship/email/inbox' },\n { label: 'Recipients', icon: 'user', path: '/relationship/email/send-to' },\n { label: 'Send & Automate', icon: 'clock', path: '/relationship/email/send-and-automate' },\n { label: 'Statistics', icon: 'barChart', path: '/relationship/email/statistics' },\n]\n\nconst SMS_CHILDREN: CoreLeaf[] = [\n { label: 'Dashboard', icon: 'grid', path: '/relationship/sms-mms-blast/dashboard' },\n { label: 'Compose & Send', icon: 'send', path: '/relationship/sms-mms-blast/compose-and-send' },\n { label: 'Conversations', icon: 'messageSquare', path: '/relationship/sms-mms-blast/conversations' },\n]\n\nconst CTA_CHILDREN: CoreLeaf[] = [\n { label: 'Dashboard', icon: 'grid', path: '/relationship/cta-database/dashboard' },\n { label: 'Create & Edit', icon: 'edit', path: '/relationship/cta-creator/create-and-edit' },\n { label: 'Submissions', icon: 'fileText', path: '/relationship/cta-submissions/submissions' },\n]\n\n// Organization Settings — promoted from the My Account menu into the left nav\n// (HITL directive 2026-07-23). Mirrors the main app's page IA exactly:\n// /organization-settings/:tab, with Subscription & Billing carrying its own\n// third level (/organization-settings/subscription-billing/:tab). This is the\n// canonical depth-3 example the nav renderers support.\ntype CoreBranch = CoreLeaf & { children?: CoreLeaf[] }\n\nconst ORG_SETTINGS_CHILDREN: CoreBranch[] = [\n { label: 'General', icon: 'settings', path: '/organization-settings' },\n {\n label: 'Subscription & Billing',\n icon: 'creditCard',\n path: '/organization-settings/subscription-billing',\n children: [\n { label: 'Current Plan', icon: 'fileText', path: '/organization-settings/subscription-billing/current-plan' },\n { label: 'SMS, MMS & Email Usage', icon: 'activity', path: '/organization-settings/subscription-billing/text-email' },\n { label: 'Wallet', icon: 'dollarSign', path: '/organization-settings/subscription-billing/wallet' },\n { label: '10DLC', icon: 'messageSquare', path: '/organization-settings/subscription-billing/10dlc' },\n { label: 'Billing History', icon: 'clock', path: '/organization-settings/subscription-billing/billing-history' },\n ],\n },\n { label: 'Email', icon: 'mail', path: '/organization-settings/email-settings' },\n { label: 'Users', icon: 'users', path: '/organization-settings/users' },\n { label: 'Shared Links', icon: 'share', path: '/organization-settings/shared-links' },\n]\n\n// The NEW standalone acquisition apps (forms./surveys./polls.politogyvrm.com)\n// replace the legacy in-core \"Forms & Surveys\" system (HITL directive\n// 2026-07-23; removal plan: politogy/docs/legacy-forms-removal-plan.md).\n// Absolute cross-app links — SSO carries the session.\nconst APP_FORMS_CHILDREN = [\n { label: 'Forms', icon: 'list' as const, href: 'https://forms.politogyvrm.com/?tab=forms' },\n { label: 'Canvas', icon: 'edit' as const, href: 'https://forms.politogyvrm.com/?tab=canvas' },\n { label: 'Submissions', icon: 'fileText' as const, href: 'https://forms.politogyvrm.com/?tab=submissions' },\n]\n// The Surveys sub-menu mirrors the app's tab strip: Surveys / Canvas / Results.\n// Canvas and Results are survey-scoped routes (/surveys/:id/canvas), so with no\n// survey selected the list page carries a ?view= param — distinct hrefs, so\n// active-detection singles out exactly one (identical hrefs were the earlier\n// all-active bug; query params ARE compared, hashes are not).\nconst APP_SURVEYS_CHILDREN = [\n { label: 'Surveys', icon: 'list' as const, href: 'https://surveys.politogyvrm.com/surveys' },\n { label: 'Canvas', icon: 'edit' as const, href: 'https://surveys.politogyvrm.com/surveys?view=canvas' },\n { label: 'Results', icon: 'barChart' as const, href: 'https://surveys.politogyvrm.com/surveys?view=results' },\n]\nconst APP_POLLS_CHILDREN = [\n { label: 'Command Center', icon: 'grid' as const, href: 'https://polls.politogyvrm.com/' },\n { label: 'New Poll', icon: 'edit' as const, href: 'https://polls.politogyvrm.com/polls/new' },\n]\n\n// ---------------------------------------------------------------------------\n// Campaign app sub-navigation.\n//\n// Reference/UI-Platform v13 (Left bar → Navigation): \"The canonical VRM nav\n// tree — PARENT GROUPS WITH SUB-ITEMS. The app's own pages nest under their\n// group.\" The Campaign tree shipped as eight flat rows with no `children`, so\n// the Navigation Display control's \"Both\" and \"Sub Menu\" modes had nothing to\n// expand in the left bar of a2p / phonebank / canvass / signs — the three modes\n// rendered an identical sidebar and the control looked broken.\n//\n// Each list below is the app's OWN section list, taken verbatim from that app's\n// in-app tab strip (its `components/Shell.tsx`), so the sidebar sub-menu and the\n// page tab strip name the same sections in the same order — the sidebar/tab\n// agreement Reference/UI-Platform exists to enforce.\n// ---------------------------------------------------------------------------\n\n/** a2p/components/Shell.tsx `TABS` — the six A2P tabs. */\nconst APP_A2P_CHILDREN: CrossAppLeaf[] = [\n { label: 'Dashboard', icon: 'grid', path: 'dashboard' },\n { label: 'Compose', icon: 'edit', path: 'compose' },\n { label: 'Recipients', icon: 'user', path: 'recipients' },\n { label: 'Tech Check', icon: 'activity', path: 'tech-check' },\n { label: 'Status', icon: 'clock', path: 'status' },\n { label: 'Conversations', icon: 'messageSquare', path: 'conversations' },\n]\n\n/** phonebank/components/Shell.tsx `NAV` — the Manager console's sections. */\nconst APP_PHONEBANK_CHILDREN: CrossAppLeaf[] = [\n { label: 'Dashboard', icon: 'grid', path: '' },\n { label: 'Campaigns', icon: 'phone', path: 'campaigns' },\n { label: 'Inbound', icon: 'messageSquare', path: 'inbound' },\n { label: 'Reports', icon: 'barChart', path: 'reports' },\n]\n\n/** canvass/components/Shell.tsx `SECTIONS` — the manager console's sections. */\nconst APP_CANVASS_CHILDREN: CrossAppLeaf[] = [\n { label: 'Dashboard', icon: 'grid', path: '' },\n { label: 'Campaigns', icon: 'target', path: 'campaigns' },\n { label: 'Canvassers', icon: 'users', path: 'canvassers' },\n]\n\n/**\n * signs/components/Shell.tsx `SECTIONS`. Review Queue is Manager+ in the app's\n * tab strip; the shared tree carries no role input, so the row is listed for\n * everyone and the ROUTE enforces it — /review renders a \"available to Managers\n * and Admins\" notice and loads no queue data for a volunteer (signs\n * app/review/page.tsx). Listing it keeps sidebar and tab strip identical for the\n * managers who use it rather than re-opening per-app nav drift.\n */\nconst APP_SIGNS_CHILDREN: CrossAppLeaf[] = [\n { label: 'Map', icon: 'map', path: '' },\n { label: 'Placements', icon: 'list', path: 'placements' },\n { label: 'Review Queue', icon: 'fileText', path: 'review' },\n { label: 'Recovery', icon: 'flag', path: 'recovery' },\n { label: 'Reports', icon: 'barChart', path: 'reports' },\n]\n\n/**\n * Build the standard Politogy VRM menu for the given `mode` (default\n * `relationship`), in the exact order and wording the main app renders it. See\n * `StandardNavOptions` for the app-specific hooks (`contactsItem`,\n * `supportItem`) and the Campaign inputs (`activeOrgId`, `campaignAvailability`).\n */\nexport function standardPolitogyNav(opts: StandardNavOptions): NavItem[] {\n const base = opts.coreBaseUrl.replace(/\\/+$/, '')\n const abs = (path: string): string => `${base}${path.startsWith('/') ? path : `/${path}`}`\n const icon = (key: StandardNavIconKey): NavIcon | undefined => opts.icons?.[key]\n const leaves = (children: CoreLeaf[]): NavItem[] =>\n children.map((c) => ({ label: c.label, icon: icon(c.icon), href: abs(c.path) }))\n const branches = (children: CoreBranch[]): NavItem[] =>\n children.map((c) => ({\n label: c.label,\n icon: icon(c.icon),\n href: abs(c.path),\n children: c.children ? leaves(c.children) : undefined,\n }))\n\n // Cross-app links carry the active org as `?org=<last6>` — the convention the\n // Mode switcher and My Account menu already use. Only the Campaign/Petition\n // trees use it; the Relationship tree's links stay exactly as before.\n const orgParam = opts.activeOrgId ? `org=${opts.activeOrgId.slice(-6)}` : ''\n const withOrg = (url: string): string =>\n orgParam ? `${url}${url.includes('?') ? '&' : '?'}${orgParam}` : url\n\n const buildRelationship = (): NavItem[] => {\n const contacts: NavItem = opts.contactsItem\n ? {\n label: 'Contacts',\n icon: icon('users'),\n href: opts.contactsItem.href,\n children: opts.contactsItem.children,\n }\n : {\n label: 'Contacts',\n icon: icon('users'),\n href: abs('/relationship/contacts/dashboard'),\n children: leaves(CONTACTS_DEFAULT_CHILDREN),\n }\n\n return [\n { label: 'Dashboard', icon: icon('home'), href: abs('/relationship/dashboard') },\n contacts,\n {\n label: 'Email Broadcast',\n icon: icon('mail'),\n href: abs('/relationship/email/dashboard'),\n children: leaves(EMAIL_CHILDREN),\n },\n {\n label: 'SMS/MMS Blast',\n icon: icon('messageSquare'),\n href: abs('/relationship/sms-mms-blast/dashboard'),\n children: leaves(SMS_CHILDREN),\n },\n // These two carry no top-level href in VRM core (parent row only toggles).\n { label: 'Calls to Action', icon: icon('layout'), children: leaves(CTA_CHILDREN) },\n {\n label: 'Forms',\n icon: icon('activity'),\n href: 'https://forms.politogyvrm.com/',\n children: APP_FORMS_CHILDREN.map((c) => ({ label: c.label, icon: icon(c.icon), href: c.href })),\n },\n {\n label: 'Surveys',\n icon: icon('fileText'),\n href: 'https://surveys.politogyvrm.com/surveys',\n children: APP_SURVEYS_CHILDREN.map((c) => ({ label: c.label, icon: icon(c.icon), href: c.href })),\n },\n {\n label: 'Polls',\n icon: icon('barChart'),\n href: 'https://polls.politogyvrm.com/',\n children: APP_POLLS_CHILDREN.map((c) => ({ label: c.label, icon: icon(c.icon), href: c.href })),\n },\n {\n label: 'Organization Settings',\n icon: icon('briefcase'),\n href: abs('/organization-settings'),\n children: branches(ORG_SETTINGS_CHILDREN),\n },\n ]\n }\n\n // Campaign tree — Dashboard + the 7 Campaign Mode features. Dashboard and\n // Voter Contact are core-hosted (VRM core /campaign/*); the rest link out to\n // standalone apps and are gated by CAMPAIGN_FEATURE_AVAILABILITY.\n const buildCampaign = (): NavItem[] => {\n const avail: CampaignFeatureAvailability = {\n ...CAMPAIGN_FEATURE_AVAILABILITY,\n ...opts.campaignAvailability,\n }\n // Sub-items of a standalone app: `origin` + the app-relative path, carrying\n // the active org the way the parent row does. Trailing slash on the origin\n // is normalized so `''` yields the app root and `x` yields `/x`.\n const appLeaves = (origin: string, children: CrossAppLeaf[]): NavItem[] => {\n const base = origin.replace(/\\/+$/, '')\n return children.map((c) => ({\n label: c.label,\n icon: icon(c.icon),\n href: withOrg(c.path ? `${base}/${c.path}` : `${base}/`),\n }))\n }\n type Gated = NavItem & { flag?: keyof CampaignFeatureAvailability }\n const rows: Gated[] = [\n { label: 'Dashboard', icon: icon('home'), href: withOrg(abs('/campaign/dashboard')) },\n { label: 'Voter Contact', icon: icon('target'), href: withOrg(abs('/campaign/campaigns')) },\n {\n label: 'A2P',\n icon: icon('messageSquare'),\n href: withOrg(A2P_ORIGIN),\n children: appLeaves(A2P_ORIGIN, APP_A2P_CHILDREN),\n flag: 'a2p',\n },\n {\n label: 'Phone Banking',\n icon: icon('phone'),\n href: withOrg(PHONEBANK_ORIGIN),\n children: appLeaves(PHONEBANK_ORIGIN, APP_PHONEBANK_CHILDREN),\n flag: 'phonebank',\n },\n {\n label: 'Field Canvassing',\n icon: icon('map'),\n href: withOrg(CANVASS_ORIGIN),\n children: appLeaves(CANVASS_ORIGIN, APP_CANVASS_CHILDREN),\n flag: 'canvass',\n },\n {\n label: 'Sign Mapping',\n icon: icon('mapPin'),\n href: withOrg(SIGNS_ORIGIN),\n children: appLeaves(SIGNS_ORIGIN, APP_SIGNS_CHILDREN),\n flag: 'signs',\n },\n { label: 'Tribes', icon: icon('users'), href: withOrg(CONTACTS_TRIBES), flag: 'tribes' },\n { label: 'Polling Engine', icon: icon('barChart'), href: withOrg(POLLS_ORIGIN), flag: 'polling' },\n ]\n return rows\n .filter((r) => !r.flag || avail[r.flag])\n .map(({ flag: _flag, ...item }) => item)\n }\n\n // Petition tree — minimal: the Petition Mode home (its own standalone app).\n // Labeled Dashboard so the shared breadcrumb trail anchors correctly.\n const buildPetition = (): NavItem[] => [\n { label: 'Dashboard', icon: icon('home'), href: withOrg(PETITION_MODE_ORIGIN) },\n ]\n\n const mode = opts.mode ?? 'relationship'\n const items =\n mode === 'campaign'\n ? buildCampaign()\n : mode === 'petition'\n ? buildPetition()\n : buildRelationship()\n\n if (opts.supportItem) {\n items.push({\n label: 'Support',\n icon: icon('lifeBuoy'),\n href: opts.supportItem.href,\n onClick: opts.supportItem.onClick,\n })\n }\n\n return items\n}\n","// ---------------------------------------------------------------------------\n// Framework-agnostic chrome (sidebar + top navbar) for @the-portland-company/shell.\n//\n// The other chrome in this package (ShellChrome, Sidebar, Header, …) is built\n// on Chakra UI v2 + react-router and targets Vite SPAs. That stack cannot be\n// imported into a Next.js / React 19 / Tailwind app. This \"native\" module is a\n// dependency-light alternative: pure React (no Chakra, no emotion, no\n// react-router, no icon library) whose styling is driven entirely by the CSS\n// design tokens shipped in `@the-portland-company/shell/chrome.css`.\n//\n// It is a FAITHFUL VISUAL TWIN of the Chakra chrome (Sidebar.tsx / Header.tsx /\n// OrgPill / ModePill / NavItem / UserMenu): same 240px sidebar, brand-logo\n// slot, \"ORGANIZATION\" org pill, mode pill, solid active nav rows, pipe-\n// separated footer links + commit string, and an avatar+name+email+chevron user\n// menu — so an app rendering this looks identical to the main VRM app.\n//\n// Every app concern (nav items, org, mode, user, links, icons, the routing\n// Link component, the theme toggle) is injected via props, so both the Contacts\n// app (Next.js) and the VRM app could consume the same components.\n// ---------------------------------------------------------------------------\n\nimport type { ComponentType, CSSProperties, ReactNode } from 'react'\nimport { useEffect, useMemo, useState } from 'react'\nimport { useTopBarIconSlotGlyph, type TopBarIconSlot } from '../lib/topbarIconSlot'\nimport { resolveBrandGlyph } from '../lib/brandGlyphs'\nimport { topBarIconButtonClass, TopBarTooltip, TopBarPanelArrow, NavThemeControl, type ThemePreference } from './chromeActions'\n\n// Data-backed top-bar widgets (Fuel, Notifications, Support, Nav-display) +\n// the injected-fetcher provider they hang off. One implementation for every app.\nexport {\n NavChromeProvider,\n CORE_APP_ORIGIN,\n CORE_BILLING_PATH,\n FuelAction,\n NotificationsAction,\n SupportAction,\n NavDisplayAction,\n NavThemeControl,\n TopBarCountBadge,\n TopBarPanelArrow,\n TopBarTooltip,\n TopBarWidgetSlot,\n TopBarPopover,\n topBarIconButtonClass,\n useChromeMe,\n useChromeOrgs,\n useNavChromeFetcher,\n useThemePreference,\n} from './chromeActions'\nexport type {\n ChromeMe,\n NavChromeFetcher,\n NavDisplayMode,\n ThemePreference,\n ChromeOrgSummary,\n ChromeNotificationsPayload,\n ChromeNotificationAlert,\n ChromeNotificationReply,\n ChromeNotificationImport,\n ChromeNotificationQuarantine,\n CommunicationsFuelStatus,\n FuelChannelStatus,\n} from './chromeActions'\n\n// An icon is any component that accepts an optional size + className. This\n// matches both `lucide-react` and `react-icons` icon signatures, so consuming\n// apps pass their own icon set without this package depending on one.\nexport type NavIcon = ComponentType<{ size?: number; className?: string }>\n\nexport type NavItem = {\n /** Route to link to. Optional when `onClick` is supplied (renders a button). */\n href?: string\n label: string\n icon?: NavIcon\n /**\n * When supplied the row renders as a `<button>` (styled identically to the\n * link rows) instead of a routed link — used for actions like \"Support\".\n */\n onClick?: () => void\n /**\n * Disables the row: non-interactive and dimmed, with `disabledTitle` shown as\n * a hover tooltip explaining why. Mirrors `NavTab`'s existing contract so a\n * gated row looks the same whether it renders in the sidebar or a tab strip.\n * Without this, an app that gates a section (VRM dims Email / SMS until setup\n * is complete) had no way to express it and the row rendered fully clickable\n * (shell-nav-handoff §3).\n */\n disabled?: boolean\n /** Tooltip for a disabled row — say why, and how to resolve it. */\n disabledTitle?: string\n /**\n * Nested sub-items. When present, the row becomes an expandable GROUP header.\n * Clicking it always toggles the children open/closed and rotates the\n * right-aligned chevron; if the item ALSO carries an `onClick`, that runs too,\n * so a parent can navigate to its section dashboard while expanding\n * (shell-nav-handoff §2). An `href` alone never navigates from a group header. The sidebar runs a single-open accordion (opening one group closes\n * the others) and auto-expands whichever group contains the active route —\n * mirroring the main VRM app's Chakra sidebar. Children render as smaller nav\n * rows on a lighter panel and support both `href` links and `onClick` actions.\n */\n children?: NavItem[]\n}\n\n// The routing primitive is injected so each app supplies its own (Next.js\n// `<Link>`, react-router `<Link>`, or a plain `<a>`). Defaults to an anchor.\nexport type NavLinkProps = {\n href: string\n className?: string\n 'aria-current'?: 'page' | undefined\n children: ReactNode\n // Optional passthrough attributes so the same injected link can back a\n // routed nav row OR a routed tab (which needs ARIA tab semantics + inline\n // token geometry). Next.js `<Link>`, react-router `<Link>` and a plain <a>\n // all accept these DOM props, and DefaultLink spreads them onto its anchor.\n role?: string\n 'aria-selected'?: boolean\n 'aria-label'?: string\n title?: string\n style?: CSSProperties\n}\nexport type NavLinkComponent = ComponentType<NavLinkProps>\n\n/**\n * URL-scheme allow-list for host-supplied hrefs. React does not neutralize\n * `javascript:`/`data:` schemes on anchor href, so any app-supplied nav/footer/\n * action href must be validated before it reaches the DOM. Permits absolute\n * http(s), mailto/tel, and in-app relative targets; everything else → '#'.\n */\nconst safeHref = (h?: string) =>\n h && /^(https?:|mailto:|tel:|\\/|#|\\.)/i.test(h.trim()) ? h : '#'\n\nconst DefaultLink: NavLinkComponent = ({ href, children, ...rest }) => (\n <a href={safeHref(href)} {...rest}>\n {children}\n </a>\n)\n\n/**\n * Default active-route test. Handles three href shapes so the CURRENT app's\n * item + sub-item select correctly in the cross-app menu (HITL 2026-07-23):\n * - relative path: exact for \"/\", prefix otherwise (legacy behavior);\n * - absolute URL: active only when its host matches window.location.host,\n * then compared by path (and query, when the href carries one — e.g.\n * forms' /?tab=canvas sub-items);\n * - query-only relative hrefs likewise compare location.search.\n *\n * The `org` param is EXCLUDED from the query comparison. Campaign / Petition\n * links carry `?org=<last6>` purely to hand the active organization to the\n * destination app (`standardPolitogyNav`'s `activeOrgId`); it scopes data, it\n * does not identify a page. Comparing it would deselect every campaign row the\n * moment an org is active, because the app's own URL bar carries no `org=`.\n */\nconst ACTIVE_IGNORED_PARAMS = new Set(['org'])\n\nexport function isNavItemActive(pathname: string, href: string): boolean {\n let targetPath = href\n let targetSearch = ''\n if (/^https?:\\/\\//i.test(href)) {\n if (typeof window === 'undefined') return false\n try {\n const u = new URL(href)\n if (u.host !== window.location.host) return false\n targetPath = u.pathname\n targetSearch = u.search\n } catch {\n return false\n }\n } else {\n const qi = href.indexOf('?')\n if (qi >= 0) {\n targetPath = href.slice(0, qi) || '/'\n targetSearch = href.slice(qi)\n }\n }\n // Every IDENTIFYING key=value in the target query must be present in the\n // location. Once the scoping params are dropped a link like\n // \"https://signs.politogyvrm.com/placements?org=abc123\" is a plain path href\n // again and falls through to the path rules below.\n const want = new URLSearchParams(targetSearch)\n for (const k of ACTIVE_IGNORED_PARAMS) want.delete(k)\n if (Array.from(want).length > 0) {\n if (typeof window === 'undefined') return false\n if (pathname !== targetPath) return false\n const have = new URLSearchParams(window.location.search)\n for (const [k, v] of want) if (have.get(k) !== v) return false\n return true\n }\n if (targetPath === '/') return pathname === '/'\n return pathname === targetPath || pathname.startsWith(`${targetPath}/`)\n}\n\n/**\n * Stable identity for an expandable nav group's accordion state. Prefers the\n * item's href; falls back to an index-scoped label so two groups can never\n * collide even when they share a label and have no href.\n */\nfunction groupKeyOf(item: NavItem, index: number): string {\n return item.href ?? `nav-group-${index}-${item.label}`\n}\n\n/** True when any of a group's children links to the active route. */\nfunction hasActiveChild(\n item: NavItem,\n pathname: string,\n activeFn: (pathname: string, href: string) => boolean,\n): boolean {\n return (item.children ?? []).some(\n (child) =>\n (child.href ? activeFn(pathname, child.href) : false) ||\n // Depth-3: a grandchild owning the route also opens the top group.\n (child.children ?? []).some((leaf) =>\n leaf.href ? activeFn(pathname, leaf.href) : false,\n ),\n )\n}\n\n/**\n * Color-coded tone classes for the sidebar environment chip, matching the main\n * VRM app: prod red, staging orange, local/dev green, unknown gray.\n */\nexport function envChipClasses(label: string): string {\n const l = label.toLowerCase()\n if (l === 'production' || l === 'prod')\n return 'bg-[#fee2e2] text-[#ef4444]'\n if (l === 'staging' || l === 'stage')\n return 'bg-[#ffedd5] text-[#f97316]'\n if (l === 'local' || l === 'development' || l === 'dev')\n return 'bg-[#dcfce7] text-[#22c55e]'\n return 'bg-[rgba(107,114,128,0.16)] text-[#6b7280]'\n}\n\n// ---------------------------------------------------------------------------\n\nexport type NavBrand = {\n /** Where the logo links to. Defaults to \"/\". */\n homeHref?: string\n /**\n * Brand logo image src. When supplied this renders as the wordmark logo\n * (matching the main app's BrandLogo), and `badgeLabel`/`title`/`subtitle`\n * are used only as the no-image fallback.\n */\n logoSrc?: string\n logoAlt?: string\n /** Short label shown inside the brand badge fallback (e.g. \"P\"). */\n badgeLabel: string\n title: string\n subtitle?: string\n}\n\nexport type NavOrgOption = {\n id: string\n name: string | null\n logoUrl?: string | null\n brandColor?: string | null\n role?: string | null\n}\n\nexport type NavOrg = {\n name: string | null\n /** Full org id. When present, a copy affordance is shown by the label. */\n id?: string | null\n /** Optional org logo for the pill badge; falls back to initials. */\n logoUrl?: string | null\n /** Solid pill background (the org's brand color). Defaults to race red. */\n brandColor?: string | null\n onClick?: () => void\n /**\n * The user's organizations. When present (even one), the pill renders as a\n * dropdown SWITCHER (Reference/UI-Platform \"Organization selector\": never a\n * static label in a multi-org app); selecting one calls `onSwitch(id)`.\n */\n organizations?: NavOrgOption[]\n onSwitch?: (id: string) => void\n /**\n * The active org is still resolving from the chrome API. Renders a skeleton\n * pill instead of a name. Required because the app's own workspace label is\n * NOT the organization: showing it while the real org loads flashes a wrong\n * value (Global Rules — async values shimmer, they never render a stand-in).\n */\n loading?: boolean\n}\n\nexport type NavModeOption = {\n id: string\n label: string\n icon?: NavIcon\n}\n\nexport type NavMode = {\n label: string\n icon?: NavIcon\n /**\n * Entitled modes for the active organization. With more than one option the\n * pill renders as a SELECTOR (dropdown); with zero/one it stays the classic\n * disabled single-mode pill. Selecting calls onSelect(id).\n */\n options?: NavModeOption[]\n onSelect?: (id: string) => void\n}\n\nexport type NavFooterLink = { label: string; href: string; external?: boolean }\n\nexport type NavFooter = {\n /**\n * Build metadata (env chip / commit / version / date / author). OPTIONAL:\n * omit envLabel/version/commit to render a links-only footer — apps show\n * the meta block to Super Administrators only (Reference/UI-Platform).\n */\n envLabel?: string\n version?: string\n commit?: string\n links?: NavFooterLink[]\n /** ISO date (or any Date-parseable string) of the deployed commit. */\n commitDate?: string\n /** Full name of the commit author (only the first name is shown). */\n commitAuthor?: string\n}\n\nexport type NavSidebarProps = {\n pathname: string\n brand: NavBrand\n nav: {\n groupLabel?: string\n items: NavItem[]\n isActive?: (pathname: string, href: string) => boolean\n }\n org?: NavOrg | null\n mode?: NavMode | null\n footer?: NavFooter | null\n linkComponent?: NavLinkComponent\n}\n\n// Default org-pill background — race red, matching the main app's fallback\n// (mode primary) when an org has no explicit brand color.\nconst ORG_PILL_DEFAULT = 'var(--color-race-red)'\n\nexport function NavSidebar({\n pathname,\n brand,\n nav,\n org,\n mode,\n footer,\n linkComponent,\n}: NavSidebarProps) {\n const Link = linkComponent ?? DefaultLink\n const activeFn = nav.isActive ?? isNavItemActive\n const ModeIcon = mode?.icon\n const orgBg = org?.brandColor || ORG_PILL_DEFAULT\n\n // Single-open accordion for expandable nav groups, mirroring the main VRM\n // app's Chakra sidebar. `activeGroupKey` is the group (if any) that owns the\n // current route; deriving it as a primitive string keeps the auto-expand\n // effect from firing when `nav.items` is a fresh array reference each render\n // (which would otherwise clobber a manual toggle).\n const activeGroupKey = useMemo(() => {\n for (let i = 0; i < nav.items.length; i++) {\n const item = nav.items[i]\n if (item.children && item.children.length > 0 && hasActiveChild(item, pathname, activeFn)) {\n return groupKeyOf(item, i)\n }\n }\n return null\n }, [nav.items, pathname, activeFn])\n\n // Seed the open group from the active route on first paint (no expand flash),\n // then keep it synced as the route changes. Manual toggles between route\n // changes are preserved because the effect only reruns when the *derived*\n // active group actually changes.\n const [openGroup, setOpenGroup] = useState<string | null>(activeGroupKey)\n useEffect(() => {\n setOpenGroup(activeGroupKey)\n }, [activeGroupKey])\n const toggleGroup = (key: string) =>\n setOpenGroup((prev) => (prev === key ? null : key))\n\n return (\n <aside className=\"fixed inset-y-0 left-0 z-30 hidden w-[240px] flex-col border-r border-[color:var(--line)] bg-[color:var(--nav-surface)] lg:flex\">\n {/* Brand — logo image (preferred) or badge fallback */}\n <Link\n href={brand.homeHref ?? '/'}\n className=\"flex h-[64px] flex-shrink-0 items-center gap-2.5 px-6\"\n >\n {brand.logoSrc ? (\n <img\n src={brand.logoSrc}\n alt={brand.logoAlt ?? brand.title}\n draggable={false}\n className=\"h-10 w-auto object-contain\"\n />\n ) : (\n <>\n <span className=\"flex h-9 w-9 items-center justify-center rounded-xl bg-[color:var(--color-race-red)] text-base font-black text-white shadow-sm\">\n {brand.badgeLabel}\n </span>\n <span className=\"flex flex-col leading-tight\">\n <span className=\"text-base font-extrabold tracking-[-0.01em] text-[color:var(--color-race-red)]\">\n {brand.title}\n </span>\n {brand.subtitle ? (\n <span className=\"text-[11px] font-semibold uppercase tracking-[0.16em] text-[color:var(--muted)]\">\n {brand.subtitle}\n </span>\n ) : null}\n </span>\n </>\n )}\n </Link>\n\n {/* Scroll region: org pill, mode pill, nav */}\n <div className=\"flex flex-1 flex-col overflow-y-auto px-4 pb-2\">\n {/* Organization switcher */}\n {org ? (\n <div className=\"mb-3\">\n <div className=\"mb-2 flex items-center justify-between px-1\">\n <p className=\"text-[11px] font-semibold uppercase tracking-[0.08em] text-[color:var(--muted)]\">\n Organization\n </p>\n {org.id && !org.loading ? <OrgIdCopyButton id={org.id} /> : null}\n </div>\n {org.loading ? (\n <div className=\"flex w-full items-center gap-2.5 rounded-md border border-[color:var(--line)] bg-[color:var(--panel-elevated)] px-2.5 py-2 shadow-sm\">\n <span\n aria-hidden\n className=\"h-7 w-7 shrink-0 animate-pulse rounded-full bg-[color:var(--panel)]\"\n />\n <span\n aria-hidden\n className=\"h-4 flex-1 animate-pulse rounded bg-[color:var(--panel)]\"\n />\n <span className=\"sr-only\">Loading organization</span>\n </div>\n ) : org.organizations && org.organizations.length > 0 && org.onSwitch ? (\n <details data-nav-details className=\"group relative\">\n <summary className=\"flex w-full cursor-pointer list-none items-center justify-between gap-2 rounded-md border border-[color:var(--line)] bg-[color:var(--panel-elevated)] px-2.5 py-2 text-left text-[color:var(--foreground)] shadow-sm transition hover:bg-[color:var(--panel)] [&::-webkit-details-marker]:hidden\">\n <span className=\"flex min-w-0 items-center gap-2.5\">\n {/* Only the circular badge carries the org's brand color. */}\n <span\n style={{ backgroundColor: orgBg }}\n className=\"flex h-7 w-7 shrink-0 items-center justify-center overflow-hidden rounded-full text-[11px] font-bold text-white\"\n >\n {org.logoUrl ? (\n <img src={org.logoUrl} alt=\"\" className=\"h-full w-full object-cover\" />\n ) : (\n (org.name ?? 'Org').slice(0, 2).toUpperCase()\n )}\n </span>\n <span\n title={org.name ?? undefined}\n className=\"truncate text-sm font-semibold\"\n >\n {org.name ?? 'No organizations'}\n </span>\n </span>\n <ChevronDown />\n </summary>\n <div className=\"absolute left-0 right-0 z-40 mt-1 max-h-72 overflow-y-auto rounded-xl border border-[color:var(--line)] bg-[color:var(--panel-elevated)] py-1 shadow-[var(--shadow-soft)]\">\n {org.organizations.map((o) => {\n const selected = o.id === org.id\n return (\n <button\n key={o.id}\n type=\"button\"\n onClick={(e) => {\n // Close the <details> popover, then switch.\n e.currentTarget.closest('details')?.removeAttribute('open')\n if (!selected) org.onSwitch?.(o.id)\n }}\n aria-current={selected ? 'true' : undefined}\n className={[\n 'flex w-full items-center gap-2.5 px-3 py-2 text-left text-sm',\n selected\n ? 'font-semibold text-[color:var(--color-race-red)]'\n : 'font-medium text-[color:var(--foreground)] hover:bg-[color:var(--panel)]',\n ].join(' ')}\n >\n <span\n style={{ backgroundColor: o.brandColor || ORG_PILL_DEFAULT }}\n className=\"flex h-6 w-6 shrink-0 items-center justify-center overflow-hidden rounded-full text-[10px] font-bold text-white\"\n >\n {o.logoUrl ? (\n <img src={o.logoUrl} alt=\"\" className=\"h-full w-full object-cover\" />\n ) : (\n (o.name ?? 'Org').slice(0, 2).toUpperCase()\n )}\n </span>\n <span title={o.name ?? o.id} className=\"truncate\">\n {o.name ?? o.id.slice(0, 8)}\n </span>\n </button>\n )\n })}\n </div>\n </details>\n ) : (\n <button\n type=\"button\"\n onClick={org.onClick}\n className=\"flex w-full items-center justify-between gap-2 rounded-md border border-[color:var(--line)] bg-[color:var(--panel-elevated)] px-2.5 py-2 text-left text-[color:var(--foreground)] shadow-sm transition hover:bg-[color:var(--panel)]\"\n >\n <span className=\"flex min-w-0 items-center gap-2.5\">\n {/* Only the circular badge carries the org's brand color. */}\n <span\n style={{ backgroundColor: orgBg }}\n className=\"flex h-7 w-7 shrink-0 items-center justify-center overflow-hidden rounded-full text-[11px] font-bold text-white\"\n >\n {org.logoUrl ? (\n <img src={org.logoUrl} alt=\"\" className=\"h-full w-full object-cover\" />\n ) : (\n (org.name ?? 'Org').slice(0, 2).toUpperCase()\n )}\n </span>\n <span className=\"truncate text-sm font-semibold\">\n {org.name ?? 'No organizations'}\n </span>\n </span>\n <ChevronDown />\n </button>\n )}\n </div>\n ) : null}\n\n {/* Mode pill — a SELECTOR when the org is entitled to >1 mode. */}\n {mode ? (\n <div className=\"mb-4\">\n {mode.options && mode.options.length > 1 && mode.onSelect ? (\n <details data-nav-details className=\"group relative\">\n <summary className=\"flex w-full cursor-pointer list-none items-center justify-between gap-2 rounded-md bg-[color:var(--color-race-red)] px-2.5 py-2 text-white shadow-sm transition hover:opacity-95 [&::-webkit-details-marker]:hidden\">\n <span className=\"flex items-center gap-2.5\">\n {ModeIcon ? <ModeIcon size={16} className=\"shrink-0\" /> : null}\n <span className=\"text-sm font-semibold tracking-[-0.01em]\">{mode.label}</span>\n </span>\n <ChevronDown />\n </summary>\n <div className=\"absolute left-0 right-0 z-40 mt-1 overflow-hidden rounded-xl border border-[color:var(--line)] bg-[color:var(--panel-elevated)] py-1 shadow-[var(--shadow-soft)]\">\n {mode.options.map((opt) => {\n const selected = opt.label === mode.label\n const OptIcon = opt.icon\n return (\n <button\n key={opt.id}\n type=\"button\"\n onClick={(e) => {\n e.currentTarget.closest('details')?.removeAttribute('open')\n if (!selected) mode.onSelect?.(opt.id)\n }}\n aria-current={selected ? 'true' : undefined}\n className={[\n 'flex w-full items-center gap-2.5 px-3 py-2 text-left text-sm',\n selected\n ? 'font-semibold text-[color:var(--color-race-red)]'\n : 'font-medium text-[color:var(--foreground)] hover:bg-[color:var(--panel)]',\n ].join(' ')}\n >\n {OptIcon ? <OptIcon size={15} className=\"shrink-0 text-current\" /> : null}\n {opt.label}\n </button>\n )\n })}\n </div>\n </details>\n ) : (\n <button\n type=\"button\"\n className=\"flex w-full items-center justify-between gap-2 rounded-md bg-[color:var(--color-race-red)] px-2.5 py-2 text-white shadow-sm\"\n >\n <span className=\"flex items-center gap-2.5\">\n {ModeIcon ? <ModeIcon size={16} className=\"shrink-0\" /> : null}\n <span className=\"text-sm font-semibold tracking-[-0.01em]\">{mode.label}</span>\n </span>\n <ChevronDown />\n </button>\n )}\n </div>\n ) : null}\n\n {/* Nav list */}\n <nav className=\"flex flex-col gap-1\">\n {nav.groupLabel ? (\n <p className=\"px-2 pb-1 text-[11px] font-semibold uppercase tracking-[0.08em] text-[color:var(--muted)]\">\n {nav.groupLabel}\n </p>\n ) : null}\n {nav.items.map((item, idx) => {\n // Expandable group: renders a toggle header + collapsible children.\n if (item.children && item.children.length > 0) {\n const key = groupKeyOf(item, idx)\n const selfActive = item.href ? activeFn(pathname, item.href) : false\n const parentActive = selfActive || hasActiveChild(item, pathname, activeFn)\n return (\n <NavGroup\n key={key}\n item={item}\n active={parentActive}\n open={openGroup === key}\n onToggle={() => toggleGroup(key)}\n pathname={pathname}\n activeFn={activeFn}\n Link={Link}\n />\n )\n }\n const active = item.href ? activeFn(pathname, item.href) : false\n return (\n <NavRow\n key={item.href ?? `nav-${idx}-${item.label}`}\n item={item}\n active={active}\n Link={Link}\n />\n )\n })}\n </nav>\n </div>\n\n {/* Footer — pipe-separated links + commit/version string */}\n {footer ? (\n <div className=\"flex-shrink-0 border-t border-[color:var(--line)] px-4 py-3\">\n {footer.links && footer.links.length > 0 ? (\n <div className=\"flex flex-wrap items-center justify-center gap-1.5 text-xs\">\n {footer.links.map((l, idx) => (\n <span key={l.label} className=\"inline-flex items-center gap-1.5\">\n {idx > 0 ? <span className=\"text-[color:var(--muted)]\">|</span> : null}\n <a\n href={safeHref(l.href)}\n className=\"font-medium text-[color:var(--foreground)] opacity-80 hover:opacity-100 hover:underline\"\n >\n {l.label}\n </a>\n </span>\n ))}\n </div>\n ) : null}\n {footer.envLabel ? (\n <div className=\"mt-1.5 flex flex-col items-center gap-0.5 font-[family-name:var(--font-plex-mono)] text-[10px] text-[color:var(--muted)]\">\n {/* Row 1: env chip | commit | version */}\n <div className=\"flex items-center gap-1.5\">\n <span\n className={[\n 'rounded-md px-1.5 py-0.5 text-[10px] font-semibold',\n envChipClasses(footer.envLabel),\n ].join(' ')}\n >\n {footer.envLabel}\n </span>\n {footer.commit ? (\n <>\n <span className=\"text-[color:var(--muted)]\">|</span>\n <span>{footer.commit.slice(-4)}</span>\n </>\n ) : null}\n {footer.version ? (\n <>\n <span className=\"text-[color:var(--muted)]\">|</span>\n <span>v{footer.version}</span>\n </>\n ) : null}\n </div>\n {/* Row 2: date | author (only when supplied) */}\n {footer.commitDate || footer.commitAuthor ? (\n <div className=\"flex items-center gap-1.5\">\n {footer.commitDate ? (\n <span>\n {new Date(footer.commitDate).toLocaleDateString(undefined, {\n month: 'short',\n day: 'numeric',\n })}\n </span>\n ) : null}\n {footer.commitDate && footer.commitAuthor ? (\n <span className=\"text-[color:var(--muted)]\">|</span>\n ) : null}\n {footer.commitAuthor ? (\n <span>{footer.commitAuthor.split(/\\s+/)[0]}</span>\n ) : null}\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n ) : null}\n </aside>\n )\n}\n\n// Inline chevron-down (mirrors lucide `ChevronDown`) — no icon dependency.\n// Callers may override `className` to add a rotation (used by expandable groups).\nfunction ChevronDown({ className }: { className?: string } = {}) {\n return (\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className ?? 'shrink-0 opacity-80'}\n aria-hidden=\"true\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n )\n}\n\n// A single sidebar nav row. Renders as a routed <Link> (href) or a <button>\n// (onClick), styled identically. Inactive rows animate a left→right gradient\n// sweep on hover (matching the main app); active rows keep solid race-red.\n//\n// `variant=\"sub\"` renders the smaller child rows inside an expanded group: a\n// tighter row whose ACTIVE state is a lighter elevated surface with race-red\n// text (not a solid-red fill — that stays reserved for top-level/parent rows,\n// exactly as the main VRM app's Chakra sidebar treats active sub-items).\n// Specs race-red ramp (hover → active primary).\nconst NAV_HOVER_GRADIENT = 'linear-gradient(90deg,#EA4751 0%,#E63946 100%)'\n\nfunction NavRow({\n item,\n active,\n Link,\n variant = 'top',\n}: {\n item: NavItem\n active: boolean\n Link: NavLinkComponent\n variant?: 'top' | 'sub'\n}) {\n const Icon = item.icon\n const isSub = variant === 'sub'\n const activeClasses = isSub\n ? 'bg-[color:var(--panel-elevated)] text-[color:var(--color-race-red)] shadow-sm'\n : 'bg-[color:var(--color-race-red)] text-white shadow-sm'\n const wrapperClasses = [\n 'group relative block overflow-hidden rounded-md transition',\n active ? activeClasses : 'text-[color:var(--muted)] hover:text-white',\n ].join(' ')\n\n const rowPadding = isSub ? 'px-3 py-1.5 text-[13px]' : 'px-3 py-2 text-sm'\n const iconSize = isSub ? 16 : 18\n // Top-level active rows use white glyphs on the red fill; sub-item active\n // rows inherit the race-red text color via `text-current`.\n const iconClass = active && !isSub ? 'text-white' : 'text-current'\n\n const inner = (\n <>\n {!active ? (\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-y-0 left-0 w-0 transition-[width] duration-300 group-hover:w-full\"\n style={{ background: NAV_HOVER_GRADIENT }}\n />\n ) : null}\n <span className={`relative z-10 flex items-center gap-3 font-semibold ${rowPadding}`}>\n {Icon ? <Icon size={iconSize} className={iconClass} /> : null}\n {item.label}\n </span>\n </>\n )\n\n // A gated row renders as a non-interactive span: dimmed, not focusable, and\n // carrying its reason as a tooltip. Same treatment a disabled NavTab gets, so\n // gating reads identically in the sidebar and in a tab strip.\n if (item.disabled) {\n return (\n <span\n aria-disabled=\"true\"\n title={item.disabledTitle}\n className={`${wrapperClasses} cursor-not-allowed opacity-50`}\n >\n {inner}\n </span>\n )\n }\n\n if (item.onClick && !item.href) {\n return (\n <button type=\"button\" onClick={item.onClick} className={`w-full text-left ${wrapperClasses}`}>\n {inner}\n </button>\n )\n }\n\n return (\n <Link\n href={item.href ?? '#'}\n aria-current={active ? 'page' : undefined}\n className={wrapperClasses}\n >\n {inner}\n </Link>\n )\n}\n\n// An expandable nav GROUP: a toggle header + a collapsible list of child rows.\n// Faithful twin of the main VRM app's Chakra accordion (Sidebar.tsx /\n// NavItem.tsx):\n// - Clicking the header toggles the children — it never navigates, even when\n// the group carries an `href`.\n// - A right-aligned chevron rotates 180° when open.\n// - The header goes solid race-red (white text) when the group owns the active\n// route (its own href OR any child), matching top-level active rows; when\n// merely open it lifts onto the `--panel` surface; otherwise it's a muted row\n// with the same left→right gradient hover sweep as every other nav row.\n// - Children sit on the lighter `--panel` surface, indented and rounded, each\n// rendered through the SAME injected LinkComponent (or as a button for\n// `onClick` children) via <NavRow variant=\"sub\" />.\nfunction NavGroup({\n item,\n active,\n open,\n onToggle,\n pathname,\n activeFn,\n Link,\n}: {\n item: NavItem\n active: boolean\n open: boolean\n onToggle: () => void\n pathname: string\n activeFn: (pathname: string, href: string) => boolean\n Link: NavLinkComponent\n}) {\n const Icon = item.icon\n const headerClasses = [\n 'group relative block w-full overflow-hidden text-left transition',\n open ? 'rounded-t-md' : 'rounded-md',\n active\n ? 'bg-[color:var(--color-race-red)] text-white shadow-sm'\n : open\n ? 'bg-[color:var(--panel)] text-[color:var(--foreground)]'\n : 'text-[color:var(--muted)] hover:text-white',\n ].join(' ')\n\n return (\n <div>\n <button\n type=\"button\"\n // A group header ALWAYS toggles. When the item also carries its own\n // onClick, that runs too — so a parent can navigate to its section\n // dashboard (e.g. Email Broadcast → /relationship/email/dashboard) and\n // expand in one click. Existing apps pass no parent onClick, so their\n // behavior is unchanged (shell-nav-handoff §2).\n onClick={() => {\n onToggle()\n item.onClick?.()\n }}\n aria-expanded={open}\n className={headerClasses}\n >\n {/* Hover sweep only when CLOSED and inactive — an expanded group keeps\n its raised/selected background intact through hover and hover-out. */}\n {!active && !open ? (\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-y-0 left-0 w-0 transition-[width] duration-300 group-hover:w-full\"\n style={{ background: NAV_HOVER_GRADIENT }}\n />\n ) : null}\n <span className=\"relative z-10 flex items-center gap-3 px-3 py-2 text-sm font-semibold\">\n {Icon ? (\n <Icon size={18} className={active ? 'text-white' : 'text-current'} />\n ) : null}\n <span className=\"flex-1\">{item.label}</span>\n <ChevronDown\n className={[\n 'shrink-0 opacity-80 transition-transform duration-200',\n open ? 'rotate-180' : '',\n ].join(' ')}\n />\n </span>\n </button>\n\n {open ? (\n <div className=\"overflow-hidden rounded-b-md bg-[color:var(--panel)] p-1\">\n <div className=\"flex flex-col gap-0.5\">\n {item.children!.map((child, i) => {\n const childActive = child.href ? activeFn(pathname, child.href) : false\n // Depth-3: a child that carries its own children renders as a\n // NESTED collapsible sub-group (e.g. Organization Settings →\n // Subscription & Billing → Wallet). Deeper levels are not\n // rendered — three is the platform maximum.\n if (child.children && child.children.length > 0) {\n return (\n <NavSubGroup\n key={child.href ?? `subgrp-${i}-${child.label}`}\n item={child}\n pathname={pathname}\n activeFn={activeFn}\n Link={Link}\n />\n )\n }\n return (\n <NavRow\n key={child.href ?? `sub-${i}-${child.label}`}\n item={child}\n active={childActive}\n Link={Link}\n variant=\"sub\"\n />\n )\n })}\n </div>\n </div>\n ) : null}\n </div>\n )\n}\n\n// A second-level group INSIDE an expanded group — the depth-3 renderer\n// (Reference/UI-Platform: sub-sub items). Auto-expands when it owns the active\n// route; otherwise toggles locally. Grandchildren render as further-indented\n// sub rows on the same panel surface.\nfunction NavSubGroup({\n item,\n pathname,\n activeFn,\n Link,\n}: {\n item: NavItem\n pathname: string\n activeFn: (pathname: string, href: string) => boolean\n Link: NavLinkComponent\n}) {\n const ownsActive =\n (item.href ? activeFn(pathname, item.href) : false) ||\n (item.children ?? []).some((c) => (c.href ? activeFn(pathname, c.href) : false))\n const [open, setOpen] = useState(ownsActive)\n useEffect(() => {\n if (ownsActive) setOpen(true)\n }, [ownsActive])\n const Icon = item.icon\n\n return (\n <div>\n <button\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n aria-expanded={open}\n className={[\n 'flex w-full items-center gap-2.5 rounded px-3 py-1.5 text-left text-[13px] font-medium transition',\n ownsActive\n ? 'text-[color:var(--color-race-red)]'\n : 'text-[color:var(--muted)] hover:bg-[color:var(--panel-elevated)] hover:text-[color:var(--foreground)]',\n ].join(' ')}\n >\n {Icon ? <Icon size={15} className=\"shrink-0 text-current\" /> : null}\n <span className=\"flex-1\">{item.label}</span>\n <ChevronDown\n className={[\n 'shrink-0 opacity-70 transition-transform duration-200',\n open ? 'rotate-180' : '',\n ].join(' ')}\n />\n </button>\n {open ? (\n <div className=\"ml-4 flex flex-col gap-0.5 border-l border-[color:var(--line)] pl-2\">\n {item.children!.map((leaf, i) => (\n <NavRow\n key={leaf.href ?? `subsub-${i}-${leaf.label}`}\n item={leaf}\n active={leaf.href ? activeFn(pathname, leaf.href) : false}\n Link={Link}\n variant=\"sub\"\n />\n ))}\n </div>\n ) : null}\n </div>\n )\n}\n\n// Right-aligned copy affordance for the org id, shown beside the \"Organization\"\n// label. Copies the full id and briefly swaps its text to \"Copied\".\nfunction OrgIdCopyButton({ id }: { id: string }) {\n const [copied, setCopied] = useState(false)\n return (\n <button\n type=\"button\"\n onClick={() => {\n try {\n void navigator.clipboard?.writeText(id)\n } catch {\n /* clipboard unavailable — ignore */\n }\n setCopied(true)\n setTimeout(() => setCopied(false), 1500)\n }}\n title=\"Copy organization id\"\n className=\"rounded px-1 text-[11px] text-[color:var(--muted)] hover:bg-[color:var(--panel)]\"\n >\n {copied ? 'Copied' : `...${id.slice(-8)}`}\n </button>\n )\n}\n\n// ---------------------------------------------------------------------------\n\nexport type NavUser = {\n name: string | null\n email?: string | null\n /** Profile PHOTO url — highest-precedence avatar source. */\n avatarUrl?: string | null\n /** Memoji url — used when no photo is set; falls back to initials. */\n memojiUrl?: string | null\n tier?: string | null\n role?: string | null\n}\n\nexport type NavTopBarAction = {\n key: string\n /**\n * Canonical top-bar slot. When set, the glyph is sourced by NAME from the\n * Brand API via `--topbar-icon-<slot>`; `icon` becomes the fallback used\n * until the runtime Brand stylesheet lands (or when the token is unset).\n */\n slot?: TopBarIconSlot\n icon: NavIcon\n label: string\n onClick?: () => void\n href?: string\n badge?: number | null\n tone?: 'default' | 'warning' | 'danger'\n /** Tooltip body shown under the icon (label is the tooltip title). */\n description?: string\n}\n\nexport type NavLinkedAccount = {\n id: string\n name: string | null\n email?: string | null\n avatarUrl?: string | null\n active?: boolean\n}\n\nexport type NavRoleBadge = {\n role: string\n orgName?: string | null\n}\n\n/**\n * The My Account menu (avatar dropdown) — mirrors the main VRM app's user\n * menu: My Profile / Organization Settings links, a ROLES & ORGANIZATIONS\n * section, an ACCOUNTS switcher, an optional theme control, then Sign out.\n * Every section renders only when its data is supplied.\n */\nexport type NavUserMenu = {\n myProfileHref?: string\n organizationSettingsHref?: string\n roles?: NavRoleBadge[]\n accounts?: NavLinkedAccount[]\n onSwitchAccount?: (id: string) => void\n onRemoveAccount?: (id: string) => void\n addAccountHref?: string\n onAddAccount?: () => void\n /** Theme preference segmented control (Light / System / Dark). */\n theme?: {\n value: ThemePreference\n onChange: (next: ThemePreference) => void\n }\n}\n\nexport type NavBreadcrumb = {\n label: string\n href?: string\n}\n\nexport type NavTopBarProps = {\n title: string\n subtitle?: string\n /**\n * Breadcrumb trail rendered UNDER the page title (Reference/UI-Platform:\n * every page and sub-page/tab shows its location). Last crumb = current\n * location (non-link); earlier crumbs may carry hrefs.\n */\n breadcrumbs?: NavBreadcrumb[]\n user?: NavUser | null\n userMenu?: NavUserMenu\n onSignOut?: () => void\n /**\n * Structured icon-button action cluster (32×32 circular buttons with optional\n * count badges), rendered before the `actions` slot. Matches the main app's\n * topbar action icons.\n */\n actionsList?: NavTopBarAction[]\n /** App-specific action cluster rendered left of the theme toggle. */\n actions?: ReactNode\n /** Theme toggle slot (injected so this package needs no theme dependency). */\n themeToggle?: ReactNode\n}\n\nexport function NavTopBar({\n title,\n subtitle,\n breadcrumbs,\n user,\n userMenu,\n onSignOut,\n actionsList,\n actions,\n themeToggle,\n}: NavTopBarProps) {\n // Real name = anything that isn't empty and isn't an email address. The\n // trigger shows \"First L.\" — never the email on both lines.\n const rawName = user?.name?.trim() || ''\n const hasRealName = rawName.length > 0 && !rawName.includes('@')\n const displayName = hasRealName ? formatFirstLast(rawName) : (user?.email ?? 'Signed in')\n const initials = (hasRealName ? rawName : (user?.email ?? 'P')).slice(0, 2).toUpperCase()\n const secondary = hasRealName\n ? user?.email || [user?.tier, user?.role].filter(Boolean).join(' · ') || 'member'\n : [user?.tier, user?.role].filter(Boolean).join(' · ') || 'member'\n return (\n <header className=\"sticky top-0 z-20 flex h-20 items-center justify-between gap-4 border-b border-[color:var(--line)] bg-[color:var(--panel)] px-4 backdrop-blur-xl\">\n <div className=\"min-w-0\">\n <h1\n className=\"truncate text-lg font-bold tracking-[-0.01em] text-[color:var(--foreground)]\"\n data-display=\"true\"\n >\n {title}\n </h1>\n {breadcrumbs && breadcrumbs.length > 0 ? (\n <nav aria-label=\"Breadcrumb\" className=\"flex min-w-0 items-center gap-1.5 text-sm text-[color:var(--muted)]\">\n {breadcrumbs.map((b, i) => {\n const last = i === breadcrumbs.length - 1\n return (\n <span key={`${b.label}-${i}`} className=\"flex min-w-0 items-center gap-1.5\">\n {i > 0 ? (\n <span aria-hidden className=\"text-[color:var(--muted)] opacity-60\">\n ›\n </span>\n ) : null}\n {b.href && !last ? (\n <a\n href={safeHref(b.href)}\n className=\"truncate hover:text-[color:var(--foreground)] hover:underline\"\n >\n {b.label}\n </a>\n ) : (\n <span\n aria-current={last ? 'page' : undefined}\n className={['truncate', last ? 'text-[color:var(--foreground)]' : ''].join(' ')}\n >\n {b.label}\n </span>\n )}\n </span>\n )\n })}\n </nav>\n ) : subtitle ? (\n <p className=\"truncate text-sm text-[color:var(--muted)]\">{subtitle}</p>\n ) : null}\n </div>\n\n <div className=\"relative flex shrink-0 items-center gap-[var(--topbar-icon-gap,8px)]\">\n {actionsList && actionsList.length > 0\n ? actionsList.map((action) => (\n <NavTopBarActionButton key={action.key} action={action} />\n ))\n : null}\n {actions}\n {themeToggle}\n\n {/* My Account menu — avatar + name/email + chevron trigger, with the\n full account dropdown (profile/org links, roles, account switcher,\n appearance, sign out). Native <details> popover. */}\n <details data-nav-details className=\"group/acct relative\">\n <summary className=\"group/tbtip relative flex cursor-pointer list-none items-center gap-2.5 rounded-full py-1 pl-1 pr-2 transition hover:bg-[color:var(--panel-elevated)] [&::-webkit-details-marker]:hidden\">\n {/* Same circle size as every top-bar icon button (one shared var).\n Avatar precedence: photo → memoji → initials. */}\n <span className=\"flex h-[var(--topbar-icon-button-size,32px)] w-[var(--topbar-icon-button-size,32px)] items-center justify-center overflow-hidden rounded-full bg-[color:var(--color-race-red)] text-xs font-bold text-white\">\n {user?.avatarUrl || user?.memojiUrl ? (\n <img\n src={(user.avatarUrl || user.memojiUrl) as string}\n alt=\"\"\n className=\"h-full w-full object-cover\"\n />\n ) : (\n initials\n )}\n </span>\n <span className=\"hidden flex-col leading-tight md:flex\">\n <span className=\"text-sm font-semibold text-[color:var(--foreground)]\">\n {displayName}\n </span>\n <span className=\"text-xs text-[color:var(--muted)]\">{secondary}</span>\n </span>\n <ChevronDown />\n <span className=\"group-open/acct:hidden\">\n <TopBarTooltip\n title=\"My Account\"\n description={\n <>\n {hasRealName ? rawName : user?.email ?? 'Signed in'}\n {user?.email ? (\n <>\n <br />\n {user.email}\n </>\n ) : null}\n <br />\n Profile, organizations, appearance and sign out.\n </>\n }\n />\n </span>\n </summary>\n <div className=\"absolute right-0 z-30 mt-2 w-72 rounded-xl border border-[color:var(--line)] bg-[color:var(--panel-elevated)] py-1 shadow-[var(--shadow-soft)]\">\n <TopBarPanelArrow />\n {userMenu?.myProfileHref ? (\n <a\n href={safeHref(userMenu.myProfileHref)}\n className=\"flex w-full items-center gap-2.5 px-4 py-2.5 text-left text-sm font-medium text-[color:var(--foreground)] hover:bg-[color:var(--panel)]\"\n >\n <ProfileIcon />\n My Profile\n </a>\n ) : null}\n {userMenu?.organizationSettingsHref ? (\n <a\n href={safeHref(userMenu.organizationSettingsHref)}\n className=\"flex w-full items-center gap-2.5 border-t border-[color:var(--line)] px-4 py-2.5 text-left text-sm font-medium text-[color:var(--foreground)] hover:bg-[color:var(--panel)]\"\n >\n <BriefcaseIcon />\n Organization Settings\n </a>\n ) : null}\n\n {userMenu?.roles && userMenu.roles.length > 0 ? (\n <div className=\"border-t border-[color:var(--line)] px-4 py-3\">\n <p className=\"mb-2 text-[11px] font-semibold uppercase tracking-[0.08em] text-[color:var(--muted)]\">\n Roles &amp; Organizations\n </p>\n <ul className=\"flex flex-col gap-1.5\">\n {userMenu.roles.map((r, i) => (\n <li key={`${r.role}-${i}`} className=\"flex flex-wrap items-center gap-1.5 text-sm\">\n <span className=\"rounded-md bg-[color:var(--panel)] px-2 py-0.5 text-xs font-bold uppercase tracking-wide text-[color:var(--foreground)]\">\n {r.role}\n </span>\n {r.orgName ? (\n <span className=\"text-[color:var(--muted)]\">in {r.orgName}</span>\n ) : null}\n </li>\n ))}\n </ul>\n </div>\n ) : null}\n\n {userMenu?.accounts && userMenu.accounts.length > 0 ? (\n <div className=\"border-t border-[color:var(--line)] px-4 py-3\">\n <p className=\"mb-2 text-[11px] font-semibold uppercase tracking-[0.08em] text-[color:var(--muted)]\">\n Accounts\n </p>\n <ul className=\"flex flex-col gap-1\">\n {userMenu.accounts.map((a) => (\n <li key={a.id} className=\"flex items-center gap-2.5\">\n <button\n type=\"button\"\n onClick={() => {\n if (!a.active) userMenu.onSwitchAccount?.(a.id)\n }}\n className=\"flex min-w-0 flex-1 items-center gap-2.5 rounded-lg px-1 py-1 text-left hover:bg-[color:var(--panel)]\"\n >\n <span className=\"flex h-8 w-8 shrink-0 items-center justify-center overflow-hidden rounded-full bg-[color:var(--color-race-red)] text-[11px] font-bold text-white\">\n {a.avatarUrl ? (\n <img src={a.avatarUrl} alt=\"\" className=\"h-full w-full object-cover\" />\n ) : (\n (a.name ?? a.email ?? '?').slice(0, 2).toUpperCase()\n )}\n </span>\n <span className=\"flex min-w-0 flex-col leading-tight\">\n <span\n className={[\n 'truncate text-sm font-semibold',\n a.active\n ? 'text-[color:var(--color-race-red)]'\n : 'text-[color:var(--foreground)]',\n ].join(' ')}\n >\n {a.name ?? a.email ?? a.id.slice(0, 8)}\n </span>\n <span className=\"truncate text-xs text-[color:var(--muted)]\">\n {a.active ? 'Active' : a.email ?? ''}\n </span>\n </span>\n </button>\n {!a.active && userMenu.onRemoveAccount ? (\n <button\n type=\"button\"\n aria-label={`Remove ${a.name ?? a.email ?? 'account'}`}\n onClick={() => userMenu.onRemoveAccount?.(a.id)}\n className=\"shrink-0 rounded p-1 text-[color:var(--color-race-red)] hover:bg-[color:var(--panel)]\"\n >\n <TrashIcon />\n </button>\n ) : null}\n </li>\n ))}\n </ul>\n {userMenu.addAccountHref || userMenu.onAddAccount ? (\n userMenu.addAccountHref ? (\n <a\n href={safeHref(userMenu.addAccountHref)}\n className=\"mt-1.5 flex items-center gap-2.5 rounded-lg px-1 py-1.5 text-sm font-semibold text-[color:var(--color-race-red)] hover:bg-[color:var(--panel)]\"\n >\n <AddUserIcon />\n Add Account\n </a>\n ) : (\n <button\n type=\"button\"\n onClick={userMenu.onAddAccount}\n className=\"mt-1.5 flex w-full items-center gap-2.5 rounded-lg px-1 py-1.5 text-left text-sm font-semibold text-[color:var(--color-race-red)] hover:bg-[color:var(--panel)]\"\n >\n <AddUserIcon />\n Add Account\n </button>\n )\n ) : null}\n </div>\n ) : null}\n\n {userMenu?.theme ? (\n <div className=\"border-t border-[color:var(--line)]\">\n <NavThemeControl\n value={userMenu.theme.value}\n onChange={userMenu.theme.onChange}\n />\n </div>\n ) : null}\n\n {onSignOut ? (\n <button\n type=\"button\"\n onClick={onSignOut}\n className=\"flex w-full items-center gap-2.5 border-t border-[color:var(--line)] px-4 py-2.5 text-left text-sm font-medium text-[color:var(--foreground)] hover:bg-[color:var(--panel)] hover:text-[color:var(--color-race-red)]\"\n >\n <SignOutIcon />\n Sign out\n </button>\n ) : null}\n </div>\n </details>\n {!hasRealName && user ? (\n <NamePromptBubble profileHref={userMenu?.myProfileHref} />\n ) : null}\n </div>\n </header>\n )\n}\n\n/**\n * Floating, per-session-dismissable bubble under the account trigger that\n * prompts a user with no display name to set their first + last name. The\n * arrow points up at the avatar; dismissal is remembered in sessionStorage\n * until they actually set a name.\n */\nfunction NamePromptBubble({ profileHref }: { profileHref?: string }) {\n const KEY = 'politogy_name_prompt_dismissed'\n const [dismissed, setDismissed] = useState(true)\n useEffect(() => {\n try {\n setDismissed(sessionStorage.getItem(KEY) === '1')\n } catch {\n setDismissed(false)\n }\n }, [])\n if (dismissed) return null\n return (\n <div className=\"absolute right-4 top-full z-30 mt-2 w-64 rounded-xl border border-[color:var(--line)] bg-[color:var(--panel-elevated)] p-3 shadow-[var(--shadow-soft)]\">\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 <p className=\"text-sm font-semibold text-[color:var(--foreground)]\">\n Add your name\n </p>\n <p className=\"mt-0.5 text-xs leading-snug text-[color:var(--muted)]\">\n Set your first and last name so teammates see you — not your email.\n </p>\n <div className=\"mt-2 flex items-center gap-2\">\n {profileHref ? (\n <a\n href={safeHref(profileHref)}\n className=\"rounded-full bg-[color:var(--color-race-red)] px-3 py-1 text-xs font-semibold text-white hover:opacity-90\"\n >\n Set name\n </a>\n ) : null}\n <button\n type=\"button\"\n onClick={() => {\n setDismissed(true)\n try {\n sessionStorage.setItem(KEY, '1')\n } catch {\n /* session-only dismiss */\n }\n }}\n className=\"rounded-full border border-[color:var(--line)] px-3 py-1 text-xs font-semibold text-[color:var(--foreground)] hover:bg-[color:var(--panel)]\"\n >\n Dismiss\n </button>\n </div>\n </div>\n )\n}\n\n/** \"Spencer Hill\" → \"Spencer H.\" — first name + last initial. */\nfunction formatFirstLast(name: string): string {\n const parts = name.split(/\\s+/).filter(Boolean)\n if (parts.length === 1) return parts[0]\n return `${parts[0]} ${parts[parts.length - 1][0].toUpperCase()}.`\n}\n\nfunction ProfileIcon() {\n return (\n <svg width={16} height={16} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\" />\n <circle cx=\"12\" cy=\"7\" r=\"4\" />\n </svg>\n )\n}\n\nfunction BriefcaseIcon() {\n return (\n <svg width={16} height={16} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <rect x=\"2\" y=\"7\" width=\"20\" height=\"14\" rx=\"2\" ry=\"2\" />\n <path d=\"M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16\" />\n </svg>\n )\n}\n\nfunction TrashIcon() {\n return (\n <svg width={14} height={14} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <polyline points=\"3 6 5 6 21 6\" />\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n </svg>\n )\n}\n\nfunction AddUserIcon() {\n return (\n <svg width={16} height={16} viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d=\"M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\" />\n <circle cx=\"8.5\" cy=\"7\" r=\"4\" />\n <line x1=\"20\" y1=\"8\" x2=\"20\" y2=\"14\" />\n <line x1=\"23\" y1=\"11\" x2=\"17\" y2=\"11\" />\n </svg>\n )\n}\n\n// Inline log-out glyph (mirrors lucide `LogOut`) to avoid an icon dependency.\nfunction SignOutIcon() {\n return (\n <svg\n width={15}\n height={15}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" />\n <polyline points=\"16 17 21 12 16 7\" />\n <line x1=\"21\" x2=\"9\" y1=\"12\" y2=\"12\" />\n </svg>\n )\n}\n\n// A single 32×32 circular icon button for the top bar's structured action list.\n// Renders an <a> when `href` is present (external links open in a new tab),\n// otherwise a <button>. Shows a red count badge when `badge > 0`.\nfunction NavTopBarActionButton({ action }: { action: NavTopBarAction }) {\n const Icon = action.icon\n // Universal treatment (Global Rules v9): size, color and hover are a single\n // shared value across every top-bar slot — only the glyph varies per slot.\n // Tone is a semantic state, not a bespoke per-slot style. The class comes\n // from the ONE shared builder in chromeActions so the data-backed widgets\n // and this structured list can never drift apart.\n const className = topBarIconButtonClass(action.tone ?? 'default')\n\n // Per-slot glyph from Brand; `icon` is the fallback until the token resolves.\n // Brand emits Feather/Lucide glyph NAMES, not asset paths.\n const glyphName = useTopBarIconSlotGlyph(action.slot ?? 'apps')\n const BrandGlyph = action.slot ? resolveBrandGlyph(glyphName) : null\n const Glyph = BrandGlyph ?? Icon\n\n const content = (\n <>\n <Glyph size={20} className=\"text-current\" />\n {typeof action.badge === 'number' && action.badge > 0 ? (\n <span className=\"absolute -top-1 -right-1 flex h-4 min-w-4 items-center justify-center rounded-full bg-[color:var(--color-race-red)] px-1 text-[10px] text-white\">\n {action.badge}\n </span>\n ) : null}\n <TopBarTooltip title={action.label} description={action.description} />\n </>\n )\n\n const isExternal = action.href ? /^https?:\\/\\//.test(action.href) : false\n\n if (action.href) {\n return (\n <a\n href={safeHref(action.href)}\n aria-label={action.label}\n className={className}\n {...(isExternal ? { target: '_blank', rel: 'noreferrer' } : {})}\n >\n {content}\n </a>\n )\n }\n\n return (\n <button\n type=\"button\"\n onClick={action.onClick}\n aria-label={action.label}\n className={className}\n >\n {content}\n </button>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Icon-only tab strip — the standard secondary navigation the three Next.js\n// worker apps (Forms / Surveys / Polls) render below the top bar: a horizontal\n// row of icon-only tabs where the SELECTED tab merges into the content panel\n// below it (top/left/right border, no bottom border, sharing --tab-content-bg).\n//\n// A faithful twin of the hand-rolled `.tabstrip`/`.tab-strip` markup those apps\n// carried, promoted into the shell so every app renders the same accessible,\n// token-driven strip. All geometry is driven by the Brand `--tab-*` CSS vars\n// shipped in chrome.css (with literal fallbacks so the strip still renders in\n// an app that hasn't loaded the runtime tokens link yet):\n// --tab-height (row height) · --tab-icon-size (glyph) · --tab-radius (top\n// corners) · --tab-gap (between tabs) · --tab-content-bg (selected + panel\n// surface) · --tab-unselected-opacity (dimmed inactive tabs, default 0.6).\n// ---------------------------------------------------------------------------\n\nexport type NavTab = {\n /** Stable identity (used as the React key). */\n key: string\n /** Accessible name — becomes both the `title` tooltip and `aria-label`. */\n label: string\n icon: NavIcon\n /** Route to link to (rendered through `linkComponent`). */\n href?: string\n /** Click handler — rendered as a `<button>` when there's no `href`. */\n onSelect?: () => void\n /** Whether this tab is the active one (drives the merged-panel geometry). */\n selected?: boolean\n /**\n * Non-interactive, dimmed tab (e.g. Surveys' Canvas/Results before a survey\n * is chosen). Renders a non-navigating span; `disabledTitle` overrides the\n * tooltip to explain why (falls back to `label`).\n */\n disabled?: boolean\n disabledTitle?: string\n}\n\nexport type NavTabStripProps = {\n tabs: NavTab[]\n /** Accessible name for the tablist. */\n 'aria-label'?: string\n /** Routing primitive for `href` tabs (Next `<Link>`, etc). Defaults to <a>. */\n linkComponent?: NavLinkComponent\n /** Extra classes on the tablist container. */\n className?: string\n /**\n * Optional content panel rendered directly below the strip. When supplied it\n * renders on the shared `--tab-content-bg` surface with a square top-left\n * corner so the selected tab visually merges into it. Omit to render only the\n * strip and compose the panel yourself.\n */\n children?: ReactNode\n}\n\n/** Default icon glyph size — mirrors the `--tab-icon-size` token default. */\nconst TAB_ICON_SIZE = 18\n\nfunction NavTabButton({\n tab,\n Link,\n}: {\n tab: NavTab\n Link: NavLinkComponent\n}) {\n const { label, icon: Icon, href, onSelect, selected, disabled, disabledTitle } = tab\n const title = disabled ? disabledTitle ?? label : label\n\n // Base geometry shared by every state. Selected tabs sit above the content\n // panel (`z-10`) so their missing bottom border merges cleanly into it.\n const base =\n 'inline-flex shrink-0 items-center justify-center border border-b-0 transition-opacity'\n const stateClass = disabled\n ? 'cursor-not-allowed border-transparent opacity-40'\n : selected\n ? 'relative z-10 opacity-100 border-[color:var(--line)]'\n : 'border-transparent opacity-[var(--tab-unselected-opacity,0.6)] hover:opacity-90'\n const className = `${base} ${stateClass}`\n\n const style: CSSProperties = {\n height: 'var(--tab-height, 44px)',\n width: 'var(--tab-width, 3rem)',\n color: 'var(--foreground)',\n borderTopLeftRadius: 'var(--tab-radius, 12px)',\n borderTopRightRadius: 'var(--tab-radius, 12px)',\n ...(selected ? { background: 'var(--tab-content-bg)' } : null),\n }\n\n const glyph = <Icon size={TAB_ICON_SIZE} className=\"text-current\" />\n\n // Disabled: non-navigating span, still exposed as a tab for AT.\n if (disabled) {\n return (\n <span\n role=\"tab\"\n aria-selected={false}\n aria-disabled=\"true\"\n aria-label={label}\n title={title}\n className={className}\n style={style}\n >\n {glyph}\n </span>\n )\n }\n\n if (href) {\n return (\n <Link\n href={href}\n role=\"tab\"\n aria-selected={selected ? true : false}\n aria-label={label}\n title={title}\n className={className}\n style={style}\n >\n {glyph}\n </Link>\n )\n }\n\n return (\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={selected ? true : false}\n aria-label={label}\n title={title}\n onClick={onSelect}\n className={className}\n style={style}\n >\n {glyph}\n </button>\n )\n}\n\n/**\n * Icon-only, token-driven tab strip. Render it below `NavTopBar`; pass the\n * app's `Link` as `linkComponent` for `href` tabs. Supply `children` to get the\n * merged content panel, or omit it and compose your own panel on\n * `var(--tab-content-bg)`.\n */\nexport function NavTabStrip({\n tabs,\n 'aria-label': ariaLabel,\n linkComponent,\n className,\n children,\n}: NavTabStripProps) {\n const Link = linkComponent ?? DefaultLink\n return (\n <>\n <div\n role=\"tablist\"\n aria-label={ariaLabel}\n className={['flex items-end gap-[var(--tab-gap,8px)]', className]\n .filter(Boolean)\n .join(' ')}\n >\n {tabs.map((tab) => (\n <NavTabButton key={tab.key} tab={tab} Link={Link} />\n ))}\n </div>\n {children !== undefined ? (\n <div\n className=\"relative -mt-px border border-[color:var(--line)] p-5\"\n style={{\n background: 'var(--tab-content-bg)',\n borderTopLeftRadius: 0,\n borderTopRightRadius: 'var(--tab-radius, 12px)',\n borderBottomLeftRadius: 'var(--tab-radius, 12px)',\n borderBottomRightRadius: 'var(--tab-radius, 12px)',\n }}\n >\n {children}\n </div>\n ) : null}\n </>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Beta banner — a full-width amber NOTICE strip rendered directly below the top\n// bar (a semantic notice, not a chrome surface, so it keeps its amber hue in\n// both themes via the --beta-banner-* tokens in chrome.css). One line, centered,\n// with a bold + underlined link to the Beta Terms & Conditions.\n// ---------------------------------------------------------------------------\n\nconst BETA_BANNER_DEFAULTS = {\n text: 'Our product is in Beta. Thank you for participating in the Pilot Program. ',\n linkLabel: 'You can click here to see the Terms & Conditions for Beta users.',\n href: 'https://app.politogyvrm.com/beta-terms-and-conditions',\n} as const\n\nexport type NavBetaBannerProps = {\n /** Leading sentence(s) before the link. Defaults to the standard Beta copy. */\n text?: string\n /** Bold + underlined link label. Defaults to the standard Terms copy. */\n linkLabel?: string\n /** Terms & Conditions URL (opens in a new tab). Defaults to the app T&C page. */\n href?: string\n}\n\nexport function NavBetaBanner({ text, linkLabel, href }: NavBetaBannerProps) {\n const body = text ?? BETA_BANNER_DEFAULTS.text\n const label = linkLabel ?? BETA_BANNER_DEFAULTS.linkLabel\n const target = href ?? BETA_BANNER_DEFAULTS.href\n return (\n <div\n role=\"note\"\n className=\"w-full px-4 py-2 text-center text-sm\"\n style={{\n // Brand red fill, white text, no borders (HITL 2026-07-24). The\n // --beta-banner-* tokens still win when the Brand sheet emits them;\n // otherwise the banner takes the brand accent red.\n background: 'var(--beta-banner-bg, var(--color-accent, #E63946))',\n color: 'var(--beta-banner-text, #FFFFFF)',\n }}\n >\n <span>{body}</span>\n <a\n href={safeHref(target)}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"font-bold underline\"\n style={{ color: 'var(--beta-banner-text, #FFFFFF)' }}\n >\n {label}\n </a>\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n\nexport type NavAppShellProps = {\n sidebar: NavSidebarProps\n topBar: NavTopBarProps\n /**\n * When supplied, a full-width Beta notice strip renders directly below the top\n * bar. Presence of the prop enables it; all fields fall back to the standard\n * Beta copy + Terms & Conditions link.\n */\n betaBanner?: NavBetaBannerProps\n /**\n * How the content region wraps `children`.\n *\n * - `'padded'` (default, unchanged): `<main class=\"px-6 py-7\">` around a\n * `mx-auto max-w-7xl` container — what forms / surveys / polls / contacts\n * rely on.\n * - `'bare'`: render `children` directly, with no `<main>`, no gutter and no\n * max-width. For apps that already supply their own page container — VRM\n * wraps every page in the shell's `PageContainer`, which emits its OWN\n * `<main>` + `mx-auto max-w-*` + padding, so the default produced a NESTED\n * `<main>` (invalid HTML) and a doubled gutter on Org Settings, Email\n * Broadcast and SMS/MMS Blast (shell-nav-handoff §1).\n */\n contentWrapper?: 'padded' | 'bare'\n children: ReactNode\n}\n\n/**\n * Full chrome: branded left sidebar + sticky top navbar + scrollable content\n * region. Presentational only — wrap it in app-level auth/gating as needed.\n */\n/**\n * Closes any open chrome <details data-nav-details> (org switcher, mode\n * selector, My Account) when the pointer lands outside it or Escape is\n * pressed — dropdowns must deselect on outside click (HITL 2026-07-23).\n */\nfunction useCloseNavDetailsOnOutsideClick() {\n useEffect(() => {\n const close = (target: Node | null) => {\n document.querySelectorAll('details[data-nav-details][open]').forEach((d) => {\n if (!target || !d.contains(target)) d.removeAttribute('open')\n })\n }\n const onPointerDown = (e: MouseEvent) => close(e.target as Node)\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') close(null)\n }\n document.addEventListener('mousedown', onPointerDown)\n document.addEventListener('keydown', onKey)\n return () => {\n document.removeEventListener('mousedown', onPointerDown)\n document.removeEventListener('keydown', onKey)\n }\n }, [])\n}\n\nexport function NavAppShell({\n sidebar,\n topBar,\n betaBanner,\n contentWrapper = 'padded',\n children,\n}: NavAppShellProps) {\n useCloseNavDetailsOnOutsideClick()\n return (\n <div className=\"min-h-screen bg-[color:var(--background)] text-[color:var(--foreground)]\">\n <NavSidebar {...sidebar} />\n <div className=\"lg:pl-[240px]\">\n <NavTopBar {...topBar} />\n {betaBanner ? <NavBetaBanner {...betaBanner} /> : null}\n {contentWrapper === 'bare' ? (\n children\n ) : (\n <main className=\"px-6 py-7\">\n <div className=\"mx-auto max-w-7xl\">{children}</div>\n </main>\n )}\n </div>\n </div>\n )\n}\n\n// Canonical Politogy VRM menu — the standard nav structure every politogy app\n// renders, per operating Mode, with hooks for the app-owned \"Contacts\" item and\n// Support handler, plus the Campaign feature-availability config.\nexport {\n standardPolitogyNav,\n CAMPAIGN_FEATURE_AVAILABILITY,\n type StandardNavIconKey,\n type StandardNavOptions,\n type StandardNavMode,\n type CampaignFeatureAvailability,\n} from './standardNav'\n"]}