@import 'tailwindcss'; @import 'fumadocs-ui/css/neutral.css'; @import 'fumadocs-ui/css/preset.css'; /* -------------------------------------------------------------------------- */ /* Pangolin palette (ported from the Mintlify docs.json + style.css) */ /* -------------------------------------------------------------------------- */ @theme { --font-sans: var(--font-inter), ui-sans-serif, system-ui, sans-serif; --color-pg-beige: #faf9f2; /* page background */ --color-pg-sand: #f2f0e7; /* nav, sidebar, code, cards */ --color-pg-line: #bbbbbb; /* hairlines, same as pangolin.net grey-light-8 */ --color-pg-ink: #202020; /* text + primary */ --color-pg-orange: #f36117; /* brand accent (dark primary in Mintlify) */ --color-fd-background: #faf9f2; --color-fd-foreground: #202020; --color-fd-muted: #f2f0e7; --color-fd-muted-foreground: #6b6a63; --color-fd-popover: #faf9f2; --color-fd-popover-foreground: #202020; --color-fd-card: #f2f0e7; --color-fd-card-foreground: #202020; --color-fd-border: #bbbbbb; --color-fd-primary: #202020; --color-fd-primary-foreground: #faf9f2; --color-fd-secondary: #f2f0e7; --color-fd-secondary-foreground: #202020; --color-fd-accent: #e8e7e5; --color-fd-accent-foreground: #202020; --color-fd-ring: #bbbbbb; --color-fd-overlay: rgba(32, 32, 32, 0.2); --pg-code-bg: #f2f0e7; --pg-code-border: #bbbbbb; } /* only used when `enableDarkMode` is on in lib/shared.ts */ .dark { --color-fd-background: #161614; --color-fd-foreground: #ecebe6; --color-fd-muted: #1f1e1b; --color-fd-muted-foreground: #a3a199; --color-fd-popover: #1b1a18; --color-fd-popover-foreground: #ecebe6; --color-fd-card: #1f1e1b; --color-fd-card-foreground: #ecebe6; --color-fd-border: #2d2c28; --color-fd-primary: #f36117; --color-fd-primary-foreground: #161614; --color-fd-secondary: #1f1e1b; --color-fd-secondary-foreground: #ecebe6; --color-fd-accent: #2d2c28; --color-fd-accent-foreground: #ecebe6; --color-fd-ring: #55534c; --pg-code-bg: #1f1e1b; --pg-code-border: #3a3934; } html { scrollbar-gutter: stable; } html > body[data-scroll-locked] { margin-right: 0px !important; --removed-body-scroll-bar-size: 0px !important; } body { background-color: var(--color-fd-background); color: var(--color-fd-foreground); } /* pangolin.net button typeface */ @font-face { font-family: 'Die Grotesk B'; src: url('/fonts/die-grotesk-b-regular.woff2') format('woff2'); font-weight: 400; font-style: normal; font-display: swap; } @font-face { font-family: 'Die Grotesk B'; src: url('/fonts/die-grotesk-b-medium.woff2') format('woff2'); font-weight: 500; font-style: normal; font-display: swap; } /* * Hairlines like pangolin.net (0.5px, #bbb). Unlayered, so these win over the 1px * Tailwind border utilities used by Fumadocs; 2px accents (active tab) are untouched. */ .border { border-width: 0.5px; } .border-t { border-top-width: 0.5px; } .border-b { border-bottom-width: 0.5px; } .border-l, .border-s { border-inline-start-width: 0.5px; } .border-r, .border-e { border-inline-end-width: 0.5px; } .border-x { border-inline-width: 0.5px; } .border-y { border-block-width: 0.5px; } /* -------------------------------------------------------------------------- */ /* Chrome: navbar, sidebar, banner */ /* -------------------------------------------------------------------------- */ /* * Layout grid (used by app/(docs)/layout.tsx). Desktop: the sidebar is pinned to the * left edge and content + TOC are centered in the remaining space, max 70rem like the * old Mintlify site; the last column holds the AI chat panel when it is open. */ #nd-notebook-layout { --pg-content-width: 70rem; --pg-grid: 'header header' 'sidebar toc-popover' 'sidebar main' 1fr / var(--fd-sidebar-col) minmax(0, 1fr); } @media (min-width: 1024px) { #nd-notebook-layout { /* width taken by the AI chat panel when it is open */ --pg-panel: 0px; /* equal gutters that center content + TOC; they collapse to 0 on narrow screens */ --pg-gutter: max( 0px, calc((100% - var(--fd-sidebar-col) - var(--pg-content-width) - var(--pg-panel)) / 2) ); --pg-grid: 'header header header header header' 'sidebar . toc-popover toc-popover .' 'sidebar . main toc .' 1fr / var(--fd-sidebar-col) var(--pg-gutter) minmax(0, 1fr) var(--fd-toc-width) calc(var(--pg-gutter) + var(--pg-panel)); } /* set from components/ai/search.tsx while the chat panel is open */ #nd-notebook-layout[data-ai-open] { --pg-panel: 400px; } /* slide the content along with the panel's open / close animation */ #nd-notebook-layout { transition: grid-template-columns 200ms ease; } } @media (min-width: 1536px) { #nd-notebook-layout[data-ai-open] { --pg-panel: 460px; } } #nd-subnav { background-color: color-mix(in srgb, var(--color-fd-muted) 92%, transparent); } #nd-subnav [data-header-body], #nd-subnav [data-header-tabs] { border-color: var(--color-fd-border); } /* tab row under the navbar */ #nd-subnav [data-header-tabs] a { font-weight: 500; } #nd-sidebar { background-color: var(--color-fd-muted); border-inline-end: 0.5px solid var(--color-fd-border); } /* separators = Mintlify top-level group headings */ #nd-sidebar p[data-separator], #nd-sidebar [data-separator] { color: var(--color-fd-foreground); font-weight: 600; } /* * First group heading ("About") under the anchors: Fumadocs only drops its top margin * when it is the very first element, but hidden mobile menu links come before it. Trim * it so anchors -> "About" matches the gap between groups (~26px incl. viewport padding). */ #nd-sidebar p.mt-6:first-of-type { margin-top: 0.625rem; } /* Mintlify-style sidebar anchors (Discord, Slack): icon tile + medium label */ .pg-anchor { display: flex; align-items: center; gap: 0.75rem; border-radius: 0.5rem; padding: 0.25rem 0.5rem; font-size: 0.875rem; font-weight: 500; color: var(--color-fd-muted-foreground); transition: color 150ms; } .pg-anchor:hover { color: var(--color-fd-foreground); } .pg-anchor-icon { display: inline-flex; align-items: center; justify-content: center; width: 1.5rem; height: 1.5rem; flex-shrink: 0; border: 0.5px solid var(--color-fd-border); border-radius: 0.375rem; background-color: var(--color-fd-background); color: var(--color-fd-muted-foreground); transition: color 150ms, border-color 150ms, background-color 150ms; } .pg-anchor-icon svg { width: 0.875rem; height: 0.875rem; } .pg-anchor:hover .pg-anchor-icon { border-color: var(--color-fd-foreground); background-color: var(--color-fd-foreground); color: var(--color-fd-background); } .pg-banner { background-color: var(--color-pg-ink); color: #faf9f2; font-size: 0.875rem; } .pg-banner button { color: #faf9f2; } /* header buttons: pangolin.net `btn` / `btnSecondary` + `btnSm` */ .pg-btn { display: inline-block; border-radius: 9999px; border: 0; background-color: #202020; color: #faf9f2; font-family: 'Die Grotesk B', var(--font-sans); font-size: 0.875rem; font-weight: 500; line-height: 1.4; padding: 0.75rem 1.25rem; white-space: nowrap; text-decoration: none; transition: transform 300ms; } .pg-btn:hover { transform: scale(1.025); } .pg-btn-secondary { border: 1px solid #bbbbbb; background-color: #faf9f2; color: #202020; /* 1px border: keep the same outer size as the primary button */ padding: calc(0.75rem - 1px) calc(1.25rem - 1px); } .dark .pg-btn { background-color: #ecebe6; color: #161614; } .dark .pg-btn-secondary { border-color: #3a3934; background-color: transparent; color: #ecebe6; } /* "Ask AI" button to the right of the header search (Mintlify style) */ .pg-ask-ai-btn { display: inline-flex; flex-shrink: 0; align-items: center; gap: 0.4rem; height: 2.25rem; padding: 0 0.85rem; border: 0.5px solid var(--color-fd-border); border-radius: 0.75rem; background-color: color-mix(in srgb, var(--color-fd-secondary) 50%, transparent); color: var(--color-fd-muted-foreground); font-size: 0.875rem; white-space: nowrap; transition: background-color 150ms, color 150ms; } .pg-ask-ai-btn:hover, .pg-ask-ai-btn[data-state='open'] { background-color: var(--color-fd-accent); color: var(--color-fd-accent-foreground); } .pg-ask-ai-btn svg { width: 1rem; height: 1rem; color: var(--color-pg-orange); } /* logo: fixed height, width from the image's aspect ratio (never stretched) */ .pg-logo { display: block; height: 1.5rem; width: auto; max-width: none; flex-shrink: 0; object-fit: contain; } .pg-logo.hidden { display: none; } .dark .pg-logo.dark\:block { display: block; } .dark .pg-logo.dark\:hidden { display: none; } /* ---------- AI chat input (Mintlify style) ---------- */ .pg-chat-input { border: 0.5px solid var(--color-fd-border); border-radius: 1rem; background-color: var(--color-fd-background); box-shadow: 0 1px 2px rgba(32, 32, 32, 0.04); transition: border-color 150ms, box-shadow 150ms; } .pg-chat-input:focus-within { border-color: #8d8d8d; box-shadow: 0 4px 16px rgba(32, 32, 32, 0.08); } .pg-chat-send { display: inline-flex; flex-shrink: 0; align-items: center; justify-content: center; width: 1.9rem; height: 1.9rem; border-radius: 9999px; background-color: var(--color-fd-primary); color: var(--color-fd-primary-foreground); transition: opacity 150ms, background-color 150ms; } .pg-chat-send:disabled { background-color: #e8e7e5; color: #8d8d8d; cursor: default; } .dark .pg-chat-send:disabled { background-color: #2d2c28; } /* sticky bar at the bottom of each page */ .pg-askbar-wrap { position: sticky; bottom: 1.25rem; z-index: 20; display: flex; justify-content: center; margin-top: 1.5rem; pointer-events: none; transition: opacity 200ms, translate 200ms; } .pg-askbar-hidden { opacity: 0; translate: 0 0.75rem; } .pg-askbar { pointer-events: auto; display: flex; align-items: center; gap: 0.5rem; width: min(100%, 28rem); padding: 0.4rem 0.4rem 0.4rem 1rem; box-shadow: 0 8px 28px rgba(32, 32, 32, 0.1); } .pg-askbar-hidden .pg-askbar { pointer-events: none; } .pg-askbar:focus-within { box-shadow: 0 8px 28px rgba(32, 32, 32, 0.14); } .pg-askbar input { flex: 1; min-width: 0; background: transparent; font-size: 0.9rem; outline: none; } /* iOS zooms the page when a focused field is under 16px. Search uses text-lg, so it doesn't. */ @media (hover: none) and (pointer: coarse) { .pg-chat-field, .pg-askbar input { font-size: 16px; } } .pg-askbar input::placeholder { color: #8d8d8d; } .pg-askbar-kbd { border: 0.5px solid var(--color-fd-border); border-radius: 0.375rem; padding: 0.05rem 0.35rem; font-family: inherit; font-size: 0.7rem; color: var(--color-fd-muted-foreground); } @media (max-width: 767px) { .pg-askbar-kbd { display: none; } } /* -------------------------------------------------------------------------- */ /* Content */ /* -------------------------------------------------------------------------- */ /* inline code: match pangolin.net/news */ .prose :where(code):not(:where(pre code, .not-prose code)) { background-color: var(--pg-code-bg); border: 0.5px solid var(--pg-code-border); border-radius: 4px; color: var(--color-fd-foreground); font-size: 0.875em; font-weight: 400; padding: 0.125rem 0.35rem; } /* code blocks */ .prose figure.shiki, figure.shiki { background-color: var(--pg-code-bg); border-color: var(--color-fd-border); box-shadow: none; } figure.shiki pre, figure.shiki .shiki { background-color: transparent !important; } figure.shiki [data-line].highlighted, figure.shiki .line.highlighted { background-color: rgba(243, 97, 23, 0.1); box-shadow: inset 2px 0 0 var(--color-pg-orange); } /* tables */ .prose table { font-size: 0.875rem; } /* ---------- callouts: beige with a coloured bar on the left ---------- */ .pg-callout { --pg-callout-bar: #525252; position: relative; display: flex; gap: 0.75rem; margin-block: 1.25rem; padding: 0.9rem 1rem 0.9rem 1.5rem; border-radius: 0.75rem; background-color: var(--pg-code-bg); color: var(--color-fd-foreground); font-size: 0.9rem; overflow: hidden; } .pg-callout::before { content: ''; position: absolute; inset-block: 0; left: 0; width: 8px; background-color: var(--pg-callout-bar); } .pg-callout[data-type='note'] { --pg-callout-bar: #2563eb; } .pg-callout[data-type='info'] { --pg-callout-bar: #525252; } .pg-callout[data-type='tip'] { --pg-callout-bar: #16a34a; } .pg-callout[data-type='check'] { --pg-callout-bar: #16a34a; } .pg-callout[data-type='warning'] { --pg-callout-bar: #ca8a04; } .pg-callout[data-type='danger'] { --pg-callout-bar: #dc2626; } .pg-callout-icon { flex-shrink: 0; margin-top: 0.15rem; color: var(--pg-callout-bar); } .pg-callout-icon svg { width: 1rem; height: 1rem; } .pg-callout-body { min-width: 0; flex: 1; font-size: 0.9rem; } .pg-callout-body > :first-child { margin-top: 0; } .pg-callout-body > :last-child { margin-bottom: 0; } /* ---------- cards ---------- */ .pg-card-group { display: grid; gap: 1rem; margin-block: 1.25rem; grid-template-columns: repeat(1, minmax(0, 1fr)); } @media (min-width: 640px) { .pg-card-group { grid-template-columns: repeat(min(var(--pg-cols, 2), 2), minmax(0, 1fr)); } } @media (min-width: 1024px) { .pg-card-group { grid-template-columns: repeat(var(--pg-cols, 2), minmax(0, 1fr)); } } .pg-card { display: block; overflow: hidden; border-radius: 0.75rem; background-color: var(--color-fd-card); color: var(--color-fd-card-foreground); margin-block: 1rem; transition: background-color 150ms; } .pg-card-group > .pg-card { margin-block: 0; } .pg-card-link { position: relative; } .pg-card-link:hover { background-color: var(--color-fd-accent); } .pg-card-overlay { position: absolute; inset: 0; z-index: 1; border-radius: inherit; } .pg-card-overlay:focus-visible { outline: 2px solid var(--color-fd-ring); outline-offset: 2px; } /* links inside a linked card stay clickable above the overlay */ .pg-card-link .pg-card-content a { position: relative; z-index: 2; } .pg-card-img { width: 100%; object-fit: cover; } .pg-card-inner { display: flex; flex-direction: column; gap: 0.75rem; padding: 1.25rem; } .pg-card-horizontal { flex-direction: row; align-items: center; } .pg-card-icon { display: inline-flex; color: var(--color-fd-foreground); } .pg-card-icon svg { width: 1.25rem; height: 1.25rem; } .pg-card-title { display: flex; align-items: center; gap: 0.35rem; font-weight: 600; font-size: 0.95rem; } .pg-card-arrow { width: 0.9rem; height: 0.9rem; color: var(--color-fd-muted-foreground); } .pg-card-content { margin-top: 0.25rem; color: var(--color-fd-muted-foreground); font-size: 0.875rem; } .pg-card-content > :first-child { margin-top: 0; } .pg-card-content > :last-child { margin-bottom: 0; } .pg-card-cta { display: inline-flex; align-items: center; gap: 0.2rem; margin-top: 0.75rem; font-size: 0.875rem; font-weight: 500; } /* ---------- steps ---------- */ .pg-steps { counter-reset: pg-step; margin-block: 1.5rem; } .pg-step { counter-increment: pg-step; position: relative; padding-left: 2.75rem; padding-bottom: 1.75rem; } .pg-step::after { content: ''; position: absolute; left: 0.875rem; top: 2.25rem; bottom: 0.25rem; width: 0.5px; background-color: var(--color-fd-border); } .pg-step:last-child { padding-bottom: 0.25rem; } .pg-step:last-child::after { display: none; } .pg-step-marker { position: absolute; left: 0; top: 0; display: inline-flex; align-items: center; justify-content: center; width: 1.75rem; height: 1.75rem; border-radius: 9999px; background-color: var(--color-fd-muted); font-size: 0.8rem; font-weight: 600; } .pg-step-marker:empty::before { content: counter(pg-step); } .pg-step-title { margin: 0 !important; padding-top: 0.15rem; font-weight: 600; line-height: 1.5rem; } .pg-step-content > :first-child { margin-top: 0.5rem; } .pg-step-content > :last-child { margin-bottom: 0; } /* ---------- accordions & expandables ---------- */ .pg-accordion-group { margin-block: 1.25rem; border: 0.5px solid var(--color-fd-border); border-radius: 0.75rem; overflow: hidden; } .pg-accordion { border: 0.5px solid var(--color-fd-border); border-radius: 0.75rem; margin-block: 0.75rem; background-color: var(--color-fd-background); } .pg-accordion-group > .pg-accordion { margin: 0; border: 0; border-radius: 0; } .pg-accordion-group > .pg-accordion + .pg-accordion { border-top: 0.5px solid var(--color-fd-border); } .pg-accordion > summary, .pg-expandable > summary { display: flex; align-items: center; gap: 0.6rem; cursor: pointer; list-style: none; user-select: none; } .pg-accordion > summary::-webkit-details-marker, .pg-expandable > summary::-webkit-details-marker { display: none; } .pg-accordion > summary { padding: 0.85rem 1rem; } .pg-accordion > summary:hover { background-color: var(--color-fd-muted); } .pg-accordion-chevron { width: 1rem; height: 1rem; flex-shrink: 0; color: var(--color-fd-muted-foreground); transition: transform 150ms; } details[open] > summary > .pg-accordion-chevron { transform: rotate(90deg); } .pg-accordion-content { padding: 0 1rem 1rem 2.6rem; } .pg-accordion-content > :first-child { margin-top: 0; } .pg-accordion-content > :last-child { margin-bottom: 0; } .pg-expandable { margin-top: 0.75rem; border: 0.5px solid var(--color-fd-border); border-radius: 0.6rem; } .pg-expandable > summary { padding: 0.4rem 0.75rem; font-size: 0.8rem; color: var(--color-fd-muted-foreground); } .pg-expandable > summary:hover { color: var(--color-fd-foreground); } .pg-expandable .pg-expandable-open { display: none; } .pg-expandable[open] > summary .pg-expandable-open { display: inline; } .pg-expandable[open] > summary .pg-expandable-closed { display: none; } .pg-expandable-content { padding: 0 0.9rem 0.25rem; border-top: 0.5px solid var(--color-fd-border); } .pg-expandable-content > .pg-field:last-child { border-bottom: 0; } /* ---------- response fields ---------- */ .pg-field { padding-block: 1rem; border-bottom: 0.5px solid var(--color-fd-border); } .pg-field-header { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; font-size: 0.8rem; } .pg-field-name { font-family: var(--font-mono, ui-monospace, monospace); font-weight: 600; font-size: 0.875rem; color: var(--color-pg-orange); background: none !important; border: 0 !important; padding: 0 !important; } .pg-field-type, .pg-field-pill { border-radius: 0.375rem; background-color: var(--color-fd-muted); color: var(--color-fd-muted-foreground); padding: 0.1rem 0.45rem; font-size: 0.75rem; } .pg-field-pill code { background: none !important; border: 0 !important; padding: 0 !important; font-size: 0.75rem !important; } .pg-field-required { color: #dc2626; font-weight: 500; font-size: 0.75rem; } .pg-field-deprecated { color: #ca8a04; font-weight: 500; font-size: 0.75rem; } .pg-field-body { margin-top: 0.5rem; font-size: 0.9rem; } .pg-field-body > :first-child { margin-top: 0; } .pg-field-body > :last-child { margin-bottom: 0; } /* ---------- frames ---------- */ .pg-frame { margin-block: 1.5rem; } .pg-frame-inner { display: flex; flex-direction: column; align-items: center; gap: 0.5rem; padding: 0.45rem; border-radius: 0.75rem; background-color: var(--pg-code-bg); border: 0.5px solid var(--color-fd-border); } .pg-frame-inner img, .pg-frame-inner video, .pg-frame-inner iframe { border-radius: 0.4rem; max-width: 100%; height: auto; margin: 0; } .pg-frame-inner video, .pg-frame-inner iframe { align-self: stretch; width: 100%; aspect-ratio: 16 / 9; } .pg-frame figcaption, .pg-frame-hint { margin: 0; padding-inline: 0.35rem; text-align: center; font-size: 0.85rem; line-height: 1.4; color: var(--color-fd-muted-foreground); } .prose img { border-radius: 0.6rem; } /* ---------- changelog updates ---------- */ .pg-update { display: grid; gap: 1rem; padding-block: 1.5rem; border-bottom: 0.5px solid var(--color-fd-border); } @media (min-width: 768px) { .pg-update { grid-template-columns: 10rem 1fr; } } /* ---------- footer ---------- */ .pg-footer { display: flex; flex-direction: column; gap: 1rem; margin-top: 3rem; padding-top: 1.5rem; border-top: 0.5px solid var(--color-fd-border); } .pg-download { display: inline-flex; align-items: center; gap: 0.4rem; height: 2.5rem; padding: 0 0.75rem; border-radius: 0.5rem; border: 1px solid var(--color-fd-border); background-color: #fff; color: var(--color-fd-muted-foreground); font-size: 0.875rem; line-height: 1; white-space: nowrap; text-decoration: none; transition: color 150ms, background-color 150ms; } .pg-download:hover { background-color: var(--color-fd-accent); color: var(--color-fd-foreground); } .dark .pg-download { background-color: var(--color-fd-card); }