diff --git a/packages/fumadocs/src/threadline/index.ts b/packages/fumadocs/src/threadline/index.ts
new file mode 100644
index 00000000..a161adbc
--- /dev/null
+++ b/packages/fumadocs/src/threadline/index.ts
@@ -0,0 +1,107 @@
+/**
+ * Threadline theme preset.
+ * Compact chat-docs-inspired documentation chrome with neutral
+ * shadcn-style tokens, Geist typography, soft surfaces, and page-action defaults.
+ *
+ * CSS: `@import "@farming-labs/theme/threadline/css";`
+ */
+import { createTheme } from "@farming-labs/docs";
+import type { PageActionsConfig } from "@farming-labs/docs";
+
+const ThreadlineUIDefaults = {
+ colors: {
+ primary: "oklch(0.205 0 0)",
+ primaryForeground: "oklch(0.985 0 0)",
+ background: "oklch(1 0 0)",
+ foreground: "oklch(0.145 0 0)",
+ muted: "oklch(0.97 0 0)",
+ mutedForeground: "oklch(0.556 0 0)",
+ border: "oklch(0.922 0 0)",
+ card: "oklch(1 0 0)",
+ cardForeground: "oklch(0.145 0 0)",
+ accent: "oklch(0.97 0 0)",
+ accentForeground: "oklch(0.205 0 0)",
+ secondary: "oklch(0.97 0 0)",
+ secondaryForeground: "oklch(0.205 0 0)",
+ popover: "oklch(1 0 0)",
+ popoverForeground: "oklch(0.145 0 0)",
+ ring: "oklch(0.708 0 0)",
+ },
+ typography: {
+ font: {
+ style: {
+ sans: "var(--font-geist-sans, GeistSans, GeistSans Fallback, ui-sans-serif, system-ui, sans-serif)",
+ mono: "var(--font-geist-mono, GeistMono, GeistMono Fallback, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace)",
+ },
+ h1: { size: "1.5rem", weight: 600, lineHeight: "1.35", letterSpacing: "0" },
+ h2: { size: "1.25rem", weight: 500, lineHeight: "1.4", letterSpacing: "0" },
+ h3: { size: "1rem", weight: 500, lineHeight: "1.5", letterSpacing: "0" },
+ h4: { size: "0.875rem", weight: 600, lineHeight: "1.5", letterSpacing: "0" },
+ body: { size: "0.875rem", weight: 400, lineHeight: "1.7" },
+ small: { size: "0.75rem", weight: 400, lineHeight: "1.45" },
+ },
+ },
+ radius: "0.625rem",
+ layout: {
+ contentWidth: 944,
+ sidebarWidth: 260,
+ tocWidth: 224,
+ toc: { enabled: true, depth: 3, style: "default" as const },
+ header: { height: 48, sticky: true },
+ },
+ sidebar: {
+ style: "bordered" as const,
+ },
+ components: {
+ Callout: { variant: "soft", icon: true },
+ CodeBlock: { showCopyButton: true, showLineNumbers: true },
+ HoverLink: { linkLabel: "Open page", showIndicator: false },
+ Prompt: {
+ icon: "sparkles",
+ actions: ["copy", "open"],
+ providers: ["ChatGPT", "Claude", "Cursor", "T3 Chat"],
+ copyIcon: "copy",
+ copiedIcon: "check",
+ openIcon: "arrowUpRight",
+ },
+ Tabs: { style: "default" },
+ },
+};
+
+const githubIcon = `
`;
+
+const t3ChatIcon = `
`;
+
+/**
+ * Page-action defaults for compact agent-friendly docs affordances as closely
+ * as the shared page-actions API allows.
+ */
+const threadlinePageActions = {
+ position: "toc",
+ copyMarkdown: { enabled: true },
+ alignment: "left",
+ openDocs: {
+ enabled: true,
+ target: "markdown",
+ prompt: "Read this documentation: {url}",
+ providers: [
+ { id: "github", name: "GitHub", icon: githubIcon },
+ "chatgpt",
+ "claude",
+ { id: "cursor", mode: "app" },
+ {
+ name: "T3 Chat",
+ urlTemplate: "https://t3.chat/new?q={prompt}",
+ promptUrlTemplate: "https://t3.chat/new?q={prompt}",
+ icon: t3ChatIcon,
+ },
+ ],
+ },
+} satisfies PageActionsConfig;
+
+export const threadline = createTheme({
+ name: "threadline",
+ ui: ThreadlineUIDefaults,
+});
+
+export { ThreadlineUIDefaults, threadlinePageActions };
diff --git a/packages/fumadocs/styles/threadline.css b/packages/fumadocs/styles/threadline.css
new file mode 100644
index 00000000..f4a8aa23
--- /dev/null
+++ b/packages/fumadocs/styles/threadline.css
@@ -0,0 +1,1270 @@
+/* @farming-labs/theme - threadline theme CSS
+ * Compact chat-docs UI with neutral shadcn-style surfaces.
+ */
+@import "./presets/neutral.css";
+
+:root {
+ --radius: 0.625rem;
+ --fd-nav-height: 48px;
+ --docs-header-height: 48px;
+ --fd-threadline-main-width: 944px;
+ --fd-threadline-frame-width: calc(
+ var(--fd-sidebar-width, 260px) + var(--fd-threadline-main-width) +
+ var(--fd-toc-width, 224px)
+ );
+ --fd-threadline-frame-gutter: max(
+ 0px,
+ calc((100vw - var(--fd-threadline-frame-width)) / 2)
+ );
+
+ --background: oklch(1 0 0);
+ --foreground: oklch(0.145 0 0);
+ --card: oklch(1 0 0);
+ --card-foreground: oklch(0.145 0 0);
+ --popover: oklch(1 0 0);
+ --popover-foreground: oklch(0.145 0 0);
+ --primary: oklch(0.205 0 0);
+ --primary-foreground: oklch(0.985 0 0);
+ --secondary: oklch(0.97 0 0);
+ --secondary-foreground: oklch(0.205 0 0);
+ --muted: oklch(0.97 0 0);
+ --muted-foreground: oklch(0.556 0 0);
+ --accent: oklch(0.97 0 0);
+ --accent-foreground: oklch(0.205 0 0);
+ --border: oklch(0.922 0 0);
+ --input: oklch(0.922 0 0);
+ --ring: oklch(0.708 0 0);
+
+ --color-fd-primary: var(--primary);
+ --color-fd-primary-foreground: var(--primary-foreground);
+ --color-fd-background: var(--background);
+ --color-fd-foreground: var(--foreground);
+ --color-fd-card: var(--card);
+ --color-fd-card-foreground: var(--card-foreground);
+ --color-fd-popover: var(--popover);
+ --color-fd-popover-foreground: var(--popover-foreground);
+ --color-fd-secondary: var(--secondary);
+ --color-fd-secondary-foreground: var(--secondary-foreground);
+ --color-fd-muted: var(--muted);
+ --color-fd-muted-foreground: var(--muted-foreground);
+ --color-fd-accent: var(--accent);
+ --color-fd-accent-foreground: var(--accent-foreground);
+ --color-fd-border: var(--border);
+ --color-fd-ring: var(--ring);
+
+ --fd-assistant-soft-border: color-mix(in srgb, var(--border) 82%, transparent);
+ --fd-assistant-link: #0057ff;
+ --fd-assistant-link-hover: #0048d8;
+ --fd-assistant-info: color-mix(in srgb, var(--muted) 55%, transparent);
+ --fd-assistant-info-fg: var(--foreground);
+ --fd-assistant-code-bg: oklch(0.97 0 0);
+ --fd-assistant-code-fg: oklch(0.32 0 0);
+ --fd-assistant-shadow: none;
+}
+
+:is(html.dark, body.dark, .dark) {
+ --background: oklch(0.145 0 0);
+ --foreground: oklch(0.985 0 0);
+ --card: oklch(0.205 0 0);
+ --card-foreground: oklch(0.985 0 0);
+ --popover: oklch(0.205 0 0);
+ --popover-foreground: oklch(0.985 0 0);
+ --primary: oklch(0.922 0 0);
+ --primary-foreground: oklch(0.205 0 0);
+ --secondary: oklch(0.269 0 0);
+ --secondary-foreground: oklch(0.985 0 0);
+ --muted: oklch(0.269 0 0);
+ --muted-foreground: oklch(0.708 0 0);
+ --accent: oklch(0.269 0 0);
+ --accent-foreground: oklch(0.985 0 0);
+ --border: oklch(1 0 0 / 10%);
+ --input: oklch(1 0 0 / 15%);
+ --ring: oklch(0.556 0 0);
+
+ --color-fd-primary: var(--primary);
+ --color-fd-primary-foreground: var(--primary-foreground);
+ --color-fd-background: var(--background);
+ --color-fd-foreground: var(--foreground);
+ --color-fd-card: var(--card);
+ --color-fd-card-foreground: var(--card-foreground);
+ --color-fd-popover: var(--popover);
+ --color-fd-popover-foreground: var(--popover-foreground);
+ --color-fd-secondary: var(--secondary);
+ --color-fd-secondary-foreground: var(--secondary-foreground);
+ --color-fd-muted: var(--muted);
+ --color-fd-muted-foreground: var(--muted-foreground);
+ --color-fd-accent: var(--accent);
+ --color-fd-accent-foreground: var(--accent-foreground);
+ --color-fd-border: var(--border);
+ --color-fd-ring: var(--ring);
+
+ --fd-assistant-soft-border: color-mix(in srgb, var(--border) 82%, transparent);
+ --fd-assistant-link: #7aa2ff;
+ --fd-assistant-link-hover: #a9c1ff;
+ --fd-assistant-info: color-mix(in srgb, #1e5eff 16%, var(--background));
+ --fd-assistant-info-fg: #9fbdff;
+ --fd-assistant-code-bg: oklch(0.205 0 0);
+ --fd-assistant-code-fg: oklch(0.86 0 0);
+ --fd-assistant-shadow: none;
+}
+
+html:has(#nd-docs-layout) {
+ scroll-padding-top: calc(var(--docs-header-height) + 2rem);
+}
+
+html.light:has(#nd-docs-layout),
+body.light:has(#nd-docs-layout) {
+ color-scheme: light !important;
+}
+
+html.dark:has(#nd-docs-layout),
+body.dark:has(#nd-docs-layout) {
+ color-scheme: dark !important;
+}
+
+body:has(#nd-docs-layout),
+body:has(.fd-layout) {
+ background: var(--background);
+ color: var(--foreground);
+ font-family: var(--fd-font-sans, var(--font-geist-sans, ui-sans-serif, system-ui, sans-serif));
+}
+
+body:has(#nd-docs-layout) {
+ min-height: 100vh;
+}
+
+#nd-docs-layout,
+.fd-layout {
+ --fd-banner-height: var(--docs-header-height);
+ --fd-layout-width: 9999px;
+ background: var(--background);
+}
+
+@media (min-width: 1280px) {
+ #nd-docs-layout {
+ max-width: var(--fd-threadline-frame-width) !important;
+ margin-inline: auto !important;
+ grid-template-columns:
+ 0px var(--fd-sidebar-width, 260px) minmax(0, var(--fd-threadline-main-width))
+ var(--fd-toc-width, 224px) 0px !important;
+ }
+}
+
+#nd-docs-layout > header,
+[role="banner"],
+.fd-header {
+ min-height: var(--docs-header-height) !important;
+ border-bottom: 1px solid transparent !important;
+ background: color-mix(in srgb, var(--background) 94%, transparent) !important;
+ box-shadow: none !important;
+ backdrop-filter: blur(10px);
+}
+
+#nd-docs-layout > header a,
+[role="banner"] a,
+.fd-header a,
+.fd-nav a {
+ color: var(--muted-foreground);
+ font-size: 0.875rem;
+ font-weight: 400;
+ letter-spacing: 0;
+ text-decoration: none;
+}
+
+#nd-docs-layout > header a:hover,
+[role="banner"] a:hover,
+.fd-header a:hover,
+.fd-nav a:hover {
+ color: var(--foreground);
+}
+
+button[data-search-full],
+[data-search-full],
+.fd-sidebar-search-btn,
+.fd-search-trigger-mobile {
+ min-height: 2rem;
+ border: 1px solid var(--border) !important;
+ border-radius: 0.625rem !important;
+ background: var(--card) !important;
+ color: var(--muted-foreground) !important;
+ box-shadow: none !important;
+ font-size: 0.875rem !important;
+}
+
+button[data-search-full]:hover,
+[data-search-full]:hover,
+.fd-sidebar-search-btn:hover,
+.fd-search-trigger-mobile:hover {
+ background: var(--accent) !important;
+ color: var(--foreground) !important;
+}
+
+button[data-search-full] kbd,
+[data-search-full] kbd,
+.fd-sidebar-search-kbd kbd {
+ border: 0 !important;
+ border-radius: 0.3125rem !important;
+ background: color-mix(in srgb, var(--muted) 72%, transparent) !important;
+ color: var(--muted-foreground) !important;
+ font-family: var(--fd-font-sans, var(--font-geist-sans, ui-sans-serif, system-ui, sans-serif)) !important;
+ font-size: 0.6875rem !important;
+ font-weight: 500 !important;
+ line-height: 1 !important;
+ min-width: 1rem;
+ padding: 0.125rem 0.25rem !important;
+ text-align: center;
+}
+
+aside#nd-sidebar,
+aside#nd-sidebar-mobile,
+.fd-sidebar {
+ background: transparent !important;
+ border-right: 0 !important;
+ color: var(--foreground);
+}
+
+aside#nd-sidebar [data-radix-scroll-area-viewport],
+aside#nd-sidebar [data-radix-scroll-area-content],
+aside#nd-sidebar .fd-sidebar,
+aside#nd-sidebar-mobile .fd-sidebar {
+ background: transparent !important;
+}
+
+:is(aside#nd-sidebar, aside#nd-sidebar-mobile, .fd-sidebar)
+ :is(a, button):not([data-sidebar-control]):not([data-theme-toggle]) {
+ border-radius: 0.375rem !important;
+ background: transparent !important;
+ color: var(--muted-foreground) !important;
+ font-size: 0.875rem !important;
+ font-weight: 400 !important;
+ letter-spacing: 0;
+ transition:
+ background-color 150ms ease,
+ color 150ms ease;
+}
+
+:is(aside#nd-sidebar, aside#nd-sidebar-mobile, .fd-sidebar)
+ :is(a, button):not([data-sidebar-control]):not([data-theme-toggle]):hover {
+ background: var(--accent) !important;
+ color: var(--foreground) !important;
+}
+
+:is(aside#nd-sidebar, aside#nd-sidebar-mobile, .fd-sidebar) button:has(kbd) {
+ border: 1px solid var(--border) !important;
+ border-radius: 0.625rem !important;
+ background: var(--card) !important;
+ color: var(--muted-foreground) !important;
+ box-shadow: none !important;
+}
+
+:is(aside#nd-sidebar, aside#nd-sidebar-mobile, .fd-sidebar) button:has(kbd):hover {
+ background: var(--accent) !important;
+ color: var(--foreground) !important;
+}
+
+aside#nd-sidebar a[data-active="true"],
+aside#nd-sidebar a[data-active="true"]:hover,
+aside#nd-sidebar-mobile a[data-active="true"],
+aside#nd-sidebar-mobile a[data-active="true"]:hover,
+.fd-sidebar a[data-active="true"],
+.fd-sidebar a[aria-current="page"] {
+ background: var(--accent) !important;
+ color: var(--foreground) !important;
+ font-weight: 500 !important;
+ box-shadow: none !important;
+}
+
+:is(aside#nd-sidebar, aside#nd-sidebar-mobile, .fd-sidebar) p.inline-flex {
+ margin-top: 1.5rem !important;
+ color: var(--muted-foreground) !important;
+ font-size: 0.6875rem !important;
+ font-weight: 500 !important;
+ letter-spacing: 0 !important;
+}
+
+:is(aside#nd-sidebar, aside#nd-sidebar-mobile, .fd-sidebar)
+ svg:not(button[data-theme-toggle] svg) {
+ width: 1rem !important;
+ height: 1rem !important;
+ opacity: 0.7;
+}
+
+#nd-page {
+ position: relative;
+ padding-inline: 1rem !important;
+ padding-top: 1rem !important;
+ padding-bottom: 1.5rem !important;
+ margin-top: var(--docs-header-height) !important;
+ max-width: var(--fd-threadline-main-width) !important;
+ width: min(100%, var(--fd-threadline-main-width)) !important;
+}
+
+@media (min-width: 768px) {
+ #nd-page {
+ padding-inline: 1.5rem !important;
+ }
+}
+
+@media (min-width: 1280px) {
+ #nd-page {
+ padding-inline: 2rem !important;
+ }
+}
+
+#nd-page > .prose,
+.fd-docs-content,
+.prose {
+ font-size: 0.875rem !important;
+ line-height: 1.7 !important;
+}
+
+.fd-page-title,
+#nd-page > h1,
+.fd-docs-content article h1,
+#nd-page h1,
+.fd-docs-content h1 {
+ color: var(--foreground) !important;
+ font-size: 1.5rem !important;
+ font-weight: 500 !important;
+ letter-spacing: 0 !important;
+ line-height: 2rem !important;
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+}
+
+.fd-docs-content article h2,
+#nd-page h2,
+.fd-docs-content h2,
+.prose h2 {
+ color: var(--foreground) !important;
+ font-size: 1.25rem !important;
+ font-weight: 500 !important;
+ letter-spacing: 0 !important;
+ line-height: 1.4 !important;
+ margin-top: 2.5rem !important;
+}
+
+.fd-docs-content article h3,
+#nd-page h3,
+.fd-docs-content h3,
+.prose h3 {
+ color: var(--foreground) !important;
+ font-size: 1rem !important;
+ font-weight: 500 !important;
+ letter-spacing: 0 !important;
+ line-height: 1.5 !important;
+ margin-top: 2rem !important;
+}
+
+.fd-docs-content article h4,
+#nd-page h4,
+.fd-docs-content h4,
+.prose h4 {
+ color: var(--foreground) !important;
+ font-size: 0.875rem !important;
+ font-weight: 600 !important;
+ letter-spacing: 0 !important;
+ line-height: 1.5 !important;
+}
+
+.fd-page-description,
+.fd-docs-content p,
+.fd-docs-content li,
+.fd-docs-content td,
+.fd-docs-content blockquote,
+.prose p,
+.prose li,
+.prose td,
+.prose blockquote {
+ color: var(--muted-foreground);
+ line-height: 1.7;
+}
+
+.fd-page-description {
+ max-width: 74ch;
+ font-size: 1rem !important;
+ line-height: 1.5rem !important;
+ margin-top: 0.5rem !important;
+ margin-bottom: 2rem !important;
+}
+
+.fd-docs-content a:not([data-card]),
+#nd-page a:not([data-card]),
+.prose a:not([data-card]) {
+ color: var(--fd-assistant-link);
+ text-underline-offset: 2px;
+ text-decoration-color: color-mix(in srgb, var(--fd-assistant-link) 35%, transparent);
+}
+
+.fd-docs-content a:not([data-card]):hover,
+#nd-page a:not([data-card]):hover,
+.prose a:not([data-card]):hover {
+ color: var(--fd-assistant-link-hover);
+}
+
+#nd-page :is(h1, h2, h3, h4) > a.peer,
+.fd-docs-content :is(h1, h2, h3, h4) > a.peer {
+ border: 0 !important;
+ background: transparent !important;
+ box-shadow: none !important;
+ color: inherit !important;
+ padding: 0 !important;
+ text-decoration: none !important;
+}
+
+.fd-card,
+[data-card],
+.fd-hover-link-card {
+ border: 1px solid transparent !important;
+ border-radius: 0.625rem !important;
+ background: color-mix(in srgb, var(--muted) 50%, transparent) !important;
+ box-shadow: none !important;
+}
+
+.fd-card:hover,
+[data-card]:hover,
+.fd-hover-link-card:hover {
+ border-color: var(--border) !important;
+ background: var(--muted) !important;
+}
+
+#nd-page :is([style*="--callout-color"], .fd-callout, [data-callout]) {
+ border: 1px solid color-mix(in srgb, var(--border) 86%, transparent) !important;
+ border-radius: 0.625rem !important;
+ background: color-mix(in srgb, var(--muted) 42%, transparent) !important;
+ color: var(--foreground) !important;
+ box-shadow: none !important;
+}
+
+#nd-page :is([style*="--callout-color"], .fd-callout, [data-callout]) * {
+ color: inherit;
+}
+
+#nd-page :is([style*="--callout-color"], .fd-callout, [data-callout]) a {
+ color: var(--fd-assistant-link) !important;
+ text-decoration-color: color-mix(in srgb, var(--fd-assistant-link) 35%, transparent);
+}
+
+#nd-page :is([style*="--callout-color"], .fd-callout, [data-callout]) > svg {
+ color: var(--muted-foreground) !important;
+ fill: color-mix(in srgb, var(--muted-foreground) 18%, transparent) !important;
+}
+
+#nd-page :is([style*="--callout-color"], .fd-callout, [data-callout]) > [role="none"] {
+ background: color-mix(in srgb, var(--muted-foreground) 28%, transparent) !important;
+}
+
+.fd-docs-content :not(pre) > code,
+.prose :not(pre) > code {
+ border: 0 !important;
+ border-radius: 0.375rem !important;
+ background: var(--muted) !important;
+ color: var(--foreground) !important;
+ font-size: 0.8125rem !important;
+ font-weight: 500 !important;
+ padding: 0.125rem 0.375rem !important;
+}
+
+.fd-docs-content pre,
+.fd-docs-content .shiki,
+.fd-docs-content [data-codeblock],
+figure.shiki,
+.fd-codeblock,
+.fd-ai-code-block {
+ border: 0 !important;
+ border-radius: 0.75rem !important;
+ background: var(--fd-assistant-code-bg) !important;
+ color: var(--fd-assistant-code-fg) !important;
+ box-shadow: none !important;
+ overflow: hidden;
+}
+
+figure.shiki > div:first-child:has(figcaption),
+.fd-codeblock-title,
+.fd-ai-code-header {
+ min-height: 2.25rem !important;
+ border-bottom: 0 !important;
+ background: transparent !important;
+ color: var(--muted-foreground) !important;
+ font-family: var(--fd-font-mono, ui-monospace, monospace) !important;
+ font-size: 0.8125rem !important;
+ font-weight: 500 !important;
+}
+
+figure.shiki > div[role="region"] {
+ padding-top: 0.875rem !important;
+ padding-bottom: 0.875rem !important;
+ font-size: 0.8125rem !important;
+ line-height: 1.65 !important;
+}
+
+.fd-copy-btn,
+.fd-ai-code-copy,
+figure.shiki button[aria-label*="Copy"] {
+ border: 0 !important;
+ border-radius: 0.375rem !important;
+ background: transparent !important;
+ color: var(--muted-foreground) !important;
+ box-shadow: none !important;
+}
+
+.fd-copy-btn:hover,
+.fd-ai-code-copy:hover,
+figure.shiki button[aria-label*="Copy"]:hover {
+ background: var(--background) !important;
+ color: var(--foreground) !important;
+}
+
+.fd-table-wrapper,
+.fd-docs-content table,
+.prose table {
+ border: 1px solid color-mix(in srgb, var(--border) 86%, transparent) !important;
+ border-radius: 0.75rem !important;
+ background: color-mix(in srgb, var(--muted) 28%, transparent) !important;
+ box-shadow: none !important;
+ overflow: hidden;
+}
+
+.fd-docs-content table,
+.prose table {
+ width: 100% !important;
+ border-collapse: separate !important;
+ border-spacing: 0 !important;
+}
+
+.fd-table-wrapper table {
+ border: 0 !important;
+ border-radius: 0 !important;
+ background: transparent !important;
+}
+
+.fd-docs-content thead,
+.prose thead {
+ background: color-mix(in srgb, var(--muted) 48%, transparent) !important;
+}
+
+.fd-table-wrapper th,
+.fd-docs-content th,
+.prose th {
+ background: transparent !important;
+ color: var(--muted-foreground) !important;
+ font-weight: 500 !important;
+}
+
+.fd-table-wrapper th,
+.fd-table-wrapper td,
+.fd-docs-content th,
+.fd-docs-content td,
+.prose th,
+.prose td {
+ border-color: color-mix(in srgb, var(--border) 86%, transparent) !important;
+ padding: 0.75rem 1rem !important;
+}
+
+.fd-docs-content tbody tr:nth-child(even),
+.prose tbody tr:nth-child(even) {
+ background: color-mix(in srgb, var(--muted) 18%, transparent) !important;
+}
+
+.fd-table-wrapper td,
+.fd-docs-content td,
+.prose td {
+ background: transparent !important;
+}
+
+.fd-actions-toc-portal {
+ display: none;
+}
+
+.fd-actions-toc-host {
+ display: none;
+}
+
+.fd-threadline-title-controls-host {
+ display: none;
+}
+
+.fd-threadline-doc-controls {
+ display: none;
+}
+
+@media (min-width: 768px) {
+ .fd-threadline-title-controls-host {
+ display: block;
+ position: absolute;
+ top: 1rem;
+ right: 1.5rem;
+ z-index: 5;
+ }
+
+ #nd-page > h1,
+ #nd-page h1:first-of-type {
+ padding-inline-end: 5rem !important;
+ }
+}
+
+@media (min-width: 1280px) {
+ .fd-threadline-title-controls-host {
+ right: 2rem;
+ }
+}
+
+.fd-title-separator {
+ display: none;
+}
+
+.fd-below-title-block {
+ margin-top: 0.25rem;
+ margin-bottom: 1rem;
+}
+
+.fd-page-actions,
+[data-page-actions] {
+ gap: 0.375rem !important;
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+}
+
+.fd-page-action-btn {
+ height: 2rem !important;
+ border: 0 !important;
+ border-radius: 0.5rem !important;
+ background: transparent !important;
+ color: var(--muted-foreground) !important;
+ box-shadow: none !important;
+ font-size: 0.8125rem !important;
+ font-weight: 400 !important;
+ padding: 0.375rem 0.5rem !important;
+}
+
+.fd-page-action-btn svg {
+ color: currentColor !important;
+ width: 0.875rem !important;
+ height: 0.875rem !important;
+}
+
+.fd-page-action-btn:hover,
+.fd-page-action-btn[data-copied="true"],
+.fd-page-action-btn[aria-expanded="true"] {
+ background: var(--accent) !important;
+ color: var(--foreground) !important;
+}
+
+.fd-page-action-menu,
+.fd-ai-dialog,
+.fd-ai-fm-input-container,
+.fd-ai-fm-suggestion,
+.fd-ai-model-dropdown-menu,
+.omni-content,
+.fd-feedback-input,
+.fd-feedback-choice,
+.fd-feedback-submit {
+ border: 1px solid var(--border) !important;
+ border-radius: 0.625rem !important;
+ background: var(--popover) !important;
+ box-shadow: none !important;
+}
+
+.fd-page-action-menu-item,
+.omni-item,
+.omni-item-ext,
+.fd-ai-model-dropdown-item {
+ border-radius: 0.5rem !important;
+}
+
+.fd-page-action-menu-item:hover,
+.omni-item:hover,
+.omni-item[data-selected="true"],
+.fd-ai-model-dropdown-item:hover {
+ background: var(--accent) !important;
+ color: var(--foreground) !important;
+}
+
+.omni-overlay {
+ background: oklch(0 0 0 / 0.16) !important;
+ backdrop-filter: blur(6px) !important;
+ -webkit-backdrop-filter: blur(6px) !important;
+}
+
+@media (min-width: 768px) {
+ body:has(.omni-overlay) #nd-docs-layout > div:has(> aside#nd-sidebar) {
+ position: fixed !important;
+ inset-block: var(--docs-header-height, 48px) 0 !important;
+ inset-inline-start: var(--fd-threadline-frame-gutter) !important;
+ width: var(--fd-sidebar-width, 260px) !important;
+ height: calc(100vh - var(--docs-header-height, 48px)) !important;
+ z-index: 102 !important;
+ pointer-events: none !important;
+ }
+
+ body:has(.omni-overlay) #nd-docs-layout > div:has(> aside#nd-sidebar) * {
+ pointer-events: none !important;
+ }
+
+ body:has(.omni-overlay) #nd-toc {
+ position: fixed !important;
+ inset-block: var(--docs-header-height, 48px) 0 !important;
+ inset-inline-start: calc(
+ var(--fd-threadline-frame-gutter) + var(--fd-sidebar-width, 260px) +
+ var(--fd-threadline-main-width)
+ ) !important;
+ width: var(--fd-toc-width, 224px) !important;
+ height: calc(100vh - var(--docs-header-height, 48px)) !important;
+ pointer-events: none !important;
+ }
+
+ body:has(#nd-sidebar) .omni-overlay {
+ left: calc(var(--fd-threadline-frame-gutter) + var(--fd-sidebar-width, 260px)) !important;
+ right: 0 !important;
+ width: auto !important;
+ }
+
+ body:has(#nd-sidebar) .omni-content {
+ left: calc(
+ var(--fd-threadline-frame-gutter) + var(--fd-sidebar-width, 260px) +
+ (var(--fd-threadline-main-width) + var(--fd-toc-width, 224px)) / 2
+ ) !important;
+ width: min(
+ 720px,
+ calc(var(--fd-threadline-main-width) + var(--fd-toc-width, 224px) - 32px)
+ ) !important;
+ }
+}
+
+.omni-content {
+ border: 1px solid color-mix(in srgb, var(--border) 76%, transparent) !important;
+ border-radius: 0.75rem !important;
+ background: var(--popover) !important;
+ color: var(--foreground) !important;
+ box-shadow: none !important;
+}
+
+.omni-header,
+.omni-footer {
+ border-color: transparent !important;
+ background: transparent !important;
+}
+
+.omni-search-row {
+ margin: 0.5rem !important;
+ padding: 0.5rem 0.625rem !important;
+ border-radius: 0.625rem !important;
+ background: color-mix(in srgb, var(--muted) 42%, transparent) !important;
+}
+
+.omni-search-input {
+ color: var(--foreground) !important;
+ font-size: 0.875rem !important;
+}
+
+.omni-search-input::placeholder {
+ color: var(--muted-foreground) !important;
+}
+
+.omni-search-icon,
+.omni-close-btn,
+.omni-item-icon,
+.omni-item-ext,
+.omni-item-chevron,
+.omni-footer-inner {
+ color: var(--muted-foreground) !important;
+}
+
+.omni-body {
+ padding: 0.25rem 0.5rem 0.5rem !important;
+}
+
+.omni-group-label {
+ color: var(--muted-foreground) !important;
+ font-size: 0.6875rem !important;
+ font-weight: 500 !important;
+ letter-spacing: 0 !important;
+ text-transform: none !important;
+}
+
+.omni-item {
+ border: 0 !important;
+ border-radius: 0.5rem !important;
+ background: transparent !important;
+ box-shadow: none !important;
+ color: var(--foreground) !important;
+}
+
+.omni-item:hover,
+.omni-item-active,
+.omni-item[aria-selected="true"],
+.omni-item[data-selected="true"] {
+ background: var(--accent) !important;
+ color: var(--foreground) !important;
+}
+
+.omni-item-subtitle,
+.omni-item-active .omni-item-subtitle {
+ color: var(--muted-foreground) !important;
+}
+
+.omni-kbd,
+.omni-kbd-sm {
+ min-width: 1.625rem;
+ border: 0 !important;
+ border-radius: 0.375rem !important;
+ background: color-mix(in srgb, var(--muted) 72%, transparent) !important;
+ color: var(--muted-foreground) !important;
+ font-family: var(--fd-font-sans, var(--font-geist-sans, ui-sans-serif, system-ui, sans-serif)) !important;
+ font-size: 0.6875rem !important;
+ font-weight: 500 !important;
+ letter-spacing: 0 !important;
+ line-height: 1 !important;
+ padding: 0.1875rem 0.375rem !important;
+ text-align: center;
+ text-transform: uppercase;
+}
+
+.omni-footer-hint svg {
+ box-sizing: border-box;
+ width: 1.25rem !important;
+ height: 1.25rem !important;
+ padding: 0.1875rem !important;
+ border-radius: 0.375rem !important;
+ background: color-mix(in srgb, var(--muted) 72%, transparent) !important;
+ color: var(--muted-foreground) !important;
+ flex-shrink: 0;
+}
+
+.omni-footer-hint {
+ gap: 0.25rem !important;
+}
+
+.omni-close-btn,
+.omni-item-ext {
+ border: 0 !important;
+ border-radius: 0.375rem !important;
+ background: transparent !important;
+ box-shadow: none !important;
+}
+
+.omni-close-btn:hover,
+.omni-item-ext:hover {
+ background: var(--accent) !important;
+ color: var(--foreground) !important;
+}
+
+.omni-footer-inner {
+ padding-top: 0.25rem !important;
+}
+
+.fd-page-nav {
+ display: grid !important;
+ grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
+ gap: 0.75rem !important;
+ margin-top: 3rem !important;
+}
+
+.fd-page-nav-card {
+ min-height: 2.75rem !important;
+ border: 0 !important;
+ border-radius: 0.625rem !important;
+ background: color-mix(in srgb, var(--muted) 50%, transparent) !important;
+ color: var(--foreground) !important;
+ box-shadow: none !important;
+ padding: 0.75rem 1rem !important;
+ transition: background-color 150ms ease;
+}
+
+.fd-page-nav-card:hover {
+ background: var(--muted) !important;
+ color: var(--foreground) !important;
+}
+
+.fd-page-nav-next {
+ grid-column: 2 !important;
+ text-align: end !important;
+}
+
+.fd-page-nav-card,
+#nd-page a[class*="text-end"][class*="rounded-lg"][class*="border"],
+#nd-page a[class*="text-start"][class*="rounded-lg"][class*="border"],
+.fd-page-nav-card * {
+ color: var(--foreground) !important;
+ text-decoration: none !important;
+}
+
+.fd-page-nav-label,
+.fd-page-nav-description {
+ color: var(--muted-foreground) !important;
+ font-size: 0.75rem !important;
+}
+
+.fd-page-nav-title {
+ color: var(--foreground) !important;
+ font-size: 0.875rem !important;
+ font-weight: 400 !important;
+}
+
+#nd-page a[class*="text-end"][class*="rounded-lg"][class*="border"],
+#nd-page a[class*="text-start"][class*="rounded-lg"][class*="border"] {
+ display: flex !important;
+ width: calc((100% - 0.75rem) / 2) !important;
+ min-height: 2.75rem !important;
+ flex-direction: row !important;
+ align-items: center !important;
+ gap: 0.5rem !important;
+ border: 0 !important;
+ border-radius: 0.625rem !important;
+ background: color-mix(in srgb, var(--muted) 50%, transparent) !important;
+ color: var(--foreground) !important;
+ box-shadow: none !important;
+ padding: 0.75rem 1rem !important;
+ text-decoration: none !important;
+}
+
+#nd-page a[class*="text-end"][class*="rounded-lg"][class*="border"] {
+ justify-content: flex-end !important;
+ margin-inline-start: auto !important;
+ text-align: end !important;
+}
+
+#nd-page a[class*="text-start"][class*="rounded-lg"][class*="border"] {
+ justify-content: flex-start !important;
+ text-align: start !important;
+}
+
+#nd-page a[class*="text-end"][class*="rounded-lg"][class*="border"] > div,
+#nd-page a[class*="text-start"][class*="rounded-lg"][class*="border"] > div {
+ width: auto !important;
+ min-width: 0 !important;
+ align-items: center !important;
+ gap: 0.5rem !important;
+}
+
+#nd-page a[class*="text-end"][class*="rounded-lg"][class*="border"] > p,
+#nd-page a[class*="text-start"][class*="rounded-lg"][class*="border"] > p {
+ display: none !important;
+}
+
+#nd-page a[class*="text-end"][class*="rounded-lg"][class*="border"] > div p,
+#nd-page a[class*="text-start"][class*="rounded-lg"][class*="border"] > div p {
+ margin: 0 !important;
+ overflow: hidden !important;
+ color: var(--foreground) !important;
+ font-size: 0.875rem !important;
+ font-weight: 400 !important;
+ line-height: 1.25rem !important;
+ text-overflow: ellipsis !important;
+ white-space: nowrap !important;
+}
+
+#nd-page a[class*="text-end"][class*="rounded-lg"][class*="border"] svg,
+#nd-page a[class*="text-start"][class*="rounded-lg"][class*="border"] svg {
+ width: 1rem !important;
+ height: 1rem !important;
+ flex-shrink: 0 !important;
+ color: var(--muted-foreground) !important;
+ transition: transform 150ms ease;
+}
+
+#nd-page a[class*="text-end"][class*="rounded-lg"][class*="border"]:hover,
+#nd-page a[class*="text-start"][class*="rounded-lg"][class*="border"]:hover {
+ background: var(--muted) !important;
+ color: var(--foreground) !important;
+}
+
+#nd-page a[class*="text-end"][class*="rounded-lg"][class*="border"]:hover svg {
+ transform: translateX(0.125rem);
+}
+
+#nd-page a[class*="text-start"][class*="rounded-lg"][class*="border"]:hover svg {
+ transform: translateX(-0.125rem);
+}
+
+#nd-page
+ div[class*="@container"][class*="grid-cols-2"]:has(
+ > a[class*="rounded-lg"][class*="border"][class*="p-4"][class*="text-sm"]
+ ) {
+ display: flex !important;
+ width: 100% !important;
+ flex-wrap: wrap !important;
+ gap: 0.75rem !important;
+ margin-top: 3rem !important;
+}
+
+#nd-page
+ div[class*="@container"][class*="grid-cols-2"]:has(
+ > a[class*="rounded-lg"][class*="border"][class*="p-4"][class*="text-sm"]
+ )
+ > a[class*="rounded-lg"][class*="border"][class*="p-4"][class*="text-sm"] {
+ display: flex !important;
+ flex: 1 1 min(20rem, 100%) !important;
+ width: auto !important;
+ min-width: min(20rem, 100%) !important;
+ min-height: 2.75rem !important;
+ flex-direction: row !important;
+ align-items: center !important;
+ gap: 0.5rem !important;
+ margin-inline: 0 !important;
+ border: 0 !important;
+ border-radius: 0.625rem !important;
+ background: color-mix(in srgb, var(--muted) 50%, transparent) !important;
+ color: var(--foreground) !important;
+ box-shadow: none !important;
+ padding: 0.75rem 1rem !important;
+ text-decoration: none !important;
+}
+
+#nd-page
+ div[class*="@container"][class*="grid-cols-2"]:has(
+ > a[class*="rounded-lg"][class*="border"][class*="p-4"][class*="text-sm"]
+ )
+ > a[class*="rounded-lg"][class*="border"][class*="p-4"][class*="text-sm"]:hover {
+ background: var(--muted) !important;
+ color: var(--foreground) !important;
+}
+
+#nd-page
+ div[class*="@container"][class*="grid-cols-2"]:has(
+ > a[class*="rounded-lg"][class*="border"][class*="p-4"][class*="text-sm"]
+ )
+ > a[class*="rounded-lg"][class*="border"][class*="p-4"][class*="text-sm"]:not(
+ [class*="text-end"]
+ ) {
+ justify-content: flex-start !important;
+ text-align: start !important;
+}
+
+#nd-page
+ div[class*="@container"][class*="grid-cols-2"]:has(
+ > a[class*="rounded-lg"][class*="border"][class*="p-4"][class*="text-sm"]
+ )
+ > a[class*="rounded-lg"][class*="border"][class*="p-4"][class*="text-sm"][class*="text-end"] {
+ justify-content: flex-end !important;
+ text-align: end !important;
+}
+
+#nd-page
+ div[class*="@container"][class*="grid-cols-2"]:has(
+ > a[class*="rounded-lg"][class*="border"][class*="p-4"][class*="text-sm"]
+ )
+ > a[class*="rounded-lg"][class*="border"][class*="p-4"][class*="text-sm"]
+ > div {
+ width: auto !important;
+ max-width: 100% !important;
+ min-width: 0 !important;
+ align-items: center !important;
+ gap: 0.5rem !important;
+}
+
+#nd-page
+ div[class*="@container"][class*="grid-cols-2"]:has(
+ > a[class*="rounded-lg"][class*="border"][class*="p-4"][class*="text-sm"]
+ )
+ > a[class*="rounded-lg"][class*="border"][class*="p-4"][class*="text-sm"]
+ > p {
+ display: none !important;
+}
+
+#nd-page
+ div[class*="@container"][class*="grid-cols-2"]:has(
+ > a[class*="rounded-lg"][class*="border"][class*="p-4"][class*="text-sm"]
+ )
+ > a[class*="rounded-lg"][class*="border"][class*="p-4"][class*="text-sm"]
+ > div
+ p {
+ margin: 0 !important;
+ overflow: hidden !important;
+ color: var(--foreground) !important;
+ font-size: 0.875rem !important;
+ font-weight: 400 !important;
+ line-height: 1.25rem !important;
+ text-overflow: ellipsis !important;
+ white-space: nowrap !important;
+}
+
+#nd-page
+ div[class*="@container"][class*="grid-cols-2"]:has(
+ > a[class*="rounded-lg"][class*="border"][class*="p-4"][class*="text-sm"]
+ )
+ > a[class*="rounded-lg"][class*="border"][class*="p-4"][class*="text-sm"]
+ svg {
+ width: 1rem !important;
+ height: 1rem !important;
+ flex-shrink: 0 !important;
+ color: var(--muted-foreground) !important;
+ transition: transform 150ms ease;
+}
+
+#nd-page
+ div[class*="@container"][class*="grid-cols-2"]:has(
+ > a[class*="rounded-lg"][class*="border"][class*="p-4"][class*="text-sm"]
+ )
+ > a[class*="rounded-lg"][class*="border"][class*="p-4"][class*="text-sm"][class*="text-end"]:hover
+ svg {
+ transform: translateX(0.125rem);
+}
+
+#nd-page
+ div[class*="@container"][class*="grid-cols-2"]:has(
+ > a[class*="rounded-lg"][class*="border"][class*="p-4"][class*="text-sm"]
+ )
+ > a[class*="rounded-lg"][class*="border"][class*="p-4"][class*="text-sm"]:not(
+ [class*="text-end"]
+ ):hover
+ svg {
+ transform: translateX(-0.125rem);
+}
+
+.fd-page-footer,
+.fd-ai-fm-input-bar--closed {
+ display: none !important;
+}
+
+@media (min-width: 1280px) {
+ .fd-actions-toc-host {
+ display: block;
+ margin-top: 1.5rem;
+ padding-top: 0;
+ }
+
+ .fd-actions-toc-portal {
+ display: flex;
+ width: 100%;
+ flex-direction: column;
+ align-items: stretch;
+ gap: 0;
+ pointer-events: auto;
+ }
+
+ .fd-threadline-doc-controls {
+ display: inline-flex;
+ width: max-content;
+ gap: 0.5rem;
+ }
+
+ .fd-threadline-doc-controls button {
+ display: inline-flex;
+ width: 2rem;
+ height: 2rem;
+ align-items: center;
+ justify-content: center;
+ border: 0;
+ border-radius: 0.625rem;
+ background: color-mix(in srgb, var(--muted) 50%, transparent);
+ color: var(--muted-foreground);
+ font: inherit;
+ font-size: 0.875rem;
+ line-height: 1;
+ transition:
+ background-color 150ms ease,
+ color 150ms ease;
+ }
+
+ .fd-threadline-doc-controls button:hover {
+ background: var(--muted);
+ color: var(--foreground);
+ }
+
+ .fd-actions-toc-portal .fd-page-actions-rail {
+ pointer-events: auto;
+ }
+
+ .fd-page-actions-rail,
+ .fd-page-actions[data-page-actions-variant="rail"] {
+ display: flex !important;
+ width: 100% !important;
+ flex-direction: column !important;
+ align-items: stretch !important;
+ justify-content: flex-start !important;
+ gap: 0.75rem !important;
+ }
+
+ .fd-page-actions-rail .fd-page-action-btn,
+ .fd-page-actions[data-page-actions-variant="rail"] .fd-page-action-btn {
+ display: inline-flex !important;
+ width: 100% !important;
+ height: 1rem !important;
+ align-items: center !important;
+ justify-content: flex-start !important;
+ gap: 0.375rem !important;
+ border: 0 !important;
+ border-radius: 0 !important;
+ background: transparent !important;
+ color: var(--muted-foreground) !important;
+ font-size: 0.75rem !important;
+ line-height: 1rem !important;
+ padding: 0 !important;
+ }
+
+ .fd-page-actions-rail .fd-page-action-btn:hover,
+ .fd-page-actions[data-page-actions-variant="rail"] .fd-page-action-btn:hover,
+ .fd-page-actions-rail .fd-page-action-btn[data-copied="true"],
+ .fd-page-actions[data-page-actions-variant="rail"] .fd-page-action-btn[data-copied="true"] {
+ background: transparent !important;
+ color: var(--foreground) !important;
+ }
+
+ .fd-page-actions-rail .fd-page-action-btn svg,
+ .fd-page-actions[data-page-actions-variant="rail"] .fd-page-action-btn svg {
+ width: 0.75rem !important;
+ height: 0.75rem !important;
+ }
+}
+
+.fd-tabs,
+.fd-tabs-list,
+[role="tablist"] {
+ border: 0 !important;
+ border-radius: 0.625rem !important;
+ background: var(--muted) !important;
+ padding: 0.25rem !important;
+}
+
+.fd-tabs-trigger,
+.fd-tab-trigger,
+[role="tab"] {
+ border-radius: 0.5rem !important;
+ color: var(--muted-foreground) !important;
+ font-weight: 500 !important;
+}
+
+.fd-tabs-trigger[data-state="active"],
+.fd-tab-trigger[data-state="active"],
+[role="tab"][aria-selected="true"],
+[role="tab"][data-active="true"] {
+ background: var(--background) !important;
+ color: var(--foreground) !important;
+ box-shadow: none !important;
+}
+
+.fd-feedback-submit,
+.fd-ai-send-btn,
+.fd-ai-fm-send-btn,
+.fd-ai-floating-btn {
+ border: 1px solid transparent !important;
+ border-radius: 0.625rem !important;
+ background: var(--primary) !important;
+ color: var(--primary-foreground) !important;
+ box-shadow: none !important;
+}
+
+.fd-feedback-submit:hover,
+.fd-ai-send-btn:hover,
+.fd-ai-fm-send-btn:hover,
+.fd-ai-floating-btn:hover {
+ background: color-mix(in srgb, var(--primary) 88%, var(--foreground)) !important;
+}
+
+@media (max-width: 767px) {
+ #nd-page {
+ padding-inline: 1rem !important;
+ margin-top: 0 !important;
+ width: 100% !important;
+ max-width: 100% !important;
+ }
+
+ .fd-page-title,
+ #nd-page > h1,
+ .fd-docs-content article h1,
+ #nd-page h1,
+ .fd-docs-content h1 {
+ font-size: 1.375rem !important;
+ }
+}
diff --git a/packages/fumadocs/tsdown.config.ts b/packages/fumadocs/tsdown.config.ts
index baf6e9ae..0a61c1ee 100644
--- a/packages/fumadocs/tsdown.config.ts
+++ b/packages/fumadocs/tsdown.config.ts
@@ -33,6 +33,7 @@ export default defineConfig({
"src/command-grid/index.ts",
"src/hardline/index.ts",
"src/ledger/index.ts",
+ "src/threadline/index.ts",
],
format: "esm",
unbundle: true,
diff --git a/website/app/docs/themes/page.mdx b/website/app/docs/themes/page.mdx
index b15203a8..075fdaef 100644
--- a/website/app/docs/themes/page.mdx
+++ b/website/app/docs/themes/page.mdx
@@ -13,7 +13,7 @@ Keep answers grounded in the exact options, routes, commands, and examples docum
If the request moves beyond this page, point to the closest related docs instead of inventing config.
-@farming-labs/docs ships with eleven built-in theme entrypoints. Each is a preset factory function that you pass to `defineDocs()`. `hardline` stays as the original hard-edge preset, `concrete` is the louder brutalist variant, `command-grid` is the mono-first paper-grid preset inspired by the better-cmdk landing page, and `ledger` brings a Stripe Docs-inspired product documentation shell.
+@farming-labs/docs ships with twelve built-in theme entrypoints. Each is a preset factory function that you pass to `defineDocs()`. `hardline` stays as the original hard-edge preset, `concrete` is the louder brutalist variant, `command-grid` is the mono-first paper-grid preset inspired by the better-cmdk landing page, `ledger` brings a Stripe Docs-inspired product documentation shell, and `threadline` adds compact neutral chrome for chat and agent docs.
Want to build a custom theme or publish one as a package? See **[Creating your own theme](/docs/themes/creating-themes)** for the full guide.
@@ -28,6 +28,7 @@ If the request moves beyond this page, point to the closest related docs instead
| [Darksharp](/docs/themes/darksharp) | `@farming-labs/theme/darksharp` | All-black, sharp corners |
| [Pixel Border](/docs/themes/pixel-border) | `@farming-labs/theme/pixel-border` | Inspired by better-auth.com |
| [Shiny](/docs/themes/shiny) | `@farming-labs/theme/shiny` | Clerk-inspired, purple accents |
+| [Threadline](/docs/themes/threadline) | `@farming-labs/theme/threadline` | Compact neutral shell for chat and agent docs |
| [DarkBold](/docs/themes/darkbold) | `@farming-labs/theme/darkbold` | Pure monochrome, Geist typography |
| [GreenTree](/docs/themes/greentree) | `@farming-labs/theme/greentree` | Mintlify-inspired, emerald green accent |
| [Concrete](/docs/themes/concrete) | `@farming-labs/theme/concrete` | Brutalist poster-style hard-edge theme |
diff --git a/website/app/docs/themes/threadline/page.mdx b/website/app/docs/themes/threadline/page.mdx
new file mode 100644
index 00000000..86f5db3b
--- /dev/null
+++ b/website/app/docs/themes/threadline/page.mdx
@@ -0,0 +1,82 @@
+---
+title: "Threadline"
+description: "Compact neutral theme with right-aligned page actions"
+icon: "bot"
+order: 4.75
+---
+
+# Threadline Theme
+
+
+Use this page when the user asks about this topic: compact neutral theme with page-action defaults.
+Keep answers grounded in the exact options, routes, commands, and examples documented here.
+If the request moves beyond this page, point to the closest related docs instead of inventing config.
+
+
+A compact neutral preset for chat, agent, and product documentation. It uses a 48px header, compact Geist typography, muted shadcn surfaces, and ghost-style page actions for dense, readable docs.
+
+## Usage
+
+```tsx title="docs.config.ts"
+import { defineDocs } from "@farming-labs/docs";
+import { threadline, threadlinePageActions } from "@farming-labs/theme/threadline";
+
+export default defineDocs({
+ entry: "docs",
+ theme: threadline(),
+ github: {
+ url: "https://github.com/acme/docs",
+ },
+ pageActions: threadlinePageActions,
+});
+```
+
+```css title="app/global.css"
+@import "tailwindcss";
+@import "@farming-labs/theme/threadline/css";
+```
+
+## Page Actions
+
+`threadlinePageActions` enables:
+
+- Copy page
+- Open in GitHub
+- Open in ChatGPT
+- Open in Claude
+- Open in Cursor
+- Open in T3 Chat
+
+The GitHub action needs top-level `github` config so the theme can resolve `{githubUrl}` for the current page.
+
+## Defaults
+
+| Property | Value |
+| ------------- | -------------------------------------- |
+| Primary | `oklch(0.205 0 0)` |
+| Background | `oklch(1 0 0)` (light), `oklch(0.145 0 0)` (dark) |
+| Border | `oklch(0.922 0 0)` |
+| Border radius | `0.625rem` |
+| Content width | 912px |
+| Sidebar width | 260px |
+| TOC width | 224px |
+| Header height | 48px |
+
+## Style Notes
+
+- Geist-first typography with smaller headings and dense prose
+- Transparent sidebar with soft hover and active states
+- Muted cards, tables, inline code, and code blocks
+- Blue documentation links and info callouts on an otherwise neutral shell
+- Ghost-style page-action buttons with a compact Open in menu
+
+## Customizing
+
+```tsx title="customizing.tsx"
+theme: threadline({
+ ui: {
+ colors: { primary: "#111827" },
+ layout: { sidebarWidth: 280, tocWidth: 240 },
+ },
+}),
+```
diff --git a/website/app/themes/page.tsx b/website/app/themes/page.tsx
index 4f4efb2e..eab0b584 100644
--- a/website/app/themes/page.tsx
+++ b/website/app/themes/page.tsx
@@ -98,6 +98,26 @@ export default defineDocs({
});`,
globalCss: `@import "tailwindcss";
@import "@farming-labs/theme/shiny/css";`,
+ },
+ {
+ key: "threadline",
+ name: "Threadline",
+ description: "Compact neutral shell for chat and agent docs with dense Geist typography.",
+ cssImport: '@import "@farming-labs/theme/threadline/css";',
+ colors: ["#0a0a0a", "#ffffff", "#737373", "#e5e5e5"],
+ accent: "#0a0a0a",
+ previewEnabled: false,
+ configSnippet: `import { defineDocs } from "@farming-labs/docs";
+import { threadline, threadlinePageActions } from "@farming-labs/theme/threadline";
+
+export default defineDocs({
+ entry: "docs",
+ theme: threadline(),
+ github: { url: "https://github.com/acme/docs" },
+ pageActions: threadlinePageActions,
+});`,
+ globalCss: `@import "tailwindcss";
+@import "@farming-labs/theme/threadline/css";`,
},
{
key: "ledger",