{"slug":"meridian","name":"Meridian — Docs & API Reference","version":"2.6.3","category":"docs","priceCents":3400,"description":"A Tailwind documentation template built as a reading surface, with the interactions a docs product is expected to have. Prose stops at a ruled line and only machine content crosses it: the reading edge runs down every article column, and code blocks, parameter tables and the architecture figure are the things allowed past. Eight routes ship and every link on them resolves. Guides include a static recovery sequence for a timed-out publish, an idempotent retry, an expired lease and safe redelivery, all joined to the same typed endpoint contract as the reference. The SDK page compares the same consumer in TypeScript, Python and Go. The release log filters by tag. The request builder assembles a curl command and never sends it. Search is keyboard-first, every code block has copy recovery, and the delivery diagram is canonical Wire Diagram JSON. Source Sans 3 and Source Code Pro ship as self-hosted webfonts, with a compatible 1.250 type ladder. Light and dark are complete and computed against WCAG AA. The eight routes also compile to a framework-free HTML template, with local fonts, vanilla JavaScript and no framework runtime, for teams serving docs as static files.","summary":"For a team documenting an API: a Tailwind documentation template with guides, a reference, SDKs in three languages and a filterable changelog. 8 routes.","tags":["tailwind documentation template","api reference template nextjs","docs","search","tailwind-v4"],"palette":{"bg":"#f3f7fe","surface":"#ffffff","accent":"#1a47c7","text":"#0f141c","line":"#ccd4e2"},"darkMode":true,"pages":[{"path":"/","title":"Halyard docs — queues over HTTP","sections":["site-header","docs-hero","quickstart-panel","support-strip","site-footer"]},{"path":"/guides","title":"Guides — deliver your first message","sections":["site-header","guides-shell","recovery-sequence","site-footer"]},{"path":"/api","title":"API reference — endpoints and parameters","sections":["site-header","api-reference","site-footer"]},{"path":"/sdks","title":"SDKs — TypeScript, Python and Go clients","sections":["site-header","sdk-shell","site-footer"]},{"path":"/changelog","title":"Changelog — every API release, newest first","sections":["site-header","changelog-log","site-footer"]},{"path":"/support","title":"Support — how to get help with the API","sections":["site-header","support-desk","site-footer"]},{"path":"/legal","title":"Terms and policies — agreement, retention and availability","sections":["site-header","legal-desk","site-footer"]},{"path":"/components","title":"Design system — every part, labelled","sections":["site-header","docs-hero","quickstart-panel","guides-shell","recovery-sequence","api-reference","sdk-shell","changelog-log","support-desk","legal-desk","support-strip","site-footer"]}],"components":[{"name":"site-header","file":"src/components/site-header.tsx","renders":"Sticky docs header: wordmark, four current-aware section links, search, version switcher, mode toggle, API-keys link and a native mobile disclosure with Escape dismissal and focus return"},{"name":"docs-hero","file":"src/components/docs-hero.tsx","renders":"The indexed masthead (archetype A9): typed route/showcase heading root, version marker, headline, two actions, the first live request overhanging the container, and an eleven-entry index covering every route with the reader's own position marked"},{"name":"quickstart-panel","file":"src/components/quickstart-panel.tsx","renders":"Four numbered steps at display size beside one shell script that runs the whole create-publish-lease-ack loop"},{"name":"guides-shell","file":"src/components/guides-shell.tsx","renders":"Three-pane guide with a typed heading root: grouped sidebar, measure-capped article with the reading edge, optional recovery slot and matching conditional outline, code blocks, callouts and the Wire diagram figure"},{"name":"recovery-sequence","file":"src/components/recovery-sequence.tsx","renders":"Six-step static endpoint-id recipe for a timed-out publish, idempotent retry, first lease and expiry, lease_expired conflict, safe redelivery and ack; the canonical showcase is full while read-only and version-mismatch panes use the typed compact six-step summary"},{"name":"api-reference","file":"src/components/api-reference.tsx","renders":"Three-pane reference: ten endpoint blocks headed by the request line, parameter tables, JSON response samples, the publish request builder, a scope table, an error-code table and rate limits"},{"name":"sdk-shell","file":"src/components/sdk-shell.tsx","renders":"Three-pane SDK page: what every client handles as a capability table, then the same consumer loop in TypeScript, Python and Go behind one keyboard-driven tab strip, and the OpenAPI spec excerpt"},{"name":"changelog-log","file":"src/components/changelog-log.tsx","renders":"Three-pane release log: seven dated releases newest first, filtered by tag, tagged added/changed/fixed/deprecated/breaking, with the endpoints each release added rendered as request lines and one migration sample"},{"name":"support-desk","file":"src/components/support-desk.tsx","renders":"Three-pane support page: what support answers, a required-fields table and a worked report, incident triage, and how to ask for a limit raise"},{"name":"legal-desk","file":"src/components/legal-desk.tsx","renders":"Three-pane legal page: the agreement, acceptable use, a five-row retention table and the availability targets, all policy and no attestation"},{"name":"support-strip","file":"src/components/support-strip.tsx","renders":"Closing panel: support promise, keyboard shortcut reminder and two real actions, the support page first"},{"name":"site-footer","file":"src/components/site-footer.tsx","renders":"Four link columns marking what ships and what does not, product blurb, build string and an explicitly labelled example status line"},{"name":"ui/container","file":"src/components/ui/container.tsx","renders":"The content column at two widths: 7xl for reading surfaces, 5xl for the landing quickstart"},{"name":"ui/logo","file":"src/components/ui/logo.tsx","renders":"Wordmark: the hand-drawn meridian sphere plus the lowercase monospace product name"},{"name":"ui/button","file":"src/components/ui/button.tsx","renders":"Button in two shapes: the link-shaped action in primary/secondary/ghost at two sizes, and a real control carrying disabled and pending with aria-busy so a submit cannot fire twice, plus DisabledAction, the visibly unimplemented destination the placeholder convention uses"},{"name":"ui/badge","file":"src/components/ui/badge.tsx","renders":"Monospace pill with neutral, strong and caution appearance variants for HTTP methods, status codes and version tags"},{"name":"ui/request-line","file":"src/components/ui/request-line.tsx","renders":"The theme's atom: method, path, auth scope and response status in one dense mono row, heading every code sample and every endpoint block"},{"name":"ui/kbd","file":"src/components/ui/kbd.tsx","renders":"A real <kbd> chip, one key per chip, plus the platform-aware modifier key"},{"name":"ui/code-block","file":"src/components/ui/code-block.tsx","renders":"Framed code sample: request-line chrome, the copy control and its refusal band, and dependency-free four-role highlighting across six language families"},{"name":"ui/field","file":"src/components/ui/field.tsx","renders":"The form family: Field, TextField, TextareaField and fieldControlClasses, with label, optional marker, hint, read-only and disabled grounds, and an invalid state that follows the callout's rule - a two-pixel ink rule, a glyph and a sentence, never a hue"},{"name":"ui/callout","file":"src/components/ui/callout.tsx","renders":"Note, tip and warning appearance variants marked by border weight, a glyph and a word, never by a coloured stripe"},{"name":"ui/params-table","file":"src/components/ui/params-table.tsx","renders":"Two-column parameter table: name, type, default and a required chip on the left, description on the right"},{"name":"ui/docs-layout","file":"src/components/ui/docs-layout.tsx","renders":"The three-pane frame: full-height sidebar rule, article reading edge, outline rail, and a native sidebar disclosure below lg with Escape dismissal and focus return"},{"name":"ui/outline-rail","file":"src/components/ui/outline-rail.tsx","renders":"The on-this-page outline with a brass current marker driven by an IntersectionObserver"},{"name":"ui/version-switcher","file":"src/components/ui/version-switcher.tsx","renders":"The documentation version, the ones it is not, and where the changes are — the current line marked in brass and by aria-current, the unshipped lines marked as unshipped rather than linked somewhere else"},{"name":"ui/section-heading","file":"src/components/ui/section-heading.tsx","renders":"Eyebrow, h2 at d1 and a measure-capped lede, on the one shared type scale"},{"name":"ui/wire-figure","file":"src/components/ui/wire-figure.tsx","renders":"Renders canonical Wire Diagram JSON (src/assets/delivery-pipeline.wire.json) as a token-styled ladder: twelve node kinds, declared branches, tone as border weight rather than hue, and explicit edges drawn as labelled return lines"},{"name":"ui/log-filter","file":"src/components/ui/log-filter.tsx","renders":"Client-side tag filter over server-rendered log entries, with per-tag counts and a live-announced result line"},{"name":"ui/request-builder","file":"src/components/ui/request-builder.tsx","renders":"Assembles a real curl command from an endpoint's own parameters and hands it to the copy control; it never sends a request or invents a response"},{"name":"ui/mode-toggle","file":"src/components/ui/mode-toggle.tsx","renders":"Light/dark switch that toggles the nearest theme wrapper, persists standalone, and never overrules a mode the host has already set"},{"name":"ui/dialog","file":"src/components/ui/dialog.tsx","renders":"The modal panel a docs product borrows rather than owns: hairline card on the one shadow, header rule, scrolling body, footer band, three measures, and severity carried by a 2px ink rule instead of a colour this theme does not have"},{"name":"ui/command-palette","file":"src/components/ui/command-palette.tsx","renders":"Keyboard-first search over a curated forty-two-entry index: the platform modifier plus K opens it from any route, the results are a real listbox whose ends do not wrap, Enter opens the marked row and Escape returns focus to the chip that raised it"},{"name":"ui/tabs","file":"src/components/ui/tabs.tsx","renders":"One selection the whole SDK page follows, with the panels carrying the route's own anchor ids so a hash naming a language selects it"},{"name":"ui/copy-button","file":"src/components/ui/copy-button.tsx","renders":"The copy control on every code panel: a glyph swap for the confirmation, a refusal that stays until the reader tries again, a counted live region so a second refusal is heard, and focus returned after the browser's permission prompt"},{"name":"ui/popover","file":"src/components/ui/popover.tsx","renders":"The anchored non-modal surface behind the version list: it flips above its control when the viewport runs out, closes on Escape, on a press outside and on a Tab that leaves, and returns focus only when a key asked for it"},{"name":"ui/accordion-disclosure","file":"src/components/ui/accordion-disclosure.tsx","renders":"Native header and documentation-sidebar disclosures with Meridian recipes, plus Escape dismissal and focus return from the vendored React part"}],"tokens":{"--background":"#f3f7fe","--foreground":"#0f141c","--card":"#ffffff","--card-foreground":"#0f141c","--primary":"#1a47c7","--primary-hover":"#0b32b3","--primary-active":"#021b9e","--primary-foreground":"#ffffff","--secondary":"#e2eaf6","--secondary-foreground":"#232c3b","--muted":"#ebf0f8","--muted-foreground":"#58616f","--accent":"#8a5a0f","--accent-foreground":"#ffffff","--border":"#ccd4e2","--ring":"#1a47c7","--surface-tint":"#edf4fd","--shadow-color":"#0d1624","--scrim":"#0f141ca6","--mask-ink":"#0f141c30","--radius":"0.375rem","--text-d1":"1.5rem","--leading-d1":"var(--text-d1--line-height)","--tracking-d1":"var(--text-d1--letter-spacing)","--text-d1--line-height":"1.25","--text-d1--letter-spacing":"-0.01em","--text-d2":"1.875rem","--leading-d2":"var(--text-d2--line-height)","--tracking-d2":"var(--text-d2--letter-spacing)","--text-d2--line-height":"1.2","--text-d2--letter-spacing":"-0.01em","--text-d3":"clamp(1.875rem, 1.604rem + 1.156vw, 2.34375rem)","--leading-d3":"var(--text-d3--line-height)","--tracking-d3":"var(--text-d3--letter-spacing)","--text-d3--line-height":"1.15","--text-d3--letter-spacing":"-0.01em","--text-d4":"clamp(2.34375rem, 2.005rem + 1.44vw, 2.9296875rem)","--leading-d4":"var(--text-d4--line-height)","--tracking-d4":"var(--text-d4--letter-spacing)","--text-d4--line-height":"1.05","--text-d4--letter-spacing":"-0.025em","--text-lead":"1.125rem","--leading-lead":"var(--text-lead--line-height)","--tracking-lead":"0em","--text-lead--line-height":"1.6","--text-body":"1rem","--leading-body":"var(--text-body--line-height)","--tracking-body":"0em","--text-body--line-height":"1.55","--text-small":"0.875rem","--leading-small":"var(--text-small--line-height)","--tracking-small":"0em","--text-small--line-height":"1.45","--text-caption":"0.75rem","--leading-caption":"var(--text-caption--line-height)","--tracking-caption":"0em","--text-caption--line-height":"1.4","--text-label":"0.75rem","--leading-label":"var(--text-label--line-height)","--tracking-label":"var(--text-label--letter-spacing)","--text-label--line-height":"1.4","--text-label--letter-spacing":"0.08em","--text-read":"1rem","--leading-read":"var(--text-read--line-height)","--tracking-read":"0em","--text-read--line-height":"1.75","--text-scan":"1rem","--leading-scan":"var(--text-scan--line-height)","--tracking-scan":"0em","--text-scan--line-height":"1.75","--text-code":"0.75rem","--leading-code":"var(--text-code--line-height)","--tracking-code":"0em","--text-code--line-height":"1.6","--display-weight":"600","--font-text":"var(--font-source-sans), ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif","--font-sans":"var(--font-text)","--font-mono":"var(--font-source-code), ui-monospace, \"SFMono-Regular\", \"SF Mono\", Menlo, Consolas, \"Liberation Mono\", monospace"},"tokensDark":{"--background":"#0a0e15","--foreground":"#e5ecf7","--card":"#10161f","--card-foreground":"#e5ecf7","--primary":"#76a2fe","--primary-hover":"#658fe9","--primary-active":"#537cd5","--primary-foreground":"#060b14","--secondary":"#1a2331","--secondary-foreground":"#c5cedc","--muted":"#131a24","--muted-foreground":"#94a1b3","--accent":"#ecb460","--accent-foreground":"#10161f","--border":"#2b3646","--ring":"#76a2fe","--surface-tint":"#1b2026","--shadow-color":"#010611","--scrim":"#060b14cc","--mask-ink":"#e5ecf729","--radius":"0.375rem","--display-weight":"500","--text-d1":"1.5rem","--leading-d1":"var(--text-d1--line-height)","--tracking-d1":"var(--text-d1--letter-spacing)","--text-d1--line-height":"1.25","--text-d1--letter-spacing":"-0.01em","--text-d2":"1.875rem","--leading-d2":"var(--text-d2--line-height)","--tracking-d2":"var(--text-d2--letter-spacing)","--text-d2--line-height":"1.2","--text-d2--letter-spacing":"-0.01em","--text-d3":"clamp(1.875rem, 1.604rem + 1.156vw, 2.34375rem)","--leading-d3":"var(--text-d3--line-height)","--tracking-d3":"var(--text-d3--letter-spacing)","--text-d3--line-height":"1.15","--text-d3--letter-spacing":"-0.01em","--text-d4":"clamp(2.34375rem, 2.005rem + 1.44vw, 2.9296875rem)","--leading-d4":"var(--text-d4--line-height)","--tracking-d4":"var(--text-d4--letter-spacing)","--text-d4--line-height":"1.05","--text-d4--letter-spacing":"-0.025em","--text-lead":"1.125rem","--leading-lead":"var(--text-lead--line-height)","--tracking-lead":"0em","--text-lead--line-height":"1.6","--text-body":"1rem","--leading-body":"var(--text-body--line-height)","--tracking-body":"0em","--text-body--line-height":"1.55","--text-small":"0.875rem","--leading-small":"var(--text-small--line-height)","--tracking-small":"0em","--text-small--line-height":"1.45","--text-caption":"0.75rem","--leading-caption":"var(--text-caption--line-height)","--tracking-caption":"0em","--text-caption--line-height":"1.4","--text-label":"0.75rem","--leading-label":"var(--text-label--line-height)","--tracking-label":"var(--text-label--letter-spacing)","--text-label--line-height":"1.4","--text-label--letter-spacing":"0.08em","--text-read":"1rem","--leading-read":"var(--text-read--line-height)","--tracking-read":"0em","--text-read--line-height":"1.75","--text-scan":"1rem","--leading-scan":"var(--text-scan--line-height)","--tracking-scan":"0em","--text-scan--line-height":"1.75","--text-code":"0.75rem","--leading-code":"var(--text-code--line-height)","--tracking-code":"0em","--text-code--line-height":"1.6","--font-text":"var(--font-source-sans), ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif","--font-sans":"var(--font-text)","--font-mono":"var(--font-source-code), ui-monospace, \"SFMono-Regular\", \"SF Mono\", Menlo, Consolas, \"Liberation Mono\", monospace"},"compatibility":{"next":">=15","react":">=19","tailwind":">=4"},"dependencies":["lucide-react"],"editions":{"react":{"source":"src","runtime":"react"},"html":{"source":"html/src","output":"html/dist","engine":"nunjucks","runtime":"vanilla","buildRequired":false}},"ui_library":{"version":"1.5.2","files":["html/src/js/_tt/accordion-disclosure.js","html/src/js/_tt/announce.js","html/src/js/_tt/copy-button.js","html/src/js/_tt/mode.js","html/src/js/_tt/roving.js","html/src/js/_tt/tabs.js","src/components/ui/_tt/accordion-disclosure.axes.ts","src/components/ui/_tt/accordion-disclosure.fixtures.ts","src/components/ui/_tt/accordion-disclosure.tsx","src/components/ui/_tt/active-descendant.ts","src/components/ui/_tt/anchor.ts","src/components/ui/_tt/announce.ts","src/components/ui/_tt/command-palette.axes.ts","src/components/ui/_tt/command-palette.fixtures.ts","src/components/ui/_tt/command-palette.tsx","src/components/ui/_tt/copy-button.axes.ts","src/components/ui/_tt/copy-button.fixtures.ts","src/components/ui/_tt/copy-button.tsx","src/components/ui/_tt/dialog.axes.ts","src/components/ui/_tt/dialog.fixtures.ts","src/components/ui/_tt/dialog.tsx","src/components/ui/_tt/focusables.ts","src/components/ui/_tt/host.ts","src/components/ui/_tt/ids.ts","src/components/ui/_tt/layer.ts","src/components/ui/_tt/layout-effect.ts","src/components/ui/_tt/popover.axes.ts","src/components/ui/_tt/popover.fixtures.ts","src/components/ui/_tt/popover.tsx","src/components/ui/_tt/presence.ts","src/components/ui/_tt/recipe.ts","src/components/ui/_tt/reduced-motion.ts","src/components/ui/_tt/roving.ts","src/components/ui/_tt/tabs.axes.ts","src/components/ui/_tt/tabs.fixtures.ts","src/components/ui/_tt/tabs.tsx"]},"license":"standard","design":{"typefaces":{"text":"Source Sans 3","mono":"Source Code Pro"},"typeRatio":1.25,"surface_kind":"document","built_against":"2026-08-28","levers":{"theme":"paper","density":"comfortable","accent_mode":"duotone","motion":"still","borders":"hairline","radius":"small","texture":"grain","shadow":"none"},"icons":{"set":"lucide","stroke":2,"ladder":["size-3.5","size-4","size-5"],"contexts":{"nav":"glyph","panel_header":"mark","fact_row":"none","feature_grid":"none"}},"disclosure":{"helper_line":"one-clause","sentence":"hint","paragraph":"details","parallel_views":"tabs","secondary_object":"drawer"},"colour_budget":{"brand_max_pct":10,"concentration_pct":70,"regions":[]}}}