Files
2026-07-13 12:38:34 +08:00

1192 lines
33 KiB
CSS
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
@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 <CodeBlock> 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;
}