@nimblebrain/synapse 0.12.1 → 0.12.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/ui/tokens.ts","../../src/ui/components/Avatar.tsx","../../src/ui/components/Badge.tsx","../../src/ui/components/Button.tsx","../../src/ui/components/Card.tsx","../../src/ui/components/Drawer.tsx","../../src/ui/primitives.tsx","../../src/ui/typography.tsx","../../src/ui/components/EmptyState.tsx","../../src/ui/components/ListRow.tsx","../../src/ui/components/Pagination.tsx","../../src/ui/components/Prose.tsx","../../src/ui/components/SearchField.tsx","../../src/ui/components/SegmentedControl.tsx","../../src/ui/components/Spinner.tsx","../../src/ui/components/StatusDot.tsx","../../src/ui/components/Table.tsx","../../src/ui/layouts/AppFrame.tsx","../../src/ui/layouts/use-container-width.ts","../../src/ui/layouts/ListDetailLayout.tsx","../../src/ui/layouts/SidebarLayout.tsx"],"names":["jsx","STYLE_ID","RULES","useState","useEffect","TONE","jsxs","createContext","Header","useContext","Body","Footer","useRef","Fragment"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * The token contract for `@nimblebrain/synapse/ui`.\n *\n * Values are NOT brand hexes — they are `var(--token, fallback)` references to\n * the CSS custom properties the host injects into the app iframe (the MCP\n * ext-apps `hostContext.styles.variables`). Because styling resolves through\n * CSS variables, theme changes (including light↔dark) reflect automatically\n * with no React re-render: the host swaps the `:root` vars and every `var()`\n * re-resolves.\n *\n * The fallbacks are deliberately **neutral** (system fonts, neutral grays, a\n * generic blue) — NOT NimbleBrain brand. Brand arrives by injection when the\n * app runs inside the NimbleBrain host; standalone/static renders get a sane\n * unbranded default. This keeps the library host-agnostic.\n *\n * Components import the static `tokens` object and style with CSS `var()`, so\n * theming (incl. light/dark) resolves in CSS with no re-render.\n */\n\nimport type { CSSProperties } from \"react\";\n\n/** Resolved design tokens as CSS `var()` references with neutral fallbacks. */\nexport const tokens = {\n // ── Surfaces ──\n bg: \"var(--color-background-primary, #ffffff)\",\n bgRaised: \"var(--color-background-secondary, #fafafa)\",\n bgSubtle: \"var(--color-background-tertiary, #f3f4f6)\",\n\n // ── Text ──\n fg: \"var(--color-text-primary, #111827)\",\n fgMuted: \"var(--color-text-secondary, #6b7280)\",\n fgFaint: \"var(--color-text-tertiary, #9ca3af)\",\n accent: \"var(--color-text-accent, #2563eb)\",\n accentFg: \"var(--nb-color-accent-foreground, #ffffff)\",\n\n // ── Border / ring ──\n border: \"var(--color-border-primary, #e5e7eb)\",\n borderStrong: \"var(--color-border-secondary, #d1d5db)\",\n ring: \"var(--color-ring-primary, #2563eb)\",\n\n // ── Status / brand semantics ──\n danger: \"var(--nb-color-danger, #dc2626)\",\n success: \"var(--nb-color-success, #059669)\",\n warning: \"var(--nb-color-warning, #f59e0b)\",\n warm: \"var(--nb-color-warm, #d4620a)\",\n warmLight: \"var(--nb-color-warm-light, #fef5ee)\",\n processing: \"var(--nb-color-processing, #7c3aed)\",\n processingLight: \"var(--nb-color-processing-light, #f3eeff)\",\n infoLight: \"var(--nb-color-info-light, #eef4ff)\",\n\n // ── Typography ──\n fontSans: \"var(--font-sans, system-ui, -apple-system, BlinkMacSystemFont, sans-serif)\",\n fontMono: \"var(--font-mono, ui-monospace, SFMono-Regular, Menlo, monospace)\",\n fontHeading: \"var(--nb-font-heading, Georgia, 'Times New Roman', serif)\",\n weightNormal: \"var(--font-weight-normal, 400)\",\n weightMedium: \"var(--font-weight-medium, 500)\",\n weightSemibold: \"var(--font-weight-semibold, 600)\",\n weightBold: \"var(--font-weight-bold, 700)\",\n\n // ── Type scale (size + line-height pairs) ──\n textXsSize: \"var(--font-text-xs-size, 0.75rem)\",\n textXsLine: \"var(--font-text-xs-line-height, 1rem)\",\n textSmSize: \"var(--font-text-sm-size, 0.875rem)\",\n textSmLine: \"var(--font-text-sm-line-height, 1.25rem)\",\n textBaseSize: \"var(--font-text-base-size, 1rem)\",\n textBaseLine: \"var(--font-text-base-line-height, 1.5rem)\",\n textLgSize: \"var(--font-text-lg-size, 1.125rem)\",\n textLgLine: \"var(--font-text-lg-line-height, 1.75rem)\",\n headingSmSize: \"var(--font-heading-sm-size, 1.25rem)\",\n headingSmLine: \"var(--font-heading-sm-line-height, 1.75rem)\",\n headingMdSize: \"var(--font-heading-md-size, 1.5rem)\",\n headingMdLine: \"var(--font-heading-md-line-height, 2rem)\",\n headingLgSize: \"var(--font-heading-lg-size, 2rem)\",\n headingLgLine: \"var(--font-heading-lg-line-height, 2.5rem)\",\n\n // ── Radius / border width ──\n radiusXs: \"var(--border-radius-xs, 0.25rem)\",\n radiusSm: \"var(--border-radius-sm, 0.5rem)\",\n radiusMd: \"var(--border-radius-md, 0.75rem)\",\n radiusLg: \"var(--border-radius-lg, 1rem)\",\n radiusXl: \"var(--border-radius-xl, 1.5rem)\",\n borderWidth: \"var(--border-width-regular, 1px)\",\n\n // ── Shadows ──\n shadowHairline: \"var(--shadow-hairline, 0 0 0 1px rgba(0,0,0,0.06))\",\n shadowSm: \"var(--shadow-sm, 0 1px 2px rgba(0,0,0,0.05))\",\n shadowMd: \"var(--shadow-md, 0 4px 6px -1px rgba(0,0,0,0.1))\",\n shadowLg: \"var(--shadow-lg, 0 10px 15px -3px rgba(0,0,0,0.1))\",\n} as const;\n\nexport type Tokens = typeof tokens;\n\n/**\n * A style object that also permits CSS custom properties (`--foo`). React's\n * `CSSProperties` rejects custom-property keys; components that set CSS vars\n * inline (for `:hover`/keyframe plumbing) type their style as this, then pass\n * it to `style` (it down-casts cleanly to `CSSProperties`).\n */\nexport type StyleWithVars = CSSProperties & Record<`--${string}`, string | number>;\n\n/** Body text sizes. */\nexport type TextSize = \"xs\" | \"sm\" | \"base\" | \"lg\";\n/** Heading sizes. */\nexport type HeadingSize = \"sm\" | \"md\" | \"lg\";\n\nconst TEXT_SCALE: Record<TextSize, CSSProperties> = {\n xs: { fontSize: tokens.textXsSize, lineHeight: tokens.textXsLine },\n sm: { fontSize: tokens.textSmSize, lineHeight: tokens.textSmLine },\n base: { fontSize: tokens.textBaseSize, lineHeight: tokens.textBaseLine },\n lg: { fontSize: tokens.textLgSize, lineHeight: tokens.textLgLine },\n};\n\nconst HEADING_SCALE: Record<HeadingSize, CSSProperties> = {\n sm: { fontSize: tokens.headingSmSize, lineHeight: tokens.headingSmLine },\n md: { fontSize: tokens.headingMdSize, lineHeight: tokens.headingMdLine },\n lg: { fontSize: tokens.headingLgSize, lineHeight: tokens.headingLgLine },\n};\n\n/** `{ fontSize, lineHeight }` for a body-text level. */\nexport function textStyle(size: TextSize): CSSProperties {\n return TEXT_SCALE[size];\n}\n\n/** `{ fontSize, lineHeight }` for a heading level. */\nexport function headingStyle(size: HeadingSize): CSSProperties {\n return HEADING_SCALE[size];\n}\n","/**\n * Avatar — a circular identity chip. Renders an image when `src` is given,\n * otherwise initials derived from `name` on a subtle tinted background.\n */\n\nimport { type HTMLAttributes, useEffect, useState } from \"react\";\nimport { tokens } from \"../tokens.js\";\n\n/** Up to two initials from a name (\"Jordan Ratner\" → \"JR\", \"mat\" → \"M\"). */\nfunction initialsOf(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return \"?\";\n const first = parts[0] ?? \"\";\n if (parts.length === 1) return first.charAt(0).toUpperCase();\n const last = parts[parts.length - 1] ?? \"\";\n return (first.charAt(0) + last.charAt(0)).toUpperCase();\n}\n\ninterface AvatarProps extends Omit<HTMLAttributes<HTMLSpanElement>, \"children\"> {\n /** Name used for initials and the image alt text. */\n name: string;\n /** Optional image URL; falls back to initials when absent or on error. */\n src?: string;\n /** Diameter in px. Default 28. */\n size?: number;\n}\n\nexport function Avatar({ name, src, size = 28, style, ...rest }: AvatarProps) {\n // Fall back to initials if the image fails to load. Reset on `src` change.\n const [failed, setFailed] = useState(false);\n // biome-ignore lint/correctness/useExhaustiveDependencies: reset only when src changes\n useEffect(() => setFailed(false), [src]);\n const showImage = Boolean(src) && !failed;\n return (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n width: size,\n height: size,\n borderRadius: \"50%\",\n overflow: \"hidden\",\n background: tokens.bgSubtle,\n color: tokens.fgMuted,\n fontFamily: tokens.fontSans,\n fontSize: Math.round(size * 0.4),\n fontWeight: tokens.weightSemibold,\n userSelect: \"none\",\n ...style,\n }}\n {...rest}\n >\n {showImage ? (\n <img\n src={src}\n alt={name}\n width={size}\n height={size}\n onError={() => setFailed(true)}\n style={{ width: \"100%\", height: \"100%\", objectFit: \"cover\" }}\n />\n ) : (\n initialsOf(name)\n )}\n </span>\n );\n}\n","/**\n * Badge — a small pill for status and priority labels (e.g. MEDIUM/HIGH,\n * open/resolved). Soft tinted background with a same-hue label.\n */\n\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { tokens } from \"../tokens.js\";\n\nexport type BadgeTone =\n | \"neutral\"\n | \"accent\"\n | \"success\"\n | \"warning\"\n | \"danger\"\n | \"processing\"\n | \"warm\";\n\n/** `{ bg, fg }` per tone. Soft tinted background, same-hue label. The status\n * tones have no `*Light` token so their tint is derived from the fg color. */\nconst TONE: Record<BadgeTone, { bg: string; fg: string }> = {\n neutral: { bg: tokens.bgSubtle, fg: tokens.fgMuted },\n accent: { bg: tokens.infoLight, fg: tokens.accent },\n success: { bg: `color-mix(in oklab, ${tokens.success} 14%, transparent)`, fg: tokens.success },\n warning: { bg: `color-mix(in oklab, ${tokens.warning} 14%, transparent)`, fg: tokens.warning },\n danger: { bg: `color-mix(in oklab, ${tokens.danger} 14%, transparent)`, fg: tokens.danger },\n processing: { bg: tokens.processingLight, fg: tokens.processing },\n warm: { bg: tokens.warmLight, fg: tokens.warm },\n};\n\ninterface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n tone?: BadgeTone;\n children?: ReactNode;\n}\n\nexport function Badge({ tone = \"neutral\", style, children, ...rest }: BadgeProps) {\n const { bg, fg } = TONE[tone];\n return (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"0.25rem\",\n padding: \"0.1rem 0.45rem\",\n borderRadius: tokens.radiusXs,\n background: bg,\n color: fg,\n fontFamily: tokens.fontSans,\n fontSize: tokens.textXsSize,\n lineHeight: tokens.textXsLine,\n fontWeight: tokens.weightSemibold,\n letterSpacing: \"0.02em\",\n textTransform: \"uppercase\",\n whiteSpace: \"nowrap\",\n ...style,\n }}\n {...rest}\n >\n {children}\n </span>\n );\n}\n","/**\n * Button and TextLink. Pseudo-states (`:hover`/`:active`/`:disabled`) live in a\n * once-injected stylesheet that reads token-driven CSS custom properties set\n * inline — so the base values stay token-driven while hover still works.\n */\n\nimport type { ButtonHTMLAttributes, ReactNode } from \"react\";\nimport { ensureStyle } from \"../internal/inject-style.js\";\nimport { type StyleWithVars, tokens } from \"../tokens.js\";\n\nconst STYLE_ID = \"nb-synapse-button\";\nconst RULES = `\n.nb-btn {\n --nb-btn-bg: transparent;\n --nb-btn-bg-hover: transparent;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.4rem;\n border: var(--nb-btn-border, none);\n border-radius: var(--nb-btn-radius);\n background: var(--nb-btn-bg);\n color: var(--nb-btn-fg);\n font-family: var(--nb-btn-font);\n font-weight: var(--nb-btn-weight);\n cursor: pointer;\n transition: background 130ms ease, color 130ms ease, opacity 130ms ease;\n white-space: nowrap;\n}\n.nb-btn:hover { background: var(--nb-btn-bg-hover); }\n.nb-btn:active { transform: translateY(0.5px); }\n.nb-btn:disabled { opacity: 0.5; cursor: default; }\n.nb-btn:disabled:hover { background: var(--nb-btn-bg); }\n.nb-textlink {\n border: none;\n background: none;\n padding: 0;\n cursor: pointer;\n font-family: var(--nb-tl-font);\n color: var(--nb-tl-fg);\n transition: color 130ms ease, opacity 130ms ease;\n}\n.nb-textlink:hover { color: var(--nb-tl-fg-hover); }\n.nb-textlink:disabled { opacity: 0.45; cursor: default; }\n`;\n\ntype Variant = \"primary\" | \"secondary\" | \"ghost\";\ntype Size = \"sm\" | \"md\";\n\nconst SIZE_PAD: Record<Size, string> = {\n sm: \"0.3rem 0.6rem\",\n md: \"0.45rem 0.85rem\",\n};\n\ninterface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: Variant;\n size?: Size;\n children?: ReactNode;\n}\n\nexport function Button({\n variant = \"primary\",\n size = \"md\",\n style,\n className,\n children,\n ...rest\n}: ButtonProps) {\n ensureStyle(STYLE_ID, RULES);\n const vars: Record<`--${string}`, string> = {\n \"--nb-btn-radius\": tokens.radiusSm,\n \"--nb-btn-font\": tokens.fontSans,\n \"--nb-btn-weight\": tokens.weightMedium,\n };\n if (variant === \"primary\") {\n vars[\"--nb-btn-bg\"] = tokens.accent;\n vars[\"--nb-btn-bg-hover\"] = `color-mix(in oklab, ${tokens.accent} 88%, black)`;\n vars[\"--nb-btn-fg\"] = tokens.accentFg;\n } else if (variant === \"secondary\") {\n vars[\"--nb-btn-bg\"] = tokens.bgSubtle;\n vars[\"--nb-btn-bg-hover\"] = tokens.bgRaised;\n vars[\"--nb-btn-fg\"] = tokens.fg;\n vars[\"--nb-btn-border\"] = `${tokens.borderWidth} solid ${tokens.border}`;\n } else {\n vars[\"--nb-btn-bg\"] = \"transparent\";\n vars[\"--nb-btn-bg-hover\"] = tokens.bgSubtle;\n vars[\"--nb-btn-fg\"] = tokens.fg;\n }\n const btnStyle: StyleWithVars = {\n ...vars,\n padding: SIZE_PAD[size],\n fontSize: size === \"sm\" ? tokens.textSmSize : tokens.textBaseSize,\n lineHeight: size === \"sm\" ? tokens.textSmLine : tokens.textBaseLine,\n ...style,\n };\n return (\n <button type=\"button\" className={`nb-btn ${className ?? \"\"}`.trim()} style={btnStyle} {...rest}>\n {children}\n </button>\n );\n}\n\ninterface TextLinkProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Resting tone. Hover always moves toward `accent` (or `danger`). */\n tone?: \"muted\" | \"default\" | \"danger\";\n children?: ReactNode;\n}\n\n/** A chrome-less text button — for back / delete / retry affordances. */\nexport function TextLink({ tone = \"muted\", style, className, children, ...rest }: TextLinkProps) {\n ensureStyle(STYLE_ID, RULES);\n const resting =\n tone === \"danger\" ? tokens.danger : tone === \"default\" ? tokens.fg : tokens.fgMuted;\n const hover = tone === \"danger\" ? tokens.danger : tokens.accent;\n const linkStyle: StyleWithVars = {\n \"--nb-tl-font\": tokens.fontSans,\n \"--nb-tl-fg\": resting,\n \"--nb-tl-fg-hover\": hover,\n fontSize: tokens.textXsSize,\n lineHeight: tokens.textXsLine,\n letterSpacing: \"0.02em\",\n ...style,\n };\n return (\n <button\n type=\"button\"\n className={`nb-textlink ${className ?? \"\"}`.trim()}\n style={linkStyle}\n {...rest}\n >\n {children}\n </button>\n );\n}\n","/**\n * Card — a raised surface with a hairline border. The default container for\n * grouped content (deal cards, task cards, panels). `interactive` adds a hover\n * lift via a once-injected stylesheet (no per-card handlers).\n */\n\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { ensureStyle } from \"../internal/inject-style.js\";\nimport { type StyleWithVars, tokens } from \"../tokens.js\";\n\nconst STYLE_ID = \"nb-synapse-card\";\nconst RULES = `\n.nb-card--interactive {\n cursor: pointer;\n transition: box-shadow 140ms ease, border-color 140ms ease;\n}\n.nb-card--interactive:hover {\n box-shadow: var(--nb-card-shadow-hover);\n border-color: var(--nb-card-border-hover);\n}\n`;\n\ninterface CardProps extends HTMLAttributes<HTMLDivElement> {\n /** Inner padding (CSS length or px number). Default `0.875rem`. */\n padding?: number | string;\n /** Lift on hover — for clickable cards. */\n interactive?: boolean;\n children?: ReactNode;\n}\n\nexport function Card({\n padding = \"0.875rem\",\n interactive = false,\n style,\n className,\n children,\n ...rest\n}: CardProps) {\n if (interactive) ensureStyle(STYLE_ID, RULES);\n const cardStyle: StyleWithVars = {\n background: tokens.bgRaised,\n border: `${tokens.borderWidth} solid ${tokens.border}`,\n borderRadius: tokens.radiusMd,\n padding,\n boxShadow: tokens.shadowSm,\n \"--nb-card-shadow-hover\": tokens.shadowMd,\n \"--nb-card-border-hover\": tokens.borderStrong,\n ...style,\n };\n return (\n <div\n className={interactive ? `nb-card--interactive ${className ?? \"\"}`.trim() : className}\n style={cardStyle}\n {...rest}\n >\n {children}\n </div>\n );\n}\n","/**\n * Drawer — an off-canvas overlay panel that slides in from an edge, over a\n * scrim. The general overlay the apps need (e.g. CRM's detail panel).\n *\n * A plain positioned `<div>` overlay — **not** a native `<dialog>`. The platform\n * mounts every app in a sandboxed iframe that withholds `allow-modals`, so\n * `HTMLDialogElement.showModal()` throws there and white-screens the app; a\n * `<dialog>` is unusable in the one environment these apps run in. So the panel\n * hand-rolls what `showModal()` gave for free: a scrim, focus-into-panel on open\n * with focus restored on close, background scroll lock, and Escape. Controlled\n * via `open`/`onClose` (renders nothing when closed). Escape routes through\n * `onEscape` (defaults to `onClose`); clicking the scrim calls `onClose`. The\n * slide-in is a CSS keyframe on the panel.\n *\n * Compose with the `Header` / `Body` / `Footer` slots, or pass plain children.\n * `Header` owns the standard affordances — `title` (a real heading, wired as\n * the dialog's accessible name), an optional `onBack` button, an `actions`\n * slot, and the close button — so consumers don't re-roll them. The icon\n * buttons grow to a 44px hit target under `@media (pointer: coarse)`, keyed to\n * input modality rather than viewport width.\n *\n * `side` is `right` (default), `left`, or `bottom` (a bottom sheet — full width,\n * content height capped at 92%). A multi-level \"panel stack\" (push/pop) is an\n * app concern built on top of this.\n */\n\nimport {\n createContext,\n type HTMLAttributes,\n type ReactNode,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { ensureStyle } from \"../internal/inject-style.js\";\nimport { type StyleWithVars, tokens } from \"../tokens.js\";\n\ntype Side = \"left\" | \"right\" | \"bottom\";\n\nconst STYLE_ID = \"nb-synapse-drawer\";\nconst RULES = `\n.nb-drawer-scrim {\n position: fixed; inset: 0; z-index: 1000;\n display: flex; background: rgba(0, 0, 0, 0.32);\n animation: nb-drawer-fade 200ms ease;\n}\n.nb-drawer-scrim--right { justify-content: flex-end; }\n.nb-drawer-scrim--left { justify-content: flex-start; }\n.nb-drawer-scrim--bottom { align-items: flex-end; }\n.nb-drawer {\n margin: 0; padding: 0; border: none; max-width: 92%;\n height: 100%; max-height: 100%; display: flex; flex-direction: column;\n outline: none;\n}\n.nb-drawer--bottom { width: 100%; max-width: 100%; height: auto; max-height: 92%; }\n.nb-drawer--right { animation: nb-drawer-in-right 240ms cubic-bezier(0.2, 0, 0, 1); }\n.nb-drawer--left { animation: nb-drawer-in-left 240ms cubic-bezier(0.2, 0, 0, 1); }\n.nb-drawer--bottom { animation: nb-drawer-in-bottom 240ms cubic-bezier(0.2, 0, 0, 1); }\n@keyframes nb-drawer-in-right { from { transform: translateX(100%); } }\n@keyframes nb-drawer-in-left { from { transform: translateX(-100%); } }\n@keyframes nb-drawer-in-bottom { from { transform: translateY(100%); } }\n@keyframes nb-drawer-fade { from { opacity: 0; } }\n.nb-drawer-iconbtn { width: 28px; height: 28px; }\n@media (pointer: coarse) {\n .nb-drawer-iconbtn { min-width: 44px; min-height: 44px; }\n}\n`;\n\ninterface DrawerContextValue {\n labelId: string;\n setHasTitle: (has: boolean) => void;\n}\n\nconst DrawerContext = createContext<DrawerContextValue | null>(null);\n\ninterface DrawerProps extends Omit<HTMLAttributes<HTMLDivElement>, \"onClick\"> {\n open: boolean;\n /** Called by the scrim and the Header close button. */\n onClose: () => void;\n /** Called on Escape. Defaults to `onClose` — override to do something else\n * (e.g. pop one level of a panel stack before closing). */\n onEscape?: () => void;\n side?: Side;\n /** Panel width (ignored for `side=\"bottom\"`, which is full width). Default 480. */\n width?: number | string;\n children?: ReactNode;\n}\n\nfunction DrawerRoot({\n open,\n onClose,\n onEscape,\n side = \"right\",\n width = 480,\n style,\n children,\n ...rest\n}: DrawerProps) {\n ensureStyle(STYLE_ID, RULES);\n const panelRef = useRef<HTMLDivElement>(null);\n const labelId = useId();\n // A `Header` with a `title` registers itself here so the panel can name\n // itself via `aria-labelledby` (preferred over a consumer-passed aria-label).\n const [hasTitle, setHasTitle] = useState(false);\n\n // Escape → onEscape (defaults to onClose). A window keydown listener replaces\n // the native <dialog> `onCancel`, which required showModal() — blocked in the\n // app iframe sandbox (no `allow-modals`).\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n (onEscape ?? onClose)();\n }\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [open, onEscape, onClose]);\n\n // On open, move focus into the panel and lock background scroll; restore both\n // on close — the scroll-lock + focus-in showModal()'s top-layer gave. It does\n // NOT trap Tab focus within the panel (the `inert` containment); that's a\n // follow-up (#40).\n useEffect(() => {\n if (!open) return;\n const previouslyFocused = document.activeElement as HTMLElement | null;\n panelRef.current?.focus();\n const { body } = document;\n const prevOverflow = body.style.overflow;\n body.style.overflow = \"hidden\";\n return () => {\n body.style.overflow = prevOverflow;\n previouslyFocused?.focus?.();\n };\n }, [open]);\n\n const ctxValue = useMemo<DrawerContextValue>(() => ({ labelId, setHasTitle }), [labelId]);\n\n if (!open) return null;\n\n const isBottom = side === \"bottom\";\n const panelStyle: StyleWithVars = {\n ...(isBottom ? { width: \"100%\", maxWidth: \"100%\" } : { width }),\n background: tokens.bg,\n color: tokens.fg,\n boxShadow: tokens.shadowLg,\n outline: \"none\",\n ...(side === \"right\"\n ? { borderLeft: `${tokens.borderWidth} solid ${tokens.border}` }\n : side === \"left\"\n ? { borderRight: `${tokens.borderWidth} solid ${tokens.border}` }\n : { borderTop: `${tokens.borderWidth} solid ${tokens.border}` }),\n ...style,\n };\n\n return (\n <DrawerContext.Provider value={ctxValue}>\n {/* biome-ignore lint/a11y/useKeyWithClickEvents: scrim click is a bonus mouse affordance; Escape (the window keydown above) and the Header close button are the keyboard dismissal paths. */}\n {/* biome-ignore lint/a11y/noStaticElementInteractions: the scrim is a decorative dismissal backdrop; the panel below owns the dialog role/semantics. */}\n <div\n className={`nb-drawer-scrim nb-drawer-scrim--${side}`}\n onClick={(e) => {\n // A click whose target is the scrim itself (not the panel) dismisses.\n if (e.target === e.currentTarget) onClose();\n }}\n >\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={hasTitle ? labelId : undefined}\n tabIndex={-1}\n className={`nb-drawer nb-drawer--${side}`}\n style={panelStyle}\n {...rest}\n >\n {children}\n </div>\n </div>\n </DrawerContext.Provider>\n );\n}\n\ninterface HeaderProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n /**\n * Heading text — rendered as an `<h2>` and wired as the drawer's accessible\n * name. Renders **instead of** `children` (pass one or the other, not both).\n */\n title?: ReactNode;\n /** Show a leading back button (e.g. pop one level of a panel stack). */\n onBack?: () => void;\n /** Trailing controls placed before the close button. */\n actions?: ReactNode;\n /** Show a close button that calls this. */\n onClose?: () => void;\n children?: ReactNode;\n}\n\nfunction Header({ title, onBack, actions, onClose, style, children, ...rest }: HeaderProps) {\n const ctx = useContext(DrawerContext);\n const hasTitle = title != null;\n\n // Register the title's presence so the dialog can name itself via this h2.\n useEffect(() => {\n if (!ctx || !hasTitle) return;\n ctx.setHasTitle(true);\n return () => ctx.setHasTitle(false);\n }, [ctx, hasTitle]);\n\n return (\n <header\n style={{\n flexShrink: 0,\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.75rem\",\n padding: \"0.875rem 1rem\",\n borderBottom: `${tokens.borderWidth} solid ${tokens.border}`,\n fontFamily: tokens.fontSans,\n fontWeight: tokens.weightSemibold,\n color: tokens.fg,\n ...style,\n }}\n {...rest}\n >\n {onBack ? (\n <IconButton label=\"Back\" onClick={onBack}>\n <path\n d=\"M10 3L5 8l5 5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </IconButton>\n ) : null}\n {hasTitle ? (\n <h2\n id={ctx?.labelId}\n style={{\n flex: 1,\n minWidth: 0,\n margin: 0,\n fontFamily: tokens.fontSans,\n fontSize: tokens.textBaseSize,\n lineHeight: tokens.textBaseLine,\n fontWeight: tokens.weightSemibold,\n color: tokens.fg,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n }}\n >\n {title}\n </h2>\n ) : (\n <div style={{ flex: 1, minWidth: 0 }}>{children}</div>\n )}\n {actions ? (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.4rem\", flexShrink: 0 }}>\n {actions}\n </div>\n ) : null}\n {onClose ? (\n <IconButton label=\"Close\" onClick={onClose}>\n <path\n d=\"M4 4l8 8M12 4l-8 8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </IconButton>\n ) : null}\n </header>\n );\n}\n\n/** Shared 28px (→44px on coarse pointers) icon button for the header affordances. */\nfunction IconButton({\n label,\n onClick,\n children,\n}: {\n label: string;\n onClick: () => void;\n children: ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n aria-label={label}\n onClick={onClick}\n className=\"nb-drawer-iconbtn\"\n style={{\n flexShrink: 0,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n border: \"none\",\n background: \"transparent\",\n color: tokens.fgMuted,\n cursor: \"pointer\",\n borderRadius: tokens.radiusSm,\n }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n {children}\n </svg>\n </button>\n );\n}\n\nfunction Body({ style, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div style={{ flex: 1, minHeight: 0, overflowY: \"auto\", padding: \"1rem\", ...style }} {...rest}>\n {children}\n </div>\n );\n}\n\nfunction Footer({ style, children, ...rest }: HTMLAttributes<HTMLElement>) {\n return (\n <footer\n style={{\n flexShrink: 0,\n padding: \"0.75rem 1rem\",\n borderTop: `${tokens.borderWidth} solid ${tokens.border}`,\n ...style,\n }}\n {...rest}\n >\n {children}\n </footer>\n );\n}\n\n/** `Drawer` with `.Header`, `.Body`, `.Footer` slots. */\nexport const Drawer = Object.assign(DrawerRoot, { Header, Body, Footer });\n","/**\n * Layout primitives — the composition atoms. `Stack` (vertical) and `Inline`\n * (horizontal) replace ad-hoc `display:flex` style objects; `Spacer` and\n * `Divider` cover the two other recurring layout needs. Deliberately minimal\n * (no `Box`, no grid system) — the layout scaffolds handle page structure.\n */\n\nimport type { CSSProperties, HTMLAttributes, ReactNode } from \"react\";\nimport { tokens } from \"./tokens.js\";\n\ntype Align = \"start\" | \"center\" | \"end\" | \"stretch\" | \"baseline\";\ntype Justify = \"start\" | \"center\" | \"end\" | \"between\" | \"around\";\n\nconst ALIGN: Record<Align, CSSProperties[\"alignItems\"]> = {\n start: \"flex-start\",\n center: \"center\",\n end: \"flex-end\",\n stretch: \"stretch\",\n baseline: \"baseline\",\n};\n\nconst JUSTIFY: Record<Justify, CSSProperties[\"justifyContent\"]> = {\n start: \"flex-start\",\n center: \"center\",\n end: \"flex-end\",\n between: \"space-between\",\n around: \"space-around\",\n};\n\ninterface FlexProps extends HTMLAttributes<HTMLDivElement> {\n gap?: number | string;\n align?: Align;\n justify?: Justify;\n wrap?: boolean;\n children?: ReactNode;\n}\n\nfunction flexStyle(\n direction: \"row\" | \"column\",\n { gap, align, justify, wrap }: FlexProps,\n): CSSProperties {\n return {\n display: \"flex\",\n flexDirection: direction,\n gap,\n alignItems: align ? ALIGN[align] : undefined,\n justifyContent: justify ? JUSTIFY[justify] : undefined,\n flexWrap: wrap ? \"wrap\" : undefined,\n };\n}\n\n/** Vertical flex container with `gap`. Defaults to `align: stretch`. */\nexport function Stack({ gap, align, justify, wrap, style, children, ...rest }: FlexProps) {\n return (\n <div style={{ ...flexStyle(\"column\", { gap, align, justify, wrap }), ...style }} {...rest}>\n {children}\n </div>\n );\n}\n\n/** Horizontal flex container with `gap`. Defaults to `align: center`. */\nexport function Inline({\n gap,\n align = \"center\",\n justify,\n wrap,\n style,\n children,\n ...rest\n}: FlexProps) {\n return (\n <div style={{ ...flexStyle(\"row\", { gap, align, justify, wrap }), ...style }} {...rest}>\n {children}\n </div>\n );\n}\n\n/** Flexible gap that pushes siblings apart inside a `Stack`/`Inline`. */\nexport function Spacer({ style, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return <div style={{ flex: 1, ...style }} {...rest} />;\n}\n\ninterface DividerProps extends HTMLAttributes<HTMLDivElement> {\n orientation?: \"horizontal\" | \"vertical\";\n}\n\n/** A hairline rule using the border token. Horizontal by default. Decorative\n * (`aria-hidden`) — it's a visual divider, not a focusable/valued separator. */\nexport function Divider({ orientation = \"horizontal\", style, ...rest }: DividerProps) {\n const isVertical = orientation === \"vertical\";\n return (\n <div\n aria-hidden=\"true\"\n style={{\n flexShrink: 0,\n background: tokens.border,\n ...(isVertical\n ? { width: tokens.borderWidth, alignSelf: \"stretch\" }\n : { height: tokens.borderWidth, width: \"100%\" }),\n ...style,\n }}\n {...rest}\n />\n );\n}\n","/**\n * Typography components bound to the type scale and the sans/heading font\n * slots. `Text` for body copy, `Heading` for display type (uses the heading\n * font — Erode in the NimbleBrain host, a serif fallback elsewhere).\n */\n\nimport type { CSSProperties, ElementType, HTMLAttributes, ReactNode } from \"react\";\nimport { type HeadingSize, headingStyle, type TextSize, textStyle, tokens } from \"./tokens.js\";\n\ntype Tone = \"default\" | \"muted\" | \"faint\" | \"accent\" | \"danger\" | \"success\";\ntype Weight = \"normal\" | \"medium\" | \"semibold\" | \"bold\";\n\nconst TONE: Record<Tone, string> = {\n default: tokens.fg,\n muted: tokens.fgMuted,\n faint: tokens.fgFaint,\n accent: tokens.accent,\n danger: tokens.danger,\n success: tokens.success,\n};\n\nconst WEIGHT: Record<Weight, string> = {\n normal: tokens.weightNormal,\n medium: tokens.weightMedium,\n semibold: tokens.weightSemibold,\n bold: tokens.weightBold,\n};\n\ninterface TextProps extends Omit<HTMLAttributes<HTMLElement>, \"color\"> {\n size?: TextSize;\n weight?: Weight;\n tone?: Tone;\n mono?: boolean;\n /** Single-line ellipsis truncation. */\n truncate?: boolean;\n as?: ElementType;\n children?: ReactNode;\n}\n\n/** Body text. Defaults to base size, normal weight, primary tone, sans font. */\nexport function Text({\n size = \"base\",\n weight = \"normal\",\n tone = \"default\",\n mono = false,\n truncate = false,\n as: As = \"span\",\n style,\n children,\n ...rest\n}: TextProps) {\n const truncation: CSSProperties = truncate\n ? { overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }\n : {};\n return (\n <As\n style={{\n margin: 0,\n fontFamily: mono ? tokens.fontMono : tokens.fontSans,\n fontWeight: WEIGHT[weight],\n color: TONE[tone],\n ...textStyle(size),\n ...truncation,\n ...style,\n }}\n {...rest}\n >\n {children}\n </As>\n );\n}\n\ninterface HeadingProps extends Omit<HTMLAttributes<HTMLHeadingElement>, \"color\"> {\n size?: HeadingSize;\n weight?: Weight;\n tone?: Tone;\n as?: ElementType;\n children?: ReactNode;\n}\n\n/** Display heading using the heading font slot. Defaults to md, semibold. */\nexport function Heading({\n size = \"md\",\n weight = \"semibold\",\n tone = \"default\",\n as: As = \"h2\",\n style,\n children,\n ...rest\n}: HeadingProps) {\n return (\n <As\n style={{\n margin: 0,\n fontFamily: tokens.fontHeading,\n fontWeight: WEIGHT[weight],\n color: TONE[tone],\n letterSpacing: \"-0.015em\",\n ...headingStyle(size),\n ...style,\n }}\n {...rest}\n >\n {children}\n </As>\n );\n}\n","/**\n * EmptyState — centered placeholder for empty lists/views. Optional icon,\n * title, description, and an action slot (e.g. a Button).\n */\n\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { Stack } from \"../primitives.js\";\nimport { tokens } from \"../tokens.js\";\nimport { Heading, Text } from \"../typography.js\";\n\ninterface EmptyStateProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n icon?: ReactNode;\n title?: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n}\n\nexport function EmptyState({ icon, title, description, action, style, ...rest }: EmptyStateProps) {\n return (\n <Stack\n align=\"center\"\n gap=\"0.5rem\"\n style={{\n textAlign: \"center\",\n padding: \"4rem 1.5rem\",\n color: tokens.fgMuted,\n ...style,\n }}\n {...rest}\n >\n {icon ? <div style={{ color: tokens.fgFaint, marginBottom: \"0.25rem\" }}>{icon}</div> : null}\n {title ? <Heading size=\"sm\">{title}</Heading> : null}\n {description ? (\n <Text size=\"sm\" tone=\"muted\" style={{ maxWidth: 360 }}>\n {description}\n </Text>\n ) : null}\n {action ? <div style={{ marginTop: \"0.75rem\" }}>{action}</div> : null}\n </Stack>\n );\n}\n","/**\n * ListRow — the recurring list item: an optional leading slot (status dot,\n * avatar), a title with optional meta line, and a trailing slot (timestamp,\n * actions). Rounded hover tint, flat at rest — the pattern Research,\n * Conversations, and the Collateral sidebar each re-rolled.\n */\n\nimport type { HTMLAttributes, KeyboardEvent, ReactNode } from \"react\";\nimport { ensureStyle } from \"../internal/inject-style.js\";\nimport { type StyleWithVars, tokens } from \"../tokens.js\";\n\nconst STYLE_ID = \"nb-synapse-listrow\";\nconst RULES = `\n.nb-listrow { transition: background 140ms ease; }\n.nb-listrow--interactive { cursor: pointer; }\n.nb-listrow--interactive:hover { background: var(--nb-listrow-hover); }\n`;\n\ninterface ListRowProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n title: ReactNode;\n /** Secondary line under the title. */\n meta?: ReactNode;\n /** Leading slot — e.g. a StatusDot or Avatar. */\n leading?: ReactNode;\n /** Trailing slot — e.g. a timestamp or actions. */\n trailing?: ReactNode;\n /** Enables pointer cursor + hover tint. */\n interactive?: boolean;\n}\n\nexport function ListRow({\n title,\n meta,\n leading,\n trailing,\n interactive = false,\n style,\n className,\n ...rest\n}: ListRowProps) {\n ensureStyle(STYLE_ID, RULES);\n const rowStyle: StyleWithVars = {\n \"--nb-listrow-hover\": tokens.bgSubtle,\n display: \"grid\",\n gridTemplateColumns: `${leading ? \"auto \" : \"\"}minmax(0, 1fr)${trailing ? \" auto\" : \"\"}`,\n columnGap: \"0.75rem\",\n alignItems: \"baseline\",\n padding: \"0.65rem 0.75rem\",\n borderRadius: tokens.radiusSm,\n ...style,\n };\n // When interactive, make the row keyboard-operable (matches Table's rows):\n // role=\"button\" + tabIndex, and Enter/Space synthesize the click that drives\n // the consumer's onClick (passed via ...rest). Placed before ...rest so a\n // consumer can still override any of these explicitly.\n const interactiveProps = interactive\n ? {\n role: \"button\",\n tabIndex: 0,\n onKeyDown: (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n e.currentTarget.click();\n }\n },\n }\n : {};\n return (\n <div\n className={`nb-listrow ${interactive ? \"nb-listrow--interactive\" : \"\"} ${className ?? \"\"}`.trim()}\n style={rowStyle}\n {...interactiveProps}\n {...rest}\n >\n {leading ? <div style={{ alignSelf: \"center\", display: \"flex\" }}>{leading}</div> : null}\n <div style={{ minWidth: 0 }}>\n <div\n style={{\n fontFamily: tokens.fontSans,\n fontSize: tokens.textBaseSize,\n lineHeight: tokens.textBaseLine,\n fontWeight: tokens.weightMedium,\n color: tokens.fg,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {title}\n </div>\n {meta ? (\n <div\n style={{\n marginTop: \"0.15rem\",\n fontFamily: tokens.fontSans,\n fontSize: tokens.textXsSize,\n lineHeight: tokens.textXsLine,\n color: tokens.fgMuted,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {meta}\n </div>\n ) : null}\n </div>\n {trailing ? (\n <div\n style={{\n alignSelf: \"center\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n fontSize: tokens.textXsSize,\n color: tokens.fgMuted,\n whiteSpace: \"nowrap\",\n }}\n >\n {trailing}\n </div>\n ) : null}\n </div>\n );\n}\n","/**\n * Pagination — chrome-less prev/next text links with a \"page X of Y\" counter.\n * 1-based `page`. Buttons disable at the ends.\n */\n\nimport type { HTMLAttributes } from \"react\";\nimport { Inline } from \"../primitives.js\";\nimport { tokens } from \"../tokens.js\";\nimport { TextLink } from \"./Button.js\";\n\ninterface PaginationProps extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n /** Current page, 1-based. */\n page: number;\n /** Total number of pages. */\n pageCount: number;\n onChange: (page: number) => void;\n}\n\nexport function Pagination({ page, pageCount, onChange, style, ...rest }: PaginationProps) {\n const total = Math.max(1, pageCount);\n const atStart = page <= 1;\n const atEnd = page >= total;\n return (\n <Inline\n justify=\"between\"\n style={{\n fontFamily: tokens.fontSans,\n fontSize: tokens.textXsSize,\n color: tokens.fgMuted,\n letterSpacing: \"0.02em\",\n ...style,\n }}\n {...rest}\n >\n <span style={{ fontVariantNumeric: \"tabular-nums\" }}>\n Page {page} of {total}\n </span>\n <Inline gap=\"1rem\">\n <TextLink disabled={atStart} onClick={() => onChange(page - 1)}>\n ← Prev\n </TextLink>\n <TextLink disabled={atEnd} onClick={() => onChange(page + 1)}>\n Next →\n </TextLink>\n </Inline>\n </Inline>\n );\n}\n","/**\n * Prose — a token-styled container for rendered rich text. It applies the\n * NimbleBrain reading typography (ported from the Research app's markdown\n * element map) to whatever HTML it wraps, via a once-injected scoped\n * stylesheet — so it stays dependency-free.\n *\n * Pass pre-rendered nodes as `children`, or a trusted HTML string as `html`.\n * Bring your own markdown parser (`marked`, `react-markdown`, …) upstream; this\n * owns the *styling*, not the parsing — keeping the SDK free of a parser dep.\n */\n\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { ensureStyle } from \"../internal/inject-style.js\";\nimport { tokens } from \"../tokens.js\";\n\nconst STYLE_ID = \"nb-synapse-prose\";\nconst RULES = `\n.nb-prose {\n font-family: ${tokens.fontSans};\n font-size: ${tokens.textBaseSize};\n line-height: 1.7;\n color: ${tokens.fg};\n}\n.nb-prose > :first-child { margin-top: 0; }\n.nb-prose > :last-child { margin-bottom: 0; }\n.nb-prose h1, .nb-prose h2 { font-family: ${tokens.fontHeading}; letter-spacing: -0.015em; color: ${tokens.fg}; }\n.nb-prose h1 { font-size: ${tokens.headingMdSize}; line-height: ${tokens.headingMdLine}; margin: 2rem 0 0.75rem; }\n.nb-prose h2 { font-size: ${tokens.headingSmSize}; line-height: ${tokens.headingSmLine}; margin: 1.75rem 0 0.5rem; }\n.nb-prose h3 { font-size: ${tokens.textBaseSize}; font-weight: ${tokens.weightSemibold}; margin: 1.5rem 0 0.35rem; color: ${tokens.fg}; }\n.nb-prose p { margin: 0 0 1rem; }\n.nb-prose ul, .nb-prose ol { margin: 0 0 1rem; padding-left: 1.25rem; }\n.nb-prose li { margin: 0.25rem 0; }\n.nb-prose a { color: ${tokens.accent}; text-decoration: underline; text-underline-offset: 2px; }\n.nb-prose blockquote { margin: 0 0 1rem; padding-left: 1rem; border-left: 2px solid ${tokens.accent}; color: ${tokens.fgMuted}; font-style: italic; }\n.nb-prose code { font-family: ${tokens.fontMono}; font-size: 0.88em; padding: 0.08rem 0.32rem; border-radius: ${tokens.radiusXs}; background: ${tokens.bgSubtle}; }\n.nb-prose pre { font-family: ${tokens.fontMono}; font-size: ${tokens.textSmSize}; line-height: 1.55; margin: 0 0 1.25rem; padding: 0.875rem 1rem; background: ${tokens.bgSubtle}; border-radius: ${tokens.radiusSm}; overflow-x: auto; }\n.nb-prose pre code { padding: 0; background: none; }\n.nb-prose hr { border: none; border-top: 1px solid ${tokens.border}; margin: 2rem 0; }\n.nb-prose strong { font-weight: ${tokens.weightSemibold}; }\n`;\n\ninterface ProseProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"children\" | \"dangerouslySetInnerHTML\"> {\n /** Trusted, pre-sanitized HTML string. */\n html?: string;\n children?: ReactNode;\n}\n\nexport function Prose({ html, children, className, ...rest }: ProseProps) {\n ensureStyle(STYLE_ID, RULES);\n const cls = `nb-prose ${className ?? \"\"}`.trim();\n if (html !== undefined) {\n // biome-ignore lint/security/noDangerouslySetInnerHtml: caller supplies trusted, pre-sanitized HTML by contract.\n return <div className={cls} dangerouslySetInnerHTML={{ __html: html }} {...rest} />;\n }\n return (\n <div className={cls} {...rest}>\n {children}\n </div>\n );\n}\n","/**\n * SearchField — a text input in two postures: `underline` (invisible at rest,\n * reveals an underline on focus — the Research editorial style) and `boxed`\n * (a bordered field). Focus styling lives in a once-injected stylesheet.\n */\n\nimport type { InputHTMLAttributes } from \"react\";\nimport { ensureStyle } from \"../internal/inject-style.js\";\nimport { type StyleWithVars, tokens } from \"../tokens.js\";\n\nconst STYLE_ID = \"nb-synapse-searchfield\";\nconst RULES = `\n.nb-search { font-family: var(--nb-search-font); color: var(--nb-search-fg); outline: none; }\n.nb-search::placeholder { color: var(--nb-search-placeholder); }\n.nb-search--underline {\n border: none;\n border-bottom: 1px solid transparent;\n background: transparent;\n padding: 0.3rem 0.1rem;\n transition: border-color 160ms ease;\n}\n.nb-search--underline:focus { border-bottom-color: var(--nb-search-accent); }\n.nb-search--boxed {\n border: 1px solid var(--nb-search-border);\n border-radius: var(--nb-search-radius);\n background: var(--nb-search-bg);\n padding: 0.4rem 0.6rem;\n transition: border-color 160ms ease, box-shadow 160ms ease;\n}\n.nb-search--boxed:focus {\n border-color: var(--nb-search-accent);\n box-shadow: 0 0 0 3px color-mix(in oklab, var(--nb-search-accent) 18%, transparent);\n}\n`;\n\ninterface SearchFieldProps extends InputHTMLAttributes<HTMLInputElement> {\n variant?: \"underline\" | \"boxed\";\n}\n\nexport function SearchField({\n variant = \"underline\",\n style,\n className,\n type = \"search\",\n ...rest\n}: SearchFieldProps) {\n ensureStyle(STYLE_ID, RULES);\n const fieldStyle: StyleWithVars = {\n \"--nb-search-font\": tokens.fontSans,\n \"--nb-search-fg\": tokens.fg,\n \"--nb-search-placeholder\": tokens.fgFaint,\n \"--nb-search-accent\": tokens.accent,\n \"--nb-search-border\": tokens.border,\n \"--nb-search-bg\": tokens.bgSubtle,\n \"--nb-search-radius\": tokens.radiusSm,\n fontSize: tokens.textSmSize,\n lineHeight: tokens.textSmLine,\n ...style,\n };\n return (\n <input\n type={type}\n className={`nb-search nb-search--${variant} ${className ?? \"\"}`.trim()}\n style={fieldStyle}\n {...rest}\n />\n );\n}\n","/**\n * SegmentedControl — the view-toggle pattern (Board/Table, All/Today/Week).\n * A small set of mutually-exclusive options; the active one gets a raised pill.\n */\n\nimport type { HTMLAttributes } from \"react\";\nimport { ensureStyle } from \"../internal/inject-style.js\";\nimport { type StyleWithVars, tokens } from \"../tokens.js\";\n\nconst STYLE_ID = \"nb-synapse-segmented\";\nconst RULES = `\n.nb-seg {\n display: inline-flex;\n gap: 2px;\n padding: 2px;\n border-radius: var(--nb-seg-radius);\n background: var(--nb-seg-track);\n}\n.nb-seg__btn {\n border: none;\n background: transparent;\n color: var(--nb-seg-fg);\n font-family: var(--nb-seg-font);\n font-weight: var(--nb-seg-weight);\n padding: 0.25rem 0.7rem;\n border-radius: calc(var(--nb-seg-radius) - 2px);\n cursor: pointer;\n transition: color 130ms ease, background 130ms ease;\n white-space: nowrap;\n}\n.nb-seg__btn:hover:not([aria-pressed=\"true\"]) { color: var(--nb-seg-fg-strong); }\n.nb-seg__btn[aria-pressed=\"true\"] {\n background: var(--nb-seg-active-bg);\n color: var(--nb-seg-fg-strong);\n box-shadow: var(--nb-seg-active-shadow);\n}\n`;\n\ninterface Option<T extends string> {\n label: string;\n value: T;\n}\n\ninterface SegmentedControlProps<T extends string>\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n options: Option<T>[];\n value: T;\n onChange: (value: T) => void;\n}\n\nexport function SegmentedControl<T extends string>({\n options,\n value,\n onChange,\n style,\n className,\n ...rest\n}: SegmentedControlProps<T>) {\n ensureStyle(STYLE_ID, RULES);\n const trackStyle: StyleWithVars = {\n \"--nb-seg-radius\": tokens.radiusSm,\n \"--nb-seg-track\": tokens.bgSubtle,\n \"--nb-seg-fg\": tokens.fgMuted,\n \"--nb-seg-fg-strong\": tokens.fg,\n \"--nb-seg-font\": tokens.fontSans,\n \"--nb-seg-weight\": tokens.weightMedium,\n \"--nb-seg-active-bg\": tokens.bgRaised,\n \"--nb-seg-active-shadow\": tokens.shadowSm,\n fontSize: tokens.textSmSize,\n lineHeight: tokens.textSmLine,\n ...style,\n };\n return (\n // biome-ignore lint/a11y/useSemanticElements: role=\"group\" with aria-label is the correct grouping for a set of toggle buttons; <fieldset> would impose form semantics this control doesn't have.\n <div className={`nb-seg ${className ?? \"\"}`.trim()} role=\"group\" style={trackStyle} {...rest}>\n {options.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n className=\"nb-seg__btn\"\n aria-pressed={opt.value === value}\n onClick={() => onChange(opt.value)}\n >\n {opt.label}\n </button>\n ))}\n </div>\n );\n}\n","/**\n * Spinner — a minimal rotating indicator for inline/button loading states.\n */\n\nimport type { HTMLAttributes } from \"react\";\nimport { ensureStyle } from \"../internal/inject-style.js\";\nimport { type StyleWithVars, tokens } from \"../tokens.js\";\n\nconst STYLE_ID = \"nb-synapse-spinner\";\nconst RULES = `\n@keyframes nb-spin { to { transform: rotate(360deg); } }\n.nb-spinner { animation: nb-spin 0.7s linear infinite; }\n@media (prefers-reduced-motion: reduce) { .nb-spinner { animation-duration: 1.6s; } }\n`;\n\ninterface SpinnerProps extends HTMLAttributes<HTMLSpanElement> {\n /** Diameter in px. Default 16. */\n size?: number;\n /** Arc color. Defaults to the accent token. */\n color?: string;\n}\n\nexport function Spinner({ size = 16, color, style, className, ...rest }: SpinnerProps) {\n ensureStyle(STYLE_ID, RULES);\n const spinnerStyle: StyleWithVars = {\n display: \"inline-block\",\n flexShrink: 0,\n width: size,\n height: size,\n borderRadius: \"50%\",\n border: `2px solid ${tokens.border}`,\n borderTopColor: color ?? tokens.accent,\n boxSizing: \"border-box\",\n ...style,\n };\n return (\n <span\n className={`nb-spinner ${className ?? \"\"}`.trim()}\n role=\"status\"\n aria-label=\"Loading\"\n style={spinnerStyle}\n {...rest}\n />\n );\n}\n","/**\n * StatusDot — a small colored dot for run/task status. The `working` state\n * gets a living ripple-pulse (ported from the Research app), gated on\n * `prefers-reduced-motion`. Same component in list rows and detail headers so\n * status reads identically everywhere.\n */\n\nimport type { HTMLAttributes } from \"react\";\nimport { ensureStyle } from \"../internal/inject-style.js\";\nimport { type StyleWithVars, tokens } from \"../tokens.js\";\n\nexport type Status = \"working\" | \"completed\" | \"failed\" | \"idle\";\n\nconst COLOR: Record<Status, string> = {\n working: tokens.accent,\n completed: tokens.success,\n failed: tokens.danger,\n idle: tokens.fgFaint,\n};\n\nconst STYLE_ID = \"nb-synapse-statusdot\";\nconst KEYFRAMES = `\n@keyframes nb-statusdot-pulse {\n 0% { box-shadow: 0 0 0 0 var(--nb-statusdot-ring); transform: scale(1); }\n 70% { box-shadow: 0 0 0 7px transparent; transform: scale(1.15); }\n 100% { box-shadow: 0 0 0 0 transparent; transform: scale(1); }\n}\n.nb-statusdot--working {\n animation: nb-statusdot-pulse 1.6s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n}\n@media (prefers-reduced-motion: reduce) {\n .nb-statusdot--working { animation: none; box-shadow: 0 0 0 2px var(--nb-statusdot-ring); }\n}\n`;\n\ninterface StatusDotProps extends Omit<HTMLAttributes<HTMLSpanElement>, \"color\"> {\n status?: Status;\n /** Override the dot color (any CSS color / token). */\n color?: string;\n /** Diameter in px. Default 8. */\n size?: number;\n}\n\nexport function StatusDot({\n status = \"idle\",\n color,\n size = 8,\n style,\n className,\n ...rest\n}: StatusDotProps) {\n ensureStyle(STYLE_ID, KEYFRAMES);\n const dotColor = color ?? COLOR[status];\n const working = status === \"working\";\n const dotStyle: StyleWithVars = {\n display: \"inline-block\",\n flexShrink: 0,\n width: size,\n height: size,\n borderRadius: \"50%\",\n background: dotColor,\n // Ring color for the pulse keyframe — a faded copy of the dot color.\n \"--nb-statusdot-ring\": `color-mix(in oklab, ${dotColor} 45%, transparent)`,\n ...style,\n };\n return (\n <span\n className={working ? `nb-statusdot--working ${className ?? \"\"}`.trim() : className}\n style={dotStyle}\n {...rest}\n />\n );\n}\n","/**\n * Table — a token-styled data table with declarative columns. For the tabular\n * list surfaces (CRM contacts/deals) that simple `ListRow`s don't fit. Renders\n * a real `<table>` for semantics; header is sticky; rows hover-tint and can be\n * clickable. Sorting / selection / virtualization are deliberately out of v1 —\n * compose `Pagination` for paging.\n */\n\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { ensureStyle } from \"../internal/inject-style.js\";\nimport { type StyleWithVars, tokens } from \"../tokens.js\";\n\ntype Align = \"left\" | \"right\" | \"center\";\n\nexport interface Column<T> {\n /** Stable column id. */\n key: string;\n header: ReactNode;\n /** Cell content for a row. */\n render: (row: T, index: number) => ReactNode;\n align?: Align;\n width?: number | string;\n}\n\ninterface TableProps<T> extends Omit<HTMLAttributes<HTMLTableElement>, \"children\"> {\n data: T[];\n columns: Column<T>[];\n /** Stable key per row. */\n rowKey: (row: T, index: number) => string | number;\n onRowClick?: (row: T, index: number) => void;\n /** Shown when `data` is empty. */\n empty?: ReactNode;\n}\n\nconst STYLE_ID = \"nb-synapse-table\";\nconst RULES = `\n.nb-table { width: 100%; border-collapse: collapse; font-family: var(--nb-table-font); }\n.nb-table th, .nb-table td {\n padding: 0.55rem 0.75rem;\n border-bottom: var(--nb-table-border);\n font-size: var(--nb-table-size); line-height: var(--nb-table-line);\n}\n.nb-table thead th {\n position: sticky; top: 0; z-index: 1;\n background: var(--nb-table-head-bg);\n color: var(--nb-table-muted);\n font-weight: var(--nb-table-semibold);\n font-size: var(--nb-table-xs); text-align: left;\n text-transform: uppercase; letter-spacing: 0.04em;\n}\n.nb-table tbody td { color: var(--nb-table-fg); }\n.nb-table tbody tr.nb-table__row--clickable { cursor: pointer; }\n.nb-table tbody tr.nb-table__row--clickable:hover { background: var(--nb-table-hover); }\n`;\n\nexport function Table<T>({\n data,\n columns,\n rowKey,\n onRowClick,\n empty,\n style,\n className,\n ...rest\n}: TableProps<T>) {\n ensureStyle(STYLE_ID, RULES);\n\n const vars: Record<`--${string}`, string> = {\n \"--nb-table-font\": tokens.fontSans,\n \"--nb-table-fg\": tokens.fg,\n \"--nb-table-muted\": tokens.fgMuted,\n \"--nb-table-head-bg\": tokens.bg,\n \"--nb-table-hover\": tokens.bgSubtle,\n \"--nb-table-border\": `${tokens.borderWidth} solid ${tokens.border}`,\n \"--nb-table-size\": tokens.textSmSize,\n \"--nb-table-line\": tokens.textSmLine,\n \"--nb-table-xs\": tokens.textXsSize,\n \"--nb-table-semibold\": tokens.weightSemibold,\n };\n\n if (data.length === 0 && empty !== undefined) {\n return <>{empty}</>;\n }\n\n const tableStyle: StyleWithVars = { ...vars, ...style };\n\n return (\n <table className={`nb-table ${className ?? \"\"}`.trim()} style={tableStyle} {...rest}>\n <thead>\n <tr>\n {columns.map((col) => (\n <th\n key={col.key}\n scope=\"col\"\n style={{ width: col.width, textAlign: col.align ?? \"left\" }}\n >\n {col.header}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {data.map((row, i) => {\n const clickable = Boolean(onRowClick);\n return (\n <tr\n key={rowKey(row, i)}\n className={clickable ? \"nb-table__row--clickable\" : undefined}\n tabIndex={clickable ? 0 : undefined}\n onClick={clickable ? () => onRowClick?.(row, i) : undefined}\n onKeyDown={\n clickable\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onRowClick?.(row, i);\n }\n }\n : undefined\n }\n >\n {columns.map((col) => (\n <td key={col.key} style={{ textAlign: col.align ?? \"left\" }}>\n {col.render(row, i)}\n </td>\n ))}\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n}\n","/**\n * AppFrame — the universal app chrome: a fixed header, a scrollable body, and\n * an optional fixed footer, filling the iframe pane. Every Synapse app uses it;\n * a body layout (SidebarLayout, ListView, …) goes inside `AppFrame.Body`.\n *\n * The shell fills the pane with `height: 100%`, which needs a definite-height\n * ancestor chain (`#root` → `body` → `html`) — something a bare app document\n * does not supply on its own. So AppFrame establishes that chain itself on\n * render via `injectBaseReset()`; without it the shell would collapse to\n * content height. Apps wanting the chain before first paint can also\n * `import \"@nimblebrain/synapse/ui/base\"` in their entry.\n *\n * The `contentWidth` knob is a personality lever: `reading` centers header,\n * body, and footer in a ~760px column (Conversations, Research), while `full`\n * uses the whole pane (CRM, dashboards). Header/body/footer share the same\n * column so the composition reads as one page.\n */\n\nimport {\n type CSSProperties,\n createContext,\n type HTMLAttributes,\n type ReactNode,\n useContext,\n} from \"react\";\nimport { injectBaseReset } from \"../internal/base-reset.js\";\nimport { tokens } from \"../tokens.js\";\n\ntype ContentWidth = \"reading\" | \"full\";\nconst READING_MAX = 760;\nconst ContentWidthCtx = createContext<ContentWidth>(\"full\");\n\nfunction columnStyle(width: ContentWidth): CSSProperties {\n return width === \"reading\" ? { maxWidth: READING_MAX, marginInline: \"auto\", width: \"100%\" } : {};\n}\n\ninterface AppFrameProps extends HTMLAttributes<HTMLDivElement> {\n contentWidth?: ContentWidth;\n children?: ReactNode;\n}\n\nfunction AppFrameRoot({ contentWidth = \"full\", style, children, ...rest }: AppFrameProps) {\n // The shell's `height: 100%` only resolves against a definite-height ancestor\n // chain; supply it (same render-time pattern as the components' `ensureStyle`).\n injectBaseReset();\n return (\n <ContentWidthCtx.Provider value={contentWidth}>\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n minHeight: 0,\n background: tokens.bg,\n color: tokens.fg,\n fontFamily: tokens.fontSans,\n ...style,\n }}\n {...rest}\n >\n {children}\n </div>\n </ContentWidthCtx.Provider>\n );\n}\n\nfunction Header({ style, children, ...rest }: HTMLAttributes<HTMLElement>) {\n const width = useContext(ContentWidthCtx);\n return (\n <header style={{ flexShrink: 0, padding: \"1.25rem 1.5rem 0.75rem\", ...style }} {...rest}>\n <div style={columnStyle(width)}>{children}</div>\n </header>\n );\n}\n\ninterface BodyProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * Host a full-bleed body layout (SidebarLayout, BoardLayout) edge-to-edge:\n * no padding, no reading column, and the body itself doesn't scroll — the\n * layout's panes manage their own scroll. Leave off for plain content\n * (lists, forms), which get the padded reading/full column.\n */\n bleed?: boolean;\n}\n\nfunction Body({ bleed = false, style, children, ...rest }: BodyProps) {\n const width = useContext(ContentWidthCtx);\n if (bleed) {\n return (\n <div\n style={{\n flex: 1,\n minHeight: 0,\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n ...style,\n }}\n {...rest}\n >\n {children}\n </div>\n );\n }\n return (\n <div style={{ flex: 1, minHeight: 0, overflowY: \"auto\", ...style }} {...rest}>\n <div style={{ ...columnStyle(width), padding: \"0.75rem 1.5rem 1.5rem\" }}>{children}</div>\n </div>\n );\n}\n\nfunction Footer({ style, children, ...rest }: HTMLAttributes<HTMLElement>) {\n const width = useContext(ContentWidthCtx);\n return (\n <footer\n style={{\n flexShrink: 0,\n padding: \"0.75rem 1.5rem\",\n borderTop: `${tokens.borderWidth} solid ${tokens.border}`,\n ...style,\n }}\n {...rest}\n >\n <div style={columnStyle(width)}>{children}</div>\n </footer>\n );\n}\n\n/** `AppFrame` with `.Header`, `.Body`, `.Footer` slots. */\nexport const AppFrame = Object.assign(AppFrameRoot, { Header, Body, Footer });\n","/**\n * `useBreakpoint` — responsive hook keyed to an element's OWN width, not the\n * device viewport. Synapse apps render in an iframe pane whose width the host\n * controls (fullscreen, split, or a narrow sidebar), so layouts must react to\n * the space they're actually given.\n *\n * Attach the returned `ref` to the element whose width drives the decision.\n * Width is measured synchronously on mount (no first-frame flash) and kept live\n * via `ResizeObserver`. SSR/test-safe: without a DOM/`ResizeObserver` it simply\n * reports `isNarrow: false`.\n */\n\nimport { type RefObject, useLayoutEffect, useRef, useState } from \"react\";\n\nexport function useBreakpoint<T extends HTMLElement = HTMLDivElement>(\n breakpoint: number,\n): { ref: RefObject<T | null>; isNarrow: boolean } {\n const ref = useRef<T>(null);\n const [width, setWidth] = useState<number | null>(null);\n\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el) return;\n // Synchronous initial measure — runs before paint, so the first painted\n // frame already reflects the real width. Border-box, matching the observer\n // below (so there's no jump on the first resize if the element has padding).\n setWidth(el.getBoundingClientRect().width);\n if (typeof ResizeObserver === \"undefined\") return;\n const ro = new ResizeObserver((entries) => {\n const entry = entries[0];\n const w = entry?.borderBoxSize?.[0]?.inlineSize ?? entry?.contentRect.width;\n if (typeof w === \"number\") setWidth(w);\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n return { ref, isNarrow: width !== null && width < breakpoint };\n}\n","/**\n * ListDetailLayout — a master list beside a detail pane (CRM contacts → record,\n * Research runs → report, conversations → thread). Responsive to the layout's\n * own width: side-by-side when wide; below `breakpoint` it shows one at a time —\n * the list, or the detail when something is `selected`, with a `Back`\n * affordance to return.\n *\n * `selected` is driven by the app's own selection state. Place\n * `<ListDetailLayout.Back />` at the top of `Detail`; it renders only on a\n * narrow pane and calls `onBack`.\n */\n\nimport { createContext, type HTMLAttributes, type ReactNode, useContext } from \"react\";\nimport { TextLink } from \"../components/Button.js\";\nimport { tokens } from \"../tokens.js\";\nimport { useBreakpoint } from \"./use-container-width.js\";\n\ninterface ListDetailState {\n collapsed: boolean;\n selected: boolean;\n listWidth: number | string;\n onBack?: () => void;\n}\n\nconst ListDetailCtx = createContext<ListDetailState | null>(null);\n\n/** Read the list/detail responsive state — for custom back affordances. */\nexport function useListDetail(): ListDetailState {\n const ctx = useContext(ListDetailCtx);\n if (!ctx) throw new Error(\"useListDetail must be used within <ListDetailLayout>\");\n return ctx;\n}\n\ninterface ListDetailLayoutProps extends HTMLAttributes<HTMLDivElement> {\n /** Is a detail open? Drives which pane shows on a narrow layout. */\n selected?: boolean;\n /** Called by `Back` (and custom triggers) to return to the list when narrow. */\n onBack?: () => void;\n /** Master list width when side-by-side. Default 320. */\n listWidth?: number | string;\n /** Collapse to one-at-a-time below this layout width (px). Default 720. */\n breakpoint?: number;\n children?: ReactNode;\n}\n\nfunction ListDetailLayoutRoot({\n selected = false,\n onBack,\n listWidth = 320,\n breakpoint = 720,\n style,\n children,\n ...rest\n}: ListDetailLayoutProps) {\n const { ref, isNarrow } = useBreakpoint<HTMLDivElement>(breakpoint);\n return (\n <ListDetailCtx.Provider value={{ collapsed: isNarrow, selected, listWidth, onBack }}>\n <div\n ref={ref}\n style={{ display: \"flex\", flexDirection: \"row\", height: \"100%\", minHeight: 0, ...style }}\n {...rest}\n >\n {children}\n </div>\n </ListDetailCtx.Provider>\n );\n}\n\nfunction List({ style, children, ...rest }: HTMLAttributes<HTMLElement>) {\n const { collapsed, selected, listWidth } = useListDetail();\n if (collapsed && selected) return null; // detail has the stage\n const border = `${tokens.borderWidth} solid ${tokens.border}`;\n return (\n <section\n style={{\n // Clip horizontally, scroll vertically. A too-wide child (e.g. an\n // auto-layout <table> that won't shrink below its content) would\n // otherwise spill out of this fixed-width rail and paint over the\n // detail pane. `minWidth: 0` lets the rail participate in flex\n // sizing without being forced wider by its content.\n overflow: \"hidden auto\",\n ...(collapsed\n ? { flex: 1, minWidth: 0 }\n : { width: listWidth, minWidth: 0, flexShrink: 0, borderRight: border }),\n ...style,\n }}\n {...rest}\n >\n {children}\n </section>\n );\n}\n\nfunction Detail({ style, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n const { collapsed, selected } = useListDetail();\n if (collapsed && !selected) return null; // list has the stage\n return (\n <div style={{ flex: 1, minWidth: 0, minHeight: 0, overflowY: \"auto\", ...style }} {...rest}>\n {children}\n </div>\n );\n}\n\ninterface BackProps {\n children?: ReactNode;\n style?: React.CSSProperties;\n}\n\n/** \"← Back\" affordance — renders only on a narrow pane with a detail open. */\nfunction Back({ children, style }: BackProps) {\n const { collapsed, selected, onBack } = useListDetail();\n if (!collapsed || !selected) return null;\n return (\n <TextLink onClick={() => onBack?.()} style={{ marginBottom: \"0.5rem\", ...style }}>\n {children ?? \"← Back\"}\n </TextLink>\n );\n}\n\n/** `ListDetailLayout` with `.List`, `.Detail`, and `.Back` slots. */\nexport const ListDetailLayout = Object.assign(ListDetailLayoutRoot, { List, Detail, Back });\n","/**\n * SidebarLayout — the responsive two-column layout for inside an app pane: a\n * nav/list rail plus main content. It reacts to the layout's OWN width (not the\n * device), and below `breakpoint` collapses one of two ways:\n *\n * - `reflow` (default) — the rail moves to a horizontal strip on top and the\n * content goes full-width. Best for short navs (a settings page's sections).\n * - `drawer` — the rail becomes an off-canvas overlay opened by a `Trigger`.\n * Best for long lists (a document browser) where reflowing would be absurd.\n *\n * Place nav items as flat children of `Sidebar`; it controls direction\n * (column when expanded, row when reflowed). For `drawer`, place a\n * `<SidebarLayout.Trigger />` *inside* the layout (e.g. a toolbar in `Main`) —\n * in v1 the open-state context lives on `SidebarLayout`, so the trigger must be\n * within it, NOT in a sibling `AppFrame.Header`. Or read state via `useSidebar()`.\n * (Header placement would need a hoisted provider — a deliberate later refinement.)\n */\n\nimport {\n type ButtonHTMLAttributes,\n type CSSProperties,\n createContext,\n type HTMLAttributes,\n type ReactNode,\n useContext,\n useEffect,\n useState,\n} from \"react\";\nimport { ensureStyle } from \"../internal/inject-style.js\";\nimport { type StyleWithVars, tokens } from \"../tokens.js\";\nimport { useBreakpoint } from \"./use-container-width.js\";\n\ntype CollapseMode = \"reflow\" | \"drawer\";\ntype Side = \"left\" | \"right\";\n\ninterface SidebarState {\n collapsed: boolean;\n mode: CollapseMode;\n side: Side;\n width: number | string;\n open: boolean;\n setOpen: (open: boolean) => void;\n}\n\nconst SidebarCtx = createContext<SidebarState | null>(null);\n\n/** Read the sidebar's responsive state — for custom triggers or nav re-orientation. */\nexport function useSidebar(): SidebarState {\n const ctx = useContext(SidebarCtx);\n if (!ctx) throw new Error(\"useSidebar must be used within <SidebarLayout>\");\n return ctx;\n}\n\nconst STYLE_ID = \"nb-synapse-sidebarlayout\";\n// Distinct class names from the Drawer component (which owns `.nb-drawer`).\nconst RULES = `\n.nb-sidebar-drawer { transition: transform 220ms cubic-bezier(0.2, 0, 0, 1); }\n.nb-sidebar-scrim { animation: nb-sidebar-fade 180ms ease; }\n@keyframes nb-sidebar-fade { from { opacity: 0; } to { opacity: 1; } }\n@media (prefers-reduced-motion: reduce) {\n .nb-sidebar-drawer { transition: none; }\n .nb-sidebar-scrim { animation: none; }\n}\n`;\n\ninterface SidebarLayoutProps extends HTMLAttributes<HTMLDivElement> {\n side?: Side;\n /** Expanded rail / drawer width. Default 240. */\n width?: number | string;\n /** Collapse below this pane width (px). Default 640. */\n breakpoint?: number;\n collapseMode?: CollapseMode;\n children?: ReactNode;\n}\n\nfunction SidebarLayoutRoot({\n side = \"left\",\n width = 240,\n breakpoint = 640,\n collapseMode = \"reflow\",\n style,\n children,\n ...rest\n}: SidebarLayoutProps) {\n const { ref, isNarrow } = useBreakpoint<HTMLDivElement>(breakpoint);\n const [open, setOpen] = useState(false);\n\n // Close the drawer on Escape.\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setOpen(false);\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [open]);\n\n // Collapsing back to expanded should drop any open drawer state.\n useEffect(() => {\n if (!isNarrow && open) setOpen(false);\n }, [isNarrow, open]);\n\n const reflowed = isNarrow && collapseMode === \"reflow\";\n const rootStyle: CSSProperties = {\n position: \"relative\",\n display: \"flex\",\n flexDirection: reflowed ? \"column\" : side === \"right\" ? \"row-reverse\" : \"row\",\n height: \"100%\",\n minHeight: 0,\n ...style,\n };\n\n return (\n <SidebarCtx.Provider\n value={{ collapsed: isNarrow, mode: collapseMode, side, width, open, setOpen }}\n >\n <div ref={ref} style={rootStyle} {...rest}>\n {children}\n </div>\n </SidebarCtx.Provider>\n );\n}\n\nfunction Sidebar({ style, children, ...rest }: HTMLAttributes<HTMLElement>) {\n const { collapsed, mode, side, width, open, setOpen } = useSidebar();\n ensureStyle(STYLE_ID, RULES);\n\n // Expanded: a fixed-width rail beside the content.\n if (!collapsed) {\n const border = `${tokens.borderWidth} solid ${tokens.border}`;\n return (\n <aside\n style={{\n width,\n flexShrink: 0,\n overflowY: \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.125rem\",\n padding: \"0.5rem 0.5rem\",\n ...(side === \"right\" ? { borderLeft: border } : { borderRight: border }),\n ...style,\n }}\n {...rest}\n >\n {children}\n </aside>\n );\n }\n\n // Reflowed: a horizontal strip on top, content below.\n if (mode === \"reflow\") {\n return (\n <aside\n style={{\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: \"0.25rem\",\n width: \"100%\",\n overflowX: \"auto\",\n padding: \"0.5rem 0.75rem\",\n borderBottom: `${tokens.borderWidth} solid ${tokens.border}`,\n ...style,\n }}\n {...rest}\n >\n {children}\n </aside>\n );\n }\n\n // Drawer: off-canvas overlay + scrim.\n const closed = side === \"right\" ? \"translateX(100%)\" : \"translateX(-100%)\";\n const drawerStyle: StyleWithVars = {\n position: \"absolute\",\n top: 0,\n bottom: 0,\n [side]: 0,\n width,\n maxWidth: \"85%\",\n overflowY: \"auto\",\n background: tokens.bgRaised,\n boxShadow: tokens.shadowLg,\n transform: open ? \"translateX(0)\" : closed,\n zIndex: 11,\n ...(side === \"right\"\n ? { borderLeft: `${tokens.borderWidth} solid ${tokens.border}` }\n : { borderRight: `${tokens.borderWidth} solid ${tokens.border}` }),\n ...style,\n };\n return (\n <>\n {open ? (\n <button\n type=\"button\"\n aria-label=\"Close sidebar\"\n className=\"nb-sidebar-scrim\"\n onClick={() => setOpen(false)}\n style={{\n position: \"absolute\",\n inset: 0,\n border: \"none\",\n padding: 0,\n cursor: \"pointer\",\n background: \"rgba(0,0,0,0.32)\",\n zIndex: 10,\n }}\n />\n ) : null}\n {/* `inert` when closed removes the off-canvas rail from the tab order and\n the a11y tree (vs `aria-hidden`, which leaves focusables reachable). */}\n <aside className=\"nb-sidebar-drawer\" inert={!open} style={drawerStyle} {...rest}>\n {children}\n </aside>\n </>\n );\n}\n\nfunction Main({ style, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div style={{ flex: 1, minWidth: 0, minHeight: 0, overflowY: \"auto\", ...style }} {...rest}>\n {children}\n </div>\n );\n}\n\ninterface TriggerProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Override the default hamburger glyph. */\n children?: ReactNode;\n}\n\n/**\n * Hamburger that opens the drawer. Renders only when collapsed in `drawer`\n * mode, and only when it can see a `SidebarLayout` context — so it's safe to\n * place anywhere inside the layout subtree (it no-ops elsewhere). Note: in v1\n * the context lives on `SidebarLayout` itself, so the trigger must sit inside\n * it (e.g. a toolbar in `Main`), not in a sibling `AppFrame.Header`.\n */\nfunction Trigger({ children, style, onClick, ...rest }: TriggerProps) {\n const ctx = useContext(SidebarCtx);\n if (!ctx?.collapsed || ctx.mode !== \"drawer\") return null;\n const { open, setOpen } = ctx;\n return (\n <button\n type=\"button\"\n aria-label=\"Toggle sidebar\"\n aria-expanded={open}\n onClick={(e) => {\n setOpen(!open);\n onClick?.(e);\n }}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 32,\n height: 32,\n border: \"none\",\n background: \"transparent\",\n color: tokens.fg,\n cursor: \"pointer\",\n borderRadius: tokens.radiusSm,\n ...style,\n }}\n {...rest}\n >\n {children ?? (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" aria-hidden=\"true\">\n <path\n d=\"M2 4.5h14M2 9h14M2 13.5h14\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n )}\n </button>\n );\n}\n\n/** `SidebarLayout` with `.Sidebar`, `.Main`, and `.Trigger` slots. */\nexport const SidebarLayout = Object.assign(SidebarLayoutRoot, { Sidebar, Main, Trigger });\n"]}
1
+ {"version":3,"sources":["../../src/ui/tokens.ts","../../src/ui/components/Avatar.tsx","../../src/ui/components/Badge.tsx","../../src/ui/components/Button.tsx","../../src/ui/components/Card.tsx","../../src/ui/components/Drawer.tsx","../../src/ui/primitives.tsx","../../src/ui/typography.tsx","../../src/ui/components/EmptyState.tsx","../../src/ui/components/ListRow.tsx","../../src/ui/components/Pagination.tsx","../../src/ui/components/Prose.tsx","../../src/ui/components/SearchField.tsx","../../src/ui/components/SegmentedControl.tsx","../../src/ui/components/Spinner.tsx","../../src/ui/components/StatusDot.tsx","../../src/ui/components/Table.tsx","../../src/ui/layouts/AppFrame.tsx","../../src/ui/layouts/use-container-width.ts","../../src/ui/layouts/ListDetailLayout.tsx","../../src/ui/layouts/SidebarLayout.tsx"],"names":["jsx","STYLE_ID","RULES","useState","useEffect","TONE","jsxs","createContext","Header","useContext","Body","Footer","useRef","Fragment"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * The token contract for `@nimblebrain/synapse/ui`.\n *\n * Values are NOT brand hexes — they are `var(--token, fallback)` references to\n * the CSS custom properties the host injects into the app iframe (the MCP\n * ext-apps `hostContext.styles.variables`). Because styling resolves through\n * CSS variables, theme changes (including light↔dark) reflect automatically\n * with no React re-render: the host swaps the `:root` vars and every `var()`\n * re-resolves.\n *\n * The fallbacks are deliberately **neutral** (system fonts, neutral grays, a\n * generic blue) — NOT NimbleBrain brand. Brand arrives by injection when the\n * app runs inside the NimbleBrain host; standalone/static renders get a sane\n * unbranded default. This keeps the library host-agnostic.\n *\n * Components import the static `tokens` object and style with CSS `var()`, so\n * theming (incl. light/dark) resolves in CSS with no re-render.\n */\n\nimport type { CSSProperties } from \"react\";\n\n/** Resolved design tokens as CSS `var()` references with neutral fallbacks. */\nexport const tokens = {\n // ── Surfaces ──\n bg: \"var(--color-background-primary, #ffffff)\",\n bgRaised: \"var(--color-background-secondary, #fafafa)\",\n bgSubtle: \"var(--color-background-tertiary, #f3f4f6)\",\n\n // ── Text ──\n fg: \"var(--color-text-primary, #111827)\",\n fgMuted: \"var(--color-text-secondary, #6b7280)\",\n fgFaint: \"var(--color-text-tertiary, #9ca3af)\",\n accent: \"var(--color-text-accent, #2563eb)\",\n accentFg: \"var(--nb-color-accent-foreground, #ffffff)\",\n\n // ── Border / ring ──\n border: \"var(--color-border-primary, #e5e7eb)\",\n borderStrong: \"var(--color-border-secondary, #d1d5db)\",\n ring: \"var(--color-ring-primary, #2563eb)\",\n\n // ── Status / brand semantics ──\n danger: \"var(--nb-color-danger, #dc2626)\",\n success: \"var(--nb-color-success, #059669)\",\n warning: \"var(--nb-color-warning, #f59e0b)\",\n warm: \"var(--nb-color-warm, #d4620a)\",\n warmLight: \"var(--nb-color-warm-light, #fef5ee)\",\n processing: \"var(--nb-color-processing, #7c3aed)\",\n processingLight: \"var(--nb-color-processing-light, #f3eeff)\",\n infoLight: \"var(--nb-color-info-light, #eef4ff)\",\n\n // ── Typography ──\n fontSans: \"var(--font-sans, system-ui, -apple-system, BlinkMacSystemFont, sans-serif)\",\n fontMono: \"var(--font-mono, ui-monospace, SFMono-Regular, Menlo, monospace)\",\n fontHeading: \"var(--nb-font-heading, Georgia, 'Times New Roman', serif)\",\n weightNormal: \"var(--font-weight-normal, 400)\",\n weightMedium: \"var(--font-weight-medium, 500)\",\n weightSemibold: \"var(--font-weight-semibold, 600)\",\n weightBold: \"var(--font-weight-bold, 700)\",\n\n // ── Type scale (size + line-height pairs) ──\n textXsSize: \"var(--font-text-xs-size, 0.75rem)\",\n textXsLine: \"var(--font-text-xs-line-height, 1rem)\",\n textSmSize: \"var(--font-text-sm-size, 0.875rem)\",\n textSmLine: \"var(--font-text-sm-line-height, 1.25rem)\",\n textBaseSize: \"var(--font-text-base-size, 1rem)\",\n textBaseLine: \"var(--font-text-base-line-height, 1.5rem)\",\n textLgSize: \"var(--font-text-lg-size, 1.125rem)\",\n textLgLine: \"var(--font-text-lg-line-height, 1.75rem)\",\n headingSmSize: \"var(--font-heading-sm-size, 1.25rem)\",\n headingSmLine: \"var(--font-heading-sm-line-height, 1.75rem)\",\n headingMdSize: \"var(--font-heading-md-size, 1.5rem)\",\n headingMdLine: \"var(--font-heading-md-line-height, 2rem)\",\n headingLgSize: \"var(--font-heading-lg-size, 2rem)\",\n headingLgLine: \"var(--font-heading-lg-line-height, 2.5rem)\",\n\n // ── Radius / border width ──\n radiusXs: \"var(--border-radius-xs, 0.25rem)\",\n radiusSm: \"var(--border-radius-sm, 0.5rem)\",\n radiusMd: \"var(--border-radius-md, 0.75rem)\",\n radiusLg: \"var(--border-radius-lg, 1rem)\",\n radiusXl: \"var(--border-radius-xl, 1.5rem)\",\n borderWidth: \"var(--border-width-regular, 1px)\",\n\n // ── Shadows ──\n shadowHairline: \"var(--shadow-hairline, 0 0 0 1px rgba(0,0,0,0.06))\",\n shadowSm: \"var(--shadow-sm, 0 1px 2px rgba(0,0,0,0.05))\",\n shadowMd: \"var(--shadow-md, 0 4px 6px -1px rgba(0,0,0,0.1))\",\n shadowLg: \"var(--shadow-lg, 0 10px 15px -3px rgba(0,0,0,0.1))\",\n} as const;\n\nexport type Tokens = typeof tokens;\n\n/**\n * A style object that also permits CSS custom properties (`--foo`). React's\n * `CSSProperties` rejects custom-property keys; components that set CSS vars\n * inline (for `:hover`/keyframe plumbing) type their style as this, then pass\n * it to `style` (it down-casts cleanly to `CSSProperties`).\n */\nexport type StyleWithVars = CSSProperties & Record<`--${string}`, string | number>;\n\n/** Body text sizes. */\nexport type TextSize = \"xs\" | \"sm\" | \"base\" | \"lg\";\n/** Heading sizes. */\nexport type HeadingSize = \"sm\" | \"md\" | \"lg\";\n\nconst TEXT_SCALE: Record<TextSize, CSSProperties> = {\n xs: { fontSize: tokens.textXsSize, lineHeight: tokens.textXsLine },\n sm: { fontSize: tokens.textSmSize, lineHeight: tokens.textSmLine },\n base: { fontSize: tokens.textBaseSize, lineHeight: tokens.textBaseLine },\n lg: { fontSize: tokens.textLgSize, lineHeight: tokens.textLgLine },\n};\n\nconst HEADING_SCALE: Record<HeadingSize, CSSProperties> = {\n sm: { fontSize: tokens.headingSmSize, lineHeight: tokens.headingSmLine },\n md: { fontSize: tokens.headingMdSize, lineHeight: tokens.headingMdLine },\n lg: { fontSize: tokens.headingLgSize, lineHeight: tokens.headingLgLine },\n};\n\n/** `{ fontSize, lineHeight }` for a body-text level. */\nexport function textStyle(size: TextSize): CSSProperties {\n return TEXT_SCALE[size];\n}\n\n/** `{ fontSize, lineHeight }` for a heading level. */\nexport function headingStyle(size: HeadingSize): CSSProperties {\n return HEADING_SCALE[size];\n}\n","/**\n * Avatar — a circular identity chip. Renders an image when `src` is given,\n * otherwise initials derived from `name` on a subtle tinted background.\n */\n\nimport { type HTMLAttributes, useEffect, useState } from \"react\";\nimport { tokens } from \"../tokens.js\";\n\n/** Up to two initials from a name (\"Jordan Ratner\" → \"JR\", \"mat\" → \"M\"). */\nfunction initialsOf(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return \"?\";\n const first = parts[0] ?? \"\";\n if (parts.length === 1) return first.charAt(0).toUpperCase();\n const last = parts[parts.length - 1] ?? \"\";\n return (first.charAt(0) + last.charAt(0)).toUpperCase();\n}\n\ninterface AvatarProps extends Omit<HTMLAttributes<HTMLSpanElement>, \"children\"> {\n /** Name used for initials and the image alt text. */\n name: string;\n /** Optional image URL; falls back to initials when absent or on error. */\n src?: string;\n /** Diameter in px. Default 28. */\n size?: number;\n}\n\nexport function Avatar({ name, src, size = 28, style, ...rest }: AvatarProps) {\n // Fall back to initials if the image fails to load. Reset on `src` change.\n const [failed, setFailed] = useState(false);\n // biome-ignore lint/correctness/useExhaustiveDependencies: reset only when src changes\n useEffect(() => setFailed(false), [src]);\n const showImage = Boolean(src) && !failed;\n return (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n width: size,\n height: size,\n borderRadius: \"50%\",\n overflow: \"hidden\",\n background: tokens.bgSubtle,\n color: tokens.fgMuted,\n fontFamily: tokens.fontSans,\n fontSize: Math.round(size * 0.4),\n fontWeight: tokens.weightSemibold,\n userSelect: \"none\",\n ...style,\n }}\n {...rest}\n >\n {showImage ? (\n <img\n src={src}\n alt={name}\n width={size}\n height={size}\n onError={() => setFailed(true)}\n style={{ width: \"100%\", height: \"100%\", objectFit: \"cover\" }}\n />\n ) : (\n initialsOf(name)\n )}\n </span>\n );\n}\n","/**\n * Badge — a small pill for status and priority labels (e.g. MEDIUM/HIGH,\n * open/resolved). Soft tinted background with a same-hue label.\n */\n\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { tokens } from \"../tokens.js\";\n\nexport type BadgeTone =\n | \"neutral\"\n | \"accent\"\n | \"success\"\n | \"warning\"\n | \"danger\"\n | \"processing\"\n | \"warm\";\n\n/** `{ bg, fg }` per tone. Soft tinted background, same-hue label. The status\n * tones have no `*Light` token so their tint is derived from the fg color. */\nconst TONE: Record<BadgeTone, { bg: string; fg: string }> = {\n neutral: { bg: tokens.bgSubtle, fg: tokens.fgMuted },\n accent: { bg: tokens.infoLight, fg: tokens.accent },\n success: { bg: `color-mix(in oklab, ${tokens.success} 14%, transparent)`, fg: tokens.success },\n warning: { bg: `color-mix(in oklab, ${tokens.warning} 14%, transparent)`, fg: tokens.warning },\n danger: { bg: `color-mix(in oklab, ${tokens.danger} 14%, transparent)`, fg: tokens.danger },\n processing: { bg: tokens.processingLight, fg: tokens.processing },\n warm: { bg: tokens.warmLight, fg: tokens.warm },\n};\n\ninterface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n tone?: BadgeTone;\n children?: ReactNode;\n}\n\nexport function Badge({ tone = \"neutral\", style, children, ...rest }: BadgeProps) {\n const { bg, fg } = TONE[tone];\n return (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"0.25rem\",\n padding: \"0.1rem 0.45rem\",\n borderRadius: tokens.radiusXs,\n background: bg,\n color: fg,\n fontFamily: tokens.fontSans,\n fontSize: tokens.textXsSize,\n lineHeight: tokens.textXsLine,\n fontWeight: tokens.weightSemibold,\n letterSpacing: \"0.02em\",\n textTransform: \"uppercase\",\n whiteSpace: \"nowrap\",\n ...style,\n }}\n {...rest}\n >\n {children}\n </span>\n );\n}\n","/**\n * Button and TextLink. Pseudo-states (`:hover`/`:active`/`:disabled`) live in a\n * once-injected stylesheet that reads token-driven CSS custom properties set\n * inline — so the base values stay token-driven while hover still works.\n */\n\nimport type { ButtonHTMLAttributes, ReactNode } from \"react\";\nimport { ensureStyle } from \"../internal/inject-style.js\";\nimport { type StyleWithVars, tokens } from \"../tokens.js\";\n\nconst STYLE_ID = \"nb-synapse-button\";\nconst RULES = `\n.nb-btn {\n --nb-btn-bg: transparent;\n --nb-btn-bg-hover: transparent;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.4rem;\n border: var(--nb-btn-border, none);\n border-radius: var(--nb-btn-radius);\n background: var(--nb-btn-bg);\n color: var(--nb-btn-fg);\n font-family: var(--nb-btn-font);\n font-weight: var(--nb-btn-weight);\n cursor: pointer;\n transition: background 130ms ease, color 130ms ease, opacity 130ms ease;\n white-space: nowrap;\n}\n.nb-btn:hover { background: var(--nb-btn-bg-hover); }\n.nb-btn:active { transform: translateY(0.5px); }\n.nb-btn:disabled { opacity: 0.5; cursor: default; }\n.nb-btn:disabled:hover { background: var(--nb-btn-bg); }\n.nb-textlink {\n border: none;\n background: none;\n padding: 0;\n cursor: pointer;\n font-family: var(--nb-tl-font);\n color: var(--nb-tl-fg);\n transition: color 130ms ease, opacity 130ms ease;\n}\n.nb-textlink:hover { color: var(--nb-tl-fg-hover); }\n.nb-textlink:disabled { opacity: 0.45; cursor: default; }\n`;\n\ntype Variant = \"primary\" | \"secondary\" | \"ghost\";\ntype Size = \"sm\" | \"md\";\n\nconst SIZE_PAD: Record<Size, string> = {\n sm: \"0.3rem 0.6rem\",\n md: \"0.45rem 0.85rem\",\n};\n\ninterface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: Variant;\n size?: Size;\n children?: ReactNode;\n}\n\nexport function Button({\n variant = \"primary\",\n size = \"md\",\n style,\n className,\n children,\n ...rest\n}: ButtonProps) {\n ensureStyle(STYLE_ID, RULES);\n const vars: Record<`--${string}`, string> = {\n \"--nb-btn-radius\": tokens.radiusSm,\n \"--nb-btn-font\": tokens.fontSans,\n \"--nb-btn-weight\": tokens.weightMedium,\n };\n if (variant === \"primary\") {\n vars[\"--nb-btn-bg\"] = tokens.accent;\n vars[\"--nb-btn-bg-hover\"] = `color-mix(in oklab, ${tokens.accent} 88%, black)`;\n vars[\"--nb-btn-fg\"] = tokens.accentFg;\n } else if (variant === \"secondary\") {\n vars[\"--nb-btn-bg\"] = tokens.bgSubtle;\n vars[\"--nb-btn-bg-hover\"] = tokens.bgRaised;\n vars[\"--nb-btn-fg\"] = tokens.fg;\n vars[\"--nb-btn-border\"] = `${tokens.borderWidth} solid ${tokens.border}`;\n } else {\n vars[\"--nb-btn-bg\"] = \"transparent\";\n vars[\"--nb-btn-bg-hover\"] = tokens.bgSubtle;\n vars[\"--nb-btn-fg\"] = tokens.fg;\n }\n const btnStyle: StyleWithVars = {\n ...vars,\n padding: SIZE_PAD[size],\n fontSize: size === \"sm\" ? tokens.textSmSize : tokens.textBaseSize,\n lineHeight: size === \"sm\" ? tokens.textSmLine : tokens.textBaseLine,\n ...style,\n };\n return (\n <button type=\"button\" className={`nb-btn ${className ?? \"\"}`.trim()} style={btnStyle} {...rest}>\n {children}\n </button>\n );\n}\n\ninterface TextLinkProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Resting tone. Hover always moves toward `accent` (or `danger`). */\n tone?: \"muted\" | \"default\" | \"danger\";\n children?: ReactNode;\n}\n\n/** A chrome-less text button — for back / delete / retry affordances. */\nexport function TextLink({ tone = \"muted\", style, className, children, ...rest }: TextLinkProps) {\n ensureStyle(STYLE_ID, RULES);\n const resting =\n tone === \"danger\" ? tokens.danger : tone === \"default\" ? tokens.fg : tokens.fgMuted;\n const hover = tone === \"danger\" ? tokens.danger : tokens.accent;\n const linkStyle: StyleWithVars = {\n \"--nb-tl-font\": tokens.fontSans,\n \"--nb-tl-fg\": resting,\n \"--nb-tl-fg-hover\": hover,\n fontSize: tokens.textXsSize,\n lineHeight: tokens.textXsLine,\n letterSpacing: \"0.02em\",\n ...style,\n };\n return (\n <button\n type=\"button\"\n className={`nb-textlink ${className ?? \"\"}`.trim()}\n style={linkStyle}\n {...rest}\n >\n {children}\n </button>\n );\n}\n","/**\n * Card — a raised surface with a hairline border. The default container for\n * grouped content (deal cards, task cards, panels). `interactive` adds a hover\n * lift via a once-injected stylesheet (no per-card handlers).\n */\n\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { ensureStyle } from \"../internal/inject-style.js\";\nimport { type StyleWithVars, tokens } from \"../tokens.js\";\n\nconst STYLE_ID = \"nb-synapse-card\";\nconst RULES = `\n.nb-card--interactive {\n cursor: pointer;\n transition: box-shadow 140ms ease, border-color 140ms ease;\n}\n.nb-card--interactive:hover {\n box-shadow: var(--nb-card-shadow-hover);\n border-color: var(--nb-card-border-hover);\n}\n`;\n\ninterface CardProps extends HTMLAttributes<HTMLDivElement> {\n /** Inner padding (CSS length or px number). Default `0.875rem`. */\n padding?: number | string;\n /** Lift on hover — for clickable cards. */\n interactive?: boolean;\n children?: ReactNode;\n}\n\nexport function Card({\n padding = \"0.875rem\",\n interactive = false,\n style,\n className,\n children,\n ...rest\n}: CardProps) {\n if (interactive) ensureStyle(STYLE_ID, RULES);\n const cardStyle: StyleWithVars = {\n background: tokens.bgRaised,\n border: `${tokens.borderWidth} solid ${tokens.border}`,\n borderRadius: tokens.radiusMd,\n padding,\n boxShadow: tokens.shadowSm,\n \"--nb-card-shadow-hover\": tokens.shadowMd,\n \"--nb-card-border-hover\": tokens.borderStrong,\n ...style,\n };\n return (\n <div\n className={interactive ? `nb-card--interactive ${className ?? \"\"}`.trim() : className}\n style={cardStyle}\n {...rest}\n >\n {children}\n </div>\n );\n}\n","/**\n * Drawer — an off-canvas overlay panel that slides in from an edge, over a\n * scrim. The general overlay the apps need (e.g. CRM's detail panel).\n *\n * A plain positioned `<div>` overlay — **not** a native `<dialog>`. The platform\n * mounts every app in a sandboxed iframe that withholds `allow-modals`, so\n * `HTMLDialogElement.showModal()` throws there and white-screens the app; a\n * `<dialog>` is unusable in the one environment these apps run in. So the panel\n * hand-rolls what `showModal()` gave for free: a scrim, a Tab/Shift+Tab focus\n * trap (while focus is inside the panel — not the full native `inert`; see the\n * scope note on the open effect and #43), focus-into-panel on open with focus\n * restored on close, background scroll lock, and Escape. Controlled via\n * `open`/`onClose` (renders nothing when closed). Escape routes through `onEscape`\n * (defaults to `onClose`); clicking the scrim calls `onClose`. The slide-in is a\n * CSS keyframe on the panel.\n *\n * Compose with the `Header` / `Body` / `Footer` slots, or pass plain children.\n * `Header` owns the standard affordances — `title` (a real heading, wired as\n * the dialog's accessible name), an optional `onBack` button, an `actions`\n * slot, and the close button — so consumers don't re-roll them. The icon\n * buttons grow to a 44px hit target under `@media (pointer: coarse)`, keyed to\n * input modality rather than viewport width.\n *\n * `side` is `right` (default), `left`, or `bottom` (a bottom sheet — full width,\n * content height capped at 92%). A multi-level \"panel stack\" (push/pop) is an\n * app concern built on top of this.\n */\n\nimport {\n createContext,\n type HTMLAttributes,\n type ReactNode,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { ensureStyle } from \"../internal/inject-style.js\";\nimport { type StyleWithVars, tokens } from \"../tokens.js\";\n\ntype Side = \"left\" | \"right\" | \"bottom\";\n\nconst STYLE_ID = \"nb-synapse-drawer\";\nconst RULES = `\n.nb-drawer-scrim {\n position: fixed; inset: 0; z-index: 1000;\n display: flex; background: rgba(0, 0, 0, 0.32);\n animation: nb-drawer-fade 200ms ease;\n}\n.nb-drawer-scrim--right { justify-content: flex-end; }\n.nb-drawer-scrim--left { justify-content: flex-start; }\n.nb-drawer-scrim--bottom { align-items: flex-end; }\n.nb-drawer {\n margin: 0; padding: 0; border: none; max-width: 92%;\n height: 100%; max-height: 100%; display: flex; flex-direction: column;\n outline: none;\n}\n.nb-drawer--bottom { width: 100%; max-width: 100%; height: auto; max-height: 92%; }\n.nb-drawer--right { animation: nb-drawer-in-right 240ms cubic-bezier(0.2, 0, 0, 1); }\n.nb-drawer--left { animation: nb-drawer-in-left 240ms cubic-bezier(0.2, 0, 0, 1); }\n.nb-drawer--bottom { animation: nb-drawer-in-bottom 240ms cubic-bezier(0.2, 0, 0, 1); }\n@keyframes nb-drawer-in-right { from { transform: translateX(100%); } }\n@keyframes nb-drawer-in-left { from { transform: translateX(-100%); } }\n@keyframes nb-drawer-in-bottom { from { transform: translateY(100%); } }\n@keyframes nb-drawer-fade { from { opacity: 0; } }\n.nb-drawer-iconbtn { width: 28px; height: 28px; }\n@media (pointer: coarse) {\n .nb-drawer-iconbtn { min-width: 44px; min-height: 44px; }\n}\n`;\n\n// A control inside a *closed* <details> (other than its own <summary>) is not\n// reachable, even though its tabIndex is 0 — the collapse is a UA `display:none`\n// on the disclosure content. It's structural (the `open` attribute + DOM\n// position), so it's detectable without layout and belongs in the filter below,\n// alongside `[hidden]` (also a UA `display:none` rule).\nfunction inClosedDetails(el: HTMLElement): boolean {\n const details = el.closest(\"details:not([open])\");\n if (!details) return false;\n const summary = details.querySelector(\"summary\");\n return !summary || !summary.contains(el);\n}\n\n// Tabbable elements inside the panel, in DOM order — the focus-trap boundary.\n// A broad candidate query filtered by a positive predicate, in place of a\n// `:not(...)` denylist that had to enumerate every non-tabbable case per clause.\n// The filter is the set of non-tabbable cases detectable *without layout*:\n// `tabIndex >= 0` rejects any negative tabindex, `:disabled` inherits through\n// `<fieldset disabled>`, `[hidden]` and closed-<details> collapse are tested on\n// the element and its ancestors. CSS-hidden focusables (`display:none` /\n// `visibility:hidden` set in a stylesheet) need layout to detect, so they're NOT\n// filtered (worst case: one Tab exits).\n//\n// CANDIDATES is an allowlist of mainstream focusables, not `*`: a bare `<a>` (no\n// href) reports tabIndex 0 but isn't focusable, so `*` would admit a phantom\n// boundary — `a[href]` is load-bearing. It is deliberately not exhaustive:\n// media/embeds (`<audio controls>`, `<iframe>`) and `[contenteditable]` are\n// omitted until a consumer needs one, to keep the set honest.\nconst CANDIDATES = \"a[href], button, input, select, textarea, summary, [tabindex]\";\nfunction tabbables(panel: HTMLElement): HTMLElement[] {\n return Array.from(panel.querySelectorAll<HTMLElement>(CANDIDATES)).filter(\n (el) =>\n el.tabIndex >= 0 &&\n !el.matches(\":disabled\") &&\n !el.closest(\"[hidden]\") &&\n !inClosedDetails(el) &&\n (el as HTMLInputElement).type !== \"hidden\",\n );\n}\n\ninterface DrawerContextValue {\n labelId: string;\n setHasTitle: (has: boolean) => void;\n}\n\nconst DrawerContext = createContext<DrawerContextValue | null>(null);\n\ninterface DrawerProps extends Omit<HTMLAttributes<HTMLDivElement>, \"onClick\"> {\n open: boolean;\n /** Called by the scrim and the Header close button. */\n onClose: () => void;\n /** Called on Escape. Defaults to `onClose` — override to do something else\n * (e.g. pop one level of a panel stack before closing). */\n onEscape?: () => void;\n side?: Side;\n /** Panel width (ignored for `side=\"bottom\"`, which is full width). Default 480. */\n width?: number | string;\n children?: ReactNode;\n}\n\nfunction DrawerRoot({\n open,\n onClose,\n onEscape,\n side = \"right\",\n width = 480,\n style,\n children,\n ...rest\n}: DrawerProps) {\n ensureStyle(STYLE_ID, RULES);\n const panelRef = useRef<HTMLDivElement>(null);\n const labelId = useId();\n // A `Header` with a `title` registers itself here so the panel can name\n // itself via `aria-labelledby` (preferred over a consumer-passed aria-label).\n const [hasTitle, setHasTitle] = useState(false);\n\n // Escape → onEscape (defaults to onClose). A window keydown listener replaces\n // the native <dialog> `onCancel`, which required showModal() — blocked in the\n // app iframe sandbox (no `allow-modals`).\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n (onEscape ?? onClose)();\n }\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [open, onEscape, onClose]);\n\n // On open: focus into the panel, lock background scroll, and trap Tab/Shift+Tab\n // within it (the focus-into + Tab containment showModal()'s top-layer gave).\n // Restore focus + scroll on close.\n //\n // Scope: this contains Tab while focus is *inside* the panel — the modal case.\n // It is NOT the full native `inert`: it doesn't recover focus that drops to\n // <body> when a focused child unmounts (that fires focusout, not focusin), nor\n // fence off portal'd overlays a consumer opens outside the panel. A\n // document-scoped focus backstop would do neither reliably and would yank focus\n // out of legitimate nested overlays — so full containment is a FocusScope-style\n // owner stack, deferred to #43.\n useEffect(() => {\n if (!open) return;\n const panel = panelRef.current;\n const previouslyFocused = document.activeElement as HTMLElement | null;\n panel?.focus();\n const { body } = document;\n const prevOverflow = body.style.overflow;\n body.style.overflow = \"hidden\";\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== \"Tab\" || !panel) return;\n const focusables = tabbables(panel);\n if (focusables.length === 0) {\n // Nothing tabbable inside — preventDefault keeps focus on the panel it's\n // already on (the open effect focused it), so Tab can't leave.\n e.preventDefault();\n return;\n }\n const first = focusables[0];\n const last = focusables[focusables.length - 1];\n const active = document.activeElement;\n if (e.shiftKey && (active === first || active === panel)) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && active === last) {\n e.preventDefault();\n first.focus();\n }\n };\n panel?.addEventListener(\"keydown\", onKeyDown);\n\n return () => {\n panel?.removeEventListener(\"keydown\", onKeyDown);\n body.style.overflow = prevOverflow;\n previouslyFocused?.focus?.();\n };\n }, [open]);\n\n const ctxValue = useMemo<DrawerContextValue>(() => ({ labelId, setHasTitle }), [labelId]);\n\n if (!open) return null;\n\n const isBottom = side === \"bottom\";\n const panelStyle: StyleWithVars = {\n ...(isBottom ? { width: \"100%\", maxWidth: \"100%\" } : { width }),\n background: tokens.bg,\n color: tokens.fg,\n boxShadow: tokens.shadowLg,\n outline: \"none\",\n ...(side === \"right\"\n ? { borderLeft: `${tokens.borderWidth} solid ${tokens.border}` }\n : side === \"left\"\n ? { borderRight: `${tokens.borderWidth} solid ${tokens.border}` }\n : { borderTop: `${tokens.borderWidth} solid ${tokens.border}` }),\n ...style,\n };\n\n return (\n <DrawerContext.Provider value={ctxValue}>\n {/* biome-ignore lint/a11y/useKeyWithClickEvents: scrim click is a bonus mouse affordance; Escape (the window keydown above) and the Header close button are the keyboard dismissal paths. */}\n {/* biome-ignore lint/a11y/noStaticElementInteractions: the scrim is a decorative dismissal backdrop; the panel below owns the dialog role/semantics. */}\n <div\n className={`nb-drawer-scrim nb-drawer-scrim--${side}`}\n onClick={(e) => {\n // A click whose target is the scrim itself (not the panel) dismisses.\n if (e.target === e.currentTarget) onClose();\n }}\n >\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={hasTitle ? labelId : undefined}\n tabIndex={-1}\n className={`nb-drawer nb-drawer--${side}`}\n style={panelStyle}\n {...rest}\n >\n {children}\n </div>\n </div>\n </DrawerContext.Provider>\n );\n}\n\ninterface HeaderProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n /**\n * Heading text — rendered as an `<h2>` and wired as the drawer's accessible\n * name. Renders **instead of** `children` (pass one or the other, not both).\n */\n title?: ReactNode;\n /** Show a leading back button (e.g. pop one level of a panel stack). */\n onBack?: () => void;\n /** Trailing controls placed before the close button. */\n actions?: ReactNode;\n /** Show a close button that calls this. */\n onClose?: () => void;\n children?: ReactNode;\n}\n\nfunction Header({ title, onBack, actions, onClose, style, children, ...rest }: HeaderProps) {\n const ctx = useContext(DrawerContext);\n const hasTitle = title != null;\n\n // Register the title's presence so the dialog can name itself via this h2.\n useEffect(() => {\n if (!ctx || !hasTitle) return;\n ctx.setHasTitle(true);\n return () => ctx.setHasTitle(false);\n }, [ctx, hasTitle]);\n\n return (\n <header\n style={{\n flexShrink: 0,\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.75rem\",\n padding: \"0.875rem 1rem\",\n borderBottom: `${tokens.borderWidth} solid ${tokens.border}`,\n fontFamily: tokens.fontSans,\n fontWeight: tokens.weightSemibold,\n color: tokens.fg,\n ...style,\n }}\n {...rest}\n >\n {onBack ? (\n <IconButton label=\"Back\" onClick={onBack}>\n <path\n d=\"M10 3L5 8l5 5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </IconButton>\n ) : null}\n {hasTitle ? (\n <h2\n id={ctx?.labelId}\n style={{\n flex: 1,\n minWidth: 0,\n margin: 0,\n fontFamily: tokens.fontSans,\n fontSize: tokens.textBaseSize,\n lineHeight: tokens.textBaseLine,\n fontWeight: tokens.weightSemibold,\n color: tokens.fg,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n }}\n >\n {title}\n </h2>\n ) : (\n <div style={{ flex: 1, minWidth: 0 }}>{children}</div>\n )}\n {actions ? (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.4rem\", flexShrink: 0 }}>\n {actions}\n </div>\n ) : null}\n {onClose ? (\n <IconButton label=\"Close\" onClick={onClose}>\n <path\n d=\"M4 4l8 8M12 4l-8 8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </IconButton>\n ) : null}\n </header>\n );\n}\n\n/** Shared 28px (→44px on coarse pointers) icon button for the header affordances. */\nfunction IconButton({\n label,\n onClick,\n children,\n}: {\n label: string;\n onClick: () => void;\n children: ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n aria-label={label}\n onClick={onClick}\n className=\"nb-drawer-iconbtn\"\n style={{\n flexShrink: 0,\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n border: \"none\",\n background: \"transparent\",\n color: tokens.fgMuted,\n cursor: \"pointer\",\n borderRadius: tokens.radiusSm,\n }}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n {children}\n </svg>\n </button>\n );\n}\n\nfunction Body({ style, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div style={{ flex: 1, minHeight: 0, overflowY: \"auto\", padding: \"1rem\", ...style }} {...rest}>\n {children}\n </div>\n );\n}\n\nfunction Footer({ style, children, ...rest }: HTMLAttributes<HTMLElement>) {\n return (\n <footer\n style={{\n flexShrink: 0,\n padding: \"0.75rem 1rem\",\n borderTop: `${tokens.borderWidth} solid ${tokens.border}`,\n ...style,\n }}\n {...rest}\n >\n {children}\n </footer>\n );\n}\n\n/** `Drawer` with `.Header`, `.Body`, `.Footer` slots. */\nexport const Drawer = Object.assign(DrawerRoot, { Header, Body, Footer });\n","/**\n * Layout primitives — the composition atoms. `Stack` (vertical) and `Inline`\n * (horizontal) replace ad-hoc `display:flex` style objects; `Spacer` and\n * `Divider` cover the two other recurring layout needs. Deliberately minimal\n * (no `Box`, no grid system) — the layout scaffolds handle page structure.\n */\n\nimport type { CSSProperties, HTMLAttributes, ReactNode } from \"react\";\nimport { tokens } from \"./tokens.js\";\n\ntype Align = \"start\" | \"center\" | \"end\" | \"stretch\" | \"baseline\";\ntype Justify = \"start\" | \"center\" | \"end\" | \"between\" | \"around\";\n\nconst ALIGN: Record<Align, CSSProperties[\"alignItems\"]> = {\n start: \"flex-start\",\n center: \"center\",\n end: \"flex-end\",\n stretch: \"stretch\",\n baseline: \"baseline\",\n};\n\nconst JUSTIFY: Record<Justify, CSSProperties[\"justifyContent\"]> = {\n start: \"flex-start\",\n center: \"center\",\n end: \"flex-end\",\n between: \"space-between\",\n around: \"space-around\",\n};\n\ninterface FlexProps extends HTMLAttributes<HTMLDivElement> {\n gap?: number | string;\n align?: Align;\n justify?: Justify;\n wrap?: boolean;\n children?: ReactNode;\n}\n\nfunction flexStyle(\n direction: \"row\" | \"column\",\n { gap, align, justify, wrap }: FlexProps,\n): CSSProperties {\n return {\n display: \"flex\",\n flexDirection: direction,\n gap,\n alignItems: align ? ALIGN[align] : undefined,\n justifyContent: justify ? JUSTIFY[justify] : undefined,\n flexWrap: wrap ? \"wrap\" : undefined,\n };\n}\n\n/** Vertical flex container with `gap`. Defaults to `align: stretch`. */\nexport function Stack({ gap, align, justify, wrap, style, children, ...rest }: FlexProps) {\n return (\n <div style={{ ...flexStyle(\"column\", { gap, align, justify, wrap }), ...style }} {...rest}>\n {children}\n </div>\n );\n}\n\n/** Horizontal flex container with `gap`. Defaults to `align: center`. */\nexport function Inline({\n gap,\n align = \"center\",\n justify,\n wrap,\n style,\n children,\n ...rest\n}: FlexProps) {\n return (\n <div style={{ ...flexStyle(\"row\", { gap, align, justify, wrap }), ...style }} {...rest}>\n {children}\n </div>\n );\n}\n\n/** Flexible gap that pushes siblings apart inside a `Stack`/`Inline`. */\nexport function Spacer({ style, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return <div style={{ flex: 1, ...style }} {...rest} />;\n}\n\ninterface DividerProps extends HTMLAttributes<HTMLDivElement> {\n orientation?: \"horizontal\" | \"vertical\";\n}\n\n/** A hairline rule using the border token. Horizontal by default. Decorative\n * (`aria-hidden`) — it's a visual divider, not a focusable/valued separator. */\nexport function Divider({ orientation = \"horizontal\", style, ...rest }: DividerProps) {\n const isVertical = orientation === \"vertical\";\n return (\n <div\n aria-hidden=\"true\"\n style={{\n flexShrink: 0,\n background: tokens.border,\n ...(isVertical\n ? { width: tokens.borderWidth, alignSelf: \"stretch\" }\n : { height: tokens.borderWidth, width: \"100%\" }),\n ...style,\n }}\n {...rest}\n />\n );\n}\n","/**\n * Typography components bound to the type scale and the sans/heading font\n * slots. `Text` for body copy, `Heading` for display type (uses the heading\n * font — Erode in the NimbleBrain host, a serif fallback elsewhere).\n */\n\nimport type { CSSProperties, ElementType, HTMLAttributes, ReactNode } from \"react\";\nimport { type HeadingSize, headingStyle, type TextSize, textStyle, tokens } from \"./tokens.js\";\n\ntype Tone = \"default\" | \"muted\" | \"faint\" | \"accent\" | \"danger\" | \"success\";\ntype Weight = \"normal\" | \"medium\" | \"semibold\" | \"bold\";\n\nconst TONE: Record<Tone, string> = {\n default: tokens.fg,\n muted: tokens.fgMuted,\n faint: tokens.fgFaint,\n accent: tokens.accent,\n danger: tokens.danger,\n success: tokens.success,\n};\n\nconst WEIGHT: Record<Weight, string> = {\n normal: tokens.weightNormal,\n medium: tokens.weightMedium,\n semibold: tokens.weightSemibold,\n bold: tokens.weightBold,\n};\n\ninterface TextProps extends Omit<HTMLAttributes<HTMLElement>, \"color\"> {\n size?: TextSize;\n weight?: Weight;\n tone?: Tone;\n mono?: boolean;\n /** Single-line ellipsis truncation. */\n truncate?: boolean;\n as?: ElementType;\n children?: ReactNode;\n}\n\n/** Body text. Defaults to base size, normal weight, primary tone, sans font. */\nexport function Text({\n size = \"base\",\n weight = \"normal\",\n tone = \"default\",\n mono = false,\n truncate = false,\n as: As = \"span\",\n style,\n children,\n ...rest\n}: TextProps) {\n const truncation: CSSProperties = truncate\n ? { overflow: \"hidden\", textOverflow: \"ellipsis\", whiteSpace: \"nowrap\" }\n : {};\n return (\n <As\n style={{\n margin: 0,\n fontFamily: mono ? tokens.fontMono : tokens.fontSans,\n fontWeight: WEIGHT[weight],\n color: TONE[tone],\n ...textStyle(size),\n ...truncation,\n ...style,\n }}\n {...rest}\n >\n {children}\n </As>\n );\n}\n\ninterface HeadingProps extends Omit<HTMLAttributes<HTMLHeadingElement>, \"color\"> {\n size?: HeadingSize;\n weight?: Weight;\n tone?: Tone;\n as?: ElementType;\n children?: ReactNode;\n}\n\n/** Display heading using the heading font slot. Defaults to md, semibold. */\nexport function Heading({\n size = \"md\",\n weight = \"semibold\",\n tone = \"default\",\n as: As = \"h2\",\n style,\n children,\n ...rest\n}: HeadingProps) {\n return (\n <As\n style={{\n margin: 0,\n fontFamily: tokens.fontHeading,\n fontWeight: WEIGHT[weight],\n color: TONE[tone],\n letterSpacing: \"-0.015em\",\n ...headingStyle(size),\n ...style,\n }}\n {...rest}\n >\n {children}\n </As>\n );\n}\n","/**\n * EmptyState — centered placeholder for empty lists/views. Optional icon,\n * title, description, and an action slot (e.g. a Button).\n */\n\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { Stack } from \"../primitives.js\";\nimport { tokens } from \"../tokens.js\";\nimport { Heading, Text } from \"../typography.js\";\n\ninterface EmptyStateProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n icon?: ReactNode;\n title?: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n}\n\nexport function EmptyState({ icon, title, description, action, style, ...rest }: EmptyStateProps) {\n return (\n <Stack\n align=\"center\"\n gap=\"0.5rem\"\n style={{\n textAlign: \"center\",\n padding: \"4rem 1.5rem\",\n color: tokens.fgMuted,\n ...style,\n }}\n {...rest}\n >\n {icon ? <div style={{ color: tokens.fgFaint, marginBottom: \"0.25rem\" }}>{icon}</div> : null}\n {title ? <Heading size=\"sm\">{title}</Heading> : null}\n {description ? (\n <Text size=\"sm\" tone=\"muted\" style={{ maxWidth: 360 }}>\n {description}\n </Text>\n ) : null}\n {action ? <div style={{ marginTop: \"0.75rem\" }}>{action}</div> : null}\n </Stack>\n );\n}\n","/**\n * ListRow — the recurring list item: an optional leading slot (status dot,\n * avatar), a title with optional meta line, and a trailing slot (timestamp,\n * actions). Rounded hover tint, flat at rest — the pattern Research,\n * Conversations, and the Collateral sidebar each re-rolled.\n */\n\nimport type { HTMLAttributes, KeyboardEvent, ReactNode } from \"react\";\nimport { ensureStyle } from \"../internal/inject-style.js\";\nimport { type StyleWithVars, tokens } from \"../tokens.js\";\n\nconst STYLE_ID = \"nb-synapse-listrow\";\nconst RULES = `\n.nb-listrow { transition: background 140ms ease; }\n.nb-listrow--interactive { cursor: pointer; }\n.nb-listrow--interactive:hover { background: var(--nb-listrow-hover); }\n`;\n\ninterface ListRowProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n title: ReactNode;\n /** Secondary line under the title. */\n meta?: ReactNode;\n /** Leading slot — e.g. a StatusDot or Avatar. */\n leading?: ReactNode;\n /** Trailing slot — e.g. a timestamp or actions. */\n trailing?: ReactNode;\n /** Enables pointer cursor + hover tint. */\n interactive?: boolean;\n}\n\nexport function ListRow({\n title,\n meta,\n leading,\n trailing,\n interactive = false,\n style,\n className,\n ...rest\n}: ListRowProps) {\n ensureStyle(STYLE_ID, RULES);\n const rowStyle: StyleWithVars = {\n \"--nb-listrow-hover\": tokens.bgSubtle,\n display: \"grid\",\n gridTemplateColumns: `${leading ? \"auto \" : \"\"}minmax(0, 1fr)${trailing ? \" auto\" : \"\"}`,\n columnGap: \"0.75rem\",\n alignItems: \"baseline\",\n padding: \"0.65rem 0.75rem\",\n borderRadius: tokens.radiusSm,\n ...style,\n };\n // When interactive, make the row keyboard-operable (matches Table's rows):\n // role=\"button\" + tabIndex, and Enter/Space synthesize the click that drives\n // the consumer's onClick (passed via ...rest). Placed before ...rest so a\n // consumer can still override any of these explicitly.\n const interactiveProps = interactive\n ? {\n role: \"button\",\n tabIndex: 0,\n onKeyDown: (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n e.currentTarget.click();\n }\n },\n }\n : {};\n return (\n <div\n className={`nb-listrow ${interactive ? \"nb-listrow--interactive\" : \"\"} ${className ?? \"\"}`.trim()}\n style={rowStyle}\n {...interactiveProps}\n {...rest}\n >\n {leading ? <div style={{ alignSelf: \"center\", display: \"flex\" }}>{leading}</div> : null}\n <div style={{ minWidth: 0 }}>\n <div\n style={{\n fontFamily: tokens.fontSans,\n fontSize: tokens.textBaseSize,\n lineHeight: tokens.textBaseLine,\n fontWeight: tokens.weightMedium,\n color: tokens.fg,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {title}\n </div>\n {meta ? (\n <div\n style={{\n marginTop: \"0.15rem\",\n fontFamily: tokens.fontSans,\n fontSize: tokens.textXsSize,\n lineHeight: tokens.textXsLine,\n color: tokens.fgMuted,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {meta}\n </div>\n ) : null}\n </div>\n {trailing ? (\n <div\n style={{\n alignSelf: \"center\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n fontSize: tokens.textXsSize,\n color: tokens.fgMuted,\n whiteSpace: \"nowrap\",\n }}\n >\n {trailing}\n </div>\n ) : null}\n </div>\n );\n}\n","/**\n * Pagination — chrome-less prev/next text links with a \"page X of Y\" counter.\n * 1-based `page`. Buttons disable at the ends.\n */\n\nimport type { HTMLAttributes } from \"react\";\nimport { Inline } from \"../primitives.js\";\nimport { tokens } from \"../tokens.js\";\nimport { TextLink } from \"./Button.js\";\n\ninterface PaginationProps extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n /** Current page, 1-based. */\n page: number;\n /** Total number of pages. */\n pageCount: number;\n onChange: (page: number) => void;\n}\n\nexport function Pagination({ page, pageCount, onChange, style, ...rest }: PaginationProps) {\n const total = Math.max(1, pageCount);\n const atStart = page <= 1;\n const atEnd = page >= total;\n return (\n <Inline\n justify=\"between\"\n style={{\n fontFamily: tokens.fontSans,\n fontSize: tokens.textXsSize,\n color: tokens.fgMuted,\n letterSpacing: \"0.02em\",\n ...style,\n }}\n {...rest}\n >\n <span style={{ fontVariantNumeric: \"tabular-nums\" }}>\n Page {page} of {total}\n </span>\n <Inline gap=\"1rem\">\n <TextLink disabled={atStart} onClick={() => onChange(page - 1)}>\n ← Prev\n </TextLink>\n <TextLink disabled={atEnd} onClick={() => onChange(page + 1)}>\n Next →\n </TextLink>\n </Inline>\n </Inline>\n );\n}\n","/**\n * Prose — a token-styled container for rendered rich text. It applies the\n * NimbleBrain reading typography (ported from the Research app's markdown\n * element map) to whatever HTML it wraps, via a once-injected scoped\n * stylesheet — so it stays dependency-free.\n *\n * Pass pre-rendered nodes as `children`, or a trusted HTML string as `html`.\n * Bring your own markdown parser (`marked`, `react-markdown`, …) upstream; this\n * owns the *styling*, not the parsing — keeping the SDK free of a parser dep.\n */\n\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { ensureStyle } from \"../internal/inject-style.js\";\nimport { tokens } from \"../tokens.js\";\n\nconst STYLE_ID = \"nb-synapse-prose\";\nconst RULES = `\n.nb-prose {\n font-family: ${tokens.fontSans};\n font-size: ${tokens.textBaseSize};\n line-height: 1.7;\n color: ${tokens.fg};\n}\n.nb-prose > :first-child { margin-top: 0; }\n.nb-prose > :last-child { margin-bottom: 0; }\n.nb-prose h1, .nb-prose h2 { font-family: ${tokens.fontHeading}; letter-spacing: -0.015em; color: ${tokens.fg}; }\n.nb-prose h1 { font-size: ${tokens.headingMdSize}; line-height: ${tokens.headingMdLine}; margin: 2rem 0 0.75rem; }\n.nb-prose h2 { font-size: ${tokens.headingSmSize}; line-height: ${tokens.headingSmLine}; margin: 1.75rem 0 0.5rem; }\n.nb-prose h3 { font-size: ${tokens.textBaseSize}; font-weight: ${tokens.weightSemibold}; margin: 1.5rem 0 0.35rem; color: ${tokens.fg}; }\n.nb-prose p { margin: 0 0 1rem; }\n.nb-prose ul, .nb-prose ol { margin: 0 0 1rem; padding-left: 1.25rem; }\n.nb-prose li { margin: 0.25rem 0; }\n.nb-prose a { color: ${tokens.accent}; text-decoration: underline; text-underline-offset: 2px; }\n.nb-prose blockquote { margin: 0 0 1rem; padding-left: 1rem; border-left: 2px solid ${tokens.accent}; color: ${tokens.fgMuted}; font-style: italic; }\n.nb-prose code { font-family: ${tokens.fontMono}; font-size: 0.88em; padding: 0.08rem 0.32rem; border-radius: ${tokens.radiusXs}; background: ${tokens.bgSubtle}; }\n.nb-prose pre { font-family: ${tokens.fontMono}; font-size: ${tokens.textSmSize}; line-height: 1.55; margin: 0 0 1.25rem; padding: 0.875rem 1rem; background: ${tokens.bgSubtle}; border-radius: ${tokens.radiusSm}; overflow-x: auto; }\n.nb-prose pre code { padding: 0; background: none; }\n.nb-prose hr { border: none; border-top: 1px solid ${tokens.border}; margin: 2rem 0; }\n.nb-prose strong { font-weight: ${tokens.weightSemibold}; }\n`;\n\ninterface ProseProps\n extends Omit<HTMLAttributes<HTMLDivElement>, \"children\" | \"dangerouslySetInnerHTML\"> {\n /** Trusted, pre-sanitized HTML string. */\n html?: string;\n children?: ReactNode;\n}\n\nexport function Prose({ html, children, className, ...rest }: ProseProps) {\n ensureStyle(STYLE_ID, RULES);\n const cls = `nb-prose ${className ?? \"\"}`.trim();\n if (html !== undefined) {\n // biome-ignore lint/security/noDangerouslySetInnerHtml: caller supplies trusted, pre-sanitized HTML by contract.\n return <div className={cls} dangerouslySetInnerHTML={{ __html: html }} {...rest} />;\n }\n return (\n <div className={cls} {...rest}>\n {children}\n </div>\n );\n}\n","/**\n * SearchField — a text input in two postures: `underline` (invisible at rest,\n * reveals an underline on focus — the Research editorial style) and `boxed`\n * (a bordered field). Focus styling lives in a once-injected stylesheet.\n */\n\nimport type { InputHTMLAttributes } from \"react\";\nimport { ensureStyle } from \"../internal/inject-style.js\";\nimport { type StyleWithVars, tokens } from \"../tokens.js\";\n\nconst STYLE_ID = \"nb-synapse-searchfield\";\nconst RULES = `\n.nb-search { font-family: var(--nb-search-font); color: var(--nb-search-fg); outline: none; }\n.nb-search::placeholder { color: var(--nb-search-placeholder); }\n.nb-search--underline {\n border: none;\n border-bottom: 1px solid transparent;\n background: transparent;\n padding: 0.3rem 0.1rem;\n transition: border-color 160ms ease;\n}\n.nb-search--underline:focus { border-bottom-color: var(--nb-search-accent); }\n.nb-search--boxed {\n border: 1px solid var(--nb-search-border);\n border-radius: var(--nb-search-radius);\n background: var(--nb-search-bg);\n padding: 0.4rem 0.6rem;\n transition: border-color 160ms ease, box-shadow 160ms ease;\n}\n.nb-search--boxed:focus {\n border-color: var(--nb-search-accent);\n box-shadow: 0 0 0 3px color-mix(in oklab, var(--nb-search-accent) 18%, transparent);\n}\n`;\n\ninterface SearchFieldProps extends InputHTMLAttributes<HTMLInputElement> {\n variant?: \"underline\" | \"boxed\";\n}\n\nexport function SearchField({\n variant = \"underline\",\n style,\n className,\n type = \"search\",\n ...rest\n}: SearchFieldProps) {\n ensureStyle(STYLE_ID, RULES);\n const fieldStyle: StyleWithVars = {\n \"--nb-search-font\": tokens.fontSans,\n \"--nb-search-fg\": tokens.fg,\n \"--nb-search-placeholder\": tokens.fgFaint,\n \"--nb-search-accent\": tokens.accent,\n \"--nb-search-border\": tokens.border,\n \"--nb-search-bg\": tokens.bgSubtle,\n \"--nb-search-radius\": tokens.radiusSm,\n fontSize: tokens.textSmSize,\n lineHeight: tokens.textSmLine,\n ...style,\n };\n return (\n <input\n type={type}\n className={`nb-search nb-search--${variant} ${className ?? \"\"}`.trim()}\n style={fieldStyle}\n {...rest}\n />\n );\n}\n","/**\n * SegmentedControl — the view-toggle pattern (Board/Table, All/Today/Week).\n * A small set of mutually-exclusive options; the active one gets a raised pill.\n */\n\nimport type { HTMLAttributes } from \"react\";\nimport { ensureStyle } from \"../internal/inject-style.js\";\nimport { type StyleWithVars, tokens } from \"../tokens.js\";\n\nconst STYLE_ID = \"nb-synapse-segmented\";\nconst RULES = `\n.nb-seg {\n display: inline-flex;\n gap: 2px;\n padding: 2px;\n border-radius: var(--nb-seg-radius);\n background: var(--nb-seg-track);\n}\n.nb-seg__btn {\n border: none;\n background: transparent;\n color: var(--nb-seg-fg);\n font-family: var(--nb-seg-font);\n font-weight: var(--nb-seg-weight);\n padding: 0.25rem 0.7rem;\n border-radius: calc(var(--nb-seg-radius) - 2px);\n cursor: pointer;\n transition: color 130ms ease, background 130ms ease;\n white-space: nowrap;\n}\n.nb-seg__btn:hover:not([aria-pressed=\"true\"]) { color: var(--nb-seg-fg-strong); }\n.nb-seg__btn[aria-pressed=\"true\"] {\n background: var(--nb-seg-active-bg);\n color: var(--nb-seg-fg-strong);\n box-shadow: var(--nb-seg-active-shadow);\n}\n`;\n\ninterface Option<T extends string> {\n label: string;\n value: T;\n}\n\ninterface SegmentedControlProps<T extends string>\n extends Omit<HTMLAttributes<HTMLDivElement>, \"onChange\"> {\n options: Option<T>[];\n value: T;\n onChange: (value: T) => void;\n}\n\nexport function SegmentedControl<T extends string>({\n options,\n value,\n onChange,\n style,\n className,\n ...rest\n}: SegmentedControlProps<T>) {\n ensureStyle(STYLE_ID, RULES);\n const trackStyle: StyleWithVars = {\n \"--nb-seg-radius\": tokens.radiusSm,\n \"--nb-seg-track\": tokens.bgSubtle,\n \"--nb-seg-fg\": tokens.fgMuted,\n \"--nb-seg-fg-strong\": tokens.fg,\n \"--nb-seg-font\": tokens.fontSans,\n \"--nb-seg-weight\": tokens.weightMedium,\n \"--nb-seg-active-bg\": tokens.bgRaised,\n \"--nb-seg-active-shadow\": tokens.shadowSm,\n fontSize: tokens.textSmSize,\n lineHeight: tokens.textSmLine,\n ...style,\n };\n return (\n // biome-ignore lint/a11y/useSemanticElements: role=\"group\" with aria-label is the correct grouping for a set of toggle buttons; <fieldset> would impose form semantics this control doesn't have.\n <div className={`nb-seg ${className ?? \"\"}`.trim()} role=\"group\" style={trackStyle} {...rest}>\n {options.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n className=\"nb-seg__btn\"\n aria-pressed={opt.value === value}\n onClick={() => onChange(opt.value)}\n >\n {opt.label}\n </button>\n ))}\n </div>\n );\n}\n","/**\n * Spinner — a minimal rotating indicator for inline/button loading states.\n */\n\nimport type { HTMLAttributes } from \"react\";\nimport { ensureStyle } from \"../internal/inject-style.js\";\nimport { type StyleWithVars, tokens } from \"../tokens.js\";\n\nconst STYLE_ID = \"nb-synapse-spinner\";\nconst RULES = `\n@keyframes nb-spin { to { transform: rotate(360deg); } }\n.nb-spinner { animation: nb-spin 0.7s linear infinite; }\n@media (prefers-reduced-motion: reduce) { .nb-spinner { animation-duration: 1.6s; } }\n`;\n\ninterface SpinnerProps extends HTMLAttributes<HTMLSpanElement> {\n /** Diameter in px. Default 16. */\n size?: number;\n /** Arc color. Defaults to the accent token. */\n color?: string;\n}\n\nexport function Spinner({ size = 16, color, style, className, ...rest }: SpinnerProps) {\n ensureStyle(STYLE_ID, RULES);\n const spinnerStyle: StyleWithVars = {\n display: \"inline-block\",\n flexShrink: 0,\n width: size,\n height: size,\n borderRadius: \"50%\",\n border: `2px solid ${tokens.border}`,\n borderTopColor: color ?? tokens.accent,\n boxSizing: \"border-box\",\n ...style,\n };\n return (\n <span\n className={`nb-spinner ${className ?? \"\"}`.trim()}\n role=\"status\"\n aria-label=\"Loading\"\n style={spinnerStyle}\n {...rest}\n />\n );\n}\n","/**\n * StatusDot — a small colored dot for run/task status. The `working` state\n * gets a living ripple-pulse (ported from the Research app), gated on\n * `prefers-reduced-motion`. Same component in list rows and detail headers so\n * status reads identically everywhere.\n */\n\nimport type { HTMLAttributes } from \"react\";\nimport { ensureStyle } from \"../internal/inject-style.js\";\nimport { type StyleWithVars, tokens } from \"../tokens.js\";\n\nexport type Status = \"working\" | \"completed\" | \"failed\" | \"idle\";\n\nconst COLOR: Record<Status, string> = {\n working: tokens.accent,\n completed: tokens.success,\n failed: tokens.danger,\n idle: tokens.fgFaint,\n};\n\nconst STYLE_ID = \"nb-synapse-statusdot\";\nconst KEYFRAMES = `\n@keyframes nb-statusdot-pulse {\n 0% { box-shadow: 0 0 0 0 var(--nb-statusdot-ring); transform: scale(1); }\n 70% { box-shadow: 0 0 0 7px transparent; transform: scale(1.15); }\n 100% { box-shadow: 0 0 0 0 transparent; transform: scale(1); }\n}\n.nb-statusdot--working {\n animation: nb-statusdot-pulse 1.6s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n}\n@media (prefers-reduced-motion: reduce) {\n .nb-statusdot--working { animation: none; box-shadow: 0 0 0 2px var(--nb-statusdot-ring); }\n}\n`;\n\ninterface StatusDotProps extends Omit<HTMLAttributes<HTMLSpanElement>, \"color\"> {\n status?: Status;\n /** Override the dot color (any CSS color / token). */\n color?: string;\n /** Diameter in px. Default 8. */\n size?: number;\n}\n\nexport function StatusDot({\n status = \"idle\",\n color,\n size = 8,\n style,\n className,\n ...rest\n}: StatusDotProps) {\n ensureStyle(STYLE_ID, KEYFRAMES);\n const dotColor = color ?? COLOR[status];\n const working = status === \"working\";\n const dotStyle: StyleWithVars = {\n display: \"inline-block\",\n flexShrink: 0,\n width: size,\n height: size,\n borderRadius: \"50%\",\n background: dotColor,\n // Ring color for the pulse keyframe — a faded copy of the dot color.\n \"--nb-statusdot-ring\": `color-mix(in oklab, ${dotColor} 45%, transparent)`,\n ...style,\n };\n return (\n <span\n className={working ? `nb-statusdot--working ${className ?? \"\"}`.trim() : className}\n style={dotStyle}\n {...rest}\n />\n );\n}\n","/**\n * Table — a token-styled data table with declarative columns. For the tabular\n * list surfaces (CRM contacts/deals) that simple `ListRow`s don't fit. Renders\n * a real `<table>` for semantics; header is sticky; rows hover-tint and can be\n * clickable. Sorting / selection / virtualization are deliberately out of v1 —\n * compose `Pagination` for paging.\n */\n\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { ensureStyle } from \"../internal/inject-style.js\";\nimport { type StyleWithVars, tokens } from \"../tokens.js\";\n\ntype Align = \"left\" | \"right\" | \"center\";\n\nexport interface Column<T> {\n /** Stable column id. */\n key: string;\n header: ReactNode;\n /** Cell content for a row. */\n render: (row: T, index: number) => ReactNode;\n align?: Align;\n width?: number | string;\n}\n\ninterface TableProps<T> extends Omit<HTMLAttributes<HTMLTableElement>, \"children\"> {\n data: T[];\n columns: Column<T>[];\n /** Stable key per row. */\n rowKey: (row: T, index: number) => string | number;\n onRowClick?: (row: T, index: number) => void;\n /** Shown when `data` is empty. */\n empty?: ReactNode;\n}\n\nconst STYLE_ID = \"nb-synapse-table\";\nconst RULES = `\n.nb-table { width: 100%; border-collapse: collapse; font-family: var(--nb-table-font); }\n.nb-table th, .nb-table td {\n padding: 0.55rem 0.75rem;\n border-bottom: var(--nb-table-border);\n font-size: var(--nb-table-size); line-height: var(--nb-table-line);\n}\n.nb-table thead th {\n position: sticky; top: 0; z-index: 1;\n background: var(--nb-table-head-bg);\n color: var(--nb-table-muted);\n font-weight: var(--nb-table-semibold);\n font-size: var(--nb-table-xs); text-align: left;\n text-transform: uppercase; letter-spacing: 0.04em;\n}\n.nb-table tbody td { color: var(--nb-table-fg); }\n.nb-table tbody tr.nb-table__row--clickable { cursor: pointer; }\n.nb-table tbody tr.nb-table__row--clickable:hover { background: var(--nb-table-hover); }\n`;\n\nexport function Table<T>({\n data,\n columns,\n rowKey,\n onRowClick,\n empty,\n style,\n className,\n ...rest\n}: TableProps<T>) {\n ensureStyle(STYLE_ID, RULES);\n\n const vars: Record<`--${string}`, string> = {\n \"--nb-table-font\": tokens.fontSans,\n \"--nb-table-fg\": tokens.fg,\n \"--nb-table-muted\": tokens.fgMuted,\n \"--nb-table-head-bg\": tokens.bg,\n \"--nb-table-hover\": tokens.bgSubtle,\n \"--nb-table-border\": `${tokens.borderWidth} solid ${tokens.border}`,\n \"--nb-table-size\": tokens.textSmSize,\n \"--nb-table-line\": tokens.textSmLine,\n \"--nb-table-xs\": tokens.textXsSize,\n \"--nb-table-semibold\": tokens.weightSemibold,\n };\n\n if (data.length === 0 && empty !== undefined) {\n return <>{empty}</>;\n }\n\n const tableStyle: StyleWithVars = { ...vars, ...style };\n\n return (\n <table className={`nb-table ${className ?? \"\"}`.trim()} style={tableStyle} {...rest}>\n <thead>\n <tr>\n {columns.map((col) => (\n <th\n key={col.key}\n scope=\"col\"\n style={{ width: col.width, textAlign: col.align ?? \"left\" }}\n >\n {col.header}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {data.map((row, i) => {\n const clickable = Boolean(onRowClick);\n return (\n <tr\n key={rowKey(row, i)}\n className={clickable ? \"nb-table__row--clickable\" : undefined}\n tabIndex={clickable ? 0 : undefined}\n onClick={clickable ? () => onRowClick?.(row, i) : undefined}\n onKeyDown={\n clickable\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onRowClick?.(row, i);\n }\n }\n : undefined\n }\n >\n {columns.map((col) => (\n <td key={col.key} style={{ textAlign: col.align ?? \"left\" }}>\n {col.render(row, i)}\n </td>\n ))}\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n}\n","/**\n * AppFrame — the universal app chrome: a fixed header, a scrollable body, and\n * an optional fixed footer, filling the iframe pane. Every Synapse app uses it;\n * a body layout (SidebarLayout, ListView, …) goes inside `AppFrame.Body`.\n *\n * The shell fills the pane with `height: 100%`, which needs a definite-height\n * ancestor chain (`#root` → `body` → `html`) — something a bare app document\n * does not supply on its own. So AppFrame establishes that chain itself on\n * render via `injectBaseReset()`; without it the shell would collapse to\n * content height. Apps wanting the chain before first paint can also\n * `import \"@nimblebrain/synapse/ui/base\"` in their entry.\n *\n * The `contentWidth` knob is a personality lever: `reading` centers header,\n * body, and footer in a ~760px column (Conversations, Research), while `full`\n * uses the whole pane (CRM, dashboards). Header/body/footer share the same\n * column so the composition reads as one page.\n */\n\nimport {\n type CSSProperties,\n createContext,\n type HTMLAttributes,\n type ReactNode,\n useContext,\n} from \"react\";\nimport { injectBaseReset } from \"../internal/base-reset.js\";\nimport { tokens } from \"../tokens.js\";\n\ntype ContentWidth = \"reading\" | \"full\";\nconst READING_MAX = 760;\nconst ContentWidthCtx = createContext<ContentWidth>(\"full\");\n\nfunction columnStyle(width: ContentWidth): CSSProperties {\n return width === \"reading\" ? { maxWidth: READING_MAX, marginInline: \"auto\", width: \"100%\" } : {};\n}\n\ninterface AppFrameProps extends HTMLAttributes<HTMLDivElement> {\n contentWidth?: ContentWidth;\n children?: ReactNode;\n}\n\nfunction AppFrameRoot({ contentWidth = \"full\", style, children, ...rest }: AppFrameProps) {\n // The shell's `height: 100%` only resolves against a definite-height ancestor\n // chain; supply it (same render-time pattern as the components' `ensureStyle`).\n injectBaseReset();\n return (\n <ContentWidthCtx.Provider value={contentWidth}>\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n minHeight: 0,\n background: tokens.bg,\n color: tokens.fg,\n fontFamily: tokens.fontSans,\n ...style,\n }}\n {...rest}\n >\n {children}\n </div>\n </ContentWidthCtx.Provider>\n );\n}\n\nfunction Header({ style, children, ...rest }: HTMLAttributes<HTMLElement>) {\n const width = useContext(ContentWidthCtx);\n return (\n <header style={{ flexShrink: 0, padding: \"1.25rem 1.5rem 0.75rem\", ...style }} {...rest}>\n <div style={columnStyle(width)}>{children}</div>\n </header>\n );\n}\n\ninterface BodyProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * Host a full-bleed body layout (SidebarLayout, BoardLayout) edge-to-edge:\n * no padding, no reading column, and the body itself doesn't scroll — the\n * layout's panes manage their own scroll. Leave off for plain content\n * (lists, forms), which get the padded reading/full column.\n */\n bleed?: boolean;\n}\n\nfunction Body({ bleed = false, style, children, ...rest }: BodyProps) {\n const width = useContext(ContentWidthCtx);\n if (bleed) {\n return (\n <div\n style={{\n flex: 1,\n minHeight: 0,\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n ...style,\n }}\n {...rest}\n >\n {children}\n </div>\n );\n }\n return (\n <div style={{ flex: 1, minHeight: 0, overflowY: \"auto\", ...style }} {...rest}>\n <div style={{ ...columnStyle(width), padding: \"0.75rem 1.5rem 1.5rem\" }}>{children}</div>\n </div>\n );\n}\n\nfunction Footer({ style, children, ...rest }: HTMLAttributes<HTMLElement>) {\n const width = useContext(ContentWidthCtx);\n return (\n <footer\n style={{\n flexShrink: 0,\n padding: \"0.75rem 1.5rem\",\n borderTop: `${tokens.borderWidth} solid ${tokens.border}`,\n ...style,\n }}\n {...rest}\n >\n <div style={columnStyle(width)}>{children}</div>\n </footer>\n );\n}\n\n/** `AppFrame` with `.Header`, `.Body`, `.Footer` slots. */\nexport const AppFrame = Object.assign(AppFrameRoot, { Header, Body, Footer });\n","/**\n * `useBreakpoint` — responsive hook keyed to an element's OWN width, not the\n * device viewport. Synapse apps render in an iframe pane whose width the host\n * controls (fullscreen, split, or a narrow sidebar), so layouts must react to\n * the space they're actually given.\n *\n * Attach the returned `ref` to the element whose width drives the decision.\n * Width is measured synchronously on mount (no first-frame flash) and kept live\n * via `ResizeObserver`. SSR/test-safe: without a DOM/`ResizeObserver` it simply\n * reports `isNarrow: false`.\n */\n\nimport { type RefObject, useLayoutEffect, useRef, useState } from \"react\";\n\nexport function useBreakpoint<T extends HTMLElement = HTMLDivElement>(\n breakpoint: number,\n): { ref: RefObject<T | null>; isNarrow: boolean } {\n const ref = useRef<T>(null);\n const [width, setWidth] = useState<number | null>(null);\n\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el) return;\n // Synchronous initial measure — runs before paint, so the first painted\n // frame already reflects the real width. Border-box, matching the observer\n // below (so there's no jump on the first resize if the element has padding).\n setWidth(el.getBoundingClientRect().width);\n if (typeof ResizeObserver === \"undefined\") return;\n const ro = new ResizeObserver((entries) => {\n const entry = entries[0];\n const w = entry?.borderBoxSize?.[0]?.inlineSize ?? entry?.contentRect.width;\n if (typeof w === \"number\") setWidth(w);\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n return { ref, isNarrow: width !== null && width < breakpoint };\n}\n","/**\n * ListDetailLayout — a master list beside a detail pane (CRM contacts → record,\n * Research runs → report, conversations → thread). Responsive to the layout's\n * own width: side-by-side when wide; below `breakpoint` it shows one at a time —\n * the list, or the detail when something is `selected`, with a `Back`\n * affordance to return.\n *\n * `selected` is driven by the app's own selection state. Place\n * `<ListDetailLayout.Back />` at the top of `Detail`; it renders only on a\n * narrow pane and calls `onBack`.\n */\n\nimport { createContext, type HTMLAttributes, type ReactNode, useContext } from \"react\";\nimport { TextLink } from \"../components/Button.js\";\nimport { tokens } from \"../tokens.js\";\nimport { useBreakpoint } from \"./use-container-width.js\";\n\ninterface ListDetailState {\n collapsed: boolean;\n selected: boolean;\n listWidth: number | string;\n onBack?: () => void;\n}\n\nconst ListDetailCtx = createContext<ListDetailState | null>(null);\n\n/** Read the list/detail responsive state — for custom back affordances. */\nexport function useListDetail(): ListDetailState {\n const ctx = useContext(ListDetailCtx);\n if (!ctx) throw new Error(\"useListDetail must be used within <ListDetailLayout>\");\n return ctx;\n}\n\ninterface ListDetailLayoutProps extends HTMLAttributes<HTMLDivElement> {\n /** Is a detail open? Drives which pane shows on a narrow layout. */\n selected?: boolean;\n /** Called by `Back` (and custom triggers) to return to the list when narrow. */\n onBack?: () => void;\n /** Master list width when side-by-side. Default 320. */\n listWidth?: number | string;\n /** Collapse to one-at-a-time below this layout width (px). Default 720. */\n breakpoint?: number;\n children?: ReactNode;\n}\n\nfunction ListDetailLayoutRoot({\n selected = false,\n onBack,\n listWidth = 320,\n breakpoint = 720,\n style,\n children,\n ...rest\n}: ListDetailLayoutProps) {\n const { ref, isNarrow } = useBreakpoint<HTMLDivElement>(breakpoint);\n return (\n <ListDetailCtx.Provider value={{ collapsed: isNarrow, selected, listWidth, onBack }}>\n <div\n ref={ref}\n style={{ display: \"flex\", flexDirection: \"row\", height: \"100%\", minHeight: 0, ...style }}\n {...rest}\n >\n {children}\n </div>\n </ListDetailCtx.Provider>\n );\n}\n\nfunction List({ style, children, ...rest }: HTMLAttributes<HTMLElement>) {\n const { collapsed, selected, listWidth } = useListDetail();\n if (collapsed && selected) return null; // detail has the stage\n const border = `${tokens.borderWidth} solid ${tokens.border}`;\n return (\n <section\n style={{\n // Clip horizontally, scroll vertically. A too-wide child (e.g. an\n // auto-layout <table> that won't shrink below its content) would\n // otherwise spill out of this fixed-width rail and paint over the\n // detail pane. `minWidth: 0` lets the rail participate in flex\n // sizing without being forced wider by its content.\n overflow: \"hidden auto\",\n ...(collapsed\n ? { flex: 1, minWidth: 0 }\n : { width: listWidth, minWidth: 0, flexShrink: 0, borderRight: border }),\n ...style,\n }}\n {...rest}\n >\n {children}\n </section>\n );\n}\n\nfunction Detail({ style, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n const { collapsed, selected } = useListDetail();\n if (collapsed && !selected) return null; // list has the stage\n return (\n <div style={{ flex: 1, minWidth: 0, minHeight: 0, overflowY: \"auto\", ...style }} {...rest}>\n {children}\n </div>\n );\n}\n\ninterface BackProps {\n children?: ReactNode;\n style?: React.CSSProperties;\n}\n\n/** \"← Back\" affordance — renders only on a narrow pane with a detail open. */\nfunction Back({ children, style }: BackProps) {\n const { collapsed, selected, onBack } = useListDetail();\n if (!collapsed || !selected) return null;\n return (\n <TextLink onClick={() => onBack?.()} style={{ marginBottom: \"0.5rem\", ...style }}>\n {children ?? \"← Back\"}\n </TextLink>\n );\n}\n\n/** `ListDetailLayout` with `.List`, `.Detail`, and `.Back` slots. */\nexport const ListDetailLayout = Object.assign(ListDetailLayoutRoot, { List, Detail, Back });\n","/**\n * SidebarLayout — the responsive two-column layout for inside an app pane: a\n * nav/list rail plus main content. It reacts to the layout's OWN width (not the\n * device), and below `breakpoint` collapses one of two ways:\n *\n * - `reflow` (default) — the rail moves to a horizontal strip on top and the\n * content goes full-width. Best for short navs (a settings page's sections).\n * - `drawer` — the rail becomes an off-canvas overlay opened by a `Trigger`.\n * Best for long lists (a document browser) where reflowing would be absurd.\n *\n * Place nav items as flat children of `Sidebar`; it controls direction\n * (column when expanded, row when reflowed). For `drawer`, place a\n * `<SidebarLayout.Trigger />` *inside* the layout (e.g. a toolbar in `Main`) —\n * in v1 the open-state context lives on `SidebarLayout`, so the trigger must be\n * within it, NOT in a sibling `AppFrame.Header`. Or read state via `useSidebar()`.\n * (Header placement would need a hoisted provider — a deliberate later refinement.)\n */\n\nimport {\n type ButtonHTMLAttributes,\n type CSSProperties,\n createContext,\n type HTMLAttributes,\n type ReactNode,\n useContext,\n useEffect,\n useState,\n} from \"react\";\nimport { ensureStyle } from \"../internal/inject-style.js\";\nimport { type StyleWithVars, tokens } from \"../tokens.js\";\nimport { useBreakpoint } from \"./use-container-width.js\";\n\ntype CollapseMode = \"reflow\" | \"drawer\";\ntype Side = \"left\" | \"right\";\n\ninterface SidebarState {\n collapsed: boolean;\n mode: CollapseMode;\n side: Side;\n width: number | string;\n open: boolean;\n setOpen: (open: boolean) => void;\n}\n\nconst SidebarCtx = createContext<SidebarState | null>(null);\n\n/** Read the sidebar's responsive state — for custom triggers or nav re-orientation. */\nexport function useSidebar(): SidebarState {\n const ctx = useContext(SidebarCtx);\n if (!ctx) throw new Error(\"useSidebar must be used within <SidebarLayout>\");\n return ctx;\n}\n\nconst STYLE_ID = \"nb-synapse-sidebarlayout\";\n// Distinct class names from the Drawer component (which owns `.nb-drawer`).\nconst RULES = `\n.nb-sidebar-drawer { transition: transform 220ms cubic-bezier(0.2, 0, 0, 1); }\n.nb-sidebar-scrim { animation: nb-sidebar-fade 180ms ease; }\n@keyframes nb-sidebar-fade { from { opacity: 0; } to { opacity: 1; } }\n@media (prefers-reduced-motion: reduce) {\n .nb-sidebar-drawer { transition: none; }\n .nb-sidebar-scrim { animation: none; }\n}\n`;\n\ninterface SidebarLayoutProps extends HTMLAttributes<HTMLDivElement> {\n side?: Side;\n /** Expanded rail / drawer width. Default 240. */\n width?: number | string;\n /** Collapse below this pane width (px). Default 640. */\n breakpoint?: number;\n collapseMode?: CollapseMode;\n children?: ReactNode;\n}\n\nfunction SidebarLayoutRoot({\n side = \"left\",\n width = 240,\n breakpoint = 640,\n collapseMode = \"reflow\",\n style,\n children,\n ...rest\n}: SidebarLayoutProps) {\n const { ref, isNarrow } = useBreakpoint<HTMLDivElement>(breakpoint);\n const [open, setOpen] = useState(false);\n\n // Close the drawer on Escape.\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setOpen(false);\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [open]);\n\n // Collapsing back to expanded should drop any open drawer state.\n useEffect(() => {\n if (!isNarrow && open) setOpen(false);\n }, [isNarrow, open]);\n\n const reflowed = isNarrow && collapseMode === \"reflow\";\n const rootStyle: CSSProperties = {\n position: \"relative\",\n display: \"flex\",\n flexDirection: reflowed ? \"column\" : side === \"right\" ? \"row-reverse\" : \"row\",\n height: \"100%\",\n minHeight: 0,\n ...style,\n };\n\n return (\n <SidebarCtx.Provider\n value={{ collapsed: isNarrow, mode: collapseMode, side, width, open, setOpen }}\n >\n <div ref={ref} style={rootStyle} {...rest}>\n {children}\n </div>\n </SidebarCtx.Provider>\n );\n}\n\nfunction Sidebar({ style, children, ...rest }: HTMLAttributes<HTMLElement>) {\n const { collapsed, mode, side, width, open, setOpen } = useSidebar();\n ensureStyle(STYLE_ID, RULES);\n\n // Expanded: a fixed-width rail beside the content.\n if (!collapsed) {\n const border = `${tokens.borderWidth} solid ${tokens.border}`;\n return (\n <aside\n style={{\n width,\n flexShrink: 0,\n overflowY: \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"0.125rem\",\n padding: \"0.5rem 0.5rem\",\n ...(side === \"right\" ? { borderLeft: border } : { borderRight: border }),\n ...style,\n }}\n {...rest}\n >\n {children}\n </aside>\n );\n }\n\n // Reflowed: a horizontal strip on top, content below.\n if (mode === \"reflow\") {\n return (\n <aside\n style={{\n display: \"flex\",\n flexDirection: \"row\",\n alignItems: \"center\",\n gap: \"0.25rem\",\n width: \"100%\",\n overflowX: \"auto\",\n padding: \"0.5rem 0.75rem\",\n borderBottom: `${tokens.borderWidth} solid ${tokens.border}`,\n ...style,\n }}\n {...rest}\n >\n {children}\n </aside>\n );\n }\n\n // Drawer: off-canvas overlay + scrim.\n const closed = side === \"right\" ? \"translateX(100%)\" : \"translateX(-100%)\";\n const drawerStyle: StyleWithVars = {\n position: \"absolute\",\n top: 0,\n bottom: 0,\n [side]: 0,\n width,\n maxWidth: \"85%\",\n overflowY: \"auto\",\n background: tokens.bgRaised,\n boxShadow: tokens.shadowLg,\n transform: open ? \"translateX(0)\" : closed,\n zIndex: 11,\n ...(side === \"right\"\n ? { borderLeft: `${tokens.borderWidth} solid ${tokens.border}` }\n : { borderRight: `${tokens.borderWidth} solid ${tokens.border}` }),\n ...style,\n };\n return (\n <>\n {open ? (\n <button\n type=\"button\"\n aria-label=\"Close sidebar\"\n className=\"nb-sidebar-scrim\"\n onClick={() => setOpen(false)}\n style={{\n position: \"absolute\",\n inset: 0,\n border: \"none\",\n padding: 0,\n cursor: \"pointer\",\n background: \"rgba(0,0,0,0.32)\",\n zIndex: 10,\n }}\n />\n ) : null}\n {/* `inert` when closed removes the off-canvas rail from the tab order and\n the a11y tree (vs `aria-hidden`, which leaves focusables reachable). */}\n <aside className=\"nb-sidebar-drawer\" inert={!open} style={drawerStyle} {...rest}>\n {children}\n </aside>\n </>\n );\n}\n\nfunction Main({ style, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div style={{ flex: 1, minWidth: 0, minHeight: 0, overflowY: \"auto\", ...style }} {...rest}>\n {children}\n </div>\n );\n}\n\ninterface TriggerProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Override the default hamburger glyph. */\n children?: ReactNode;\n}\n\n/**\n * Hamburger that opens the drawer. Renders only when collapsed in `drawer`\n * mode, and only when it can see a `SidebarLayout` context — so it's safe to\n * place anywhere inside the layout subtree (it no-ops elsewhere). Note: in v1\n * the context lives on `SidebarLayout` itself, so the trigger must sit inside\n * it (e.g. a toolbar in `Main`), not in a sibling `AppFrame.Header`.\n */\nfunction Trigger({ children, style, onClick, ...rest }: TriggerProps) {\n const ctx = useContext(SidebarCtx);\n if (!ctx?.collapsed || ctx.mode !== \"drawer\") return null;\n const { open, setOpen } = ctx;\n return (\n <button\n type=\"button\"\n aria-label=\"Toggle sidebar\"\n aria-expanded={open}\n onClick={(e) => {\n setOpen(!open);\n onClick?.(e);\n }}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 32,\n height: 32,\n border: \"none\",\n background: \"transparent\",\n color: tokens.fg,\n cursor: \"pointer\",\n borderRadius: tokens.radiusSm,\n ...style,\n }}\n {...rest}\n >\n {children ?? (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" aria-hidden=\"true\">\n <path\n d=\"M2 4.5h14M2 9h14M2 13.5h14\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n )}\n </button>\n );\n}\n\n/** `SidebarLayout` with `.Sidebar`, `.Main`, and `.Trigger` slots. */\nexport const SidebarLayout = Object.assign(SidebarLayoutRoot, { Sidebar, Main, Trigger });\n"]}