:root {
  --breakpoint-2xl: 1536px;
  --breakpoint-lg: 1024px;
  --breakpoint-md: 768px;
  --breakpoint-sm: 640px;
  --breakpoint-xl: 1280px;
  --color-accent: #ec7131;
  --color-background: #f7f5ef;
  --color-border-strong: #c9cdc3;
  --color-border: #e1e2db;
  --color-code-border: #2d392f;
  --color-code-surface: #172019;
  --color-code-text: #e7eee4;
  --color-danger: #B91C1C;
  --color-info: #687bc3;
  --color-primary-fg: #fffdfa;
  --color-primary: #c9501e;
  --color-secondary-fg: #FFFFFF;
  --color-secondary: #6B7280;
  --color-success: #6c9873;
  --color-surface-soft: #f1f0e9;
  --color-surface: #fffdfa;
  --color-text-muted: #7c827a;
  --color-text-subtle: #a7aca4;
  --color-text: #1c1f1d;
  --color-warning: #d2ae5c;
  --duration-dropdown-enter: 120ms;
  --duration-fast: 150ms;
  --duration-normal: 250ms;
  --duration-overlay-enter: 200ms;
  --duration-overlay-exit: 160ms;
  --duration-slow: 400ms;
  --duration-toast-enter: 220ms;
  --duration-toast-exit: 180ms;
  --easing-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
  --easing-ease-in: cubic-bezier(0.4, 0, 1, 1);
  --easing-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
  --easing-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
  --font-body: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
  --font-heading: "SF Pro Display", "Avenir Next", Inter, ui-sans-serif, system-ui, sans-serif;
  --font-mono: "SFMono-Regular", Consolas, "Liberation Mono", monospace;
  --radii-full: 9999px;
  --radii-lg: 10px;
  --radii-md: 8px;
  --radii-none: 0px;
  --radii-sm: 6px;
  --radii-xl: 16px;
  --shadow-lg: 0 10px 15px -3px rgba(0,0,0,0.10), 0 4px 6px -2px rgba(0,0,0,0.05);
  --shadow-md: 0 4px 6px -1px rgba(0,0,0,0.10), 0 2px 4px -1px rgba(0,0,0,0.06);
  --shadow-none: none;
  --shadow-sm: 0 1px 2px 0 rgba(0,0,0,0.05);
  --shadow-xl: 0 20px 25px -5px rgba(0,0,0,0.10), 0 10px 10px -5px rgba(0,0,0,0.04);
  --spacing-2xl: 32px;
  --spacing-3xl: 48px;
  --spacing-lg: 16px;
  --spacing-md: 8px;
  --spacing-sm: 4px;
  --spacing-touch-target: 44px;
  --spacing-xl: 24px;
  --spacing-xs: 2px;
  --text-2xl: 1.5rem;
  --text-3xl: 1.875rem;
  --text-base: 1rem;
  --text-lg: 1.125rem;
  --text-sm: 0.875rem;
  --text-xl: 1.25rem;
  --text-xs: 0.75rem;
  --tk-com: #8C93B0;
  --tk-fn: #82AAFF;
  --tk-kw: #C792EA;
  --tk-num: #F78C6C;
  --tk-pn: var(--color-code-text);
  --tk-str: #C3E88D;
  --tk-type: #FFCB6B;
  --z-dropdown: 100;
  --z-modal: 300;
  --z-popover: 400;
  --z-sticky: 200;
  --z-toast: 500;
}
:root {
  --color-muted: var(--color-surface-soft);
  --color-surface-hover: var(--color-surface-soft);
  --color-border-subtle: var(--color-border);
  --color-border-hover: var(--color-border-strong);
  --color-primary-hover: color-mix(in srgb, var(--color-primary) 85%, var(--color-text));
  --color-primary-foreground: var(--color-primary-fg);
  --color-ring: var(--color-primary);
  --color-warn: var(--color-warning);
  --color-warn-soft: color-mix(in srgb, var(--color-warning) 15%, transparent);
  --color-warn-strong: color-mix(in srgb, var(--color-warning) 80%, var(--color-text));
}
:root[data-color-scheme="dark"] {
  --color-accent: #f28a4b;
  --color-background: #131917;
  --color-border: #303931;
  --color-border-strong: #455147;
  --color-code-border: #455147;
  --color-code-surface: #0e1410;
  --color-code-text: #e5eee2;
  --color-danger: #F87171;
  --color-info: #93a3ec;
  --color-primary: #ffab74;
  --color-primary-fg: #131917;
  --color-secondary: #D4D4D8;
  --color-secondary-fg: #18181B;
  --color-success: #84bd8d;
  --color-surface: #1b211e;
  --color-surface-soft: #222923;
  --color-text: #edf1eb;
  --color-text-muted: #929c93;
  --color-text-subtle: #68736a;
  --color-warning: #e0c074;
  color: var(--color-text);
  background-color: var(--color-background);
}
@media (prefers-color-scheme: dark) {
  :root:not([data-color-scheme="light"]) {
    --color-accent: #f28a4b;
    --color-background: #131917;
    --color-border: #303931;
    --color-border-strong: #455147;
    --color-code-border: #455147;
    --color-code-surface: #0e1410;
    --color-code-text: #e5eee2;
    --color-danger: #F87171;
    --color-info: #93a3ec;
    --color-primary: #ffab74;
    --color-primary-fg: #131917;
    --color-secondary: #D4D4D8;
    --color-secondary-fg: #18181B;
    --color-success: #84bd8d;
    --color-surface: #1b211e;
    --color-surface-soft: #222923;
    --color-text: #edf1eb;
    --color-text-muted: #929c93;
    --color-text-subtle: #68736a;
    --color-warning: #e0c074;
  }
}

/* Border-box everywhere: padding/borders count toward declared widths, so
   padded full-width bars don't overflow the viewport. The single most common
   reset every app needs — shipping it here means no app re-declares it. */
*, *::before, *::after { box-sizing: border-box; }
/* Base surface + typography floor. The page picks up the theme background/text
   tokens (so it's readable on any OS canvas, light or dark) and the --font-body
   family. Headings use --font-heading (falls back to body). Without an explicit
   body font-family the UA default (Times/serif) renders, which reads as
   unstyled. Apps override via their own WithCustomCSS (appended after this
   block — last rule wins). */
