@broberg/app-shell 0.22.0 → 0.22.2

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/index.ts","../src/preact.tsx"],"names":["d","useState","useEffect","jsx","jsxs","Fragment","useRef","useLayoutEffect","stack","view","selectKeyReducer","shell","useMemo","createBellShell","t","getPreference","getPalette","getSurfaces","getBackdrop","onThemeChange","onPaletteChange","onSurfacesChange","onBackdropChange","setPreference","PALETTES","PALETTE_LABELS","setPalette","setSurfaces","setBackdrop"],"mappings":"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","file":"preact.cjs","sourcesContent":["// @broberg/app-shell — the framework-free core of the fleet's app shell (F092).\n//\n// The shell every app in the fleet had been copying: sidebar + top bar +\n// notification bell + user menu. cardmem and trail each had one (\"ported from\n// trail\"), and helpdesk and the appkit starter would have made the third and\n// fourth. This file holds what does not depend on a framework: the navigation\n// data model, the notification contract and its sources, and the small rules\n// both the Preact and React parts must agree on.\n//\n// Christian, 4 Oct 2026: notifications are a STANDARD part of the template, not\n// an optional slot — so the contract and a default source live here, and a new\n// app gets a working notification centre by pointing one URL at its backend.\n\n// ── Navigation ─────────────────────────────────────────────────────────────\n\n/** One sidebar entry. `icon` is whatever your framework renders (an element). */\nexport interface NavItem<Icon = unknown> {\n id: string;\n label: string;\n href: string;\n icon?: Icon;\n /** A count shown on the item (99+ above 99). 0/undefined shows nothing. */\n badge?: number;\n /**\n * Sub-items, ONE level (F092.5). An item with children is a toggle that opens\n * and closes them, not a link; its own `href` is used only to decide whether\n * it is on the current path.\n */\n children?: NavItem<Icon>[];\n /**\n * F092.20 — a status marker before the label; \"working\" = a run in progress.\n * F092.23 — \"idle\" = the same ring in grey (finished), so every row lines up.\n */\n marker?: \"working\" | \"idle\";\n /** F092.20 — shows a pin icon after the label. */\n pinned?: boolean;\n /** F092.21 — row actions: a «…» button opens a menu with these. */\n actions?: NavAction[];\n}\n/**\n * F092.21 — one row action. `submenu` switches the menu to a sub-list (with a\n * back arrow); `input` switches it to a field + save (e.g. rename). A plain\n * action, a submenu leaf and a saved input all call `onItemAction`.\n */\nexport interface NavAction {\n id: string;\n label: string;\n icon?: unknown;\n /** A single letter that picks this action while the menu is open (e.g. \"P\"). */\n kbd?: string;\n /** Shown in the danger colour (delete). */\n danger?: boolean;\n submenu?: NavAction[];\n input?: { value: string; placeholder?: string; saveLabel?: string };\n /** F092.22 — ask twice: the first pick shows `label` («Tryk igen for at slette») and keeps the menu open; the second runs it. */\n confirm?: { label: string };\n /** F092.32 — a dimmed value right-aligned before the chevron («Type …… All ›»). */\n value?: string;\n /** F092.32 — a divider line before this item, to separate groups. */\n separator?: boolean;\n}\nexport interface NavSection<Icon = unknown> {\n /** A sub-heading inside one group, e.g. \"I dag\" / \"I går\". */\n label: string;\n items: NavItem<Icon>[];\n}\nexport interface NavGroup<Icon = unknown> {\n label: string;\n items: NavItem<Icon>[];\n /** F092.20 — \"plain\": the group label in normal text (not uppercase/mono). */\n variant?: \"default\" | \"plain\";\n /** F092.20 — sub-headed lists inside this group, shown after `items`. */\n sections?: NavSection<Icon>[];\n /**\n * F092.23 — no heading row: the items show directly, always open (it cannot be\n * folded, so a stored fold for this label is ignored). `label` stays required —\n * it is the group's key and its accessible name.\n */\n hideLabel?: boolean;\n /**\n * F092.26 — false: the heading is plain text (no fold button, no chevron) and the\n * group is always open, even with a stored fold for this label. Default true.\n */\n collapsible?: boolean;\n /**\n * F092.28 — a small icon button at the right of the heading row (e.g. «Filtrér og\n * sortér»). The app opens its own menu from `onClick(anchor)`. Clicking it never\n * folds the group. Not shown with `hideLabel` (there is no heading row).\n */\n action?: { icon: Icon; label: string; expanded?: boolean; onClick: (anchor: HTMLElement) => void; testid?: string };\n}\n\n/**\n * Is this item the current page? Exact match for \"/\", otherwise the path is the\n * item or below it (\"/board/123\" is on \"/board\", \"/boardroom\" is not).\n */\nexport function isActivePath(href: string, currentPath: string): boolean {\n const path = (currentPath.split(/[?#]/)[0] || \"/\").replace(/\\/+$/, \"\") || \"/\";\n const target = (href.split(/[?#]/)[0] || \"/\").replace(/\\/+$/, \"\") || \"/\";\n if (target === \"/\") return path === \"/\";\n return path === target || path.startsWith(target + \"/\");\n}\n\n/**\n * A notification's `navigate` is SERVER DATA, and it ends in `location.assign`.\n * `javascript:` there runs code in the app, so only a same-site path or an\n * http(s) URL is followed; anything else returns null and the row just closes.\n */\nexport function safeNavigate(target: string | null | undefined): string | null {\n if (typeof target !== \"string\") return null;\n const t = target.trim();\n if (t.startsWith(\"/\") && !t.startsWith(\"//\") && !t.startsWith(\"/\\\\\")) return t;\n try {\n const u = new URL(t);\n return u.protocol === \"https:\" || u.protocol === \"http:\" ? u.href : null;\n } catch {\n return null;\n }\n}\n\n/**\n * F092.10 — is this link leaving the app? An http(s) link to another origin.\n * Paths, \"#…\", mailto:/tel: and the app's own origin are not. Owner decision\n * D-d28547: every external link opens in a new tab.\n */\nexport function isExternal(\n href: string | null | undefined,\n origin: string | undefined = typeof location !== \"undefined\" ? location.origin : undefined,\n): boolean {\n if (typeof href !== \"string\") return false;\n const h = href.trim();\n if (!origin) return /^(https?:)?\\/\\//i.test(h); // no page to compare with: absolute = external\n let u: URL;\n try {\n u = new URL(h, origin);\n } catch {\n return false;\n }\n return (u.protocol === \"http:\" || u.protocol === \"https:\") && u.origin !== origin;\n}\n\n/**\n * The label of the nav item the user is on, for the content header (F092.4).\n * Sub-items count, and the most specific match wins: on \"/models/genesis\" a\n * \"Genesis\" child beats its \"Models\" parent.\n */\nexport function activeNavLabel<Icon>(\n groups: NavGroup<Icon>[],\n footer: NavItem<Icon>[] | undefined,\n currentPath: string,\n): string | undefined {\n let best: { label: string; len: number } | undefined;\n const visit = (it: NavItem<Icon>) => {\n if (it.href && isActivePath(it.href, currentPath)) {\n const len = it.href.length;\n if (!best || len > best.len) best = { label: it.label, len };\n }\n it.children?.forEach(visit);\n };\n for (const g of groups) g.items.forEach(visit);\n footer?.forEach(visit);\n return best?.label;\n}\n\n/** \"99+\" above 99, nothing for 0 or less. */\nexport function badgeLabel(n: number | undefined): string | null {\n if (!n || n <= 0) return null;\n return n > 99 ? \"99+\" : String(n);\n}\n\n// ── Persisted UI state ─────────────────────────────────────────────────────\n\n/** Read a boolean flag from localStorage; storage errors read as `fallback`. */\nexport function readFlag(key: string, fallback: boolean): boolean {\n try {\n const v = typeof localStorage === \"undefined\" ? null : localStorage.getItem(key);\n return v === null ? fallback : v === \"1\";\n } catch {\n return fallback;\n }\n}\nexport function writeFlag(key: string, value: boolean): void {\n try {\n if (typeof localStorage !== \"undefined\") localStorage.setItem(key, value ? \"1\" : \"0\");\n } catch {\n /* private mode / quota: the UI still works, it just does not remember */\n }\n}\nexport function readSet(key: string): Set<string> {\n try {\n const raw = typeof localStorage === \"undefined\" ? null : localStorage.getItem(key);\n const v = raw ? (JSON.parse(raw) as unknown) : [];\n return new Set(Array.isArray(v) ? v.filter((x): x is string => typeof x === \"string\") : []);\n } catch {\n return new Set();\n }\n}\nexport function writeSet(key: string, value: Set<string>): void {\n try {\n if (typeof localStorage !== \"undefined\") localStorage.setItem(key, JSON.stringify([...value]));\n } catch {\n /* see writeFlag */\n }\n}\n\n// ── Avatar ─────────────────────────────────────────────────────────────────\n\n/**\n * Two initials for the avatar fallback: first letter of the first and the last\n * word, upper-cased. One word gives one letter; nothing gives \"?\".\n *\n * There is deliberately no Gravatar here (owner decision D-1dc849): the avatar\n * is the Broberg ID `picture`, and without one, initials. Gravatar would send a\n * hash of the user's email to a US service on every render.\n */\nexport function initials(name: string | undefined, email?: string): string {\n const source = (name ?? \"\").trim() || (email ?? \"\").split(\"@\")[0] || \"\";\n const words = source.split(/[\\s._-]+/).filter(Boolean);\n if (words.length === 0) return \"?\";\n const first = words[0]![0] ?? \"\";\n const last = words.length > 1 ? words[words.length - 1]![0] ?? \"\" : \"\";\n return (first + last).toUpperCase() || \"?\";\n}\n\n// ── Notifications ──────────────────────────────────────────────────────────\n//\n// REUSE, NOT A SECOND CONTRACT. The fleet already agreed the notification shape\n// in @broberg/notifications (F074): `NotificationRow` — the same field names\n// @broberg/webpush sends, end to end — and the server core that owns the ONE\n// counting rule. The shell's bell renders that row and drives its panel with\n// that package's `createBellShell`, so a server built on `createNotifications`\n// and this bell speak the same language without an adapter.\n//\n// Christian, 4 Oct 2026: notifications are a STANDARD part of the template. So\n// a source, and a default one, ship here: point one URL at your backend.\n\nimport type { NotificationRow } from \"@broberg/notifications/types\";\nexport type { NotificationRow } from \"@broberg/notifications/types\";\n\n/** Where the bell gets its data. Swap it to point at any backend. */\nexport interface NotificationSource {\n /** The rows to show (newest first). */\n loadRows(): Promise<NotificationRow[]>;\n /** THE count — your server's, which may exclude muted kinds (F074's counting rule). */\n countUnseen(): Promise<number>;\n /** Returns the ids that actually transitioned to seen. */\n markSeen(ids: readonly string[]): Promise<string[]>;\n markAllSeen(): Promise<string[]>;\n /** Called with a callback that re-counts; return an unsubscribe. Optional. */\n subscribe?(onChange: () => void): () => void;\n}\n\n/**\n * The default source: a URL on your own backend, shaped after\n * @broberg/notifications' server core so `createNotifications` sits right\n * behind it.\n *\n * GET {url} → { items: NotificationRow[], unseen: number }\n * POST {url}/seen { ids: string[] } → { clearedIds: string[], count: number }\n * POST {url}/seen-all → { clearedIds: string[], count: number }\n *\n * It re-counts when the window regains focus or the tab becomes visible, and on\n * a timer (default 60 s). A failed GET THROWS — the bell shows «could not\n * load», never an empty list: \"could not fetch\" and \"nothing new\" must not look\n * the same.\n */\nexport function createFetchNotificationSource(opts: {\n url: string;\n fetch?: typeof fetch;\n /** Re-count interval in ms. 0 turns it off. Default 60 000. */\n pollMs?: number;\n credentials?: RequestCredentials;\n}): NotificationSource {\n const base = opts.url.replace(/\\/+$/, \"\");\n const doFetch = (input: string, init?: RequestInit) =>\n (opts.fetch ?? fetch)(input, { credentials: opts.credentials ?? \"include\", ...init });\n const get = async (): Promise<{ items: NotificationRow[]; unseen: number }> => {\n const res = await doFetch(base, { headers: { accept: \"application/json\" } });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const body = (await res.json().catch(() => null)) as { items?: unknown; unseen?: unknown } | null;\n if (!body || !Array.isArray(body.items)) throw new Error(\"response has no items array\");\n const items = body.items as NotificationRow[];\n const unseen = typeof body.unseen === \"number\" ? body.unseen : items.filter((n) => n.seenAt == null).length;\n return { items, unseen };\n };\n const post = async (path: string, body?: unknown): Promise<string[]> => {\n const res = await doFetch(`${base}${path}`, {\n method: \"POST\",\n headers: body === undefined ? undefined : { \"content-type\": \"application/json\" },\n body: body === undefined ? undefined : JSON.stringify(body),\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const r = (await res.json().catch(() => ({}))) as { clearedIds?: unknown };\n return Array.isArray(r.clearedIds) ? (r.clearedIds as string[]) : [];\n };\n return {\n loadRows: async () => (await get()).items,\n countUnseen: async () => (await get()).unseen,\n markSeen: (ids) => post(\"/seen\", { ids }),\n markAllSeen: () => post(\"/seen-all\"),\n subscribe(onChange) {\n if (typeof window === \"undefined\") return () => {};\n const onVisible = () => {\n if (document.visibilityState === \"visible\") onChange();\n };\n window.addEventListener(\"focus\", onChange);\n document.addEventListener(\"visibilitychange\", onVisible);\n const ms = opts.pollMs ?? 60_000;\n const timer = ms > 0 ? setInterval(onChange, ms) : null;\n return () => {\n window.removeEventListener(\"focus\", onChange);\n document.removeEventListener(\"visibilitychange\", onVisible);\n if (timer) clearInterval(timer);\n };\n },\n };\n}\n\n/** An in-memory source for demos and tests. */\nexport function createMemoryNotificationSource(initial: NotificationRow[] = []): NotificationSource & {\n push(n: NotificationRow): void;\n rows(): NotificationRow[];\n} {\n let rows = initial.map((n) => ({ ...n }));\n const listeners = new Set<() => void>();\n const emit = () => listeners.forEach((l) => l());\n const mark = (pred: (n: NotificationRow) => boolean): string[] => {\n const now = Date.now();\n const cleared: string[] = [];\n rows = rows.map((n) => {\n if (n.seenAt == null && pred(n)) {\n cleared.push(n.id);\n return { ...n, seenAt: now };\n }\n return n;\n });\n if (cleared.length) emit();\n return cleared;\n };\n return {\n loadRows: async () => rows.map((n) => ({ ...n })),\n countUnseen: async () => rows.filter((n) => n.seenAt == null).length,\n markSeen: async (ids) => mark((n) => ids.includes(n.id)),\n markAllSeen: async () => mark(() => true),\n subscribe(onChange) {\n listeners.add(onChange);\n return () => listeners.delete(onChange);\n },\n push(n) {\n rows = [n, ...rows];\n emit();\n },\n rows: () => rows.map((n) => ({ ...n })),\n };\n}\n\n/** \"nu\", \"5 min\", \"3 t\", \"i går\", \"4 d\" (da) or the English equivalents. */\nexport function relativeTime(ts: string | number, lang: \"da\" | \"en\", now = Date.now()): string {\n const ms = typeof ts === \"number\" ? ts : Date.parse(ts);\n if (!Number.isFinite(ms)) return \"\";\n const m = Math.floor((now - ms) / 60_000);\n if (m < 1) return lang === \"da\" ? \"nu\" : \"now\";\n if (m < 60) return `${m} min`;\n const h = Math.floor(m / 60);\n if (h < 24) return lang === \"da\" ? `${h} t` : `${h} h`;\n const d = Math.floor(h / 24);\n if (d === 1) return lang === \"da\" ? \"i går\" : \"yesterday\";\n return `${d} d`;\n}\n\n// ── Account page (F095.3) ─────────────────────────────────────────────────\n//\n// The user edits their own name and picture inside the app. The app's backend\n// (@broberg/sso's `accountRoutes()`, mounted on /api/account) talks to Broberg\n// ID; this package only talks to that backend, through an adapter, and never\n// imports @broberg/sso.\n\n/** What every account call resolves to — the profile AS THE SERVER NOW HOLDS IT. */\nexport interface AccountProfile {\n sub: string;\n name: string | null;\n picture: string | null;\n email: string | null;\n /** Broberg ID's own account page (password, passkeys, sessions). */\n account_url: string;\n}\n\n/** Where the account page gets and saves the profile. Swap it to point anywhere. */\nexport interface AccountAdapter {\n load(): Promise<AccountProfile>;\n saveName(name: string): Promise<AccountProfile>;\n uploadAvatar(file: Blob): Promise<AccountProfile>;\n removeAvatar(): Promise<AccountProfile>;\n}\n\n/** A failed account call: the HTTP status and the server's `error` code, if any. */\nexport class AccountError extends Error {\n constructor(\n readonly status: number,\n readonly code?: string,\n ) {\n super(code ? `HTTP ${status} ${code}` : `HTTP ${status}`);\n this.name = \"AccountError\";\n }\n}\n\nexport const AVATAR_TYPES = [\"image/png\", \"image/jpeg\", \"image/webp\"] as const;\nexport const AVATAR_MAX_BYTES = 2 * 1024 * 1024;\n\n/** Checked BEFORE uploading, so a file the server will refuse is never sent. */\nexport function checkAvatarFile(file: { size: number; type: string }): \"tooLarge\" | \"wrongType\" | null {\n if (!(AVATAR_TYPES as readonly string[]).includes(file.type)) return \"wrongType\";\n if (file.size > AVATAR_MAX_BYTES) return \"tooLarge\";\n return null;\n}\n\n/**\n * What a failed call means for the page. `reauth` = the user's session or its\n * scope does not allow the change (401, or 403 insufficient_scope): signing in\n * again is the fix, so the page says that instead of «try again».\n */\nexport function accountErrorKind(err: unknown): \"reauth\" | \"tooLarge\" | \"wrongType\" | \"other\" {\n if (!(err instanceof AccountError)) return \"other\";\n if (err.status === 401) return \"reauth\";\n if (err.status === 403 && err.code === \"insufficient_scope\") return \"reauth\";\n if (err.status === 413) return \"tooLarge\";\n if (err.status === 415) return \"wrongType\";\n return \"other\";\n}\n\n/**\n * The default adapter: the app's own backend, shaped after @broberg/sso's\n * `accountRoutes()`.\n *\n * GET {url}/profile → AccountProfile\n * POST {url}/profile {name} → AccountProfile\n * POST {url}/profile/avatar (raw bytes, Content-Type = the image's) → AccountProfile\n * POST {url}/profile/avatar/remove → AccountProfile\n *\n * A non-2xx THROWS an AccountError — a failed save must never look like a\n * saved one.\n */\nexport function createFetchAccountAdapter(opts: { url?: string; fetch?: typeof fetch; credentials?: RequestCredentials } = {}): AccountAdapter {\n const base = (opts.url ?? \"/api/account\").replace(/\\/+$/, \"\");\n const call = async (path: string, init?: RequestInit): Promise<AccountProfile> => {\n const res = await (opts.fetch ?? fetch)(`${base}${path}`, {\n credentials: opts.credentials ?? \"same-origin\",\n ...init,\n headers: { accept: \"application/json\", ...(init?.headers as Record<string, string> | undefined) },\n });\n const body = (await res.json().catch(() => null)) as Record<string, unknown> | null;\n if (!res.ok) throw new AccountError(res.status, typeof body?.error === \"string\" ? body.error : undefined);\n if (!body || typeof body.sub !== \"string\") throw new AccountError(res.status, \"bad_response\");\n return body as unknown as AccountProfile;\n };\n return {\n load: () => call(\"/profile\"),\n saveName: (name) =>\n call(\"/profile\", { method: \"POST\", headers: { \"content-type\": \"application/json\" }, body: JSON.stringify({ name }) }),\n uploadAvatar: (file) =>\n call(\"/profile/avatar\", { method: \"POST\", headers: { \"content-type\": file.type }, body: file }),\n removeAvatar: () => call(\"/profile/avatar/remove\", { method: \"POST\" }),\n };\n}\n\n// ── Analytics page (F097) ─────────────────────────────────────────────────\n//\n// The app's OWN visitor numbers from Upmetrics. The app's backend mounts\n// `analyticsRoutes()` from `@upmetrics/sdk/hono` (the uk_ key stays on the\n// server); this package only talks to that backend, through an adapter, and has\n// no dependency on the SDK — the type below is structural, so Upmetrics'\n// `AnalyticsResponse` fits it as is.\n\nexport interface AnalyticsDay {\n /** YYYY-MM-DD on the Europe/Copenhagen calendar (Upmetrics' own day key). */\n day: string;\n visitors: number;\n pageviews: number;\n}\n\nexport interface AnalyticsData {\n totals: { visitors: number; pageviews: number };\n /** The same-length period just before this one. */\n prev: { visitors: number; pageviews: number };\n /** Only days that had visits — use fillDays() to draw the whole period. */\n series: AnalyticsDay[];\n topPages: { value: string; count: number }[];\n}\n\nexport interface AnalyticsAdapter {\n load(days: number): Promise<AnalyticsData>;\n}\n\n/** A failed analytics call: HTTP status (0 = no answer) and the server's `error` code. */\nexport class AnalyticsError extends Error {\n constructor(\n readonly status: number,\n readonly code?: string,\n ) {\n super(code ? `HTTP ${status} ${code}` : `HTTP ${status}`);\n this.name = \"AnalyticsError\";\n }\n}\n\n/** \"unconfigured\" only for the backend's explicit 503 analytics_unconfigured; anything else is \"unavailable\". */\nexport function analyticsErrorKind(err: unknown): \"unconfigured\" | \"unavailable\" {\n return err instanceof AnalyticsError && err.status === 503 && err.code === \"analytics_unconfigured\" ? \"unconfigured\" : \"unavailable\";\n}\n\n/**\n * The default adapter: `GET {url}?days=N` on the app's own backend (default\n * /api/analytics, where `@upmetrics/sdk/hono`'s analyticsRoutes() answers).\n * A non-2xx, an unreadable body or no answer at all THROWS — never zeros that\n * look like a real, quiet month.\n */\nexport function createFetchAnalyticsAdapter(opts: { url?: string; fetch?: typeof fetch; credentials?: RequestCredentials } = {}): AnalyticsAdapter {\n const url = opts.url ?? \"/api/analytics\";\n return {\n async load(days) {\n let res: Response;\n try {\n res = await (opts.fetch ?? fetch)(`${url}${url.includes(\"?\") ? \"&\" : \"?\"}days=${encodeURIComponent(String(days))}`, {\n credentials: opts.credentials ?? \"same-origin\",\n headers: { accept: \"application/json\" },\n });\n } catch {\n throw new AnalyticsError(0);\n }\n const body = (await res.json().catch(() => null)) as Record<string, unknown> | null;\n if (!res.ok) throw new AnalyticsError(res.status, typeof body?.error === \"string\" ? body.error : undefined);\n const ok =\n body !== null &&\n typeof (body.totals as Record<string, unknown> | undefined)?.visitors === \"number\" &&\n Array.isArray(body.series) &&\n Array.isArray(body.topPages);\n if (!ok) throw new AnalyticsError(res.status, \"bad_response\");\n return body as unknown as AnalyticsData;\n },\n };\n}\n\n/** Today's YYYY-MM-DD on the Copenhagen calendar — the calendar Upmetrics buckets on. */\nexport function copenhagenDay(at: Date = new Date()): string {\n return new Intl.DateTimeFormat(\"en-CA\", { timeZone: \"Europe/Copenhagen\", year: \"numeric\", month: \"2-digit\", day: \"2-digit\" }).format(at);\n}\n\n/**\n * Exactly `days` entries ending today (Copenhagen calendar), with Upmetrics'\n * values where it sent a day and zeros where it did not — Upmetrics only sends\n * days that had visits. Calendar arithmetic, so a DST change never skips or\n * repeats a day.\n */\nexport function fillDays(series: AnalyticsDay[], days: number, now: Date = new Date()): AnalyticsDay[] {\n const byDay = new Map(series.map((d) => [d.day, d]));\n const [y, m, d] = copenhagenDay(now).split(\"-\").map(Number) as [number, number, number];\n return Array.from({ length: days }, (_, i) => {\n const day = new Date(Date.UTC(y, m - 1, d - (days - 1 - i))).toISOString().slice(0, 10);\n return byDay.get(day) ?? { day, visitors: 0, pageviews: 0 };\n });\n}\n\n/** Whole-percent change against the previous period, or null when there is nothing to compare with. */\nexport function changePct(now: number, before: number): number | null {\n return before === 0 ? null : Math.round(((now - before) / before) * 100);\n}\n\n// ── Tenant switcher (F029.10) ──────────────────────────────────────────────\n//\n// The user's own organisations, from the app's backend (@broberg/tenant/hono's\n// tenantRoutes: GET /memberships). This package never imports @broberg/tenant;\n// the row type is structural.\n\nexport interface TenantMembershipRow {\n tenant: { id: string; slug: string; name: string; status?: \"active\" | \"suspended\" };\n role: string;\n}\n\nexport interface TenantAdapter {\n load(): Promise<TenantMembershipRow[]>;\n}\n\nexport class TenantLoadError extends Error {\n constructor(readonly status: number) {\n super(`HTTP ${status}`);\n this.name = \"TenantLoadError\";\n }\n}\n\n/** GET {url} (default /api/me/memberships) → the user's memberships. Non-2xx or a bad body THROWS. */\nexport function createFetchTenantAdapter(opts: { url?: string; fetch?: typeof fetch; credentials?: RequestCredentials } = {}): TenantAdapter {\n return {\n async load() {\n let res: Response;\n try {\n res = await (opts.fetch ?? fetch)(opts.url ?? \"/api/me/memberships\", { credentials: opts.credentials ?? \"same-origin\", headers: { accept: \"application/json\" } });\n } catch {\n throw new TenantLoadError(0);\n }\n const body = (await res.json().catch(() => null)) as unknown;\n if (!res.ok) throw new TenantLoadError(res.status);\n if (!Array.isArray(body) || !body.every((r) => r && typeof r.role === \"string\" && r.tenant && typeof r.tenant.slug === \"string\")) {\n throw new TenantLoadError(res.status);\n }\n return body as TenantMembershipRow[];\n },\n };\n}\n\n// ── Text ───────────────────────────────────────────────────────────────────\n\nexport const TEXT = {\n da: {\n openMenu: \"Åbn menu\",\n closeMenu: \"Luk menu\",\n home: \"Forside\",\n working: \"Arbejder\",\n moreFor: \"Mere for\",\n back: \"Tilbage\",\n pinned: \"Fastgjort\",\n language: \"Sprog\",\n zoom: \"Zoom\",\n zoomOut: \"Zoom ud\",\n zoomIn: \"Zoom ind\",\n couldNotMarkAll: \"Kunne ikke markere alle som læst. Prøv igen.\",\n collapse: \"Skjul sidemenu\",\n expand: \"Vis sidemenu\",\n notifications: \"Notifikationer\",\n markAllRead: \"Markér alle læst\",\n noNotifications: \"Ingen notifikationer endnu.\",\n couldNotLoad: \"Kunne ikke hente notifikationer.\",\n seeAll: \"Vis alle\",\n close: \"Luk\",\n account: \"Konto\",\n signOut: \"Log ud\",\n theme: \"Tema\",\n light: \"Lys\",\n dark: \"Mørk\",\n system: \"System\",\n palette: \"Palet\",\n surfaces: \"Flader\",\n flat: \"Flade\",\n layered: \"Lag\",\n backdrop: \"Baggrund\",\n neurons: \"Neuroner\",\n plain: \"Ren\",\n name: \"Navn\",\n email: \"E-mail\",\n save: \"Gem\",\n saving: \"Gemmer…\",\n saved: \"Gemt\",\n loadingProfile: \"Henter profil…\",\n couldNotLoadProfile: \"Kunne ikke hente din profil.\",\n couldNotSave: \"Kunne ikke gemme. Prøv igen.\",\n reauth: \"Log ind igen for at rette\",\n signInAgain: \"Log ind igen\",\n changePicture: \"Skift billede\",\n removePicture: \"Fjern billede\",\n confirmRemovePicture: \"Fjern dit billede?\",\n remove: \"Fjern\",\n cancel: \"Annuller\",\n pictureSaved: \"Billedet er gemt\",\n pictureRemoved: \"Billedet er fjernet\",\n pictureTooLarge: \"Billedet er for stort — højst 2 MB.\",\n pictureWrongType: \"Vælg et PNG-, JPEG- eller WebP-billede.\",\n bidSecurity: \"Sikkerhed i Broberg ID\",\n analyticsPeriod: \"Periode\",\n analyticsDays: \"{n} dage\",\n analyticsVisitors: \"Besøgende\",\n analyticsPageviews: \"Sidevisninger\",\n analyticsVsPrev: \"{pct} % mod forrige periode\",\n analyticsNoPrev: \"Ingen sammenligning\",\n analyticsOverTime: \"Sidevisninger pr. dag\",\n analyticsTopPages: \"Mest besøgte sider\",\n analyticsDay: \"Dag\",\n analyticsPage: \"Side\",\n analyticsEmpty: \"Ingen besøg i perioden.\",\n analyticsLoading: \"Henter tal…\",\n analyticsUnconfigured: \"Analytics er ikke sat op for denne app.\",\n analyticsUnavailable: \"Upmetrics svarer ikke lige nu. Prøv igen om lidt.\",\n tenantSwitch: \"Skift organisation\",\n tenantLoadFailed: \"Kunne ikke hente dine organisationer.\",\n tenantSwitchFailed: \"Kunne ikke skifte organisation. Du er stadig i {name}.\",\n tenantRetry: \"Prøv igen\",\n tenantSuspended: \"lukket\",\n tenantActive: \"aktiv\",\n },\n en: {\n openMenu: \"Open menu\",\n closeMenu: \"Close menu\",\n home: \"Home\",\n working: \"Working\",\n moreFor: \"More for\",\n back: \"Back\",\n pinned: \"Pinned\",\n language: \"Language\",\n zoom: \"Zoom\",\n zoomOut: \"Zoom out\",\n zoomIn: \"Zoom in\",\n couldNotMarkAll: \"Could not mark all as read. Try again.\",\n collapse: \"Hide sidebar\",\n expand: \"Show sidebar\",\n notifications: \"Notifications\",\n markAllRead: \"Mark all read\",\n noNotifications: \"No notifications yet.\",\n couldNotLoad: \"Could not load notifications.\",\n seeAll: \"See all\",\n close: \"Close\",\n account: \"Account\",\n signOut: \"Sign out\",\n theme: \"Theme\",\n light: \"Light\",\n dark: \"Dark\",\n system: \"System\",\n palette: \"Palette\",\n surfaces: \"Surfaces\",\n flat: \"Flat\",\n layered: \"Layered\",\n backdrop: \"Backdrop\",\n neurons: \"Neurons\",\n plain: \"Plain\",\n name: \"Name\",\n email: \"Email\",\n save: \"Save\",\n saving: \"Saving…\",\n saved: \"Saved\",\n loadingProfile: \"Loading profile…\",\n couldNotLoadProfile: \"Could not load your profile.\",\n couldNotSave: \"Could not save. Try again.\",\n reauth: \"Sign in again to make changes\",\n signInAgain: \"Sign in again\",\n changePicture: \"Change picture\",\n removePicture: \"Remove picture\",\n confirmRemovePicture: \"Remove your picture?\",\n remove: \"Remove\",\n cancel: \"Cancel\",\n pictureSaved: \"Picture saved\",\n pictureRemoved: \"Picture removed\",\n pictureTooLarge: \"The picture is too large — 2 MB at most.\",\n pictureWrongType: \"Choose a PNG, JPEG or WebP image.\",\n bidSecurity: \"Security in Broberg ID\",\n analyticsPeriod: \"Period\",\n analyticsDays: \"{n} days\",\n analyticsVisitors: \"Visitors\",\n analyticsPageviews: \"Page views\",\n analyticsVsPrev: \"{pct}% vs previous period\",\n analyticsNoPrev: \"No comparison\",\n analyticsOverTime: \"Page views per day\",\n analyticsTopPages: \"Most visited pages\",\n analyticsDay: \"Day\",\n analyticsPage: \"Page\",\n analyticsEmpty: \"No visits in this period.\",\n analyticsLoading: \"Loading figures…\",\n analyticsUnconfigured: \"Analytics is not set up for this app.\",\n analyticsUnavailable: \"Upmetrics is not answering right now. Try again shortly.\",\n tenantSwitch: \"Switch organisation\",\n tenantLoadFailed: \"Could not load your organisations.\",\n tenantSwitchFailed: \"Could not switch organisation. You are still in {name}.\",\n tenantRetry: \"Try again\",\n tenantSuspended: \"suspended\",\n tenantActive: \"active\",\n },\n} as const;\nexport type Lang = keyof typeof TEXT;\n","/** @jsxImportSource preact */\n// @broberg/app-shell/preact — the fleet's app shell for Stack B (F092).\n//\n// Lifted in shape from cardmem (apps/web/src/components/ui: top-nav, app-sidebar,\n// notification-bell, user-menu, page-header, page-tabs; origin/main af80f192)\n// and trail (the original), rewritten as props-in components: nothing here\n// knows about any app's auth, router or data. Styling is css/app-shell.css,\n// on @broberg/theme's tokens, so every palette × light/dark × flat/layered works.\n//\n// Use the whole thing:\n// <AppShell brand={…} groups={…} currentPath={path} user={…} notifications={source}\n// accountHref=\"https://id.broberg.ai/account\" onSignOut={…}>{page}</AppShell>\n// or compose the parts (Sidebar, TopBar, NotificationBell, UserMenu,\n// PageHeader, PageTabs) in your own layout.\n\nimport type { ComponentChildren, JSX } from \"preact\";\nimport { useEffect, useLayoutEffect, useMemo, useRef, useState } from \"preact/hooks\";\nimport { createBellShell } from \"@broberg/notifications/shell\";\nimport { selectKeyReducer, type SelectState } from \"@broberg/ui-controls-core\";\nimport {\n getBackdrop,\n getPalette,\n getPreference,\n getSurfaces,\n onBackdropChange,\n onPaletteChange,\n onSurfacesChange,\n onThemeChange,\n PALETTE_LABELS,\n PALETTES,\n setBackdrop,\n setPalette,\n setPreference,\n setSurfaces,\n type Backdrop,\n type Palette,\n type Surfaces,\n type ThemePreference,\n} from \"@broberg/theme\";\nimport {\n createFetchTenantAdapter,\n type TenantAdapter,\n type TenantMembershipRow,\n accountErrorKind,\n activeNavLabel,\n analyticsErrorKind,\n changePct,\n createFetchAnalyticsAdapter,\n fillDays,\n type AnalyticsAdapter,\n type AnalyticsData,\n type AnalyticsDay,\n AVATAR_TYPES,\n badgeLabel,\n checkAvatarFile,\n createFetchAccountAdapter,\n type AccountAdapter,\n type AccountProfile,\n initials,\n isActivePath,\n readFlag,\n readSet,\n relativeTime,\n safeNavigate,\n isExternal,\n TEXT,\n writeFlag,\n writeSet,\n type Lang,\n type NavAction,\n type NavGroup,\n type NavItem,\n type NotificationRow,\n type NotificationSource,\n} from \"./index\";\n\nexport * from \"./index\";\n\ntype Icon = ComponentChildren;\nexport type PreactNavItem = NavItem<Icon>;\nexport type PreactNavGroup = NavGroup<Icon>;\n/** Called instead of a full page load when given. Return false to let the browser navigate. */\nexport type Navigate = (href: string) => void;\n\nconst MOBILE_QUERY = \"(max-width: 767px)\";\n\n/** True below 768px. Follows the window as it resizes. */\nexport function useIsMobile(): boolean {\n const get = () => typeof window !== \"undefined\" && typeof window.matchMedia === \"function\" && window.matchMedia(MOBILE_QUERY).matches;\n const [mobile, setMobile] = useState(get);\n useEffect(() => {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") return;\n const mq = window.matchMedia(MOBILE_QUERY);\n const on = () => setMobile(mq.matches);\n mq.addEventListener?.(\"change\", on);\n return () => mq.removeEventListener?.(\"change\", on);\n }, []);\n return mobile;\n}\n\n/** An <a> that hands the click to `onNavigate` (SPA) when given, else a normal link. */\nfunction NavLink(props: {\n href: string;\n onNavigate?: Navigate;\n onAfter?: () => void;\n class?: string;\n children: ComponentChildren;\n \"data-testid\"?: string;\n \"aria-current\"?: \"page\";\n \"aria-label\"?: string;\n title?: string;\n role?: \"menuitem\";\n}) {\n const { href, onNavigate, onAfter, children, ...rest } = props;\n // F092.10 / D-d28547: a link that leaves the app opens in a new tab, and is\n // never handed to the app's router. Decided HERE, once, for every link the\n // shell renders — a rule that has to be remembered per link is forgotten.\n if (isExternal(href)) {\n return (\n <a {...rest} href={href} target=\"_blank\" rel=\"noopener noreferrer\" onClick={() => onAfter?.()}>\n {children}\n </a>\n );\n }\n return (\n <a\n {...rest}\n href={href}\n onClick={(e: JSX.TargetedMouseEvent<HTMLAnchorElement>) => {\n if (onNavigate && !e.metaKey && !e.ctrlKey && !e.shiftKey && e.button === 0) {\n e.preventDefault();\n onNavigate(href);\n }\n onAfter?.();\n }}\n >\n {children}\n </a>\n );\n}\n\n// ── Icons (inline, so the package has no icon dependency) ─────────────────\nconst svg = (d: ComponentChildren, size = 18) => (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n {d}\n </svg>\n);\nconst IconMenu = () => svg(<path d=\"M4 6h16M4 12h16M4 18h16\" />, 20);\nconst IconChevron = ({ open }: { open?: boolean }) => (\n <span class={\"bas-chev\" + (open ? \" is-open\" : \"\")}>{svg(<path d=\"m9 18 6-6-6-6\" />, 12)}</span>\n);\n// lucide \"panel-left\" (ISC), the exact icon in shadcn's SidebarTrigger (F092.4).\nconst IconPanelLeft = () => svg(<><rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" /><path d=\"M9 3v18\" /></>, 16);\nconst IconBell = () => svg(<><path d=\"M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9\" /><path d=\"M10.3 21a1.94 1.94 0 0 0 3.4 0\" /></>, 19);\nconst IconLogOut = () => svg(<><path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" /><path d=\"m16 17 5-5-5-5\" /><path d=\"M21 12H9\" /></>, 14);\n// lucide \"pin\" (ISC).\nconst IconPin = () => svg(<><path d=\"M12 17v5\" /><path d=\"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z\" /></>, 12);\nconst IconUser = () => svg(<><circle cx=\"12\" cy=\"8\" r=\"4\" /><path d=\"M4 21a8 8 0 0 1 16 0\" /></>, 14);\n// F092.27 — lucide «building», for the organisation line in the user menu.\nconst IconBuilding = () => svg(<><rect width=\"16\" height=\"20\" x=\"4\" y=\"2\" rx=\"2\" /><path d=\"M9 22v-4h6v4\" /><path d=\"M8 6h.01M16 6h.01M12 6h.01M12 10h.01M12 14h.01M16 10h.01M16 14h.01M8 10h.01M8 14h.01\" /></>, 15);\n\n// ── Row actions (F092.21) ──────────────────────────────────────────────────\n//\n// A «…» per sidebar item, opening a popover menu (position:fixed from the\n// button, like the palette list in F001.25, so the sidebar's scroll frame cannot\n// clip it). Three views in one popover: the list, a submenu with a back arrow,\n// and an input with «Gem» (rename). Keys: arrows move, Enter picks, an action's\n// kbd letter picks it, ←/Backspace-on-empty goes back, Escape closes and puts\n// focus back on «…».\n\ntype RowView = { kind: \"list\"; actions: NavAction[]; title?: string } | { kind: \"input\"; action: NavAction };\n\nexport interface ItemActionsMenuProps {\n /** The menu's items — the same NavAction[] a sidebar row takes (kbd, submenu, input, confirm, danger). */\n actions: NavAction[];\n /** What the menu opens from: positioned from it, and focus returns to it on close. */\n anchor: HTMLElement;\n /** An action was chosen (value = the text, for an input action). The menu has closed. */\n onAction: (actionId: string, value?: string) => void;\n /** The menu closed — by a pick, Escape, a click outside, scroll or resize. Unmount it here. */\n onClose: () => void;\n lang: Lang;\n /** The menu's accessible name, e.g. the conversation's title. */\n label: string;\n /**\n * \"auto\" (default): right-aligned to the anchor, below it if it fits, else above.\n * \"down\": right-aligned, always below. \"up-start\" (F092.31): ABOVE the anchor and\n * left-aligned to its left edge (e.g. a «+» in a composer); below if there is no room above.\n */\n placement?: \"auto\" | \"down\" | \"up-start\";\n /** testids: `<prefix>-menu`, `<prefix>-action-<id>`, `<prefix>-back`, `<prefix>-input`, `<prefix>-save`. Default \"item-actions\". */\n testidPrefix?: string;\n}\n\n/**\n * F092.29 — the row-action menu on its own, so a title «⌄» and a sidebar row «…»\n * open THE SAME menu (scout #2745). The sidebar's row menu is this component: one\n * implementation, so keyboard, confirm, input and submenu cannot drift apart.\n * Mount it while open; it closes itself through onClose.\n *\n * Keys (F092.21/.22): focus moves into the menu when it opens; arrows move real\n * focus; Enter/Space act on the FOCUSED item; a kbd letter picks; ←/Backspace goes\n * back from a submenu; Escape closes and returns focus to the anchor.\n */\nexport function ItemActionsMenu(props: ItemActionsMenuProps) {\n const t = TEXT[props.lang];\n const pre = props.testidPrefix ?? \"item-actions\";\n const menu = useRef<HTMLDivElement>(null);\n const first: RowView[] = [{ kind: \"list\", actions: props.actions }];\n const [stack, setStack] = useState<RowView[]>(first);\n // F092.22 — the current stack in a ref as well, set the moment it changes, so a\n // key that arrives before the next render already sees it.\n const stackRef = useRef<RowView[]>(first);\n const setStackNow = (next: RowView[]) => {\n stackRef.current = next;\n setStack(next);\n };\n const [hi, setHiState] = useState(0);\n // F092.22 — the highlight also lives in a ref, updated at once: two keys pressed\n // before the next render must build on each other, not both start from the old value.\n const hiRef = useRef(0);\n const setHi = (n: number) => {\n hiRef.current = n;\n setHiState(n);\n };\n // F092.22 — a confirm action is \"armed\" by the first pick and runs on the second.\n const [armed, setArmedState] = useState<string | null>(null);\n const armedRef = useRef<string | null>(null);\n const setArmed = (v: string | null) => {\n armedRef.current = v;\n setArmedState(v);\n };\n const items = useRef<(HTMLButtonElement | null)[]>([]);\n const onKeyDownRef = useRef<(e: KeyboardEvent) => void>(() => {});\n const [value, setValue] = useState(\"\");\n const [pos, setPos] = useState<Record<string, string> | undefined>(undefined);\n const view = stack[stack.length - 1]!;\n const closed = useRef(false);\n // F092.32 — the focus ring is for keyboard use only: on when the anchor was\n // keyboard-focused at open (Tab + Enter), or from the first key in the menu.\n const [kbd, setKbd] = useState(() => props.anchor.matches(\":focus-visible\"));\n\n const close = (refocus = true) => {\n if (closed.current) return;\n closed.current = true;\n if (refocus) props.anchor.focus();\n props.onClose();\n };\n const show = (v: RowView) => {\n setStackNow([...stackRef.current, v]);\n setHi(0);\n setArmed(null);\n if (v.kind === \"input\") setValue(v.action.input!.value);\n };\n const back = () => {\n setStackNow(stackRef.current.slice(0, -1));\n setHi(0);\n setArmed(null);\n };\n const pick = (a: NavAction) => {\n if (a.submenu?.length) return show({ kind: \"list\", actions: a.submenu, title: a.label });\n if (a.input) return show({ kind: \"input\", action: a });\n if (a.confirm && armedRef.current !== a.id) return setArmed(a.id); // first pick arms, the menu stays open\n close();\n props.onAction(a.id);\n };\n const save = (a: NavAction) => {\n close();\n props.onAction(a.id, value);\n };\n\n useLayoutEffect(() => {\n const r = props.anchor.getBoundingClientRect();\n const vw = window.innerWidth, vh = window.innerHeight, m = 8;\n const w = Math.min(240, vw - 2 * m);\n const h = menu.current?.offsetHeight ?? 0;\n const start = props.placement === \"up-start\";\n const left = Math.max(m, Math.min(start ? r.left : r.right - w, vw - w - m));\n const fitsBelow = r.bottom + 4 + h <= vh - m;\n const fitsAbove = r.top - 4 - h >= m;\n const below = start ? !fitsAbove : props.placement === \"down\" || fitsBelow || !fitsAbove;\n const top = below ? Math.min(r.bottom + 4, vh - m - h) : r.top - 4 - h;\n setPos({ position: \"fixed\", left: `${left}px`, top: `${Math.max(m, top)}px`, width: `${w}px` });\n }, [stack.length]);\n\n // F092.22 — focus only once the menu is VISIBLE (pos set): an element under\n // visibility:hidden cannot take focus, which is why 0.13.1 left focus on «…».\n // Real DOM focus follows the highlight, so Enter acts on what the user sees focused.\n // A layout effect reading the CURRENT highlight (the ref): a passive effect from\n // the opening render once ran after a fast ↓ and focused item 0 with its stale\n // value — and that focus reset the highlight, so the next ↓ landed one short.\n useLayoutEffect(() => {\n if (!pos) return;\n if (view.kind === \"input\") menu.current?.querySelector<HTMLInputElement>(\"input\")?.focus();\n else items.current[hiRef.current]?.focus();\n }, [pos, hi, stack.length]);\n\n // A LAYOUT effect: attached in the same task the menu appears, so no key event\n // can fall between \"menu exists\" and \"listener exists\" (a passive effect runs\n // after paint, and a fast ↓ landed in that gap).\n useLayoutEffect(() => {\n const outside = (e: Event) => {\n const n = e.target instanceof Node ? e.target : null;\n if (n && (menu.current?.contains(n) || props.anchor.contains(n))) return; // the anchor toggles itself\n close(false);\n };\n // F092.22 — a key typed before focus has reached the menu (it moves there\n // only once the menu is visible) still belongs to the menu: arrows, shortcut\n // letters, Escape. Enter/Space/Tab are left alone — on the anchor they toggle the menu.\n const early = (e: KeyboardEvent) => {\n const n = e.target instanceof Node ? e.target : null;\n if (n && menu.current?.contains(n)) return; // the menu's own handler takes it\n if (e.key === \"Enter\" || e.key === \" \" || e.key === \"Spacebar\" || e.key === \"Tab\") return;\n onKeyDownRef.current(e);\n };\n document.addEventListener(\"keydown\", early, true);\n document.addEventListener(\"mousedown\", outside);\n window.addEventListener(\"scroll\", outside, true);\n window.addEventListener(\"resize\", outside);\n return () => {\n document.removeEventListener(\"keydown\", early, true);\n document.removeEventListener(\"mousedown\", outside);\n window.removeEventListener(\"scroll\", outside, true);\n window.removeEventListener(\"resize\", outside);\n };\n }, []);\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (closed.current) return;\n const stack = stackRef.current;\n const view = stack[stack.length - 1];\n if (!view) return;\n e.stopPropagation(); // the user menu / app must not also act on these keys\n setKbd(true);\n if (e.key === \"Escape\") {\n e.preventDefault();\n return close();\n }\n if (view.kind === \"input\") {\n if (e.key === \"Enter\") {\n e.preventDefault();\n save(view.action);\n }\n return;\n }\n if ((e.key === \"ArrowLeft\" || e.key === \"Backspace\") && stack.length > 1) {\n e.preventDefault();\n return back();\n }\n const list = view.actions;\n if (e.key === \"Enter\" || e.key === \" \" || e.key === \"Spacebar\") {\n // The item that HAS focus — never a different highlighted one (scout #2662:\n // Enter on «Tilføj til projekt» pinned the conversation instead).\n e.preventDefault();\n const at = items.current.findIndex((b) => b === document.activeElement);\n const idx = at >= 0 ? at : hiRef.current;\n return list[idx] ? pick(list[idx]!) : undefined;\n }\n const { state, intent } = selectKeyReducer({ open: true, highlighted: hiRef.current }, e.key, list.length);\n if (intent.type === \"select\") {\n e.preventDefault();\n return pick(list[intent.index]!);\n }\n if (state.highlighted !== hiRef.current) {\n e.preventDefault();\n return setHi(state.highlighted);\n }\n const byKbd = e.key.length === 1 ? list.find((a) => a.kbd?.toLowerCase() === e.key.toLowerCase()) : undefined;\n if (byKbd) {\n e.preventDefault();\n pick(byKbd);\n }\n };\n\n onKeyDownRef.current = onKeyDown;\n\n return (\n <div\n ref={menu}\n class={\"bas-rowmenu\" + (kbd ? \" is-kbd\" : \"\")}\n role=\"menu\"\n tabIndex={-1}\n aria-label={view.kind === \"list\" && view.title ? view.title : props.label}\n data-testid={`${pre}-menu`}\n style={pos ?? { position: \"fixed\", visibility: \"hidden\" }}\n onKeyDown={onKeyDown}\n >\n {stack.length > 1 ? (\n <button type=\"button\" class=\"bas-rowmenu__back\" data-testid={`${pre}-back`} aria-label={t.back} onClick={back}>\n <IconChevronLeft />\n <span>{view.kind === \"list\" ? view.title : view.action.label}</span>\n </button>\n ) : null}\n {view.kind === \"list\" ? (\n view.actions.map((a, i) => [\n a.separator ? <div key={`${a.id}-sep`} class=\"bas-rowmenu__sep\" role=\"separator\" /> : null,\n <button\n type=\"button\"\n role=\"menuitem\"\n key={a.id}\n ref={(el) => {\n items.current[i] = el;\n }}\n tabIndex={i === hi ? 0 : -1}\n class={\"bas-rowmenu__item\" + (i === hi ? \" is-active\" : \"\") + (a.danger ? \" is-danger\" : \"\") + (armed === a.id ? \" is-armed\" : \"\")}\n data-testid={`${pre}-action-${a.id}`}\n onMouseEnter={() => setHi(i)}\n onFocus={() => setHi(i)}\n onClick={() => pick(a)}\n >\n {a.icon ? <span class=\"bas-rowmenu__icon\">{a.icon as ComponentChildren}</span> : null}\n <span class=\"bas-rowmenu__label\">{armed === a.id && a.confirm ? a.confirm.label : a.label}</span>\n {a.value ? <span class=\"bas-rowmenu__value\" data-testid={`${pre}-action-${a.id}-value`}>{a.value}</span> : null}\n {a.submenu?.length ? <IconChevronRight /> : a.kbd ? <kbd class=\"bas-rowmenu__kbd\">{a.kbd.toUpperCase()}</kbd> : null}\n </button>,\n ])\n ) : (\n <form\n class=\"bas-rowmenu__form\"\n data-testid={`${pre}-form`}\n onSubmit={(e) => {\n e.preventDefault();\n save(view.action);\n }}\n >\n <input\n class=\"bas-rowmenu__input\"\n data-testid={`${pre}-input`}\n aria-label={view.action.label}\n value={value}\n placeholder={view.action.input!.placeholder}\n onInput={(e) => setValue((e.currentTarget as HTMLInputElement).value)}\n />\n <button type=\"submit\" class=\"bas-rowmenu__save\" data-testid={`${pre}-save`}>\n {view.action.input!.saveLabel ?? t.save}\n </button>\n </form>\n )}\n </div>\n );\n}\n\n// The sidebar row's «…»: a button plus ItemActionsMenu while open.\nfunction RowActions(props: { item: PreactNavItem; lang: Lang; onAction: (actionId: string, value?: string) => void }) {\n const t = TEXT[props.lang];\n const id = props.item.id;\n const btn = useRef<HTMLButtonElement>(null);\n const [open, setOpenState] = useState(false);\n // In a ref too, so a second click before the re-render toggles correctly.\n const openRef = useRef(false);\n const setOpen = (v: boolean) => {\n openRef.current = v;\n setOpenState(v);\n };\n return (\n <>\n <button\n ref={btn}\n type=\"button\"\n class={\"bas-item__more\" + (open ? \" is-open\" : \"\")}\n data-testid={`sidebar-item-${id}-more`}\n aria-label={`${t.moreFor} ${props.item.label}`}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n onClick={() => {\n if (!openRef.current) return setOpen(true);\n setOpen(false);\n btn.current?.focus();\n }}\n >\n <IconMore />\n </button>\n {open && btn.current ? (\n <ItemActionsMenu\n actions={props.item.actions!}\n anchor={btn.current}\n lang={props.lang}\n label={props.item.label}\n testidPrefix={`sidebar-item-${id}`}\n onAction={props.onAction}\n onClose={() => setOpen(false)}\n />\n ) : null}\n </>\n );\n}\n\n// lucide \"ellipsis\", \"chevron-left/right\" (ISC).\nconst IconMore = () => svg(<><circle cx=\"12\" cy=\"12\" r=\"1\" /><circle cx=\"19\" cy=\"12\" r=\"1\" /><circle cx=\"5\" cy=\"12\" r=\"1\" /></>, 16);\nconst IconChevronLeft = () => svg(<path d=\"m15 18-6-6 6-6\" />, 14);\nconst IconChevronRight = () => svg(<path d=\"m9 18 6-6-6-6\" />, 14);\n\n// ── Sidebar ────────────────────────────────────────────────────────────────\n\nexport interface SidebarProps {\n groups: PreactNavGroup[];\n footer?: PreactNavItem[];\n currentPath: string;\n onNavigate?: Navigate;\n /** Desktop: is the sidebar folded (to nothing, or to the icon rail — see `collapse`). */\n collapsed?: boolean;\n /**\n * F092.6 — what \"folded\" means on desktop, as shadcn's `collapsible`:\n * \"offcanvas\" hides the sidebar, \"icon\" keeps a 48px rail of item icons with\n * `brandMark` on top. Default: \"icon\" when `mobile` is \"rail\", else \"offcanvas\".\n */\n collapse?: \"offcanvas\" | \"icon\";\n /** The app's logo icon, shown at the top of the icon rail. */\n brandMark?: ComponentChildren;\n /** F092.7 — the app's start page: `header` and `brandMark` become links to it. */\n homeHref?: string;\n /** Accessible name of the brandMark link (it has no visible text). Default \"Forside\"/\"Home\". */\n homeLabel?: string;\n /** data-testid of the brand link in the sidebar head. */\n brandTestId?: string;\n /** Phone, drawer mode: is the drawer open. */\n mobileOpen?: boolean;\n onClose?: () => void;\n mobile?: \"drawer\" | \"rail\";\n /** Shown at the top of the sidebar (e.g. the brand on a phone). */\n header?: ComponentChildren;\n /** localStorage key for which groups are folded. */\n groupsKey?: string;\n /** localStorage key for which items with children are open (F092.5). */\n itemsKey?: string;\n lang: Lang;\n /** F092.15 — rendered at the very bottom of the sidebar (the user menu in \"sidebar-footer\"). */\n bottom?: ComponentChildren;\n /** F092.21 — a row action was chosen (value: the saved text of an `input` action). */\n onItemAction?: (navItemId: string, actionId: string, value?: string) => void;\n}\n\nexport function Sidebar(p: SidebarProps) {\n const key = p.groupsKey ?? \"broberg-app-shell.groups\";\n const itemsKey = p.itemsKey ?? \"broberg-app-shell.items\";\n const mode = p.mobile ?? \"drawer\";\n const collapseMode = p.collapse ?? (mode === \"rail\" ? \"icon\" : \"offcanvas\");\n const isMobile = useIsMobile();\n // The rail: on a phone in rail mode, or on desktop when folded to icons.\n const railed = isMobile ? mode === \"rail\" : !!p.collapsed && collapseMode === \"icon\";\n\n const [folded, setFolded] = useState<Set<string>>(() => readSet(key));\n const toggleGroup = (label: string) => {\n const next = new Set(folded);\n next.has(label) ? next.delete(label) : next.add(label);\n setFolded(next);\n writeSet(key, next);\n };\n\n const all = [...p.groups.flatMap((g) => g.items), ...(p.footer ?? [])];\n const childActive = (it: PreactNavItem) => !!it.children?.some((c) => isActivePath(c.href, p.currentPath));\n // Open = what the user left open, plus any parent of the page they are on.\n const [openItems, setOpenItems] = useState<Set<string>>(() => {\n const s = readSet(itemsKey);\n for (const it of all) if (childActive(it)) s.add(it.id);\n return s;\n });\n const toggleItem = (id: string) => {\n const next = new Set(openItems);\n next.has(id) ? next.delete(id) : next.add(id);\n setOpenItems(next);\n writeSet(itemsKey, next);\n };\n\n // F092.6 — the rail's flyout for an item with children.\n const [flyout, setFlyout] = useState<{ id: string; top: number; left: number } | null>(null);\n const flyoutRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n if (!flyout) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setFlyout(null);\n };\n const onDown = (e: MouseEvent) => {\n const t = e.target as Node | null;\n if (flyoutRef.current && t && flyoutRef.current.contains(t)) return;\n if (t instanceof Element && t.closest(`[data-flyout-for=\"${flyout.id}\"]`)) return;\n setFlyout(null);\n };\n document.addEventListener(\"keydown\", onKey);\n document.addEventListener(\"mousedown\", onDown);\n return () => {\n document.removeEventListener(\"keydown\", onKey);\n document.removeEventListener(\"mousedown\", onDown);\n };\n }, [flyout]);\n useEffect(() => {\n if (!railed) setFlyout(null);\n }, [railed]);\n\n const close = () => {\n setFlyout(null);\n p.onClose?.();\n };\n\n const leaf = (it: PreactNavItem, sub = false) => {\n const active = isActivePath(it.href, p.currentPath);\n const badge = badgeLabel(it.badge);\n const link = (\n <NavLink\n key={it.id}\n href={it.href}\n onNavigate={p.onNavigate}\n onAfter={close}\n class={\"bas-item\" + (sub ? \" bas-item--sub\" : \"\") + (active ? \" is-active\" : \"\")}\n data-testid={`sidebar-item-${it.id}`}\n aria-current={active ? \"page\" : undefined}\n aria-label={railed && !sub ? it.label : undefined}\n title={it.label}\n >\n {active && !sub ? <span class=\"bas-item__bar\" /> : null}\n {it.icon ? <span class=\"bas-item__icon\">{it.icon}</span> : null}\n {it.marker === \"working\" ? (\n <span class=\"bas-item__marker\" data-testid={`sidebar-item-${it.id}-marker`} role=\"img\" aria-label={TEXT[p.lang].working} />\n ) : it.marker === \"idle\" ? (\n <span class=\"bas-item__marker bas-item__marker--idle\" data-testid={`sidebar-item-${it.id}-marker`} aria-hidden=\"true\" />\n ) : null}\n <span class=\"bas-item__label\">{it.label}</span>\n {it.pinned ? (\n <span class=\"bas-item__pin\" data-testid={`sidebar-item-${it.id}-pinned`} role=\"img\" aria-label={TEXT[p.lang].pinned}>\n <IconPin />\n </span>\n ) : null}\n {badge ? <span class=\"bas-item__count\" data-testid={`sidebar-badge-${it.id}`}>{badge}</span> : null}\n </NavLink>\n );\n // F092.21 — a link cannot contain a button, so an item with actions is a row: link + «…».\n if (!it.actions?.length || railed) return link;\n return (\n <div class=\"bas-itemrow\" key={it.id}>\n {link}\n <RowActions item={it} lang={p.lang} onAction={(a, v) => (v === undefined ? p.onItemAction?.(it.id, a) : p.onItemAction?.(it.id, a, v))} />\n </div>\n );\n };\n\n const parent = (it: PreactNavItem) => {\n const children = it.children!;\n const onPage = childActive(it) || isActivePath(it.href, p.currentPath);\n const open = railed ? flyout?.id === it.id : openItems.has(it.id);\n const onClick = (e: JSX.TargetedMouseEvent<HTMLButtonElement>) => {\n if (!railed) return toggleItem(it.id);\n if (flyout?.id === it.id) return setFlyout(null);\n const r = e.currentTarget.getBoundingClientRect();\n setFlyout({ id: it.id, top: r.top, left: r.right + 6 });\n };\n return (\n <div class=\"bas-itemgroup\" key={it.id}>\n <button\n type=\"button\"\n class={\"bas-item bas-item--parent\" + (onPage ? \" is-parent-active\" : \"\")}\n data-testid={`sidebar-item-${it.id}-toggle`}\n data-flyout-for={it.id}\n aria-expanded={open}\n aria-label={railed ? it.label : undefined}\n title={it.label}\n onClick={onClick}\n >\n {onPage && railed ? <span class=\"bas-item__bar\" /> : null}\n {it.icon ? <span class=\"bas-item__icon\">{it.icon}</span> : null}\n <span class=\"bas-item__label\">{it.label}</span>\n <span class=\"bas-item__chev\">\n <IconChevron open={open} />\n </span>\n </button>\n {!railed && open ? <div class=\"bas-sub\">{children.map((c) => leaf(c, true))}</div> : null}\n {railed && flyout?.id === it.id ? (\n <div\n ref={flyoutRef}\n class=\"bas-flyout\"\n data-testid={`sidebar-flyout-${it.id}`}\n role=\"menu\"\n aria-label={it.label}\n style={{ top: `${flyout.top}px`, left: `${flyout.left}px` }}\n >\n <div class=\"bas-flyout__title\">{it.label}</div>\n {children.map((c) => leaf(c, true))}\n </div>\n ) : null}\n </div>\n );\n };\n\n const item = (it: PreactNavItem) => (it.children?.length ? parent(it) : leaf(it));\n\n return (\n <>\n {mode === \"drawer\" ? (\n <div class={\"bas-backdrop\" + (p.mobileOpen ? \" is-open\" : \"\")} data-testid=\"sidebar-backdrop\" onClick={close} />\n ) : null}\n <aside\n class={\n \"bas-sidebar\" +\n ` is-mobile-${mode}` +\n (p.mobileOpen ? \" is-open\" : \"\") +\n (p.collapsed ? \" is-collapsed\" : \"\") +\n (railed ? \" is-railed\" : \"\")\n }\n data-testid=\"sidebar-root\"\n data-mobile={mode}\n data-collapse={collapseMode}\n aria-label=\"Navigation\"\n >\n {p.header || p.brandMark ? (\n <div class=\"bas-sidebar__head\">\n {p.header ? (\n <div class=\"bas-sidebar__brand\">\n {/* F092.17 — aria-label = the app's name when given; without it the visible header stays the name (\"Forside\" must not override it). */}\n {p.homeHref ? (\n <NavLink href={p.homeHref} onNavigate={p.onNavigate} onAfter={close} class=\"bas-home\" data-testid={p.brandTestId ?? \"sidebar-brand-home\"} aria-label={p.homeLabel}>\n {p.header}\n </NavLink>\n ) : (\n p.header\n )}\n </div>\n ) : null}\n {p.brandMark ? (\n <div class=\"bas-sidebar__mark\" data-testid=\"sidebar-brand-mark\">\n {p.homeHref ? (\n <NavLink\n href={p.homeHref}\n onNavigate={p.onNavigate}\n onAfter={close}\n class=\"bas-home\"\n data-testid=\"brand-mark-home\"\n aria-label={p.homeLabel ?? TEXT[p.lang].home}\n title={p.homeLabel ?? TEXT[p.lang].home}\n >\n {p.brandMark}\n </NavLink>\n ) : (\n p.brandMark\n )}\n </div>\n ) : null}\n </div>\n ) : null}\n <nav class=\"bas-sidebar__nav\">\n {p.groups.map((g) => {\n const fixed = g.hideLabel || g.collapsible === false;\n const open = railed || fixed || !folded.has(g.label);\n const slug = g.label.toLowerCase().replace(/[^a-z0-9]+/g, \"-\");\n return (\n <div\n class={\"bas-group\" + (g.variant === \"plain\" ? \" bas-group--plain\" : \"\")}\n key={g.label}\n role={g.hideLabel ? \"group\" : undefined}\n aria-label={g.hideLabel ? g.label : undefined}\n data-testid={g.hideLabel ? `sidebar-group-${slug}-unlabelled` : undefined}\n >\n {(() => {\n if (g.hideLabel) return null;\n const heading =\n g.collapsible === false ? (\n <div class=\"bas-group__label bas-group__label--static\" data-testid={`sidebar-group-${slug}`}>\n <span>{g.label}</span>\n </div>\n ) : (\n <button type=\"button\" class=\"bas-group__label\" data-testid={`sidebar-group-${slug}`} aria-expanded={open} onClick={() => toggleGroup(g.label)}>\n <IconChevron open={open} />\n <span>{g.label}</span>\n </button>\n );\n if (!g.action) return heading;\n // F092.28 — heading + an icon button at the right; a sibling, so clicking it never folds.\n const a = g.action;\n return (\n <div class=\"bas-group__head\">\n {heading}\n <button\n type=\"button\"\n class=\"bas-group__action\"\n data-testid={a.testid ?? `sidebar-group-${slug}-action`}\n aria-label={a.label}\n title={a.label}\n aria-haspopup=\"menu\"\n aria-expanded={a.expanded ?? false}\n onClick={(e) => a.onClick(e.currentTarget as HTMLElement)}\n >\n {a.icon}\n </button>\n </div>\n );\n })()}\n {open ? g.items.map(item) : null}\n {/* F092.20 — sub-headings inside one group (\"I dag\", \"I går\"). */}\n {open\n ? g.sections?.map((sec) => (\n <div class=\"bas-section\" key={sec.label} data-testid={`sidebar-section-${slug}-${sec.label.toLowerCase().replace(/[^a-z0-9æøå]+/g, \"-\")}`}>\n <div class=\"bas-section__label\">{sec.label}</div>\n {sec.items.map(item)}\n </div>\n ))\n : null}\n </div>\n );\n })}\n </nav>\n {p.footer?.length ? <div class=\"bas-sidebar__foot\">{p.footer.map(item)}</div> : null}\n {p.bottom ? <div class=\"bas-sidebar__user\" data-testid=\"sidebar-user\">{p.bottom}</div> : null}\n </aside>\n </>\n );\n}\n\n// ── Notification bell ──────────────────────────────────────────────────────\n//\n// Driven by @broberg/notifications' createBellShell: one count however many\n// bells, Escape acts on the innermost layer, and the ids \"mark all read\"\n// actually cleared are held for the visit. This component is only the DOM.\n\nexport interface NotificationBellProps {\n /** Where the data comes from. Absent: the bell is still there, with an empty list. */\n source?: NotificationSource;\n onNavigate?: Navigate;\n /** Required on purpose: a default would make \"nobody chose\" look like a choice. */\n lang: Lang;\n}\n\nexport function NotificationBell({ source, onNavigate, lang }: NotificationBellProps) {\n const t = TEXT[lang];\n const mobile = useIsMobile();\n const [error, setError] = useState<string | null>(null);\n const lastCount = useRef(0);\n const shell = useMemo(\n () =>\n createBellShell({\n labels: { bell: t.notifications, panel: t.notifications, markAll: t.markAllRead, seeAll: t.seeAll, empty: t.noNotifications, close: t.close },\n countUnseen: async () => {\n if (!source) return 0;\n try {\n lastCount.current = await source.countUnseen();\n setError(null);\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n }\n return lastCount.current;\n },\n loadRows: async () => {\n if (!source) return [];\n try {\n return await source.loadRows();\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n return [];\n }\n },\n markAllSeen: async () => (source ? source.markAllSeen() : []),\n }),\n [source, lang],\n );\n const [state, setState] = useState(shell.getState());\n useEffect(() => shell.subscribe(setState), [shell]);\n useEffect(() => {\n setState(shell.getState());\n void shell.refresh();\n return source?.subscribe?.(() => {\n if (shell.getState().open) void shell.open(shell.getState().anchor);\n else void shell.refresh();\n });\n }, [shell, source]);\n // F092.9 — a click anywhere outside the bell and its panel closes it (not\n // only a click that happens to land on the overlay: Lens 332fdd8c clicked a\n // dropzone straight through it), and Escape hands focus back to the bell.\n const bellRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n if (!state.open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && shell.escape() === \"close\") {\n e.preventDefault();\n bellRef.current?.focus();\n }\n };\n const onDown = (e: MouseEvent) => {\n const t = e.target as Node | null;\n if (t && (panelRef.current?.contains(t) || bellRef.current?.contains(t))) return;\n shell.close();\n };\n document.addEventListener(\"keydown\", onKey);\n document.addEventListener(\"mousedown\", onDown);\n return () => {\n document.removeEventListener(\"keydown\", onKey);\n document.removeEventListener(\"mousedown\", onDown);\n };\n }, [state.open, shell]);\n\n // F092.9 — Christian: «Marker alle læst på klokken skal automatisk lukke\n // dropdown det har jeg fået rettet 300 gange i diverse apps». Close only when\n // it WORKED: a panel that closes on a failure hides that nothing was marked.\n const [markAllFailed, setMarkAllFailed] = useState(false);\n useEffect(() => {\n if (!state.open) setMarkAllFailed(false);\n }, [state.open]);\n const onMarkAll = async () => {\n setMarkAllFailed(false);\n try {\n await shell.markAllSeen();\n } catch {\n setMarkAllFailed(true);\n return;\n }\n shell.close();\n };\n const label = badgeLabel(state.count);\n const onRow = async (n: NotificationRow) => {\n shell.close();\n if (n.seenAt == null && source) {\n await source.markSeen([n.id]);\n await shell.refresh();\n }\n const target = safeNavigate(n.navigate);\n if (target && isExternal(target)) {\n // F092.10 — leaves the app: a new tab, never the app's router.\n if (typeof window !== \"undefined\") window.open(target, \"_blank\", \"noopener,noreferrer\");\n } else if (target) {\n if (onNavigate) onNavigate(target);\n else if (typeof window !== \"undefined\") window.location.assign(target);\n }\n };\n const seen = (n: NotificationRow) => n.seenAt != null || state.clearedIds.includes(n.id);\n\n return (\n <div class=\"bas-bell\">\n <button\n type=\"button\"\n ref={bellRef}\n class=\"bas-iconbtn\"\n data-testid=\"topbar-notifications\"\n aria-label={t.notifications}\n aria-expanded={state.open}\n onClick={(e: JSX.TargetedMouseEvent<HTMLButtonElement>) => {\n const r = e.currentTarget.getBoundingClientRect();\n void shell.toggle({ top: r.top, right: r.right, bottom: r.bottom, left: r.left, width: r.width, height: r.height } as never);\n }}\n >\n <IconBell />\n {label ? (\n <span class=\"bas-bell__count\" data-testid=\"topbar-notifications-count\">\n {label}\n </span>\n ) : null}\n </button>\n {state.open ? (\n <>\n <div class={\"bas-overlay\" + (mobile ? \" is-dim\" : \"\")} data-testid=\"notifications-backdrop\" onClick={() => shell.close()} />\n <div\n ref={panelRef}\n class={\"bas-panel \" + (mobile ? \"bas-panel--sheet\" : \"bas-panel--drop\")}\n role=\"dialog\"\n aria-label={shell.labels.panel}\n data-testid={mobile ? \"notifications-drawer\" : \"notifications-dropdown\"}\n >\n <div class=\"bas-panel__head\">\n <h3>{t.notifications}</h3>\n <button type=\"button\" class=\"bas-link\" data-testid=\"notifications-mark-all\" onClick={() => void onMarkAll()} disabled={!state.count}>\n {shell.labels.markAll}\n </button>\n </div>\n {markAllFailed ? (\n <p class=\"bas-panel__note is-error\" role=\"alert\" data-testid=\"notifications-mark-all-error\">\n {t.couldNotMarkAll}\n </p>\n ) : null}\n <div class=\"bas-panel__list\" data-testid=\"notifications-list\">\n {error && state.rows.length === 0 ? (\n <p class=\"bas-panel__note is-error\" data-testid=\"notifications-error\">\n {t.couldNotLoad}\n </p>\n ) : state.rows.length === 0 ? (\n <p class=\"bas-panel__note\" data-testid=\"notifications-empty\">\n {shell.labels.empty}\n </p>\n ) : (\n state.rows.map((n) => (\n <button\n type=\"button\"\n key={n.id}\n class={\"bas-note\" + (seen(n) ? \" is-read\" : \"\")}\n data-testid=\"notification-row\"\n data-id={n.id}\n onClick={() => void onRow(n)}\n >\n <span class=\"bas-note__text\">\n <span class=\"bas-note__title\">{n.title}</span>\n {n.body ? <span class=\"bas-note__body\">{n.body}</span> : null}\n <span class=\"bas-note__time\">{relativeTime(n.createdAt, lang)}</span>\n </span>\n {!seen(n) ? <span class=\"bas-note__dot\" /> : null}\n </button>\n ))\n )}\n </div>\n </div>\n </>\n ) : null}\n </div>\n );\n}\n\n// ── User menu ──────────────────────────────────────────────────────────────\n\nexport interface ShellUser {\n name?: string;\n email?: string;\n /** Broberg ID OIDC `picture`. Without it: initials. Never Gravatar (D-1dc849). */\n picture?: string;\n /** F092.15 — a line under the name, e.g. «Administrator · Enhed Nord». */\n subtitle?: string;\n /** F092.27 — the organisation, e.g. «broberg.ai». Shown ONLY in the menu's top, with a building icon. */\n org?: string;\n}\nexport interface UserMenuItem {\n id: string;\n label: string;\n icon?: Icon;\n href?: string;\n onSelect?: () => void;\n /** F092.15 — right-aligned hint, e.g. a shortcut «⌘K». The app owns the shortcut itself. */\n hint?: string;\n}\n/** F092.15 — a radio group in the user menu (organisation, unit, area …). The app owns the choice. */\nexport interface UserMenuSection {\n id: string;\n label: string;\n items: { id: string; label: string; hint?: string; checked?: boolean }[];\n}\nexport interface UserMenuProps {\n user: ShellUser;\n /** «Konto» → Broberg ID's account page. */\n accountHref?: string;\n items?: UserMenuItem[];\n onSignOut?: () => void | Promise<void>;\n onNavigate?: Navigate;\n /**\n * Show Theme · Palette · Surfaces. Default true; false hides the block.\n * F001.23 — the Backdrop row (Neurons · Plain) is opt-in: pass\n * `{ backdrop: true }`. Only apps that draw the neuron canvas\n * (mountConstellation — trail, cardmem) have anything for it to switch.\n */\n appearance?: boolean | { backdrop?: boolean };\n /**\n * F092.11 — a «Sprog»/«Language» row with a segmented control, like the\n * appearance rows. The app owns the language; the shell shows and reports it.\n */\n language?: { value: string; options: { id: string; label: string }[]; onChange: (id: string) => void };\n /** F092.15 — radio groups shown after your items; a pick calls onSectionSelect and closes the menu. */\n sections?: UserMenuSection[];\n onSectionSelect?: (sectionId: string, itemId: string) => void;\n /** F092.15 — a «Zoom» row: − / value % / +. The app owns the value (percent). */\n zoom?: { value: number; onChange: (value: number) => void; min?: number; max?: number; step?: number };\n /** F092.15 — where the shell put the menu. \"sidebar-footer\" opens upward. Set by AppShell. */\n placement?: \"topbar\" | \"sidebar-footer\";\n lang: Lang;\n}\n\nexport function Avatar({ user, size = 28 }: { user: ShellUser; size?: number }) {\n const [broken, setBroken] = useState(false);\n const style = `width:${size}px;height:${size}px;font-size:${Math.round(size * 0.4)}px`;\n if (user.picture && !broken) {\n return <img class=\"bas-avatar\" style={style} src={user.picture} alt=\"\" referrerpolicy=\"no-referrer\" onError={() => setBroken(true)} data-testid=\"avatar-picture\" />;\n }\n return (\n <span class=\"bas-avatar bas-avatar--initials\" style={style} data-testid=\"avatar-initials\" aria-hidden=\"true\">\n {initials(user.name, user.email)}\n </span>\n );\n}\n\nfunction Segmented<T extends string>(props: { testid: string; value: T; options: readonly (readonly [T, string])[]; onChange: (v: T) => void; label?: string }) {\n // Arrow keys move between the options (D-4cd764); Enter/Space are the native\n // button's own, so choosing needs nothing extra.\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== \"ArrowLeft\" && e.key !== \"ArrowRight\") return;\n const buttons = [...(e.currentTarget as HTMLElement).querySelectorAll(\"button\")];\n const i = buttons.indexOf(document.activeElement as HTMLButtonElement);\n if (i < 0) return;\n e.preventDefault();\n const next = (i + (e.key === \"ArrowRight\" ? 1 : -1) + buttons.length) % buttons.length;\n buttons[next]!.focus();\n };\n return (\n <div class=\"bas-seg\" data-testid={props.testid} role=\"group\" aria-label={props.label} onKeyDown={onKeyDown}>\n {props.options.map(([v, label]) => (\n <button type=\"button\" key={v} aria-pressed={props.value === v} data-testid={`${props.testid}-${v}`} onClick={() => props.onChange(v)}>\n {label}\n </button>\n ))}\n </div>\n );\n}\n\n/**\n * F001.23 — a custom dropdown for a one-of-many choice (D-4cd764: no native\n * <select>). Focus stays on the button; the highlighted option is announced\n * via aria-activedescendant. Keys come from @broberg/ui-controls-core's\n * selectKeyReducer: arrows open/move, Enter/Space choose, Escape closes without\n * choosing — and does not close the menu around it.\n */\nfunction Dropdown<T extends string>(props: { testid: string; value: T; options: readonly (readonly [T, string])[]; onChange: (v: T) => void; label?: string }) {\n const [state, setState] = useState<SelectState>({ open: false, highlighted: -1 });\n // F001.25 — the list is a POPOVER: position:fixed from the button's rect, so\n // the menu neither grows nor clips it (the menu has overflow hidden/auto).\n // Below the button, right-aligned; upward when there is no room; clamped to\n // the viewport. Closes on scroll/resize rather than drifting off its button.\n const btnRef = useRef<HTMLButtonElement>(null);\n const listRef = useRef<HTMLUListElement>(null);\n const [pos, setPos] = useState<Record<string, string> | undefined>(undefined);\n useLayoutEffect(() => {\n if (!state.open || !btnRef.current) return setPos(undefined);\n const r = btnRef.current.getBoundingClientRect();\n const vw = window.innerWidth, vh = window.innerHeight, m = 8;\n const h = listRef.current?.offsetHeight ?? 0;\n const width = Math.min(Math.max(r.width, 160), vw - 2 * m);\n const left = Math.max(m, Math.min(r.right - width, vw - width - m));\n const below = r.bottom + 4;\n const top = below + h <= vh - m || r.top - 4 - h < m ? Math.min(below, vh - m - h) : r.top - 4 - h;\n setPos({ position: \"fixed\", left: `${left}px`, top: `${Math.max(m, top)}px`, width: `${width}px` });\n }, [state.open]);\n useEffect(() => {\n if (!state.open) return;\n const close = (e: Event) => {\n if (e.target instanceof Node && listRef.current?.contains(e.target)) return; // scrolling the list itself\n setState((st) => ({ ...st, open: false }));\n };\n window.addEventListener(\"scroll\", close, true);\n window.addEventListener(\"resize\", close);\n return () => {\n window.removeEventListener(\"scroll\", close, true);\n window.removeEventListener(\"resize\", close);\n };\n }, [state.open]);\n const current = Math.max(0, props.options.findIndex(([v]) => v === props.value));\n const choose = (i: number) => {\n setState({ open: false, highlighted: i });\n props.onChange(props.options[i]![0]);\n };\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Tab\") return setState((st) => ({ ...st, open: false }));\n const from = state.open ? state : { open: false, highlighted: current };\n const { state: next, intent } = selectKeyReducer(from, e.key, props.options.length);\n if (intent.type === \"none\" && next === from) return;\n e.preventDefault();\n if (state.open || intent.type !== \"close\") e.stopPropagation();\n if (intent.type === \"select\") return choose(intent.index);\n setState(next);\n };\n const optId = (v: string) => `${props.testid}-opt-${v}`;\n return (\n <div class=\"bas-dd\" onFocusOut={(e) => !(e.currentTarget as HTMLElement).contains(e.relatedTarget as Node) && setState((st) => ({ ...st, open: false }))}>\n <button\n ref={btnRef}\n type=\"button\"\n class=\"bas-dd__btn\"\n data-testid={props.testid}\n aria-haspopup=\"listbox\"\n aria-expanded={state.open}\n aria-label={props.label}\n aria-activedescendant={state.open && state.highlighted >= 0 ? optId(props.options[state.highlighted]![0]) : undefined}\n onClick={() => setState((st) => ({ open: !st.open, highlighted: current }))}\n onKeyDown={onKeyDown}\n >\n <span>{props.options[current]?.[1]}</span>\n <span class=\"bas-dd__caret\" aria-hidden=\"true\">▾</span>\n </button>\n {state.open ? (\n <ul ref={listRef} class=\"bas-dd__list\" style={pos ?? { position: \"fixed\", visibility: \"hidden\" }} role=\"listbox\" aria-label={props.label} data-testid={`${props.testid}-list`}>\n {props.options.map(([v, label], i) => (\n <li\n key={v}\n id={optId(v)}\n role=\"option\"\n aria-selected={props.value === v}\n class={\"bas-dd__opt\" + (i === state.highlighted ? \" is-active\" : \"\")}\n data-testid={`${props.testid}-${v}`}\n onMouseDown={(e) => e.preventDefault()}\n onMouseEnter={() => setState((st) => ({ ...st, highlighted: i }))}\n onClick={() => choose(i)}\n >\n <span class=\"bas-mi__check\" aria-hidden=\"true\">{props.value === v ? \"✓\" : \"\"}</span>\n {label}\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n}\n\nexport function UserMenu(p: UserMenuProps) {\n const t = TEXT[p.lang];\n const [open, setOpen] = useState(false);\n const [busy, setBusy] = useState(false);\n const root = useRef<HTMLDivElement>(null);\n const [pref, setPref] = useState<ThemePreference>(() => getPreference());\n const [palette, setPal] = useState<Palette>(() => getPalette());\n const [surfaces, setSurf] = useState<Surfaces>(() => getSurfaces());\n const [backdrop, setBack] = useState<Backdrop>(() => getBackdrop());\n\n useEffect(() => {\n const offs = [\n onThemeChange(() => setPref(getPreference())),\n onPaletteChange(setPal),\n onSurfacesChange(setSurf),\n onBackdropChange(setBack),\n ];\n return () => offs.forEach((off) => off());\n }, []);\n\n useEffect(() => {\n if (!open) return;\n const onDown = (e: MouseEvent) => {\n if (root.current && !root.current.contains(e.target as Node)) setOpen(false);\n };\n const onKey = (e: KeyboardEvent) => e.key === \"Escape\" && setOpen(false);\n document.addEventListener(\"mousedown\", onDown);\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"mousedown\", onDown);\n document.removeEventListener(\"keydown\", onKey);\n };\n }, [open]);\n\n const firstName = (p.user.name ?? \"\").trim().split(/\\s+/)[0] || p.user.email || \"\";\n const signOut = async () => {\n setBusy(true);\n try {\n await p.onSignOut?.();\n } finally {\n setBusy(false);\n setOpen(false);\n }\n };\n\n const inSidebar = p.placement === \"sidebar-footer\";\n // F092.15 — in the sidebar the panel is position:fixed at the button: the\n // sidebar clips its overflow, and an absolute 320px panel inside a 240px column\n // was cut off at the column's edge (Lens 200c1950: hint, theme rows and zoom\n // hidden). Fixed escapes the clip; a phone gets the full width minus a gutter.\n const btn = useRef<HTMLButtonElement>(null);\n const [upPos, setUpPos] = useState<Record<string, string> | undefined>(undefined);\n useLayoutEffect(() => {\n if (!open || !inSidebar || !btn.current) return;\n const r = btn.current.getBoundingClientRect();\n const vw = window.innerWidth, vh = window.innerHeight;\n const railed = !!btn.current.closest(\".is-railed\");\n const width = Math.min(320, vw - 16);\n const left = railed ? r.right + 8 : Math.max(8, Math.min(r.left, vw - width - 8));\n const bottom = railed ? Math.max(8, vh - r.bottom) : vh - r.top + 8;\n setUpPos({ position: \"fixed\", left: `${left}px`, bottom: `${bottom}px`, width: `${width}px`, maxHeight: `${vh - bottom - 8}px` });\n }, [open, inSidebar]);\n const zoom = p.zoom;\n const zMin = zoom?.min ?? 50, zMax = zoom?.max ?? 200, zStep = zoom?.step ?? 10;\n return (\n <div class={\"bas-usermenu\" + (inSidebar ? \" is-sidebar\" : \"\")} ref={root}>\n <button\n ref={btn}\n type=\"button\"\n class={\"bas-userbtn\" + (open ? \" is-open\" : \"\") + (inSidebar ? \" is-sidebar\" : \"\")}\n data-testid={inSidebar ? \"sidebar-user-menu\" : \"topbar-user-menu\"}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-label={p.user.email ?? p.user.name ?? t.account}\n onClick={() => setOpen((v) => !v)}\n >\n <Avatar user={p.user} size={inSidebar ? 32 : 28} />\n {inSidebar ? (\n <span class=\"bas-userbtn__text\">\n <span class=\"bas-userbtn__name\">{p.user.name ?? firstName}</span>\n {p.user.subtitle ? <span class=\"bas-userbtn__sub\" data-testid=\"sidebar-user-subtitle\">{p.user.subtitle}</span> : null}\n </span>\n ) : (\n <span class=\"bas-userbtn__name\">{firstName}</span>\n )}\n </button>\n {open ? (\n <div class={\"bas-menu\" + (inSidebar ? \" is-up\" : \"\")} style={inSidebar ? upPos : undefined} role=\"menu\" data-testid=\"topbar-user-menu-dropdown\">\n <div class=\"bas-menu__who\">\n <Avatar user={p.user} size={36} />\n <div class=\"bas-menu__whotext\">\n {p.user.name ? <div class=\"bas-menu__name\">{p.user.name}</div> : null}\n {p.user.subtitle ? <div class=\"bas-menu__sub\">{p.user.subtitle}</div> : null}\n {p.user.email ? <div class=\"bas-menu__email\">{p.user.email}</div> : null}\n {p.user.org ? (\n <div class=\"bas-menu__org\" data-testid=\"user-menu-org\">\n <IconBuilding />\n <span>{p.user.org}</span>\n </div>\n ) : null}\n </div>\n </div>\n <div class=\"bas-sep\" />\n {p.accountHref ? (\n <NavLink href={p.accountHref} onNavigate={p.onNavigate} onAfter={() => setOpen(false)} class=\"bas-mi\" data-testid=\"user-menu-account\" role=\"menuitem\">\n <IconUser />\n <span>{t.account}</span>\n </NavLink>\n ) : null}\n {(p.items ?? []).map((it) =>\n it.href ? (\n <NavLink key={it.id} href={it.href} onNavigate={p.onNavigate} onAfter={() => setOpen(false)} class=\"bas-mi\" data-testid={`user-menu-${it.id}`}>\n {it.icon ?? null}\n <span>{it.label}</span>\n {it.hint ? <span class=\"bas-mi__hint\">{it.hint}</span> : null}\n </NavLink>\n ) : (\n <button\n key={it.id}\n type=\"button\"\n class=\"bas-mi\"\n role=\"menuitem\"\n data-testid={`user-menu-${it.id}`}\n onClick={() => {\n setOpen(false);\n it.onSelect?.();\n }}\n >\n {it.icon ?? null}\n <span>{it.label}</span>\n {it.hint ? <span class=\"bas-mi__hint\">{it.hint}</span> : null}\n </button>\n ),\n )}\n {(p.sections ?? []).map((sec) => (\n <div class=\"bas-menu__section\" role=\"group\" aria-label={sec.label} key={sec.id} data-testid={`user-menu-section-${sec.id}`}>\n <div class=\"bas-sep\" />\n <div class=\"bas-menu__label\">{sec.label}</div>\n {sec.items.map((it) => (\n <button\n key={it.id}\n type=\"button\"\n class={\"bas-mi\" + (it.checked ? \" is-checked\" : \"\")}\n role=\"menuitemradio\"\n aria-checked={it.checked ? \"true\" : \"false\"}\n data-testid={`user-menu-section-${sec.id}-${it.id}`}\n onClick={() => {\n setOpen(false);\n p.onSectionSelect?.(sec.id, it.id);\n }}\n >\n <span class=\"bas-mi__check\" aria-hidden=\"true\">{it.checked ? \"✓\" : \"\"}</span>\n <span>{it.label}</span>\n {it.hint ? <span class=\"bas-mi__hint\">{it.hint}</span> : null}\n </button>\n ))}\n </div>\n ))}\n {p.appearance !== false ? (\n <>\n <div class=\"bas-sep\" />\n <div class=\"bas-prefs\">\n <div class=\"bas-pref\">\n <span>{t.theme}</span>\n <Segmented\n testid=\"user-menu-theme\"\n value={pref as \"light\" | \"dark\" | \"system\"}\n options={[[\"light\", t.light], [\"dark\", t.dark], [\"system\", t.system]] as const}\n onChange={(v) => {\n setPreference(v);\n setPref(v);\n }}\n />\n </div>\n <div class=\"bas-pref\">\n <span>{t.palette}</span>\n <Dropdown testid=\"user-menu-palette\" label={t.palette} value={palette} options={PALETTES.map((x) => [x, PALETTE_LABELS[x]] as const)} onChange={setPalette} />\n </div>\n <div class=\"bas-pref\">\n <span>{t.surfaces}</span>\n <Segmented testid=\"user-menu-surfaces\" value={surfaces} options={[[\"flat\", t.flat], [\"layered\", t.layered]] as const} onChange={setSurfaces} />\n </div>\n {typeof p.appearance === \"object\" && p.appearance.backdrop ? (\n <div class=\"bas-pref\">\n <span>{t.backdrop}</span>\n <Segmented testid=\"user-menu-backdrop\" value={backdrop} options={[[\"neurons\", t.neurons], [\"plain\", t.plain]] as const} onChange={setBackdrop} />\n </div>\n ) : null}\n </div>\n </>\n ) : null}\n {p.language ? (\n <>\n {p.appearance === false ? <div class=\"bas-sep\" /> : null}\n <div class=\"bas-prefs\">\n <div class=\"bas-pref\">\n <span>{t.language}</span>\n <Segmented\n testid=\"user-menu-language\"\n label={t.language}\n value={p.language.value}\n options={p.language.options.map((o) => [o.id, o.label] as const)}\n onChange={p.language.onChange}\n />\n </div>\n </div>\n </>\n ) : null}\n {zoom ? (\n <>\n {p.appearance === false && !p.language ? <div class=\"bas-sep\" /> : null}\n <div class=\"bas-prefs\">\n <div class=\"bas-pref\">\n <span>{t.zoom}</span>\n <div class=\"bas-zoom\" role=\"group\" aria-label={t.zoom}>\n <button type=\"button\" class=\"bas-zoom__btn\" data-testid=\"user-menu-zoom-out\" aria-label={t.zoomOut}\n disabled={zoom.value - zStep < zMin} onClick={() => zoom.onChange(Math.max(zMin, zoom.value - zStep))}>−</button>\n <span class=\"bas-zoom__value\" data-testid=\"user-menu-zoom-value\">{zoom.value} %</span>\n <button type=\"button\" class=\"bas-zoom__btn\" data-testid=\"user-menu-zoom-in\" aria-label={t.zoomIn}\n disabled={zoom.value + zStep > zMax} onClick={() => zoom.onChange(Math.min(zMax, zoom.value + zStep))}>+</button>\n </div>\n </div>\n </div>\n </>\n ) : null}\n {p.onSignOut ? (\n <>\n <div class=\"bas-sep\" />\n <button type=\"button\" class=\"bas-mi is-danger\" role=\"menuitem\" data-testid=\"topbar-sign-out\" disabled={busy} onClick={() => void signOut()}>\n <IconLogOut />\n <span>{t.signOut}</span>\n </button>\n </>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\n// ── Top bar ────────────────────────────────────────────────────────────────\n\nexport interface TopBarProps {\n /** F092.7 — when set, the brand is a link to the app's start page. */\n homeHref?: string;\n /** Called after the brand link was followed (AppShell closes the drawer). */\n onHome?: () => void;\n brand?: ComponentChildren;\n /** Anything app-specific (project switcher, search) between brand and bell. */\n actions?: ComponentChildren;\n /** Drawer mode on a phone: show the hamburger and call this. */\n onOpenMenu?: () => void;\n notifications?: NotificationSource;\n user?: ShellUser;\n userMenu?: Omit<UserMenuProps, \"user\" | \"lang\" | \"onNavigate\">;\n onNavigate?: Navigate;\n lang: Lang;\n}\n\n/** Brand left, actions, then the notification bell and the user menu ALWAYS last, in that order. */\nexport function TopBar(p: TopBarProps) {\n const t = TEXT[p.lang];\n return (\n <header class=\"bas-topbar\" data-testid=\"topbar-root\">\n <div class=\"bas-topbar__inner\">\n {p.onOpenMenu ? (\n <button type=\"button\" class=\"bas-iconbtn bas-hamburger\" data-testid=\"sidebar-toggle\" aria-label={t.openMenu} onClick={p.onOpenMenu}>\n <IconMenu />\n </button>\n ) : null}\n {p.brand ? (\n <div class=\"bas-topbar__brand\">\n {p.homeHref ? (\n <NavLink href={p.homeHref} onNavigate={p.onNavigate} onAfter={p.onHome} class=\"bas-home\" data-testid=\"brand-home\">\n {p.brand}\n </NavLink>\n ) : (\n p.brand\n )}\n </div>\n ) : null}\n {p.actions ? <div class=\"bas-topbar__actions\">{p.actions}</div> : null}\n <div class=\"bas-spacer\" />\n <NotificationBell source={p.notifications} onNavigate={p.onNavigate} lang={p.lang} />\n {p.user ? <UserMenu user={p.user} {...p.userMenu} onNavigate={p.onNavigate} lang={p.lang} /> : null}\n </div>\n </header>\n );\n}\n\n// ── Page header + tabs ─────────────────────────────────────────────────────\n\n/**\n * Optional `title` (0.2.1): inside AppShell the page title already sits in the\n * content header, so a page can use PageHeader for its description and actions\n * alone — no second, and no empty, <h1>.\n */\nexport function PageHeader(p: { eyebrow?: ComponentChildren; title?: ComponentChildren; description?: ComponentChildren; actions?: ComponentChildren }) {\n return (\n <div class=\"bas-pagehead\" data-testid=\"page-header\">\n <div class=\"bas-pagehead__text\">\n {p.eyebrow ? <div class=\"bas-pagehead__eyebrow\">{p.eyebrow}</div> : null}\n {p.title != null && p.title !== \"\" ? <h1 class=\"bas-pagehead__title\">{p.title}</h1> : null}\n {p.description ? <p class=\"bas-pagehead__desc\">{p.description}</p> : null}\n </div>\n {p.actions ? <div class=\"bas-pagehead__actions\">{p.actions}</div> : null}\n </div>\n );\n}\n\nexport interface PageTab {\n id: string;\n label: ComponentChildren;\n /** Path mode: the tab's own route. Query mode: ignored (?tab=id is used). */\n href?: string;\n}\n\n/**\n * Tabs as routes. `mode: \"query\"` puts the tab in `?tab=<id>` on the current\n * path (first tab when absent); `mode: \"path\"` gives each tab its own href.\n */\nexport function PageTabs(p: { tabs: PageTab[]; currentUrl: string; mode?: \"query\" | \"path\"; onNavigate?: Navigate }) {\n const mode = p.mode ?? \"query\";\n const url = new URL(p.currentUrl, \"http://x\");\n const activeId =\n mode === \"query\"\n ? url.searchParams.get(\"tab\") ?? p.tabs[0]?.id\n : p.tabs.find((tab) => tab.href && isActivePath(tab.href, url.pathname))?.id;\n return (\n <div class=\"bas-tabs\" role=\"tablist\" data-testid=\"page-tabs\">\n {p.tabs.map((tab) => {\n let href = tab.href ?? \"\";\n if (mode === \"query\") {\n const u = new URL(url.toString());\n u.searchParams.set(\"tab\", tab.id);\n href = u.pathname + u.search;\n }\n const active = tab.id === activeId;\n return (\n <NavLink key={tab.id} href={href} onNavigate={p.onNavigate} class={\"bas-tab\" + (active ? \" is-active\" : \"\")} data-testid={`page-tab-${tab.id}`} aria-current={active ? \"page\" : undefined}>\n {tab.label}\n </NavLink>\n );\n })}\n </div>\n );\n}\n\n// ── App shell ──────────────────────────────────────────────────────────────\n\nexport interface AppShellProps {\n /**\n * F092.24 — the app's default text size: 1 = as designed, 1.2 = every shell text\n * 20 % larger. Sets --bas-font-scale on the root. The APP's choice; the user's own\n * Zoom (userMenu.zoom) is separate and applies on top.\n */\n fontScale?: number;\n /** F092.21 — passed to the sidebar: a row action was chosen. */\n onItemAction?: SidebarProps[\"onItemAction\"];\n brand?: ComponentChildren;\n actions?: ComponentChildren;\n groups: PreactNavGroup[];\n footer?: PreactNavItem[];\n currentPath: string;\n onNavigate?: Navigate;\n /** The notification centre's source. The bell is shown either way. */\n notifications?: NotificationSource;\n user?: ShellUser;\n userMenu?: Omit<UserMenuProps, \"user\" | \"lang\" | \"onNavigate\" | \"placement\">;\n /**\n * F092.15 — where the user menu sits. \"topbar\" (default): the content's top row\n * (or the full-width bar). \"sidebar-footer\": the bottom of the sidebar, opening upward.\n */\n userMenuPlacement?: \"topbar\" | \"sidebar-footer\";\n /** Phone behaviour: a slide-in drawer, or a 60px icon rail. */\n mobile?: \"drawer\" | \"rail\";\n /**\n * F092.6 — desktop fold: \"offcanvas\" hides the sidebar, \"icon\" keeps a 48px\n * icon rail with `brandMark` on top. Default: \"icon\" when `mobile` is \"rail\".\n */\n collapse?: \"offcanvas\" | \"icon\";\n /** The app's logo icon for the top of the icon rail. */\n brandMark?: ComponentChildren;\n /**\n * F092.8 — \"inset\" (default, shadcn dashboard-01): no full-width top bar; the\n * brand heads the sidebar, and the content's top row is sidebar button ·\n * title · actions · bell · user menu. \"topbar\": the 0.2.x full-width bar.\n */\n layout?: \"inset\" | \"topbar\";\n /** F092.7 — the app's start page. Brand and brandMark become links to it; on a phone the click closes the drawer. */\n homeHref?: string;\n /** Accessible name for the brandMark link. Default \"Forside\"/\"Home\". */\n homeLabel?: string;\n /**\n * F092.4 — the page title in the content header, after the sidebar button.\n * Absent: the label of the active nav item (a sub-item wins over its parent).\n */\n title?: ComponentChildren;\n /** localStorage key prefix for the folded sidebar, folded groups and open items. */\n storageKey?: string;\n /** Required: the shell ships no default language (see @broberg/notifications/shell). */\n lang: Lang;\n children?: ComponentChildren;\n}\n\nexport function AppShell(p: AppShellProps) {\n const prefix = p.storageKey ?? \"broberg-app-shell\";\n const mode = p.mobile ?? \"drawer\";\n const layout = p.layout ?? \"inset\";\n const inset = layout === \"inset\";\n const collapse = p.collapse ?? (mode === \"rail\" ? \"icon\" : \"offcanvas\");\n const [collapsed, setCollapsed] = useState(() => readFlag(`${prefix}.collapsed`, false));\n const [drawer, setDrawer] = useState(false);\n const isMobile = useIsMobile();\n const t = TEXT[p.lang];\n const toggle = () => {\n const next = !collapsed;\n setCollapsed(next);\n writeFlag(`${prefix}.collapsed`, next);\n };\n // F092.4 — ONE sidebar button: the drawer on a phone, the fold on desktop.\n const drawerMode = isMobile && mode === \"drawer\";\n const onTrigger = () => (drawerMode ? setDrawer(!drawer) : toggle());\n const expanded = drawerMode ? drawer : !collapsed;\n const triggerLabel = drawerMode ? (drawer ? t.closeMenu : t.openMenu) : collapsed ? t.expand : t.collapse;\n const heading = p.title ?? activeNavLabel(p.groups, p.footer, p.currentPath);\n const userInSidebar = p.userMenuPlacement === \"sidebar-footer\";\n const sidebarUser =\n userInSidebar && p.user ? (\n <UserMenu user={p.user} {...p.userMenu} placement=\"sidebar-footer\" onNavigate={p.onNavigate} lang={p.lang} />\n ) : null;\n return (\n <div\n class=\"bas-root\"\n data-testid=\"app-shell\"\n data-mobile={mode}\n data-layout={layout}\n style={p.fontScale !== undefined ? { \"--bas-font-scale\": String(p.fontScale) } : undefined}\n >\n {inset ? null : (\n <TopBar\n brand={p.brand}\n homeHref={p.homeHref}\n onHome={() => setDrawer(false)}\n actions={p.actions}\n notifications={p.notifications}\n user={userInSidebar ? undefined : p.user}\n userMenu={p.userMenu}\n onNavigate={p.onNavigate}\n lang={p.lang}\n />\n )}\n <div class=\"bas-row\">\n <Sidebar\n groups={p.groups}\n footer={p.footer}\n onItemAction={p.onItemAction}\n currentPath={p.currentPath}\n onNavigate={p.onNavigate}\n collapsed={collapsed}\n collapse={collapse}\n brandMark={p.brandMark}\n homeHref={p.homeHref}\n homeLabel={p.homeLabel}\n mobileOpen={drawer}\n onClose={() => setDrawer(false)}\n mobile={mode}\n header={inset || mode === \"drawer\" ? p.brand : undefined}\n brandTestId={inset ? \"brand-home\" : undefined}\n groupsKey={`${prefix}.groups`}\n itemsKey={`${prefix}.items`}\n bottom={sidebarUser}\n lang={p.lang}\n />\n <main class=\"bas-main\" data-testid=\"app-content\">\n <div class=\"bas-contenthead\" data-testid=\"content-header\">\n <button\n type=\"button\"\n class=\"bas-iconbtn bas-trigger\"\n data-testid=\"sidebar-trigger\"\n aria-label={triggerLabel}\n aria-expanded={expanded}\n title={triggerLabel}\n onClick={onTrigger}\n >\n <IconPanelLeft />\n </button>\n {heading ? (\n <>\n <span class=\"bas-contenthead__sep\" data-testid=\"content-header-separator\" aria-hidden=\"true\" />\n <h1 class=\"bas-contenthead__title\" data-testid=\"content-header-title\">\n {heading}\n </h1>\n </>\n ) : null}\n {inset ? (\n <>\n <div class=\"bas-spacer\" />\n {p.actions ? <div class=\"bas-contenthead__actions\">{p.actions}</div> : null}\n <NotificationBell source={p.notifications} onNavigate={p.onNavigate} lang={p.lang} />\n {p.user && !userInSidebar ? <UserMenu user={p.user} {...p.userMenu} onNavigate={p.onNavigate} lang={p.lang} /> : null}\n </>\n ) : null}\n </div>\n {p.children}\n </main>\n </div>\n </div>\n );\n}\n\n// ── Account page (F095.3) ──────────────────────────────────────────────────\n\nexport interface AccountPageProps {\n lang: Lang;\n /** Default: `createFetchAccountAdapter()` → /api/account/profile* (@broberg/sso accountRoutes). */\n adapter?: AccountAdapter;\n /**\n * Where «Log ind igen» goes — a FULL page load, so the app's login flow runs.\n * Default `/auth/login?returnTo=<current path>` (no prompt=login — that forces\n * re-proof and is a redirect-loop trap, F084.108). Broberg ID issues\n * no refresh token, so about an hour after login every change answers 401\n * reauth: that is a normal state here, not an error.\n */\n reauthHref?: string;\n /**\n * F095.5 — called with the profile AS THE SERVER NOW HOLDS IT after every\n * successful change (name saved, picture uploaded, picture removed), so the\n * host can update the shell's user menu at once. Not called on load or on a\n * failed save.\n */\n onProfileChange?: (profile: AccountProfile) => void;\n}\n\n/** `/auth/login?returnTo=<this page>` — back here after signing in. */\nexport function defaultReauthHref(): string {\n const here = typeof location === \"undefined\" ? \"/\" : location.pathname + location.search;\n return `/auth/login?returnTo=${encodeURIComponent(here)}`;\n}\n\ntype Notice = { kind: \"ok\" | \"error\"; text: string } | null;\n\n/**\n * The user's own name and picture, edited inside the app (F095.3).\n *\n * EVERYTHING SHOWN AFTER A SAVE IS THE SERVER'S ANSWER, never what was typed\n * (CLAUDE.md «Et gem-felt SKAL bevises at gemme»): if Broberg ID trims or\n * changes the name, the field shows that. On a failed save the field keeps the\n * typed text, so nothing is lost and the error says why.\n */\nexport function AccountPage({ lang, adapter, reauthHref, onProfileChange }: AccountPageProps) {\n const t = TEXT[lang];\n const api = useMemo(() => adapter ?? createFetchAccountAdapter(), [adapter]);\n const [profile, setProfile] = useState<AccountProfile | null>(null);\n const [draft, setDraft] = useState(\"\");\n const [busy, setBusy] = useState<\"load\" | \"name\" | \"avatar\" | null>(\"load\");\n const [notice, setNotice] = useState<Notice>(null);\n const [reauth, setReauth] = useState(false);\n const [confirming, setConfirming] = useState(false);\n const fileRef = useRef<HTMLInputElement>(null);\n\n const apply = (p: AccountProfile) => {\n setProfile(p);\n setDraft(p.name ?? \"\");\n };\n const fail = (err: unknown, fallback: string) => {\n const kind = accountErrorKind(err);\n if (kind === \"reauth\") {\n setReauth(true);\n setNotice(null);\n return;\n }\n const text = kind === \"tooLarge\" ? t.pictureTooLarge : kind === \"wrongType\" ? t.pictureWrongType : fallback;\n setNotice({ kind: \"error\", text });\n };\n\n useEffect(() => {\n let live = true;\n setBusy(\"load\");\n api.load().then(\n (p) => live && (apply(p), setBusy(null)),\n (e) => live && (fail(e, t.couldNotLoadProfile), setBusy(null)),\n );\n return () => {\n live = false;\n };\n }, [api]);\n\n const run = async (what: \"name\" | \"avatar\", op: () => Promise<AccountProfile>, okText: string) => {\n setBusy(what);\n setNotice(null);\n try {\n const p = await op();\n apply(p);\n onProfileChange?.(p);\n setNotice({ kind: \"ok\", text: okText });\n } catch (e) {\n fail(e, t.couldNotSave);\n } finally {\n setBusy(null);\n }\n };\n\n const onSaveName = (e: Event) => {\n e.preventDefault();\n if (busy || reauth || unchanged) return;\n // A failed save leaves `draft` as typed: apply() runs only on success.\n void run(\"name\", () => api.saveName(draft), t.saved);\n };\n\n const onFile = (e: JSX.TargetedEvent<HTMLInputElement>) => {\n const input = e.currentTarget;\n const file = input.files?.[0];\n input.value = \"\"; // the same file can be chosen again after an error\n if (!file || busy || reauth) return;\n const bad = checkAvatarFile(file);\n if (bad) {\n setNotice({ kind: \"error\", text: bad === \"tooLarge\" ? t.pictureTooLarge : t.pictureWrongType });\n return;\n }\n void run(\"avatar\", () => api.uploadAvatar(file), t.pictureSaved);\n };\n\n const onRemove = () => {\n setConfirming(false);\n void run(\"avatar\", () => api.removeAvatar(), t.pictureRemoved);\n };\n\n const locked = reauth || busy !== null || profile === null;\n // Nothing to save until the name differs from what the server holds (trimmed:\n // BID trims, so a trailing space is not a change).\n const unchanged = draft.trim() === (profile?.name ?? \"\").trim();\n const user: ShellUser = { name: profile?.name ?? undefined, email: profile?.email ?? undefined, picture: profile?.picture ?? undefined };\n\n return (\n <section class=\"bas-account\" data-testid=\"account-page\" aria-busy={busy !== null}>\n {reauth ? (\n <div class=\"bas-account__note is-reauth\" role=\"alert\" data-testid=\"account-reauth\">\n <span data-testid=\"account-reauth-text\">{t.reauth}</span>\n <button\n type=\"button\"\n class=\"bas-account__btn is-primary\"\n onClick={() => window.location.assign(reauthHref ?? defaultReauthHref())}\n data-testid=\"account-reauth-signin\"\n >\n {t.signInAgain}\n </button>\n </div>\n ) : null}\n {notice ? (\n <p\n class={\"bas-account__note \" + (notice.kind === \"ok\" ? \"is-ok\" : \"is-error\")}\n role={notice.kind === \"ok\" ? \"status\" : \"alert\"}\n data-testid={notice.kind === \"ok\" ? \"account-ok\" : \"account-error\"}\n >\n {notice.text}\n </p>\n ) : null}\n {busy === \"load\" ? <p class=\"bas-account__muted\" data-testid=\"account-loading\">{t.loadingProfile}</p> : null}\n {profile ? (\n <>\n <div class=\"bas-account__who\">\n <span class=\"bas-account__avatar\" data-testid=\"account-avatar\" data-picture={profile.picture ?? \"\"}>\n <Avatar key={profile.picture ?? \"none\"} user={user} size={72} />\n </span>\n <div class=\"bas-account__whotext\">\n <div class=\"bas-account__name\" data-testid=\"account-name\">{profile.name ?? \"\"}</div>\n <div class=\"bas-account__email\" data-testid=\"account-email\">{profile.email ?? \"\"}</div>\n </div>\n </div>\n <div class=\"bas-account__row\">\n <input\n ref={fileRef}\n type=\"file\"\n accept={AVATAR_TYPES.join(\",\")}\n hidden\n tabIndex={-1}\n onChange={onFile}\n data-testid=\"account-avatar-file\"\n />\n <button type=\"button\" class=\"bas-account__btn\" disabled={locked} onClick={() => fileRef.current?.click()} data-testid=\"account-avatar-upload\">\n {busy === \"avatar\" ? t.saving : t.changePicture}\n </button>\n {profile.picture && !confirming ? (\n <button type=\"button\" class=\"bas-account__btn is-quiet\" disabled={locked} onClick={() => setConfirming(true)} data-testid=\"account-avatar-remove\">\n {t.removePicture}\n </button>\n ) : null}\n {profile.picture && confirming ? (\n <span class=\"bas-account__confirm\" role=\"group\" data-testid=\"account-avatar-remove-confirmation\">\n <span>{t.confirmRemovePicture}</span>\n <button type=\"button\" class=\"bas-account__btn is-danger\" disabled={locked} onClick={onRemove} data-testid=\"account-avatar-remove-confirm\">\n {t.remove}\n </button>\n <button type=\"button\" class=\"bas-account__btn is-quiet\" onClick={() => setConfirming(false)} data-testid=\"account-avatar-remove-cancel\">\n {t.cancel}\n </button>\n </span>\n ) : null}\n </div>\n <form class=\"bas-account__form\" onSubmit={onSaveName} data-testid=\"account-name-form\">\n <label class=\"bas-account__label\" for=\"bas-account-name\">{t.name}</label>\n <div class=\"bas-account__row\">\n <input\n id=\"bas-account-name\"\n class=\"bas-account__input\"\n type=\"text\"\n autocomplete=\"name\"\n value={draft}\n readOnly={reauth}\n aria-readonly={reauth}\n onInput={(e) => {\n setDraft(e.currentTarget.value);\n if (notice?.kind === \"ok\") setNotice(null);\n }}\n data-testid=\"account-name-input\"\n />\n <button type=\"submit\" class=\"bas-account__btn is-primary\" disabled={locked || unchanged} data-testid=\"account-name-save\">\n {busy === \"name\" ? t.saving : t.save}\n </button>\n </div>\n </form>\n {profile.account_url ? (\n <NavLink href={profile.account_url} class=\"bas-account__link\" data-testid=\"account-bid-link\">\n {t.bidSecurity}\n </NavLink>\n ) : null}\n </>\n ) : null}\n </section>\n );\n}\n\n// ── Analytics page (F097.1) ────────────────────────────────────────────────\n\nexport interface AnalyticsPageProps {\n lang: Lang;\n /** Default: `createFetchAnalyticsAdapter()` → GET /api/analytics?days=N (@upmetrics/sdk/hono analyticsRoutes). */\n adapter?: AnalyticsAdapter;\n /** The period buttons, in days. Default 7 / 30 / 90. */\n periods?: number[];\n /** The period shown first. Default 30 (or the first of `periods` when 30 is not one of them). */\n initialDays?: number;\n}\n\ntype AnalyticsLoad =\n | { state: \"loading\" }\n | { state: \"ok\"; days: number; data: AnalyticsData }\n | { state: \"error\"; reason: \"unconfigured\" | \"unavailable\" };\n\n/**\n * The app's own visitors, page views, page views per day and most visited\n * pages, from Upmetrics through the app's backend (F097.1). A backend that is\n * not set up or does not answer says so — it never shows zeros that would read\n * as a quiet month.\n */\nexport function AnalyticsPage({ lang, adapter, periods = [7, 30, 90], initialDays }: AnalyticsPageProps) {\n const t = TEXT[lang];\n const api = useMemo(() => adapter ?? createFetchAnalyticsAdapter(), [adapter]);\n const [days, setDays] = useState(initialDays ?? (periods.includes(30) ? 30 : periods[0]!));\n const [load, setLoad] = useState<AnalyticsLoad>({ state: \"loading\" });\n const locale = lang === \"da\" ? \"da-DK\" : \"en-GB\";\n const num = (n: number) => n.toLocaleString(locale);\n\n useEffect(() => {\n // A late answer for a period the user has already left is dropped.\n let live = true;\n setLoad({ state: \"loading\" });\n api.load(days).then(\n (data) => live && setLoad({ state: \"ok\", days, data }),\n (e) => live && setLoad({ state: \"error\", reason: analyticsErrorKind(e) }),\n );\n return () => {\n live = false;\n };\n }, [api, days]);\n\n return (\n <section class=\"bas-analytics\" data-testid=\"analytics-page\" aria-busy={load.state === \"loading\"}>\n <div class=\"bas-analytics__periods\" role=\"group\" aria-label={t.analyticsPeriod}>\n {periods.map((d) => (\n <button\n key={d}\n type=\"button\"\n class={\"bas-analytics__period\" + (d === days ? \" is-active\" : \"\")}\n aria-pressed={d === days}\n onClick={() => setDays(d)}\n data-testid={`analytics-period-${d}`}\n >\n {t.analyticsDays.replace(\"{n}\", String(d))}\n </button>\n ))}\n </div>\n\n {load.state === \"loading\" ? <p class=\"bas-analytics__muted\" data-testid=\"analytics-loading\">{t.analyticsLoading}</p> : null}\n {load.state === \"error\" ? (\n <p class=\"bas-analytics__note\" role=\"alert\" data-testid=\"analytics-error\" data-reason={load.reason}>\n {load.reason === \"unconfigured\" ? t.analyticsUnconfigured : t.analyticsUnavailable}\n </p>\n ) : null}\n {load.state === \"ok\" ? (\n <>\n <div class=\"bas-analytics__tiles\">\n {([\"visitors\", \"pageviews\"] as const).map((k) => {\n const c = changePct(load.data.totals[k], load.data.prev[k]);\n return (\n <div key={k} class=\"bas-analytics__tile\" data-testid={`analytics-${k}`}>\n <div class=\"bas-analytics__label\">{k === \"visitors\" ? t.analyticsVisitors : t.analyticsPageviews}</div>\n <div class=\"bas-analytics__value\" data-testid={`analytics-${k}-value`}>{num(load.data.totals[k])}</div>\n <div class=\"bas-analytics__muted\" data-testid={`analytics-${k}-change`}>\n {c === null ? t.analyticsNoPrev : t.analyticsVsPrev.replace(\"{pct}\", `${c > 0 ? \"+\" : \"\"}${c}`)}\n </div>\n </div>\n );\n })}\n </div>\n <AnalyticsSeries data={fillDays(load.data.series, load.days)} t={t} locale={locale} num={num} />\n <div class=\"bas-analytics__card\" data-testid=\"analytics-top-pages\">\n <h2 class=\"bas-analytics__h\">{t.analyticsTopPages}</h2>\n {load.data.topPages.length === 0 ? (\n <p class=\"bas-analytics__muted\" data-testid=\"analytics-top-pages-empty\">{t.analyticsEmpty}</p>\n ) : (\n <ol class=\"bas-analytics__pages\">\n {load.data.topPages.map((p) => (\n <li key={p.value} class=\"bas-analytics__page\">\n <span class=\"bas-analytics__path\" title={p.value}>{p.value}</span>\n <span class=\"bas-analytics__count\">{num(p.count)}</span>\n </li>\n ))}\n </ol>\n )}\n </div>\n </>\n ) : null}\n </section>\n );\n}\n\n/** \"2026-10-06\" → \"6. okt.\" — the key is a calendar date, so it is formatted as one (UTC, no shift). */\nfunction dayLabel(day: string, locale: string): string {\n return new Date(`${day}T12:00:00Z`).toLocaleDateString(locale, { day: \"numeric\", month: \"short\", timeZone: \"UTC\" });\n}\n\nfunction AnalyticsSeries({ data, t, locale, num }: { data: AnalyticsDay[]; t: (typeof TEXT)[Lang]; locale: string; num: (n: number) => string }) {\n const max = Math.max(1, ...data.map((d) => d.pageviews));\n const empty = data.every((d) => d.pageviews === 0);\n return (\n <div class=\"bas-analytics__card\" data-testid=\"analytics-series\">\n <h2 class=\"bas-analytics__h\">{t.analyticsOverTime}</h2>\n {empty ? (\n <p class=\"bas-analytics__muted\" data-testid=\"analytics-series-empty\">{t.analyticsEmpty}</p>\n ) : (\n <>\n <div class=\"bas-analytics__bars\" aria-hidden=\"true\">\n {data.map((d) => (\n <div key={d.day} class=\"bas-analytics__col\" title={`${dayLabel(d.day, locale)}: ${num(d.pageviews)}`} data-day={d.day}>\n <div class=\"bas-analytics__bar\" style={{ height: d.pageviews === 0 ? \"0\" : `max(2px, ${(d.pageviews / max) * 100}%)` }} />\n </div>\n ))}\n </div>\n <div class=\"bas-analytics__axis\" aria-hidden=\"true\">\n <span>{dayLabel(data[0]!.day, locale)}</span>\n <span>{dayLabel(data[data.length - 1]!.day, locale)}</span>\n </div>\n {/* The same numbers as a table, for a screen reader (the bars are decoration for it). */}\n <table class=\"bas-analytics__sr\" data-testid=\"analytics-series-table\">\n <caption>{t.analyticsOverTime}</caption>\n <thead>\n <tr>\n <th scope=\"col\">{t.analyticsDay}</th>\n <th scope=\"col\">{t.analyticsPageviews}</th>\n </tr>\n </thead>\n <tbody>\n {data.map((d) => (\n <tr key={d.day}>\n <td>{dayLabel(d.day, locale)}</td>\n <td>{num(d.pageviews)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </>\n )}\n </div>\n );\n}\n\n// ── Tenant switcher (F029.10) ──────────────────────────────────────────────\n\nexport interface TenantSwitcherProps {\n lang: Lang;\n /** The slug the app is in right now — the app knows it (from tenantMiddleware). */\n activeSlug: string;\n /** Default: `createFetchTenantAdapter()` → GET /api/me/memberships (@broberg/tenant/hono tenantRoutes). */\n adapter?: TenantAdapter;\n /**\n * Switch through the APP's own route — navigate to `/t/<slug>/…`, or set the\n * preference and reload. A rejection keeps the current organisation and shows\n * why; the switcher never pretends a switch happened.\n */\n onSwitch: (slug: string) => Promise<void> | void;\n /**\n * The role in the user's own words («Medarbejder», «Administrator»). Roles\n * are the app's vocabulary, so the switcher cannot translate them. Without\n * it no role is shown — a raw «member» in a Danish UI is worse than nothing.\n */\n roleLabel?: (role: string) => string;\n}\n\n/** Space kept between a popover and the screen edge. */\nconst EDGE = 16;\n\n/**\n * The user's own organisations, the active one marked, and a switch. Only the\n * memberships the backend returns are listed — never a typed or guessed slug.\n * With one organisation it is a plain label, not a menu.\n */\nexport function TenantSwitcher({ lang, activeSlug, adapter, onSwitch, roleLabel }: TenantSwitcherProps) {\n const t = TEXT[lang];\n const api = useMemo(() => adapter ?? createFetchTenantAdapter(), [adapter]);\n const [rows, setRows] = useState<TenantMembershipRow[] | null>(null);\n const [loadFailed, setLoadFailed] = useState(false);\n const [open, setOpen] = useState(false);\n const [busy, setBusy] = useState<string | null>(null);\n const [switchFailed, setSwitchFailed] = useState(false);\n const root = useRef<HTMLDivElement>(null);\n const menu = useRef<HTMLDivElement>(null);\n\n // The switcher sits among the app's actions, not at the screen edge, so a\n // menu anchored to it can run off either side on a phone. Measure it and\n // shift it back inside, EDGE px from the edge (appkit, 393 px, Lens b0ff5fb2).\n useLayoutEffect(() => {\n const el = menu.current;\n if (!open || !el) return;\n el.style.transform = \"\";\n const r = el.getBoundingClientRect();\n const vw = document.documentElement.clientWidth || window.innerWidth;\n let dx = 0;\n if (r.right > vw - EDGE) dx = vw - EDGE - r.right;\n if (r.left + dx < EDGE) dx = EDGE - r.left;\n if (dx !== 0) el.style.transform = `translateX(${Math.round(dx)}px)`;\n }, [open, rows, loadFailed, switchFailed]);\n\n const load = () => {\n setLoadFailed(false);\n api.load().then(setRows, () => setLoadFailed(true));\n };\n useEffect(load, [api]);\n\n useEffect(() => {\n if (!open) return;\n const onDown = (e: MouseEvent) => {\n if (root.current && !root.current.contains(e.target as Node)) setOpen(false);\n };\n const onKey = (e: KeyboardEvent) => e.key === \"Escape\" && setOpen(false);\n document.addEventListener(\"mousedown\", onDown);\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"mousedown\", onDown);\n document.removeEventListener(\"keydown\", onKey);\n };\n }, [open]);\n\n const active = rows?.find((r) => r.tenant.slug === activeSlug);\n const label = active?.tenant.name ?? activeSlug;\n\n const pick = async (slug: string) => {\n if (slug === activeSlug || busy) return;\n setBusy(slug);\n setSwitchFailed(false);\n try {\n await onSwitch(slug);\n setOpen(false);\n } catch {\n setSwitchFailed(true);\n } finally {\n setBusy(null);\n }\n };\n\n // One organisation, and it is the active one: nothing to switch to.\n if (rows && rows.length <= 1 && !loadFailed) {\n return (\n <div class=\"bas-tenant\" data-testid=\"tenant-switcher\">\n <span class=\"bas-tenant__label\" data-testid=\"tenant-switcher-label\">{label}</span>\n </div>\n );\n }\n\n return (\n <div class=\"bas-tenant\" ref={root} data-testid=\"tenant-switcher\">\n <button\n type=\"button\"\n class={\"bas-tenant__btn\" + (open ? \" is-open\" : \"\")}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-label={t.tenantSwitch}\n onClick={() => setOpen((v) => !v)}\n data-testid=\"tenant-switcher-button\"\n >\n <span class=\"bas-tenant__label\" data-testid=\"tenant-switcher-label\">{label}</span>\n </button>\n {open ? (\n <div class=\"bas-menu bas-tenant__menu\" ref={menu} role=\"menu\" data-testid=\"tenant-switcher-menu\">\n {loadFailed ? (\n <div class=\"bas-tenant__note\" role=\"alert\" data-testid=\"tenant-switcher-load-error\">\n <span>{t.tenantLoadFailed}</span>\n <button type=\"button\" class=\"bas-mi\" onClick={load} data-testid=\"tenant-switcher-retry\">{t.tenantRetry}</button>\n </div>\n ) : null}\n {switchFailed ? (\n <p class=\"bas-tenant__note is-error\" role=\"alert\" data-testid=\"tenant-switcher-switch-error\">\n {t.tenantSwitchFailed.replace(\"{name}\", label)}\n </p>\n ) : null}\n {(rows ?? []).map((r) => {\n const isActive = r.tenant.slug === activeSlug;\n const suspended = r.tenant.status === \"suspended\";\n return (\n <button\n key={r.tenant.id}\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={isActive}\n class={\"bas-mi bas-tenant__item\" + (isActive ? \" is-active\" : \"\")}\n disabled={suspended || busy !== null}\n onClick={() => void pick(r.tenant.slug)}\n data-testid={`tenant-switcher-item-${r.tenant.slug}`}\n >\n <span class=\"bas-tenant__name\">{r.tenant.name}</span>\n {suspended || isActive || roleLabel ? (\n <span class=\"bas-tenant__role\" data-testid={`tenant-switcher-role-${r.tenant.slug}`}>\n {suspended ? t.tenantSuspended : isActive ? t.tenantActive : roleLabel!(r.role)}\n </span>\n ) : null}\n </button>\n );\n })}\n </div>\n ) : null}\n </div>\n );\n}\n\n// ── F092.13 — ConfirmDialog ──────────────────────────────────────────────────\n// The fleet's confirm window, so no app reaches for window.confirm() or a\n// native <dialog> (D-4cd764). Built for appkit's «Slet» in a data-table row.\n//\n// Two choices that go beyond the obvious, both about the destructive case:\n// · it opens with focus on CANCEL, the safe button, so a stray Enter does\n// not delete anything;\n// · while `busy`, neither Escape nor a click outside closes it. The request\n// has already gone; a window that vanished would let the user believe they\n// had cancelled a deletion that is in fact happening.\nexport interface ConfirmDialogProps {\n open: boolean;\n title: ComponentChildren;\n body?: ComponentChildren;\n confirmLabel?: string;\n cancelLabel?: string;\n /** Red confirm button, for an action that cannot be undone. */\n destructive?: boolean;\n /** The confirm action is running: buttons disabled, the window cannot be dismissed. */\n busy?: boolean;\n /** Shown inside the window; the window stays open so the user can retry or cancel. */\n error?: ComponentChildren;\n onConfirm: () => void;\n onCancel: () => void;\n /** Prefix for every data-testid. Default \"confirm-dialog\". */\n testId?: string;\n}\n\nlet confirmDialogSeq = 0;\n\nexport function ConfirmDialog(p: ConfirmDialogProps) {\n const t = p.testId ?? \"confirm-dialog\";\n const panel = useRef<HTMLDivElement>(null);\n const cancelBtn = useRef<HTMLButtonElement>(null);\n const ids = useMemo(() => {\n const n = ++confirmDialogSeq;\n return { title: `bas-confirm-title-${n}`, body: `bas-confirm-body-${n}` };\n }, []);\n // Read through a ref so the key handler, registered once per open, sees the\n // CURRENT busy/onCancel rather than the values from the moment it opened.\n const live = useRef(p);\n live.current = p;\n\n // useLayoutEffect, not useEffect (F092.14): Preact runs useEffect after paint,\n // and appkit measured 153 ms before focus reached Cancel. In that gap the ⋮\n // trigger still had focus, its own handler swallowed Escape, and the dialog had\n // no listener yet — so an Escape right after opening did nothing.\n useLayoutEffect(() => {\n if (!p.open) return;\n const before = document.activeElement as HTMLElement | null;\n cancelBtn.current?.focus();\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n if (!live.current.busy) live.current.onCancel();\n return;\n }\n if (e.key !== \"Tab\" || !panel.current) return;\n const focusable = [...panel.current.querySelectorAll<HTMLElement>(\"button:not([disabled])\")];\n if (focusable.length === 0) { e.preventDefault(); return; }\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n const active = document.activeElement;\n if (e.shiftKey && (active === first || !panel.current.contains(active))) { e.preventDefault(); last.focus(); }\n else if (!e.shiftKey && (active === last || !panel.current.contains(active))) { e.preventDefault(); first.focus(); }\n };\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"keydown\", onKey);\n if (before && typeof before.focus === \"function\" && document.contains(before)) before.focus();\n };\n }, [p.open]);\n\n if (!p.open) return null;\n return (\n <div\n class=\"bas-confirm-backdrop\"\n data-testid={`${t}-backdrop`}\n onMouseDown={(e) => {\n if (e.target === e.currentTarget && !p.busy) p.onCancel();\n }}\n >\n <div\n ref={panel}\n class=\"bas-confirm\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-labelledby={ids.title}\n aria-describedby={p.body ? ids.body : undefined}\n aria-busy={p.busy ? \"true\" : undefined}\n data-testid={t}\n >\n <h2 class=\"bas-confirm__title\" id={ids.title} data-testid={`${t}-title`}>{p.title}</h2>\n {p.body ? <div class=\"bas-confirm__body\" id={ids.body} data-testid={`${t}-body`}>{p.body}</div> : null}\n {p.error ? <div class=\"bas-confirm__error\" role=\"alert\" data-testid={`${t}-error`}>{p.error}</div> : null}\n <div class=\"bas-confirm__actions\">\n <button ref={cancelBtn} type=\"button\" class=\"bas-confirm__btn\" disabled={p.busy} data-testid={`${t}-cancel`} onClick={() => p.onCancel()}>\n {p.cancelLabel ?? \"Annuller\"}\n </button>\n <button\n type=\"button\"\n class={`bas-confirm__btn is-primary${p.destructive ? \" is-danger\" : \"\"}${p.busy ? \" is-busy\" : \"\"}`}\n disabled={p.busy}\n data-testid={`${t}-confirm`}\n onClick={() => p.onConfirm()}\n >\n {p.busy ? <span class=\"bas-confirm__spinner\" aria-hidden=\"true\" /> : null}\n {p.confirmLabel ?? \"Bekræft\"}\n </button>\n </div>\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/preact.tsx"],"names":["d","useState","useEffect","jsx","jsxs","Fragment","useRef","useLayoutEffect","stack","view","selectKeyReducer","shell","useMemo","createBellShell","t","getPreference","getPalette","getSurfaces","getBackdrop","onThemeChange","onPaletteChange","onSurfacesChange","onBackdropChange","setPreference","PALETTES","PALETTE_LABELS","setPalette","setSurfaces","setBackdrop"],"mappings":"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","file":"preact.cjs","sourcesContent":["// @broberg/app-shell — the framework-free core of the fleet's app shell (F092).\n//\n// The shell every app in the fleet had been copying: sidebar + top bar +\n// notification bell + user menu. cardmem and trail each had one (\"ported from\n// trail\"), and helpdesk and the appkit starter would have made the third and\n// fourth. This file holds what does not depend on a framework: the navigation\n// data model, the notification contract and its sources, and the small rules\n// both the Preact and React parts must agree on.\n//\n// Christian, 4 Oct 2026: notifications are a STANDARD part of the template, not\n// an optional slot — so the contract and a default source live here, and a new\n// app gets a working notification centre by pointing one URL at its backend.\n\n// ── Navigation ─────────────────────────────────────────────────────────────\n\n/** One sidebar entry. `icon` is whatever your framework renders (an element). */\nexport interface NavItem<Icon = unknown> {\n id: string;\n label: string;\n href: string;\n icon?: Icon;\n /** A count shown on the item (99+ above 99). 0/undefined shows nothing. */\n badge?: number;\n /**\n * Sub-items, ONE level (F092.5). An item with children is a toggle that opens\n * and closes them, not a link; its own `href` is used only to decide whether\n * it is on the current path.\n */\n children?: NavItem<Icon>[];\n /**\n * F092.20 — a status marker before the label; \"working\" = a run in progress.\n * F092.23 — \"idle\" = the same ring in grey (finished), so every row lines up.\n */\n marker?: \"working\" | \"idle\";\n /** F092.20 — shows a pin icon after the label. */\n pinned?: boolean;\n /** F092.21 — row actions: a «…» button opens a menu with these. */\n actions?: NavAction[];\n}\n/**\n * F092.21 — one row action. `submenu` switches the menu to a sub-list (with a\n * back arrow); `input` switches it to a field + save (e.g. rename). A plain\n * action, a submenu leaf and a saved input all call `onItemAction`.\n */\nexport interface NavAction {\n id: string;\n label: string;\n icon?: unknown;\n /** A single letter that picks this action while the menu is open (e.g. \"P\"). */\n kbd?: string;\n /** Shown in the danger colour (delete). */\n danger?: boolean;\n submenu?: NavAction[];\n input?: { value: string; placeholder?: string; saveLabel?: string };\n /** F092.22 — ask twice: the first pick shows `label` («Tryk igen for at slette») and keeps the menu open; the second runs it. */\n confirm?: { label: string };\n /** F092.32 — a dimmed value right-aligned before the chevron («Type …… All ›»). */\n value?: string;\n /** F092.32 — a divider line before this item, to separate groups. */\n separator?: boolean;\n}\nexport interface NavSection<Icon = unknown> {\n /** A sub-heading inside one group, e.g. \"I dag\" / \"I går\". */\n label: string;\n items: NavItem<Icon>[];\n}\nexport interface NavGroup<Icon = unknown> {\n label: string;\n items: NavItem<Icon>[];\n /** F092.20 — \"plain\": the group label in normal text (not uppercase/mono). */\n variant?: \"default\" | \"plain\";\n /** F092.20 — sub-headed lists inside this group, shown after `items`. */\n sections?: NavSection<Icon>[];\n /**\n * F092.23 — no heading row: the items show directly, always open (it cannot be\n * folded, so a stored fold for this label is ignored). `label` stays required —\n * it is the group's key and its accessible name.\n */\n hideLabel?: boolean;\n /**\n * F092.26 — false: the heading is plain text (no fold button, no chevron) and the\n * group is always open, even with a stored fold for this label. Default true.\n */\n collapsible?: boolean;\n /**\n * F092.28 — a small icon button at the right of the heading row (e.g. «Filtrér og\n * sortér»). The app opens its own menu from `onClick(anchor)`. Clicking it never\n * folds the group. Not shown with `hideLabel` (there is no heading row).\n */\n action?: { icon: Icon; label: string; expanded?: boolean; onClick: (anchor: HTMLElement) => void; testid?: string };\n}\n\n/**\n * Is this item the current page? Exact match for \"/\", otherwise the path is the\n * item or below it (\"/board/123\" is on \"/board\", \"/boardroom\" is not).\n */\nexport function isActivePath(href: string, currentPath: string): boolean {\n const path = (currentPath.split(/[?#]/)[0] || \"/\").replace(/\\/+$/, \"\") || \"/\";\n const target = (href.split(/[?#]/)[0] || \"/\").replace(/\\/+$/, \"\") || \"/\";\n if (target === \"/\") return path === \"/\";\n return path === target || path.startsWith(target + \"/\");\n}\n\n/**\n * A notification's `navigate` is SERVER DATA, and it ends in `location.assign`.\n * `javascript:` there runs code in the app, so only a same-site path or an\n * http(s) URL is followed; anything else returns null and the row just closes.\n */\nexport function safeNavigate(target: string | null | undefined): string | null {\n if (typeof target !== \"string\") return null;\n const t = target.trim();\n if (t.startsWith(\"/\") && !t.startsWith(\"//\") && !t.startsWith(\"/\\\\\")) return t;\n try {\n const u = new URL(t);\n return u.protocol === \"https:\" || u.protocol === \"http:\" ? u.href : null;\n } catch {\n return null;\n }\n}\n\n/**\n * F092.10 — is this link leaving the app? An http(s) link to another origin.\n * Paths, \"#…\", mailto:/tel: and the app's own origin are not. Owner decision\n * D-d28547: every external link opens in a new tab.\n */\nexport function isExternal(\n href: string | null | undefined,\n origin: string | undefined = typeof location !== \"undefined\" ? location.origin : undefined,\n): boolean {\n if (typeof href !== \"string\") return false;\n const h = href.trim();\n if (!origin) return /^(https?:)?\\/\\//i.test(h); // no page to compare with: absolute = external\n let u: URL;\n try {\n u = new URL(h, origin);\n } catch {\n return false;\n }\n return (u.protocol === \"http:\" || u.protocol === \"https:\") && u.origin !== origin;\n}\n\n/**\n * The label of the nav item the user is on, for the content header (F092.4).\n * Sub-items count, and the most specific match wins: on \"/models/genesis\" a\n * \"Genesis\" child beats its \"Models\" parent.\n */\nexport function activeNavLabel<Icon>(\n groups: NavGroup<Icon>[],\n footer: NavItem<Icon>[] | undefined,\n currentPath: string,\n): string | undefined {\n let best: { label: string; len: number } | undefined;\n const visit = (it: NavItem<Icon>) => {\n if (it.href && isActivePath(it.href, currentPath)) {\n const len = it.href.length;\n if (!best || len > best.len) best = { label: it.label, len };\n }\n it.children?.forEach(visit);\n };\n for (const g of groups) g.items.forEach(visit);\n footer?.forEach(visit);\n return best?.label;\n}\n\n/** \"99+\" above 99, nothing for 0 or less. */\nexport function badgeLabel(n: number | undefined): string | null {\n if (!n || n <= 0) return null;\n return n > 99 ? \"99+\" : String(n);\n}\n\n// ── Persisted UI state ─────────────────────────────────────────────────────\n\n/** Read a boolean flag from localStorage; storage errors read as `fallback`. */\nexport function readFlag(key: string, fallback: boolean): boolean {\n try {\n const v = typeof localStorage === \"undefined\" ? null : localStorage.getItem(key);\n return v === null ? fallback : v === \"1\";\n } catch {\n return fallback;\n }\n}\nexport function writeFlag(key: string, value: boolean): void {\n try {\n if (typeof localStorage !== \"undefined\") localStorage.setItem(key, value ? \"1\" : \"0\");\n } catch {\n /* private mode / quota: the UI still works, it just does not remember */\n }\n}\nexport function readSet(key: string): Set<string> {\n try {\n const raw = typeof localStorage === \"undefined\" ? null : localStorage.getItem(key);\n const v = raw ? (JSON.parse(raw) as unknown) : [];\n return new Set(Array.isArray(v) ? v.filter((x): x is string => typeof x === \"string\") : []);\n } catch {\n return new Set();\n }\n}\nexport function writeSet(key: string, value: Set<string>): void {\n try {\n if (typeof localStorage !== \"undefined\") localStorage.setItem(key, JSON.stringify([...value]));\n } catch {\n /* see writeFlag */\n }\n}\n\n// ── Avatar ─────────────────────────────────────────────────────────────────\n\n/**\n * Two initials for the avatar fallback: first letter of the first and the last\n * word, upper-cased. One word gives one letter; nothing gives \"?\".\n *\n * There is deliberately no Gravatar here (owner decision D-1dc849): the avatar\n * is the Broberg ID `picture`, and without one, initials. Gravatar would send a\n * hash of the user's email to a US service on every render.\n */\nexport function initials(name: string | undefined, email?: string): string {\n const source = (name ?? \"\").trim() || (email ?? \"\").split(\"@\")[0] || \"\";\n const words = source.split(/[\\s._-]+/).filter(Boolean);\n if (words.length === 0) return \"?\";\n const first = words[0]![0] ?? \"\";\n const last = words.length > 1 ? words[words.length - 1]![0] ?? \"\" : \"\";\n return (first + last).toUpperCase() || \"?\";\n}\n\n// ── Notifications ──────────────────────────────────────────────────────────\n//\n// REUSE, NOT A SECOND CONTRACT. The fleet already agreed the notification shape\n// in @broberg/notifications (F074): `NotificationRow` — the same field names\n// @broberg/webpush sends, end to end — and the server core that owns the ONE\n// counting rule. The shell's bell renders that row and drives its panel with\n// that package's `createBellShell`, so a server built on `createNotifications`\n// and this bell speak the same language without an adapter.\n//\n// Christian, 4 Oct 2026: notifications are a STANDARD part of the template. So\n// a source, and a default one, ship here: point one URL at your backend.\n\nimport type { NotificationRow } from \"@broberg/notifications/types\";\nexport type { NotificationRow } from \"@broberg/notifications/types\";\n\n/** Where the bell gets its data. Swap it to point at any backend. */\nexport interface NotificationSource {\n /** The rows to show (newest first). */\n loadRows(): Promise<NotificationRow[]>;\n /** THE count — your server's, which may exclude muted kinds (F074's counting rule). */\n countUnseen(): Promise<number>;\n /** Returns the ids that actually transitioned to seen. */\n markSeen(ids: readonly string[]): Promise<string[]>;\n markAllSeen(): Promise<string[]>;\n /** Called with a callback that re-counts; return an unsubscribe. Optional. */\n subscribe?(onChange: () => void): () => void;\n}\n\n/**\n * The default source: a URL on your own backend, shaped after\n * @broberg/notifications' server core so `createNotifications` sits right\n * behind it.\n *\n * GET {url} → { items: NotificationRow[], unseen: number }\n * POST {url}/seen { ids: string[] } → { clearedIds: string[], count: number }\n * POST {url}/seen-all → { clearedIds: string[], count: number }\n *\n * It re-counts when the window regains focus or the tab becomes visible, and on\n * a timer (default 60 s). A failed GET THROWS — the bell shows «could not\n * load», never an empty list: \"could not fetch\" and \"nothing new\" must not look\n * the same.\n */\nexport function createFetchNotificationSource(opts: {\n url: string;\n fetch?: typeof fetch;\n /** Re-count interval in ms. 0 turns it off. Default 60 000. */\n pollMs?: number;\n credentials?: RequestCredentials;\n}): NotificationSource {\n const base = opts.url.replace(/\\/+$/, \"\");\n const doFetch = (input: string, init?: RequestInit) =>\n (opts.fetch ?? fetch)(input, { credentials: opts.credentials ?? \"include\", ...init });\n const get = async (): Promise<{ items: NotificationRow[]; unseen: number }> => {\n const res = await doFetch(base, { headers: { accept: \"application/json\" } });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const body = (await res.json().catch(() => null)) as { items?: unknown; unseen?: unknown } | null;\n if (!body || !Array.isArray(body.items)) throw new Error(\"response has no items array\");\n const items = body.items as NotificationRow[];\n const unseen = typeof body.unseen === \"number\" ? body.unseen : items.filter((n) => n.seenAt == null).length;\n return { items, unseen };\n };\n const post = async (path: string, body?: unknown): Promise<string[]> => {\n const res = await doFetch(`${base}${path}`, {\n method: \"POST\",\n headers: body === undefined ? undefined : { \"content-type\": \"application/json\" },\n body: body === undefined ? undefined : JSON.stringify(body),\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const r = (await res.json().catch(() => ({}))) as { clearedIds?: unknown };\n return Array.isArray(r.clearedIds) ? (r.clearedIds as string[]) : [];\n };\n return {\n loadRows: async () => (await get()).items,\n countUnseen: async () => (await get()).unseen,\n markSeen: (ids) => post(\"/seen\", { ids }),\n markAllSeen: () => post(\"/seen-all\"),\n subscribe(onChange) {\n if (typeof window === \"undefined\") return () => {};\n const onVisible = () => {\n if (document.visibilityState === \"visible\") onChange();\n };\n window.addEventListener(\"focus\", onChange);\n document.addEventListener(\"visibilitychange\", onVisible);\n const ms = opts.pollMs ?? 60_000;\n const timer = ms > 0 ? setInterval(onChange, ms) : null;\n return () => {\n window.removeEventListener(\"focus\", onChange);\n document.removeEventListener(\"visibilitychange\", onVisible);\n if (timer) clearInterval(timer);\n };\n },\n };\n}\n\n/** An in-memory source for demos and tests. */\nexport function createMemoryNotificationSource(initial: NotificationRow[] = []): NotificationSource & {\n push(n: NotificationRow): void;\n rows(): NotificationRow[];\n} {\n let rows = initial.map((n) => ({ ...n }));\n const listeners = new Set<() => void>();\n const emit = () => listeners.forEach((l) => l());\n const mark = (pred: (n: NotificationRow) => boolean): string[] => {\n const now = Date.now();\n const cleared: string[] = [];\n rows = rows.map((n) => {\n if (n.seenAt == null && pred(n)) {\n cleared.push(n.id);\n return { ...n, seenAt: now };\n }\n return n;\n });\n if (cleared.length) emit();\n return cleared;\n };\n return {\n loadRows: async () => rows.map((n) => ({ ...n })),\n countUnseen: async () => rows.filter((n) => n.seenAt == null).length,\n markSeen: async (ids) => mark((n) => ids.includes(n.id)),\n markAllSeen: async () => mark(() => true),\n subscribe(onChange) {\n listeners.add(onChange);\n return () => listeners.delete(onChange);\n },\n push(n) {\n rows = [n, ...rows];\n emit();\n },\n rows: () => rows.map((n) => ({ ...n })),\n };\n}\n\n/** \"nu\", \"5 min\", \"3 t\", \"i går\", \"4 d\" (da) or the English equivalents. */\nexport function relativeTime(ts: string | number, lang: \"da\" | \"en\", now = Date.now()): string {\n const ms = typeof ts === \"number\" ? ts : Date.parse(ts);\n if (!Number.isFinite(ms)) return \"\";\n const m = Math.floor((now - ms) / 60_000);\n if (m < 1) return lang === \"da\" ? \"nu\" : \"now\";\n if (m < 60) return `${m} min`;\n const h = Math.floor(m / 60);\n if (h < 24) return lang === \"da\" ? `${h} t` : `${h} h`;\n const d = Math.floor(h / 24);\n if (d === 1) return lang === \"da\" ? \"i går\" : \"yesterday\";\n return `${d} d`;\n}\n\n// ── Account page (F095.3) ─────────────────────────────────────────────────\n//\n// The user edits their own name and picture inside the app. The app's backend\n// (@broberg/sso's `accountRoutes()`, mounted on /api/account) talks to Broberg\n// ID; this package only talks to that backend, through an adapter, and never\n// imports @broberg/sso.\n\n/** What every account call resolves to — the profile AS THE SERVER NOW HOLDS IT. */\nexport interface AccountProfile {\n sub: string;\n name: string | null;\n picture: string | null;\n email: string | null;\n /** Broberg ID's own account page (password, passkeys, sessions). */\n account_url: string;\n}\n\n/** Where the account page gets and saves the profile. Swap it to point anywhere. */\nexport interface AccountAdapter {\n load(): Promise<AccountProfile>;\n saveName(name: string): Promise<AccountProfile>;\n uploadAvatar(file: Blob): Promise<AccountProfile>;\n removeAvatar(): Promise<AccountProfile>;\n}\n\n/** A failed account call: the HTTP status and the server's `error` code, if any. */\nexport class AccountError extends Error {\n constructor(\n readonly status: number,\n readonly code?: string,\n ) {\n super(code ? `HTTP ${status} ${code}` : `HTTP ${status}`);\n this.name = \"AccountError\";\n }\n}\n\nexport const AVATAR_TYPES = [\"image/png\", \"image/jpeg\", \"image/webp\"] as const;\nexport const AVATAR_MAX_BYTES = 2 * 1024 * 1024;\n\n/** Checked BEFORE uploading, so a file the server will refuse is never sent. */\nexport function checkAvatarFile(file: { size: number; type: string }): \"tooLarge\" | \"wrongType\" | null {\n if (!(AVATAR_TYPES as readonly string[]).includes(file.type)) return \"wrongType\";\n if (file.size > AVATAR_MAX_BYTES) return \"tooLarge\";\n return null;\n}\n\n/**\n * What a failed call means for the page. `reauth` = the user's session or its\n * scope does not allow the change (401, or 403 insufficient_scope): signing in\n * again is the fix, so the page says that instead of «try again».\n */\nexport function accountErrorKind(err: unknown): \"reauth\" | \"tooLarge\" | \"wrongType\" | \"other\" {\n if (!(err instanceof AccountError)) return \"other\";\n if (err.status === 401) return \"reauth\";\n if (err.status === 403 && err.code === \"insufficient_scope\") return \"reauth\";\n if (err.status === 413) return \"tooLarge\";\n if (err.status === 415) return \"wrongType\";\n return \"other\";\n}\n\n/**\n * The default adapter: the app's own backend, shaped after @broberg/sso's\n * `accountRoutes()`.\n *\n * GET {url}/profile → AccountProfile\n * POST {url}/profile {name} → AccountProfile\n * POST {url}/profile/avatar (raw bytes, Content-Type = the image's) → AccountProfile\n * POST {url}/profile/avatar/remove → AccountProfile\n *\n * A non-2xx THROWS an AccountError — a failed save must never look like a\n * saved one.\n */\nexport function createFetchAccountAdapter(opts: { url?: string; fetch?: typeof fetch; credentials?: RequestCredentials } = {}): AccountAdapter {\n const base = (opts.url ?? \"/api/account\").replace(/\\/+$/, \"\");\n const call = async (path: string, init?: RequestInit): Promise<AccountProfile> => {\n const res = await (opts.fetch ?? fetch)(`${base}${path}`, {\n credentials: opts.credentials ?? \"same-origin\",\n ...init,\n headers: { accept: \"application/json\", ...(init?.headers as Record<string, string> | undefined) },\n });\n const body = (await res.json().catch(() => null)) as Record<string, unknown> | null;\n if (!res.ok) throw new AccountError(res.status, typeof body?.error === \"string\" ? body.error : undefined);\n if (!body || typeof body.sub !== \"string\") throw new AccountError(res.status, \"bad_response\");\n return body as unknown as AccountProfile;\n };\n return {\n load: () => call(\"/profile\"),\n saveName: (name) =>\n call(\"/profile\", { method: \"POST\", headers: { \"content-type\": \"application/json\" }, body: JSON.stringify({ name }) }),\n uploadAvatar: (file) =>\n call(\"/profile/avatar\", { method: \"POST\", headers: { \"content-type\": file.type }, body: file }),\n removeAvatar: () => call(\"/profile/avatar/remove\", { method: \"POST\" }),\n };\n}\n\n// ── Analytics page (F097) ─────────────────────────────────────────────────\n//\n// The app's OWN visitor numbers from Upmetrics. The app's backend mounts\n// `analyticsRoutes()` from `@upmetrics/sdk/hono` (the uk_ key stays on the\n// server); this package only talks to that backend, through an adapter, and has\n// no dependency on the SDK — the type below is structural, so Upmetrics'\n// `AnalyticsResponse` fits it as is.\n\nexport interface AnalyticsDay {\n /** YYYY-MM-DD on the Europe/Copenhagen calendar (Upmetrics' own day key). */\n day: string;\n visitors: number;\n pageviews: number;\n}\n\nexport interface AnalyticsData {\n totals: { visitors: number; pageviews: number };\n /** The same-length period just before this one. */\n prev: { visitors: number; pageviews: number };\n /** Only days that had visits — use fillDays() to draw the whole period. */\n series: AnalyticsDay[];\n topPages: { value: string; count: number }[];\n}\n\nexport interface AnalyticsAdapter {\n load(days: number): Promise<AnalyticsData>;\n}\n\n/** A failed analytics call: HTTP status (0 = no answer) and the server's `error` code. */\nexport class AnalyticsError extends Error {\n constructor(\n readonly status: number,\n readonly code?: string,\n ) {\n super(code ? `HTTP ${status} ${code}` : `HTTP ${status}`);\n this.name = \"AnalyticsError\";\n }\n}\n\n/** \"unconfigured\" only for the backend's explicit 503 analytics_unconfigured; anything else is \"unavailable\". */\nexport function analyticsErrorKind(err: unknown): \"unconfigured\" | \"unavailable\" {\n return err instanceof AnalyticsError && err.status === 503 && err.code === \"analytics_unconfigured\" ? \"unconfigured\" : \"unavailable\";\n}\n\n/**\n * The default adapter: `GET {url}?days=N` on the app's own backend (default\n * /api/analytics, where `@upmetrics/sdk/hono`'s analyticsRoutes() answers).\n * A non-2xx, an unreadable body or no answer at all THROWS — never zeros that\n * look like a real, quiet month.\n */\nexport function createFetchAnalyticsAdapter(opts: { url?: string; fetch?: typeof fetch; credentials?: RequestCredentials } = {}): AnalyticsAdapter {\n const url = opts.url ?? \"/api/analytics\";\n return {\n async load(days) {\n let res: Response;\n try {\n res = await (opts.fetch ?? fetch)(`${url}${url.includes(\"?\") ? \"&\" : \"?\"}days=${encodeURIComponent(String(days))}`, {\n credentials: opts.credentials ?? \"same-origin\",\n headers: { accept: \"application/json\" },\n });\n } catch {\n throw new AnalyticsError(0);\n }\n const body = (await res.json().catch(() => null)) as Record<string, unknown> | null;\n if (!res.ok) throw new AnalyticsError(res.status, typeof body?.error === \"string\" ? body.error : undefined);\n const ok =\n body !== null &&\n typeof (body.totals as Record<string, unknown> | undefined)?.visitors === \"number\" &&\n Array.isArray(body.series) &&\n Array.isArray(body.topPages);\n if (!ok) throw new AnalyticsError(res.status, \"bad_response\");\n return body as unknown as AnalyticsData;\n },\n };\n}\n\n/** Today's YYYY-MM-DD on the Copenhagen calendar — the calendar Upmetrics buckets on. */\nexport function copenhagenDay(at: Date = new Date()): string {\n return new Intl.DateTimeFormat(\"en-CA\", { timeZone: \"Europe/Copenhagen\", year: \"numeric\", month: \"2-digit\", day: \"2-digit\" }).format(at);\n}\n\n/**\n * Exactly `days` entries ending today (Copenhagen calendar), with Upmetrics'\n * values where it sent a day and zeros where it did not — Upmetrics only sends\n * days that had visits. Calendar arithmetic, so a DST change never skips or\n * repeats a day.\n */\nexport function fillDays(series: AnalyticsDay[], days: number, now: Date = new Date()): AnalyticsDay[] {\n const byDay = new Map(series.map((d) => [d.day, d]));\n const [y, m, d] = copenhagenDay(now).split(\"-\").map(Number) as [number, number, number];\n return Array.from({ length: days }, (_, i) => {\n const day = new Date(Date.UTC(y, m - 1, d - (days - 1 - i))).toISOString().slice(0, 10);\n return byDay.get(day) ?? { day, visitors: 0, pageviews: 0 };\n });\n}\n\n/** Whole-percent change against the previous period, or null when there is nothing to compare with. */\nexport function changePct(now: number, before: number): number | null {\n return before === 0 ? null : Math.round(((now - before) / before) * 100);\n}\n\n// ── Tenant switcher (F029.10) ──────────────────────────────────────────────\n//\n// The user's own organisations, from the app's backend (@broberg/tenant/hono's\n// tenantRoutes: GET /memberships). This package never imports @broberg/tenant;\n// the row type is structural.\n\nexport interface TenantMembershipRow {\n tenant: { id: string; slug: string; name: string; status?: \"active\" | \"suspended\" };\n role: string;\n}\n\nexport interface TenantAdapter {\n load(): Promise<TenantMembershipRow[]>;\n}\n\nexport class TenantLoadError extends Error {\n constructor(readonly status: number) {\n super(`HTTP ${status}`);\n this.name = \"TenantLoadError\";\n }\n}\n\n/** GET {url} (default /api/me/memberships) → the user's memberships. Non-2xx or a bad body THROWS. */\nexport function createFetchTenantAdapter(opts: { url?: string; fetch?: typeof fetch; credentials?: RequestCredentials } = {}): TenantAdapter {\n return {\n async load() {\n let res: Response;\n try {\n res = await (opts.fetch ?? fetch)(opts.url ?? \"/api/me/memberships\", { credentials: opts.credentials ?? \"same-origin\", headers: { accept: \"application/json\" } });\n } catch {\n throw new TenantLoadError(0);\n }\n const body = (await res.json().catch(() => null)) as unknown;\n if (!res.ok) throw new TenantLoadError(res.status);\n if (!Array.isArray(body) || !body.every((r) => r && typeof r.role === \"string\" && r.tenant && typeof r.tenant.slug === \"string\")) {\n throw new TenantLoadError(res.status);\n }\n return body as TenantMembershipRow[];\n },\n };\n}\n\n// ── Text ───────────────────────────────────────────────────────────────────\n\nexport const TEXT = {\n da: {\n openMenu: \"Åbn menu\",\n closeMenu: \"Luk menu\",\n home: \"Forside\",\n working: \"Arbejder\",\n moreFor: \"Mere for\",\n back: \"Tilbage\",\n pinned: \"Fastgjort\",\n language: \"Sprog\",\n zoom: \"Zoom\",\n zoomOut: \"Zoom ud\",\n zoomIn: \"Zoom ind\",\n couldNotMarkAll: \"Kunne ikke markere alle som læst. Prøv igen.\",\n collapse: \"Skjul sidemenu\",\n expand: \"Vis sidemenu\",\n notifications: \"Notifikationer\",\n markAllRead: \"Markér alle læst\",\n noNotifications: \"Ingen notifikationer endnu.\",\n couldNotLoad: \"Kunne ikke hente notifikationer.\",\n seeAll: \"Vis alle\",\n close: \"Luk\",\n account: \"Konto\",\n signOut: \"Log ud\",\n theme: \"Tema\",\n light: \"Lys\",\n dark: \"Mørk\",\n system: \"System\",\n palette: \"Palet\",\n surfaces: \"Flader\",\n flat: \"Flade\",\n layered: \"Lag\",\n backdrop: \"Baggrund\",\n neurons: \"Neuroner\",\n plain: \"Ren\",\n name: \"Navn\",\n email: \"E-mail\",\n save: \"Gem\",\n saving: \"Gemmer…\",\n saved: \"Gemt\",\n loadingProfile: \"Henter profil…\",\n couldNotLoadProfile: \"Kunne ikke hente din profil.\",\n couldNotSave: \"Kunne ikke gemme. Prøv igen.\",\n reauth: \"Log ind igen for at rette\",\n signInAgain: \"Log ind igen\",\n changePicture: \"Skift billede\",\n removePicture: \"Fjern billede\",\n confirmRemovePicture: \"Fjern dit billede?\",\n remove: \"Fjern\",\n cancel: \"Annuller\",\n pictureSaved: \"Billedet er gemt\",\n pictureRemoved: \"Billedet er fjernet\",\n pictureTooLarge: \"Billedet er for stort — højst 2 MB.\",\n pictureWrongType: \"Vælg et PNG-, JPEG- eller WebP-billede.\",\n bidSecurity: \"Sikkerhed i Broberg ID\",\n analyticsPeriod: \"Periode\",\n analyticsDays: \"{n} dage\",\n analyticsVisitors: \"Besøgende\",\n analyticsPageviews: \"Sidevisninger\",\n analyticsVsPrev: \"{pct} % mod forrige periode\",\n analyticsNoPrev: \"Ingen sammenligning\",\n analyticsOverTime: \"Sidevisninger pr. dag\",\n analyticsTopPages: \"Mest besøgte sider\",\n analyticsDay: \"Dag\",\n analyticsPage: \"Side\",\n analyticsEmpty: \"Ingen besøg i perioden.\",\n analyticsLoading: \"Henter tal…\",\n analyticsUnconfigured: \"Analytics er ikke sat op for denne app.\",\n analyticsUnavailable: \"Upmetrics svarer ikke lige nu. Prøv igen om lidt.\",\n tenantSwitch: \"Skift organisation\",\n tenantLoadFailed: \"Kunne ikke hente dine organisationer.\",\n tenantSwitchFailed: \"Kunne ikke skifte organisation. Du er stadig i {name}.\",\n tenantRetry: \"Prøv igen\",\n tenantSuspended: \"lukket\",\n tenantActive: \"aktiv\",\n },\n en: {\n openMenu: \"Open menu\",\n closeMenu: \"Close menu\",\n home: \"Home\",\n working: \"Working\",\n moreFor: \"More for\",\n back: \"Back\",\n pinned: \"Pinned\",\n language: \"Language\",\n zoom: \"Zoom\",\n zoomOut: \"Zoom out\",\n zoomIn: \"Zoom in\",\n couldNotMarkAll: \"Could not mark all as read. Try again.\",\n collapse: \"Hide sidebar\",\n expand: \"Show sidebar\",\n notifications: \"Notifications\",\n markAllRead: \"Mark all read\",\n noNotifications: \"No notifications yet.\",\n couldNotLoad: \"Could not load notifications.\",\n seeAll: \"See all\",\n close: \"Close\",\n account: \"Account\",\n signOut: \"Sign out\",\n theme: \"Theme\",\n light: \"Light\",\n dark: \"Dark\",\n system: \"System\",\n palette: \"Palette\",\n surfaces: \"Surfaces\",\n flat: \"Flat\",\n layered: \"Layered\",\n backdrop: \"Backdrop\",\n neurons: \"Neurons\",\n plain: \"Plain\",\n name: \"Name\",\n email: \"Email\",\n save: \"Save\",\n saving: \"Saving…\",\n saved: \"Saved\",\n loadingProfile: \"Loading profile…\",\n couldNotLoadProfile: \"Could not load your profile.\",\n couldNotSave: \"Could not save. Try again.\",\n reauth: \"Sign in again to make changes\",\n signInAgain: \"Sign in again\",\n changePicture: \"Change picture\",\n removePicture: \"Remove picture\",\n confirmRemovePicture: \"Remove your picture?\",\n remove: \"Remove\",\n cancel: \"Cancel\",\n pictureSaved: \"Picture saved\",\n pictureRemoved: \"Picture removed\",\n pictureTooLarge: \"The picture is too large — 2 MB at most.\",\n pictureWrongType: \"Choose a PNG, JPEG or WebP image.\",\n bidSecurity: \"Security in Broberg ID\",\n analyticsPeriod: \"Period\",\n analyticsDays: \"{n} days\",\n analyticsVisitors: \"Visitors\",\n analyticsPageviews: \"Page views\",\n analyticsVsPrev: \"{pct}% vs previous period\",\n analyticsNoPrev: \"No comparison\",\n analyticsOverTime: \"Page views per day\",\n analyticsTopPages: \"Most visited pages\",\n analyticsDay: \"Day\",\n analyticsPage: \"Page\",\n analyticsEmpty: \"No visits in this period.\",\n analyticsLoading: \"Loading figures…\",\n analyticsUnconfigured: \"Analytics is not set up for this app.\",\n analyticsUnavailable: \"Upmetrics is not answering right now. Try again shortly.\",\n tenantSwitch: \"Switch organisation\",\n tenantLoadFailed: \"Could not load your organisations.\",\n tenantSwitchFailed: \"Could not switch organisation. You are still in {name}.\",\n tenantRetry: \"Try again\",\n tenantSuspended: \"suspended\",\n tenantActive: \"active\",\n },\n} as const;\nexport type Lang = keyof typeof TEXT;\n","/** @jsxImportSource preact */\n// @broberg/app-shell/preact — the fleet's app shell for Stack B (F092).\n//\n// Lifted in shape from cardmem (apps/web/src/components/ui: top-nav, app-sidebar,\n// notification-bell, user-menu, page-header, page-tabs; origin/main af80f192)\n// and trail (the original), rewritten as props-in components: nothing here\n// knows about any app's auth, router or data. Styling is css/app-shell.css,\n// on @broberg/theme's tokens, so every palette × light/dark × flat/layered works.\n//\n// Use the whole thing:\n// <AppShell brand={…} groups={…} currentPath={path} user={…} notifications={source}\n// accountHref=\"https://id.broberg.ai/account\" onSignOut={…}>{page}</AppShell>\n// or compose the parts (Sidebar, TopBar, NotificationBell, UserMenu,\n// PageHeader, PageTabs) in your own layout.\n\nimport type { ComponentChildren, JSX } from \"preact\";\nimport { useEffect, useLayoutEffect, useMemo, useRef, useState } from \"preact/hooks\";\nimport { createBellShell } from \"@broberg/notifications/shell\";\nimport { selectKeyReducer, type SelectState } from \"@broberg/ui-controls-core\";\nimport {\n getBackdrop,\n getPalette,\n getPreference,\n getSurfaces,\n onBackdropChange,\n onPaletteChange,\n onSurfacesChange,\n onThemeChange,\n PALETTE_LABELS,\n PALETTES,\n setBackdrop,\n setPalette,\n setPreference,\n setSurfaces,\n type Backdrop,\n type Palette,\n type Surfaces,\n type ThemePreference,\n} from \"@broberg/theme\";\nimport {\n createFetchTenantAdapter,\n type TenantAdapter,\n type TenantMembershipRow,\n accountErrorKind,\n activeNavLabel,\n analyticsErrorKind,\n changePct,\n createFetchAnalyticsAdapter,\n fillDays,\n type AnalyticsAdapter,\n type AnalyticsData,\n type AnalyticsDay,\n AVATAR_TYPES,\n badgeLabel,\n checkAvatarFile,\n createFetchAccountAdapter,\n type AccountAdapter,\n type AccountProfile,\n initials,\n isActivePath,\n readFlag,\n readSet,\n relativeTime,\n safeNavigate,\n isExternal,\n TEXT,\n writeFlag,\n writeSet,\n type Lang,\n type NavAction,\n type NavGroup,\n type NavItem,\n type NotificationRow,\n type NotificationSource,\n} from \"./index\";\n\nexport * from \"./index\";\n\ntype Icon = ComponentChildren;\nexport type PreactNavItem = NavItem<Icon>;\nexport type PreactNavGroup = NavGroup<Icon>;\n/** Called instead of a full page load when given. Return false to let the browser navigate. */\nexport type Navigate = (href: string) => void;\n\nconst MOBILE_QUERY = \"(max-width: 767px)\";\n\n/** True below 768px. Follows the window as it resizes. */\nexport function useIsMobile(): boolean {\n const get = () => typeof window !== \"undefined\" && typeof window.matchMedia === \"function\" && window.matchMedia(MOBILE_QUERY).matches;\n const [mobile, setMobile] = useState(get);\n useEffect(() => {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") return;\n const mq = window.matchMedia(MOBILE_QUERY);\n const on = () => setMobile(mq.matches);\n mq.addEventListener?.(\"change\", on);\n return () => mq.removeEventListener?.(\"change\", on);\n }, []);\n return mobile;\n}\n\n/** An <a> that hands the click to `onNavigate` (SPA) when given, else a normal link. */\nfunction NavLink(props: {\n href: string;\n onNavigate?: Navigate;\n onAfter?: () => void;\n class?: string;\n children: ComponentChildren;\n \"data-testid\"?: string;\n \"aria-current\"?: \"page\";\n \"aria-label\"?: string;\n title?: string;\n role?: \"menuitem\";\n}) {\n const { href, onNavigate, onAfter, children, ...rest } = props;\n // F092.10 / D-d28547: a link that leaves the app opens in a new tab, and is\n // never handed to the app's router. Decided HERE, once, for every link the\n // shell renders — a rule that has to be remembered per link is forgotten.\n if (isExternal(href)) {\n return (\n <a {...rest} href={href} target=\"_blank\" rel=\"noopener noreferrer\" onClick={() => onAfter?.()}>\n {children}\n </a>\n );\n }\n return (\n <a\n {...rest}\n href={href}\n onClick={(e: JSX.TargetedMouseEvent<HTMLAnchorElement>) => {\n if (onNavigate && !e.metaKey && !e.ctrlKey && !e.shiftKey && e.button === 0) {\n e.preventDefault();\n onNavigate(href);\n }\n onAfter?.();\n }}\n >\n {children}\n </a>\n );\n}\n\n// ── Icons (inline, so the package has no icon dependency) ─────────────────\nconst svg = (d: ComponentChildren, size = 18) => (\n <svg viewBox=\"0 0 24 24\" width={size} height={size} fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n {d}\n </svg>\n);\nconst IconMenu = () => svg(<path d=\"M4 6h16M4 12h16M4 18h16\" />, 20);\nconst IconChevron = ({ open }: { open?: boolean }) => (\n <span class={\"bas-chev\" + (open ? \" is-open\" : \"\")}>{svg(<path d=\"m9 18 6-6-6-6\" />, 12)}</span>\n);\n// lucide \"panel-left\" (ISC), the exact icon in shadcn's SidebarTrigger (F092.4).\nconst IconPanelLeft = () => svg(<><rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" /><path d=\"M9 3v18\" /></>, 16);\nconst IconBell = () => svg(<><path d=\"M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9\" /><path d=\"M10.3 21a1.94 1.94 0 0 0 3.4 0\" /></>, 19);\nconst IconLogOut = () => svg(<><path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" /><path d=\"m16 17 5-5-5-5\" /><path d=\"M21 12H9\" /></>, 14);\n// lucide \"pin\" (ISC).\nconst IconPin = () => svg(<><path d=\"M12 17v5\" /><path d=\"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z\" /></>, 12);\nconst IconUser = () => svg(<><circle cx=\"12\" cy=\"8\" r=\"4\" /><path d=\"M4 21a8 8 0 0 1 16 0\" /></>, 14);\n// F092.27 — lucide «building», for the organisation line in the user menu.\nconst IconBuilding = () => svg(<><rect width=\"16\" height=\"20\" x=\"4\" y=\"2\" rx=\"2\" /><path d=\"M9 22v-4h6v4\" /><path d=\"M8 6h.01M16 6h.01M12 6h.01M12 10h.01M12 14h.01M16 10h.01M16 14h.01M8 10h.01M8 14h.01\" /></>, 15);\n\n// ── Row actions (F092.21) ──────────────────────────────────────────────────\n//\n// A «…» per sidebar item, opening a popover menu (position:fixed from the\n// button, like the palette list in F001.25, so the sidebar's scroll frame cannot\n// clip it). Three views in one popover: the list, a submenu with a back arrow,\n// and an input with «Gem» (rename). Keys: arrows move, Enter picks, an action's\n// kbd letter picks it, ←/Backspace-on-empty goes back, Escape closes and puts\n// focus back on «…».\n\ntype RowView = { kind: \"list\"; actions: NavAction[]; title?: string } | { kind: \"input\"; action: NavAction };\n\nexport interface ItemActionsMenuProps {\n /** The menu's items — the same NavAction[] a sidebar row takes (kbd, submenu, input, confirm, danger). */\n actions: NavAction[];\n /** What the menu opens from: positioned from it, and focus returns to it on close. */\n anchor: HTMLElement;\n /** An action was chosen (value = the text, for an input action). The menu has closed. */\n onAction: (actionId: string, value?: string) => void;\n /** The menu closed — by a pick, Escape, a click outside, scroll or resize. Unmount it here. */\n onClose: () => void;\n lang: Lang;\n /** The menu's accessible name, e.g. the conversation's title. */\n label: string;\n /**\n * \"auto\" (default): right-aligned to the anchor, below it if it fits, else above.\n * \"down\": right-aligned, always below. \"up-start\" (F092.31): ABOVE the anchor and\n * left-aligned to its left edge (e.g. a «+» in a composer); below if there is no room above.\n */\n placement?: \"auto\" | \"down\" | \"up-start\";\n /** testids: `<prefix>-menu`, `<prefix>-action-<id>`, `<prefix>-back`, `<prefix>-input`, `<prefix>-save`. Default \"item-actions\". */\n testidPrefix?: string;\n}\n\n/**\n * F092.29 — the row-action menu on its own, so a title «⌄» and a sidebar row «…»\n * open THE SAME menu (scout #2745). The sidebar's row menu is this component: one\n * implementation, so keyboard, confirm, input and submenu cannot drift apart.\n * Mount it while open; it closes itself through onClose.\n *\n * Keys (F092.21/.22): focus moves into the menu when it opens; arrows move real\n * focus; Enter/Space act on the FOCUSED item; a kbd letter picks; ←/Backspace goes\n * back from a submenu; Escape closes and returns focus to the anchor.\n */\nexport function ItemActionsMenu(props: ItemActionsMenuProps) {\n const t = TEXT[props.lang];\n const pre = props.testidPrefix ?? \"item-actions\";\n const menu = useRef<HTMLDivElement>(null);\n const first: RowView[] = [{ kind: \"list\", actions: props.actions }];\n const [stack, setStack] = useState<RowView[]>(first);\n // F092.22 — the current stack in a ref as well, set the moment it changes, so a\n // key that arrives before the next render already sees it.\n const stackRef = useRef<RowView[]>(first);\n const setStackNow = (next: RowView[]) => {\n stackRef.current = next;\n setStack(next);\n };\n const [hi, setHiState] = useState(0);\n // F092.22 — the highlight also lives in a ref, updated at once: two keys pressed\n // before the next render must build on each other, not both start from the old value.\n const hiRef = useRef(0);\n const setHi = (n: number) => {\n hiRef.current = n;\n setHiState(n);\n };\n // F092.22 — a confirm action is \"armed\" by the first pick and runs on the second.\n const [armed, setArmedState] = useState<string | null>(null);\n const armedRef = useRef<string | null>(null);\n const setArmed = (v: string | null) => {\n armedRef.current = v;\n setArmedState(v);\n };\n const items = useRef<(HTMLButtonElement | null)[]>([]);\n const onKeyDownRef = useRef<(e: KeyboardEvent) => void>(() => {});\n const [value, setValue] = useState(\"\");\n const [pos, setPos] = useState<Record<string, string> | undefined>(undefined);\n const view = stack[stack.length - 1]!;\n const closed = useRef(false);\n // F092.32 — the focus ring is for keyboard use only: on when the anchor was\n // keyboard-focused at open (Tab + Enter), or from the first key in the menu.\n const [kbd, setKbd] = useState(() => props.anchor.matches(\":focus-visible\"));\n\n const close = (refocus = true) => {\n if (closed.current) return;\n closed.current = true;\n if (refocus) props.anchor.focus();\n props.onClose();\n };\n const show = (v: RowView) => {\n setStackNow([...stackRef.current, v]);\n setHi(0);\n setArmed(null);\n if (v.kind === \"input\") setValue(v.action.input!.value);\n };\n const back = () => {\n setStackNow(stackRef.current.slice(0, -1));\n setHi(0);\n setArmed(null);\n };\n const pick = (a: NavAction) => {\n if (a.submenu?.length) return show({ kind: \"list\", actions: a.submenu, title: a.label });\n if (a.input) return show({ kind: \"input\", action: a });\n if (a.confirm && armedRef.current !== a.id) return setArmed(a.id); // first pick arms, the menu stays open\n close();\n props.onAction(a.id);\n };\n const save = (a: NavAction) => {\n close();\n props.onAction(a.id, value);\n };\n\n useLayoutEffect(() => {\n const r = props.anchor.getBoundingClientRect();\n const vw = window.innerWidth, vh = window.innerHeight, m = 8;\n // F092.33 — the menu sizes to its content (CSS min/max width); place it by the MEASURED width.\n const w = Math.min(Math.max(240, menu.current?.offsetWidth ?? 0), vw - 2 * m);\n const h = menu.current?.offsetHeight ?? 0;\n const start = props.placement === \"up-start\";\n const left = Math.max(m, Math.min(start ? r.left : r.right - w, vw - w - m));\n const fitsBelow = r.bottom + 4 + h <= vh - m;\n const fitsAbove = r.top - 4 - h >= m;\n const below = start ? !fitsAbove : props.placement === \"down\" || fitsBelow || !fitsAbove;\n const top = below ? Math.min(r.bottom + 4, vh - m - h) : r.top - 4 - h;\n setPos({ position: \"fixed\", left: `${left}px`, top: `${Math.max(m, top)}px` });\n }, [stack.length]);\n\n // F092.22 — focus only once the menu is VISIBLE (pos set): an element under\n // visibility:hidden cannot take focus, which is why 0.13.1 left focus on «…».\n // Real DOM focus follows the highlight, so Enter acts on what the user sees focused.\n // A layout effect reading the CURRENT highlight (the ref): a passive effect from\n // the opening render once ran after a fast ↓ and focused item 0 with its stale\n // value — and that focus reset the highlight, so the next ↓ landed one short.\n useLayoutEffect(() => {\n if (!pos) return;\n if (view.kind === \"input\") menu.current?.querySelector<HTMLInputElement>(\"input\")?.focus();\n else items.current[hiRef.current]?.focus();\n }, [pos, hi, stack.length]);\n\n // A LAYOUT effect: attached in the same task the menu appears, so no key event\n // can fall between \"menu exists\" and \"listener exists\" (a passive effect runs\n // after paint, and a fast ↓ landed in that gap).\n useLayoutEffect(() => {\n const outside = (e: Event) => {\n const n = e.target instanceof Node ? e.target : null;\n if (n && (menu.current?.contains(n) || props.anchor.contains(n))) return; // the anchor toggles itself\n close(false);\n };\n // F092.22 — a key typed before focus has reached the menu (it moves there\n // only once the menu is visible) still belongs to the menu: arrows, shortcut\n // letters, Escape. Enter/Space/Tab are left alone — on the anchor they toggle the menu.\n const early = (e: KeyboardEvent) => {\n const n = e.target instanceof Node ? e.target : null;\n if (n && menu.current?.contains(n)) return; // the menu's own handler takes it\n if (e.key === \"Enter\" || e.key === \" \" || e.key === \"Spacebar\" || e.key === \"Tab\") return;\n onKeyDownRef.current(e);\n };\n document.addEventListener(\"keydown\", early, true);\n document.addEventListener(\"mousedown\", outside);\n window.addEventListener(\"scroll\", outside, true);\n window.addEventListener(\"resize\", outside);\n return () => {\n document.removeEventListener(\"keydown\", early, true);\n document.removeEventListener(\"mousedown\", outside);\n window.removeEventListener(\"scroll\", outside, true);\n window.removeEventListener(\"resize\", outside);\n };\n }, []);\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (closed.current) return;\n const stack = stackRef.current;\n const view = stack[stack.length - 1];\n if (!view) return;\n e.stopPropagation(); // the user menu / app must not also act on these keys\n setKbd(true);\n if (e.key === \"Escape\") {\n e.preventDefault();\n return close();\n }\n if (view.kind === \"input\") {\n if (e.key === \"Enter\") {\n e.preventDefault();\n save(view.action);\n }\n return;\n }\n if ((e.key === \"ArrowLeft\" || e.key === \"Backspace\") && stack.length > 1) {\n e.preventDefault();\n return back();\n }\n const list = view.actions;\n if (e.key === \"Enter\" || e.key === \" \" || e.key === \"Spacebar\") {\n // The item that HAS focus — never a different highlighted one (scout #2662:\n // Enter on «Tilføj til projekt» pinned the conversation instead).\n e.preventDefault();\n const at = items.current.findIndex((b) => b === document.activeElement);\n const idx = at >= 0 ? at : hiRef.current;\n return list[idx] ? pick(list[idx]!) : undefined;\n }\n const { state, intent } = selectKeyReducer({ open: true, highlighted: hiRef.current }, e.key, list.length);\n if (intent.type === \"select\") {\n e.preventDefault();\n return pick(list[intent.index]!);\n }\n if (state.highlighted !== hiRef.current) {\n e.preventDefault();\n return setHi(state.highlighted);\n }\n const byKbd = e.key.length === 1 ? list.find((a) => a.kbd?.toLowerCase() === e.key.toLowerCase()) : undefined;\n if (byKbd) {\n e.preventDefault();\n pick(byKbd);\n }\n };\n\n onKeyDownRef.current = onKeyDown;\n\n return (\n <div\n ref={menu}\n class={\"bas-rowmenu\" + (kbd ? \" is-kbd\" : \"\")}\n role=\"menu\"\n tabIndex={-1}\n aria-label={view.kind === \"list\" && view.title ? view.title : props.label}\n data-testid={`${pre}-menu`}\n style={pos ?? { position: \"fixed\", left: \"0px\", top: \"0px\", visibility: \"hidden\" }}\n onKeyDown={onKeyDown}\n >\n {stack.length > 1 ? (\n <button type=\"button\" class=\"bas-rowmenu__back\" data-testid={`${pre}-back`} aria-label={t.back} onClick={back}>\n <IconChevronLeft />\n <span>{view.kind === \"list\" ? view.title : view.action.label}</span>\n </button>\n ) : null}\n {view.kind === \"list\" ? (\n view.actions.map((a, i) => [\n a.separator ? <div key={`${a.id}-sep`} class=\"bas-rowmenu__sep\" role=\"separator\" /> : null,\n <button\n type=\"button\"\n role=\"menuitem\"\n key={a.id}\n ref={(el) => {\n items.current[i] = el;\n }}\n tabIndex={i === hi ? 0 : -1}\n class={\"bas-rowmenu__item\" + (i === hi ? \" is-active\" : \"\") + (a.danger ? \" is-danger\" : \"\") + (armed === a.id ? \" is-armed\" : \"\")}\n data-testid={`${pre}-action-${a.id}`}\n onMouseEnter={() => setHi(i)}\n onFocus={() => setHi(i)}\n onClick={() => pick(a)}\n >\n {a.icon ? <span class=\"bas-rowmenu__icon\">{a.icon as ComponentChildren}</span> : null}\n <span class=\"bas-rowmenu__label\">{armed === a.id && a.confirm ? a.confirm.label : a.label}</span>\n {a.value ? <span class=\"bas-rowmenu__value\" data-testid={`${pre}-action-${a.id}-value`}>{a.value}</span> : null}\n {a.submenu?.length ? <IconChevronRight /> : a.kbd ? <kbd class=\"bas-rowmenu__kbd\">{a.kbd.toUpperCase()}</kbd> : null}\n </button>,\n ])\n ) : (\n <form\n class=\"bas-rowmenu__form\"\n data-testid={`${pre}-form`}\n onSubmit={(e) => {\n e.preventDefault();\n save(view.action);\n }}\n >\n <input\n class=\"bas-rowmenu__input\"\n data-testid={`${pre}-input`}\n aria-label={view.action.label}\n value={value}\n placeholder={view.action.input!.placeholder}\n onInput={(e) => setValue((e.currentTarget as HTMLInputElement).value)}\n />\n <button type=\"submit\" class=\"bas-rowmenu__save\" data-testid={`${pre}-save`}>\n {view.action.input!.saveLabel ?? t.save}\n </button>\n </form>\n )}\n </div>\n );\n}\n\n// The sidebar row's «…»: a button plus ItemActionsMenu while open.\nfunction RowActions(props: { item: PreactNavItem; lang: Lang; onAction: (actionId: string, value?: string) => void }) {\n const t = TEXT[props.lang];\n const id = props.item.id;\n const btn = useRef<HTMLButtonElement>(null);\n const [open, setOpenState] = useState(false);\n // In a ref too, so a second click before the re-render toggles correctly.\n const openRef = useRef(false);\n const setOpen = (v: boolean) => {\n openRef.current = v;\n setOpenState(v);\n };\n return (\n <>\n <button\n ref={btn}\n type=\"button\"\n class={\"bas-item__more\" + (open ? \" is-open\" : \"\")}\n data-testid={`sidebar-item-${id}-more`}\n aria-label={`${t.moreFor} ${props.item.label}`}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n onClick={() => {\n if (!openRef.current) return setOpen(true);\n setOpen(false);\n btn.current?.focus();\n }}\n >\n <IconMore />\n </button>\n {open && btn.current ? (\n <ItemActionsMenu\n actions={props.item.actions!}\n anchor={btn.current}\n lang={props.lang}\n label={props.item.label}\n testidPrefix={`sidebar-item-${id}`}\n onAction={props.onAction}\n onClose={() => setOpen(false)}\n />\n ) : null}\n </>\n );\n}\n\n// lucide \"ellipsis\", \"chevron-left/right\" (ISC).\nconst IconMore = () => svg(<><circle cx=\"12\" cy=\"12\" r=\"1\" /><circle cx=\"19\" cy=\"12\" r=\"1\" /><circle cx=\"5\" cy=\"12\" r=\"1\" /></>, 16);\nconst IconChevronLeft = () => svg(<path d=\"m15 18-6-6 6-6\" />, 14);\nconst IconChevronRight = () => svg(<path d=\"m9 18 6-6-6-6\" />, 14);\n\n// ── Sidebar ────────────────────────────────────────────────────────────────\n\nexport interface SidebarProps {\n groups: PreactNavGroup[];\n footer?: PreactNavItem[];\n currentPath: string;\n onNavigate?: Navigate;\n /** Desktop: is the sidebar folded (to nothing, or to the icon rail — see `collapse`). */\n collapsed?: boolean;\n /**\n * F092.6 — what \"folded\" means on desktop, as shadcn's `collapsible`:\n * \"offcanvas\" hides the sidebar, \"icon\" keeps a 48px rail of item icons with\n * `brandMark` on top. Default: \"icon\" when `mobile` is \"rail\", else \"offcanvas\".\n */\n collapse?: \"offcanvas\" | \"icon\";\n /** The app's logo icon, shown at the top of the icon rail. */\n brandMark?: ComponentChildren;\n /** F092.7 — the app's start page: `header` and `brandMark` become links to it. */\n homeHref?: string;\n /** Accessible name of the brandMark link (it has no visible text). Default \"Forside\"/\"Home\". */\n homeLabel?: string;\n /** data-testid of the brand link in the sidebar head. */\n brandTestId?: string;\n /** Phone, drawer mode: is the drawer open. */\n mobileOpen?: boolean;\n onClose?: () => void;\n mobile?: \"drawer\" | \"rail\";\n /** Shown at the top of the sidebar (e.g. the brand on a phone). */\n header?: ComponentChildren;\n /** localStorage key for which groups are folded. */\n groupsKey?: string;\n /** localStorage key for which items with children are open (F092.5). */\n itemsKey?: string;\n lang: Lang;\n /** F092.15 — rendered at the very bottom of the sidebar (the user menu in \"sidebar-footer\"). */\n bottom?: ComponentChildren;\n /** F092.21 — a row action was chosen (value: the saved text of an `input` action). */\n onItemAction?: (navItemId: string, actionId: string, value?: string) => void;\n}\n\nexport function Sidebar(p: SidebarProps) {\n const key = p.groupsKey ?? \"broberg-app-shell.groups\";\n const itemsKey = p.itemsKey ?? \"broberg-app-shell.items\";\n const mode = p.mobile ?? \"drawer\";\n const collapseMode = p.collapse ?? (mode === \"rail\" ? \"icon\" : \"offcanvas\");\n const isMobile = useIsMobile();\n // The rail: on a phone in rail mode, or on desktop when folded to icons.\n const railed = isMobile ? mode === \"rail\" : !!p.collapsed && collapseMode === \"icon\";\n\n const [folded, setFolded] = useState<Set<string>>(() => readSet(key));\n const toggleGroup = (label: string) => {\n const next = new Set(folded);\n next.has(label) ? next.delete(label) : next.add(label);\n setFolded(next);\n writeSet(key, next);\n };\n\n const all = [...p.groups.flatMap((g) => g.items), ...(p.footer ?? [])];\n const childActive = (it: PreactNavItem) => !!it.children?.some((c) => isActivePath(c.href, p.currentPath));\n // Open = what the user left open, plus any parent of the page they are on.\n const [openItems, setOpenItems] = useState<Set<string>>(() => {\n const s = readSet(itemsKey);\n for (const it of all) if (childActive(it)) s.add(it.id);\n return s;\n });\n const toggleItem = (id: string) => {\n const next = new Set(openItems);\n next.has(id) ? next.delete(id) : next.add(id);\n setOpenItems(next);\n writeSet(itemsKey, next);\n };\n\n // F092.6 — the rail's flyout for an item with children.\n const [flyout, setFlyout] = useState<{ id: string; top: number; left: number } | null>(null);\n const flyoutRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n if (!flyout) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setFlyout(null);\n };\n const onDown = (e: MouseEvent) => {\n const t = e.target as Node | null;\n if (flyoutRef.current && t && flyoutRef.current.contains(t)) return;\n if (t instanceof Element && t.closest(`[data-flyout-for=\"${flyout.id}\"]`)) return;\n setFlyout(null);\n };\n document.addEventListener(\"keydown\", onKey);\n document.addEventListener(\"mousedown\", onDown);\n return () => {\n document.removeEventListener(\"keydown\", onKey);\n document.removeEventListener(\"mousedown\", onDown);\n };\n }, [flyout]);\n useEffect(() => {\n if (!railed) setFlyout(null);\n }, [railed]);\n\n const close = () => {\n setFlyout(null);\n p.onClose?.();\n };\n\n const leaf = (it: PreactNavItem, sub = false) => {\n const active = isActivePath(it.href, p.currentPath);\n const badge = badgeLabel(it.badge);\n const link = (\n <NavLink\n key={it.id}\n href={it.href}\n onNavigate={p.onNavigate}\n onAfter={close}\n class={\"bas-item\" + (sub ? \" bas-item--sub\" : \"\") + (active ? \" is-active\" : \"\")}\n data-testid={`sidebar-item-${it.id}`}\n aria-current={active ? \"page\" : undefined}\n aria-label={railed && !sub ? it.label : undefined}\n title={it.label}\n >\n {active && !sub ? <span class=\"bas-item__bar\" /> : null}\n {it.icon ? <span class=\"bas-item__icon\">{it.icon}</span> : null}\n {it.marker === \"working\" ? (\n <span class=\"bas-item__marker\" data-testid={`sidebar-item-${it.id}-marker`} role=\"img\" aria-label={TEXT[p.lang].working} />\n ) : it.marker === \"idle\" ? (\n <span class=\"bas-item__marker bas-item__marker--idle\" data-testid={`sidebar-item-${it.id}-marker`} aria-hidden=\"true\" />\n ) : null}\n <span class=\"bas-item__label\">{it.label}</span>\n {it.pinned ? (\n <span class=\"bas-item__pin\" data-testid={`sidebar-item-${it.id}-pinned`} role=\"img\" aria-label={TEXT[p.lang].pinned}>\n <IconPin />\n </span>\n ) : null}\n {badge ? <span class=\"bas-item__count\" data-testid={`sidebar-badge-${it.id}`}>{badge}</span> : null}\n </NavLink>\n );\n // F092.21 — a link cannot contain a button, so an item with actions is a row: link + «…».\n if (!it.actions?.length || railed) return link;\n return (\n <div class=\"bas-itemrow\" key={it.id}>\n {link}\n <RowActions item={it} lang={p.lang} onAction={(a, v) => (v === undefined ? p.onItemAction?.(it.id, a) : p.onItemAction?.(it.id, a, v))} />\n </div>\n );\n };\n\n const parent = (it: PreactNavItem) => {\n const children = it.children!;\n const onPage = childActive(it) || isActivePath(it.href, p.currentPath);\n const open = railed ? flyout?.id === it.id : openItems.has(it.id);\n const onClick = (e: JSX.TargetedMouseEvent<HTMLButtonElement>) => {\n if (!railed) return toggleItem(it.id);\n if (flyout?.id === it.id) return setFlyout(null);\n const r = e.currentTarget.getBoundingClientRect();\n setFlyout({ id: it.id, top: r.top, left: r.right + 6 });\n };\n return (\n <div class=\"bas-itemgroup\" key={it.id}>\n <button\n type=\"button\"\n class={\"bas-item bas-item--parent\" + (onPage ? \" is-parent-active\" : \"\")}\n data-testid={`sidebar-item-${it.id}-toggle`}\n data-flyout-for={it.id}\n aria-expanded={open}\n aria-label={railed ? it.label : undefined}\n title={it.label}\n onClick={onClick}\n >\n {onPage && railed ? <span class=\"bas-item__bar\" /> : null}\n {it.icon ? <span class=\"bas-item__icon\">{it.icon}</span> : null}\n <span class=\"bas-item__label\">{it.label}</span>\n <span class=\"bas-item__chev\">\n <IconChevron open={open} />\n </span>\n </button>\n {!railed && open ? <div class=\"bas-sub\">{children.map((c) => leaf(c, true))}</div> : null}\n {railed && flyout?.id === it.id ? (\n <div\n ref={flyoutRef}\n class=\"bas-flyout\"\n data-testid={`sidebar-flyout-${it.id}`}\n role=\"menu\"\n aria-label={it.label}\n style={{ top: `${flyout.top}px`, left: `${flyout.left}px` }}\n >\n <div class=\"bas-flyout__title\">{it.label}</div>\n {children.map((c) => leaf(c, true))}\n </div>\n ) : null}\n </div>\n );\n };\n\n const item = (it: PreactNavItem) => (it.children?.length ? parent(it) : leaf(it));\n\n return (\n <>\n {mode === \"drawer\" ? (\n <div class={\"bas-backdrop\" + (p.mobileOpen ? \" is-open\" : \"\")} data-testid=\"sidebar-backdrop\" onClick={close} />\n ) : null}\n <aside\n class={\n \"bas-sidebar\" +\n ` is-mobile-${mode}` +\n (p.mobileOpen ? \" is-open\" : \"\") +\n (p.collapsed ? \" is-collapsed\" : \"\") +\n (railed ? \" is-railed\" : \"\")\n }\n data-testid=\"sidebar-root\"\n data-mobile={mode}\n data-collapse={collapseMode}\n aria-label=\"Navigation\"\n >\n {p.header || p.brandMark ? (\n <div class=\"bas-sidebar__head\">\n {p.header ? (\n <div class=\"bas-sidebar__brand\">\n {/* F092.17 — aria-label = the app's name when given; without it the visible header stays the name (\"Forside\" must not override it). */}\n {p.homeHref ? (\n <NavLink href={p.homeHref} onNavigate={p.onNavigate} onAfter={close} class=\"bas-home\" data-testid={p.brandTestId ?? \"sidebar-brand-home\"} aria-label={p.homeLabel}>\n {p.header}\n </NavLink>\n ) : (\n p.header\n )}\n </div>\n ) : null}\n {p.brandMark ? (\n <div class=\"bas-sidebar__mark\" data-testid=\"sidebar-brand-mark\">\n {p.homeHref ? (\n <NavLink\n href={p.homeHref}\n onNavigate={p.onNavigate}\n onAfter={close}\n class=\"bas-home\"\n data-testid=\"brand-mark-home\"\n aria-label={p.homeLabel ?? TEXT[p.lang].home}\n title={p.homeLabel ?? TEXT[p.lang].home}\n >\n {p.brandMark}\n </NavLink>\n ) : (\n p.brandMark\n )}\n </div>\n ) : null}\n </div>\n ) : null}\n <nav class=\"bas-sidebar__nav\">\n {p.groups.map((g) => {\n const fixed = g.hideLabel || g.collapsible === false;\n const open = railed || fixed || !folded.has(g.label);\n const slug = g.label.toLowerCase().replace(/[^a-z0-9]+/g, \"-\");\n return (\n <div\n class={\"bas-group\" + (g.variant === \"plain\" ? \" bas-group--plain\" : \"\")}\n key={g.label}\n role={g.hideLabel ? \"group\" : undefined}\n aria-label={g.hideLabel ? g.label : undefined}\n data-testid={g.hideLabel ? `sidebar-group-${slug}-unlabelled` : undefined}\n >\n {(() => {\n if (g.hideLabel) return null;\n const heading =\n g.collapsible === false ? (\n <div class=\"bas-group__label bas-group__label--static\" data-testid={`sidebar-group-${slug}`}>\n <span>{g.label}</span>\n </div>\n ) : (\n <button type=\"button\" class=\"bas-group__label\" data-testid={`sidebar-group-${slug}`} aria-expanded={open} onClick={() => toggleGroup(g.label)}>\n <IconChevron open={open} />\n <span>{g.label}</span>\n </button>\n );\n if (!g.action) return heading;\n // F092.28 — heading + an icon button at the right; a sibling, so clicking it never folds.\n const a = g.action;\n return (\n <div class=\"bas-group__head\">\n {heading}\n <button\n type=\"button\"\n class=\"bas-group__action\"\n data-testid={a.testid ?? `sidebar-group-${slug}-action`}\n aria-label={a.label}\n title={a.label}\n aria-haspopup=\"menu\"\n aria-expanded={a.expanded ?? false}\n onClick={(e) => a.onClick(e.currentTarget as HTMLElement)}\n >\n {a.icon}\n </button>\n </div>\n );\n })()}\n {open ? g.items.map(item) : null}\n {/* F092.20 — sub-headings inside one group (\"I dag\", \"I går\"). */}\n {open\n ? g.sections?.map((sec) => (\n <div class=\"bas-section\" key={sec.label} data-testid={`sidebar-section-${slug}-${sec.label.toLowerCase().replace(/[^a-z0-9æøå]+/g, \"-\")}`}>\n <div class=\"bas-section__label\">{sec.label}</div>\n {sec.items.map(item)}\n </div>\n ))\n : null}\n </div>\n );\n })}\n </nav>\n {p.footer?.length ? <div class=\"bas-sidebar__foot\">{p.footer.map(item)}</div> : null}\n {p.bottom ? <div class=\"bas-sidebar__user\" data-testid=\"sidebar-user\">{p.bottom}</div> : null}\n </aside>\n </>\n );\n}\n\n// ── Notification bell ──────────────────────────────────────────────────────\n//\n// Driven by @broberg/notifications' createBellShell: one count however many\n// bells, Escape acts on the innermost layer, and the ids \"mark all read\"\n// actually cleared are held for the visit. This component is only the DOM.\n\nexport interface NotificationBellProps {\n /** Where the data comes from. Absent: the bell is still there, with an empty list. */\n source?: NotificationSource;\n onNavigate?: Navigate;\n /** Required on purpose: a default would make \"nobody chose\" look like a choice. */\n lang: Lang;\n}\n\nexport function NotificationBell({ source, onNavigate, lang }: NotificationBellProps) {\n const t = TEXT[lang];\n const mobile = useIsMobile();\n const [error, setError] = useState<string | null>(null);\n const lastCount = useRef(0);\n const shell = useMemo(\n () =>\n createBellShell({\n labels: { bell: t.notifications, panel: t.notifications, markAll: t.markAllRead, seeAll: t.seeAll, empty: t.noNotifications, close: t.close },\n countUnseen: async () => {\n if (!source) return 0;\n try {\n lastCount.current = await source.countUnseen();\n setError(null);\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n }\n return lastCount.current;\n },\n loadRows: async () => {\n if (!source) return [];\n try {\n return await source.loadRows();\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n return [];\n }\n },\n markAllSeen: async () => (source ? source.markAllSeen() : []),\n }),\n [source, lang],\n );\n const [state, setState] = useState(shell.getState());\n useEffect(() => shell.subscribe(setState), [shell]);\n useEffect(() => {\n setState(shell.getState());\n void shell.refresh();\n return source?.subscribe?.(() => {\n if (shell.getState().open) void shell.open(shell.getState().anchor);\n else void shell.refresh();\n });\n }, [shell, source]);\n // F092.9 — a click anywhere outside the bell and its panel closes it (not\n // only a click that happens to land on the overlay: Lens 332fdd8c clicked a\n // dropzone straight through it), and Escape hands focus back to the bell.\n const bellRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n useEffect(() => {\n if (!state.open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && shell.escape() === \"close\") {\n e.preventDefault();\n bellRef.current?.focus();\n }\n };\n const onDown = (e: MouseEvent) => {\n const t = e.target as Node | null;\n if (t && (panelRef.current?.contains(t) || bellRef.current?.contains(t))) return;\n shell.close();\n };\n document.addEventListener(\"keydown\", onKey);\n document.addEventListener(\"mousedown\", onDown);\n return () => {\n document.removeEventListener(\"keydown\", onKey);\n document.removeEventListener(\"mousedown\", onDown);\n };\n }, [state.open, shell]);\n\n // F092.9 — Christian: «Marker alle læst på klokken skal automatisk lukke\n // dropdown det har jeg fået rettet 300 gange i diverse apps». Close only when\n // it WORKED: a panel that closes on a failure hides that nothing was marked.\n const [markAllFailed, setMarkAllFailed] = useState(false);\n useEffect(() => {\n if (!state.open) setMarkAllFailed(false);\n }, [state.open]);\n const onMarkAll = async () => {\n setMarkAllFailed(false);\n try {\n await shell.markAllSeen();\n } catch {\n setMarkAllFailed(true);\n return;\n }\n shell.close();\n };\n const label = badgeLabel(state.count);\n const onRow = async (n: NotificationRow) => {\n shell.close();\n if (n.seenAt == null && source) {\n await source.markSeen([n.id]);\n await shell.refresh();\n }\n const target = safeNavigate(n.navigate);\n if (target && isExternal(target)) {\n // F092.10 — leaves the app: a new tab, never the app's router.\n if (typeof window !== \"undefined\") window.open(target, \"_blank\", \"noopener,noreferrer\");\n } else if (target) {\n if (onNavigate) onNavigate(target);\n else if (typeof window !== \"undefined\") window.location.assign(target);\n }\n };\n const seen = (n: NotificationRow) => n.seenAt != null || state.clearedIds.includes(n.id);\n\n return (\n <div class=\"bas-bell\">\n <button\n type=\"button\"\n ref={bellRef}\n class=\"bas-iconbtn\"\n data-testid=\"topbar-notifications\"\n aria-label={t.notifications}\n aria-expanded={state.open}\n onClick={(e: JSX.TargetedMouseEvent<HTMLButtonElement>) => {\n const r = e.currentTarget.getBoundingClientRect();\n void shell.toggle({ top: r.top, right: r.right, bottom: r.bottom, left: r.left, width: r.width, height: r.height } as never);\n }}\n >\n <IconBell />\n {label ? (\n <span class=\"bas-bell__count\" data-testid=\"topbar-notifications-count\">\n {label}\n </span>\n ) : null}\n </button>\n {state.open ? (\n <>\n <div class={\"bas-overlay\" + (mobile ? \" is-dim\" : \"\")} data-testid=\"notifications-backdrop\" onClick={() => shell.close()} />\n <div\n ref={panelRef}\n class={\"bas-panel \" + (mobile ? \"bas-panel--sheet\" : \"bas-panel--drop\")}\n role=\"dialog\"\n aria-label={shell.labels.panel}\n data-testid={mobile ? \"notifications-drawer\" : \"notifications-dropdown\"}\n >\n <div class=\"bas-panel__head\">\n <h3>{t.notifications}</h3>\n <button type=\"button\" class=\"bas-link\" data-testid=\"notifications-mark-all\" onClick={() => void onMarkAll()} disabled={!state.count}>\n {shell.labels.markAll}\n </button>\n </div>\n {markAllFailed ? (\n <p class=\"bas-panel__note is-error\" role=\"alert\" data-testid=\"notifications-mark-all-error\">\n {t.couldNotMarkAll}\n </p>\n ) : null}\n <div class=\"bas-panel__list\" data-testid=\"notifications-list\">\n {error && state.rows.length === 0 ? (\n <p class=\"bas-panel__note is-error\" data-testid=\"notifications-error\">\n {t.couldNotLoad}\n </p>\n ) : state.rows.length === 0 ? (\n <p class=\"bas-panel__note\" data-testid=\"notifications-empty\">\n {shell.labels.empty}\n </p>\n ) : (\n state.rows.map((n) => (\n <button\n type=\"button\"\n key={n.id}\n class={\"bas-note\" + (seen(n) ? \" is-read\" : \"\")}\n data-testid=\"notification-row\"\n data-id={n.id}\n onClick={() => void onRow(n)}\n >\n <span class=\"bas-note__text\">\n <span class=\"bas-note__title\">{n.title}</span>\n {n.body ? <span class=\"bas-note__body\">{n.body}</span> : null}\n <span class=\"bas-note__time\">{relativeTime(n.createdAt, lang)}</span>\n </span>\n {!seen(n) ? <span class=\"bas-note__dot\" /> : null}\n </button>\n ))\n )}\n </div>\n </div>\n </>\n ) : null}\n </div>\n );\n}\n\n// ── User menu ──────────────────────────────────────────────────────────────\n\nexport interface ShellUser {\n name?: string;\n email?: string;\n /** Broberg ID OIDC `picture`. Without it: initials. Never Gravatar (D-1dc849). */\n picture?: string;\n /** F092.15 — a line under the name, e.g. «Administrator · Enhed Nord». */\n subtitle?: string;\n /** F092.27 — the organisation, e.g. «broberg.ai». Shown ONLY in the menu's top, with a building icon. */\n org?: string;\n}\nexport interface UserMenuItem {\n id: string;\n label: string;\n icon?: Icon;\n href?: string;\n onSelect?: () => void;\n /** F092.15 — right-aligned hint, e.g. a shortcut «⌘K». The app owns the shortcut itself. */\n hint?: string;\n}\n/** F092.15 — a radio group in the user menu (organisation, unit, area …). The app owns the choice. */\nexport interface UserMenuSection {\n id: string;\n label: string;\n items: { id: string; label: string; hint?: string; checked?: boolean }[];\n}\nexport interface UserMenuProps {\n user: ShellUser;\n /** «Konto» → Broberg ID's account page. */\n accountHref?: string;\n items?: UserMenuItem[];\n onSignOut?: () => void | Promise<void>;\n onNavigate?: Navigate;\n /**\n * Show Theme · Palette · Surfaces. Default true; false hides the block.\n * F001.23 — the Backdrop row (Neurons · Plain) is opt-in: pass\n * `{ backdrop: true }`. Only apps that draw the neuron canvas\n * (mountConstellation — trail, cardmem) have anything for it to switch.\n */\n appearance?: boolean | { backdrop?: boolean };\n /**\n * F092.11 — a «Sprog»/«Language» row with a segmented control, like the\n * appearance rows. The app owns the language; the shell shows and reports it.\n */\n language?: { value: string; options: { id: string; label: string }[]; onChange: (id: string) => void };\n /** F092.15 — radio groups shown after your items; a pick calls onSectionSelect and closes the menu. */\n sections?: UserMenuSection[];\n onSectionSelect?: (sectionId: string, itemId: string) => void;\n /** F092.15 — a «Zoom» row: − / value % / +. The app owns the value (percent). */\n zoom?: { value: number; onChange: (value: number) => void; min?: number; max?: number; step?: number };\n /** F092.15 — where the shell put the menu. \"sidebar-footer\" opens upward. Set by AppShell. */\n placement?: \"topbar\" | \"sidebar-footer\";\n lang: Lang;\n}\n\nexport function Avatar({ user, size = 28 }: { user: ShellUser; size?: number }) {\n const [broken, setBroken] = useState(false);\n const style = `width:${size}px;height:${size}px;font-size:${Math.round(size * 0.4)}px`;\n if (user.picture && !broken) {\n return <img class=\"bas-avatar\" style={style} src={user.picture} alt=\"\" referrerpolicy=\"no-referrer\" onError={() => setBroken(true)} data-testid=\"avatar-picture\" />;\n }\n return (\n <span class=\"bas-avatar bas-avatar--initials\" style={style} data-testid=\"avatar-initials\" aria-hidden=\"true\">\n {initials(user.name, user.email)}\n </span>\n );\n}\n\nfunction Segmented<T extends string>(props: { testid: string; value: T; options: readonly (readonly [T, string])[]; onChange: (v: T) => void; label?: string }) {\n // Arrow keys move between the options (D-4cd764); Enter/Space are the native\n // button's own, so choosing needs nothing extra.\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== \"ArrowLeft\" && e.key !== \"ArrowRight\") return;\n const buttons = [...(e.currentTarget as HTMLElement).querySelectorAll(\"button\")];\n const i = buttons.indexOf(document.activeElement as HTMLButtonElement);\n if (i < 0) return;\n e.preventDefault();\n const next = (i + (e.key === \"ArrowRight\" ? 1 : -1) + buttons.length) % buttons.length;\n buttons[next]!.focus();\n };\n return (\n <div class=\"bas-seg\" data-testid={props.testid} role=\"group\" aria-label={props.label} onKeyDown={onKeyDown}>\n {props.options.map(([v, label]) => (\n <button type=\"button\" key={v} aria-pressed={props.value === v} data-testid={`${props.testid}-${v}`} onClick={() => props.onChange(v)}>\n {label}\n </button>\n ))}\n </div>\n );\n}\n\n/**\n * F001.23 — a custom dropdown for a one-of-many choice (D-4cd764: no native\n * <select>). Focus stays on the button; the highlighted option is announced\n * via aria-activedescendant. Keys come from @broberg/ui-controls-core's\n * selectKeyReducer: arrows open/move, Enter/Space choose, Escape closes without\n * choosing — and does not close the menu around it.\n */\nfunction Dropdown<T extends string>(props: { testid: string; value: T; options: readonly (readonly [T, string])[]; onChange: (v: T) => void; label?: string }) {\n const [state, setState] = useState<SelectState>({ open: false, highlighted: -1 });\n // F001.25 — the list is a POPOVER: position:fixed from the button's rect, so\n // the menu neither grows nor clips it (the menu has overflow hidden/auto).\n // Below the button, right-aligned; upward when there is no room; clamped to\n // the viewport. Closes on scroll/resize rather than drifting off its button.\n const btnRef = useRef<HTMLButtonElement>(null);\n const listRef = useRef<HTMLUListElement>(null);\n const [pos, setPos] = useState<Record<string, string> | undefined>(undefined);\n useLayoutEffect(() => {\n if (!state.open || !btnRef.current) return setPos(undefined);\n const r = btnRef.current.getBoundingClientRect();\n const vw = window.innerWidth, vh = window.innerHeight, m = 8;\n const h = listRef.current?.offsetHeight ?? 0;\n const width = Math.min(Math.max(r.width, 160), vw - 2 * m);\n const left = Math.max(m, Math.min(r.right - width, vw - width - m));\n const below = r.bottom + 4;\n const top = below + h <= vh - m || r.top - 4 - h < m ? Math.min(below, vh - m - h) : r.top - 4 - h;\n setPos({ position: \"fixed\", left: `${left}px`, top: `${Math.max(m, top)}px`, width: `${width}px` });\n }, [state.open]);\n useEffect(() => {\n if (!state.open) return;\n const close = (e: Event) => {\n if (e.target instanceof Node && listRef.current?.contains(e.target)) return; // scrolling the list itself\n setState((st) => ({ ...st, open: false }));\n };\n window.addEventListener(\"scroll\", close, true);\n window.addEventListener(\"resize\", close);\n return () => {\n window.removeEventListener(\"scroll\", close, true);\n window.removeEventListener(\"resize\", close);\n };\n }, [state.open]);\n const current = Math.max(0, props.options.findIndex(([v]) => v === props.value));\n const choose = (i: number) => {\n setState({ open: false, highlighted: i });\n props.onChange(props.options[i]![0]);\n };\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Tab\") return setState((st) => ({ ...st, open: false }));\n const from = state.open ? state : { open: false, highlighted: current };\n const { state: next, intent } = selectKeyReducer(from, e.key, props.options.length);\n if (intent.type === \"none\" && next === from) return;\n e.preventDefault();\n if (state.open || intent.type !== \"close\") e.stopPropagation();\n if (intent.type === \"select\") return choose(intent.index);\n setState(next);\n };\n const optId = (v: string) => `${props.testid}-opt-${v}`;\n return (\n <div class=\"bas-dd\" onFocusOut={(e) => !(e.currentTarget as HTMLElement).contains(e.relatedTarget as Node) && setState((st) => ({ ...st, open: false }))}>\n <button\n ref={btnRef}\n type=\"button\"\n class=\"bas-dd__btn\"\n data-testid={props.testid}\n aria-haspopup=\"listbox\"\n aria-expanded={state.open}\n aria-label={props.label}\n aria-activedescendant={state.open && state.highlighted >= 0 ? optId(props.options[state.highlighted]![0]) : undefined}\n onClick={() => setState((st) => ({ open: !st.open, highlighted: current }))}\n onKeyDown={onKeyDown}\n >\n <span>{props.options[current]?.[1]}</span>\n <span class=\"bas-dd__caret\" aria-hidden=\"true\">▾</span>\n </button>\n {state.open ? (\n <ul ref={listRef} class=\"bas-dd__list\" style={pos ?? { position: \"fixed\", visibility: \"hidden\" }} role=\"listbox\" aria-label={props.label} data-testid={`${props.testid}-list`}>\n {props.options.map(([v, label], i) => (\n <li\n key={v}\n id={optId(v)}\n role=\"option\"\n aria-selected={props.value === v}\n class={\"bas-dd__opt\" + (i === state.highlighted ? \" is-active\" : \"\")}\n data-testid={`${props.testid}-${v}`}\n onMouseDown={(e) => e.preventDefault()}\n onMouseEnter={() => setState((st) => ({ ...st, highlighted: i }))}\n onClick={() => choose(i)}\n >\n <span class=\"bas-mi__check\" aria-hidden=\"true\">{props.value === v ? \"✓\" : \"\"}</span>\n {label}\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n}\n\nexport function UserMenu(p: UserMenuProps) {\n const t = TEXT[p.lang];\n const [open, setOpen] = useState(false);\n const [busy, setBusy] = useState(false);\n const root = useRef<HTMLDivElement>(null);\n const [pref, setPref] = useState<ThemePreference>(() => getPreference());\n const [palette, setPal] = useState<Palette>(() => getPalette());\n const [surfaces, setSurf] = useState<Surfaces>(() => getSurfaces());\n const [backdrop, setBack] = useState<Backdrop>(() => getBackdrop());\n\n useEffect(() => {\n const offs = [\n onThemeChange(() => setPref(getPreference())),\n onPaletteChange(setPal),\n onSurfacesChange(setSurf),\n onBackdropChange(setBack),\n ];\n return () => offs.forEach((off) => off());\n }, []);\n\n useEffect(() => {\n if (!open) return;\n const onDown = (e: MouseEvent) => {\n if (root.current && !root.current.contains(e.target as Node)) setOpen(false);\n };\n const onKey = (e: KeyboardEvent) => e.key === \"Escape\" && setOpen(false);\n document.addEventListener(\"mousedown\", onDown);\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"mousedown\", onDown);\n document.removeEventListener(\"keydown\", onKey);\n };\n }, [open]);\n\n const firstName = (p.user.name ?? \"\").trim().split(/\\s+/)[0] || p.user.email || \"\";\n const signOut = async () => {\n setBusy(true);\n try {\n await p.onSignOut?.();\n } finally {\n setBusy(false);\n setOpen(false);\n }\n };\n\n const inSidebar = p.placement === \"sidebar-footer\";\n // F092.15 — in the sidebar the panel is position:fixed at the button: the\n // sidebar clips its overflow, and an absolute 320px panel inside a 240px column\n // was cut off at the column's edge (Lens 200c1950: hint, theme rows and zoom\n // hidden). Fixed escapes the clip; a phone gets the full width minus a gutter.\n const btn = useRef<HTMLButtonElement>(null);\n const [upPos, setUpPos] = useState<Record<string, string> | undefined>(undefined);\n useLayoutEffect(() => {\n if (!open || !inSidebar || !btn.current) return;\n const r = btn.current.getBoundingClientRect();\n const vw = window.innerWidth, vh = window.innerHeight;\n const railed = !!btn.current.closest(\".is-railed\");\n const width = Math.min(320, vw - 16);\n const left = railed ? r.right + 8 : Math.max(8, Math.min(r.left, vw - width - 8));\n const bottom = railed ? Math.max(8, vh - r.bottom) : vh - r.top + 8;\n setUpPos({ position: \"fixed\", left: `${left}px`, bottom: `${bottom}px`, width: `${width}px`, maxHeight: `${vh - bottom - 8}px` });\n }, [open, inSidebar]);\n const zoom = p.zoom;\n const zMin = zoom?.min ?? 50, zMax = zoom?.max ?? 200, zStep = zoom?.step ?? 10;\n return (\n <div class={\"bas-usermenu\" + (inSidebar ? \" is-sidebar\" : \"\")} ref={root}>\n <button\n ref={btn}\n type=\"button\"\n class={\"bas-userbtn\" + (open ? \" is-open\" : \"\") + (inSidebar ? \" is-sidebar\" : \"\")}\n data-testid={inSidebar ? \"sidebar-user-menu\" : \"topbar-user-menu\"}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-label={p.user.email ?? p.user.name ?? t.account}\n onClick={() => setOpen((v) => !v)}\n >\n <Avatar user={p.user} size={inSidebar ? 32 : 28} />\n {inSidebar ? (\n <span class=\"bas-userbtn__text\">\n <span class=\"bas-userbtn__name\">{p.user.name ?? firstName}</span>\n {p.user.subtitle ? <span class=\"bas-userbtn__sub\" data-testid=\"sidebar-user-subtitle\">{p.user.subtitle}</span> : null}\n </span>\n ) : (\n <span class=\"bas-userbtn__name\">{firstName}</span>\n )}\n </button>\n {open ? (\n <div class={\"bas-menu\" + (inSidebar ? \" is-up\" : \"\")} style={inSidebar ? upPos : undefined} role=\"menu\" data-testid=\"topbar-user-menu-dropdown\">\n <div class=\"bas-menu__who\">\n <Avatar user={p.user} size={36} />\n <div class=\"bas-menu__whotext\">\n {p.user.name ? <div class=\"bas-menu__name\">{p.user.name}</div> : null}\n {p.user.subtitle ? <div class=\"bas-menu__sub\">{p.user.subtitle}</div> : null}\n {p.user.email ? <div class=\"bas-menu__email\">{p.user.email}</div> : null}\n {p.user.org ? (\n <div class=\"bas-menu__org\" data-testid=\"user-menu-org\">\n <IconBuilding />\n <span>{p.user.org}</span>\n </div>\n ) : null}\n </div>\n </div>\n <div class=\"bas-sep\" />\n {p.accountHref ? (\n <NavLink href={p.accountHref} onNavigate={p.onNavigate} onAfter={() => setOpen(false)} class=\"bas-mi\" data-testid=\"user-menu-account\" role=\"menuitem\">\n <IconUser />\n <span>{t.account}</span>\n </NavLink>\n ) : null}\n {(p.items ?? []).map((it) =>\n it.href ? (\n <NavLink key={it.id} href={it.href} onNavigate={p.onNavigate} onAfter={() => setOpen(false)} class=\"bas-mi\" data-testid={`user-menu-${it.id}`}>\n {it.icon ?? null}\n <span>{it.label}</span>\n {it.hint ? <span class=\"bas-mi__hint\">{it.hint}</span> : null}\n </NavLink>\n ) : (\n <button\n key={it.id}\n type=\"button\"\n class=\"bas-mi\"\n role=\"menuitem\"\n data-testid={`user-menu-${it.id}`}\n onClick={() => {\n setOpen(false);\n it.onSelect?.();\n }}\n >\n {it.icon ?? null}\n <span>{it.label}</span>\n {it.hint ? <span class=\"bas-mi__hint\">{it.hint}</span> : null}\n </button>\n ),\n )}\n {(p.sections ?? []).map((sec) => (\n <div class=\"bas-menu__section\" role=\"group\" aria-label={sec.label} key={sec.id} data-testid={`user-menu-section-${sec.id}`}>\n <div class=\"bas-sep\" />\n <div class=\"bas-menu__label\">{sec.label}</div>\n {sec.items.map((it) => (\n <button\n key={it.id}\n type=\"button\"\n class={\"bas-mi\" + (it.checked ? \" is-checked\" : \"\")}\n role=\"menuitemradio\"\n aria-checked={it.checked ? \"true\" : \"false\"}\n data-testid={`user-menu-section-${sec.id}-${it.id}`}\n onClick={() => {\n setOpen(false);\n p.onSectionSelect?.(sec.id, it.id);\n }}\n >\n <span class=\"bas-mi__check\" aria-hidden=\"true\">{it.checked ? \"✓\" : \"\"}</span>\n <span>{it.label}</span>\n {it.hint ? <span class=\"bas-mi__hint\">{it.hint}</span> : null}\n </button>\n ))}\n </div>\n ))}\n {p.appearance !== false ? (\n <>\n <div class=\"bas-sep\" />\n <div class=\"bas-prefs\">\n <div class=\"bas-pref\">\n <span>{t.theme}</span>\n <Segmented\n testid=\"user-menu-theme\"\n value={pref as \"light\" | \"dark\" | \"system\"}\n options={[[\"light\", t.light], [\"dark\", t.dark], [\"system\", t.system]] as const}\n onChange={(v) => {\n setPreference(v);\n setPref(v);\n }}\n />\n </div>\n <div class=\"bas-pref\">\n <span>{t.palette}</span>\n <Dropdown testid=\"user-menu-palette\" label={t.palette} value={palette} options={PALETTES.map((x) => [x, PALETTE_LABELS[x]] as const)} onChange={setPalette} />\n </div>\n <div class=\"bas-pref\">\n <span>{t.surfaces}</span>\n <Segmented testid=\"user-menu-surfaces\" value={surfaces} options={[[\"flat\", t.flat], [\"layered\", t.layered]] as const} onChange={setSurfaces} />\n </div>\n {typeof p.appearance === \"object\" && p.appearance.backdrop ? (\n <div class=\"bas-pref\">\n <span>{t.backdrop}</span>\n <Segmented testid=\"user-menu-backdrop\" value={backdrop} options={[[\"neurons\", t.neurons], [\"plain\", t.plain]] as const} onChange={setBackdrop} />\n </div>\n ) : null}\n </div>\n </>\n ) : null}\n {p.language ? (\n <>\n {p.appearance === false ? <div class=\"bas-sep\" /> : null}\n <div class=\"bas-prefs\">\n <div class=\"bas-pref\">\n <span>{t.language}</span>\n <Segmented\n testid=\"user-menu-language\"\n label={t.language}\n value={p.language.value}\n options={p.language.options.map((o) => [o.id, o.label] as const)}\n onChange={p.language.onChange}\n />\n </div>\n </div>\n </>\n ) : null}\n {zoom ? (\n <>\n {p.appearance === false && !p.language ? <div class=\"bas-sep\" /> : null}\n <div class=\"bas-prefs\">\n <div class=\"bas-pref\">\n <span>{t.zoom}</span>\n <div class=\"bas-zoom\" role=\"group\" aria-label={t.zoom}>\n <button type=\"button\" class=\"bas-zoom__btn\" data-testid=\"user-menu-zoom-out\" aria-label={t.zoomOut}\n disabled={zoom.value - zStep < zMin} onClick={() => zoom.onChange(Math.max(zMin, zoom.value - zStep))}>−</button>\n <span class=\"bas-zoom__value\" data-testid=\"user-menu-zoom-value\">{zoom.value} %</span>\n <button type=\"button\" class=\"bas-zoom__btn\" data-testid=\"user-menu-zoom-in\" aria-label={t.zoomIn}\n disabled={zoom.value + zStep > zMax} onClick={() => zoom.onChange(Math.min(zMax, zoom.value + zStep))}>+</button>\n </div>\n </div>\n </div>\n </>\n ) : null}\n {p.onSignOut ? (\n // F092.34 — its own block, so the sidebar menu can pin it to the bottom while the middle scrolls.\n <div class=\"bas-menu__foot\">\n <div class=\"bas-sep\" />\n <button type=\"button\" class=\"bas-mi is-danger\" role=\"menuitem\" data-testid=\"topbar-sign-out\" disabled={busy} onClick={() => void signOut()}>\n <IconLogOut />\n <span>{t.signOut}</span>\n </button>\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\n// ── Top bar ────────────────────────────────────────────────────────────────\n\nexport interface TopBarProps {\n /** F092.7 — when set, the brand is a link to the app's start page. */\n homeHref?: string;\n /** Called after the brand link was followed (AppShell closes the drawer). */\n onHome?: () => void;\n brand?: ComponentChildren;\n /** Anything app-specific (project switcher, search) between brand and bell. */\n actions?: ComponentChildren;\n /** Drawer mode on a phone: show the hamburger and call this. */\n onOpenMenu?: () => void;\n notifications?: NotificationSource;\n user?: ShellUser;\n userMenu?: Omit<UserMenuProps, \"user\" | \"lang\" | \"onNavigate\">;\n onNavigate?: Navigate;\n lang: Lang;\n}\n\n/** Brand left, actions, then the notification bell and the user menu ALWAYS last, in that order. */\nexport function TopBar(p: TopBarProps) {\n const t = TEXT[p.lang];\n return (\n <header class=\"bas-topbar\" data-testid=\"topbar-root\">\n <div class=\"bas-topbar__inner\">\n {p.onOpenMenu ? (\n <button type=\"button\" class=\"bas-iconbtn bas-hamburger\" data-testid=\"sidebar-toggle\" aria-label={t.openMenu} onClick={p.onOpenMenu}>\n <IconMenu />\n </button>\n ) : null}\n {p.brand ? (\n <div class=\"bas-topbar__brand\">\n {p.homeHref ? (\n <NavLink href={p.homeHref} onNavigate={p.onNavigate} onAfter={p.onHome} class=\"bas-home\" data-testid=\"brand-home\">\n {p.brand}\n </NavLink>\n ) : (\n p.brand\n )}\n </div>\n ) : null}\n {p.actions ? <div class=\"bas-topbar__actions\">{p.actions}</div> : null}\n <div class=\"bas-spacer\" />\n <NotificationBell source={p.notifications} onNavigate={p.onNavigate} lang={p.lang} />\n {p.user ? <UserMenu user={p.user} {...p.userMenu} onNavigate={p.onNavigate} lang={p.lang} /> : null}\n </div>\n </header>\n );\n}\n\n// ── Page header + tabs ─────────────────────────────────────────────────────\n\n/**\n * Optional `title` (0.2.1): inside AppShell the page title already sits in the\n * content header, so a page can use PageHeader for its description and actions\n * alone — no second, and no empty, <h1>.\n */\nexport function PageHeader(p: { eyebrow?: ComponentChildren; title?: ComponentChildren; description?: ComponentChildren; actions?: ComponentChildren }) {\n return (\n <div class=\"bas-pagehead\" data-testid=\"page-header\">\n <div class=\"bas-pagehead__text\">\n {p.eyebrow ? <div class=\"bas-pagehead__eyebrow\">{p.eyebrow}</div> : null}\n {p.title != null && p.title !== \"\" ? <h1 class=\"bas-pagehead__title\">{p.title}</h1> : null}\n {p.description ? <p class=\"bas-pagehead__desc\">{p.description}</p> : null}\n </div>\n {p.actions ? <div class=\"bas-pagehead__actions\">{p.actions}</div> : null}\n </div>\n );\n}\n\nexport interface PageTab {\n id: string;\n label: ComponentChildren;\n /** Path mode: the tab's own route. Query mode: ignored (?tab=id is used). */\n href?: string;\n}\n\n/**\n * Tabs as routes. `mode: \"query\"` puts the tab in `?tab=<id>` on the current\n * path (first tab when absent); `mode: \"path\"` gives each tab its own href.\n */\nexport function PageTabs(p: { tabs: PageTab[]; currentUrl: string; mode?: \"query\" | \"path\"; onNavigate?: Navigate }) {\n const mode = p.mode ?? \"query\";\n const url = new URL(p.currentUrl, \"http://x\");\n const activeId =\n mode === \"query\"\n ? url.searchParams.get(\"tab\") ?? p.tabs[0]?.id\n : p.tabs.find((tab) => tab.href && isActivePath(tab.href, url.pathname))?.id;\n return (\n <div class=\"bas-tabs\" role=\"tablist\" data-testid=\"page-tabs\">\n {p.tabs.map((tab) => {\n let href = tab.href ?? \"\";\n if (mode === \"query\") {\n const u = new URL(url.toString());\n u.searchParams.set(\"tab\", tab.id);\n href = u.pathname + u.search;\n }\n const active = tab.id === activeId;\n return (\n <NavLink key={tab.id} href={href} onNavigate={p.onNavigate} class={\"bas-tab\" + (active ? \" is-active\" : \"\")} data-testid={`page-tab-${tab.id}`} aria-current={active ? \"page\" : undefined}>\n {tab.label}\n </NavLink>\n );\n })}\n </div>\n );\n}\n\n// ── App shell ──────────────────────────────────────────────────────────────\n\nexport interface AppShellProps {\n /**\n * F092.24 — the app's default text size: 1 = as designed, 1.2 = every shell text\n * 20 % larger. Sets --bas-font-scale on the root. The APP's choice; the user's own\n * Zoom (userMenu.zoom) is separate and applies on top.\n */\n fontScale?: number;\n /** F092.21 — passed to the sidebar: a row action was chosen. */\n onItemAction?: SidebarProps[\"onItemAction\"];\n brand?: ComponentChildren;\n actions?: ComponentChildren;\n groups: PreactNavGroup[];\n footer?: PreactNavItem[];\n currentPath: string;\n onNavigate?: Navigate;\n /** The notification centre's source. The bell is shown either way. */\n notifications?: NotificationSource;\n user?: ShellUser;\n userMenu?: Omit<UserMenuProps, \"user\" | \"lang\" | \"onNavigate\" | \"placement\">;\n /**\n * F092.15 — where the user menu sits. \"topbar\" (default): the content's top row\n * (or the full-width bar). \"sidebar-footer\": the bottom of the sidebar, opening upward.\n */\n userMenuPlacement?: \"topbar\" | \"sidebar-footer\";\n /** Phone behaviour: a slide-in drawer, or a 60px icon rail. */\n mobile?: \"drawer\" | \"rail\";\n /**\n * F092.6 — desktop fold: \"offcanvas\" hides the sidebar, \"icon\" keeps a 48px\n * icon rail with `brandMark` on top. Default: \"icon\" when `mobile` is \"rail\".\n */\n collapse?: \"offcanvas\" | \"icon\";\n /** The app's logo icon for the top of the icon rail. */\n brandMark?: ComponentChildren;\n /**\n * F092.8 — \"inset\" (default, shadcn dashboard-01): no full-width top bar; the\n * brand heads the sidebar, and the content's top row is sidebar button ·\n * title · actions · bell · user menu. \"topbar\": the 0.2.x full-width bar.\n */\n layout?: \"inset\" | \"topbar\";\n /** F092.7 — the app's start page. Brand and brandMark become links to it; on a phone the click closes the drawer. */\n homeHref?: string;\n /** Accessible name for the brandMark link. Default \"Forside\"/\"Home\". */\n homeLabel?: string;\n /**\n * F092.4 — the page title in the content header, after the sidebar button.\n * Absent: the label of the active nav item (a sub-item wins over its parent).\n */\n title?: ComponentChildren;\n /** localStorage key prefix for the folded sidebar, folded groups and open items. */\n storageKey?: string;\n /** Required: the shell ships no default language (see @broberg/notifications/shell). */\n lang: Lang;\n children?: ComponentChildren;\n}\n\nexport function AppShell(p: AppShellProps) {\n const prefix = p.storageKey ?? \"broberg-app-shell\";\n const mode = p.mobile ?? \"drawer\";\n const layout = p.layout ?? \"inset\";\n const inset = layout === \"inset\";\n const collapse = p.collapse ?? (mode === \"rail\" ? \"icon\" : \"offcanvas\");\n const [collapsed, setCollapsed] = useState(() => readFlag(`${prefix}.collapsed`, false));\n const [drawer, setDrawer] = useState(false);\n const isMobile = useIsMobile();\n const t = TEXT[p.lang];\n const toggle = () => {\n const next = !collapsed;\n setCollapsed(next);\n writeFlag(`${prefix}.collapsed`, next);\n };\n // F092.4 — ONE sidebar button: the drawer on a phone, the fold on desktop.\n const drawerMode = isMobile && mode === \"drawer\";\n const onTrigger = () => (drawerMode ? setDrawer(!drawer) : toggle());\n const expanded = drawerMode ? drawer : !collapsed;\n const triggerLabel = drawerMode ? (drawer ? t.closeMenu : t.openMenu) : collapsed ? t.expand : t.collapse;\n const heading = p.title ?? activeNavLabel(p.groups, p.footer, p.currentPath);\n const userInSidebar = p.userMenuPlacement === \"sidebar-footer\";\n const sidebarUser =\n userInSidebar && p.user ? (\n <UserMenu user={p.user} {...p.userMenu} placement=\"sidebar-footer\" onNavigate={p.onNavigate} lang={p.lang} />\n ) : null;\n return (\n <div\n class=\"bas-root\"\n data-testid=\"app-shell\"\n data-mobile={mode}\n data-layout={layout}\n style={p.fontScale !== undefined ? { \"--bas-font-scale\": String(p.fontScale) } : undefined}\n >\n {inset ? null : (\n <TopBar\n brand={p.brand}\n homeHref={p.homeHref}\n onHome={() => setDrawer(false)}\n actions={p.actions}\n notifications={p.notifications}\n user={userInSidebar ? undefined : p.user}\n userMenu={p.userMenu}\n onNavigate={p.onNavigate}\n lang={p.lang}\n />\n )}\n <div class=\"bas-row\">\n <Sidebar\n groups={p.groups}\n footer={p.footer}\n onItemAction={p.onItemAction}\n currentPath={p.currentPath}\n onNavigate={p.onNavigate}\n collapsed={collapsed}\n collapse={collapse}\n brandMark={p.brandMark}\n homeHref={p.homeHref}\n homeLabel={p.homeLabel}\n mobileOpen={drawer}\n onClose={() => setDrawer(false)}\n mobile={mode}\n header={inset || mode === \"drawer\" ? p.brand : undefined}\n brandTestId={inset ? \"brand-home\" : undefined}\n groupsKey={`${prefix}.groups`}\n itemsKey={`${prefix}.items`}\n bottom={sidebarUser}\n lang={p.lang}\n />\n <main class=\"bas-main\" data-testid=\"app-content\">\n <div class=\"bas-contenthead\" data-testid=\"content-header\">\n <button\n type=\"button\"\n class=\"bas-iconbtn bas-trigger\"\n data-testid=\"sidebar-trigger\"\n aria-label={triggerLabel}\n aria-expanded={expanded}\n title={triggerLabel}\n onClick={onTrigger}\n >\n <IconPanelLeft />\n </button>\n {heading ? (\n <>\n <span class=\"bas-contenthead__sep\" data-testid=\"content-header-separator\" aria-hidden=\"true\" />\n <h1 class=\"bas-contenthead__title\" data-testid=\"content-header-title\">\n {heading}\n </h1>\n </>\n ) : null}\n {inset ? (\n <>\n <div class=\"bas-spacer\" />\n {p.actions ? <div class=\"bas-contenthead__actions\">{p.actions}</div> : null}\n <NotificationBell source={p.notifications} onNavigate={p.onNavigate} lang={p.lang} />\n {p.user && !userInSidebar ? <UserMenu user={p.user} {...p.userMenu} onNavigate={p.onNavigate} lang={p.lang} /> : null}\n </>\n ) : null}\n </div>\n {p.children}\n </main>\n </div>\n </div>\n );\n}\n\n// ── Account page (F095.3) ──────────────────────────────────────────────────\n\nexport interface AccountPageProps {\n lang: Lang;\n /** Default: `createFetchAccountAdapter()` → /api/account/profile* (@broberg/sso accountRoutes). */\n adapter?: AccountAdapter;\n /**\n * Where «Log ind igen» goes — a FULL page load, so the app's login flow runs.\n * Default `/auth/login?returnTo=<current path>` (no prompt=login — that forces\n * re-proof and is a redirect-loop trap, F084.108). Broberg ID issues\n * no refresh token, so about an hour after login every change answers 401\n * reauth: that is a normal state here, not an error.\n */\n reauthHref?: string;\n /**\n * F095.5 — called with the profile AS THE SERVER NOW HOLDS IT after every\n * successful change (name saved, picture uploaded, picture removed), so the\n * host can update the shell's user menu at once. Not called on load or on a\n * failed save.\n */\n onProfileChange?: (profile: AccountProfile) => void;\n}\n\n/** `/auth/login?returnTo=<this page>` — back here after signing in. */\nexport function defaultReauthHref(): string {\n const here = typeof location === \"undefined\" ? \"/\" : location.pathname + location.search;\n return `/auth/login?returnTo=${encodeURIComponent(here)}`;\n}\n\ntype Notice = { kind: \"ok\" | \"error\"; text: string } | null;\n\n/**\n * The user's own name and picture, edited inside the app (F095.3).\n *\n * EVERYTHING SHOWN AFTER A SAVE IS THE SERVER'S ANSWER, never what was typed\n * (CLAUDE.md «Et gem-felt SKAL bevises at gemme»): if Broberg ID trims or\n * changes the name, the field shows that. On a failed save the field keeps the\n * typed text, so nothing is lost and the error says why.\n */\nexport function AccountPage({ lang, adapter, reauthHref, onProfileChange }: AccountPageProps) {\n const t = TEXT[lang];\n const api = useMemo(() => adapter ?? createFetchAccountAdapter(), [adapter]);\n const [profile, setProfile] = useState<AccountProfile | null>(null);\n const [draft, setDraft] = useState(\"\");\n const [busy, setBusy] = useState<\"load\" | \"name\" | \"avatar\" | null>(\"load\");\n const [notice, setNotice] = useState<Notice>(null);\n const [reauth, setReauth] = useState(false);\n const [confirming, setConfirming] = useState(false);\n const fileRef = useRef<HTMLInputElement>(null);\n\n const apply = (p: AccountProfile) => {\n setProfile(p);\n setDraft(p.name ?? \"\");\n };\n const fail = (err: unknown, fallback: string) => {\n const kind = accountErrorKind(err);\n if (kind === \"reauth\") {\n setReauth(true);\n setNotice(null);\n return;\n }\n const text = kind === \"tooLarge\" ? t.pictureTooLarge : kind === \"wrongType\" ? t.pictureWrongType : fallback;\n setNotice({ kind: \"error\", text });\n };\n\n useEffect(() => {\n let live = true;\n setBusy(\"load\");\n api.load().then(\n (p) => live && (apply(p), setBusy(null)),\n (e) => live && (fail(e, t.couldNotLoadProfile), setBusy(null)),\n );\n return () => {\n live = false;\n };\n }, [api]);\n\n const run = async (what: \"name\" | \"avatar\", op: () => Promise<AccountProfile>, okText: string) => {\n setBusy(what);\n setNotice(null);\n try {\n const p = await op();\n apply(p);\n onProfileChange?.(p);\n setNotice({ kind: \"ok\", text: okText });\n } catch (e) {\n fail(e, t.couldNotSave);\n } finally {\n setBusy(null);\n }\n };\n\n const onSaveName = (e: Event) => {\n e.preventDefault();\n if (busy || reauth || unchanged) return;\n // A failed save leaves `draft` as typed: apply() runs only on success.\n void run(\"name\", () => api.saveName(draft), t.saved);\n };\n\n const onFile = (e: JSX.TargetedEvent<HTMLInputElement>) => {\n const input = e.currentTarget;\n const file = input.files?.[0];\n input.value = \"\"; // the same file can be chosen again after an error\n if (!file || busy || reauth) return;\n const bad = checkAvatarFile(file);\n if (bad) {\n setNotice({ kind: \"error\", text: bad === \"tooLarge\" ? t.pictureTooLarge : t.pictureWrongType });\n return;\n }\n void run(\"avatar\", () => api.uploadAvatar(file), t.pictureSaved);\n };\n\n const onRemove = () => {\n setConfirming(false);\n void run(\"avatar\", () => api.removeAvatar(), t.pictureRemoved);\n };\n\n const locked = reauth || busy !== null || profile === null;\n // Nothing to save until the name differs from what the server holds (trimmed:\n // BID trims, so a trailing space is not a change).\n const unchanged = draft.trim() === (profile?.name ?? \"\").trim();\n const user: ShellUser = { name: profile?.name ?? undefined, email: profile?.email ?? undefined, picture: profile?.picture ?? undefined };\n\n return (\n <section class=\"bas-account\" data-testid=\"account-page\" aria-busy={busy !== null}>\n {reauth ? (\n <div class=\"bas-account__note is-reauth\" role=\"alert\" data-testid=\"account-reauth\">\n <span data-testid=\"account-reauth-text\">{t.reauth}</span>\n <button\n type=\"button\"\n class=\"bas-account__btn is-primary\"\n onClick={() => window.location.assign(reauthHref ?? defaultReauthHref())}\n data-testid=\"account-reauth-signin\"\n >\n {t.signInAgain}\n </button>\n </div>\n ) : null}\n {notice ? (\n <p\n class={\"bas-account__note \" + (notice.kind === \"ok\" ? \"is-ok\" : \"is-error\")}\n role={notice.kind === \"ok\" ? \"status\" : \"alert\"}\n data-testid={notice.kind === \"ok\" ? \"account-ok\" : \"account-error\"}\n >\n {notice.text}\n </p>\n ) : null}\n {busy === \"load\" ? <p class=\"bas-account__muted\" data-testid=\"account-loading\">{t.loadingProfile}</p> : null}\n {profile ? (\n <>\n <div class=\"bas-account__who\">\n <span class=\"bas-account__avatar\" data-testid=\"account-avatar\" data-picture={profile.picture ?? \"\"}>\n <Avatar key={profile.picture ?? \"none\"} user={user} size={72} />\n </span>\n <div class=\"bas-account__whotext\">\n <div class=\"bas-account__name\" data-testid=\"account-name\">{profile.name ?? \"\"}</div>\n <div class=\"bas-account__email\" data-testid=\"account-email\">{profile.email ?? \"\"}</div>\n </div>\n </div>\n <div class=\"bas-account__row\">\n <input\n ref={fileRef}\n type=\"file\"\n accept={AVATAR_TYPES.join(\",\")}\n hidden\n tabIndex={-1}\n onChange={onFile}\n data-testid=\"account-avatar-file\"\n />\n <button type=\"button\" class=\"bas-account__btn\" disabled={locked} onClick={() => fileRef.current?.click()} data-testid=\"account-avatar-upload\">\n {busy === \"avatar\" ? t.saving : t.changePicture}\n </button>\n {profile.picture && !confirming ? (\n <button type=\"button\" class=\"bas-account__btn is-quiet\" disabled={locked} onClick={() => setConfirming(true)} data-testid=\"account-avatar-remove\">\n {t.removePicture}\n </button>\n ) : null}\n {profile.picture && confirming ? (\n <span class=\"bas-account__confirm\" role=\"group\" data-testid=\"account-avatar-remove-confirmation\">\n <span>{t.confirmRemovePicture}</span>\n <button type=\"button\" class=\"bas-account__btn is-danger\" disabled={locked} onClick={onRemove} data-testid=\"account-avatar-remove-confirm\">\n {t.remove}\n </button>\n <button type=\"button\" class=\"bas-account__btn is-quiet\" onClick={() => setConfirming(false)} data-testid=\"account-avatar-remove-cancel\">\n {t.cancel}\n </button>\n </span>\n ) : null}\n </div>\n <form class=\"bas-account__form\" onSubmit={onSaveName} data-testid=\"account-name-form\">\n <label class=\"bas-account__label\" for=\"bas-account-name\">{t.name}</label>\n <div class=\"bas-account__row\">\n <input\n id=\"bas-account-name\"\n class=\"bas-account__input\"\n type=\"text\"\n autocomplete=\"name\"\n value={draft}\n readOnly={reauth}\n aria-readonly={reauth}\n onInput={(e) => {\n setDraft(e.currentTarget.value);\n if (notice?.kind === \"ok\") setNotice(null);\n }}\n data-testid=\"account-name-input\"\n />\n <button type=\"submit\" class=\"bas-account__btn is-primary\" disabled={locked || unchanged} data-testid=\"account-name-save\">\n {busy === \"name\" ? t.saving : t.save}\n </button>\n </div>\n </form>\n {profile.account_url ? (\n <NavLink href={profile.account_url} class=\"bas-account__link\" data-testid=\"account-bid-link\">\n {t.bidSecurity}\n </NavLink>\n ) : null}\n </>\n ) : null}\n </section>\n );\n}\n\n// ── Analytics page (F097.1) ────────────────────────────────────────────────\n\nexport interface AnalyticsPageProps {\n lang: Lang;\n /** Default: `createFetchAnalyticsAdapter()` → GET /api/analytics?days=N (@upmetrics/sdk/hono analyticsRoutes). */\n adapter?: AnalyticsAdapter;\n /** The period buttons, in days. Default 7 / 30 / 90. */\n periods?: number[];\n /** The period shown first. Default 30 (or the first of `periods` when 30 is not one of them). */\n initialDays?: number;\n}\n\ntype AnalyticsLoad =\n | { state: \"loading\" }\n | { state: \"ok\"; days: number; data: AnalyticsData }\n | { state: \"error\"; reason: \"unconfigured\" | \"unavailable\" };\n\n/**\n * The app's own visitors, page views, page views per day and most visited\n * pages, from Upmetrics through the app's backend (F097.1). A backend that is\n * not set up or does not answer says so — it never shows zeros that would read\n * as a quiet month.\n */\nexport function AnalyticsPage({ lang, adapter, periods = [7, 30, 90], initialDays }: AnalyticsPageProps) {\n const t = TEXT[lang];\n const api = useMemo(() => adapter ?? createFetchAnalyticsAdapter(), [adapter]);\n const [days, setDays] = useState(initialDays ?? (periods.includes(30) ? 30 : periods[0]!));\n const [load, setLoad] = useState<AnalyticsLoad>({ state: \"loading\" });\n const locale = lang === \"da\" ? \"da-DK\" : \"en-GB\";\n const num = (n: number) => n.toLocaleString(locale);\n\n useEffect(() => {\n // A late answer for a period the user has already left is dropped.\n let live = true;\n setLoad({ state: \"loading\" });\n api.load(days).then(\n (data) => live && setLoad({ state: \"ok\", days, data }),\n (e) => live && setLoad({ state: \"error\", reason: analyticsErrorKind(e) }),\n );\n return () => {\n live = false;\n };\n }, [api, days]);\n\n return (\n <section class=\"bas-analytics\" data-testid=\"analytics-page\" aria-busy={load.state === \"loading\"}>\n <div class=\"bas-analytics__periods\" role=\"group\" aria-label={t.analyticsPeriod}>\n {periods.map((d) => (\n <button\n key={d}\n type=\"button\"\n class={\"bas-analytics__period\" + (d === days ? \" is-active\" : \"\")}\n aria-pressed={d === days}\n onClick={() => setDays(d)}\n data-testid={`analytics-period-${d}`}\n >\n {t.analyticsDays.replace(\"{n}\", String(d))}\n </button>\n ))}\n </div>\n\n {load.state === \"loading\" ? <p class=\"bas-analytics__muted\" data-testid=\"analytics-loading\">{t.analyticsLoading}</p> : null}\n {load.state === \"error\" ? (\n <p class=\"bas-analytics__note\" role=\"alert\" data-testid=\"analytics-error\" data-reason={load.reason}>\n {load.reason === \"unconfigured\" ? t.analyticsUnconfigured : t.analyticsUnavailable}\n </p>\n ) : null}\n {load.state === \"ok\" ? (\n <>\n <div class=\"bas-analytics__tiles\">\n {([\"visitors\", \"pageviews\"] as const).map((k) => {\n const c = changePct(load.data.totals[k], load.data.prev[k]);\n return (\n <div key={k} class=\"bas-analytics__tile\" data-testid={`analytics-${k}`}>\n <div class=\"bas-analytics__label\">{k === \"visitors\" ? t.analyticsVisitors : t.analyticsPageviews}</div>\n <div class=\"bas-analytics__value\" data-testid={`analytics-${k}-value`}>{num(load.data.totals[k])}</div>\n <div class=\"bas-analytics__muted\" data-testid={`analytics-${k}-change`}>\n {c === null ? t.analyticsNoPrev : t.analyticsVsPrev.replace(\"{pct}\", `${c > 0 ? \"+\" : \"\"}${c}`)}\n </div>\n </div>\n );\n })}\n </div>\n <AnalyticsSeries data={fillDays(load.data.series, load.days)} t={t} locale={locale} num={num} />\n <div class=\"bas-analytics__card\" data-testid=\"analytics-top-pages\">\n <h2 class=\"bas-analytics__h\">{t.analyticsTopPages}</h2>\n {load.data.topPages.length === 0 ? (\n <p class=\"bas-analytics__muted\" data-testid=\"analytics-top-pages-empty\">{t.analyticsEmpty}</p>\n ) : (\n <ol class=\"bas-analytics__pages\">\n {load.data.topPages.map((p) => (\n <li key={p.value} class=\"bas-analytics__page\">\n <span class=\"bas-analytics__path\" title={p.value}>{p.value}</span>\n <span class=\"bas-analytics__count\">{num(p.count)}</span>\n </li>\n ))}\n </ol>\n )}\n </div>\n </>\n ) : null}\n </section>\n );\n}\n\n/** \"2026-10-06\" → \"6. okt.\" — the key is a calendar date, so it is formatted as one (UTC, no shift). */\nfunction dayLabel(day: string, locale: string): string {\n return new Date(`${day}T12:00:00Z`).toLocaleDateString(locale, { day: \"numeric\", month: \"short\", timeZone: \"UTC\" });\n}\n\nfunction AnalyticsSeries({ data, t, locale, num }: { data: AnalyticsDay[]; t: (typeof TEXT)[Lang]; locale: string; num: (n: number) => string }) {\n const max = Math.max(1, ...data.map((d) => d.pageviews));\n const empty = data.every((d) => d.pageviews === 0);\n return (\n <div class=\"bas-analytics__card\" data-testid=\"analytics-series\">\n <h2 class=\"bas-analytics__h\">{t.analyticsOverTime}</h2>\n {empty ? (\n <p class=\"bas-analytics__muted\" data-testid=\"analytics-series-empty\">{t.analyticsEmpty}</p>\n ) : (\n <>\n <div class=\"bas-analytics__bars\" aria-hidden=\"true\">\n {data.map((d) => (\n <div key={d.day} class=\"bas-analytics__col\" title={`${dayLabel(d.day, locale)}: ${num(d.pageviews)}`} data-day={d.day}>\n <div class=\"bas-analytics__bar\" style={{ height: d.pageviews === 0 ? \"0\" : `max(2px, ${(d.pageviews / max) * 100}%)` }} />\n </div>\n ))}\n </div>\n <div class=\"bas-analytics__axis\" aria-hidden=\"true\">\n <span>{dayLabel(data[0]!.day, locale)}</span>\n <span>{dayLabel(data[data.length - 1]!.day, locale)}</span>\n </div>\n {/* The same numbers as a table, for a screen reader (the bars are decoration for it). */}\n <table class=\"bas-analytics__sr\" data-testid=\"analytics-series-table\">\n <caption>{t.analyticsOverTime}</caption>\n <thead>\n <tr>\n <th scope=\"col\">{t.analyticsDay}</th>\n <th scope=\"col\">{t.analyticsPageviews}</th>\n </tr>\n </thead>\n <tbody>\n {data.map((d) => (\n <tr key={d.day}>\n <td>{dayLabel(d.day, locale)}</td>\n <td>{num(d.pageviews)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </>\n )}\n </div>\n );\n}\n\n// ── Tenant switcher (F029.10) ──────────────────────────────────────────────\n\nexport interface TenantSwitcherProps {\n lang: Lang;\n /** The slug the app is in right now — the app knows it (from tenantMiddleware). */\n activeSlug: string;\n /** Default: `createFetchTenantAdapter()` → GET /api/me/memberships (@broberg/tenant/hono tenantRoutes). */\n adapter?: TenantAdapter;\n /**\n * Switch through the APP's own route — navigate to `/t/<slug>/…`, or set the\n * preference and reload. A rejection keeps the current organisation and shows\n * why; the switcher never pretends a switch happened.\n */\n onSwitch: (slug: string) => Promise<void> | void;\n /**\n * The role in the user's own words («Medarbejder», «Administrator»). Roles\n * are the app's vocabulary, so the switcher cannot translate them. Without\n * it no role is shown — a raw «member» in a Danish UI is worse than nothing.\n */\n roleLabel?: (role: string) => string;\n}\n\n/** Space kept between a popover and the screen edge. */\nconst EDGE = 16;\n\n/**\n * The user's own organisations, the active one marked, and a switch. Only the\n * memberships the backend returns are listed — never a typed or guessed slug.\n * With one organisation it is a plain label, not a menu.\n */\nexport function TenantSwitcher({ lang, activeSlug, adapter, onSwitch, roleLabel }: TenantSwitcherProps) {\n const t = TEXT[lang];\n const api = useMemo(() => adapter ?? createFetchTenantAdapter(), [adapter]);\n const [rows, setRows] = useState<TenantMembershipRow[] | null>(null);\n const [loadFailed, setLoadFailed] = useState(false);\n const [open, setOpen] = useState(false);\n const [busy, setBusy] = useState<string | null>(null);\n const [switchFailed, setSwitchFailed] = useState(false);\n const root = useRef<HTMLDivElement>(null);\n const menu = useRef<HTMLDivElement>(null);\n\n // The switcher sits among the app's actions, not at the screen edge, so a\n // menu anchored to it can run off either side on a phone. Measure it and\n // shift it back inside, EDGE px from the edge (appkit, 393 px, Lens b0ff5fb2).\n useLayoutEffect(() => {\n const el = menu.current;\n if (!open || !el) return;\n el.style.transform = \"\";\n const r = el.getBoundingClientRect();\n const vw = document.documentElement.clientWidth || window.innerWidth;\n let dx = 0;\n if (r.right > vw - EDGE) dx = vw - EDGE - r.right;\n if (r.left + dx < EDGE) dx = EDGE - r.left;\n if (dx !== 0) el.style.transform = `translateX(${Math.round(dx)}px)`;\n }, [open, rows, loadFailed, switchFailed]);\n\n const load = () => {\n setLoadFailed(false);\n api.load().then(setRows, () => setLoadFailed(true));\n };\n useEffect(load, [api]);\n\n useEffect(() => {\n if (!open) return;\n const onDown = (e: MouseEvent) => {\n if (root.current && !root.current.contains(e.target as Node)) setOpen(false);\n };\n const onKey = (e: KeyboardEvent) => e.key === \"Escape\" && setOpen(false);\n document.addEventListener(\"mousedown\", onDown);\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"mousedown\", onDown);\n document.removeEventListener(\"keydown\", onKey);\n };\n }, [open]);\n\n const active = rows?.find((r) => r.tenant.slug === activeSlug);\n const label = active?.tenant.name ?? activeSlug;\n\n const pick = async (slug: string) => {\n if (slug === activeSlug || busy) return;\n setBusy(slug);\n setSwitchFailed(false);\n try {\n await onSwitch(slug);\n setOpen(false);\n } catch {\n setSwitchFailed(true);\n } finally {\n setBusy(null);\n }\n };\n\n // One organisation, and it is the active one: nothing to switch to.\n if (rows && rows.length <= 1 && !loadFailed) {\n return (\n <div class=\"bas-tenant\" data-testid=\"tenant-switcher\">\n <span class=\"bas-tenant__label\" data-testid=\"tenant-switcher-label\">{label}</span>\n </div>\n );\n }\n\n return (\n <div class=\"bas-tenant\" ref={root} data-testid=\"tenant-switcher\">\n <button\n type=\"button\"\n class={\"bas-tenant__btn\" + (open ? \" is-open\" : \"\")}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-label={t.tenantSwitch}\n onClick={() => setOpen((v) => !v)}\n data-testid=\"tenant-switcher-button\"\n >\n <span class=\"bas-tenant__label\" data-testid=\"tenant-switcher-label\">{label}</span>\n </button>\n {open ? (\n <div class=\"bas-menu bas-tenant__menu\" ref={menu} role=\"menu\" data-testid=\"tenant-switcher-menu\">\n {loadFailed ? (\n <div class=\"bas-tenant__note\" role=\"alert\" data-testid=\"tenant-switcher-load-error\">\n <span>{t.tenantLoadFailed}</span>\n <button type=\"button\" class=\"bas-mi\" onClick={load} data-testid=\"tenant-switcher-retry\">{t.tenantRetry}</button>\n </div>\n ) : null}\n {switchFailed ? (\n <p class=\"bas-tenant__note is-error\" role=\"alert\" data-testid=\"tenant-switcher-switch-error\">\n {t.tenantSwitchFailed.replace(\"{name}\", label)}\n </p>\n ) : null}\n {(rows ?? []).map((r) => {\n const isActive = r.tenant.slug === activeSlug;\n const suspended = r.tenant.status === \"suspended\";\n return (\n <button\n key={r.tenant.id}\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={isActive}\n class={\"bas-mi bas-tenant__item\" + (isActive ? \" is-active\" : \"\")}\n disabled={suspended || busy !== null}\n onClick={() => void pick(r.tenant.slug)}\n data-testid={`tenant-switcher-item-${r.tenant.slug}`}\n >\n <span class=\"bas-tenant__name\">{r.tenant.name}</span>\n {suspended || isActive || roleLabel ? (\n <span class=\"bas-tenant__role\" data-testid={`tenant-switcher-role-${r.tenant.slug}`}>\n {suspended ? t.tenantSuspended : isActive ? t.tenantActive : roleLabel!(r.role)}\n </span>\n ) : null}\n </button>\n );\n })}\n </div>\n ) : null}\n </div>\n );\n}\n\n// ── F092.13 — ConfirmDialog ──────────────────────────────────────────────────\n// The fleet's confirm window, so no app reaches for window.confirm() or a\n// native <dialog> (D-4cd764). Built for appkit's «Slet» in a data-table row.\n//\n// Two choices that go beyond the obvious, both about the destructive case:\n// · it opens with focus on CANCEL, the safe button, so a stray Enter does\n// not delete anything;\n// · while `busy`, neither Escape nor a click outside closes it. The request\n// has already gone; a window that vanished would let the user believe they\n// had cancelled a deletion that is in fact happening.\nexport interface ConfirmDialogProps {\n open: boolean;\n title: ComponentChildren;\n body?: ComponentChildren;\n confirmLabel?: string;\n cancelLabel?: string;\n /** Red confirm button, for an action that cannot be undone. */\n destructive?: boolean;\n /** The confirm action is running: buttons disabled, the window cannot be dismissed. */\n busy?: boolean;\n /** Shown inside the window; the window stays open so the user can retry or cancel. */\n error?: ComponentChildren;\n onConfirm: () => void;\n onCancel: () => void;\n /** Prefix for every data-testid. Default \"confirm-dialog\". */\n testId?: string;\n}\n\nlet confirmDialogSeq = 0;\n\nexport function ConfirmDialog(p: ConfirmDialogProps) {\n const t = p.testId ?? \"confirm-dialog\";\n const panel = useRef<HTMLDivElement>(null);\n const cancelBtn = useRef<HTMLButtonElement>(null);\n const ids = useMemo(() => {\n const n = ++confirmDialogSeq;\n return { title: `bas-confirm-title-${n}`, body: `bas-confirm-body-${n}` };\n }, []);\n // Read through a ref so the key handler, registered once per open, sees the\n // CURRENT busy/onCancel rather than the values from the moment it opened.\n const live = useRef(p);\n live.current = p;\n\n // useLayoutEffect, not useEffect (F092.14): Preact runs useEffect after paint,\n // and appkit measured 153 ms before focus reached Cancel. In that gap the ⋮\n // trigger still had focus, its own handler swallowed Escape, and the dialog had\n // no listener yet — so an Escape right after opening did nothing.\n useLayoutEffect(() => {\n if (!p.open) return;\n const before = document.activeElement as HTMLElement | null;\n cancelBtn.current?.focus();\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n if (!live.current.busy) live.current.onCancel();\n return;\n }\n if (e.key !== \"Tab\" || !panel.current) return;\n const focusable = [...panel.current.querySelectorAll<HTMLElement>(\"button:not([disabled])\")];\n if (focusable.length === 0) { e.preventDefault(); return; }\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n const active = document.activeElement;\n if (e.shiftKey && (active === first || !panel.current.contains(active))) { e.preventDefault(); last.focus(); }\n else if (!e.shiftKey && (active === last || !panel.current.contains(active))) { e.preventDefault(); first.focus(); }\n };\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"keydown\", onKey);\n if (before && typeof before.focus === \"function\" && document.contains(before)) before.focus();\n };\n }, [p.open]);\n\n if (!p.open) return null;\n return (\n <div\n class=\"bas-confirm-backdrop\"\n data-testid={`${t}-backdrop`}\n onMouseDown={(e) => {\n if (e.target === e.currentTarget && !p.busy) p.onCancel();\n }}\n >\n <div\n ref={panel}\n class=\"bas-confirm\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-labelledby={ids.title}\n aria-describedby={p.body ? ids.body : undefined}\n aria-busy={p.busy ? \"true\" : undefined}\n data-testid={t}\n >\n <h2 class=\"bas-confirm__title\" id={ids.title} data-testid={`${t}-title`}>{p.title}</h2>\n {p.body ? <div class=\"bas-confirm__body\" id={ids.body} data-testid={`${t}-body`}>{p.body}</div> : null}\n {p.error ? <div class=\"bas-confirm__error\" role=\"alert\" data-testid={`${t}-error`}>{p.error}</div> : null}\n <div class=\"bas-confirm__actions\">\n <button ref={cancelBtn} type=\"button\" class=\"bas-confirm__btn\" disabled={p.busy} data-testid={`${t}-cancel`} onClick={() => p.onCancel()}>\n {p.cancelLabel ?? \"Annuller\"}\n </button>\n <button\n type=\"button\"\n class={`bas-confirm__btn is-primary${p.destructive ? \" is-danger\" : \"\"}${p.busy ? \" is-busy\" : \"\"}`}\n disabled={p.busy}\n data-testid={`${t}-confirm`}\n onClick={() => p.onConfirm()}\n >\n {p.busy ? <span class=\"bas-confirm__spinner\" aria-hidden=\"true\" /> : null}\n {p.confirmLabel ?? \"Bekræft\"}\n </button>\n </div>\n </div>\n </div>\n );\n}\n"]}