@the-portland-company/shell 0.16.2 → 0.16.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/topbarIconSlot.ts","../src/lib/brandGlyphs.tsx","../src/theme-preference.ts","../src/native/chromeActions.tsx","../src/native/standardNav.ts","../src/native/index.tsx"],"names":["useState","useEffect","FiBatteryCharging","FiBattery","FiZap","FiGrid","FiBell","FiAlertTriangle","FiAlertCircle","FiLifeBuoy","FiHelpCircle","FiMoon","FiSun","FiInfo","FiMail","FiMessageSquare","FiSettings","FiUser","jsxs","jsx","createContext","useContext","useRef","useCallback","Fragment","createPortal","useMemo"],"mappings":"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","file":"native.cjs","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","// Universal theme preference — the ONE cross-app contract.\n//\n// One theme choice (Light / Dark / System) follows the authenticated user\n// across every Politogy app + subdomain. Three layers cooperate:\n// 1. VRM Core `profiles.theme_preference` — source of truth, persisted via\n// the chrome API (`PATCH me/preferences { themePreference }`) and read\n// back from `GET me` (`themePreference`).\n// 2. `.politogyvrm.com` cookie `politogy_theme` — zero-flash pre-paint\n// vehicle that crosses subdomains (auth session cookies are host-only).\n// 3. localStorage `politogy_theme` — offline fallback store.\n//\n// Ported verbatim from contacts/apps/web/src/lib/theme.ts (the origin of the\n// contract) so every app runs the identical behavior from npm. This module is\n// server-safe (no 'use client'): layouts import THEME_PREPAINT_SCRIPT for the\n// pre-paint inline script. The client-side hook lives in ./native\n// (useThemePreference).\n\nexport type ThemePreference = 'light' | 'dark' | 'system'\n\n// Single converged key for BOTH the localStorage store and the\n// cross-subdomain cookie, so a choice in one app is the same key in the next.\nexport const THEME_STORAGE_KEY = 'politogy_theme'\nexport const THEME_COOKIE = 'politogy_theme'\n\nconst VALID: readonly ThemePreference[] = ['light', 'dark', 'system']\n\nexport function isThemePreference(v: unknown): v is ThemePreference {\n return typeof v === 'string' && (VALID as readonly string[]).includes(v)\n}\n\n/** Read the shared cookie (browser only; null on the server or when unset). */\nexport function readThemeCookie(): ThemePreference | null {\n if (typeof document === 'undefined') return null\n try {\n const m = document.cookie.match(\n new RegExp(`(?:^|;\\\\s*)${THEME_COOKIE}=([^;]+)`),\n )\n const v = m ? decodeURIComponent(m[1]) : null\n return isThemePreference(v) ? v : null\n } catch {\n return null\n }\n}\n\n// Set the cross-subdomain cookie. On a *.politogyvrm.com host we scope it to\n// the parent domain so every app subdomain reads it; on any other host\n// (localhost, *.pages.dev preview) we fall back to a host-only cookie so\n// local/preview theming still works without a mismatched Domain attribute\n// (which browsers silently drop). 1-year, SameSite=Lax, Secure on https.\nexport function writeThemeCookie(pref: ThemePreference): void {\n if (typeof document === 'undefined' || typeof window === 'undefined') return\n const host = window.location.hostname\n const onParentDomain = /(^|\\.)politogyvrm\\.com$/i.test(host)\n const domainAttr = onParentDomain ? '; Domain=.politogyvrm.com' : ''\n const secure = window.location.protocol === 'https:' ? '; Secure' : ''\n document.cookie = `${THEME_COOKIE}=${encodeURIComponent(\n pref,\n )}; Path=/; Max-Age=31536000; SameSite=Lax${domainAttr}${secure}`\n}\n\n/** Resolve a preference to the concrete light/dark it renders as right now. */\nexport function resolveTheme(pref: ThemePreference): 'light' | 'dark' {\n if (pref === 'system') {\n try {\n return window.matchMedia('(prefers-color-scheme: dark)').matches\n ? 'dark'\n : 'light'\n } catch {\n return 'light'\n }\n }\n return pref\n}\n\n/** Apply a preference to the document (`.dark` class + color-scheme). */\nexport function applyThemePreference(pref: ThemePreference): void {\n if (typeof document === 'undefined') return\n const resolved = resolveTheme(pref)\n const d = document.documentElement\n d.classList.toggle('dark', resolved === 'dark')\n try {\n d.style.colorScheme = resolved\n } catch {\n /* non-fatal */\n }\n}\n\n// Inline pre-paint script — render it in <head> (or as the first child of\n// <body>) so the theme applies before first paint. Resolves the preference\n// from cookie → localStorage → OS, applies the `.dark` class + `color-scheme`,\n// and seeds localStorage from the cookie so the app hydrates to the synced\n// value (the cross-subdomain flash fix). Self-contained, dependency-free, and\n// wrapped so any failure is silent (never blocks paint).\nexport const THEME_PREPAINT_SCRIPT = `(function(){try{\nvar KEY=${JSON.stringify(THEME_STORAGE_KEY)};\nvar VALID=[\"light\",\"dark\",\"system\"];\nfunction fromCookie(){try{var m=document.cookie.match(/(?:^|;\\\\s*)${THEME_COOKIE}=([^;]+)/);return m?decodeURIComponent(m[1]):null;}catch(e){return null;}}\nvar cookie=fromCookie();\nvar ls=null;try{ls=localStorage.getItem(KEY);}catch(e){}\nvar pref=cookie||ls||\"system\";\nif(VALID.indexOf(pref)===-1)pref=\"system\";\nif(cookie&&cookie!==ls){try{localStorage.setItem(KEY,cookie);}catch(e){}}\nvar resolved=pref;\nif(pref===\"system\"){try{resolved=window.matchMedia(\"(prefers-color-scheme: dark)\").matches?\"dark\":\"light\";}catch(e){resolved=\"light\";}}\nvar d=document.documentElement;\nif(resolved===\"dark\"){d.classList.add(\"dark\");}else{d.classList.remove(\"dark\");}\ntry{d.style.colorScheme=resolved;}catch(e){}\n}catch(e){}})();`\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 THEME_STORAGE_KEY,\n type ThemePreference as SharedThemePreference,\n} from '../theme-preference'\n\ntype NavIconLike = ComponentType<{ size?: number; className?: string }>\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 * 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\ntype NavChromeContextValue = { fetchJson: NavChromeFetcher }\n\nconst NavChromeContext = createContext<NavChromeContextValue | null>(null)\n\nexport function NavChromeProvider({\n fetchJson,\n children,\n}: {\n fetchJson: NavChromeFetcher\n children: ReactNode\n}) {\n return <NavChromeContext.Provider value={{ fetchJson }}>{children}</NavChromeContext.Provider>\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}\n\nexport type ChromeNotificationsPayload = {\n organizationId: string\n alerts: ChromeNotificationAlert[]\n replies: ChromeNotificationReply[]\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}\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 */\nfunction TopBarPopover({\n label,\n description,\n slot,\n fallbackIcon,\n badge,\n tone,\n onOpen,\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 children: ReactNode\n panelClassName?: string\n}) {\n const [open, setOpen] = useState(false)\n const rootRef = useRef<HTMLDivElement | null>(null)\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 overflow-hidden rounded-xl border border-[color:var(--line)] bg-[color:var(--panel-elevated)] shadow-[var(--shadow-soft)]',\n panelClassName ?? 'w-80',\n ].join(' ')}\n >\n {children}\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\n// ---------------------------------------------------------------------------\n// FuelAction — Communications Fuel balance (battery glyph + popover meters).\n// ---------------------------------------------------------------------------\n\nfunction FuelRow({\n label,\n channel,\n loading,\n}: {\n label: string\n channel: FuelChannelStatus | null\n loading: boolean\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\">\n <span className=\"text-xs font-semibold text-[color:var(--foreground)]\">{label}</span>\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 </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\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 <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 label=\"SMS Signal\" channel={fuel?.signal ?? null} loading={loading} />\n <FuelRow label=\"Email Broadcast\" channel={fuel?.broadcast ?? null} loading={loading} />\n </div>\n )}\n </div>\n </TopBarPopover>\n )\n}\n\n// ---------------------------------------------------------------------------\n// NotificationsAction — bell + count badge + alerts/replies popover.\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\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 const count = (payload?.alerts.length ?? 0) + (payload?.replies.length ?? 0)\n\n return (\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 : count}\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 ) : count === 0 ? (\n <p className=\"py-1 text-sm text-[color:var(--muted)]\">You&rsquo;re all caught up.</p>\n ) : (\n <ul className=\"flex max-h-80 flex-col gap-1 overflow-y-auto\">\n {payload?.alerts.map((a) => (\n <li key={a.id}>\n <a\n href={a.href ?? '#'}\n className=\"block rounded-lg px-2 py-2 hover:bg-[color:var(--panel)]\"\n >\n <p className=\"text-sm font-semibold text-[color:var(--foreground)]\">{a.title}</p>\n <p className=\"text-xs text-[color:var(--muted)]\">{a.description}</p>\n </a>\n </li>\n ))}\n {payload?.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 )}\n </div>\n </TopBarPopover>\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\nexport function SupportAction() {\n const { fetchJson } = useNavChrome('SupportAction')\n const [open, setOpen] = useState(false)\n const [message, setMessage] = useState('')\n const [state, setState] = useState<'idle' | 'sending' | 'sent' | 'error'>('idle')\n\n const close = useCallback(() => {\n setOpen(false)\n setState('idle')\n setMessage('')\n }, [])\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 setState('sending')\n try {\n await fetchJson('support', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ message: message.trim() }),\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 <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 useEffect(() => {\n if (!fetchJson || reconciled.current) return\n reconciled.current = true\n fetchJson('me')\n .then((data) => {\n const pref = (data as { themePreference?: unknown })?.themePreference\n if (isThemePreference(pref)) {\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 })\n .catch(() => {\n /* profile unavailable — cookie/localStorage value stands */\n })\n }, [fetchJson])\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.\n fetchJson?.('me/preferences', {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ themePreference: next }),\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.\n//\n// This is the single source of truth for the navigation every politogy app\n// renders (extracted verbatim from VRM core's relationship-mode sidebar,\n// `getRelationshipLinkItems`). Apps consume the same menu everywhere; an app\n// that owns one of the items (e.g. the standalone Contacts app) nests its own\n// pages as that item's children while every other entry links out to VRM core\n// as an absolute URL — full-page navigation with SSO shared across\n// *.politogyvrm.com.\n// ---------------------------------------------------------------------------\n\n/**\n * Icon slots used by the standard menu. 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\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 */\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.\n */\n supportItem?: { onClick?: () => void; href?: string } | false\n}\n\n/** Core-relative route + icon slot for one standard entry. */\ntype CoreLeaf = { 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\nconst FORMS_CHILDREN: CoreLeaf[] = [\n { label: 'Dashboard', icon: 'grid', path: '/relationship/forms' },\n { label: 'Create & Edit', icon: 'edit', path: '/relationship/forms/create-and-edit' },\n { label: 'Submissions', icon: 'fileText', path: '/relationship/forms/submissions' },\n]\n\n/**\n * Build the standard Politogy VRM menu (relationship mode), in the exact order\n * and wording the main app renders it. See `StandardNavOptions` for the two\n * app-specific hooks (`contactsItem`, `supportItem`).\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\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 const items: NavItem[] = [\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 { label: 'Forms & Surveys', icon: icon('activity'), children: leaves(FORMS_CHILDREN) },\n ]\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, 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 FuelAction,\n NotificationsAction,\n SupportAction,\n NavDisplayAction,\n NavThemeControl,\n TopBarCountBadge,\n TopBarTooltip,\n TopBarWidgetSlot,\n topBarIconButtonClass,\n useChromeOrgs,\n useThemePreference,\n} from './chromeActions'\nexport type {\n NavChromeFetcher,\n NavDisplayMode,\n ThemePreference,\n ChromeOrgSummary,\n ChromeNotificationsPayload,\n ChromeNotificationAlert,\n ChromeNotificationReply,\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 * Nested sub-items. When present, the row becomes an expandable GROUP header:\n * clicking it toggles the children open/closed (it never navigates, even if\n * `href` is set) and renders a right-aligned chevron that rotates 180° when\n * open. 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/** Default active-route test: exact match for \"/\", prefix match otherwise. */\nexport function isNavItemActive(pathname: string, href: string): boolean {\n if (href === '/') return pathname === '/'\n return pathname === href || pathname.startsWith(`${href}/`)\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((child) =>\n child.href ? activeFn(pathname, child.href) : false,\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\nexport type NavMode = {\n label: string\n icon?: NavIcon\n}\n\nexport type NavFooterLink = { label: string; href: string; external?: boolean }\n\nexport type NavFooter = {\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 ? <OrgIdCopyButton id={org.id} /> : null}\n </div>\n {org.organizations && org.organizations.length > 0 && org.onSwitch ? (\n <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 className=\"truncate text-sm font-semibold\">\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 className=\"truncate\">{o.name ?? o.id.slice(0, 8)}</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 */}\n {mode ? (\n <div className=\"mb-4\">\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 </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(--color-race-red)] hover:underline\"\n >\n {l.label}\n </a>\n </span>\n ))}\n </div>\n ) : null}\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 <span className=\"text-[color:var(--muted)]\">|</span>\n <span>{footer.commit.slice(-4)}</span>\n <span className=\"text-[color:var(--muted)]\">|</span>\n <span>v{footer.version}</span>\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 </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 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 onClick={onToggle}\n aria-expanded={open}\n className={headerClasses}\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 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 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// 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 /** Avatar image URL; falls back to initials on the brand color. */\n avatarUrl?: 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 NavTopBarProps = {\n title: string\n subtitle?: string\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 user,\n userMenu,\n onSignOut,\n actionsList,\n actions,\n themeToggle,\n}: NavTopBarProps) {\n const initials = (user?.name ?? 'Politogy').slice(0, 2).toUpperCase()\n const secondary = user?.email || [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 {subtitle ? (\n <p className=\"truncate text-sm text-[color:var(--muted)]\">{subtitle}</p>\n ) : null}\n </div>\n\n <div className=\"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 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 <span className=\"flex h-9 w-9 items-center justify-center overflow-hidden rounded-full bg-[color:var(--color-race-red)] text-xs font-bold text-white\">\n {user?.avatarUrl ? (\n <img src={user.avatarUrl} alt=\"\" className=\"h-full w-full object-cover\" />\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 {user?.name ?? 'Signed in'}\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 {user?.name ?? '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 overflow-hidden rounded-xl border border-[color:var(--line)] bg-[color:var(--panel-elevated)] py-1 shadow-[var(--shadow-soft)]\">\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 </div>\n </header>\n )\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\nexport type NavAppShellProps = {\n sidebar: NavSidebarProps\n topBar: NavTopBarProps\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 */\nexport function NavAppShell({ sidebar, topBar, children }: NavAppShellProps) {\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 <main className=\"px-6 py-7\">\n <div className=\"mx-auto max-w-7xl\">{children}</div>\n </main>\n </div>\n </div>\n )\n}\n\n// Canonical Politogy VRM menu — the standard nav structure every politogy app\n// renders, with hooks for the app-owned \"Contacts\" item and Support handler.\nexport {\n standardPolitogyNav,\n type StandardNavIconKey,\n type StandardNavOptions,\n} from './standardNav'\n"]}
1
+ {"version":3,"sources":["../src/lib/topbarIconSlot.ts","../src/lib/brandGlyphs.tsx","../src/theme-preference.ts","../src/native/chromeActions.tsx","../src/native/standardNav.ts","../src/native/index.tsx"],"names":["useState","useEffect","FiBatteryCharging","FiBattery","FiZap","FiGrid","FiBell","FiAlertTriangle","FiAlertCircle","FiLifeBuoy","FiHelpCircle","FiMoon","FiSun","FiInfo","FiMail","FiMessageSquare","FiSettings","FiUser","jsxs","jsx","createContext","useContext","useRef","useCallback","Fragment","createPortal","useMemo"],"mappings":"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","file":"native.cjs","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","// Universal theme preference — the ONE cross-app contract.\n//\n// One theme choice (Light / Dark / System) follows the authenticated user\n// across every Politogy app + subdomain. Three layers cooperate:\n// 1. VRM Core `profiles.theme_preference` — source of truth, persisted via\n// the chrome API (`PATCH me/preferences { themePreference }`) and read\n// back from `GET me` (`themePreference`).\n// 2. `.politogyvrm.com` cookie `politogy_theme` — zero-flash pre-paint\n// vehicle that crosses subdomains (auth session cookies are host-only).\n// 3. localStorage `politogy_theme` — offline fallback store.\n//\n// Ported verbatim from contacts/apps/web/src/lib/theme.ts (the origin of the\n// contract) so every app runs the identical behavior from npm. This module is\n// server-safe (no 'use client'): layouts import THEME_PREPAINT_SCRIPT for the\n// pre-paint inline script. The client-side hook lives in ./native\n// (useThemePreference).\n\nexport type ThemePreference = 'light' | 'dark' | 'system'\n\n// Single converged key for BOTH the localStorage store and the\n// cross-subdomain cookie, so a choice in one app is the same key in the next.\nexport const THEME_STORAGE_KEY = 'politogy_theme'\nexport const THEME_COOKIE = 'politogy_theme'\n\nconst VALID: readonly ThemePreference[] = ['light', 'dark', 'system']\n\nexport function isThemePreference(v: unknown): v is ThemePreference {\n return typeof v === 'string' && (VALID as readonly string[]).includes(v)\n}\n\n/** Read the shared cookie (browser only; null on the server or when unset). */\nexport function readThemeCookie(): ThemePreference | null {\n if (typeof document === 'undefined') return null\n try {\n const m = document.cookie.match(\n new RegExp(`(?:^|;\\\\s*)${THEME_COOKIE}=([^;]+)`),\n )\n const v = m ? decodeURIComponent(m[1]) : null\n return isThemePreference(v) ? v : null\n } catch {\n return null\n }\n}\n\n// Set the cross-subdomain cookie. On a *.politogyvrm.com host we scope it to\n// the parent domain so every app subdomain reads it; on any other host\n// (localhost, *.pages.dev preview) we fall back to a host-only cookie so\n// local/preview theming still works without a mismatched Domain attribute\n// (which browsers silently drop). 1-year, SameSite=Lax, Secure on https.\nexport function writeThemeCookie(pref: ThemePreference): void {\n if (typeof document === 'undefined' || typeof window === 'undefined') return\n const host = window.location.hostname\n const onParentDomain = /(^|\\.)politogyvrm\\.com$/i.test(host)\n const domainAttr = onParentDomain ? '; Domain=.politogyvrm.com' : ''\n const secure = window.location.protocol === 'https:' ? '; Secure' : ''\n document.cookie = `${THEME_COOKIE}=${encodeURIComponent(\n pref,\n )}; Path=/; Max-Age=31536000; SameSite=Lax${domainAttr}${secure}`\n}\n\n/** Resolve a preference to the concrete light/dark it renders as right now. */\nexport function resolveTheme(pref: ThemePreference): 'light' | 'dark' {\n if (pref === 'system') {\n try {\n return window.matchMedia('(prefers-color-scheme: dark)').matches\n ? 'dark'\n : 'light'\n } catch {\n return 'light'\n }\n }\n return pref\n}\n\n/** Apply a preference to the document (`.dark` class + color-scheme). */\nexport function applyThemePreference(pref: ThemePreference): void {\n if (typeof document === 'undefined') return\n const resolved = resolveTheme(pref)\n const d = document.documentElement\n d.classList.toggle('dark', resolved === 'dark')\n try {\n d.style.colorScheme = resolved\n } catch {\n /* non-fatal */\n }\n}\n\n// Inline pre-paint script — render it in <head> (or as the first child of\n// <body>) so the theme applies before first paint. Resolves the preference\n// from cookie → localStorage → OS, applies the `.dark` class + `color-scheme`,\n// and seeds localStorage from the cookie so the app hydrates to the synced\n// value (the cross-subdomain flash fix). Self-contained, dependency-free, and\n// wrapped so any failure is silent (never blocks paint).\nexport const THEME_PREPAINT_SCRIPT = `(function(){try{\nvar KEY=${JSON.stringify(THEME_STORAGE_KEY)};\nvar VALID=[\"light\",\"dark\",\"system\"];\nfunction fromCookie(){try{var m=document.cookie.match(/(?:^|;\\\\s*)${THEME_COOKIE}=([^;]+)/);return m?decodeURIComponent(m[1]):null;}catch(e){return null;}}\nvar cookie=fromCookie();\nvar ls=null;try{ls=localStorage.getItem(KEY);}catch(e){}\nvar pref=cookie||ls||\"system\";\nif(VALID.indexOf(pref)===-1)pref=\"system\";\nif(cookie&&cookie!==ls){try{localStorage.setItem(KEY,cookie);}catch(e){}}\nvar resolved=pref;\nif(pref===\"system\"){try{resolved=window.matchMedia(\"(prefers-color-scheme: dark)\").matches?\"dark\":\"light\";}catch(e){resolved=\"light\";}}\nvar d=document.documentElement;\nif(resolved===\"dark\"){d.classList.add(\"dark\");}else{d.classList.remove(\"dark\");}\ntry{d.style.colorScheme=resolved;}catch(e){}\n}catch(e){}})();`\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 THEME_STORAGE_KEY,\n type ThemePreference as SharedThemePreference,\n} from '../theme-preference'\n\ntype NavIconLike = ComponentType<{ size?: number; className?: string }>\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\ntype NavChromeContextValue = { fetchJson: NavChromeFetcher }\n\nconst NavChromeContext = createContext<NavChromeContextValue | null>(null)\n\nexport function NavChromeProvider({\n fetchJson,\n children,\n}: {\n fetchJson: NavChromeFetcher\n children: ReactNode\n}) {\n return <NavChromeContext.Provider value={{ fetchJson }}>{children}</NavChromeContext.Provider>\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}\n\nexport type ChromeNotificationsPayload = {\n organizationId: string\n alerts: ChromeNotificationAlert[]\n replies: ChromeNotificationReply[]\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}\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 */\nfunction TopBarPopover({\n label,\n description,\n slot,\n fallbackIcon,\n badge,\n tone,\n onOpen,\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 children: ReactNode\n panelClassName?: string\n}) {\n const [open, setOpen] = useState(false)\n const rootRef = useRef<HTMLDivElement | null>(null)\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\n// ---------------------------------------------------------------------------\n// FuelAction — Communications Fuel balance (battery glyph + popover meters).\n// ---------------------------------------------------------------------------\n\nfunction FuelRow({\n label,\n channel,\n loading,\n}: {\n label: string\n channel: FuelChannelStatus | null\n loading: boolean\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\">\n <span className=\"text-xs font-semibold text-[color:var(--foreground)]\">{label}</span>\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 </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\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 <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 label=\"SMS Signal\" channel={fuel?.signal ?? null} loading={loading} />\n <FuelRow label=\"Email Broadcast\" channel={fuel?.broadcast ?? null} loading={loading} />\n </div>\n )}\n </div>\n </TopBarPopover>\n )\n}\n\n// ---------------------------------------------------------------------------\n// NotificationsAction — bell + count badge + alerts/replies popover.\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\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 const count = (payload?.alerts.length ?? 0) + (payload?.replies.length ?? 0)\n\n return (\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 : count}\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 ) : count === 0 ? (\n <p className=\"py-1 text-sm text-[color:var(--muted)]\">You&rsquo;re all caught up.</p>\n ) : (\n <ul className=\"flex max-h-80 flex-col gap-1 overflow-y-auto\">\n {payload?.alerts.map((a) => (\n <li key={a.id}>\n <a\n href={a.href ?? '#'}\n className=\"block rounded-lg px-2 py-2 hover:bg-[color:var(--panel)]\"\n >\n <p className=\"text-sm font-semibold text-[color:var(--foreground)]\">{a.title}</p>\n <p className=\"text-xs text-[color:var(--muted)]\">{a.description}</p>\n </a>\n </li>\n ))}\n {payload?.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 )}\n </div>\n </TopBarPopover>\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\nexport function SupportAction() {\n const { fetchJson } = useNavChrome('SupportAction')\n const [open, setOpen] = useState(false)\n const [message, setMessage] = useState('')\n const [state, setState] = useState<'idle' | 'sending' | 'sent' | 'error'>('idle')\n\n const close = useCallback(() => {\n setOpen(false)\n setState('idle')\n setMessage('')\n }, [])\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 setState('sending')\n try {\n await fetchJson('support', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ message: message.trim() }),\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 <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 useEffect(() => {\n if (!fetchJson || reconciled.current) return\n reconciled.current = true\n fetchJson('me')\n .then((data) => {\n const pref = (data as { themePreference?: unknown })?.themePreference\n if (isThemePreference(pref)) {\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 })\n .catch(() => {\n /* profile unavailable — cookie/localStorage value stands */\n })\n }, [fetchJson])\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.\n fetchJson?.('me/preferences', {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ themePreference: next }),\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.\n//\n// This is the single source of truth for the navigation every politogy app\n// renders (extracted verbatim from VRM core's relationship-mode sidebar,\n// `getRelationshipLinkItems`). Apps consume the same menu everywhere; an app\n// that owns one of the items (e.g. the standalone Contacts app) nests its own\n// pages as that item's children while every other entry links out to VRM core\n// as an absolute URL — full-page navigation with SSO shared across\n// *.politogyvrm.com.\n// ---------------------------------------------------------------------------\n\n/**\n * Icon slots used by the standard menu. 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\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 */\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.\n */\n supportItem?: { onClick?: () => void; href?: string } | false\n}\n\n/** Core-relative route + icon slot for one standard entry. */\ntype CoreLeaf = { 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\nconst FORMS_CHILDREN: CoreLeaf[] = [\n { label: 'Dashboard', icon: 'grid', path: '/relationship/forms' },\n { label: 'Create & Edit', icon: 'edit', path: '/relationship/forms/create-and-edit' },\n { label: 'Submissions', icon: 'fileText', path: '/relationship/forms/submissions' },\n]\n\n/**\n * Build the standard Politogy VRM menu (relationship mode), in the exact order\n * and wording the main app renders it. See `StandardNavOptions` for the two\n * app-specific hooks (`contactsItem`, `supportItem`).\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\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 const items: NavItem[] = [\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 { label: 'Forms & Surveys', icon: icon('activity'), children: leaves(FORMS_CHILDREN) },\n ]\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 FuelAction,\n NotificationsAction,\n SupportAction,\n NavDisplayAction,\n NavThemeControl,\n TopBarCountBadge,\n TopBarPanelArrow,\n TopBarTooltip,\n TopBarWidgetSlot,\n topBarIconButtonClass,\n useChromeOrgs,\n useThemePreference,\n} from './chromeActions'\nexport type {\n NavChromeFetcher,\n NavDisplayMode,\n ThemePreference,\n ChromeOrgSummary,\n ChromeNotificationsPayload,\n ChromeNotificationAlert,\n ChromeNotificationReply,\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 * Nested sub-items. When present, the row becomes an expandable GROUP header:\n * clicking it toggles the children open/closed (it never navigates, even if\n * `href` is set) and renders a right-aligned chevron that rotates 180° when\n * open. 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/** Default active-route test: exact match for \"/\", prefix match otherwise. */\nexport function isNavItemActive(pathname: string, href: string): boolean {\n if (href === '/') return pathname === '/'\n return pathname === href || pathname.startsWith(`${href}/`)\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((child) =>\n child.href ? activeFn(pathname, child.href) : false,\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\nexport type NavMode = {\n label: string\n icon?: NavIcon\n}\n\nexport type NavFooterLink = { label: string; href: string; external?: boolean }\n\nexport type NavFooter = {\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 ? <OrgIdCopyButton id={org.id} /> : null}\n </div>\n {org.organizations && org.organizations.length > 0 && org.onSwitch ? (\n <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 className=\"truncate text-sm font-semibold\">\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 className=\"truncate\">{o.name ?? o.id.slice(0, 8)}</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 */}\n {mode ? (\n <div className=\"mb-4\">\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 </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(--color-race-red)] hover:underline\"\n >\n {l.label}\n </a>\n </span>\n ))}\n </div>\n ) : null}\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 <span className=\"text-[color:var(--muted)]\">|</span>\n <span>{footer.commit.slice(-4)}</span>\n <span className=\"text-[color:var(--muted)]\">|</span>\n <span>v{footer.version}</span>\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 </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 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 onClick={onToggle}\n aria-expanded={open}\n className={headerClasses}\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 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 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// 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 NavTopBarProps = {\n title: string\n subtitle?: string\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 user,\n userMenu,\n onSignOut,\n actionsList,\n actions,\n themeToggle,\n}: NavTopBarProps) {\n const initials = (user?.name ?? 'Politogy').slice(0, 2).toUpperCase()\n const secondary = user?.email || [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 {subtitle ? (\n <p className=\"truncate text-sm text-[color:var(--muted)]\">{subtitle}</p>\n ) : null}\n </div>\n\n <div className=\"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 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 {user?.name ?? 'Signed in'}\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 {user?.name ?? '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 </div>\n </header>\n )\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\nexport type NavAppShellProps = {\n sidebar: NavSidebarProps\n topBar: NavTopBarProps\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 */\nexport function NavAppShell({ sidebar, topBar, children }: NavAppShellProps) {\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 <main className=\"px-6 py-7\">\n <div className=\"mx-auto max-w-7xl\">{children}</div>\n </main>\n </div>\n </div>\n )\n}\n\n// Canonical Politogy VRM menu — the standard nav structure every politogy app\n// renders, with hooks for the app-owned \"Contacts\" item and Support handler.\nexport {\n standardPolitogyNav,\n type StandardNavIconKey,\n type StandardNavOptions,\n} from './standardNav'\n"]}