html { background-color: var(--color-background, #fff); }
body {
  margin: 0;
  min-height: 100vh;
  background-color: var(--color-background, #fff);
  color: var(--color-text, #18181b);
  font-family: var(--font-body, 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif);
  line-height: 1.5;
  -webkit-text-size-adjust: 100%;
  -webkit-font-smoothing: antialiased;
}
h1, h2, h3, h4 { font-family: var(--font-heading, var(--font-body, inherit)); }
/* Columns of numbers (money, counts) align when figures are tabular. */
[data-fui-comp="ui-data-table"] td,
[data-fui-comp="ui-stat-card"],
[data-fui-comp="ui-bar-chart"],
[data-fui-comp="ui-detail-list"] .ui-detail-list__value,
.ui-money,
td[data-align="end"] {
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum" 1, "lnum" 1;
}
/* The SPA runtime focuses the <main id="main-content"> landmark after a
   client-side nav so screen readers announce the new page. It's a
   programmatic (tabindex=-1) focus target, not a tabbable control, so the
   browser's default focus ring around the whole content region is noise. */
#main-content:focus, main[tabindex="-1"]:focus { outline: none; }
/* Visually-hidden helper — exposed under BOTH .fui-* (framework runtime
   uses this for the SPA route-announce region) and .ui-* (framework/ui
   components — CommandPalette's SR-only trigger, CopyButton's status
   region, etc.). Apps no longer have to call ui.BaseCSS() to opt in;
   the helper is part of the built-in auto-emitted app.css floor. Apps
   that want a custom visually-hidden recipe can override either class
   via their own WithCustomCSS — last rule wins. */
.fui-visually-hidden, .ui-visually-hidden {
  position: absolute !important;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}
/* Skip-link: visually hidden until focused, then revealed as a
   visible overlay so keyboard users can jump to #main-content.
   Apps can override via their own .skip-link / .skip-link:focus
   rules. */
.skip-link {
  position: absolute !important;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}
.skip-link:focus {
  position: fixed !important;
  top: 8px; left: 8px;
  width: auto; height: auto;
  padding: 8px 16px;
  margin: 0;
  overflow: visible;
  clip: auto;
  white-space: normal;
  z-index: 9999;
  background: var(--color-text, #18181B);
  color: var(--color-background, #FAFAFA);
  border-radius: var(--radii-sm, 4px);
  font: 0.9rem system-ui, -apple-system, sans-serif;
  text-decoration: none;
}
/* SPA-nav failure toast — shown when loadPage can't fetch the new
   page (offline, server error). Positioned bottom-right; auto-hides
   after 4s via the runtime. Strict-CSP-clean (no inline styles). */
.fui-nav-toast {
  position: fixed;
  right: 16px; bottom: 16px;
  z-index: 9999;
  max-width: calc(100vw - 32px);
  padding: 12px 16px;
  /* Reuses the theme's always-dark inkwell pair rather than hardcoding a
     palette or inventing an inverse-surface token. CodeSurface/CodeText are
     deliberately non-inverting and contrast-tuned in both schemes, which is
     exactly what a transient overlay wants — and unlike literal hex, a themed
     app's toast now tracks its palette. */
  background: var(--color-code-surface, #18181B);
  color: var(--color-code-text, #FAFAFA);
  border-radius: var(--radii-md, 8px);
  font: 0.9rem system-ui, -apple-system, sans-serif;
  box-shadow: 0 10px 25px rgba(0,0,0,0.25);
  opacity: 0;
  transform: translateY(8px);
  transition: opacity 0.18s, transform 0.18s;
  pointer-events: none;
}
.fui-nav-toast.is-visible {
  opacity: 1;
  transform: translateY(0);
}
/* Progress indicator on slow SPA navigation. The bar tracks the theme's
   primary color via the token — a literal hex here would keep the bar
   indigo in a teal app, and would ignore a per-request theme variant
   entirely (the whole point of app.css being theme-addressed). The
   fallback only applies if a host serves this CSS with no :root tokens. */
html[aria-busy="true"] {
  cursor: progress;
}
html[aria-busy="true"]::after {
  content: '';
  position: fixed;
  inset: 0 0 auto 0;
  height: 2px;
  background: linear-gradient(90deg, transparent, currentColor 50%, transparent);
  animation: fui-nav-progress 1s linear infinite;
  z-index: 9999;
  pointer-events: none;
  color: var(--color-primary, #4F46E5);
}
@keyframes fui-nav-progress {
  0% { transform: translateX(-100%); }
  100% { transform: translateX(100%); }
}
/* Layout body: sidebar column beside the content as a flex row at >= md;
   stacks at < md where the sidebar collapses to a hamburger drawer. */
.layout-body { display: flex; align-items: stretch; min-height: 100vh; }
.layout-body > main, .layout-body > .layout-content { flex: 1 1 auto; min-width: 0; }
.layout-body > nav { flex: 0 0 auto; background-color: var(--color-surface, #fff); border-right: 1px solid var(--color-border, #e4e4e7); }

/* Embed layout (EmbedLayout): sizes to its CONTENT, never to the viewport.
   An embedded surface lives in an iframe that the host page resizes to the
   height the frame reports. With min-height: 100vh that reported height is
   partly the frame's own height, so each report grows the frame, which grows
   100vh, which grows the next report — the panel ratchets open with a band of
   empty space under the content. Caught in a screenshot; invisible to any DOM
   assertion, because every element is present and correct. */
.layout-embed .layout-body { min-height: 0; }
@media (max-width: 47.99rem) {
  .layout-body { display: block; }
  .layout-body > nav { border-right: none; border-bottom: 1px solid var(--color-border, #e4e4e7); }
}

/* Contained layout (WithContainer): a centered editorial column for the
   content, while the header and footer span FULL WIDTH (edge-to-edge border)
   with their inner content centered to the same measure — the normal marketing
   header shape. The wrapper itself is full-width so its background/borders go
   end to end; the centering is per-region. The flex column keeps the footer at
   the bottom. --ui-layout-container-width sets the measure (default 66rem),
   --ui-layout-gutter the minimum side gutter. */
.layout--contained {
  --ui-layout-gutter: clamp(20px, 5vw, 32px);
  display: flex;
  flex-direction: column;
  min-height: 100vh;
}
.layout--contained .layout-body { display: block; min-height: 0; flex: 1 0 auto; }
/* Content column: centered to the measure. */
.layout--contained main, .layout--contained .layout-content {
  inline-size: 100%;
  max-inline-size: var(--ui-layout-container-width, 66rem);
  margin-inline: auto;
  padding-inline: var(--ui-layout-gutter);
  display: flex;
  flex-direction: column;
  gap: clamp(24px, 4vw, 36px);
  padding-block: clamp(40px, 6vw, 64px) clamp(48px, 7vw, 80px);
}
/* Sections and the hero get extra room above; prose keeps the tighter rhythm.
   Screens wrap their blocks in a div, so match both main>… and main>div>…. */
.layout--contained main > [data-fui-comp="ui-section"]:not(:first-child),
.layout--contained main > [data-fui-comp="ui-hero"]:not(:first-child),
.layout--contained main > div > [data-fui-comp="ui-section"]:not(:first-child),
.layout--contained main > div > [data-fui-comp="ui-hero"]:not(:first-child) { margin-top: clamp(24px, 4vw, 48px); }
/* Header + footer: full-bleed band, content centered to the measure by padding
   the difference (so the bottom border still spans edge to edge). */
.layout--contained [data-fui-comp="ui-site-header"],
.layout--contained [data-fui-comp="ui-site-footer"] {
  padding-inline: max(var(--ui-layout-gutter), calc((100% - var(--ui-layout-container-width, 66rem)) / 2));
}
.layout--contained [data-fui-comp="ui-site-header"] {
  block-size: auto;
  padding-block: clamp(14px, 3vw, 22px);
  border-bottom: 1px solid var(--color-border, #e4e4e7);
}
.layout--contained [data-fui-comp="ui-site-header"] .ui-site-header__links { margin-inline-start: auto; }
/* Long-form content prose (heading + paragraph blocks live in the screen's
   wrapper div): a comfortable measure + vertical rhythm so /about, /terms read
   like prose, not a full-width wall. */
.layout--contained main > h1, .layout--contained main > div > h1 {
  font-size: clamp(2rem, 4vw, 2.75rem); line-height: 1.1; letter-spacing: -0.02em; max-width: 24ch; margin: 0;
}
.layout--contained main > p, .layout--contained main > div > p {
  max-width: 68ch; line-height: 1.7; margin: 0;
}
.layout--contained main > div > h1 + p,
.layout--contained main > div > p + p { margin-top: 1.1rem; }
/* The markdown content block keeps its own measure on long-form pages. */
.layout--contained main > div > [data-fui-comp="ui-markdown"] { max-width: 72ch; }

/* Sidebar shell banner: the contained layout styles its header above, but a
   WithSidebar + WithHeader shell needs its own chrome — ui.SiteHeader is
   block-size: 100%, which resolves against a parent with no height, so
   without this rule the banner collapses to text height over the bare page
   background. --ui-layout-header-height follows the --ui-layout-* override
   convention (see --ui-layout-container-width). */
.layout--has-sidebar > header {
  display: flex;
  align-items: stretch;
  block-size: var(--ui-layout-header-height, 56px);
  background-color: var(--color-surface, #fff);
  border-bottom: 1px solid var(--color-border, #e4e4e7);
}

/* Sticky header (WithStickyHeader): a header component cannot stick to the
   page from inside the wrapper, because a sticky element only travels
   inside its parent's box and the component's parent is the wrapper, whose
   height is the header itself. The WRAPPER is the element that sticks.
   Background: the wrapper is transparent by default, so without one the
   page content scrolls visibly underneath it. --ui-layout-header-bg
   follows the --ui-layout-* override convention; stacking uses the
   theme's --z-sticky layer (200, above app chrome, below overlays). */
.layout--sticky-header > header {
  position: sticky;
  top: 0;
  z-index: var(--z-sticky, 200);
  background-color: var(--ui-layout-header-bg, var(--color-background, #fff));
}
/* A sticky header makes the shell's dead scroll visible. .layout-body is
   min-height: 100vh, so a header above it means a short page scrolls by
   exactly the header's height with nothing in the overflow — under a
   pinned header that reads as broken rather than as a stray pixel. The
   contained and sidebar shells each fix this their own way already
   (min-height: 0 there, a calc() subtracting a FIXED header height here);
   a flex column fixes it for a header of any height, which is what a
   caller-supplied component is. */
.layout--sticky-header {
  display: flex;
  flex-direction: column;
  min-height: 100vh;
}
.layout--sticky-header > .layout-body {
  flex: 1 0 auto;
  min-height: 0;
}
/* .layout-body is min-height: 100vh, so a banner above it makes every page
   scroll by exactly the header height with nothing in the overflow; the
   body under a sidebar-shell banner subtracts it. */
.layout--has-sidebar > header + .layout-body {
  min-height: calc(100vh - var(--ui-layout-header-height, 56px));
}

/* Sidebar shell: a padded content area beside the nav. */
.layout--has-sidebar main, .layout--has-sidebar .layout-content {
  display: flex;
  flex-direction: column;
  gap: var(--spacing-xl, 24px);
  padding: clamp(24px, 3vw, 40px);
}


:root { color-scheme: light dark; }
html { scroll-behavior: smooth; }
body { min-width: 0; margin: 0; overflow-x: clip; color: var(--color-text, #1c1f1d); background: var(--color-background, #f7f5ef); font-family: var(--font-body, Inter, ui-sans-serif, system-ui, sans-serif); -webkit-font-smoothing: antialiased; }
button, input, select, textarea { font: inherit; }
code, kbd, pre { font-family: var(--font-mono, ui-monospace, monospace); }

.layout-docs {
  --nav-h: 68px;
  --docs-canvas: var(--color-background, #f7f5ef);
  --docs-paper: var(--color-surface, #fffdfa);
  --docs-paper-2: var(--color-surface-soft, #f1f0e9);
  --docs-ink: var(--color-text, #1c1f1d);
  --docs-ink-soft: var(--color-text-muted, #3e4540);
  --docs-muted: var(--color-text-muted, #7c827a);
  --docs-faint: var(--color-text-subtle, #a7aca4);
  --docs-line: var(--color-border, #e1e2db);
  --docs-line-strong: var(--color-border-strong, #c9cdc3);
  --docs-orange: var(--color-accent, #ec7131);
  --docs-orange-deep: var(--color-primary, #c9501e);
  --docs-orange-wash: color-mix(in srgb, var(--docs-orange) 12%, transparent);
  --docs-sage: var(--color-success, #6c9873);
  --docs-sage-wash: color-mix(in srgb, var(--docs-sage) 13%, transparent);
  --docs-blue: var(--color-info, #687bc3);
  --docs-code: var(--color-code-surface, #172019);
  --docs-code-text: var(--color-code-text, #e7eee4);
  --docs-shadow: 0 22px 60px rgb(36 43 36 / .08);
  background: radial-gradient(circle at 50% -10%, color-mix(in srgb, var(--docs-paper) 65%, transparent), transparent 44rem);
  overflow-x: clip;
}

/* Header */
.layout-docs > header { position: sticky; top: 0; z-index: 30; height: 68px; border-bottom: 1px solid var(--docs-line); background: color-mix(in srgb, var(--docs-canvas) 90%, transparent); backdrop-filter: blur(18px); }
.fastr-docs-site-header { gap: 20px; padding-inline: 30px; }
.fastr-docs-site-header .ui-site-header__brand { flex: 0 0 auto; gap: 9px; }
.fastr-docs-brand { display: inline-flex; align-items: center; gap: 9px; color: var(--docs-ink) !important; text-decoration: none; }
.fastr-docs-brand__mark { display: inline-flex; align-items: flex-end; justify-content: center; gap: 2px; width: 27px; height: 27px; padding: 4px; border: 2px solid var(--docs-ink); border-radius: 8px; transform: rotate(-9deg); }
.fastr-docs-brand__mark i { display: block; width: 4px; border-radius: 3px; background: var(--docs-orange); transform: skew(-12deg); }
.fastr-docs-brand__mark i:nth-child(1) { height: 8px; }
.fastr-docs-brand__mark i:nth-child(2) { height: 14px; }
.fastr-docs-brand__mark i:nth-child(3) { height: 19px; }
.fastr-docs-brand__logo { display: block; width: auto; max-width: 150px; max-height: 31px; object-fit: contain; }
.fastr-docs-brand__name { color: var(--docs-ink); font-family: var(--font-heading, Inter, sans-serif); font-size: 18px; font-weight: 700; letter-spacing: -.065em; }
.fastr-docs-site-header .ui-site-header__links { gap: 4px; margin-inline-start: 28px; }
.fastr-docs-site-header .ui-site-header__links a { padding: 8px 11px; border-radius: 6px; color: var(--docs-muted); font-size: 12px; transition: .18s ease; }
.fastr-docs-site-header .ui-site-header__links a:hover, .fastr-docs-site-header .ui-site-header__links a[aria-current="page"] { color: var(--docs-ink); background: var(--docs-paper-2); }
.fastr-docs-site-header .ui-site-header__links a[aria-current="page"] { font-weight: 650; }
.fastr-docs-site-header .ui-site-header__right { gap: 7px; }
.fastr-docs-command-search { position: relative; display: flex; align-items: center; margin-left: auto; }
.fastr-docs-command-trigger { display: inline-flex; align-items: center; gap: 8px; width: 195px; height: 36px; padding: 0 10px; border: 1px solid var(--docs-line); border-radius: 7px; color: var(--docs-muted); background: var(--docs-paper); cursor: pointer; text-align: left; transition: .18s ease; }
.fastr-docs-command-trigger:hover, .fastr-docs-command-trigger:focus-visible { border-color: var(--docs-line-strong); color: var(--docs-ink); box-shadow: 0 7px 25px rgb(30 36 30 / .06); }
.fastr-docs-command-trigger__label { flex: 1; font-size: 12px; }
.fastr-docs-command-trigger__hint { flex: 0 0 auto; color: var(--docs-faint); font-size: 11px; }
.fastr-docs-command-trigger__hint .ui-shortcut-hint__key { min-width: 15px; padding: 1px 4px; border-color: var(--docs-line); border-bottom-width: 1px; border-radius: 4px; color: var(--docs-muted); background: var(--docs-paper-2); font-size: 11px; }
.fastr-docs-command-search > .ui-visually-hidden { position: absolute; }
/* The native GoFastr palette owns search behavior. This shell owns the
   discoverable close affordance and keeps the long route list inside the
   viewport, including the framework's full-screen mobile variant. */
[data-fui-widget="fastr-docs-command-palette"] { overscroll-behavior: contain; }
[data-fui-widget="fastr-docs-command-palette"] > .fui-panel { overscroll-behavior: contain; position: relative; display: flex; flex-direction: column; width: min(36rem, 92vw); max-width: 100%; max-height: calc(100vh - 32px); overflow: hidden; border: 1px solid var(--docs-line); border-radius: 12px; background: var(--docs-paper); box-shadow: var(--docs-shadow); }
[data-fui-widget="fastr-docs-command-palette"] > .fui-panel > .fui-slot { min-width: 0; }
.fastr-docs-command-palette__close-slot { position: absolute; z-index: 2; top: 8px; right: 12px; }
.fastr-docs-command-palette__close { display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto; width: 40px; height: 40px; padding: 0; border: 1px solid var(--docs-line); border-radius: 7px; color: var(--docs-muted); background: transparent; cursor: pointer; }
.fastr-docs-command-palette__close:hover, .fastr-docs-command-palette__close:focus-visible { border-color: var(--docs-line-strong); color: var(--docs-ink); background: var(--docs-paper-2); outline: none; }
[data-fui-widget="fastr-docs-command-palette"] > .fui-panel > .fui-slot-body { min-height: 0; overflow: hidden; }
[data-fui-widget="fastr-docs-command-palette"] .ui-cmd-palette { display: flex; flex-direction: column; width: 100%; min-height: 0; max-height: 100%; box-sizing: border-box; border: 0; border-radius: 0; box-shadow: none; }
[data-fui-widget="fastr-docs-command-palette"] .ui-cmd-palette__combobox { display: flex; flex-direction: column; min-height: 0; }
[data-fui-widget="fastr-docs-command-palette"] .ui-cmd-palette__combobox .combobox__form { padding-right: 64px; }
[data-fui-widget="fastr-docs-command-palette"] .ui-cmd-palette__combobox .combobox__listbox { min-height: 0; overflow-y: auto; }
/* GoFastr's static combobox runtime marks filtered options as hidden. Keep
   the framework's option layout rule from overriding the browser's hidden
   state so the palette shows only matching routes. */
[data-fui-static-options] [role="option"][hidden] { display: none !important; }
.fastr-docs-variant-selectors:empty { display: none; }
.fastr-docs-variant-selectors { display: inline-flex; align-items: center; gap: 5px; }
.fastr-docs-variant-select { display: inline-flex; align-items: center; }
.fastr-docs-variant-select__label { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
.fastr-docs-variant-select select { min-width: 74px; max-width: 112px; height: 34px; padding: 0 24px 0 9px; border: 1px solid var(--docs-line); border-radius: 7px; color: var(--docs-muted); background: var(--docs-paper); font: 11px var(--font-mono, monospace); }
.fastr-docs-variant-select select:focus-visible { border-color: var(--docs-line-strong); color: var(--docs-ink); outline: 2px solid color-mix(in srgb, var(--docs-orange) 45%, transparent); outline-offset: 2px; }
.fastr-docs-theme-toggle { width: 34px; height: 34px; padding: 0; border: 1px solid transparent; border-radius: 7px; color: var(--docs-muted); background: transparent; }
.fastr-docs-theme-toggle:hover, .fastr-docs-theme-toggle:focus-visible { color: var(--docs-ink); border-color: var(--docs-line); background: var(--docs-paper); }
.fastr-docs-mobile-nav-trigger { display: none; }

/* Outer shell and route tree */
:root { --docs-sticky-offset: 68px; }
.layout-docs .layout-body { min-height: calc(100vh - var(--docs-sticky-offset, 68px)); }
.layout-docs .layout-body > nav { flex: 0 0 254px; min-width: 0; border-right: 1px solid var(--docs-line); background: color-mix(in srgb, var(--docs-canvas) 80%, transparent); }
.layout-docs .ui-sidebar__inline { display: block; min-width: 0; height: calc(100vh - 68px); padding: 21px 16px 19px; overflow-y: auto; position: sticky; top: 68px; scrollbar-width: thin; scrollbar-color: var(--docs-line-strong) transparent; }
.layout-docs .ui-sidebar__title { display: flex; align-items: center; gap: 7px; padding: 26px 8px 9px; margin: 0; color: var(--docs-muted); font-size: 11.5px; font-weight: 650; letter-spacing: .1em; text-transform: uppercase; }
.layout-docs .ui-sidebar__title::before { width: 14px; height: 1px; background: var(--docs-orange); content: ""; }
.layout-docs .ui-sidebar__nav { margin-top: 8px; }
/* The section select sits above the nav inside the drawer, where it stands
   in for the header tabs a phone does not show. */
.fastr-docs-drawer-sections { padding: 14px 10px 4px; border-bottom: 1px solid var(--docs-line); }
.fastr-docs-drawer-sections .ui-select__input:focus-visible { outline: 2px solid var(--docs-orange); outline-offset: 2px; }
.fastr-docs-drawer-sections .ui-select__label { display: block; margin: 0 0 6px; color: var(--docs-faint); font-family: var(--font-mono, monospace); font-size: 11px; font-weight: 650; letter-spacing: .11em; text-transform: uppercase; }
.fastr-docs-drawer-sections .ui-select__input { display: block; width: 100%; box-sizing: border-box; min-height: 34px; padding: 7px 34px 7px 10px; border-color: var(--docs-line); border-radius: 6px; color: var(--docs-ink); background-color: var(--docs-paper); }
.layout-docs .ui-sidebar__list, .layout-docs .ui-sidebar__sublist { gap: 6px; }
.layout-docs .ui-sidebar__sublist { margin-top: 5px; margin-inline-start: 18px; padding-left: 0; border-left: 1px solid var(--docs-line-strong); }
.layout-docs .ui-sidebar__link { min-height: 40px; padding: 10px; border-radius: 8px; color: var(--docs-muted); font-size: 12px; line-height: 1.25; transition: .16s ease; }
.layout-docs .ui-sidebar__link:hover, .layout-docs .ui-sidebar__link:focus-visible { color: var(--docs-ink); background: var(--docs-paper-2); }
.layout-docs .ui-sidebar__link[aria-current="page"] { color: var(--docs-orange-deep); background: var(--docs-orange-wash); font-weight: 650; }
.layout-docs .ui-sidebar__link[aria-current="page"] .ui-sidebar__icon { color: var(--docs-orange); }
.layout-docs .ui-sidebar__group > summary.ui-sidebar__link:has(svg[data-fastr-docs-active="true"]) { color: var(--docs-orange-deep); background: var(--docs-orange-wash); font-weight: 650; }
.layout-docs .ui-sidebar__group > summary.ui-sidebar__link:has(svg[data-fastr-docs-active="true"]) .ui-sidebar__icon { color: var(--docs-orange); }
.layout-docs .ui-sidebar__item--sub .ui-sidebar__link { min-height: 38px; padding: 9px 10px; border-radius: 0 7px 7px 0; font-size: 12px; }
.layout-docs .ui-sidebar__icon { display: inline-flex; flex: 0 0 auto; color: var(--docs-faint); }
.layout-docs .ui-sidebar__link[aria-current="page"] .ui-sidebar__icon { color: var(--docs-orange); }
.layout-docs .ui-sidebar__icon:has(> .fastr-docs-nav-badge), .ui-sidebar--drawer-body .ui-sidebar__icon:has(> .fastr-docs-nav-badge) { display: contents; }
.layout-docs .ui-sidebar__link > .ui-sidebar__label, .ui-sidebar--drawer-body .ui-sidebar__link > .ui-sidebar__label { order: 1; min-width: 0; }
.layout-docs .fastr-docs-nav-badge, .ui-sidebar--drawer-body .fastr-docs-nav-badge { order: 2; display: inline-flex; align-items: center; max-width: 82px; margin-left: auto; padding: 3px 6px; overflow: hidden; border: 1px solid var(--docs-line); border-radius: 999px; color: var(--docs-muted); background: var(--docs-paper-2); font-family: var(--font-mono, monospace); font-size: 8px; font-weight: 650; letter-spacing: .03em; line-height: 1; text-overflow: ellipsis; white-space: nowrap; }
.layout-docs .fastr-docs-nav-badge::after, .ui-sidebar--drawer-body .fastr-docs-nav-badge::after { content: attr(data-badge-label); }
.layout-docs .fastr-docs-nav-badge--accent, .ui-sidebar--drawer-body .fastr-docs-nav-badge--accent { border-color: color-mix(in srgb, var(--docs-orange) 34%, var(--docs-line)); color: var(--docs-orange-deep); background: var(--docs-orange-wash); }
.layout-docs .fastr-docs-nav-badge--info, .ui-sidebar--drawer-body .fastr-docs-nav-badge--info { border-color: color-mix(in srgb, var(--docs-blue) 34%, var(--docs-line)); color: color-mix(in srgb, var(--docs-blue) 72%, var(--docs-ink)); background: color-mix(in srgb, var(--docs-blue) 12%, transparent); }
.layout-docs .fastr-docs-nav-badge--success, .ui-sidebar--drawer-body .fastr-docs-nav-badge--success { border-color: color-mix(in srgb, var(--docs-sage) 34%, var(--docs-line)); color: color-mix(in srgb, var(--docs-sage) 76%, var(--docs-ink)); background: var(--docs-sage-wash); }
.layout-docs .fastr-docs-nav-badge--warning, .ui-sidebar--drawer-body .fastr-docs-nav-badge--warning { border-color: color-mix(in srgb, var(--docs-orange) 42%, var(--docs-line)); color: color-mix(in srgb, var(--docs-orange) 82%, var(--docs-ink)); background: color-mix(in srgb, var(--docs-orange) 16%, transparent); }
.layout-docs .ui-sidebar__footer { margin-top: 17px; padding-top: 22px; border-top: 1px solid var(--docs-line); }

/* The mobile drawer is mounted at document level by GoFastr, outside the
   layout-docs wrapper. Keep its spacing, hierarchy, and color treatment in
   lockstep with the persistent rail above. */
.ui-sidebar--drawer-body {
  --docs-paper: var(--color-surface, #fffdfa);
  --docs-paper-2: var(--color-surface-soft, #f1f0e9);
  --docs-ink: var(--color-text, #1c1f1d);
  --docs-muted: var(--color-text-muted, #7c827a);
  --docs-faint: var(--color-text-subtle, #a7aca4);
  --docs-line: var(--color-border, #e1e2db);
  --docs-line-strong: var(--color-border-strong, #c9cdc3);
  --docs-orange: var(--color-accent, #ec7131);
  --docs-orange-deep: var(--color-primary, #c9501e);
  --docs-orange-wash: color-mix(in srgb, var(--docs-orange) 12%, transparent);
  box-sizing: border-box;
  width: 100%;
  min-width: 0;
  padding: 26px 18px 32px;
  color: var(--docs-ink);
  background: var(--docs-canvas, var(--color-background, #f7f5ef));
  overflow-y: auto;
  overscroll-behavior: contain;
}
.ui-sidebar--drawer-body .ui-sidebar__title { display: flex; align-items: center; gap: 8px; padding: 0 10px 16px; margin: 0; color: var(--docs-muted); font-size: 11.5px; font-weight: 650; letter-spacing: .1em; line-height: 1.2; text-transform: uppercase; }
.ui-sidebar--drawer-body .ui-sidebar__title::before { width: 14px; height: 1px; flex: 0 0 auto; background: var(--docs-orange); content: ""; }
.ui-sidebar--drawer-body .ui-sidebar__nav { margin-top: 0; }
.ui-sidebar--drawer-body .ui-sidebar__list, .ui-sidebar--drawer-body .ui-sidebar__sublist { gap: 6px; }
.ui-sidebar--drawer-body .ui-sidebar__sublist { margin-top: 5px; margin-inline-start: 18px; padding-left: 0; border-left: 1px solid var(--docs-line-strong); }
.ui-sidebar--drawer-body .ui-sidebar__link { min-height: 44px; padding: 10px 12px; gap: 10px; border-radius: 8px; color: var(--docs-muted); font-size: 14px; line-height: 1.25; }
.ui-sidebar--drawer-body .ui-sidebar__link:hover, .ui-sidebar--drawer-body .ui-sidebar__link:focus-visible { color: var(--docs-ink); background: var(--docs-paper-2); }
.ui-sidebar--drawer-body .ui-sidebar__link[aria-current="page"] { color: var(--docs-orange-deep); background: var(--docs-orange-wash); font-weight: 650; }
.ui-sidebar--drawer-body .ui-sidebar__link[aria-current="page"] .ui-sidebar__icon { color: var(--docs-orange); }
.ui-sidebar--drawer-body .ui-sidebar__group > summary.ui-sidebar__link.fastr-docs-nav-group--active { color: var(--docs-orange-deep); background: var(--docs-orange-wash); font-weight: 650; }
.ui-sidebar--drawer-body .ui-sidebar__group > summary.ui-sidebar__link.fastr-docs-nav-group--active .ui-sidebar__icon { color: var(--docs-orange); }
.ui-sidebar--drawer-body .ui-sidebar__item--sub .ui-sidebar__link { min-height: 42px; padding: 10px 12px; border-radius: 0 7px 7px 0; font-size: 13px; }
.ui-sidebar--drawer-body .ui-sidebar__icon { color: var(--docs-faint); }
.ui-sidebar--drawer-body .fastr-docs-nav-badge { max-width: 96px; padding: 4px 7px; font-size: 11px; }
.ui-sidebar--drawer-body .ui-sidebar__footer { margin-top: 20px; padding-top: 24px; border-top: 1px solid var(--docs-line); }

/* Generated landing surface */
.fastr-docs-home { width: min(900px, calc(100% - 88px)); margin-inline: auto; padding: 47px 0 75px; }
.fastr-docs-home__hero { display: grid; grid-template-columns: minmax(0, 1.05fr) minmax(280px, .95fr); gap: 44px; align-items: center; min-height: 450px; }
.fastr-docs-home__eyebrow { color: var(--docs-orange-deep); font-family: var(--font-mono, monospace); font-size: 11.5px; font-weight: 650; letter-spacing: .1em; text-transform: uppercase; }
.fastr-docs-home h1 { max-width: 610px; margin: 15px 0 16px; color: var(--docs-ink); font-family: var(--font-heading, Inter, sans-serif); font-size: clamp(42px, 5vw, 67px); letter-spacing: -.065em; line-height: .98; }
.fastr-docs-home__hero-copy > p { max-width: 470px; margin: 0; color: var(--docs-muted); font-size: 17px; line-height: 1.55; }
.fastr-docs-home__actions { display: flex; flex-wrap: wrap; gap: 9px; margin-top: 27px; }
.fastr-docs-home__button { display: inline-flex; align-items: center; gap: 8px; padding: 10px 13px; border: 1px solid var(--docs-line); border-radius: 6px; color: var(--docs-ink); background: var(--docs-paper); font-size: 12px; font-weight: 650; text-decoration: none !important; transition: .18s ease; }
.fastr-docs-home__button:hover { border-color: var(--docs-orange); transform: translateY(-1px); }
.fastr-docs-home__button--primary { border-color: var(--docs-orange-deep); color: #fff; background: var(--docs-orange-deep); }
.fastr-docs-home__button--ghost { color: var(--docs-orange-deep); }
.fastr-docs-home__hero-art { position: relative; min-height: 270px; overflow: hidden; border: 1px solid var(--docs-line); border-radius: 9px; background: var(--docs-paper); box-shadow: var(--docs-shadow); }
.fastr-docs-home__grid { position: absolute; inset: 0; opacity: .65; background-image: linear-gradient(var(--docs-line) 1px, transparent 1px), linear-gradient(90deg, var(--docs-line) 1px, transparent 1px); background-size: 25px 25px; }
.fastr-docs-home__hero-art::before, .fastr-docs-home__hero-art::after { position: absolute; width: 155%; height: 1px; background: color-mix(in srgb, var(--docs-blue) 50%, transparent); content: ""; transform: rotate(-19deg); }
.fastr-docs-home__hero-art::before { left: -30%; top: 53%; }
.fastr-docs-home__hero-art::after { left: -17%; top: 76%; background: color-mix(in srgb, var(--docs-orange) 50%, transparent); transform: rotate(23deg); }
.fastr-docs-home__orbit { position: absolute; width: 150px; height: 150px; border: 1px solid color-mix(in srgb, var(--docs-orange) 48%, transparent); border-radius: 50%; }
.fastr-docs-home__orbit--one { right: -72px; top: -80px; }
.fastr-docs-home__orbit--two { right: -38px; top: -46px; width: 82px; height: 82px; }
.fastr-docs-home__pin { position: absolute; left: 43%; top: 48%; display: flex; align-items: center; justify-content: center; width: 46px; height: 46px; border: 2px solid var(--docs-orange); border-radius: 50%; box-shadow: 0 0 0 9px color-mix(in srgb, var(--docs-orange) 12%, transparent); }
.fastr-docs-home__pin span { width: 9px; height: 9px; border-radius: 50%; background: var(--docs-orange); }
.fastr-docs-home__art-label { position: absolute; right: 14px; bottom: 12px; color: var(--docs-muted); font-family: var(--font-mono, monospace); font-size: 8px; letter-spacing: .08em; }
.fastr-docs-home__metrics { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0; margin: 28px 0 66px; padding: 17px 0; border-top: 1px solid var(--docs-line); border-bottom: 1px solid var(--docs-line); }
.fastr-docs-home__metrics div { display: grid; gap: 5px; padding-left: 18px; border-left: 1px solid var(--docs-line); }
.fastr-docs-home__metrics div:first-child { padding-left: 0; border-left: 0; }
.fastr-docs-home__metrics strong { color: var(--docs-ink); font-family: var(--font-heading, Inter, sans-serif); font-size: 27px; letter-spacing: -.05em; }
.fastr-docs-home__metrics span { color: var(--docs-muted); font-family: var(--font-mono, monospace); font-size: 11px; text-transform: uppercase; letter-spacing: .08em; }
.fastr-docs-home__section { margin-top: 59px; }
.fastr-docs-home__section-intro { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; align-items: end; margin-bottom: 19px; }
.fastr-docs-home__section-intro h2 { margin: 0; color: var(--docs-ink); font-family: var(--font-heading, Inter, sans-serif); font-size: 26px; letter-spacing: -.045em; }
.fastr-docs-home__section-intro p { margin: 0; color: var(--docs-muted); font-size: 12px; line-height: 1.55; }
.fastr-docs-home__feature-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }
.fastr-docs-home__feature-grid article { min-height: 142px; padding: 16px; border: 1px solid var(--docs-line); border-radius: 7px; background: var(--docs-paper); }
.fastr-docs-home__feature-icon { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; margin-bottom: 16px; border-radius: 6px; color: var(--docs-orange-deep); background: var(--docs-orange-wash); font-family: var(--font-mono, monospace); }
.fastr-docs-home__feature-grid h3 { margin: 0 0 6px; color: var(--docs-ink); font-family: var(--font-heading, Inter, sans-serif); font-size: 14px; }
.fastr-docs-home__feature-grid p { margin: 0; color: var(--docs-muted); font-size: 11.5px; line-height: 1.5; }
.fastr-docs-home__anatomy { display: grid; grid-template-columns: .8fr 1.2fr; gap: 10px; }
.fastr-docs-home__route-panel, .fastr-docs-home__code { overflow: hidden; margin: 0; border: 1px solid var(--docs-line); border-radius: 7px; background: var(--docs-paper); }
.fastr-docs-home__panel-head { display: flex; align-items: center; justify-content: space-between; padding: 11px 13px; border-bottom: 1px solid var(--docs-line); color: var(--docs-ink); font-family: var(--font-mono, monospace); font-size: 11px; }
.fastr-docs-home__panel-head span { color: var(--docs-faint); font-weight: 400; }
.fastr-docs-home__route-row { display: grid; grid-template-columns: 43px 1fr auto; gap: 8px; align-items: center; padding: 10px 13px; border-bottom: 1px solid var(--docs-line); color: var(--docs-muted); font-size: 11.5px; }
.fastr-docs-home__route-row:last-child { border-bottom: 0; }
.fastr-docs-home__route-row > span { color: var(--docs-faint); font-family: var(--font-mono, monospace); font-size: 8px; }
.fastr-docs-home__route-row b { color: var(--docs-ink-soft); font-weight: 500; }
.fastr-docs-home__route-row code { color: var(--docs-faint); font-size: 8px; }
.fastr-docs-home__route-row--active { background: var(--docs-orange-wash); }
.fastr-docs-home__route-row--active b { color: var(--docs-orange-deep); }
.fastr-docs-home__code { padding: 0 13px 16px; color: var(--docs-code-text); background: var(--docs-code); font-size: 11.5px; line-height: 1.8; }
.fastr-docs-home__code .fastr-docs-home__panel-head { padding-inline: 0; border-color: #2a342c; color: var(--docs-code-text); }
.fastr-docs-home__code code { display: block; overflow-x: auto; }
.fastr-docs-home__code em { color: #b9d78e; font-style: normal; }
.fastr-docs-home__code b { color: #ed9d68; font-weight: 400; }
.fastr-docs-home__callout { display: flex; gap: 13px; align-items: flex-start; margin-top: 34px; padding: 16px; border: 1px solid color-mix(in srgb, var(--docs-orange) 28%, var(--docs-line)); border-radius: 8px; background: linear-gradient(135deg, var(--docs-orange-wash), var(--docs-paper)); }
.fastr-docs-home__callout-mark { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; border: 1px solid var(--docs-orange); border-radius: 50%; color: var(--docs-orange); font-size: 18px; }
.fastr-docs-home__callout strong { display: block; margin-bottom: 4px; color: var(--docs-ink); font-size: 12px; }
.fastr-docs-home__callout p { max-width: 600px; margin: 0; color: var(--docs-muted); font-size: 12px; line-height: 1.55; }

/* Article and in-page rail */
.layout-docs main { min-width: 0; }
.fastr-docs-doc-layout { --ui-doc-layout-pad: 0; --ui-doc-layout-gap: 0; display: grid; grid-template-columns: minmax(0, 1fr) 198px; gap: 0; max-width: none; padding: 0; }
.layout-docs .fastr-docs-doc-layout[data-fui-comp="ui-doc-layout"] { grid-template-columns: minmax(0, 1fr) 198px; }
.fastr-docs-doc-layout > .ui-doc-layout__content { flex: 1 1 auto; width: 100%; min-width: 0; max-width: none; box-sizing: border-box; padding: 0; }
.fastr-docs-doc-layout .ui-doc-layout__crumbs, .fastr-docs-doc-layout .ui-markdown { width: min(900px, calc(100% - 88px)); margin-inline: auto; }
.fastr-docs-doc-layout .ui-doc-layout__crumbs { padding-top: 47px; color: var(--docs-faint); font-family: var(--font-mono, monospace); font-size: 11px; }
.fastr-docs-doc-layout .ui-doc-layout__crumbs a { color: var(--docs-muted); }
.fastr-docs-doc-layout .ui-markdown { padding: 20px 0 75px; }
.fastr-docs-doc-layout > .scrollspy { position: sticky; top: 68px; align-self: start; height: max-content; max-height: calc(100vh - 100px); overflow-y: auto; padding: 47px 21px 24px 20px; border-left: 1px solid var(--docs-line); scrollbar-width: thin; scrollbar-color: var(--docs-line-strong) transparent; }
.fastr-docs-doc-layout > .scrollspy .fastr-docs-toc { position: static; }
.fastr-docs-doc-layout > .scrollspy > .ui-anchored-rail { min-width: 0; }
.fastr-docs-doc-layout .ui-anchored-rail__label { margin-bottom: 13px; color: var(--docs-faint); font-family: var(--font-mono, monospace); font-size: 11px; font-weight: 650; letter-spacing: .11em; text-transform: uppercase; }
.fastr-docs-doc-layout .ui-anchored-rail__list { display: grid; gap: 0; padding: 0; margin: 0; border-left: 1px solid var(--docs-line); list-style: none; }
.fastr-docs-doc-layout .ui-anchored-rail__list a { display: block; padding: 6px 0 6px 13px; border-left: 1px solid transparent; margin-left: -1px; color: var(--docs-muted); font-size: 11.5px; line-height: 1.35; transition: .16s ease; }
.fastr-docs-doc-layout .ui-anchored-rail__list a:hover, .fastr-docs-doc-layout .ui-anchored-rail__list a[aria-current="true"] { border-left-color: var(--docs-orange); color: var(--docs-orange-deep); }
.fastr-docs-doc-layout > .fastr-docs-toc-select { display: none; }
.fastr-docs-toc-select .ui-select__label { color: var(--docs-faint); font-family: var(--font-mono, monospace); font-size: 11px; font-weight: 650; letter-spacing: .11em; text-transform: uppercase; }
.fastr-docs-toc-select .ui-select__input { min-width: 0; min-height: 34px; padding: 7px 34px 7px 10px; border-color: var(--docs-line); border-radius: 6px; color: var(--docs-ink); background-color: var(--docs-paper); background-image: linear-gradient(45deg, transparent 50%, var(--docs-muted) 50%), linear-gradient(135deg, var(--docs-muted) 50%, transparent 50%); background-position: calc(100% - 15px) 15px, calc(100% - 10px) 15px; background-size: 5px 5px, 5px 5px; }

/* Markdown is the portable Page surface. */
.layout-docs .ui-markdown { color: var(--docs-ink-soft); font-size: 14px; line-height: 1.72; }
.layout-docs .ui-markdown h1, .layout-docs .ui-markdown h2, .layout-docs .ui-markdown h3, .layout-docs .ui-markdown h4 { color: var(--docs-ink); font-family: var(--font-heading, Inter, sans-serif); letter-spacing: -.045em; }
.layout-docs .ui-markdown h1 { margin: 0 0 16px; font-size: clamp(40px, 5vw, 64px); line-height: 1.02; }
.layout-docs .ui-markdown h2 { margin-top: 58px; margin-bottom: 13px; padding-top: 0; scroll-margin-top: var(--docs-sticky-offset, 110px); font-size: 26px; line-height: 1.1; text-wrap: balance; }
.layout-docs .ui-markdown h4 { scroll-margin-top: var(--docs-sticky-offset, 110px); }
.layout-docs .ui-markdown h3 { margin-top: 34px; margin-bottom: 9px; scroll-margin-top: var(--docs-sticky-offset, 110px); font-size: 18px; text-wrap: balance; }
.layout-docs .ui-markdown p { max-width: 73ch; margin: 0 0 16px; }
.layout-docs .ui-markdown a { color: var(--docs-orange-deep); text-decoration: underline; text-decoration-color: color-mix(in srgb, var(--docs-orange) 45%, transparent); text-underline-offset: 3px; }
.layout-docs .ui-markdown code { padding: 2px 5px; border-radius: 4px; color: var(--docs-orange-deep); background: var(--docs-orange-wash); font-size: .86em; }
.layout-docs .ui-markdown pre:not(.ui-code-block):not(.ui-code-block__body):not(.ui-diff-viewer__code) { overflow-x: auto; padding: 17px 19px 19px; border: 1px solid var(--color-code-border, #2d392f); border-radius: 8px; color: var(--docs-code-text); background: var(--docs-code); box-shadow: var(--docs-shadow); font-size: 12px; line-height: 1.8; }
.layout-docs .ui-markdown pre code { padding: 0; color: inherit; background: transparent; }
.layout-docs .ui-markdown [data-fui-comp="ui-code-block"] { margin: 20px 0 24px; border-radius: 8px; box-shadow: var(--docs-shadow); }
.layout-docs .ui-markdown [data-fui-comp="ui-code-block"] .ui-code-block__head { padding: 2px 12px; }
.layout-docs .ui-markdown [data-fui-comp="ui-code-block"] .ui-code-block__body { padding: 12px 16px 13px; border: 0; border-radius: 0 0 8px 8px; font-size: 12px; line-height: 1.5; }
.layout-docs .ui-markdown blockquote { margin: 24px 0; padding: 13px 17px; border-left: 2px solid var(--docs-orange); color: var(--docs-muted); background: var(--docs-orange-wash); }
.layout-docs .ui-markdown table { width: 100%; border-collapse: collapse; }
.layout-docs .ui-markdown th, .layout-docs .ui-markdown td { padding: 9px 10px; border-bottom: 1px solid var(--docs-line); text-align: left; }
.layout-docs .ui-markdown th { color: var(--docs-faint); font-family: var(--font-mono, monospace); font-size: 11.5px; text-transform: uppercase; letter-spacing: .08em; }
.layout-docs .ui-doc-layout__foot { width: min(900px, calc(100% - 88px)); margin: 0 auto; padding-bottom: 65px; }
.layout-docs .ui-doc-layout__prev, .layout-docs .ui-doc-layout__next { border-color: var(--docs-line); border-radius: 7px; background: var(--docs-paper); }
.layout-docs .ui-doc-layout__prev:hover, .layout-docs .ui-doc-layout__next:hover { border-color: var(--docs-orange); transform: translateY(-1px); }
.layout-docs .ui-doc-layout__pager-dir { color: var(--docs-faint); font-family: var(--font-mono, monospace); font-size: 11px; text-transform: uppercase; letter-spacing: .08em; }
.layout-docs .ui-doc-layout__pager-ttl { color: var(--docs-orange-deep); font-weight: 650; }
.layout-docs .fastr-docs-edit-link { width: min(900px, calc(100% - 88px)); margin: 7px auto 0; color: var(--docs-faint); font-family: var(--font-mono, monospace); font-size: 11.5px; }
.layout-docs .fastr-docs-edit-link a { color: var(--docs-muted); }
.layout-docs .fastr-docs-edit-link a:hover { color: var(--docs-orange-deep); }
.layout-docs .fastr-docs-page-meta { width: min(900px, calc(100% - 88px)); margin: 0 auto 14px; color: var(--docs-muted); font-family: var(--font-mono, monospace); font-size: 11.5px; line-height: 1.5; }
.layout-docs .fastr-docs-page-meta time { color: var(--docs-ink-soft); }

/* Branded fallback for URLs that are not in the Router. */
.fastr-docs-not-found { width: min(620px, calc(100% - 38px)); margin: 0 auto; padding: 96px 0 120px; }
.fastr-docs-not-found__code { margin: 0 0 12px; color: var(--docs-orange-deep, var(--color-primary)); font: 650 11px var(--font-mono, monospace); letter-spacing: .12em; }
.fastr-docs-not-found h1 { margin: 0 0 14px; color: var(--docs-ink, var(--color-text)); font: 650 clamp(40px, 7vw, 68px)/1 var(--font-heading, sans-serif); letter-spacing: -.06em; }
.fastr-docs-not-found__message { margin: 0 0 26px; color: var(--docs-muted, var(--color-text-muted)); font-size: 16px; line-height: 1.6; }
.fastr-docs-not-found__link { display: inline-flex; padding: 10px 13px; border: 1px solid var(--docs-line, var(--color-border)); border-radius: 7px; color: var(--docs-orange-deep, var(--color-primary)); background: var(--docs-paper, var(--color-surface)); font-size: 12px; font-weight: 650; text-decoration: none; }
.fastr-docs-not-found__link:hover, .fastr-docs-not-found__link:focus-visible { border-color: var(--docs-orange, var(--color-accent)); }

/* Framework controls use the same editorial surfaces. */
.layout-docs .ui-sidebar__hamburger { border-color: var(--docs-line); color: var(--docs-muted); background: var(--docs-paper); }
.layout-docs .ui-sidebar__hamburger:hover { color: var(--docs-ink); border-color: var(--docs-line-strong); }
.layout-docs [data-fui-comp="ui-button"] { border-radius: 6px; }

/* A shortcode body is itself a .ui-markdown block, nested inside the page's.
   The page-level prose rules set a max width and 75px of bottom padding, which
   a callout or card must not inherit. */
.ui-markdown .ui-markdown { width: auto; margin-inline: 0; padding: 0; }
/* A card with an href is itself the anchor, so the prose underline would run
   under its heading and description. */
.layout-docs .ui-markdown a.ui-card, .layout-docs .ui-markdown a.ui-tag { text-decoration: none; }
.ui-markdown .ui-markdown > :last-child { margin-bottom: 0; }

/* A highlighted fence line. CodeBlock owns the .ui-code-block__line wrapper and
   offers no hook to mark one, so the emphasis sits inside the line and bleeds
   back out through the body's padding. */
.fastr-docs-code-hl { display: block; margin-inline: calc(var(--spacing-lg, 16px) * -1); padding-inline: var(--spacing-lg, 16px); background: color-mix(in srgb, var(--docs-orange, #d2703a) 22%, transparent); box-shadow: inset 2px 0 0 var(--docs-orange, #d2703a); }
.ui-code-block--numbered .fastr-docs-code-hl { margin-inline-start: -52px; padding-inline-start: 52px; }

/* Splash pages: a landing shell with no table of contents, no breadcrumbs, and
   a wider column than a reference page wants. */
/* A splash page has no table of contents, so it reclaims the column the doc
   layout reserves for one. The doubled class outranks the responsive width
   rules further down, which are all single-class. */
.ui-doc-layout.fastr-docs-doc-layout.fastr-docs-splash { grid-template-columns: minmax(0, 1fr); }
.fastr-docs-doc-layout.fastr-docs-splash .ui-markdown { width: min(1080px, calc(100% - 88px)); }
.fastr-docs-splash .fastr-docs-toc, .fastr-docs-splash .ui-doc-layout__toc { display: none; }
.fastr-docs-page-hero { margin-bottom: 8px; padding-top: 24px; }
.fastr-docs-page-hero h1 { letter-spacing: -.045em; }

/* Mermaid diagrams render inside a sandboxed iframe, because Mermaid needs
   inline styles that the pages' own policy blocks. The source stays visible as
   preformatted text until the host adapter swaps in the frame, so a reader with
   JavaScript disabled still gets the diagram's definition. */
.fastr-docs-mermaid { margin: 24px 0; }
.fastr-docs-mermaid__frame { display: block; width: 100%; height: 220px; border: 0; overflow: hidden; transition: height .12s ease-out; }
.fastr-docs-mermaid__source { margin: 0; padding: 16px 18px; overflow-x: auto; border: 1px dashed var(--docs-line); border-radius: 7px; color: var(--docs-muted); background: var(--docs-paper); font: 12px/1.7 var(--font-mono, monospace); }
.fastr-docs-mermaid[data-fastr-docs-mermaid-failed] .fastr-docs-mermaid__frame { height: auto; min-height: 120px; }

/* Shortcode components. Steps and file trees are authored as ordinary Markdown
   lists so the source stays readable in a plain editor; the presentation is
   carried entirely by these rules. */
.fastr-docs-steps { margin: 24px 0; }
.fastr-docs-steps > * > ol { counter-reset: fastr-docs-step; margin: 0; padding: 0; list-style: none; }
.fastr-docs-steps > * > ol > li { position: relative; margin: 0; padding: 0 0 24px 44px; border-left: 1px solid var(--docs-line); counter-increment: fastr-docs-step; }
.fastr-docs-steps > * > ol > li:last-child { padding-bottom: 0; border-left-color: transparent; }
.fastr-docs-steps > * > ol > li::before { position: absolute; top: -2px; left: -14px; display: grid; width: 27px; height: 27px; border: 1px solid var(--docs-line); border-radius: 50%; color: var(--docs-ink); background: var(--docs-paper); font: 11px var(--font-mono, monospace); place-items: center; content: counter(fastr-docs-step); }
.fastr-docs-steps > * > ol > li > :first-child { margin-top: 0; }
.fastr-docs-steps > * > ol > li > :last-child { margin-bottom: 0; }

.fastr-docs-filetree { margin: 24px 0; padding: 16px 18px; border: 1px solid var(--docs-line); border-radius: 7px; background: var(--docs-paper); font: 12px/1.9 var(--font-mono, monospace); }
.fastr-docs-filetree ul { margin: 0; padding-left: 17px; list-style: none; }
.fastr-docs-filetree > ul { padding-left: 0; }
.fastr-docs-filetree li { position: relative; color: var(--docs-ink-soft); }
.fastr-docs-filetree ul ul { border-left: 1px solid var(--docs-line); }
.fastr-docs-filetree ul ul li { padding-left: 14px; }
.fastr-docs-filetree ul ul li::before { position: absolute; top: 0.95em; left: 0; width: 9px; height: 1px; background: var(--docs-line); content: ""; }
.fastr-docs-filetree li > code { padding: 0; background: none; font-size: inherit; }
.fastr-docs-filetree__dir { color: var(--docs-ink); font-weight: 600; }
.fastr-docs-filetree__file { color: var(--docs-ink-soft); }

.fastr-docs-hero { margin-bottom: 40px; }

@media (max-width: 1120px) {
  .fastr-docs-doc-layout { display: flex; flex-direction: column; }
  .fastr-docs-doc-layout > * { min-width: 0; max-width: 100%; box-sizing: border-box; }
  .fastr-docs-doc-layout > .scrollspy { display: none; }
  .fastr-docs-doc-layout > .fastr-docs-toc-select { display: flex; order: -1; position: sticky; top: 68px; z-index: 12; width: min(900px, calc(100% - 72px)); box-sizing: border-box; align-items: center; gap: 12px; height: auto; margin: 18px auto 8px; padding: 11px 13px; border: 1px solid var(--docs-line); border-radius: 7px; background: var(--docs-paper); }
  .fastr-docs-doc-layout > .fastr-docs-toc-select .ui-select__label { flex: 0 0 auto; margin: 0; }
  .fastr-docs-doc-layout > .fastr-docs-toc-select .ui-select__input { flex: 1 1 auto; width: auto; }
  .layout-docs .ui-markdown h2, .layout-docs .ui-markdown h3, .layout-docs .ui-markdown h4 { scroll-margin-top: 164px; }
  .fastr-docs-doc-layout .ui-doc-layout__crumbs, .fastr-docs-doc-layout .ui-markdown, .layout-docs .ui-doc-layout__foot { width: min(900px, calc(100% - 72px)); }
  .fastr-docs-doc-layout .ui-doc-layout__crumbs { padding-top: 12px; }
  .fastr-docs-home { width: min(900px, calc(100% - 72px)); }
}

@media (min-width: 1121px) {
  .fastr-docs-doc-layout.ui-doc-layout--narrow > .ui-doc-layout__content { margin-inline: 0; }
  .fastr-docs-doc-layout .ui-doc-layout__crumbs, .fastr-docs-doc-layout .ui-markdown { width: min(940px, calc(100% - 48px)); }
}

@media (max-width: 767px) {
  .layout-docs > header { height: 62px; }
  .fastr-docs-site-header { height: 62px; padding-inline: 16px; gap: 12px; }
  .fastr-docs-site-header .ui-site-header__mobile { display: none !important; }
  .fastr-docs-site-header .ui-site-header__links { display: none; }
  .fastr-docs-site-header .ui-site-header__right { gap: 2px; }
  .fastr-docs-site-header .ui-site-header__bar-actions { display: flex !important; align-items: center; gap: 2px; }
  .fastr-docs-site-header .ui-site-header__brand { flex: 1 1 auto; }
  .fastr-docs-site-header .ui-site-header__brand--mobile { gap: 2px; }
  .fastr-docs-site-header .ui-site-header__brand--mobile .fastr-docs-brand { flex: 0 0 auto; }
  .fastr-docs-mobile-nav-trigger { display: inline-flex; align-items: center; justify-content: center; width: 34px; height: 34px; margin-right: 2px; padding: 0; border: 1px solid transparent; border-radius: 7px; color: var(--docs-muted); background: transparent; cursor: pointer; }
  .fastr-docs-mobile-nav-trigger:hover { color: var(--docs-ink); border-color: var(--docs-line); background: var(--docs-paper); }
  .fastr-docs-mobile-nav-trigger:focus-visible { color: var(--docs-ink); background: var(--docs-paper); outline: 2px solid var(--docs-orange); outline-offset: 2px; }
  .fastr-docs-brand__name { font-size: 16px; }
  .fastr-docs-command-trigger { width: 36px; padding-inline: 0; justify-content: center; border-color: transparent; background: transparent; }
  .fastr-docs-command-trigger__label, .fastr-docs-command-trigger__hint { display: none; }
  .fastr-docs-variant-selectors { gap: 2px; }
  .fastr-docs-variant-select select { min-width: 40px; width: auto; max-width: 64px; padding-inline: 6px 16px; font-size: 11.5px; font-weight: 600; letter-spacing: .04em; }
  .layout-docs .layout-body { min-height: calc(100vh - 62px); }
  .layout-docs .layout-body > nav { flex: 0 0 auto; border-right: 0; }
  .layout-docs .ui-sidebar__inline { display: none; }
  .layout-docs .ui-sidebar__hamburger { position: fixed; z-index: 45; top: 76px; left: 16px; width: 34px; height: 34px; padding: 0; border-color: transparent; background: transparent; font-size: 0; }
  .layout-docs .ui-sidebar__hamburger span { font-size: 0; }
  .layout-docs .ui-sidebar__hamburger::before { width: 17px; height: 13px; border-top: 1.5px solid currentColor; border-bottom: 1.5px solid currentColor; content: ""; }
  .layout-docs .ui-sidebar__hamburger::after { position: absolute; width: 17px; height: 1.5px; background: currentColor; content: ""; }
  .fastr-docs-doc-layout .ui-doc-layout__crumbs, .fastr-docs-doc-layout .ui-markdown, .layout-docs .ui-doc-layout__foot { width: calc(100% - 38px); }
  .layout-docs .fastr-docs-edit-link, .layout-docs .fastr-docs-page-meta { width: calc(100% - 38px); }
  .fastr-docs-home { width: calc(100% - 38px); padding-top: 64px; }
  .fastr-docs-home__hero, .fastr-docs-home__anatomy { grid-template-columns: 1fr; gap: 25px; }
  .fastr-docs-home__hero-art { min-height: 190px; }
  .fastr-docs-home h1 { font-size: 41px; }
  .fastr-docs-home__hero-copy > p { font-size: 15px; }
  .fastr-docs-home__section-intro { display: block; }
  .fastr-docs-home__section-intro p { margin-top: 8px; }
  .fastr-docs-home__feature-grid { grid-template-columns: 1fr; }
  .fastr-docs-home__metrics { margin-bottom: 40px; }
  .fastr-docs-doc-layout .ui-doc-layout__crumbs { padding-top: 0; }
  .fastr-docs-doc-layout > .fastr-docs-toc-select { top: 62px; width: calc(100% - 38px); margin-top: 13px; }
  .fastr-docs-doc-layout > .fastr-docs-toc-select { display: block; margin-bottom: 0; padding: 10px 11px 11px; }
  .fastr-docs-doc-layout > .fastr-docs-toc-select .ui-select__label { display: block; margin: 0 0 6px; }
  .fastr-docs-doc-layout > .fastr-docs-toc-select .ui-select__input { display: block; width: 100%; box-sizing: border-box; font-size: 16px; }
  .fastr-docs-doc-layout > .fastr-docs-toc-select .ui-select__input:focus-visible { outline: 2px solid var(--docs-orange); outline-offset: 2px; }
  .fastr-docs-doc-layout .ui-doc-layout__content { margin-top: 10px; }
  .fastr-docs-doc-layout .ui-markdown { padding-top: 18px; }
  .layout-docs .ui-markdown h1 { font-size: 41px; }
  /* 62px sticky header + 85.5px sticky TOC select = 147.5px of chrome at
     phone width; 144px parked the top of every h2 under the select. */
  .layout-docs .ui-markdown h2 { margin-top: 45px; scroll-margin-top: 160px; font-size: 23px; }
  .layout-docs .ui-doc-layout__foot-nav { grid-template-columns: 1fr; }
  .layout-docs .ui-doc-layout__next { text-align: left; }
}

/* Printing a documentation page: the navigation chrome and sticky bars are
   screen furniture, and a drawer or palette left open would eat the sheet.
   Content goes full width and collapsed sidebar groups expand so the whole
   tree reads on paper. */
@media print {
  .layout-docs > header, .layout-docs .layout-body > nav, .fastr-docs-doc-layout > .fastr-docs-toc-select, .fastr-docs-doc-layout > .scrollspy, [data-fui-widget], .fastr-docs-command-trigger, .fastr-docs-theme-toggle, .fastr-docs-variant-selectors, .heading-anchor, .fastr-docs-blog__toolbar, .fastr-docs-blog__feed-link, .fastr-docs-blog-card__tags, .fastr-docs-blog-post__share { display: none !important; }
  .fastr-docs-doc-layout .ui-markdown, .fastr-docs-doc-layout .ui-doc-layout__crumbs { width: 100%; }
  .ui-sidebar details > ul[hidden] { display: block; }
  .layout-docs .ui-markdown { font-size: 11pt; line-height: 1.45; }
  .ui-markdown a[href^="http"]::after { content: " (" attr(href) ")"; font-size: 9pt; color: var(--docs-muted, #555); word-break: break-all; }
}
/* Windows high contrast and friends: badges that live on color alone become
   bordered, the active page gains an underline, and focus rings use the
   system highlight. */
@media (forced-colors: active) {
  .fastr-docs-code-hl { border-left: 3px solid Highlight; forced-color-adjust: none; }
  .fastr-docs-nav-badge { border: 1px solid CanvasText; forced-color-adjust: none; }
  .layout-docs .ui-sidebar__link[aria-current="page"] { text-decoration: underline; }
  .fastr-docs-mobile-nav-trigger:focus-visible, .fastr-docs-doc-layout > .fastr-docs-toc-select .ui-select__input:focus-visible { outline: 2px solid Highlight; }
}

@media (max-width: 540px) {
  [data-fui-widget="fastr-docs-command-palette"].fui-pos-center { align-items: stretch; justify-content: stretch; padding: 0; }
  [data-fui-widget="fastr-docs-command-palette"] > .fui-panel { width: 100%; max-width: none; height: 100%; max-height: none; border: 0; border-radius: 0; }
  [data-fui-widget="fastr-docs-command-palette"] .ui-cmd-palette { flex: 1 1 auto; }
  [data-fui-widget="fastr-docs-command-palette"] .ui-cmd-palette__combobox { flex: 1 1 auto; }
  [data-fui-widget="fastr-docs-command-palette"] .ui-cmd-palette__combobox .combobox__listbox { flex: 1 1 auto; max-height: none; }
}

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  .fastr-docs-command-trigger, .layout-docs .ui-sidebar__link, .layout-docs .ui-doc-layout__prev, .layout-docs .ui-doc-layout__next { transition: none; }
  .fastr-docs-blog-card { transition: none; transform: none; }
}

/* Blog publication surface. Blog is a sibling layout to documentation: it
   keeps the global brand and command palette, but owns its own navigation,
   aggregation views, cards, and post reading shape. */
[data-fui-layout^="blog"] { --blog-content-max: 1040px; min-width: 0; background: transparent; }
[data-fui-layout^="blog"] .layout-body { display: grid; grid-template-columns: 224px minmax(0, 1fr); min-height: calc(100vh - var(--nav-h, 68px)); }
[data-fui-layout^="blog"] .layout-body > nav { width: auto; min-width: 0; border-right: 1px solid var(--docs-line); background: color-mix(in srgb, var(--docs-canvas) 80%, transparent); }
[data-fui-layout^="blog"] .ui-sidebar__inline { position: sticky; top: 68px; height: calc(100vh - 68px); box-sizing: border-box; padding: 30px 16px 24px; overflow-y: auto; }
[data-fui-layout^="blog"] .ui-sidebar__title { padding: 0 8px 16px; }
[data-fui-layout^="blog"] .ui-sidebar__nav { margin-top: 0; }
[data-fui-layout^="blog"] .ui-sidebar__list { gap: 4px; }
[data-fui-layout^="blog"] .ui-sidebar__link { min-height: 38px; padding: 9px 10px; border-radius: 7px; font-size: 12px; }
[data-fui-layout^="blog"] .ui-sidebar__nav > .ui-sidebar__list > .ui-sidebar__item:last-child { margin-top: 24px; padding-top: 18px; border-top: 1px solid var(--docs-line); }
[data-fui-layout^="blog"] .ui-sidebar__nav > .ui-sidebar__list > .ui-sidebar__item:last-child > .ui-sidebar__link { color: var(--docs-faint); font-family: var(--font-mono, monospace); font-size: 11.5px; text-transform: uppercase; letter-spacing: .06em; }
[data-fui-layout^="blog"] .layout-content { min-width: 0; overflow: hidden; }
.fastr-docs-blog-page { width: min(var(--blog-content-max), calc(100% - 96px)); margin: 0 auto; padding: 72px 0 96px; color: var(--docs-ink-soft); }
.fastr-docs-blog__header { max-width: 760px; margin-bottom: 44px; }
.fastr-docs-blog__eyebrow { margin: 0 0 14px; color: var(--docs-orange-deep); font: 650 10px/1.2 var(--font-mono, monospace); letter-spacing: .12em; text-transform: uppercase; }
.fastr-docs-blog__header h1 { margin: 0 0 16px; color: var(--docs-ink); font: 700 clamp(42px, 6vw, 76px)/.98 var(--font-heading, Inter, sans-serif); letter-spacing: -.065em; }
.fastr-docs-blog__lede { max-width: 64ch; margin: 0; color: var(--docs-muted); font-size: 18px; line-height: 1.55; }
.fastr-docs-blog__toolbar { margin-top: 28px; }
.fastr-docs-blog__toolbar-nav { display: flex; flex-wrap: wrap; align-items: center; gap: 7px; }
.fastr-docs-blog__toolbar-link, .fastr-docs-blog__feed-link { display: inline-flex; min-height: 32px; align-items: center; padding: 0 10px; border: 1px solid var(--docs-line); border-radius: 6px; color: var(--docs-muted); background: var(--docs-paper); font: 10px var(--font-mono, monospace); text-decoration: none; }
.fastr-docs-blog__toolbar-link:hover, .fastr-docs-blog__toolbar-link:focus-visible, .fastr-docs-blog__feed-link:hover, .fastr-docs-blog__feed-link:focus-visible { border-color: var(--docs-orange); color: var(--docs-orange-deep); }
.fastr-docs-blog__feed-link { margin-left: auto; color: var(--docs-orange-deep); }
.fastr-docs-blog__intro { max-width: 68ch; margin: -12px 0 45px; color: var(--docs-muted); }
.fastr-docs-blog__intro.ui-markdown p { margin-bottom: 12px; }
.fastr-docs-blog__section-label { margin: 0 0 12px; color: var(--docs-faint); font: 650 10px var(--font-mono, monospace); letter-spacing: .1em; text-transform: uppercase; }
.fastr-docs-blog__featured { margin-bottom: 54px; }
.fastr-docs-blog__section-head { display: flex; align-items: baseline; justify-content: space-between; gap: 20px; margin-bottom: 16px; }
.fastr-docs-blog__section-head h2 { margin: 0; color: var(--docs-ink); font: 650 25px/1.1 var(--font-heading, Inter, sans-serif); letter-spacing: -.045em; }
.fastr-docs-blog__count, .fastr-docs-blog__search-summary { color: var(--docs-faint); font: 10px var(--font-mono, monospace); }
.fastr-docs-blog__cards { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; }
.fastr-docs-blog-card-wrap { min-width: 0; }
.fastr-docs-blog-card { min-width: 0; border-color: var(--docs-line); border-radius: 8px; background: color-mix(in srgb, var(--docs-paper) 74%, transparent); box-shadow: none; text-decoration: none; transition: border-color .18s ease, transform .18s ease, background .18s ease; }
.fastr-docs-blog-card:hover, .fastr-docs-blog-card:focus-visible { border-color: var(--docs-orange); background: var(--docs-paper); transform: translateY(-2px); }
.fastr-docs-blog-card--featured { border-color: color-mix(in srgb, var(--docs-orange) 46%, var(--docs-line)); background: linear-gradient(135deg, var(--docs-orange-wash), var(--docs-paper)); }
.fastr-docs-blog-card .ui-card__inner { min-width: 0; }
.fastr-docs-blog-card .ui-card__header { padding: 20px 20px 0; }
.fastr-docs-blog-card .ui-card__body { padding: 11px 20px 18px; }
.fastr-docs-blog-card__tags { display: flex; flex-wrap: wrap; gap: 6px; padding: 10px 20px 0; }
.fastr-docs-blog-card__meta { margin-bottom: 10px; color: var(--docs-faint); font: 10px var(--font-mono, monospace); }
.fastr-docs-blog-card h3 { margin: 0; color: var(--docs-ink); font: 650 23px/1.08 var(--font-heading, Inter, sans-serif); letter-spacing: -.045em; }
.fastr-docs-blog-card__excerpt { margin: 0; color: var(--docs-muted); font-size: 13px; line-height: 1.6; }
.fastr-docs-blog-search-item { min-width: 0; }
.fastr-docs-blog-card__tag { font-size: 11px; }
.fastr-docs-blog__empty { margin: 20px 0; padding: 20px; border: 1px dashed var(--docs-line-strong); color: var(--docs-muted); }
.fastr-docs-blog__pagination { display: flex; justify-content: space-between; gap: 12px; margin-top: 28px; padding-top: 18px; border-top: 1px solid var(--docs-line); }
.fastr-docs-blog__pager-link { color: var(--docs-orange-deep); font-size: 12px; text-decoration: none; }
.fastr-docs-blog__pager-link:hover { text-decoration: underline; text-underline-offset: 3px; }
.fastr-docs-blog-search { display: flex; align-items: end; gap: 9px; max-width: 660px; margin-top: 26px; }
.fastr-docs-blog-search label { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); }
.fastr-docs-blog-search input { flex: 1 1 auto; min-width: 0; height: 42px; box-sizing: border-box; padding: 0 13px; border: 1px solid var(--docs-line); border-radius: 7px; color: var(--docs-ink); background: var(--docs-paper); outline: none; }
.fastr-docs-blog-search input:focus { border-color: var(--docs-orange); box-shadow: 0 0 0 3px var(--docs-orange-wash); }
.fastr-docs-blog-search button { height: 42px; padding: 0 15px; border: 1px solid var(--docs-orange); border-radius: 7px; color: var(--docs-paper); background: var(--docs-orange-deep); cursor: pointer; font-size: 12px; font-weight: 650; }
.fastr-docs-blog__search-summary { margin: 31px 0 14px; }
.fastr-docs-blog-terms { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px; }
.fastr-docs-blog-term { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 16px; border: 1px solid var(--docs-line); border-radius: 7px; color: var(--docs-ink); background: var(--docs-paper); text-decoration: none; }
.fastr-docs-blog-term:hover, .fastr-docs-blog-term:focus-visible { border-color: var(--docs-orange); }
.fastr-docs-blog-term strong { font-size: 13px; }
.fastr-docs-blog-term span { color: var(--docs-faint); font: 10px var(--font-mono, monospace); }
.fastr-docs-blog-post__crumbs { margin-bottom: 45px; color: var(--docs-faint); font: 10px var(--font-mono, monospace); }
.fastr-docs-blog-post__crumbs a { color: var(--docs-muted); text-decoration: none; }
.fastr-docs-blog-post__crumbs a:hover { color: var(--docs-orange-deep); }
.fastr-docs-blog-post__grid { display: grid; grid-template-columns: minmax(0, 1fr) 190px; gap: 64px; align-items: start; }
.fastr-docs-blog-post__content { min-width: 0; }
.fastr-docs-blog-post__header { margin-bottom: 36px; }
.fastr-docs-blog-post__header h1 { margin: 0 0 18px; color: var(--docs-ink); font: 700 clamp(42px, 5vw, 68px)/1 var(--font-heading, Inter, sans-serif); letter-spacing: -.065em; }
.fastr-docs-blog-post__lede { max-width: 68ch; margin: 0 0 17px; color: var(--docs-muted); font-size: 17px; line-height: 1.55; }
.fastr-docs-blog-post__meta { color: var(--docs-faint); font: 10px var(--font-mono, monospace); }
.fastr-docs-blog-post__meta-item a { color: var(--docs-muted); }
.fastr-docs-blog-post__tags { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 15px; }
.fastr-docs-blog-post__actions { display: flex; flex-wrap: wrap; align-items: center; gap: 7px; margin-top: 18px; }
.fastr-docs-blog-post__actions .ui-button { min-height: 38px; padding-inline: 13px; }
.fastr-docs-blog-post__share::before { margin-right: 7px; color: currentColor; content: "↗"; font-size: 15px; line-height: 1; }
.fastr-docs-blog-post__actions [data-fui-comp="ui-copy-btn"] { display: inline-flex; }
.fastr-docs-blog-post__copy .ui-copy-btn { min-height: 38px; }
.fastr-docs-blog-post__article { min-width: 0; }
.fastr-docs-blog-post__content.ui-markdown { color: var(--docs-ink-soft); font-size: 15px; line-height: 1.78; }
.fastr-docs-blog-post__content.ui-markdown h2 { margin-top: 55px; scroll-margin-top: 92px; color: var(--docs-ink); font-size: 30px; }
.fastr-docs-blog-post__content.ui-markdown h3 { margin-top: 35px; scroll-margin-top: 92px; color: var(--docs-ink); font-size: 21px; }
.fastr-docs-blog-post__content.ui-markdown p { max-width: 72ch; }
.fastr-docs-blog-post__content.ui-markdown pre { max-width: 100%; overflow-x: auto; }
.fastr-docs-blog-post__toc { position: sticky; top: 92px; min-width: 0; max-height: calc(100vh - 120px); overflow-y: auto; }
.fastr-docs-blog-post__toc .fastr-docs-toc--rail { position: static; }
.fastr-docs-blog-post__toc > .fastr-docs-toc-select { display: none; }
.fastr-docs-blog-post__edit { margin-top: 28px; color: var(--docs-faint); font: 10px var(--font-mono, monospace); }
.fastr-docs-blog-post__edit a { color: var(--docs-muted); }
.fastr-docs-blog-post__related { margin-top: 62px; padding-top: 28px; border-top: 1px solid var(--docs-line); }
.fastr-docs-blog-post__related h2 { margin: 0 0 16px; color: var(--docs-ink); font: 650 25px/1.1 var(--font-heading, Inter, sans-serif); letter-spacing: -.045em; }
[data-fui-layout^="blog"] .ui-doc-layout__foot { width: 100%; margin-top: 38px; padding: 28px 0 0; border-top: 1px solid var(--docs-line); }
[data-fui-layout^="blog"] .ui-doc-layout__foot-nav { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
[data-fui-layout^="blog"] .ui-doc-layout__prev, [data-fui-layout^="blog"] .ui-doc-layout__next { display: flex; min-width: 0; flex-direction: column; gap: 5px; padding: 16px; border: 1px solid var(--docs-line); border-radius: 7px; color: var(--docs-ink); background: var(--docs-paper); text-decoration: none; }
[data-fui-layout^="blog"] .ui-doc-layout__prev:hover, [data-fui-layout^="blog"] .ui-doc-layout__next:hover, [data-fui-layout^="blog"] .ui-doc-layout__prev:focus-visible, [data-fui-layout^="blog"] .ui-doc-layout__next:focus-visible { border-color: var(--docs-orange); }
[data-fui-layout^="blog"] .ui-doc-layout__next { text-align: right; }
[data-fui-layout^="blog"] .ui-doc-layout__pager-dir { color: var(--docs-faint); font: 10px var(--font-mono, monospace); }
[data-fui-layout^="blog"] .ui-doc-layout__pager-ttl { overflow: hidden; color: var(--docs-ink); font-size: 13px; font-weight: 650; text-overflow: ellipsis; white-space: nowrap; }

@media (max-width: 900px) {
  .fastr-docs-blog-page { width: min(760px, calc(100% - 48px)); padding-top: 48px; }
  .fastr-docs-blog__cards { grid-template-columns: 1fr; }
  .fastr-docs-blog-terms { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .fastr-docs-blog-post__grid { grid-template-columns: 1fr; gap: 0; }
  .fastr-docs-blog-post__toc { position: static; order: -1; max-height: none; margin-bottom: 34px; }
  .fastr-docs-blog-post__toc > [data-fui-comp="scrollspy"] { display: none; }
  .fastr-docs-blog-post__toc > .fastr-docs-toc-select { display: block; width: 100%; box-sizing: border-box; padding: 11px 13px; border: 1px solid var(--docs-line); border-radius: 7px; background: var(--docs-paper); }
  .fastr-docs-blog-post__toc .ui-select__label { display: block; margin-bottom: 7px; color: var(--docs-faint); font: 650 9px var(--font-mono, monospace); letter-spacing: .1em; text-transform: uppercase; }
  .fastr-docs-blog-post__toc .ui-select__input { width: 100%; box-sizing: border-box; }
}

@media (max-width: 767px) {
  [data-fui-layout^="blog"] .layout-body { display: block; }
  [data-fui-layout^="blog"] .layout-body > nav { border-right: 0; }
  [data-fui-layout^="blog"] .ui-sidebar__inline { display: none; }
}

@media (max-width: 540px) {
  .fastr-docs-blog-page { width: calc(100% - 36px); padding-top: 37px; padding-bottom: 64px; }
  .fastr-docs-blog__header { margin-bottom: 32px; }
  .fastr-docs-blog__header h1, .fastr-docs-blog-post__header h1 { font-size: 43px; }
  .fastr-docs-blog__lede, .fastr-docs-blog-post__lede { font-size: 15px; }
  .fastr-docs-blog__toolbar-nav { gap: 5px; }
  .fastr-docs-blog__feed-link { margin-left: 0; }
  .fastr-docs-blog-terms { grid-template-columns: 1fr; }
  .fastr-docs-blog-search { align-items: stretch; flex-direction: column; }
  .fastr-docs-blog-search button { width: 100%; }
  .fastr-docs-blog-post__crumbs { margin-bottom: 32px; }
  .fastr-docs-blog-post__content.ui-markdown { font-size: 14px; }
  [data-fui-layout^="blog"] .ui-doc-layout__foot-nav { grid-template-columns: 1fr; }
  [data-fui-layout^="blog"] .ui-doc-layout__next { text-align: left; }
}

/* Second-suite additions: deep links, print, forced colors, contrast,
   direction, and the surfaces the runtime grew. */

:root { accent-color: var(--docs-orange, #b45309); }

.layout-docs .ui-markdown { overflow-wrap: break-word; }

/* Arriving at :target scrolls the heading clear of the sticky header and
   the toc rail, matching the scroll-margin the headings already carry. */
.layout-docs .ui-markdown :target { scroll-margin-top: var(--docs-sticky-offset, 164px); }

/* Heading anchors: quiet until hovered or focused, and never a raw blue
   underlined link. */
.heading-anchor {
  opacity: 0;
  margin-left: 6px;
  padding: 0 2px;
  border: 0;
  background: none;
  color: var(--docs-text-subtle, inherit);
  font: inherit;
  text-decoration: none;
  cursor: pointer;
}
.ui-markdown h2:hover + .heading-anchor, .ui-markdown h3:hover + .heading-anchor,
.ui-markdown h4:hover + .heading-anchor, .heading-anchor:focus-visible {
  opacity: 1;
  outline: 2px solid var(--docs-orange);
  outline-offset: 2px;
}

/* The drawer's helper line under the section select. */
.ui-select__help { margin: 4px 0 0; font-size: 12px; color: var(--docs-text-subtle, inherit); }

/* The announced counts are for ears, not eyes. */
.fastr-docs-search-count, .fastr-docs-blog-search-count {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
  border: 0;
}

/* The mobile drawer tracks the dynamic viewport, so the on-screen keyboard
   cannot push its footer off screen. */
.ui-sidebar--drawer-body { max-height: 100dvh; }

/* The on-this-page rail is keyboard reachable. */
.fastr-docs-doc-layout .ui-anchored-rail__list a:focus-visible {
  outline: 2px solid var(--docs-orange);
  outline-offset: 2px;
}

@media (prefers-contrast: more) {
  .layout-docs .ui-markdown a { text-decoration: underline; text-decoration-thickness: 2px; }
  .fastr-docs-blog-card, .fastr-docs-blog-term { border-width: 2px; }
}

/* Direction: the rail and the anchor sit on the other side once the
   document runs right to left. */
[dir="rtl"] .fastr-docs-doc-layout .ui-anchored-rail__list a { border-left: 0; border-right: 2px solid var(--docs-line, transparent); padding-left: 0; padding-right: 8px; }
[dir="rtl"] .heading-anchor { margin-left: 0; margin-right: 6px; }
.heading-anchor { vertical-align: middle; }

/* Fourth-suite presentation: theme-aware selection, view transitions,
   a focus token, and math layout owned by the docs layer. The math classes
   come from plugins but live in the fastr-docs namespace, so their
   structural treatment belongs here where every page can rely on it. */
::selection { background: color-mix(in srgb, var(--docs-orange, #d2703a) 30%, transparent); }
@view-transition { navigation: auto; }
:root { --docs-focus: var(--docs-orange, #d2703a); }
.fastr-docs-math { max-width: 100%; overflow-x: auto; overflow-y: hidden; padding: 2px 0; vertical-align: baseline; }
.fastr-docs-math--display { display: block; margin: 14px 0; text-align: center; }

/* Third-suite presentation additions: focus rings the surfaces were
   missing, palette containment, kbd chips, and shared helpers. */
summary.ui-sidebar__link:focus-visible { outline: 2px solid var(--docs-orange); outline-offset: 2px; }
[data-fastr-docs-share]:focus-visible { outline: 2px solid var(--docs-orange); outline-offset: 2px; }
kbd {
  display: inline-block;
  padding: 1px 6px;
  border: 1px solid var(--docs-line, #ccc);
  border-bottom-width: 2px;
  border-radius: 5px;
  background: var(--docs-paper-2, #f6f6f4);
  font-size: 0.85em;
  line-height: 1.4;
}
[data-fui-widget="fastr-docs-command-palette"], .fastr-docs-command-palette { overscroll-behavior: contain; }
[data-fui-widget="fastr-docs-command-palette"] .combobox__listbox { overscroll-behavior: contain; }
.fastr-docs-search-empty, .fastr-docs-search-loading { color: var(--docs-muted, inherit); padding: 8px 12px; }
.ui-markdown mark { background: color-mix(in srgb, var(--docs-orange, #d2703a) 25%, transparent); color: inherit; padding: 0 2px; border-radius: 3px; }

:is(.layout-docs, .layout-blog) {
  --docs-canvas: var(--color-background, #f7f5ef);
  --docs-paper: var(--color-surface, #fffdfa);
  --docs-paper-2: var(--color-surface-soft, #f1f0e9);
  --docs-ink: var(--color-text, #1c1f1d);
  --docs-ink-soft: var(--color-text-muted, #3e4540);
  --docs-muted: var(--color-text-muted, #7c827a);
  --docs-faint: var(--color-text-subtle, #a7aca4);
  --docs-line: var(--color-border, #e1e2db);
  --docs-line-strong: var(--color-border-strong, #c9cdc3);
  --docs-orange: var(--color-accent, #ec7131);
  --docs-orange-deep: var(--color-primary, #c9501e);
  --docs-orange-wash: color-mix(in srgb, var(--docs-orange) 12%, transparent);
  --docs-sage: var(--color-success, #6c9873);
  --docs-sage-wash: color-mix(in srgb, var(--docs-sage) 13%, transparent);
  --docs-blue: var(--color-info, #687bc3);
  --docs-code: var(--color-code-surface, #172019);
  --docs-code-text: var(--color-code-text, #e7eee4);
  --docs-shadow: 0 22px 60px color-mix(in srgb, var(--docs-ink) 9%, transparent);
  --docs-radius-sm: var(--radius-sm, 6px);
  --docs-radius-md: var(--radius-md, 8px);
  --docs-radius-lg: var(--radius-lg, 10px);
  --fastr-docs-template: editorial;
  background: radial-gradient(circle at 50% -10%, color-mix(in srgb, var(--docs-paper) 65%, transparent), transparent 44rem);
}


:is(.layout-docs, .layout-blog) { --fastr-docs-template: editorial; }

.repository-links{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:.25rem 1.25rem;padding:.25rem 1rem;border-bottom:1px solid var(--color-border);font-size:.875rem}.repository-links a{display:inline-flex;align-items:center;min-height:2rem;text-decoration:underline;text-underline-offset:.2em}.repository-links a:focus-visible{outline:2px solid currentColor;outline-offset:3px}