@import 'tailwindcss'; @import 'fumadocs-ui/css/neutral.css'; @import 'fumadocs-ui/css/preset.css'; @import 'fumadocs-openapi/css/preset.css'; @import "tw-animate-css"; @custom-variant dark (&:is(.dark *)); /* ========================================================================== highlight.js tokens (Eve chat code blocks) The Eve chat renders code through a custom using highlight.js (synchronous, browser-safe). highlight.js theme stylesheets aren't imported directly because they're not dark-mode aware; instead the GitHub light/dark token colors are inlined here and scoped to `.dark`. The container styles its own background/padding, so only token colors live here. ========================================================================== */ .eve-hljs .hljs { color: #24292e; background: transparent; } .eve-hljs .hljs-doctag, .eve-hljs .hljs-keyword, .eve-hljs .hljs-meta .hljs-keyword, .eve-hljs .hljs-template-tag, .eve-hljs .hljs-template-variable, .eve-hljs .hljs-type, .eve-hljs .hljs-variable.language_ { color: #d73a49; } .eve-hljs .hljs-title, .eve-hljs .hljs-title.class_, .eve-hljs .hljs-title.class_.inherited__, .eve-hljs .hljs-title.function_ { color: #6f42c1; } .eve-hljs .hljs-attr, .eve-hljs .hljs-attribute, .eve-hljs .hljs-literal, .eve-hljs .hljs-meta, .eve-hljs .hljs-number, .eve-hljs .hljs-operator, .eve-hljs .hljs-variable, .eve-hljs .hljs-selector-attr, .eve-hljs .hljs-selector-class, .eve-hljs .hljs-selector-id { color: #005cc5; } .eve-hljs .hljs-regexp, .eve-hljs .hljs-string, .eve-hljs .hljs-meta .hljs-string { color: #032f62; } .eve-hljs .hljs-built_in, .eve-hljs .hljs-symbol { color: #e36209; } .eve-hljs .hljs-comment, .eve-hljs .hljs-code, .eve-hljs .hljs-formula { color: #6a737d; } .eve-hljs .hljs-name, .eve-hljs .hljs-quote, .eve-hljs .hljs-selector-tag, .eve-hljs .hljs-selector-pseudo { color: #22863a; } .eve-hljs .hljs-subst { color: #24292e; } .eve-hljs .hljs-section { color: #005cc5; font-weight: bold; } .eve-hljs .hljs-bullet { color: #735c0f; } .eve-hljs .hljs-emphasis { color: #24292e; font-style: italic; } .eve-hljs .hljs-strong { color: #24292e; font-weight: bold; } .eve-hljs .hljs-addition { color: #22863a; background-color: #f0fff4; } .eve-hljs .hljs-deletion { color: #b31d28; background-color: #ffeef0; } .dark .eve-hljs .hljs { color: #c9d1d9; background: transparent; } .dark .eve-hljs .hljs-doctag, .dark .eve-hljs .hljs-keyword, .dark .eve-hljs .hljs-meta .hljs-keyword, .dark .eve-hljs .hljs-template-tag, .dark .eve-hljs .hljs-template-variable, .dark .eve-hljs .hljs-type, .dark .eve-hljs .hljs-variable.language_ { color: #ff7b72; } .dark .eve-hljs .hljs-title, .dark .eve-hljs .hljs-title.class_, .dark .eve-hljs .hljs-title.class_.inherited__, .dark .eve-hljs .hljs-title.function_ { color: #d2a8ff; } .dark .eve-hljs .hljs-attr, .dark .eve-hljs .hljs-attribute, .dark .eve-hljs .hljs-literal, .dark .eve-hljs .hljs-meta, .dark .eve-hljs .hljs-number, .dark .eve-hljs .hljs-operator, .dark .eve-hljs .hljs-variable, .dark .eve-hljs .hljs-selector-attr, .dark .eve-hljs .hljs-selector-class, .dark .eve-hljs .hljs-selector-id { color: #79c0ff; } .dark .eve-hljs .hljs-regexp, .dark .eve-hljs .hljs-string, .dark .eve-hljs .hljs-meta .hljs-string { color: #a5d6ff; } .dark .eve-hljs .hljs-built_in, .dark .eve-hljs .hljs-symbol { color: #ffa657; } .dark .eve-hljs .hljs-comment, .dark .eve-hljs .hljs-code, .dark .eve-hljs .hljs-formula { color: #8b949e; } .dark .eve-hljs .hljs-name, .dark .eve-hljs .hljs-quote, .dark .eve-hljs .hljs-selector-tag, .dark .eve-hljs .hljs-selector-pseudo { color: #7ee787; } .dark .eve-hljs .hljs-subst { color: #c9d1d9; } .dark .eve-hljs .hljs-section { color: #1f6feb; font-weight: bold; } .dark .eve-hljs .hljs-bullet { color: #f2cc60; } .dark .eve-hljs .hljs-emphasis { color: #c9d1d9; font-style: italic; } .dark .eve-hljs .hljs-strong { color: #c9d1d9; font-weight: bold; } .dark .eve-hljs .hljs-addition { color: #aff5b4; background-color: #033a16; } .dark .eve-hljs .hljs-deletion { color: #ffdcd7; background-color: #67060c; } /* ========================================================================== COMPOSIO DOCS Palette (synced with ~/composio/landing + ~/composio/composio_dashboard): - Brand: #0007cd / oklch(0.387 0.264 264.1) — deep electric blue - Light: Content #fbfbfb, Card #ffffff - Dark: Content #0f0f0f, Card #1a1a1a Typography: - All text: ABC Diatype (sans, loaded locally in app/layout.tsx) - Code: JetBrains Mono ========================================================================== */ @theme inline { --font-sans: var(--font-sans), ui-sans-serif, system-ui, sans-serif; --font-mono: var(--font-mono), ui-monospace, SFMono-Regular, Menlo, monospace; --radius: 0; --color-sidebar-ring: var(--sidebar-ring); --color-sidebar-border: var(--sidebar-border); --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); --color-sidebar-accent: var(--sidebar-accent); --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); --color-sidebar-primary: var(--sidebar-primary); --color-sidebar-foreground: var(--sidebar-foreground); --color-sidebar: var(--sidebar); --color-chart-5: var(--chart-5); --color-chart-4: var(--chart-4); --color-chart-3: var(--chart-3); --color-chart-2: var(--chart-2); --color-chart-1: var(--chart-1); --color-ring: var(--ring); --color-input: var(--input); --color-border: var(--border); --color-destructive: var(--destructive); --color-accent-foreground: var(--accent-foreground); --color-accent: var(--accent); --color-muted-foreground: var(--muted-foreground); --color-muted: var(--muted); --color-secondary-foreground: var(--secondary-foreground); --color-secondary: var(--secondary); --color-primary-foreground: var(--primary-foreground); --color-primary: var(--primary); --color-popover-foreground: var(--popover-foreground); --color-popover: var(--popover); --color-card-foreground: var(--card-foreground); --color-card: var(--card); --color-foreground: var(--foreground); --color-background: var(--background); --radius-sm: calc(var(--radius) - 4px); --radius-md: calc(var(--radius) - 2px); --radius-lg: var(--radius); --radius-xl: calc(var(--radius) + 4px); --radius-2xl: calc(var(--radius) + 8px); --radius-3xl: calc(var(--radius) + 12px); --radius-4xl: calc(var(--radius) + 16px); } /* ========================================================================== Design Tokens ========================================================================== */ /* ========================================================================== Global Defaults ========================================================================== */ html { -webkit-tap-highlight-color: transparent; } :root { /* Brand — deep electric blue, shared with composio.dev + dashboard */ --composio-brand: #0007cd; --composio-orange: var(--composio-brand); /* legacy alias — kept for back-compat */ --composio-sidebar: #fbfbfb; /* Fumadocs overrides - Light */ --color-fd-background: #fbfbfb; --color-fd-foreground: #0f0f0f; --color-fd-muted: #f3f3f3; --color-fd-muted-foreground: #585858; --color-fd-border: #e5e5e5; --color-fd-card: #ffffff; --color-fd-card-foreground: #0f0f0f; --color-fd-popover: #ffffff; --color-fd-popover-foreground: #0f0f0f; --color-fd-primary: #0f0f0f; --color-fd-primary-foreground: #fbfbfb; --color-fd-secondary: #f3f3f3; --color-fd-secondary-foreground: #0f0f0f; --color-fd-accent: #f3f3f3; --color-fd-accent-foreground: #0f0f0f; --color-fd-ring: var(--composio-brand); --radius: 0; --background: oklch(0.985 0 0); --foreground: oklch(0.218 0 0); --card: oklch(1 0 0); --card-foreground: oklch(0.218 0 0); --popover: oklch(1 0 0); --popover-foreground: oklch(0.218 0 0); --primary: oklch(0.387 0.264 264.1); --primary-foreground: oklch(1 0 0); --secondary: oklch(0.97 0 0); --secondary-foreground: oklch(0.218 0 0); --muted: oklch(0.97 0 0); --muted-foreground: oklch(0.51 0 0); --accent: oklch(0.97 0 0); --accent-foreground: oklch(0.218 0 0); --destructive: oklch(0.577 0.215 27.3); --border: oklch(0.931 0 0); --input: oklch(0.931 0 0); --ring: oklch(0.387 0.264 264.1); --chart-1: oklch(0.646 0.222 41.116); --chart-2: oklch(0.6 0.118 184.704); --chart-3: oklch(0.398 0.07 227.392); --chart-4: oklch(0.828 0.189 84.429); --chart-5: oklch(0.769 0.188 70.08); --sidebar: oklch(0.985 0 0); --sidebar-foreground: oklch(0.145 0 0); --sidebar-primary: oklch(0.205 0 0); --sidebar-primary-foreground: oklch(0.985 0 0); --sidebar-accent: oklch(0.97 0 0); --sidebar-accent-foreground: oklch(0.205 0 0); --sidebar-border: oklch(0.922 0 0); --sidebar-ring: oklch(0.708 0 0); } .dark { /* Lift the brand blue on dark backgrounds — `#0007cd` is too dark against `#0f0f0f`. */ --composio-brand: #5B8BF0; --composio-orange: var(--composio-brand); --composio-sidebar: #0f0f0f; /* Fumadocs overrides - Dark */ --color-fd-background: #0f0f0f; --color-fd-foreground: #fbfbfb; --color-fd-muted: #1f1f1f; --color-fd-muted-foreground: #b4b4b4; --color-fd-border: rgba(255, 255, 255, 0.06); --color-fd-card: #1c1c1c; --color-fd-card-foreground: #fbfbfb; --color-fd-popover: #1a1a1a; --color-fd-popover-foreground: #fbfbfb; --color-fd-primary: #fbfbfb; --color-fd-primary-foreground: #0f0f0f; --color-fd-secondary: #1a1a1a; --color-fd-secondary-foreground: #fbfbfb; --color-fd-accent: #1a1a1a; --color-fd-accent-foreground: #fbfbfb; --color-fd-ring: var(--composio-brand); --background: oklch(0.159 0 0); --foreground: oklch(0.985 0 0); --card: oklch(0.218 0 0); --card-foreground: oklch(0.985 0 0); --popover: oklch(0.218 0 0); --popover-foreground: oklch(0.985 0 0); --primary: oklch(0.985 0 0); --primary-foreground: oklch(0.218 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.706 0 0); --accent: oklch(0.269 0 0); --accent-foreground: oklch(0.985 0 0); --destructive: oklch(0.637 0.208 25.3); --border: oklch(1 0 0 / 6%); --input: oklch(1 0 0 / 15%); --ring: oklch(0.745 0.128 275); --chart-1: oklch(0.488 0.243 264.376); --chart-2: oklch(0.696 0.17 162.48); --chart-3: oklch(0.769 0.188 70.08); --chart-4: oklch(0.627 0.265 303.9); --chart-5: oklch(0.645 0.246 16.439); --sidebar: oklch(0.205 0 0); --sidebar-foreground: oklch(0.985 0 0); --sidebar-primary: oklch(0.488 0.243 264.376); --sidebar-primary-foreground: oklch(0.985 0 0); --sidebar-accent: oklch(0.269 0 0); --sidebar-accent-foreground: oklch(0.985 0 0); --sidebar-border: oklch(1 0 0 / 6%); --sidebar-ring: oklch(0.556 0 0); } /* ========================================================================== Base ========================================================================== */ html { background-color: var(--color-fd-background); } /* ========================================================================== Typography ========================================================================== */ /* Headings */ h1, h2, h3, h4 { font-family: var(--font-sans); font-weight: 500; letter-spacing: -0.01em; } /* Code - IBM Plex Mono (uses --font-mono from Next.js) */ pre, code, kbd, samp { font-family: var(--font-mono), ui-monospace, monospace; } :not(pre) > code { padding: 0.125rem 0.375rem; border-radius: 0.25rem; font-size: 0.875em; } pre { border-radius: var(--radius); } /* ========================================================================== Links ========================================================================== */ :is(.prose, [data-fumadocs-body]) a:not([data-card]) { color: var(--composio-orange); text-decoration: none; } /* Heading anchors stay neutral */ .prose :is(h1, h2, h3, h4) a { color: inherit; } a:focus-visible { outline: 2px solid var(--composio-orange); outline-offset: 2px; border-radius: 2px; } /* ========================================================================== Navigation - HomeLayout + DocsLayout nested structure ========================================================================== */ #nd-home-layout { --fd-layout-width: 100%; } #nd-sidebar { position: sticky; top: 3.5rem; height: calc(100dvh - 3.5rem); background-color: var(--composio-sidebar); } /* Hide empty sidebar header when no title is set */ #nd-sidebar > div:first-child:has(a:empty) { display: none; } /* Sidebar nav items */ #nd-sidebar [data-radix-scroll-area-viewport] a, #nd-sidebar [data-radix-scroll-area-viewport] button { padding: 0.375rem 0.5rem; border-radius: 0.375rem; color: var(--color-fd-foreground); transition: background-color 0.15s ease; } #nd-sidebar [data-radix-scroll-area-viewport] a:hover, #nd-sidebar [data-radix-scroll-area-viewport] button:hover { background-color: rgba(0, 0, 0, 0.05); } .dark #nd-sidebar [data-radix-scroll-area-viewport] a:hover, .dark #nd-sidebar [data-radix-scroll-area-viewport] button:hover { background-color: rgba(255, 255, 255, 0.05); } #nd-sidebar [data-radix-scroll-area-viewport] a[data-active="true"] { color: var(--composio-orange); } /* CLI commands table — prevent command column from wrapping */ .cli-commands td:first-child code { white-space: nowrap; } /* Section headers (separators) - more spacing for visual group separation */ #nd-sidebar p.inline-flex { margin-top: 1.75rem !important; margin-bottom: 0.5rem; font-size: 0.6875rem; font-weight: 500; text-transform: uppercase; letter-spacing: 0.05em; color: var(--color-fd-muted-foreground); } /* First section header - less top margin */ #nd-sidebar p.inline-flex:first-of-type { margin-top: 0 !important; } #nd-sidebar-mobile { background-color: var(--composio-sidebar); } [data-active="true"] { color: var(--composio-orange); background: transparent; } /* ========================================================================== Docs Page ========================================================================== */ #nd-page { padding-top: 1.5rem; } @media (min-width: 768px) { #nd-page { padding-top: 2rem; } } /* ========================================================================== Components ========================================================================== */ /* Form inputs - remove default outline, rely on focus-visible styles */ input:focus, select:focus, textarea:focus { outline: none; } input:focus-visible, select:focus-visible, textarea:focus-visible { outline: none; } [data-card="true"] { background: var(--color-fd-muted); } [data-card="true"]:hover { border-color: var(--composio-orange); } [data-fumadocs-tabs] [data-state="active"] { color: var(--composio-orange); border-color: var(--composio-orange); } .prose blockquote { border-left-color: var(--composio-orange); background: var(--color-fd-muted); padding: 1rem; border-radius: 0 var(--radius) var(--radius) 0; } /* Callouts — muted links, not brand accent */ [data-fumadocs-body] [data-callout] a:not([data-card]) { color: inherit; text-decoration: underline; text-underline-offset: 2px; text-decoration-color: var(--color-fd-border); } [data-fumadocs-body] [data-callout] a:not([data-card]):hover { text-decoration-color: currentColor; } /* ========================================================================== Header Components ========================================================================== */ /* Shared transition timing */ :root { --header-transition: 0.15s ease; } /* Header spacing & rhythm */ #nd-nav { gap: 2rem; } /* Nav links container */ #nd-nav nav { gap: 0.25rem; } /* Nav link items - consistent height (36px touch target) */ #nd-nav nav > a { display: inline-flex; align-items: center; height: 2.25rem; padding: 0 0.75rem; font-size: 0.875rem; font-weight: 500; color: var(--color-fd-muted-foreground); border-radius: 0.375rem; transition: color var(--header-transition), background var(--header-transition); } #nd-nav nav > a:hover { color: var(--color-fd-foreground); background: var(--color-fd-accent); } #nd-nav nav > a:focus-visible { outline: 2px solid var(--composio-orange); outline-offset: 2px; } /* Active nav link */ #nd-nav nav > a[data-active="true"] { color: var(--composio-orange); } #nd-nav nav > a[data-active="true"]:hover { background: transparent; } /* Right side items - consistent gaps */ #nd-nav > div:last-child { gap: 0.5rem; } /* GitHub icon link */ #nd-nav a[href*="github.com"] { display: inline-flex; align-items: center; justify-content: center; width: 2.25rem; height: 2.25rem; border-radius: 0.375rem; color: var(--color-fd-muted-foreground); transition: color var(--header-transition), background var(--header-transition); } #nd-nav a[href*="github.com"]:hover { color: var(--color-fd-foreground); background: var(--color-fd-accent); } #nd-nav a[href*="github.com"]:focus-visible { outline: 2px solid var(--composio-orange); outline-offset: 2px; } /* Search toggle - match style */ #nd-nav [data-search-toggle] { height: 2.25rem; border-radius: 0.375rem; transition: border-color var(--header-transition); } #nd-nav [data-search-toggle]:focus-visible { outline: 2px solid var(--composio-orange); outline-offset: 2px; } /* Dashboard button - CTA with consistent height */ nav a[href*="app.composio"] { display: inline-flex; align-items: center; height: 2.25rem; padding: 0 0.875rem; background: var(--color-fd-primary); color: var(--color-fd-primary-foreground); border-radius: 0.375rem; font-size: 0.8125rem; font-weight: 500; transition: opacity var(--header-transition); } nav a[href*="app.composio"]:hover { opacity: 0.9; } nav a[href*="app.composio"]:focus-visible { outline: 2px solid var(--composio-orange); outline-offset: 2px; } /* ========================================================================== OpenAPI Reference - Field Indicators Replaces fumadocs-openapi's default ? and * indicators with explicit "Required" label after the type for required fields. Targets: span (simple types), button (expandable objects/arrays), a (links) Note: This depends on fumadocs-openapi's internal class structure. If the library updates its classes, this CSS may need adjustment. ========================================================================== */ /* Hide original indicators (* and ?) after property name */ span.font-mono.text-fd-primary > span.text-red-400:last-child, span.font-mono.text-fd-primary > span.text-fd-muted-foreground:last-child { display: none; } /* Add "Required" after type for required fields */ div.flex.items-center:has(> span.font-mono.text-fd-primary > span.text-red-400) > :is(span, button, a).text-sm.font-mono::after { content: "Required"; font-size: 0.75rem; font-weight: 400; margin-left: 0.25rem; color: #f87171; } /* Hide empty schema wrapper divs (e.g. when Error schema is skipped) */ div.border.rounded-lg:not(:has(*)) { display: none; } /* Hide redundant "application/json" content type labels */ p.text-fd-muted-foreground.not-prose:has(> code.text-xs) { display: none; } /* ========================================================================== Table of Contents (Right Sidebar) ========================================================================== */ /* Prevent "On this page" from being cut off by header */ #nd-toc { top: 4rem; } /* TOC - scope primary color to orange for active indicator */ #nd-toc { --color-fd-primary: var(--composio-orange); } /* Accordion copy-link button: hidden by default, visible on hover */ [data-accordion-value] button[aria-label="Copy Link"] { opacity: 0; transition: opacity 150ms; } [data-accordion-value]:hover button[aria-label="Copy Link"], [data-accordion-value]:focus-within button[aria-label="Copy Link"] { opacity: 1; } /* Green check feedback on copy (matches heading anchor style) */ [data-accordion-value] button[aria-label="Copy Link"]:has(.lucide-check) { opacity: 1; color: var(--color-green-500); } /* ========================================================================== Search Dialog – Mobile Scroll Fix On mobile, when the keyboard opens the viewport shrinks. Constrain the search result list to the remaining space so it stays scrollable. ========================================================================== */ @media (max-width: 767px) { /* Override the fixed max-h-[460px] on the inner scrollable div inside SearchDialogList */ .search-scroll-container > div > div { max-height: 100%; } } /* ========================================================================== Decimal AI Widget – Push-Sidebar Transition The widget sets body.style.maxWidth inline when opening. Smooth it out and prevent horizontal overflow while the sidebar animates. ========================================================================== */ body { overflow-x: clip; transition: max-width 0.3s ease; } /* Hide Decimal's built-in launcher tab and floating button — we trigger the widget from our own "Ask AI" button in the nav (see ask-ai-button.tsx). */ .decimal-widget-sidebar-tab, .decimal-widget-button { display: none !important; } @layer base { * { @apply border-border outline-ring/50; } body { @apply bg-background text-foreground; } } /* ========================================================================== 404 glitch animation (ported from landing site) ========================================================================== */ @keyframes glitch-404 { 0%, 3% { text-shadow: none; transform: translate(0); } 6% { text-shadow: 3px 0 var(--composio-brand), -3px 0 #cd0700; transform: translate(-3px, 1px); } 12% { text-shadow: -3px 0 var(--composio-brand), 3px 0 #cd0700; transform: translate(3px, -1px); } 18% { text-shadow: 2px 0 var(--composio-brand), -2px 0 #cd0700; transform: translate(-1px, 2px); } 24% { text-shadow: -1px 0 var(--composio-brand), 1px 0 #cd0700; transform: translate(2px, -1px); } 30%, 100% { text-shadow: none; transform: translate(0); } } .animate-glitch-404 { animation: glitch-404 2.6s ease-out infinite; } /* ========================================================================== Hero demo — fade-in for prompts, traces, and responses ========================================================================== */ @keyframes hero-demo-fade-in { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: translateY(0); } } .animate-fade-in { animation: hero-demo-fade-in 280ms ease-out both; } /* ========================================================================== Landing-hero theme tokens — keep chat / card skins legible in both light and dark mode. Skins reference these via `var(--hero-*)`. ========================================================================== */ :root { --hero-surface: #ffffff; --hero-surface-2: #f6f5f3; --hero-bubble: #f3f3f1; --hero-text: rgba(15, 15, 15, 0.9); --hero-text-muted: rgba(15, 15, 15, 0.45); --hero-border: rgba(15, 15, 15, 0.12); --hero-border-soft: rgba(15, 15, 15, 0.06); --hero-shimmer: #0a0a0a; } .dark { /* Aligned with --color-fd-card / --color-fd-muted so the hero chat panel sits at the same grey as the feature cards below it; the darker `#141416` chat surface used to read as a shadow patch against the page bg. */ --hero-surface: #1c1c1c; --hero-surface-2: #222222; --hero-bubble: #262626; --hero-text: rgba(245, 245, 247, 0.92); --hero-text-muted: rgba(245, 245, 247, 0.5); --hero-border: rgba(255, 255, 255, 0.08); --hero-border-soft: rgba(255, 255, 255, 0.04); --hero-shimmer: #f5f5f7; } /* ========================================================================== Hero "active card" drop shadow — neutral black blur around any card that lights up in the agent loop. Lives in plain CSS because Tailwind v4's arbitrary `shadow-[...rgba(...)...]` doesn't parse the commas inside `rgba()` cleanly. ========================================================================== */ .hero-card-shadow { /* `!important` needed because Tailwind v4's `transition-shadow` chains `box-shadow` through several CSS variables (`--tw-shadow`, etc.) that default to `0 0 #0000`, which otherwise overrides this declaration. */ box-shadow: 0 0 40px rgba(0, 0, 0, 0.18) !important; } .dark .hero-card-shadow { box-shadow: 0 0 40px rgba(0, 0, 0, 0.55) !important; } /* Latest tool-call name in the mock chat — shimmer effect on a dark gradient (light mode) / light gradient (dark mode). Defined in CSS instead of inline so the gradient stops can reference theme tokens without breaking on `var(...) + hex-alpha` concatenation. */ .hero-tool-shimmer { background-image: linear-gradient( 90deg, rgba(15, 15, 15, 0.35) 0%, rgba(15, 15, 15, 0.7) 40%, rgba(15, 15, 15, 1) 50%, rgba(15, 15, 15, 0.7) 60%, rgba(15, 15, 15, 0.35) 100% ); background-size: 200% 100%; background-clip: text; -webkit-background-clip: text; color: transparent; animation: shimmer-text 2s ease-in-out infinite; } .dark .hero-tool-shimmer { background-image: linear-gradient( 90deg, rgba(245, 245, 247, 0.35) 0%, rgba(245, 245, 247, 0.7) 40%, rgba(245, 245, 247, 1) 50%, rgba(245, 245, 247, 0.7) 60%, rgba(245, 245, 247, 0.35) 100% ); } /* ========================================================================== Landing-hero keyframes (ported from landing-new) ========================================================================== */ @keyframes hero-cpu-pulse { 0%, 100% { opacity: 0.2; } 50% { opacity: 1; } } @keyframes pulse-dot { 0%, 100% { opacity: 1; } 50% { opacity: 0.3; } } @keyframes shimmer-text { 0% { background-position: 100% 0; } 100% { background-position: -100% 0; } } /* Square the navbar theme toggle (and its inner icons) to match the zero-radius search input. Fumadocs hard-codes `rounded-full` via Tailwind utilities, so the override needs !important to beat the utility layer's specificity. */ [data-theme-toggle], [data-theme-toggle] > * { border-radius: 0 !important; } /* ========================================================================== TERMINAL-KIT (ported from landing-new /dev — components/terminal-kit) Trimmed to what the InChatAuthTerminal component uses: the Claude palette (dark + light), structural tokens, the stacked Input field, and the shared session/body classes. Map the kit's mono font onto the docs JetBrains Mono. ========================================================================== */ @keyframes terminal-cursor-blink { 0%, 49% { opacity: 1; } 50%, 100% { opacity: 0; } } .terminal-theme { --font-geist-mono: var(--font-mono); } .terminal-theme { --terminal-radius-window: 12px; --terminal-radius-panel: 4px; --terminal-radius-sm: 2px; --terminal-session-pad-x: 14px; --terminal-session-pad-y: 12px; --terminal-session-gap: 8px; --terminal-session-inset: 14px; --terminal-session-sent-pad-x: 10px; background-color: var(--terminal-bg); color: var(--terminal-fg); font-family: var(--font-geist-mono), ui-monospace, SFMono-Regular, "Roboto Mono", Menlo, Monaco, "Liberation Mono", "Courier New", monospace; font-size: 12px; line-height: 1.625; border-radius: var(--terminal-radius-window); } .terminal-theme-claude { --terminal-bg: #0b0b0b; --terminal-editor-bg: #1f1f1e; --terminal-fg: #ffffff; --terminal-white: #ffffff; --terminal-dim: #c3c2b7; --terminal-dimmer: #898781; --terminal-vdim: #3d3d3d; --terminal-surface: #232323; --terminal-input-bg: #1f1f1e; --terminal-popover: #2a2a2a; --terminal-panel: rgba(255, 255, 255, 0.05); --terminal-panel-strong: rgba(255, 255, 255, 0.07); --terminal-border: rgba(255, 255, 255, 0.1); --terminal-preview-bg: #0e0e0d; --terminal-preview-border: #222220; --terminal-input-border: #565552; --terminal-progress-track: #3d3d3d; --terminal-progress-fill: #d97757; --terminal-green: #4cc38a; --terminal-green-dim: #6fd4a8; --terminal-green-bg: rgba(76, 195, 138, 0.14); --terminal-blue: #4d9fff; --terminal-blue-bright: #0099ff; --terminal-teal: #d97757; --terminal-yellow: #e3c07b; --terminal-orange: #ff8d77; --terminal-red: #ff5a5a; --terminal-purple: #9775fa; --terminal-diff-gutter: #8b8b81; --terminal-diff-insert-fg: #4cc38a; --terminal-diff-insert-bg: rgba(76, 195, 138, 0.12); --terminal-diff-delete-fg: #ff8d77; --terminal-diff-delete-bg: rgba(255, 90, 90, 0.12); --terminal-diff-text: #ffffff; --terminal-traffic-red: #ff5f57; --terminal-traffic-yellow: #febc2e; --terminal-traffic-green: #28c840; background-color: var(--terminal-bg); color: var(--terminal-fg); } .terminal-theme-claude-light, html:not(.dark) .terminal-theme-claude { --terminal-bg: #faf9f5; --terminal-editor-bg: #ffffff; --terminal-fg: #131312; --terminal-white: #131312; --terminal-dim: #3c3c39; --terminal-dimmer: #72716b; --terminal-vdim: #e1e0d9; --terminal-surface: #f4f4ec; --terminal-input-bg: #ffffff; --terminal-popover: #ffffff; --terminal-panel: rgba(19, 19, 18, 0.04); --terminal-panel-strong: rgba(19, 19, 18, 0.07); --terminal-border: rgba(31, 30, 29, 0.12); --terminal-preview-bg: #f0efe8; --terminal-preview-border: rgba(19, 19, 18, 0.06); --terminal-input-border: #a8a7a2; --terminal-progress-track: #e1e0d9; --terminal-progress-fill: #d97757; --terminal-green: #2f7613; --terminal-green-dim: #3d8f18; --terminal-green-bg: #e7f1d9; --terminal-blue: #2c83db; --terminal-blue-bright: #1a66b2; --terminal-teal: #d97757; --terminal-yellow: #865a07; --terminal-orange: #c6613f; --terminal-red: #b43232; --terminal-purple: #5545a1; --terminal-diff-insert-fg: #2f7613; --terminal-diff-insert-bg: #e7f1d9; --terminal-diff-delete-fg: #b43232; --terminal-diff-delete-bg: #f8ebeb; --terminal-diff-text: #131312; background-color: var(--terminal-bg); color: var(--terminal-fg); } .terminal-theme-claude .terminal-input-control::placeholder { color: var(--terminal-dim); opacity: 1; } .terminal-input-field--stacked { position: relative; border: none; border-radius: 0; background: transparent; padding-block: 6px; padding-inline: 0; } .terminal-input-field--stacked::before, .terminal-input-field--stacked::after { content: ""; position: absolute; left: 0; right: 0; height: 1.5px; background: var(--terminal-input-border); pointer-events: none; } .terminal-input-field--stacked::before { top: 0; } .terminal-input-field--stacked::after { bottom: 0; } .terminal-cursor { animation: terminal-cursor-blink 1s step-end infinite; } .terminal-panel { border-radius: var(--terminal-radius-panel); } .terminal-panel-sm { border-radius: var(--terminal-radius-sm); } .terminal-session { display: flex; flex-direction: column; gap: var(--terminal-session-gap); min-width: 0; } .terminal-session-sent { box-sizing: border-box; width: 100%; border-radius: var(--terminal-radius-sm); padding-inline: var(--terminal-session-sent-pad-x); } .terminal-session-inset { padding-left: var(--terminal-session-inset); } .terminal-session-flush { box-sizing: border-box; width: 100%; } .terminal-body-content { padding-inline: var(--terminal-session-pad-x); padding-block: var(--terminal-session-pad-y); } .terminal-body-footer { padding-inline: var(--terminal-session-pad-x); } .terminal-body-scroll-host { position: relative; min-height: 0; width: 100%; display: flex; flex-direction: column; } .terminal-body-scroll { flex: 1 1 auto; min-height: 0; overflow-y: auto; overscroll-behavior: contain; scrollbar-width: none; -ms-overflow-style: none; } .terminal-body-scroll::-webkit-scrollbar { display: none; width: 0; height: 0; } @media (prefers-reduced-motion: reduce) { .terminal-cursor { animation: none; opacity: 1; } } /* @pierre/diffs: the +/- stat counts in the file header are hidden via the `unsafeCSS` option in components/diff-view.tsx, NOT here — the header renders inside an open shadow root that global CSS can't pierce. */ /* Copy-to-clipboard button in the @pierre/diffs code header. The widget themes itself off the OS prefers-color-scheme (its shadow root pins `color-scheme: light dark`), NOT the site's class-based dark toggle — so the header is light on a light-OS user even when the docs are in dark mode. Match the header with light-dark() so the chip is legible on either header. */ .diff-copy-button { color-scheme: light dark; border-color: light-dark(rgb(0 0 0 / 0.1), rgb(255 255 255 / 0.1)); background-color: light-dark(rgb(0 0 0 / 0.04), rgb(255 255 255 / 0.04)); color: light-dark(#71717a, #a1a1aa); } .diff-copy-button:hover { border-color: light-dark(rgb(0 0 0 / 0.2), rgb(255 255 255 / 0.2)); background-color: light-dark(rgb(0 0 0 / 0.08), rgb(255 255 255 / 0.1)); color: light-dark(#18181b, #f4f4f5); } .diff-copy-button:focus-visible { outline: 2px solid light-dark(rgb(0 0 0 / 0.2), rgb(255 255 255 / 0.25)); outline-offset: 1px; }