1192 lines
33 KiB
CSS
1192 lines
33 KiB
CSS
@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;
|
||
}
|