deepspace 0.10.2 → 0.11.0

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,6 +1,6 @@
1
1
  // src/documentation/build.ts
2
2
  import { buildSync as buildSync3 } from "esbuild";
3
- import { readFileSync as readFileSync6 } from "fs";
3
+ import { readFileSync as readFileSync7 } from "fs";
4
4
  import { resolve as resolve7 } from "path";
5
5
 
6
6
  // src/documentation/markdown.ts
@@ -630,7 +630,7 @@ function createSearchEntries(pages) {
630
630
  route: page.route,
631
631
  title: page.title,
632
632
  ...page.description ? { description: page.description } : {},
633
- headings: page.headings.filter((heading) => heading.depth > 1).map((heading) => heading.text),
633
+ headings: page.headings.filter((heading) => heading.depth > 1),
634
634
  text: page.text.slice(0, 12e3)
635
635
  }));
636
636
  }
@@ -2492,6 +2492,7 @@ function resolveCompiledImports(code, sourcePath, appDir) {
2492
2492
  const tree = parseJavaScript(code, { ecmaVersion: "latest", sourceType: "module" });
2493
2493
  const replacements = [];
2494
2494
  const appRequire = createRequire(join2(appDir, "package.json"));
2495
+ const resolveAlias = tsconfigAliasResolver(appDir);
2495
2496
  visitJavaScript(tree, (node) => {
2496
2497
  const source = importSource(node);
2497
2498
  if (!source || typeof source.value !== "string" || source.start === void 0 || source.end === void 0) {
@@ -2499,7 +2500,7 @@ function resolveCompiledImports(code, sourcePath, appDir) {
2499
2500
  }
2500
2501
  const specifier = source.value;
2501
2502
  if (/^(?:data:|https?:|node:)/.test(specifier)) return;
2502
- const resolved = specifier.startsWith(".") ? resolve5(dirname2(sourcePath), specifier) : specifier === "deepspace/documentation/react" || specifier === "react" || specifier.startsWith("react/") ? specifier : appRequire.resolve(specifier);
2503
+ const resolved = specifier.startsWith(".") ? resolve5(dirname2(sourcePath), specifier) : specifier === "deepspace/documentation/react" || specifier === "react" || specifier.startsWith("react/") ? specifier : resolveAlias(specifier) ?? appRequire.resolve(specifier);
2503
2504
  replacements.push({ start: source.start, end: source.end, value: quote(resolved.split(sep3).join("/")) });
2504
2505
  });
2505
2506
  return replacements.sort((left, right) => right.start - left.start).reduce(
@@ -2507,6 +2508,34 @@ function resolveCompiledImports(code, sourcePath, appDir) {
2507
2508
  code
2508
2509
  );
2509
2510
  }
2511
+ function tsconfigAliasResolver(appDir) {
2512
+ let base = appDir;
2513
+ let aliases = [];
2514
+ try {
2515
+ const raw = readFileSync4(join2(appDir, "tsconfig.json"), "utf8");
2516
+ const parsed = JSON.parse(
2517
+ raw.replace(/\/\*[\s\S]*?\*\//g, "").replace(/^\s*\/\/.*$/gm, "")
2518
+ );
2519
+ const options = parsed.compilerOptions;
2520
+ if (options?.paths) {
2521
+ base = resolve5(appDir, options.baseUrl ?? ".");
2522
+ aliases = Object.entries(options.paths).filter(([, targets]) => typeof targets?.[0] === "string").map(([pattern, targets]) => ({
2523
+ exact: !pattern.includes("*"),
2524
+ prefix: pattern.replace(/\*$/, ""),
2525
+ target: targets[0].replace(/\*$/, "")
2526
+ })).sort((left, right) => right.prefix.length - left.prefix.length);
2527
+ }
2528
+ } catch {
2529
+ }
2530
+ return (specifier) => {
2531
+ for (const alias of aliases) {
2532
+ if (alias.exact ? specifier === alias.prefix : specifier.startsWith(alias.prefix)) {
2533
+ return resolve5(base, `${alias.target}${alias.exact ? "" : specifier.slice(alias.prefix.length)}`);
2534
+ }
2535
+ }
2536
+ return void 0;
2537
+ };
2538
+ }
2510
2539
  function importSource(node) {
2511
2540
  if (node.type === "ImportDeclaration" || node.type === "ExportAllDeclaration" || node.type === "ExportNamedDeclaration" || node.type === "ImportExpression") return node.source;
2512
2541
  return void 0;
@@ -2567,12 +2596,81 @@ function quote(value) {
2567
2596
  return JSON.stringify(value);
2568
2597
  }
2569
2598
 
2599
+ // src/documentation/fonts.ts
2600
+ import { existsSync as existsSync6, readFileSync as readFileSync5 } from "fs";
2601
+ import { fileURLToPath as fileURLToPath2 } from "url";
2602
+ var DOCUMENTATION_BUNDLED_BODY_FONT = {
2603
+ family: "Inter",
2604
+ fileName: "inter-variable.woff2",
2605
+ weight: "100 900"
2606
+ };
2607
+ var DOCUMENTATION_BUNDLED_MONO_FONT = {
2608
+ family: "Geist Mono",
2609
+ fileName: "geist-mono-variable.woff2",
2610
+ weight: "100 900"
2611
+ };
2612
+ function resolveDocumentationFonts(theme, basePath) {
2613
+ const resolved = [];
2614
+ const seen = /* @__PURE__ */ new Set();
2615
+ const add = (font) => {
2616
+ const key = `${font.family}:${font.source}:${font.weight}`;
2617
+ if (seen.has(key)) return;
2618
+ seen.add(key);
2619
+ resolved.push(font);
2620
+ };
2621
+ const addAuthored = (font, fallbackFamily) => {
2622
+ if (!font?.source || !validFontSource(font.source)) return;
2623
+ add({
2624
+ family: safeFontFamily(font.family, fallbackFamily),
2625
+ source: font.source,
2626
+ weight: safeFontWeight(font.weight),
2627
+ format: safeFontFormat(font.format)
2628
+ });
2629
+ };
2630
+ const addBundled = (bundled) => add({
2631
+ family: bundled.family,
2632
+ source: bundledFontHref(basePath, bundled),
2633
+ weight: bundled.weight,
2634
+ format: "woff2",
2635
+ bundled
2636
+ });
2637
+ if (theme.bodyFont) addAuthored(theme.bodyFont, DOCUMENTATION_BUNDLED_BODY_FONT.family);
2638
+ else addBundled(DOCUMENTATION_BUNDLED_BODY_FONT);
2639
+ addAuthored(theme.headingFont, DOCUMENTATION_BUNDLED_BODY_FONT.family);
2640
+ if (theme.monoFont) addAuthored(theme.monoFont, DOCUMENTATION_BUNDLED_MONO_FONT.family);
2641
+ else addBundled(DOCUMENTATION_BUNDLED_MONO_FONT);
2642
+ return resolved;
2643
+ }
2644
+ function bundledFontHref(basePath, font) {
2645
+ return documentationPublicPath(basePath, `/assets/fonts/${font.fileName}`);
2646
+ }
2647
+ function readBundledFont(font) {
2648
+ const path = fileURLToPath2(new URL(`./fonts/${font.fileName}`, import.meta.url));
2649
+ if (!existsSync6(path)) {
2650
+ throw new Error(`${font.fileName} is missing from this deepspace installation; reinstall the package`);
2651
+ }
2652
+ return readFileSync5(path);
2653
+ }
2654
+ function safeFontFamily(value, fallback = DOCUMENTATION_BUNDLED_BODY_FONT.family) {
2655
+ return value && /^[a-z0-9 ,.'-]{1,80}$/i.test(value) ? value : fallback;
2656
+ }
2657
+ function validFontSource(value) {
2658
+ return /^(?:\/[a-z0-9_./%-]+|https:\/\/[^\s"'()<>]+)$/i.test(value);
2659
+ }
2660
+ function safeFontWeight(value) {
2661
+ if (typeof value === "number") return String(value);
2662
+ return /^(?:normal|bold|[1-9]00|[1-9]00\s+[1-9]00)$/i.test(String(value ?? "")) ? String(value) : "normal";
2663
+ }
2664
+ function safeFontFormat(value) {
2665
+ return value && /^[a-z0-9-]{2,20}$/i.test(value) ? value : "";
2666
+ }
2667
+
2570
2668
  // src/documentation/output.ts
2571
2669
  import { createHash as createHash2 } from "crypto";
2572
2670
  import {
2573
- existsSync as existsSync6,
2671
+ existsSync as existsSync7,
2574
2672
  mkdirSync,
2575
- readFileSync as readFileSync5,
2673
+ readFileSync as readFileSync6,
2576
2674
  readdirSync as readdirSync2,
2577
2675
  rmSync as rmSync2,
2578
2676
  writeFileSync as writeFileSync2
@@ -2596,7 +2694,7 @@ var DocumentationOutput = class {
2596
2694
  constructor(outputDir, appDir, sourceDir) {
2597
2695
  this.outputDir = outputDir;
2598
2696
  assertSafeOutput(appDir, sourceDir, outputDir);
2599
- if (existsSync6(outputDir)) rmSync2(outputDir, { recursive: true, force: true });
2697
+ if (existsSync7(outputDir)) rmSync2(outputDir, { recursive: true, force: true });
2600
2698
  mkdirSync(outputDir, { recursive: true });
2601
2699
  }
2602
2700
  files = /* @__PURE__ */ new Set();
@@ -2629,7 +2727,7 @@ var DocumentationOutput = class {
2629
2727
  );
2630
2728
  }
2631
2729
  const mediaPath = `media/${normalizeRelativePath(relative5(sourceDir, sourcePath))}`;
2632
- const content = extension === ".svg" ? sanitizeSvg(readFileSync5(sourcePath, "utf8"), sourcePath) : readFileSync5(sourcePath);
2730
+ const content = extension === ".svg" ? sanitizeSvg(readFileSync6(sourcePath, "utf8"), sourcePath) : readFileSync6(sourcePath);
2633
2731
  this.write(mediaPath, content);
2634
2732
  }
2635
2733
  };
@@ -2639,7 +2737,7 @@ var DocumentationOutput = class {
2639
2737
  const hash = createHash2("sha256");
2640
2738
  for (const file of [...this.files].sort()) {
2641
2739
  hash.update(file);
2642
- hash.update(readFileSync5(join3(this.outputDir, file)));
2740
+ hash.update(readFileSync6(join3(this.outputDir, file)));
2643
2741
  }
2644
2742
  return hash.digest("hex");
2645
2743
  }
@@ -2978,6 +3076,9 @@ var DOCUMENTATION_BASE_CSS = String.raw`
2978
3076
  --documentation-shadow-lg: 0 24px 80px rgba(15, 18, 28, .18), 0 6px 24px rgba(15, 18, 28, .08);
2979
3077
  --documentation-header-height: 66px;
2980
3078
  --documentation-sidebar-width: 292px;
3079
+ --documentation-assistant-width: 420px;
3080
+ /* Darkened against the light page; the dark theme lightens it instead. */
3081
+ --documentation-focus-ring: color-mix(in srgb, var(--documentation-accent) 82%, var(--documentation-text));
2981
3082
  color-scheme: light;
2982
3083
  font-family: var(--documentation-font-body);
2983
3084
  }
@@ -3000,19 +3101,20 @@ var DOCUMENTATION_BASE_CSS = String.raw`
3000
3101
  --documentation-code-text: #eef0f7;
3001
3102
  --documentation-shadow-sm: 0 1px 2px rgba(0, 0, 0, .24);
3002
3103
  --documentation-shadow-lg: 0 28px 90px rgba(0, 0, 0, .55), 0 8px 24px rgba(0, 0, 0, .35);
3104
+ --documentation-focus-ring: color-mix(in srgb, var(--documentation-accent) 74%, white);
3003
3105
  color-scheme: dark;
3004
3106
  }
3005
3107
 
3006
3108
  * { box-sizing: border-box; }
3007
- html { scroll-behavior: smooth; scroll-padding-top: 92px; }
3008
- body { margin: 0; background: var(--documentation-brand-bg); color: var(--documentation-text); font-family: var(--documentation-font-body); font-size: 15.5px; line-height: 1.7; text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }
3109
+ html { scroll-behavior: smooth; scroll-padding-top: 96px; scrollbar-gutter: stable; }
3110
+ body { margin: 0; background: var(--documentation-brand-bg); color: var(--documentation-text); font-family: var(--documentation-font-body); font-size: 17px; line-height: 1.65; text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }
3009
3111
  :root[data-background-decoration="gradient"] body { background-image: radial-gradient(circle at 58% 7%, color-mix(in srgb, var(--documentation-accent) 7%, transparent), transparent 32%); background-attachment: fixed; }
3010
3112
  :root[data-background-decoration="grid"] body { background-image: linear-gradient(color-mix(in srgb, var(--documentation-border) 26%, transparent) 1px, transparent 1px), linear-gradient(90deg, color-mix(in srgb, var(--documentation-border) 26%, transparent) 1px, transparent 1px); background-attachment: fixed; background-size: 32px 32px; }
3011
3113
  body:has(.documentation-modal-layer), body:has(.documentation-mobile-nav) { overflow: hidden; }
3012
3114
  button, input, textarea { font: inherit; }
3013
3115
  button, a { -webkit-tap-highlight-color: transparent; }
3014
3116
  a { color: inherit; }
3015
- button:focus-visible, a:focus-visible, input:focus-visible, textarea:focus-visible, summary:focus-visible { outline: 2px solid color-mix(in srgb, var(--documentation-accent) 74%, white); outline-offset: 3px; }
3117
+ button:focus-visible, a:focus-visible, input:focus-visible, textarea:focus-visible, summary:focus-visible { outline: 2px solid var(--documentation-focus-ring); outline-offset: 3px; }
3016
3118
  ::selection { background: color-mix(in srgb, var(--documentation-accent) 24%, transparent); }
3017
3119
 
3018
3120
  .documentation-skip-link { position: fixed; z-index: 200; top: -64px; left: 16px; padding: 9px 13px; border-radius: 8px; background: var(--documentation-text); color: var(--documentation-bg); font-weight: 650; text-decoration: none; }
@@ -3020,54 +3122,64 @@ button:focus-visible, a:focus-visible, input:focus-visible, textarea:focus-visib
3020
3122
  .documentation-app.is-navigating::before { content: ""; position: fixed; z-index: 240; inset: 0 auto auto 0; width: 42%; height: 2px; background: linear-gradient(90deg, var(--documentation-accent), var(--documentation-accent-2)); box-shadow: 0 0 14px color-mix(in srgb, var(--documentation-accent-2) 48%, transparent); animation: documentation-navigation-progress .8s ease-in-out infinite alternate; }
3021
3123
  ::view-transition-old(documentation-article) { animation: documentation-page-out .11s ease-in both; }
3022
3124
  ::view-transition-new(documentation-article) { animation: documentation-page-in .16s ease-out both; }
3125
+ /* Only the article animates. Without these, the browser's default root
3126
+ * cross-fade snapshots the whole viewport and visibly fades over the fixed
3127
+ * assistant launcher/panel on every client navigation. */
3128
+ ::view-transition-group(root) { animation: none; }
3129
+ ::view-transition-old(root), ::view-transition-new(root) { animation: none; }
3130
+ ::view-transition-old(documentation-assistant), ::view-transition-new(documentation-assistant),
3131
+ ::view-transition-old(documentation-assistant-launcher), ::view-transition-new(documentation-assistant-launcher) { animation: none; }
3023
3132
 
3024
3133
  `;
3025
3134
 
3026
3135
  // src/documentation/runtime/styles/content.ts
3027
3136
  var DOCUMENTATION_CONTENT_CSS = String.raw`
3028
- .documentation-main { min-width: 0; margin-left: var(--documentation-sidebar-width); transition: margin-right .24s ease; }
3029
- .documentation-reader-grid { display: grid; grid-template-columns: minmax(0, 670px) 212px; justify-content: center; gap: 70px; width: 100%; padding: 62px 52px 156px; }
3030
- .documentation-article { display: flex; min-width: 0; min-height: calc(100vh - var(--documentation-header-height) - 158px); flex-direction: column; view-transition-name: documentation-article; }
3031
- .documentation-breadcrumbs { display: none; align-items: center; gap: 5px; margin-bottom: 24px; color: var(--documentation-muted); font-size: 12px; }
3137
+ .documentation-main { min-width: 0; margin-left: var(--documentation-sidebar-width); margin-right: 0; transition: margin-right .24s ease; }
3138
+ .documentation-reader-grid { display: grid; grid-template-columns: minmax(0, 720px) 250px; justify-content: center; gap: 70px; width: 100%; padding: 62px 52px 96px; }
3139
+ .documentation-reader-column { display: flex; min-width: 0; min-height: calc(100vh - var(--documentation-header-height) - 158px); flex-direction: column; }
3140
+ .documentation-article { display: flex; min-width: 0; flex: 1; flex-direction: column; view-transition-name: documentation-article; }
3141
+ .documentation-breadcrumbs { display: none; align-items: center; gap: 5px; margin-bottom: 24px; color: var(--documentation-muted); font-size: 13px; }
3032
3142
  .documentation-breadcrumbs span { display: inline-flex; align-items: center; gap: 5px; }
3033
3143
  .documentation-breadcrumbs svg { width: 12px; height: 12px; }
3034
3144
  .documentation-article-header { margin-bottom: 38px; }
3035
3145
  .documentation-article-meta { display: flex; align-items: center; justify-content: space-between; gap: 18px; min-height: 32px; margin-bottom: 7px; }
3036
- .documentation-eyebrow { color: color-mix(in srgb, var(--documentation-accent) 76%, var(--documentation-text)); font-size: 12px; font-weight: 700; letter-spacing: .035em; }
3037
- .documentation-contextual-actions { position: relative; display: inline-flex; flex: 0 0 auto; align-items: stretch; height: 30px; border: 1px solid var(--documentation-border); border-radius: 8px; background: color-mix(in srgb, var(--documentation-surface) 92%, transparent); box-shadow: var(--documentation-shadow-sm); }
3038
- .documentation-contextual-actions button, .documentation-contextual-actions a, .documentation-contextual-actions summary { display: inline-flex; align-items: center; gap: 6px; min-width: 0; height: 28px; padding: 0 9px; border: 0; background: transparent; color: var(--documentation-muted); cursor: pointer; font: 590 11px/1 var(--documentation-font-body); text-decoration: none; white-space: nowrap; }
3146
+ .documentation-eyebrow { color: color-mix(in srgb, var(--documentation-accent) 76%, var(--documentation-text)); font-size: 13px; font-weight: 700; letter-spacing: .035em; }
3147
+ .documentation-contextual-actions { position: relative; display: inline-flex; flex: 0 0 auto; align-items: stretch; height: 32px; border: 1px solid var(--documentation-border); border-radius: 8px; background: color-mix(in srgb, var(--documentation-surface) 92%, transparent); box-shadow: var(--documentation-shadow-sm); }
3148
+ .documentation-contextual-actions button, .documentation-contextual-actions a, .documentation-contextual-actions summary { display: inline-flex; align-items: center; gap: 6px; min-width: 0; height: 30px; padding: 0 10px; border: 0; background: transparent; color: var(--documentation-muted); cursor: pointer; font: 590 12.5px/1 var(--documentation-font-body); text-decoration: none; white-space: nowrap; }
3039
3149
  .documentation-contextual-actions button:hover, .documentation-contextual-actions a:hover, .documentation-contextual-actions summary:hover { color: var(--documentation-text); }
3040
3150
  .documentation-contextual-actions svg { flex: 0 0 auto; width: 13px; height: 13px; }
3041
3151
  .documentation-contextual-actions details { position: relative; border-left: 1px solid var(--documentation-border); }
3042
- .documentation-contextual-actions summary { width: 29px; padding: 0; justify-content: center; list-style: none; }
3152
+ .documentation-contextual-actions summary { width: 30px; padding: 0; justify-content: center; list-style: none; }
3043
3153
  .documentation-contextual-actions summary::-webkit-details-marker { display: none; }
3044
3154
  .documentation-contextual-actions details[open] summary { background: var(--documentation-panel); color: var(--documentation-text); }
3045
3155
  .documentation-contextual-actions details[open] summary svg { transform: rotate(180deg); }
3046
- .documentation-contextual-menu { position: absolute; z-index: 35; top: calc(100% + 7px); right: -1px; display: grid; width: min(316px, calc(100vw - 32px)); max-height: min(510px, calc(100vh - 120px)); overflow: auto; padding: 6px; border: 1px solid var(--documentation-border-strong); border-radius: 12px; background: var(--documentation-surface-raised); box-shadow: var(--documentation-shadow-lg); }
3047
- .documentation-contextual-menu button, .documentation-contextual-menu a { display: grid; grid-template-columns: 30px minmax(0, 1fr) auto; align-items: center; gap: 9px; width: 100%; height: auto; min-height: 50px; padding: 6px 8px; border-radius: 8px; text-align: left; }
3156
+ .documentation-contextual-menu { position: absolute; z-index: 35; top: calc(100% + 7px); right: -1px; display: grid; width: min(344px, calc(100vw - 32px)); max-height: min(510px, calc(100vh - 120px)); overflow: auto; padding: 6px; border: 1px solid var(--documentation-border-strong); border-radius: 12px; background: var(--documentation-surface-raised); box-shadow: var(--documentation-shadow-lg); }
3157
+ .documentation-contextual-menu button, .documentation-contextual-menu a { display: grid; grid-template-columns: 30px minmax(0, 1fr) auto; align-items: center; gap: 10px; width: 100%; height: auto; min-height: 52px; padding: 7px 8px; border-radius: 8px; text-align: left; white-space: normal; }
3048
3158
  .documentation-contextual-menu button:hover, .documentation-contextual-menu a:hover { background: var(--documentation-panel); }
3049
3159
  .documentation-contextual-action-icon { display: grid; place-items: center; width: 30px; height: 30px; border: 1px solid var(--documentation-border); border-radius: 7px; background: var(--documentation-surface); color: var(--documentation-text-soft); }
3050
3160
  .documentation-contextual-action-icon svg { width: 15px; height: 15px; }
3051
3161
  .documentation-contextual-action-copy { display: grid; min-width: 0; gap: 2px; }
3052
- .documentation-contextual-action-copy strong { overflow: hidden; color: var(--documentation-text); font-size: 12px; font-weight: 640; line-height: 1.2; text-overflow: ellipsis; white-space: nowrap; }
3053
- .documentation-contextual-action-copy small { overflow: hidden; color: var(--documentation-muted); font-size: 10.5px; font-weight: 450; line-height: 1.25; text-overflow: ellipsis; white-space: nowrap; }
3162
+ .documentation-contextual-action-copy strong { color: var(--documentation-text); font-size: 13px; font-weight: 640; line-height: 1.25; }
3163
+ .documentation-contextual-action-copy small { color: var(--documentation-muted); font-size: 12px; font-weight: 450; line-height: 1.3; }
3054
3164
  .documentation-contextual-menu .documentation-contextual-action-external { width: 12px; height: 12px; color: var(--documentation-faint); }
3055
- .documentation-article-header h1 { margin: 0; color: var(--documentation-text); font-family: var(--documentation-font-heading); font-size: clamp(34px, 3vw, 41px); font-weight: 650; letter-spacing: -.038em; line-height: 1.09; overflow-wrap: anywhere; }
3165
+ .documentation-article-header h1 { margin: 0; color: var(--documentation-text); font-family: var(--documentation-font-heading); font-size: clamp(34px, 3vw, 40px); font-weight: 650; letter-spacing: -.025em; line-height: 1.12; overflow-wrap: anywhere; }
3056
3166
  .documentation-article-header h1:focus { outline: none; }
3057
- .documentation-lede { max-width: 650px; margin: 13px 0 0; color: var(--documentation-text-soft); font-size: 17.5px; letter-spacing: -.01em; line-height: 1.56; }
3167
+ .documentation-lede { max-width: 680px; margin: 14px 0 0; color: var(--documentation-text-soft); font-size: 19px; letter-spacing: -.01em; line-height: 1.55; }
3058
3168
 
3059
3169
  .documentation-prose { color: var(--documentation-text-soft); }
3060
3170
  .documentation-prose > :first-child { margin-top: 0; }
3061
- .documentation-prose h1, .documentation-prose h2, .documentation-prose h3, .documentation-prose h4, .documentation-prose h5, .documentation-prose h6 { color: var(--documentation-text); font-family: var(--documentation-font-heading); scroll-margin-top: 92px; }
3062
- .documentation-prose h1 { margin: 46px 0 17px; font-size: 30px; letter-spacing: -.03em; line-height: 1.2; }
3063
- .documentation-prose h2 { margin: 49px 0 16px; padding-top: 5px; font-size: 25px; font-weight: 625; letter-spacing: -.03em; line-height: 1.25; }
3064
- .documentation-prose h3 { margin: 33px 0 12px; font-size: 19px; font-weight: 620; letter-spacing: -.018em; line-height: 1.35; }
3065
- .documentation-prose h4 { margin: 27px 0 10px; font-size: 16px; font-weight: 620; }
3066
- .documentation-heading-anchor { margin-left: 8px; color: transparent; font-size: .72em; font-weight: 500; text-decoration: none; }
3067
- .documentation-prose h2:hover .documentation-heading-anchor, .documentation-prose h3:hover .documentation-heading-anchor, .documentation-heading-anchor:focus-visible { color: var(--documentation-faint); }
3068
- .documentation-prose p { margin: 0 0 19px; }
3069
- .documentation-prose ul, .documentation-prose ol { margin: 0 0 21px; padding-left: 25px; }
3070
- .documentation-prose li { margin: 5px 0; padding-left: 3px; }
3171
+ .documentation-prose h1, .documentation-prose h2, .documentation-prose h3, .documentation-prose h4, .documentation-prose h5, .documentation-prose h6 { position: relative; color: var(--documentation-text); font-family: var(--documentation-font-heading); scroll-margin-top: 96px; }
3172
+ .documentation-prose h1 { margin: 48px 0 18px; font-size: 30px; letter-spacing: -.025em; line-height: 1.2; }
3173
+ .documentation-prose h2 { margin: 50px 0 16px; padding-top: 5px; font-size: 25px; font-weight: 625; letter-spacing: -.025em; line-height: 1.28; }
3174
+ .documentation-prose h3 { margin: 34px 0 12px; font-size: 20px; font-weight: 620; letter-spacing: -.015em; line-height: 1.4; }
3175
+ .documentation-prose h4 { margin: 28px 0 10px; font-size: 17px; font-weight: 620; }
3176
+ /* Parked in the gutter so revealing it on hover never reflows the heading. The
3177
+ * bare class selector loses to the prose link rule, hence the descendant form. */
3178
+ .documentation-prose .documentation-heading-anchor { position: absolute; top: 0; left: -.82em; display: flex; align-items: center; height: 100%; padding-right: .25em; color: var(--documentation-faint); font-size: .8em; font-weight: 500; opacity: 0; text-decoration: none; transition: opacity .12s; }
3179
+ .documentation-prose :is(h1, h2, h3, h4, h5, h6):hover .documentation-heading-anchor, .documentation-prose .documentation-heading-anchor:focus-visible { opacity: 1; }
3180
+ .documentation-prose p { margin: 0 0 20px; }
3181
+ .documentation-prose ul, .documentation-prose ol { margin: 0 0 22px; padding-left: 26px; }
3182
+ .documentation-prose li { margin: 6px 0; padding-left: 3px; }
3071
3183
  .documentation-prose li::marker { color: var(--documentation-faint); }
3072
3184
  .documentation-prose strong { color: var(--documentation-text); font-weight: 610; }
3073
3185
  .documentation-prose a { color: color-mix(in srgb, var(--documentation-accent) 78%, var(--documentation-text)); font-weight: 560; text-decoration-color: color-mix(in srgb, var(--documentation-accent) 38%, transparent); text-decoration-thickness: 1px; text-underline-offset: 3px; }
@@ -3076,35 +3188,57 @@ var DOCUMENTATION_CONTENT_CSS = String.raw`
3076
3188
  .documentation-prose blockquote { margin: 25px 0; padding: 4px 0 4px 18px; border-left: 2px solid color-mix(in srgb, var(--documentation-accent) 45%, var(--documentation-border)); color: var(--documentation-muted); }
3077
3189
  .documentation-prose blockquote p:last-child { margin-bottom: 0; }
3078
3190
  .documentation-prose hr { margin: 44px 0; border: 0; border-top: 1px solid var(--documentation-border); }
3079
- .documentation-prose :not(pre) > code, .documentation-assistant-message code { padding: 2px 5px; border: 1px solid var(--documentation-border); border-radius: 5px; background: var(--documentation-panel); color: var(--documentation-text); font: 520 .88em/1.4 var(--documentation-font-mono); overflow-wrap: anywhere; }
3080
- .documentation-prose pre { position: relative; overflow: auto; margin: 23px 0; padding: 20px 20px 19px; border: 1px solid color-mix(in srgb, var(--documentation-border-strong) 50%, #000); border-radius: 12px; background: linear-gradient(145deg, var(--documentation-code-panel), var(--documentation-code-bg)); color: var(--documentation-code-text); box-shadow: 0 12px 34px rgba(7, 9, 14, .12); font: 13px/1.66 var(--documentation-font-mono); tab-size: 2; }
3081
- .documentation-prose pre code { display: block; min-width: max-content; padding-right: 76px; background: transparent; }
3082
- :root[data-code-mode="system"][data-theme="light"] .documentation-prose pre { border-color: var(--documentation-border); background: linear-gradient(145deg, #f7f8fb, #f1f3f7); color: #252936; box-shadow: 0 8px 26px rgba(15, 18, 28, .06); }
3083
- :root[data-code-mode="system"][data-theme="light"] .documentation-code-actions button { border-color: rgba(17, 19, 26, .1); background: rgba(255, 255, 255, .72); color: #606675; }
3084
- :root[data-code-mode="system"][data-theme="light"] .documentation-code-actions button:hover { background: #fff; color: #11131a; }
3085
- :root[data-code-mode="system"][data-theme="light"] .hljs-keyword, :root[data-code-mode="system"][data-theme="light"] .hljs-selector-tag, :root[data-code-mode="system"][data-theme="light"] .hljs-literal { color: #6f42c1; }
3086
- :root[data-code-mode="system"][data-theme="light"] .hljs-string, :root[data-code-mode="system"][data-theme="light"] .hljs-title, :root[data-code-mode="system"][data-theme="light"] .hljs-name, :root[data-code-mode="system"][data-theme="light"] .hljs-type { color: #087f5b; }
3087
- :root[data-code-mode="system"][data-theme="light"] .hljs-number, :root[data-code-mode="system"][data-theme="light"] .hljs-meta, :root[data-code-mode="system"][data-theme="light"] .hljs-built_in { color: #a15c00; }
3088
- :root[data-code-mode="system"][data-theme="light"] .hljs-comment, :root[data-code-mode="system"][data-theme="light"] .hljs-quote { color: #7b8190; }
3089
- .documentation-code-actions { position: sticky; float: right; top: 0; right: 0; display: inline-flex; gap: 4px; margin: -12px -12px 0 10px; }
3090
- .documentation-code-actions button { height: 28px; padding: 0 8px; border: 1px solid rgba(255, 255, 255, .12); border-radius: 7px; background: rgba(255, 255, 255, .07); color: #aeb5c6; cursor: pointer; font-size: 10.5px; font-weight: 650; }
3091
- .documentation-code-actions button:hover { background: rgba(255, 255, 255, .12); color: #fff; }
3191
+ .documentation-prose :not(pre) > code, .documentation-assistant-message code { padding: 2px 6px; border-radius: 6px; background: var(--documentation-panel); color: var(--documentation-text); font: 520 .86em/1.4 var(--documentation-font-mono); overflow-wrap: anywhere; }
3192
+ .documentation-code-block { position: relative; margin: 24px 0; }
3193
+ .documentation-prose .documentation-code-block pre { margin: 0; }
3194
+ .documentation-prose pre { position: relative; overflow: auto; margin: 24px 0; padding: 20px; border: 1px solid color-mix(in srgb, var(--documentation-border-strong) 50%, #000); border-radius: 12px; background: linear-gradient(145deg, var(--documentation-code-panel), var(--documentation-code-bg)); color: var(--documentation-code-text); box-shadow: 0 12px 34px rgba(7, 9, 14, .12); font: 14px/1.65 var(--documentation-font-mono); tab-size: 2; }
3195
+ .documentation-prose pre code { display: block; min-width: max-content; background: transparent; }
3196
+ /* Actions overlay the code rather than floating inside its text flow, so no line
3197
+ * needs padding reserved for them and horizontal scrolling stays exact. */
3198
+ .documentation-code-actions { position: absolute; z-index: 2; top: 10px; right: 10px; display: inline-flex; gap: 4px; opacity: 0; transition: opacity .14s; }
3199
+ .documentation-code-block:hover .documentation-code-actions, .documentation-code-actions:focus-within { opacity: 1; }
3200
+ .documentation-code-actions button { display: grid; place-items: center; width: 30px; height: 30px; padding: 0; border: 1px solid rgba(255, 255, 255, .14); border-radius: 7px; background: color-mix(in srgb, var(--documentation-code-panel) 88%, transparent); color: #aeb5c6; cursor: pointer; backdrop-filter: blur(6px); }
3201
+ .documentation-code-actions button:hover { background: rgba(255, 255, 255, .14); color: #fff; }
3202
+ .documentation-code-actions svg { width: 15px; height: 15px; }
3203
+ .documentation-code-language { position: absolute; z-index: 1; top: 14px; left: 20px; color: #7f889c; font: 650 11.5px/1 var(--documentation-font-mono); letter-spacing: .06em; text-transform: uppercase; pointer-events: none; }
3204
+ .documentation-code-block:has(.documentation-code-language) pre { padding-top: 38px; }
3205
+
3092
3206
  .hljs-keyword, .hljs-selector-tag, .hljs-literal, .hljs-section, .hljs-link { color: #b7a7ff; }
3093
3207
  .hljs-string, .hljs-title, .hljs-name, .hljs-type, .hljs-attribute, .hljs-symbol, .hljs-bullet, .hljs-addition { color: #73dfb4; }
3094
3208
  .hljs-number, .hljs-meta, .hljs-built_in, .hljs-builtin-name, .hljs-params { color: #f0b96b; }
3095
3209
  .hljs-comment, .hljs-quote, .hljs-deletion { color: #767f93; font-style: italic; }
3096
3210
  .hljs-variable, .hljs-template-variable, .hljs-regexp { color: #ff95b4; }
3097
3211
 
3098
- .documentation-prose table { display: block; width: 100%; overflow: auto; margin: 25px 0 29px; border: 1px solid var(--documentation-border); border-radius: 10px; border-collapse: separate; border-spacing: 0; background: var(--documentation-surface); font-size: 14px; }
3212
+ /* Light code blocks re-tint every token group above; a partial override would
3213
+ * leave the dark palette's colors on a near-white background. */
3214
+ :root[data-code-mode="system"][data-theme="light"] {
3215
+ --documentation-code-plain: #252936;
3216
+ --documentation-code-keyword: #6f42c1;
3217
+ --documentation-code-string: #0a7d55;
3218
+ --documentation-code-number: #8a4b00;
3219
+ --documentation-code-comment: #636a78;
3220
+ --documentation-code-variable: #b3246b;
3221
+ }
3222
+ :root[data-code-mode="system"][data-theme="light"] .documentation-prose pre { border-color: var(--documentation-border); background: linear-gradient(145deg, #f7f8fb, #f1f3f7); color: var(--documentation-code-plain); box-shadow: 0 8px 26px rgba(15, 18, 28, .06); }
3223
+ :root[data-code-mode="system"][data-theme="light"] .documentation-code-actions button { border-color: rgba(17, 19, 26, .12); background: rgba(255, 255, 255, .82); color: #606675; }
3224
+ :root[data-code-mode="system"][data-theme="light"] .documentation-code-actions button:hover { background: #fff; color: #11131a; }
3225
+ :root[data-code-mode="system"][data-theme="light"] .documentation-code-language { color: #757c8c; }
3226
+ :root[data-code-mode="system"][data-theme="light"] :is(.hljs-keyword, .hljs-selector-tag, .hljs-literal, .hljs-section, .hljs-link) { color: var(--documentation-code-keyword); }
3227
+ :root[data-code-mode="system"][data-theme="light"] :is(.hljs-string, .hljs-title, .hljs-name, .hljs-type, .hljs-attribute, .hljs-symbol, .hljs-bullet, .hljs-addition) { color: var(--documentation-code-string); }
3228
+ :root[data-code-mode="system"][data-theme="light"] :is(.hljs-number, .hljs-meta, .hljs-built_in, .hljs-builtin-name, .hljs-params) { color: var(--documentation-code-number); }
3229
+ :root[data-code-mode="system"][data-theme="light"] :is(.hljs-comment, .hljs-quote, .hljs-deletion) { color: var(--documentation-code-comment); }
3230
+ :root[data-code-mode="system"][data-theme="light"] :is(.hljs-variable, .hljs-template-variable, .hljs-regexp) { color: var(--documentation-code-variable); }
3231
+
3232
+ .documentation-prose table { display: block; width: 100%; overflow: auto; margin: 25px 0 29px; border: 1px solid var(--documentation-border); border-radius: 10px; border-collapse: separate; border-spacing: 0; background: var(--documentation-surface); font-size: 15px; }
3099
3233
  .documentation-prose thead { background: var(--documentation-panel); }
3100
- .documentation-prose th, .documentation-prose td { min-width: 130px; padding: 10px 13px; border-right: 1px solid var(--documentation-border); border-bottom: 1px solid var(--documentation-border); text-align: left; vertical-align: top; }
3234
+ .documentation-prose th, .documentation-prose td { min-width: 130px; padding: 11px 14px; border-right: 1px solid var(--documentation-border); border-bottom: 1px solid var(--documentation-border); text-align: left; vertical-align: top; }
3101
3235
  .documentation-prose th:last-child, .documentation-prose td:last-child { border-right: 0; }
3102
3236
  .documentation-prose tr:last-child td { border-bottom: 0; }
3103
- .documentation-prose th { color: var(--documentation-text); font-size: 12px; font-weight: 700; letter-spacing: .02em; }
3237
+ .documentation-prose th { color: var(--documentation-text); font-size: 13px; font-weight: 700; letter-spacing: .02em; }
3104
3238
 
3105
3239
  .documentation-callout { --callout-accent: var(--documentation-accent); position: relative; margin: 24px 0; padding: 16px 18px 16px 20px; overflow: hidden; border: 1px solid color-mix(in srgb, var(--callout-accent) 25%, var(--documentation-border)); border-radius: 11px; background: linear-gradient(105deg, color-mix(in srgb, var(--callout-accent) 7%, var(--documentation-surface)), var(--documentation-surface)); }
3106
3240
  .documentation-callout::before { content: ""; position: absolute; inset: 0 auto 0 0; width: 2px; background: var(--callout-accent); }
3107
- .documentation-callout > strong { display: block; margin-bottom: 3px; color: color-mix(in srgb, var(--callout-accent) 72%, var(--documentation-text)); font-size: 13px; }
3241
+ .documentation-callout > strong { display: block; margin-bottom: 3px; color: color-mix(in srgb, var(--callout-accent) 72%, var(--documentation-text)); font-size: 14px; }
3108
3242
  .documentation-callout > :last-child { margin-bottom: 0; }
3109
3243
  .documentation-callout-warning { --callout-accent: #e58a21; }
3110
3244
  .documentation-callout-tip { --callout-accent: #17a673; }
@@ -3129,15 +3263,16 @@ var DOCUMENTATION_CONTENT_CSS = String.raw`
3129
3263
  .documentation-step h3 { margin-top: 0; }
3130
3264
  .documentation-tabs { margin: 23px 0; overflow: hidden; border: 1px solid var(--documentation-border); border-radius: 11px; background: var(--documentation-surface); }
3131
3265
  .documentation-tab-buttons { display: flex; gap: 2px; overflow-x: auto; padding: 6px; border-bottom: 1px solid var(--documentation-border); background: var(--documentation-panel); }
3132
- .documentation-tab-buttons button { flex: 0 0 auto; padding: 6px 10px; border: 0; border-radius: 7px; background: transparent; color: var(--documentation-muted); cursor: pointer; font-size: 12.5px; font-weight: 620; }
3266
+ .documentation-tab-buttons button { flex: 0 0 auto; padding: 6px 11px; border: 0; border-radius: 7px; background: transparent; color: var(--documentation-muted); cursor: pointer; font-size: 13.5px; font-weight: 620; }
3133
3267
  .documentation-tab-buttons button[aria-selected="true"] { background: var(--documentation-surface); color: var(--documentation-text); box-shadow: var(--documentation-shadow-sm); }
3134
3268
  .documentation-tab { padding: 16px 18px 2px; }
3135
3269
  .documentation-tab > :first-child { margin-top: 0; }
3136
3270
  .documentation-code-group { margin: 23px 0; overflow: hidden; border: 1px solid var(--documentation-border-strong); border-radius: 12px; background: var(--documentation-surface); }
3137
- .documentation-code-group-title { padding: 8px 13px; border-bottom: 1px solid var(--documentation-border); background: var(--documentation-panel); color: var(--documentation-muted); font-size: 11px; font-weight: 650; }
3271
+ .documentation-code-group-title { padding: 8px 13px; border-bottom: 1px solid var(--documentation-border); background: var(--documentation-panel); color: var(--documentation-muted); font-size: 12px; font-weight: 650; }
3138
3272
  .documentation-code-group .documentation-tab-buttons { border-color: color-mix(in srgb, var(--documentation-border) 72%, transparent); background: var(--documentation-panel); }
3139
3273
  .documentation-code-tab { padding: 0; }
3140
- .documentation-code-group pre { margin: 0; border: 0; border-radius: 0; box-shadow: none; }
3274
+ .documentation-code-group .documentation-code-block { margin: 0; }
3275
+ .documentation-prose .documentation-code-group pre { margin: 0; border: 0; border-radius: 0; box-shadow: none; }
3141
3276
 
3142
3277
  .documentation-api-badge { display: flex; align-items: center; gap: 9px; margin: 0 0 25px; padding: 11px 13px; border: 1px solid var(--documentation-border); border-radius: 10px; background: var(--documentation-panel); }
3143
3278
  .method { display: inline-grid; place-items: center; min-width: 52px; padding: 4px 7px; border-radius: 6px; background: #3178e8; color: white; font: 750 10px/1.3 var(--documentation-font-mono); letter-spacing: .035em; }
@@ -3155,26 +3290,25 @@ var DOCUMENTATION_CONTENT_CSS = String.raw`
3155
3290
  .documentation-playground > button:disabled { opacity: .58; cursor: wait; }
3156
3291
  .documentation-playground > pre { max-height: 320px; overflow: auto; margin: 14px 0 0; padding: 13px; border-radius: 8px; background: var(--documentation-code-bg); color: var(--documentation-code-text); font: 11.5px/1.55 var(--documentation-font-mono); white-space: pre-wrap; }
3157
3292
 
3158
- .documentation-context-rail { position: sticky; top: 92px; align-self: start; max-height: calc(100vh - 116px); overflow: auto; padding-left: 18px; }
3293
+ .documentation-context-rail { position: sticky; top: 96px; align-self: start; max-height: calc(100vh - 120px); overflow: auto; padding-left: 18px; }
3159
3294
  .documentation-outline { display: grid; gap: 2px; }
3160
- .documentation-outline h2 { margin: 0 0 7px; color: var(--documentation-text); font-size: 11.5px; font-weight: 700; }
3161
- .documentation-outline a { padding: 3px 0; color: var(--documentation-muted); font-size: 11.5px; line-height: 1.42; text-decoration: none; transition: color .12s; }
3295
+ .documentation-outline h2 { margin: 0 0 9px; color: var(--documentation-text); font-size: 13.5px; font-weight: 650; }
3296
+ .documentation-outline a { padding: 5px 0; color: var(--documentation-muted); font-size: 13.5px; line-height: 1.45; text-decoration: none; transition: color .12s; }
3162
3297
  .documentation-outline a:hover, .documentation-outline a.is-active { color: var(--documentation-text); }
3163
- .documentation-outline a.is-active { font-weight: 640; }
3164
- .documentation-outline a.depth-3 { padding-left: 11px; }
3165
- .documentation-feedback { display: flex; align-items: center; gap: 7px; min-height: 47px; margin-top: 58px; padding: 11px 13px; border: 1px solid var(--documentation-border); border-radius: 10px; background: var(--documentation-panel); color: var(--documentation-muted); font-size: 12px; }
3166
- .documentation-feedback > span { margin-right: auto; }
3167
- .documentation-feedback button { padding: 5px 9px; border: 1px solid var(--documentation-border); border-radius: 7px; background: var(--documentation-surface); color: var(--documentation-muted); cursor: pointer; font-size: 11px; }
3168
- .documentation-feedback button:hover { color: var(--documentation-text); }
3169
- .documentation-feedback p { display: flex; align-items: center; gap: 7px; margin: 0; }
3170
- .documentation-feedback svg { width: 15px; color: #17a673; }
3298
+ .documentation-outline a.is-active { color: color-mix(in srgb, var(--documentation-accent) 74%, var(--documentation-text)); font-weight: 640; }
3299
+ .documentation-outline a.depth-3 { padding-left: 13px; }
3300
+ /* The outline for viewports that have no room for the sticky rail. */
3301
+ .documentation-outline-disclosure { display: none; margin: 0 0 32px; border: 1px solid var(--documentation-border); border-radius: 10px; background: var(--documentation-surface); }
3302
+ .documentation-outline-disclosure > summary { display: flex; align-items: center; gap: 8px; padding: 11px 14px; color: var(--documentation-text); cursor: pointer; font-size: 14px; font-weight: 650; list-style: none; }
3303
+ .documentation-outline-disclosure > summary::-webkit-details-marker { display: none; }
3304
+ .documentation-outline-disclosure > summary svg { width: 15px; height: 15px; color: var(--documentation-muted); }
3305
+ .documentation-outline-disclosure .documentation-outline { padding: 0 14px 12px; }
3171
3306
  .documentation-pagination { display: grid; grid-template-columns: 1fr 1fr; gap: 13px; margin-top: auto; padding-top: 28px; }
3172
- .documentation-app.has-assistant .documentation-pagination { margin-bottom: 76px; transform: translateY(76px); }
3173
- .documentation-pagination a { display: flex; flex-direction: column; min-height: 86px; padding: 14px 15px; border: 1px solid var(--documentation-border); border-radius: 10px; background: var(--documentation-surface); text-decoration: none; transition: border-color .15s, transform .15s; }
3307
+ .documentation-pagination a { display: flex; flex-direction: column; min-height: 86px; padding: 14px 16px; border: 1px solid var(--documentation-border); border-radius: 10px; background: var(--documentation-surface); text-decoration: none; transition: border-color .15s, transform .15s; }
3174
3308
  .documentation-pagination a:hover { border-color: color-mix(in srgb, var(--documentation-accent) 38%, var(--documentation-border)); transform: translateY(-1px); }
3175
3309
  .documentation-pagination a:last-child { text-align: right; }
3176
- .documentation-pagination small { margin-bottom: 7px; color: var(--documentation-faint); font-size: 10.5px; font-weight: 650; text-transform: uppercase; letter-spacing: .05em; }
3177
- .documentation-pagination span { display: flex; align-items: center; justify-content: space-between; gap: 8px; color: var(--documentation-text); font-size: 13px; font-weight: 650; }
3310
+ .documentation-pagination small { margin-bottom: 7px; color: var(--documentation-faint); font-size: 12px; font-weight: 650; text-transform: uppercase; letter-spacing: .05em; }
3311
+ .documentation-pagination span { display: flex; align-items: center; justify-content: space-between; gap: 8px; color: var(--documentation-text); font-size: 15px; font-weight: 650; }
3178
3312
  .documentation-pagination a:last-child span { justify-content: flex-end; }
3179
3313
  .documentation-pagination svg { flex: 0 0 auto; width: 15px; }
3180
3314
  .documentation-pagination svg.is-back { transform: rotate(180deg); }
@@ -3189,7 +3323,7 @@ var DOCUMENTATION_NAVIGATION_CSS = String.raw`
3189
3323
  .documentation-brand-mark::before { content: ""; position: absolute; inset: -7px; border-radius: 50%; background: radial-gradient(circle, color-mix(in srgb, var(--documentation-accent-2) 15%, transparent), transparent 68%); }
3190
3324
  .documentation-brand-mark svg { position: relative; width: 27px; height: 27px; }
3191
3325
  .documentation-brand-name { overflow: hidden; font-size: 16px; font-weight: 720; letter-spacing: -.025em; text-overflow: ellipsis; white-space: nowrap; }
3192
- .documentation-brand-product { padding-left: 10px; border-left: 1px solid var(--documentation-border-strong); color: var(--documentation-muted); font-size: 12px; font-weight: 600; letter-spacing: .04em; }
3326
+ .documentation-brand-product { padding-left: 10px; border-left: 1px solid var(--documentation-border-strong); color: var(--documentation-muted); font-size: 13px; font-weight: 600; letter-spacing: .04em; }
3193
3327
  .documentation-brand-logo { max-width: 145px; max-height: 26px; object-fit: contain; object-position: left center; }
3194
3328
  .documentation-brand-logo-dark { display: none; }
3195
3329
  :root[data-theme="dark"] .documentation-brand-logo-light { display: none; }
@@ -3200,10 +3334,10 @@ var DOCUMENTATION_NAVIGATION_CSS = String.raw`
3200
3334
  .documentation-search-trigger:hover { border-color: var(--documentation-border-strong); color: var(--documentation-text); transform: translateY(-1px); }
3201
3335
  .documentation-search-trigger > span { min-width: 0; flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
3202
3336
  .documentation-search-trigger svg { width: 16px; }
3203
- .documentation-search-trigger kbd { padding: 2px 5px; border: 1px solid var(--documentation-border); border-radius: 5px; background: var(--documentation-panel); color: var(--documentation-faint); font: 600 10px/1.3 var(--documentation-font-mono); }
3337
+ .documentation-search-trigger kbd { padding: 2px 6px; border: 1px solid var(--documentation-border); border-radius: 5px; background: var(--documentation-panel); color: var(--documentation-faint); font: 600 12px/1.3 var(--documentation-font-mono); }
3204
3338
 
3205
3339
  .documentation-top-links { display: flex; align-items: center; gap: 18px; height: 100%; padding: 0 24px 0 10px; }
3206
- .documentation-top-links a { display: inline-flex; align-items: center; gap: 4px; color: var(--documentation-muted); font-size: 13px; font-weight: 560; text-decoration: none; white-space: nowrap; }
3340
+ .documentation-top-links a { display: inline-flex; align-items: center; gap: 4px; color: var(--documentation-muted); font-size: 14px; font-weight: 560; text-decoration: none; white-space: nowrap; }
3207
3341
  .documentation-top-links a:hover { color: var(--documentation-text); }
3208
3342
  .documentation-top-links svg { width: 12px; height: 12px; }
3209
3343
  .documentation-mobile-actions { display: none; align-items: center; gap: 3px; padding-right: 12px; }
@@ -3214,15 +3348,15 @@ var DOCUMENTATION_NAVIGATION_CSS = String.raw`
3214
3348
  .documentation-sidebar { position: fixed; z-index: 30; inset: var(--documentation-header-height) auto 0 0; display: flex; flex-direction: column; width: var(--documentation-sidebar-width); border-right: 1px solid var(--documentation-border); background: var(--documentation-bg); }
3215
3349
  .documentation-page-tree { flex: 1; overflow: auto; padding: 26px 18px 36px 22px; overscroll-behavior: contain; scrollbar-width: thin; scrollbar-color: var(--documentation-border-strong) transparent; }
3216
3350
  .documentation-nav-section { margin: 0 0 25px; }
3217
- .documentation-nav-section > h2 { margin: 0 0 7px; padding: 0 9px; color: var(--documentation-text-soft); font-size: 11.5px; font-weight: 720; letter-spacing: .025em; }
3218
- .documentation-nav-link { display: flex; align-items: center; justify-content: space-between; gap: 8px; min-height: 33px; margin: 1px 0; padding: 6px 9px; border-radius: 8px; color: var(--documentation-muted); font-size: 13.25px; line-height: 1.38; text-decoration: none; transition: background .12s, color .12s; }
3351
+ .documentation-nav-section > h2 { margin: 0 0 8px; padding: 0 9px; color: var(--documentation-text); font-size: 14px; font-weight: 650; }
3352
+ .documentation-nav-link { display: flex; align-items: center; justify-content: space-between; gap: 8px; min-height: 34px; margin: 1px 0; padding: 6px 9px; border-radius: 8px; color: var(--documentation-muted); font-size: 14px; line-height: 1.4; text-decoration: none; transition: background .12s, color .12s; }
3219
3353
  .documentation-nav-link > span { min-width: 0; overflow-wrap: anywhere; }
3220
3354
  .documentation-nav-link > svg { flex: 0 0 auto; width: 12px; height: 12px; }
3221
3355
  .documentation-nav-link:hover { background: var(--documentation-panel); color: var(--documentation-text); }
3222
3356
  .documentation-nav-link.is-active { position: relative; background: linear-gradient(90deg, color-mix(in srgb, var(--documentation-accent) 11%, transparent), color-mix(in srgb, var(--documentation-accent-2) 5%, transparent)); color: color-mix(in srgb, var(--documentation-accent) 77%, var(--documentation-text)); font-weight: 650; }
3223
3357
  .documentation-nav-link.is-active::before { content: ""; position: absolute; inset: 8px auto 8px -5px; width: 2px; border-radius: 4px; background: linear-gradient(var(--documentation-accent), var(--documentation-accent-2)); box-shadow: 0 0 10px color-mix(in srgb, var(--documentation-accent-2) 52%, transparent); }
3224
3358
  .documentation-nav-folder { margin: 2px 0; }
3225
- .documentation-nav-folder > summary { display: flex; align-items: center; justify-content: space-between; min-height: 34px; padding: 6px 9px; border-radius: 8px; color: var(--documentation-muted); cursor: pointer; font-size: 13.25px; font-weight: 620; list-style: none; }
3359
+ .documentation-nav-folder > summary { display: flex; align-items: center; justify-content: space-between; min-height: 34px; padding: 6px 9px; border-radius: 8px; color: var(--documentation-muted); cursor: pointer; font-size: 14px; font-weight: 620; list-style: none; }
3226
3360
  .documentation-nav-folder > summary::-webkit-details-marker { display: none; }
3227
3361
  .documentation-nav-folder > summary:hover { background: var(--documentation-panel); color: var(--documentation-text); }
3228
3362
  .documentation-nav-folder > summary svg { width: 13px; transition: transform .16s; }
@@ -3231,7 +3365,7 @@ var DOCUMENTATION_NAVIGATION_CSS = String.raw`
3231
3365
 
3232
3366
  .documentation-sidebar-footer { flex: 0 0 auto; display: grid; gap: 11px; padding: 13px 20px 16px 22px; border-top: 1px solid var(--documentation-border); background: color-mix(in srgb, var(--documentation-panel) 46%, var(--documentation-bg)); }
3233
3367
  .documentation-sidebar-footer > nav { display: flex; flex-wrap: wrap; gap: 8px 13px; }
3234
- .documentation-sidebar-footer a, .documentation-sidebar-footer > span { color: var(--documentation-faint); font-size: 10.5px; text-decoration: none; }
3368
+ .documentation-sidebar-footer a, .documentation-sidebar-footer > span { color: var(--documentation-faint); font-size: 12px; text-decoration: none; }
3235
3369
  .documentation-sidebar-footer a:hover { color: var(--documentation-text); }
3236
3370
  .documentation-theme-controls { display: inline-flex; width: max-content; padding: 2px; border: 1px solid var(--documentation-border); border-radius: 9px; background: var(--documentation-surface); box-shadow: var(--documentation-shadow-sm); }
3237
3371
  .documentation-theme-controls button { display: grid; place-items: center; width: 28px; height: 25px; padding: 0; border: 0; border-radius: 6px; background: transparent; color: var(--documentation-faint); cursor: pointer; }
@@ -3250,23 +3384,27 @@ var DOCUMENTATION_OVERLAYS_CSS = String.raw`
3250
3384
  .documentation-search-input > svg { flex: 0 0 auto; width: 18px; color: var(--documentation-muted); }
3251
3385
  .documentation-search-input input { min-width: 0; flex: 1; border: 0; outline: 0; background: transparent; color: var(--documentation-text); font-size: 16px; }
3252
3386
  .documentation-search-input input::placeholder { color: var(--documentation-faint); }
3253
- .documentation-search-input kbd, .documentation-search-dialog footer kbd { padding: 2px 5px; border: 1px solid var(--documentation-border); border-radius: 5px; background: var(--documentation-panel); color: var(--documentation-faint); font: 600 9px/1.4 var(--documentation-font-mono); }
3387
+ .documentation-search-input kbd, .documentation-search-dialog footer kbd { padding: 2px 6px; border: 1px solid var(--documentation-border); border-radius: 5px; background: var(--documentation-panel); color: var(--documentation-faint); font: 600 11px/1.4 var(--documentation-font-mono); }
3254
3388
  .documentation-search-results { min-height: 180px; max-height: min(56vh, 500px); overflow: auto; padding: 7px; }
3255
3389
  .documentation-search-empty { display: grid; place-items: center; min-height: 180px; padding: 25px; color: var(--documentation-muted); text-align: center; }
3256
3390
  .documentation-search-empty svg { width: 29px; height: 29px; margin-bottom: 8px; color: var(--documentation-accent); }
3257
- .documentation-search-empty strong { color: var(--documentation-text); font-size: 14px; }
3258
- .documentation-search-empty span { font-size: 12px; }
3259
- .documentation-search-state { padding: 28px 16px; color: var(--documentation-muted); font-size: 13px; text-align: center; }
3260
- .documentation-search-result, .documentation-search-assistant { display: flex; align-items: center; justify-content: space-between; gap: 14px; width: 100%; min-height: 64px; padding: 10px 11px; border: 0; border-radius: 9px; background: transparent; color: var(--documentation-text); cursor: pointer; text-align: left; text-decoration: none; }
3391
+ .documentation-search-empty strong { color: var(--documentation-text); font-size: 15px; }
3392
+ .documentation-search-empty span { font-size: 13px; }
3393
+ .documentation-search-state { padding: 28px 16px; color: var(--documentation-muted); font-size: 14px; text-align: center; }
3394
+ .documentation-search-result, .documentation-search-assistant { display: flex; align-items: center; justify-content: space-between; gap: 14px; width: 100%; min-height: 64px; padding: 10px 12px; border: 0; border-radius: 9px; background: transparent; color: var(--documentation-text); cursor: pointer; text-align: left; text-decoration: none; }
3261
3395
  .documentation-search-result.is-active, .documentation-search-assistant.is-active { background: var(--documentation-panel); }
3262
- .documentation-search-result > span, .documentation-search-assistant > span { min-width: 0; flex: 1; display: grid; }
3263
- .documentation-search-result strong, .documentation-search-assistant strong { overflow: hidden; font-size: 13px; font-weight: 670; text-overflow: ellipsis; white-space: nowrap; }
3264
- .documentation-search-result small, .documentation-search-assistant small { overflow: hidden; color: var(--documentation-muted); font-size: 11.5px; line-height: 1.5; text-overflow: ellipsis; white-space: nowrap; }
3396
+ .documentation-search-copy, .documentation-search-assistant > span { min-width: 0; flex: 1; display: grid; gap: 2px; }
3397
+ .documentation-search-copy strong, .documentation-search-assistant strong { overflow: hidden; font-size: 15px; font-weight: 660; text-overflow: ellipsis; white-space: nowrap; }
3398
+ .documentation-search-copy small, .documentation-search-assistant small { overflow: hidden; color: var(--documentation-muted); font-size: 13px; line-height: 1.45; text-overflow: ellipsis; white-space: nowrap; }
3399
+ .documentation-search-crumbs { display: flex; align-items: center; gap: 5px; min-width: 0; overflow: hidden; color: var(--documentation-muted); font-size: 13px; line-height: 1.45; white-space: nowrap; }
3400
+ .documentation-search-crumbs svg { flex: 0 0 auto; width: 11px; height: 11px; color: var(--documentation-faint); }
3401
+ .documentation-search-kind { flex: 0 0 auto; display: grid; place-items: center; width: 26px; height: 26px; border-radius: 7px; background: var(--documentation-panel); color: var(--documentation-muted); }
3402
+ .documentation-search-kind svg { width: 14px; height: 14px; }
3265
3403
  .documentation-search-result > svg, .documentation-search-assistant > svg:last-child { flex: 0 0 auto; width: 14px; color: var(--documentation-faint); }
3266
3404
  .documentation-search-assistant { border-top: 1px solid var(--documentation-border); border-radius: 0 0 9px 9px; color: color-mix(in srgb, var(--documentation-accent) 76%, var(--documentation-text)); }
3267
3405
  .documentation-search-assistant > svg:first-child { flex: 0 0 auto; width: 19px; }
3268
- .documentation-search-result mark { border-radius: 3px; background: color-mix(in srgb, var(--documentation-accent) 18%, transparent); color: inherit; }
3269
- .documentation-search-dialog > footer { display: flex; gap: 17px; padding: 8px 13px; border-top: 1px solid var(--documentation-border); background: var(--documentation-panel); color: var(--documentation-faint); font-size: 9.5px; }
3406
+ .documentation-search-result mark { border-radius: 3px; background: color-mix(in srgb, var(--documentation-accent) 18%, transparent); color: inherit; font-weight: 700; }
3407
+ .documentation-search-dialog > footer { display: flex; gap: 17px; padding: 9px 14px; border-top: 1px solid var(--documentation-border); background: var(--documentation-panel); color: var(--documentation-faint); font-size: 12px; }
3270
3408
  .documentation-search-dialog > footer span { display: flex; align-items: center; gap: 3px; }
3271
3409
 
3272
3410
  .documentation-mobile-nav { display: flex; flex-direction: column; width: min(342px, 88vw); height: 100%; border-right: 1px solid var(--documentation-border); background: var(--documentation-bg); box-shadow: var(--documentation-shadow-lg); animation: documentation-drawer-in .2s ease-out; }
@@ -3275,31 +3413,45 @@ var DOCUMENTATION_OVERLAYS_CSS = String.raw`
3275
3413
  .documentation-mobile-nav > header .documentation-icon-button { margin-right: 12px; }
3276
3414
  .documentation-mobile-nav > .documentation-page-tree { padding-top: 22px; }
3277
3415
  .documentation-mobile-nav > footer { display: flex; align-items: center; flex-wrap: wrap; gap: 8px 13px; padding: 13px 18px; border-top: 1px solid var(--documentation-border); }
3278
- .documentation-mobile-nav > footer a { color: var(--documentation-muted); font-size: 11px; text-decoration: none; }
3416
+ .documentation-mobile-nav > footer a { color: var(--documentation-muted); font-size: 13px; text-decoration: none; }
3279
3417
 
3280
- .documentation-assistant-launcher { position: fixed; z-index: 70; left: 50%; bottom: 20px; display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: 0; width: min(452px, calc(100vw - 36px)); min-height: 48px; padding: 5px; border: 1px solid color-mix(in srgb, var(--documentation-border-strong) 92%, var(--documentation-accent)); border-radius: 13px; background: color-mix(in srgb, var(--documentation-surface-raised) 96%, transparent); color: var(--documentation-text); box-shadow: 0 18px 45px rgba(15, 18, 28, .11), 0 2px 8px rgba(15, 18, 28, .05); transform: translateX(-50%); backdrop-filter: blur(18px) saturate(1.1); transition: border-color .16s, box-shadow .16s, transform .16s; }
3281
- .documentation-assistant-launcher:hover { border-color: color-mix(in srgb, var(--documentation-accent) 32%, var(--documentation-border-strong)); box-shadow: 0 20px 48px rgba(15, 18, 28, .14), 0 2px 8px rgba(15, 18, 28, .06); transform: translateX(-50%) translateY(-1px); }
3282
- .documentation-assistant-launcher input { min-width: 0; height: 36px; padding: 0 12px; border: 0; outline: 0; background: transparent; color: var(--documentation-text); font-size: 13px; }
3418
+ /* Sticky inside the reading column instead of fixed to the viewport: it tracks
3419
+ * the column's centre line, never covers the sidebar or outline, and scrolls
3420
+ * away above the pagination rather than sitting on top of it. */
3421
+ .documentation-launcher-dock { position: sticky; z-index: 40; bottom: 0; display: flex; justify-content: center; margin-top: auto; padding: 44px 0 16px; pointer-events: none; }
3422
+ .documentation-launcher-dock::before { content: ""; position: absolute; z-index: -1; inset: 0; background: linear-gradient(to bottom, transparent, var(--documentation-brand-bg) 58%); }
3423
+ .documentation-launcher-dock + .documentation-pagination { margin-top: 0; }
3424
+ .documentation-assistant-launcher { view-transition-name: documentation-assistant-launcher; position: relative; display: grid; grid-template-columns: fit-content(40%) minmax(0, 1fr) auto auto; align-items: center; gap: 0; width: min(452px, 100%); min-height: 48px; padding: 5px; border: 1px solid color-mix(in srgb, var(--documentation-border-strong) 92%, var(--documentation-accent)); border-radius: 13px; background: color-mix(in srgb, var(--documentation-surface-raised) 96%, transparent); color: var(--documentation-text); box-shadow: 0 18px 45px rgba(15, 18, 28, .11), 0 2px 8px rgba(15, 18, 28, .05); pointer-events: auto; backdrop-filter: blur(18px) saturate(1.1); transition: border-color .16s, box-shadow .16s, transform .16s; }
3425
+ .documentation-assistant-launcher:hover { border-color: color-mix(in srgb, var(--documentation-accent) 32%, var(--documentation-border-strong)); box-shadow: 0 20px 48px rgba(15, 18, 28, .14), 0 2px 8px rgba(15, 18, 28, .06); transform: translateY(-1px); }
3426
+ .documentation-assistant-launcher input { min-width: 0; height: 36px; padding: 0 12px; border: 0; outline: 0; background: transparent; color: var(--documentation-text); font-size: 14px; }
3283
3427
  .documentation-assistant-launcher input::placeholder { color: var(--documentation-muted); }
3284
- .documentation-launcher-agent, .documentation-launcher-send { display: grid; place-items: center; height: 36px; border: 0; border-radius: 9px; cursor: pointer; }
3285
- .documentation-launcher-agent { width: auto; padding: 0 13px 0 9px; border-right: 1px solid var(--documentation-border); border-radius: 0; background: transparent; color: var(--documentation-text-soft); font-size: 11.5px; font-weight: 650; white-space: nowrap; }
3428
+ .documentation-launcher-send { display: grid; place-items: center; height: 36px; border: 0; border-radius: 9px; cursor: pointer; }
3429
+ /* The 40% cap lives on the grid track: a percentage max-width here would
3430
+ * resolve against that track instead of the launcher. */
3431
+ .documentation-launcher-agent { display: flex; align-items: center; gap: 4px; min-width: 0; height: 36px; padding: 0 13px 0 9px; border: 0; border-right: 1px solid var(--documentation-border); border-radius: 0; background: transparent; color: var(--documentation-text-soft); cursor: pointer; font-size: 12.5px; font-weight: 650; white-space: nowrap; }
3432
+ .documentation-launcher-agent-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
3286
3433
  .documentation-launcher-agent:hover { color: var(--documentation-accent); }
3287
- .documentation-launcher-send { width: 36px; padding: 0; }
3288
- .documentation-launcher-send { background: var(--documentation-accent); color: #fff; }
3434
+ .documentation-launcher-hint { display: grid; grid-auto-flow: column; gap: 3px; padding-right: 8px; }
3435
+ .documentation-launcher-hint kbd { padding: 2px 5px; border: 1px solid var(--documentation-border); border-radius: 5px; background: var(--documentation-panel); color: var(--documentation-faint); font: 600 11px/1.3 var(--documentation-font-mono); }
3436
+ .documentation-launcher-send { width: 36px; padding: 0; background: var(--documentation-accent); color: #fff; }
3289
3437
  .documentation-launcher-send:disabled { background: var(--documentation-panel); color: var(--documentation-faint); cursor: default; }
3290
3438
  .documentation-launcher-send svg { width: 15px; }
3291
- .documentation-assistant { position: fixed; z-index: 90; left: 50%; bottom: 18px; display: grid; grid-template-rows: auto minmax(0, 1fr) auto auto; width: min(620px, calc(100vw - 36px)); height: min(570px, calc(100vh - 94px)); overflow: hidden; border: 1px solid var(--documentation-border-strong); border-radius: 16px; background: var(--documentation-surface); box-shadow: 0 28px 80px rgba(15, 18, 28, .18), 0 6px 22px rgba(15, 18, 28, .08); animation: documentation-assistant-in .2s ease-out; transform: translateX(-50%); }
3439
+ /* Docked beside the article on desktop so the page being asked about stays
3440
+ * readable; the narrow breakpoints below restore the floating card and sheet. */
3441
+ .documentation-assistant { view-transition-name: documentation-assistant; position: fixed; z-index: 90; inset: var(--documentation-header-height) 0 0 auto; display: grid; grid-template-rows: auto minmax(0, 1fr) auto auto; width: var(--documentation-assistant-width); overflow: hidden; border-left: 1px solid var(--documentation-border-strong); background: var(--documentation-surface); box-shadow: -18px 0 48px rgba(15, 18, 28, .06); animation: documentation-assistant-dock-in .2s ease-out; }
3442
+ .documentation-app.is-assistant-open .documentation-main { margin-right: var(--documentation-assistant-width); }
3443
+ .documentation-app.is-assistant-open .documentation-header { right: var(--documentation-assistant-width); }
3292
3444
  .documentation-assistant > header { display: flex; align-items: center; justify-content: space-between; min-height: 54px; padding: 0 11px 0 18px; border-bottom: 1px solid var(--documentation-border); }
3293
3445
  .documentation-assistant > header > div { display: flex; align-items: center; }
3294
3446
  .documentation-assistant > header > div > span { display: grid; gap: 1px; }
3295
- .documentation-assistant > header strong { font-size: 13px; font-weight: 620; letter-spacing: -.01em; }
3296
- .documentation-assistant > header small { color: var(--documentation-muted); font-size: 10.5px; }
3447
+ .documentation-assistant > header strong { font-size: 14px; font-weight: 620; letter-spacing: -.01em; }
3448
+ .documentation-assistant > header small { color: var(--documentation-muted); font-size: 12px; }
3297
3449
  .documentation-assistant > header button { display: grid; place-items: center; width: 32px; height: 32px; padding: 0; border: 0; border-radius: 8px; background: transparent; color: var(--documentation-muted); cursor: pointer; }
3298
3450
  .documentation-assistant > header button:hover { background: var(--documentation-panel); color: var(--documentation-text); }
3299
3451
  .documentation-assistant > header button:focus-visible { outline-width: 1px; outline-offset: 1px; }
3300
3452
  .documentation-assistant > header button svg { width: 15px; height: 15px; }
3301
3453
  .documentation-assistant-messages { overflow: auto; padding: 20px 20px 14px; overscroll-behavior: contain; }
3302
- .documentation-assistant-message { display: flex; align-items: flex-start; margin: 0 0 20px; color: var(--documentation-text-soft); font-size: 13px; line-height: 1.64; }
3454
+ .documentation-assistant-message { display: flex; align-items: flex-start; margin: 0 0 20px; color: var(--documentation-text-soft); font-size: 14.5px; line-height: 1.62; }
3303
3455
  .documentation-assistant-message > div { min-width: 0; max-width: 590px; }
3304
3456
  .documentation-assistant-message.is-user { justify-content: flex-end; margin-left: 54px; }
3305
3457
  .documentation-assistant-message.is-user > div { padding: 8px 11px; border: 1px solid var(--documentation-border); border-radius: 10px; background: var(--documentation-panel); color: var(--documentation-text); }
@@ -3310,27 +3462,28 @@ var DOCUMENTATION_OVERLAYS_CSS = String.raw`
3310
3462
  .documentation-assistant-markdown p { margin: 0 0 11px; }
3311
3463
  .documentation-assistant-markdown ul, .documentation-assistant-markdown ol { margin: 0 0 12px; padding-left: 20px; }
3312
3464
  .documentation-assistant-markdown li { margin: 3px 0; }
3313
- .documentation-assistant-heading { display: block; margin: 15px 0 6px; color: var(--documentation-text); font-family: var(--documentation-font-heading); font-size: 13px; }
3465
+ .documentation-assistant-heading { display: block; margin: 15px 0 6px; color: var(--documentation-text); font-family: var(--documentation-font-heading); font-size: 14.5px; }
3314
3466
  .documentation-assistant-code { overflow: hidden; margin: 12px 0; border: 1px solid var(--documentation-border-strong); border-radius: 10px; background: var(--documentation-code-bg); color: var(--documentation-code-text); }
3315
- .documentation-assistant-code figcaption { display: flex; align-items: center; justify-content: space-between; min-height: 34px; padding: 0 8px 0 12px; border-bottom: 1px solid rgba(255,255,255,.09); background: var(--documentation-code-panel); color: #aeb5c6; font: 600 10.5px/1.3 var(--documentation-font-mono); }
3316
- .documentation-assistant-code button { padding: 4px 7px; border: 1px solid rgba(255,255,255,.1); border-radius: 6px; background: rgba(255,255,255,.06); color: inherit; cursor: pointer; font-size: 10px; }
3317
- .documentation-assistant-code pre { overflow: auto; margin: 0; padding: 13px; font: 11.5px/1.58 var(--documentation-font-mono); }
3467
+ .documentation-assistant-code figcaption { display: flex; align-items: center; justify-content: space-between; min-height: 34px; padding: 0 8px 0 12px; border-bottom: 1px solid rgba(255,255,255,.09); background: var(--documentation-code-panel); color: #aeb5c6; font: 600 12px/1.3 var(--documentation-font-mono); }
3468
+ .documentation-assistant-code button { padding: 4px 8px; border: 1px solid rgba(255,255,255,.1); border-radius: 6px; background: rgba(255,255,255,.06); color: inherit; cursor: pointer; font-size: 12px; }
3469
+ .documentation-assistant-code pre { overflow: auto; margin: 0; padding: 13px; font: 13px/1.6 var(--documentation-font-mono); }
3318
3470
  .documentation-assistant-code code { padding: 0; border: 0; background: transparent; color: inherit; font: inherit; white-space: pre; }
3319
- .documentation-assistant-activity { display: inline-flex; align-items: center; gap: 8px; color: var(--documentation-muted); font-size: 12px; }
3471
+ .documentation-assistant-activity { display: inline-flex; align-items: center; gap: 8px; color: var(--documentation-muted); font-size: 13px; }
3320
3472
  .documentation-assistant-activity > span { width: 6px; height: 6px; border-radius: 50%; background: var(--documentation-accent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--documentation-accent) 10%, transparent); animation: documentation-activity 1.25s ease-in-out infinite; }
3321
3473
  .documentation-assistant-suggestions { display: grid; gap: 7px; margin-top: 26px; }
3322
- .documentation-assistant-suggestions p { margin: 0 0 1px; color: var(--documentation-faint); font-size: 10px; font-weight: 650; letter-spacing: .035em; text-transform: uppercase; }
3323
- .documentation-assistant-suggestions button { min-height: 38px; padding: 8px 11px; border: 1px solid var(--documentation-border); border-radius: 9px; background: var(--documentation-bg); color: var(--documentation-muted); cursor: pointer; font-size: 12px; text-align: left; transition: border-color .14s, background .14s, color .14s; }
3474
+ .documentation-assistant-suggestions p { margin: 0 0 1px; color: var(--documentation-faint); font-size: 12px; font-weight: 650; letter-spacing: .035em; text-transform: uppercase; }
3475
+ .documentation-assistant-suggestions button { min-height: 40px; padding: 9px 12px; border: 1px solid var(--documentation-border); border-radius: 9px; background: var(--documentation-bg); color: var(--documentation-muted); cursor: pointer; font-size: 13.5px; text-align: left; transition: border-color .14s, background .14s, color .14s; }
3324
3476
  .documentation-assistant-suggestions button:hover { border-color: var(--documentation-border-strong); background: var(--documentation-panel); color: var(--documentation-text); }
3325
3477
  .documentation-assistant-composer { display: flex; align-items: flex-end; gap: 7px; margin: 0 16px 9px; padding: 7px; border: 1px solid var(--documentation-border-strong); border-radius: 11px; background: var(--documentation-bg); box-shadow: 0 3px 12px rgba(15, 18, 28, .045); }
3326
3478
  .documentation-assistant-composer:focus-within { border-color: color-mix(in srgb, var(--documentation-accent) 52%, var(--documentation-border)); box-shadow: 0 0 0 3px color-mix(in srgb, var(--documentation-accent) 9%, transparent); }
3327
- .documentation-assistant-composer textarea { min-height: 41px; max-height: 160px; flex: 1; padding: 4px 5px; resize: none; border: 0; outline: 0; background: transparent; color: var(--documentation-text); font-size: 12.5px; line-height: 1.5; }
3479
+ .documentation-assistant-composer textarea { min-height: 41px; max-height: 160px; flex: 1; padding: 4px 5px; resize: none; border: 0; outline: 0; background: transparent; color: var(--documentation-text); font-size: 14px; line-height: 1.5; }
3328
3480
  .documentation-assistant-composer button { display: grid; place-items: center; width: 32px; height: 32px; padding: 0; border: 0; border-radius: 8px; background: var(--documentation-accent); color: white; cursor: pointer; }
3329
3481
  .documentation-assistant-composer button:disabled { background: var(--documentation-panel-strong); color: var(--documentation-faint); cursor: default; }
3330
- .documentation-assistant > footer { padding: 0 18px 10px; color: var(--documentation-faint); font-size: 9.5px; text-align: center; }
3482
+ .documentation-assistant > footer { padding: 0 18px 12px; color: var(--documentation-faint); font-size: 12px; text-align: center; }
3331
3483
  @keyframes documentation-fade-in { from { opacity: 0; } }
3332
3484
  @keyframes documentation-dialog-in { from { opacity: 0; transform: translateY(-8px) scale(.99); } }
3333
3485
  @keyframes documentation-drawer-in { from { transform: translateX(-24px); } }
3486
+ @keyframes documentation-assistant-dock-in { from { transform: translateX(24px); opacity: .5; } }
3334
3487
  @keyframes documentation-assistant-in { from { transform: translateX(-50%) translateY(18px) scale(.985); opacity: .7; } }
3335
3488
  @keyframes documentation-page-out { to { opacity: 0; transform: translateY(-3px); } }
3336
3489
  @keyframes documentation-page-in { from { opacity: 0; transform: translateY(4px); } }
@@ -3342,9 +3495,16 @@ var DOCUMENTATION_OVERLAYS_CSS = String.raw`
3342
3495
  // src/documentation/runtime/styles/responsive.ts
3343
3496
  var DOCUMENTATION_RESPONSIVE_CSS = String.raw`
3344
3497
  @media (max-width: 1320px) {
3345
- .documentation-reader-grid { grid-template-columns: minmax(0, 640px) 190px; gap: 48px; padding-inline: 70px; }
3498
+ .documentation-reader-grid { grid-template-columns: minmax(0, 680px) 224px; gap: 48px; padding-inline: 70px; }
3346
3499
  .documentation-top-links { gap: 13px; padding-right: 16px; }
3347
- .documentation-top-links a { font-size: 12px; }
3500
+ .documentation-top-links a { font-size: 13px; }
3501
+ }
3502
+
3503
+ /* The rail's own cut-off is 1140px; a docked panel takes that much again out of
3504
+ * the row, so the same choice applies that much earlier while it is open. */
3505
+ @media (max-width: 1560px) {
3506
+ .documentation-app.is-assistant-open .documentation-reader-grid { grid-template-columns: minmax(0, 760px); }
3507
+ .documentation-app.is-assistant-open .documentation-context-rail { display: none; }
3348
3508
  }
3349
3509
 
3350
3510
  @media (max-width: 1140px) {
@@ -3353,6 +3513,11 @@ var DOCUMENTATION_RESPONSIVE_CSS = String.raw`
3353
3513
  .documentation-header { grid-template-columns: var(--documentation-sidebar-width) 1fr auto; }
3354
3514
  .documentation-top-links { display: none; }
3355
3515
  .documentation-breadcrumbs { display: flex; }
3516
+ .documentation-outline-disclosure { display: block; }
3517
+ /* Too narrow to dock beside the article; fall back to the floating card. */
3518
+ .documentation-assistant { inset: auto auto 18px 50%; width: min(620px, calc(100vw - 36px)); height: min(570px, calc(100vh - 94px)); border: 1px solid var(--documentation-border-strong); border-radius: 16px; box-shadow: 0 28px 80px rgba(15, 18, 28, .18), 0 6px 22px rgba(15, 18, 28, .08); transform: translateX(-50%); animation: documentation-assistant-in .2s ease-out; }
3519
+ .documentation-app.is-assistant-open .documentation-main { margin-right: 0; }
3520
+ .documentation-app.is-assistant-open .documentation-header { right: 0; }
3356
3521
  }
3357
3522
 
3358
3523
  @media (max-width: 900px) {
@@ -3362,44 +3527,49 @@ var DOCUMENTATION_RESPONSIVE_CSS = String.raw`
3362
3527
  .documentation-header-center, .documentation-sidebar { display: none; }
3363
3528
  .documentation-mobile-actions { display: flex; }
3364
3529
  .documentation-main { margin-left: 0; }
3365
- .documentation-reader-grid { padding: 44px 30px 90px; }
3530
+ .documentation-reader-grid { padding: 44px 30px 64px; }
3366
3531
  .documentation-assistant { width: min(660px, calc(100vw - 24px)); }
3367
3532
  }
3368
3533
 
3369
3534
  @media (max-width: 600px) {
3370
- body { font-size: 15px; }
3535
+ body { font-size: 16px; }
3371
3536
  .documentation-brand { padding-right: 8px; }
3372
3537
  .documentation-brand-product { display: none; }
3373
3538
  .documentation-mobile-actions { padding-right: 8px; }
3374
- .documentation-icon-button { width: 34px; }
3375
- .documentation-reader-grid { padding: 31px 19px 72px; }
3539
+ .documentation-icon-button { width: 44px; height: 44px; }
3540
+ .documentation-reader-grid { padding: 31px 19px 48px; }
3376
3541
  .documentation-breadcrumbs { margin-bottom: 19px; overflow: hidden; white-space: nowrap; }
3377
3542
  .documentation-breadcrumbs span { flex: 0 0 auto; }
3378
3543
  .documentation-article-header { margin-bottom: 30px; }
3379
3544
  .documentation-article-meta { align-items: flex-start; }
3380
3545
  .documentation-eyebrow { padding-top: 8px; }
3381
3546
  .documentation-contextual-primary button, .documentation-contextual-primary a { max-width: 112px; overflow: hidden; text-overflow: ellipsis; }
3382
- .documentation-article-header h1 { font-size: 32px; line-height: 1.13; }
3383
- .documentation-lede { font-size: 17px; line-height: 1.52; }
3547
+ .documentation-article-header h1 { font-size: 32px; line-height: 1.15; }
3548
+ .documentation-lede { font-size: 18px; line-height: 1.52; }
3384
3549
  .documentation-prose h2 { margin-top: 42px; font-size: 23px; }
3385
- .documentation-prose h3 { font-size: 18px; }
3386
- .documentation-prose pre { margin-inline: -5px; padding: 17px; border-radius: 10px; font-size: 12px; }
3387
- .documentation-code-actions { margin-right: -9px; margin-top: -9px; }
3550
+ .documentation-prose h3 { font-size: 19px; }
3551
+ .documentation-prose pre { margin-inline: -5px; padding: 17px; border-radius: 10px; font-size: 13px; }
3388
3552
  .documentation-pagination { grid-template-columns: 1fr; }
3389
- .documentation-app.has-assistant .documentation-pagination { margin-bottom: 124px; transform: translateY(124px); }
3390
- .documentation-feedback { align-items: flex-start; flex-wrap: wrap; }
3391
- .documentation-feedback > span { width: 100%; margin-bottom: 2px; }
3392
3553
  .documentation-search-layer { padding: 8px; align-items: stretch; }
3393
3554
  .documentation-search-dialog { display: grid; grid-template-rows: auto minmax(0, 1fr) auto; height: 100%; border-radius: 12px; }
3394
3555
  .documentation-search-results { max-height: none; }
3395
3556
  .documentation-search-dialog > footer { justify-content: center; }
3396
- .documentation-assistant-launcher { bottom: 12px; width: calc(100vw - 20px); }
3397
- .documentation-assistant-launcher kbd { display: none; }
3398
- .documentation-assistant { bottom: 0; width: 100%; height: calc(100vh - 8px); border-width: 1px 0 0; border-radius: 18px 18px 0 0; }
3557
+ .documentation-launcher-dock { padding-bottom: 12px; }
3558
+ .documentation-launcher-agent { padding: 0 9px; }
3559
+ .documentation-launcher-agent .documentation-launcher-agent-name { display: none; }
3560
+ .documentation-launcher-hint { display: none; }
3561
+ .documentation-assistant { inset: auto auto 0 0; width: 100%; height: calc(100vh - 8px); transform: none; border-width: 1px 0 0; border-radius: 18px 18px 0 0; }
3399
3562
  .documentation-assistant-suggestions { grid-template-columns: 1fr; }
3400
3563
  .documentation-playground-title { align-items: flex-start; flex-direction: column; }
3401
3564
  }
3402
3565
 
3566
+ /* Hover-only affordances: touch users get no reveal, so keep the space clear. */
3567
+ @media (hover: none) {
3568
+ .documentation-prose .documentation-heading-anchor { display: none; }
3569
+ .documentation-code-actions { opacity: 1; }
3570
+ .documentation-launcher-hint { display: none; }
3571
+ }
3572
+
3403
3573
  @media (prefers-reduced-motion: reduce) {
3404
3574
  html { scroll-behavior: auto; }
3405
3575
  *, *::before, *::after { animation-duration: .001ms !important; animation-iteration-count: 1 !important; scroll-behavior: auto !important; transition-duration: .001ms !important; }
@@ -3414,17 +3584,19 @@ function renderPage(options, assets = {}, runtime = createPageRuntime(options))
3414
3584
  const { config, page } = options;
3415
3585
  const { data: runtimeData, document: runtimeDocument } = runtime;
3416
3586
  const theme = runtimeData.config.theme;
3417
- const accent = validCssColor(theme.accent) ? theme.accent : "#635bff";
3587
+ const accent = documentationAccent(theme);
3418
3588
  const background = validCssColor(theme.background) ? theme.background : "#fbfcfe";
3419
3589
  const backgroundDark = validCssColor(theme.backgroundDark) ? theme.backgroundDark : "#0c0e14";
3420
3590
  const defaultMode = theme.defaultMode ?? "system";
3421
3591
  const bodyFont = cssFontStack(theme.bodyFont?.family);
3422
3592
  const headingFont = cssFontStack(theme.headingFont?.family ?? theme.bodyFont?.family);
3423
3593
  const monoFont = cssMonoFontStack(theme.monoFont?.family);
3424
- const fontFaces = renderFontFaces(theme);
3425
- const fontPreloads = renderFontPreloads(theme);
3594
+ const fonts = resolveDocumentationFonts(theme, options.basePath);
3595
+ const fontFaces = renderFontFaces(fonts);
3596
+ const fontPreloads = renderFontPreloads(fonts);
3426
3597
  const markup = assets.markup ?? renderDefaultDocumentation(runtimeData);
3427
3598
  const assetRoot = documentationPublicPath(options.basePath, "/assets");
3599
+ const favicon = theme.favicon ?? documentationPublicPath(options.basePath, "/assets/favicon.svg");
3428
3600
  return `<!doctype html>
3429
3601
  <html lang="en" data-theme-mode="${defaultMode}" data-theme-strict="${theme.strictMode ? "true" : "false"}" data-code-mode="${theme.codeBlockMode ?? "dark"}" data-background-decoration="${theme.backgroundDecoration ?? "none"}" data-eyebrow-style="${theme.eyebrowStyle ?? "section"}">
3430
3602
  <head>
@@ -3441,8 +3613,11 @@ function renderPage(options, assets = {}, runtime = createPageRuntime(options))
3441
3613
  <meta property="og:description" content="${escapeHtml(runtimeDocument.openGraph["og:description"] ?? "")}">
3442
3614
  ${runtimeDocument.openGraph["og:url"] ? `<meta property="og:url" content="${escapeHtml(runtimeDocument.openGraph["og:url"])}">` : ""}
3443
3615
  ${config.seo.ogImage ? `<meta property="og:image" content="${escapeHtml(config.seo.ogImage)}">` : ""}
3616
+ <meta name="twitter:card" content="${config.seo.ogImage ? "summary_large_image" : "summary"}">
3617
+ <meta name="theme-color" media="(prefers-color-scheme: light)" content="${background}">
3618
+ <meta name="theme-color" media="(prefers-color-scheme: dark)" content="${backgroundDark}">
3444
3619
  ${renderCustomMeta(config.seo.metaTags)}
3445
- ${theme.favicon ? `<link rel="icon" href="${escapeHtml(theme.favicon)}">` : ""}
3620
+ <link rel="icon" href="${escapeHtml(favicon)}">
3446
3621
  ${fontPreloads}
3447
3622
  <link rel="stylesheet" href="${assetRoot}/documentation.css">
3448
3623
  ${(assets.customStylesheets ?? []).map((href) => `<link rel="stylesheet" href="${escapeHtml(href)}">`).join("\n ")}
@@ -3456,25 +3631,21 @@ function renderPage(options, assets = {}, runtime = createPageRuntime(options))
3456
3631
  </body>
3457
3632
  </html>`;
3458
3633
  }
3459
- function renderFontFaces(theme) {
3460
- const fonts = [theme.bodyFont, theme.headingFont, theme.monoFont];
3461
- const seen = /* @__PURE__ */ new Set();
3462
- return fonts.flatMap((font) => {
3463
- if (!font?.source || !validFontSource(font.source)) return [];
3464
- const key = `${font.family}:${font.source}:${font.weight ?? "normal"}`;
3465
- if (seen.has(key)) return [];
3466
- seen.add(key);
3467
- const family = safeFontFamily(font.family);
3468
- const weight = typeof font.weight === "number" || /^(?:normal|bold|[1-9]00|[1-9]00\s+[1-9]00)$/i.test(String(font.weight)) ? String(font.weight ?? "normal") : "normal";
3469
- const format = font.format && /^[a-z0-9-]{2,20}$/i.test(font.format) ? ` format("${font.format}")` : "";
3470
- return [`@font-face{font-family:"${family}";src:url("${font.source}")${format};font-weight:${weight};font-display:swap}`];
3634
+ function renderFontFaces(fonts) {
3635
+ return fonts.map((font) => {
3636
+ const format = font.format ? ` format("${font.format}")` : "";
3637
+ return `@font-face{font-family:"${font.family}";src:url("${font.source}")${format};font-weight:${font.weight};font-display:swap}`;
3471
3638
  }).join("");
3472
3639
  }
3473
- function renderFontPreloads(theme) {
3474
- const sources = new Set(
3475
- [theme.bodyFont, theme.headingFont, theme.monoFont].flatMap((font) => font?.source && validFontSource(font.source) ? [font.source] : [])
3476
- );
3477
- return [...sources].map((source) => `<link rel="preload" href="${escapeHtml(source)}" as="font" type="font/woff2" crossorigin>`).join("\n ");
3640
+ function renderFontPreloads(fonts) {
3641
+ return fonts.map((font) => `<link rel="preload" href="${escapeHtml(font.source)}" as="font" type="font/woff2" crossorigin>`).join("\n ");
3642
+ }
3643
+ function documentationAccent(theme) {
3644
+ return validCssColor(theme.accent) ? theme.accent : "#635bff";
3645
+ }
3646
+ function renderDocumentationFavicon(theme) {
3647
+ return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path d="M16 2.5c.5 7.7 5.8 13 13.5 13.5-7.7.5-13 5.8-13.5 13.5C15.5 21.8 10.2 16.5 2.5 16 10.2 15.5 15.5 10.2 16 2.5Z" fill="${escapeHtml(documentationAccent(theme))}"/></svg>
3648
+ `;
3478
3649
  }
3479
3650
  function renderCustomMeta(metaTags) {
3480
3651
  if (!metaTags) return "";
@@ -3617,19 +3788,13 @@ function validCssColor(value) {
3617
3788
  return /^(?:#[0-9a-f]{3,8}|(?:rgb|hsl)a?\([0-9.,%\s]+\)|[a-z]{3,20})$/i.test(value);
3618
3789
  }
3619
3790
  function cssFontStack(value) {
3620
- const family = safeFontFamily(value ?? "Inter");
3791
+ const family = safeFontFamily(value, DOCUMENTATION_BUNDLED_BODY_FONT.family);
3621
3792
  return `${family},ui-sans-serif,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif`;
3622
3793
  }
3623
3794
  function cssMonoFontStack(value) {
3624
- const family = safeFontFamily(value ?? "Geist Mono");
3795
+ const family = safeFontFamily(value, DOCUMENTATION_BUNDLED_MONO_FONT.family);
3625
3796
  return `${family},ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace`;
3626
3797
  }
3627
- function safeFontFamily(value) {
3628
- return /^[a-z0-9 ,.'-]{1,80}$/i.test(value) ? value : "Inter";
3629
- }
3630
- function validFontSource(value) {
3631
- return /^(?:\/[a-z0-9_./%-]+|https:\/\/[^\s"'()<>]+)$/i.test(value);
3632
- }
3633
3798
  function themeBootstrap() {
3634
3799
  try {
3635
3800
  const stored = localStorage.getItem("deepspace-documentation-theme");
@@ -3696,6 +3861,10 @@ function buildDocumentation(options) {
3696
3861
  } : {}, notFoundRuntime));
3697
3862
  write("assets/documentation.css", DOCUMENTATION_CSS.trimStart());
3698
3863
  write("assets/documentation-theme.js", DOCUMENTATION_THEME_BOOTSTRAP);
3864
+ for (const font of resolveDocumentationFonts(renderConfig.theme, basePath)) {
3865
+ if (font.bundled) write(`assets/fonts/${font.bundled.fileName}`, readBundledFont(font.bundled));
3866
+ }
3867
+ if (!renderConfig.theme.favicon) write("assets/favicon.svg", renderDocumentationFavicon(renderConfig.theme));
3699
3868
  if (!customRuntime) write("assets/documentation-runtime.js", buildDocumentationRuntime().trimStart());
3700
3869
  write("search.json", stableJson(createSearchEntries(validation.graph.pages)));
3701
3870
  write("assistant-index.json", stableJson(createAssistantChunks(validation.graph.pages)));
@@ -3748,7 +3917,7 @@ function buildDocumentation(options) {
3748
3917
  }
3749
3918
  function buildDocumentationRuntime() {
3750
3919
  const entry = runtimeEntry("documentation-runtime.js", "runtime/auto-client.tsx");
3751
- if (entry.endsWith(".js")) return readFileSync6(entry, "utf8");
3920
+ if (entry.endsWith(".js")) return readFileSync7(entry, "utf8");
3752
3921
  const result = buildSync3({
3753
3922
  entryPoints: [entry],
3754
3923
  bundle: true,
@@ -3768,7 +3937,7 @@ function buildDocumentationRuntime() {
3768
3937
  }
3769
3938
 
3770
3939
  // src/documentation/vite.ts
3771
- import { existsSync as existsSync7, readdirSync as readdirSync3, realpathSync as realpathSync3, rmSync as rmSync3 } from "fs";
3940
+ import { existsSync as existsSync8, readdirSync as readdirSync3, realpathSync as realpathSync3, rmSync as rmSync3 } from "fs";
3772
3941
  import { relative as relative6, resolve as resolve8, sep as sep5 } from "path";
3773
3942
  var IGNORED_DOCUMENTATION_WATCH_PATH = /^(?:\.deepspace|\.git|\.wrangler|dist|node_modules|public\/_documentation(?:-root)?|src\/router\.ts)(?:\/|$)/;
3774
3943
  function deepSpaceDocumentation() {
@@ -3776,7 +3945,7 @@ function deepSpaceDocumentation() {
3776
3945
  let outputDir = resolve8(appDir, ".deepspace", "documentation");
3777
3946
  let result = null;
3778
3947
  const rebuild = () => {
3779
- if (!existsSync7(resolve8(appDir, DOCUMENTATION_CONFIG_FILE))) {
3948
+ if (!existsSync8(resolve8(appDir, DOCUMENTATION_CONFIG_FILE))) {
3780
3949
  rmSync3(outputDir, { recursive: true, force: true });
3781
3950
  rmSync3(`${outputDir}-root`, { recursive: true, force: true });
3782
3951
  result = null;