-
-
-
+
+
+
+
+
+
- On this page
- {items.map((item) => (
-
- {item.title}
-
- ))}
+
);
}
diff --git a/content/docs/(documentation)/apps/introduction.mdx b/content/docs/(documentation)/apps/introduction.mdx
index 264d8696e..a99c5ecf6 100644
--- a/content/docs/(documentation)/apps/introduction.mdx
+++ b/content/docs/(documentation)/apps/introduction.mdx
@@ -9,77 +9,41 @@ This section walks you through a catalog of dedicated extensions that enrich you
To use standard APIs and other data shippers like the Elasticsearch Bulk API, Fluent Bit log processor or Fluentd log collector, go to [Send data](/send-data/methods) instead.
-
-
+
+
A pre-configured dashboard for logs sent from AWS Lambda.
-
-
- A configuration path for sending data to Axiom via AWS PrivateLink.
-
-
+
+
+ A configuration path for sending data to Axiom via AWS PrivateLink.
+
+
A pre-configured dashboard for logs sent from Cloudflare Workers.
-
-
+
+
An integrated workflow for sending data from Cloudflare Logpush to Axiom.
-
-
+
+
Stream function executions and console logs from your Convex deployment to Axiom.
-
-
+
+
A data source plugin for visualizing data stored in Axiom in Grafana.
-
-
+
+
A recommended pathway to visualize data stored in Axiom in Hex.
-
-
- An integreated workflow for sending data from Netlify to Axiom.
-
-
+
+
+ An integrated workflow for sending data from Netlify to Axiom.
+
+
A setup that allows you to stream your Supabase project's raw log events directly to Axiom.
-
-
+
+
A pre-configured dashboard for audit and network flow logs sent from Tailscale.
-
-
+
+
A walkthrough on configuring resources in Axiom using Terraform.
-
-
+
+
A pre-configured dashboard for logs sent from Vercel.
-
-
\ No newline at end of file
+
+
\ No newline at end of file
diff --git a/content/docs/(documentation)/send-data/reference-architectures.mdx b/content/docs/(documentation)/send-data/reference-architectures.mdx
index a4f6768c2..ff18eb1af 100644
--- a/content/docs/(documentation)/send-data/reference-architectures.mdx
+++ b/content/docs/(documentation)/send-data/reference-architectures.mdx
@@ -21,8 +21,6 @@ These patterns are designed to provide:
While these patterns are recommended for large-scale environments, Axiom has many other simpler [methods](/send-data/methods) available to send data.
----
-
## The core patterns
There are two primary deployment patterns for a collector: the Agent model and the Aggregator model. Most large organizations use a hybrid of both.
@@ -80,8 +78,6 @@ flowchart LR
Pool --> Axiom[(Axiom)]
```
----
-
## Tool recommendations
Both the OpenTelemetry Collector and Vector are excellent choices that can be deployed in either an Agent or Aggregator pattern. The best choice depends on your team’s existing ecosystem and primary use case.
@@ -186,8 +182,6 @@ Replace `SINK_ID` with the sink ID.
----
-
## Summary
| Aspect | OpenTelemetry Collector | Vector |
diff --git a/docs.json b/docs.json
index b0ee978ac..3838c2073 100644
--- a/docs.json
+++ b/docs.json
@@ -8,7 +8,7 @@
"light": "#98A0B1",
"dark": "#104DEB"
},
- "favicon": "/doc-assets/logo/favicon.svg",
+ "favicon": "/favicon.ico",
"navigation": {
"tabs": [
{
diff --git a/lib/code-theme.ts b/lib/code-theme.ts
new file mode 100644
index 000000000..e4a0fb386
--- /dev/null
+++ b/lib/code-theme.ts
@@ -0,0 +1,245 @@
+import type { ThemeRegistration } from 'shiki';
+
+/**
+ * `axiom-dark` — the branded Shiki theme, copied from www/src/lib/code-theme.ts.
+ * Grayscale base with every accent drawn from the brand-orange family, so code
+ * blocks sit on-palette instead of the blue/purple of stock themes. The editor
+ * background is irrelevant (the docs strip it); tune tokens here.
+ */
+export const axiomCodeDark: ThemeRegistration = {
+ name: 'axiom-dark',
+ type: 'dark',
+ colors: {
+ 'editor.background': '#0a0a0a',
+ 'editor.foreground': '#b8b8b8',
+ },
+ settings: [
+ // Default token color (anything unmatched).
+ { settings: { foreground: '#b8b8b8' } },
+ {
+ scope: ['comment', 'punctuation.definition.comment'],
+ settings: { foreground: '#6f6f6f', fontStyle: 'italic' },
+ },
+ {
+ scope: [
+ 'string',
+ 'string.quoted',
+ 'punctuation.definition.string',
+ 'string.regexp',
+ 'markup.inline.raw',
+ ],
+ settings: { foreground: '#ffc799' },
+ },
+ {
+ scope: [
+ 'constant.numeric',
+ 'constant.language',
+ 'constant.character',
+ 'constant.other',
+ 'keyword.other.unit',
+ ],
+ settings: { foreground: '#ffb27d' },
+ },
+ {
+ scope: [
+ 'keyword',
+ 'keyword.control',
+ 'keyword.operator.new',
+ 'keyword.operator.expression',
+ 'storage',
+ 'storage.type',
+ 'storage.modifier',
+ ],
+ settings: { foreground: '#ff8a4c' },
+ },
+ {
+ scope: [
+ 'entity.name.function',
+ 'support.function',
+ 'meta.function-call entity.name.function',
+ 'variable.function',
+ ],
+ settings: { foreground: '#ffad66' },
+ },
+ {
+ scope: [
+ 'entity.name.type',
+ 'entity.name.class',
+ 'entity.other.inherited-class',
+ 'support.type',
+ 'support.class',
+ 'entity.name.namespace',
+ ],
+ settings: { foreground: '#e6875a' },
+ },
+ {
+ // JSON keys / object properties / HTML attributes — quiet, near-white,
+ // so string values carry the orange. Unlike www, `entity.name.tag` sits
+ // here too: in the YAML/TOML grammars that dominate docs config examples
+ // it scopes the keys, and orange keys turned whole files orange.
+ scope: [
+ 'support.type.property-name',
+ 'variable.other.property',
+ 'variable.other.object.property',
+ 'entity.other.attribute-name',
+ 'entity.name.tag',
+ 'meta.object-literal.key',
+ ],
+ settings: { foreground: '#dedede' },
+ },
+ {
+ scope: ['variable', 'variable.parameter', 'variable.other'],
+ settings: { foreground: '#cccccc' },
+ },
+ {
+ scope: ['keyword.operator', 'punctuation', 'meta.brace'],
+ settings: { foreground: '#8f8f8f' },
+ },
+ {
+ // Diffs — keep meaning, but warm.
+ scope: ['markup.inserted'],
+ settings: { foreground: '#ffc799' },
+ },
+ {
+ scope: ['markup.deleted'],
+ settings: { foreground: '#ff6b4c' },
+ },
+ {
+ scope: ['markup.changed'],
+ settings: { foreground: '#ffad66' },
+ },
+ {
+ scope: ['markup.heading', 'markup.bold'],
+ settings: { foreground: '#ffffff', fontStyle: 'bold' },
+ },
+ {
+ scope: ['markup.italic'],
+ settings: { fontStyle: 'italic' },
+ },
+ {
+ // Shell prompts / built-ins lean on the keyword orange.
+ scope: ['support.constant', 'constant.other.symbol'],
+ settings: { foreground: '#ffb27d' },
+ },
+ ],
+};
+
+/**
+ * `axiom-light` — light-mode counterpart the docs need (www is dark-only).
+ * Scope-for-scope mirror of `axiom-dark` with the orange ramp darkened until
+ * every token clears AA (>=4.5:1) on the light code surface; relative
+ * intensity is preserved (keywords most vivid, strings softest).
+ */
+export const axiomCodeLight: ThemeRegistration = {
+ name: 'axiom-light',
+ type: 'light',
+ colors: {
+ 'editor.background': '#fafafa',
+ 'editor.foreground': '#404040',
+ },
+ settings: [
+ { settings: { foreground: '#404040' } },
+ {
+ scope: ['comment', 'punctuation.definition.comment'],
+ settings: { foreground: '#737373', fontStyle: 'italic' },
+ },
+ {
+ scope: [
+ 'string',
+ 'string.quoted',
+ 'punctuation.definition.string',
+ 'string.regexp',
+ 'markup.inline.raw',
+ ],
+ settings: { foreground: '#8f530f' },
+ },
+ {
+ scope: [
+ 'constant.numeric',
+ 'constant.language',
+ 'constant.character',
+ 'constant.other',
+ 'keyword.other.unit',
+ ],
+ settings: { foreground: '#b45309' },
+ },
+ {
+ scope: [
+ 'keyword',
+ 'keyword.control',
+ 'keyword.operator.new',
+ 'keyword.operator.expression',
+ 'storage',
+ 'storage.type',
+ 'storage.modifier',
+ ],
+ settings: { foreground: '#c2410c' },
+ },
+ {
+ scope: [
+ 'entity.name.function',
+ 'support.function',
+ 'meta.function-call entity.name.function',
+ 'variable.function',
+ ],
+ settings: { foreground: '#b8461d' },
+ },
+ {
+ scope: [
+ 'entity.name.type',
+ 'entity.name.class',
+ 'entity.other.inherited-class',
+ 'support.type',
+ 'support.class',
+ 'entity.name.namespace',
+ ],
+ settings: { foreground: '#9a3412' },
+ },
+ {
+ // JSON keys / object properties / HTML attributes — quiet, near-black,
+ // so string values carry the orange. `entity.name.tag` deliberately sits
+ // here (see axiomCodeDark).
+ scope: [
+ 'support.type.property-name',
+ 'variable.other.property',
+ 'variable.other.object.property',
+ 'entity.other.attribute-name',
+ 'entity.name.tag',
+ 'meta.object-literal.key',
+ ],
+ settings: { foreground: '#262626' },
+ },
+ {
+ scope: ['variable', 'variable.parameter', 'variable.other'],
+ settings: { foreground: '#525252' },
+ },
+ {
+ scope: ['keyword.operator', 'punctuation', 'meta.brace'],
+ settings: { foreground: '#737373' },
+ },
+ {
+ scope: ['markup.inserted'],
+ settings: { foreground: '#8f530f' },
+ },
+ {
+ scope: ['markup.deleted'],
+ settings: { foreground: '#b91c1c' },
+ },
+ {
+ scope: ['markup.changed'],
+ settings: { foreground: '#b45309' },
+ },
+ {
+ scope: ['markup.heading', 'markup.bold'],
+ settings: { foreground: '#0a0a0a', fontStyle: 'bold' },
+ },
+ {
+ scope: ['markup.italic'],
+ settings: { fontStyle: 'italic' },
+ },
+ {
+ scope: ['support.constant', 'constant.other.symbol'],
+ settings: { foreground: '#b45309' },
+ },
+ ],
+};
diff --git a/lib/doc-icons.ts b/lib/doc-icons.ts
index da621d1fe..e6d92be9e 100644
--- a/lib/doc-icons.ts
+++ b/lib/doc-icons.ts
@@ -23,6 +23,7 @@ export const FA_TO_LUCIDE = {
'ellipsis-vertical': 'EllipsisVertical',
function: 'SquareFunction',
gear: 'Settings',
+ hexagon: 'Hexagon',
house: 'House',
'pen-to-square': 'SquarePen',
pencil: 'Pencil',
diff --git a/next-env.d.ts b/next-env.d.ts
index c4b7818fb..9edff1c7c 100644
--- a/next-env.d.ts
+++ b/next-env.d.ts
@@ -1,6 +1,6 @@
///
///
-import "./.next/dev/types/routes.d.ts";
+import "./.next/types/routes.d.ts";
// NOTE: This file should not be edited
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
diff --git a/package.json b/package.json
index aa663f685..035ff43a6 100644
--- a/package.json
+++ b/package.json
@@ -38,6 +38,7 @@
"fumadocs-ui": "16.11.5",
"hast-util-to-jsx-runtime": "2.3.6",
"lucide-react": "1.24.0",
+ "mermaid": "^11.16.0",
"nanoid": "^6.0.0",
"next": "16.2.11",
"next-themes": "0.4.6",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index ee83f7241..36da4f1f8 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -65,6 +65,9 @@ importers:
lucide-react:
specifier: 1.24.0
version: 1.24.0(react@19.2.7)
+ mermaid:
+ specifier: ^11.16.0
+ version: 11.16.0
nanoid:
specifier: ^6.0.0
version: 6.0.0
@@ -11435,7 +11438,7 @@ snapshots:
dependencies:
lightningcss: 1.32.0
picomatch: 4.0.5
- postcss: 8.5.19
+ postcss: 8.5.18
rolldown: 1.1.5
tinyglobby: 0.2.17
optionalDependencies:
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 000000000..4f0516f7c
Binary files /dev/null and b/public/favicon.ico differ
diff --git a/source.config.ts b/source.config.ts
index 95a9a0aa5..e08864bd0 100644
--- a/source.config.ts
+++ b/source.config.ts
@@ -1,6 +1,8 @@
+import { rehypeCodeDefaultOptions, remarkMdxMermaid } from 'fumadocs-core/mdx-plugins';
import { pageSchema } from 'fumadocs-core/source/schema';
import { defineConfig, defineDocs } from 'fumadocs-mdx/config';
import { z } from 'zod';
+import { axiomCodeDark, axiomCodeLight } from './lib/code-theme';
export const docs = defineDocs({
dir: 'content/docs',
@@ -28,5 +30,15 @@ export default defineConfig({
// components prop page.tsx passes, so they need the provider to pick up the
// shared pre/notice/link mappings from mdx-components.tsx.
providerImportSource: '@/mdx-components',
+ // ```mermaid fences become
(components/mermaid.tsx)
+ // instead of Shiki code blocks.
+ remarkPlugins: [remarkMdxMermaid],
+ // Branded Shiki themes from www (grayscale + brand-orange accents) in
+ // place of the stock github pair; defaults are spread so the notation
+ // transformers and meta parsing stay intact.
+ rehypeCodeOptions: {
+ ...rehypeCodeDefaultOptions,
+ themes: { light: axiomCodeLight, dark: axiomCodeDark },
+ },
},
});
diff --git a/styles/tokens.css b/styles/tokens.css
index 0c0e3f0e2..700776dba 100644
--- a/styles/tokens.css
+++ b/styles/tokens.css
@@ -6,81 +6,433 @@
* Add `data-theme="light"` on or any ancestor to flip to light.
* ───────────────────────────────────────────────────────────────── */
-/* Fonts are self-hosted with next/font/local in app/layout.tsx. */
+/* Fonts load in app/layout.tsx: Geist via next/font/google, Berkeley Mono
+ via next/font/local (full file — its EULA prohibits subsetting). */
/* ╔══════════════════════════════════════════════════════════════╗
║ PRIMITIVES ║
╚══════════════════════════════════════════════════════════════╝ */
:root {
- /* Gray scale — Tailwind v4 neutral */
- --gray-50: #fafafa;
- --gray-100: #f5f5f5;
- --gray-200: #e5e5e5;
- --gray-300: #d4d4d4;
- --gray-400: #a3a3a3;
- --gray-450: #858585;
- --gray-500: #737373;
- --gray-600: #525252;
- --gray-700: #404040;
- --gray-800: #262626;
- --gray-850: #1e1e1e;
- --gray-900: #171717;
- --gray-950: #0a0a0a;
- --white: #ffffff;
- --black: #000000;
-
- /* Black alpha (overlay on light) */
- --black-a1: rgba(0,0,0,0.01);
- --black-a2: rgba(0,0,0,0.03);
- --black-a3: rgba(0,0,0,0.05);
- --black-a4: rgba(0,0,0,0.07);
- --black-a5: rgba(0,0,0,0.10);
- --black-a6: rgba(0,0,0,0.15);
- --black-a7: rgba(0,0,0,0.20);
- --black-a8: rgba(0,0,0,0.30);
- --black-a9: rgba(0,0,0,0.40);
- --black-a10: rgba(0,0,0,0.55);
- --black-a11: rgba(0,0,0,0.70);
- --black-a12: rgba(0,0,0,0.90);
-
- /* White alpha (overlay on dark) */
- --white-a1: rgba(255,255,255,0.01);
- --white-a2: rgba(255,255,255,0.03);
- --white-a3: rgba(255,255,255,0.04);
- --white-a4: rgba(255,255,255,0.07);
- --white-a5: rgba(255,255,255,0.10);
- --white-a6: rgba(255,255,255,0.15);
- --white-a7: rgba(255,255,255,0.20);
- --white-a8: rgba(255,255,255,0.30);
- --white-a9: rgba(255,255,255,0.40);
- --white-a10: rgba(255,255,255,0.55);
- --white-a11: rgba(255,255,255,0.70);
- --white-a12: rgba(255,255,255,0.90);
-
- /* Status (primitives — same in both themes) */
- --red-300: #fca5a5;
- --red-400: #f87171; /* destructive default */
- --red-500: #ef4444;
- --red-600: #dc2626;
- --red-700: #b91c1c;
- --red-800: #991b1b;
- --red-bg: #fef2f2;
-
- --amber-400: #fbbf24;
- --amber-500: #f59e0b;
-
- --orange-500: #da5c2b; /* Axiom brand primary */
-
- --green-400: #34d399;
- --green-500: #10b981;
-
- --blue-500: #3b82f6;
- --blue-600: #2563eb; /* selected / toggled */
- --blue-700: #1d4ed8;
-
- --violet-400: #a78bfa;
- --violet-500: #9747ff; /* Axiom accent (purple) */
- --violet-600: #8b5cf6;
+ /* Gray scale — Tailwind v4 neutral */
+ --gray-50: #fafafa;
+ --gray-100: #f5f5f5;
+ --gray-200: #e5e5e5;
+ --gray-300: #d4d4d4;
+ --gray-400: #a3a3a3;
+ --gray-450: #858585;
+ --gray-500: #737373;
+ --gray-600: #525252;
+ --gray-700: #404040;
+ --gray-800: #262626;
+ --gray-850: #1e1e1e;
+ --gray-900: #171717;
+ --gray-950: #0a0a0a;
+ --white: #ffffff;
+ --black: #000000;
+
+ /* Black alpha (overlay on light) */
+ --black-a1: rgba(0, 0, 0, 0.01);
+ --black-a2: rgba(0, 0, 0, 0.03);
+ --black-a3: rgba(0, 0, 0, 0.05);
+ --black-a4: rgba(0, 0, 0, 0.07);
+ --black-a5: rgba(0, 0, 0, 0.1);
+ --black-a6: rgba(0, 0, 0, 0.15);
+ --black-a7: rgba(0, 0, 0, 0.2);
+ --black-a8: rgba(0, 0, 0, 0.3);
+ --black-a9: rgba(0, 0, 0, 0.4);
+ --black-a10: rgba(0, 0, 0, 0.55);
+ --black-a11: rgba(0, 0, 0, 0.7);
+ --black-a12: rgba(0, 0, 0, 0.9);
+
+ /* White alpha (overlay on dark) */
+ --white-a1: rgba(255, 255, 255, 0.01);
+ --white-a2: rgba(255, 255, 255, 0.03);
+ --white-a3: rgba(255, 255, 255, 0.04);
+ --white-a4: rgba(255, 255, 255, 0.07);
+ --white-a5: rgba(255, 255, 255, 0.1);
+ --white-a6: rgba(255, 255, 255, 0.15);
+ --white-a7: rgba(255, 255, 255, 0.2);
+ --white-a8: rgba(255, 255, 255, 0.3);
+ --white-a9: rgba(255, 255, 255, 0.4);
+ --white-a10: rgba(255, 255, 255, 0.55);
+ --white-a11: rgba(255, 255, 255, 0.7);
+ --white-a12: rgba(255, 255, 255, 0.9);
+
+ /* Status (primitives — same in both themes) */
+ --red-300: #fca5a5;
+ --red-400: #f87171; /* destructive default */
+ --red-500: #ef4444;
+ --red-600: #dc2626;
+ --red-700: #b91c1c;
+ --red-800: #991b1b;
+ --red-bg: #fef2f2;
+
+ --amber-400: #fbbf24;
+ --amber-500: #f59e0b;
+
+ --orange-500: #da5c2b; /* Axiom brand primary */
+
+ --green-400: #34d399;
+ --green-500: #10b981;
+
+ --blue-500: #3b82f6;
+ --blue-600: #2563eb; /* selected / toggled */
+ --blue-700: #1d4ed8;
+
+ --violet-400: #a78bfa;
+ --violet-500: #9747ff; /* Axiom accent (purple) */
+ --violet-600: #8b5cf6;
+}
+
+/* ╔══════════════════════════════════════════════════════════════╗
+ ║ ADAPTIVE COLOR SCALES — ported from www (Radix-style 1–12) ║
+ ╚══════════════════════════════════════════════════════════════╝
+ Same values as www/src/app/globals.css, restructured for this
+ repo's theming: www is light-default with a `.dark` override;
+ here dark is the default and light is `[data-theme="light"]`. */
+:root,
+:root[data-theme="dark"] {
+ /* Gray */
+ --gray-1: #0c0c0c;
+ --gray-2: #111111;
+ --gray-3: #222222;
+ --gray-4: #2a2a2a;
+ --gray-5: #313131;
+ --gray-6: #3a3a3a;
+ --gray-7: #484848;
+ --gray-8: #606060;
+ --gray-9: #6e6e6e;
+ --gray-10: #7b7b7b;
+ --gray-11: #b4b4b4;
+ --gray-12: #eeeeee;
+ /* Red */
+ --red-1: #191111;
+ --red-2: #201314;
+ --red-3: #3b1219;
+ --red-4: #500f1c;
+ --red-5: #611623;
+ --red-6: #72232d;
+ --red-7: #8c333a;
+ --red-8: #b54548;
+ --red-9: #e5484d;
+ --red-10: #ec5d5e;
+ --red-11: #ff9592;
+ --red-12: #ffd1d9;
+ /* Orange */
+ --orange-1: #17120e;
+ --orange-2: #26140d;
+ --orange-3: #331e0b;
+ --orange-4: #462100;
+ --orange-5: #562800;
+ --orange-6: #66350c;
+ --orange-7: #7e451d;
+ --orange-8: #a35829;
+ --orange-9: #f76b15;
+ --orange-10: #fa7440;
+ --orange-11: #ffa057;
+ --orange-12: #ffe0c2;
+ /* Yellow */
+ --yellow-1: #14120b;
+ --yellow-2: #1b180f;
+ --yellow-3: #2d2305;
+ --yellow-4: #362b00;
+ --yellow-5: #433500;
+ --yellow-6: #524202;
+ --yellow-7: #665417;
+ --yellow-8: #836a21;
+ --yellow-9: #ffe629;
+ --yellow-10: #ffff57;
+ --yellow-11: #f5e147;
+ --yellow-12: #f6eeb4;
+ /* Green */
+ --green-1: #0e1512;
+ --green-2: #121b17;
+ --green-3: #132d21;
+ --green-4: #113b29;
+ --green-5: #174933;
+ --green-6: #20573e;
+ --green-7: #28684a;
+ --green-8: #2f7c57;
+ --green-9: #30a46c;
+ --green-10: #33b074;
+ --green-11: #11b981;
+ --green-12: #b1f1cb;
+ /* Blue */
+ --blue-1: #0d1520;
+ --blue-2: #111927;
+ --blue-3: #0d2847;
+ --blue-4: #003362;
+ --blue-5: #004074;
+ --blue-6: #104d87;
+ --blue-7: #205d9e;
+ --blue-8: #2870bd;
+ --blue-9: #0090ff;
+ --blue-10: #3b9eff;
+ --blue-11: #70b8ff;
+ --blue-12: #c2e6ff;
+ /* Purple */
+ --purple-1: #18111b;
+ --purple-2: #1e1523;
+ --purple-3: #301c3b;
+ --purple-4: #3d224e;
+ --purple-5: #48295c;
+ --purple-6: #54346b;
+ --purple-7: #664282;
+ --purple-8: #8457aa;
+ --purple-9: #8e4ec6;
+ --purple-10: #9a5cd0;
+ --purple-11: #d19dff;
+ --purple-12: #ecd9fa;
+ /* Tomato */
+ --tomato-1: #181111;
+ --tomato-2: #1f1513;
+ --tomato-3: #391714;
+ --tomato-4: #4e1511;
+ --tomato-5: #5e1c16;
+ --tomato-6: #6e2920;
+ --tomato-7: #853a2d;
+ --tomato-8: #ac4d39;
+ --tomato-9: #e54d2e;
+ --tomato-10: #ec6142;
+ --tomato-11: #ff977d;
+ --tomato-12: #fbd3cb;
+ /* Amber */
+ --amber-1: #16120c;
+ --amber-2: #1d180f;
+ --amber-3: #302008;
+ --amber-4: #3f2700;
+ --amber-5: #4d3000;
+ --amber-6: #5c3d05;
+ --amber-7: #714f19;
+ --amber-8: #8f6424;
+ --amber-9: #ffc53d;
+ --amber-10: #ffd60a;
+ --amber-11: #ffca16;
+ --amber-12: #ffe7b3;
+ /* Lime */
+ --lime-1: #11130c;
+ --lime-2: #151a10;
+ --lime-3: #1f2917;
+ --lime-4: #29371d;
+ --lime-5: #334423;
+ --lime-6: #3d522a;
+ --lime-7: #496231;
+ --lime-8: #577538;
+ --lime-9: #bdee63;
+ --lime-10: #d4ff70;
+ --lime-11: #bde56c;
+ --lime-12: #e3f7ba;
+ /* Teal */
+ --teal-1: #0d1514;
+ --teal-2: #111c1b;
+ --teal-3: #0d2d2a;
+ --teal-4: #023b37;
+ --teal-5: #084843;
+ --teal-6: #145750;
+ --teal-7: #1c6961;
+ --teal-8: #207e73;
+ --teal-9: #12a594;
+ --teal-10: #0eb39e;
+ --teal-11: #0bd8b6;
+ --teal-12: #adf0dd;
+ /* Iris */
+ --iris-1: #13131e;
+ --iris-2: #171625;
+ --iris-3: #202248;
+ --iris-4: #262a65;
+ --iris-5: #303374;
+ --iris-6: #3d3e82;
+ --iris-7: #4a4a95;
+ --iris-8: #5958b1;
+ --iris-9: #5b5bd6;
+ --iris-10: #6e6ade;
+ --iris-11: #b1a9ff;
+ --iris-12: #e0dffe;
+ /* Pink */
+ --pink-1: #191117;
+ --pink-2: #21121d;
+ --pink-3: #37172f;
+ --pink-4: #4b143d;
+ --pink-5: #591c47;
+ --pink-6: #692955;
+ --pink-7: #833869;
+ --pink-8: #a84885;
+ --pink-9: #d6409f;
+ --pink-10: #de51a8;
+ --pink-11: #ff8dcc;
+ --pink-12: #fdd1ea;
+}
+
+:root[data-theme="light"] {
+ /* Gray */
+ --gray-1: #fcfcfc;
+ --gray-2: #f9f9f9;
+ --gray-3: #f0f0f0;
+ --gray-4: #e8e8e8;
+ --gray-5: #e0e0e0;
+ --gray-6: #d9d9d9;
+ --gray-7: #cecece;
+ --gray-8: #bbbbbb;
+ --gray-9: #8d8d8d;
+ --gray-10: #838383;
+ --gray-11: #646464;
+ --gray-12: #202020;
+ /* Red */
+ --red-1: #fffcfc;
+ --red-2: #fff7f7;
+ --red-3: #feebec;
+ --red-4: #ffdbdc;
+ --red-5: #ffcdce;
+ --red-6: #fdbdbe;
+ --red-7: #f4a9aa;
+ --red-8: #eb8e90;
+ --red-9: #e5484d;
+ --red-10: #dc3e42;
+ --red-11: #ce2c31;
+ --red-12: #641723;
+ /* Orange */
+ --orange-1: #fefcfb;
+ --orange-2: #fff7ed;
+ --orange-3: #ffefd6;
+ --orange-4: #ffdfb5;
+ --orange-5: #ffd19a;
+ --orange-6: #ffc182;
+ --orange-7: #f5ae73;
+ --orange-8: #ec9455;
+ --orange-9: #f76b15;
+ --orange-10: #fa7440;
+ --orange-11: #cc4e00;
+ --orange-12: #582d1d;
+ /* Yellow */
+ --yellow-1: #fdfdf9;
+ --yellow-2: #fefce9;
+ --yellow-3: #fffab8;
+ --yellow-4: #fff394;
+ --yellow-5: #ffe770;
+ --yellow-6: #f3d768;
+ --yellow-7: #e4c767;
+ --yellow-8: #d5ae39;
+ --yellow-9: #ffe629;
+ --yellow-10: #ffdc00;
+ --yellow-11: #9e6c00;
+ --yellow-12: #473b1f;
+ /* Green */
+ --green-1: #fbfefc;
+ --green-2: #f4fbf6;
+ --green-3: #e6f6eb;
+ --green-4: #d6f1df;
+ --green-5: #c4e8d1;
+ --green-6: #adddc0;
+ --green-7: #8eceaa;
+ --green-8: #5bb98b;
+ --green-9: #30a46c;
+ --green-10: #2b9a66;
+ --green-11: #218358;
+ --green-12: #193b2d;
+ /* Blue */
+ --blue-1: #fbfdff;
+ --blue-2: #f4faff;
+ --blue-3: #e6f4fe;
+ --blue-4: #d5efff;
+ --blue-5: #c2e5ff;
+ --blue-6: #acd8fc;
+ --blue-7: #8ec8f6;
+ --blue-8: #5eb1ef;
+ --blue-9: #0090ff;
+ --blue-10: #0588f0;
+ --blue-11: #0d74ce;
+ --blue-12: #113264;
+ /* Purple */
+ --purple-1: #fefcfe;
+ --purple-2: #fbf7fe;
+ --purple-3: #f7edfe;
+ --purple-4: #f2e2fc;
+ --purple-5: #ead5f9;
+ --purple-6: #e0c4f4;
+ --purple-7: #d1afec;
+ --purple-8: #be93e4;
+ --purple-9: #8e4ec6;
+ --purple-10: #8347b9;
+ --purple-11: #8145b5;
+ --purple-12: #402060;
+ /* Tomato */
+ --tomato-1: #fffcfc;
+ --tomato-2: #fff8f7;
+ --tomato-3: #feebe7;
+ --tomato-4: #ffdcd3;
+ --tomato-5: #ffcdc2;
+ --tomato-6: #fdbdaf;
+ --tomato-7: #f5a898;
+ --tomato-8: #ec8e7b;
+ --tomato-9: #e54d2e;
+ --tomato-10: #dd4425;
+ --tomato-11: #d13415;
+ --tomato-12: #5c271f;
+ /* Amber */
+ --amber-1: #fefdfb;
+ --amber-2: #fefbe9;
+ --amber-3: #fff7c2;
+ --amber-4: #ffee9c;
+ --amber-5: #fbe577;
+ --amber-6: #f3d673;
+ --amber-7: #e9c162;
+ --amber-8: #e2a336;
+ --amber-9: #ffc53d;
+ --amber-10: #ffba18;
+ --amber-11: #ab6400;
+ --amber-12: #4f3422;
+ /* Lime */
+ --lime-1: #fcfdfa;
+ --lime-2: #f8faf3;
+ --lime-3: #eef6d6;
+ --lime-4: #e2f0bd;
+ --lime-5: #d3e7a6;
+ --lime-6: #c2da91;
+ --lime-7: #abc978;
+ --lime-8: #8db654;
+ --lime-9: #bdee63;
+ --lime-10: #b0e64c;
+ --lime-11: #5c7c2f;
+ --lime-12: #37401c;
+ /* Teal */
+ --teal-1: #fafefd;
+ --teal-2: #f3fbf9;
+ --teal-3: #e0f8f3;
+ --teal-4: #ccf3ea;
+ --teal-5: #b8eae0;
+ --teal-6: #a1ded2;
+ --teal-7: #83cdc1;
+ --teal-8: #53b9ab;
+ --teal-9: #12a594;
+ --teal-10: #0d9b8a;
+ --teal-11: #008573;
+ --teal-12: #0d3d38;
+ /* Iris */
+ --iris-1: #fdfdff;
+ --iris-2: #f8f8ff;
+ --iris-3: #f0f1fe;
+ --iris-4: #e6e7ff;
+ --iris-5: #dadcff;
+ --iris-6: #cbcdff;
+ --iris-7: #b8baf8;
+ --iris-8: #9b9ef0;
+ --iris-9: #5b5bd6;
+ --iris-10: #5151cd;
+ --iris-11: #5753c6;
+ --iris-12: #272962;
+ /* Pink */
+ --pink-1: #fffcfe;
+ --pink-2: #fef7fb;
+ --pink-3: #fee9f5;
+ --pink-4: #fbdcef;
+ --pink-5: #f6cee7;
+ --pink-6: #efbfdd;
+ --pink-7: #e7acd0;
+ --pink-8: #dd93c2;
+ --pink-9: #d6409f;
+ --pink-10: #cf3897;
+ --pink-11: #c2298a;
+ --pink-12: #651249;
}
/* ╔══════════════════════════════════════════════════════════════╗
@@ -88,195 +440,281 @@
╚══════════════════════════════════════════════════════════════╝ */
:root,
:root[data-theme="dark"] {
- /* Background layers */
- --bg-canvas: var(--gray-950); /* page bg + reading column */
- --bg-surface: var(--gray-900); /* card / code / contained content */
- --bg-raised: var(--gray-850); /* hovered surface / nested card */
- --bg-overlay: var(--gray-800); /* popover / dialog */
- --bg-inert: var(--white-a3); /* subtle field bg */
- --bg-sidebar: var(--black); /* recessed nav rail — sits below canvas */
-
- /* Emphasis backgrounds (overlay tints) */
- --bg-emph-primary: var(--white-a6);
- --bg-emph-secondary: var(--white-a4);
- --bg-emph-tertiary: var(--white-a3);
- --bg-emph-primary-inverse: var(--gray-100);
- --bg-emph-secondary-inverse: var(--gray-200);
- --bg-emph-tertiary-inverse: var(--gray-300);
-
- /* Text */
- --text-primary: var(--gray-50); /* fafafa */
- --text-secondary: var(--gray-200);
- --text-tertiary: var(--gray-400);
- --text-quaternary: var(--gray-450); /* >=4.5:1 on canvas/surface (was gray-500, 4.18) */
- --text-on-inverse-primary: var(--gray-950);
- --text-on-inverse-secondary: var(--gray-800);
- --text-on-inverse-tertiary: var(--gray-600);
- --text-on-inverse-quaternary: var(--gray-500);
- --text-destructive: var(--red-400);
-
- /* Border */
- --border-primary: var(--white-a5);
- --border-secondary: var(--white-a4);
- --border-tertiary: var(--white-a3);
- --border-strong: var(--white-a7);
- --border-on-inverse-primary: var(--black-a5);
- --border-on-inverse-secondary: var(--black-a4);
-
- /* Icon (same as text in this system; surfaced for clarity) */
- --icon-primary: var(--gray-300);
- --icon-secondary: var(--gray-400);
- --icon-tertiary: var(--gray-500);
- --icon-quaternary: var(--gray-600);
-
- /* Status */
- --color-destructive: var(--red-400);
- --color-selected: var(--blue-600);
- --color-success: var(--green-500);
- --color-warning: var(--amber-500);
- --color-info: var(--blue-500);
- --color-accent: var(--orange-500);
- --color-accent-text: var(--orange-500); /* accent used as text/fill — 5.23:1 on dark canvas */
- --color-warning-text: var(--amber-500); /* amber used as text (REQUIRED markers) — 9.22:1 on dark */
-
- color-scheme: dark;
+ /* Background layers */
+ --bg-canvas: var(--gray-950); /* page bg + reading column */
+ --bg-surface: var(
+ --gray-900
+ ); /* card / code / contained content */
+ --bg-raised: var(--gray-850); /* hovered surface / nested card */
+ --bg-overlay: var(--gray-800); /* popover / dialog */
+ --bg-inert: var(--white-a3); /* subtle field bg */
+ --bg-sidebar: var(
+ --black
+ ); /* recessed nav rail — sits below canvas */
+
+ /* Emphasis backgrounds (overlay tints) */
+ --bg-emph-primary: var(--white-a5);
+ --bg-emph-secondary: var(--white-a4);
+ --bg-emph-tertiary: var(--white-a3);
+ --bg-emph-primary-inverse: var(--gray-100);
+ --bg-emph-secondary-inverse: var(--gray-200);
+ --bg-emph-tertiary-inverse: var(--gray-300);
+
+ /* Text */
+ --text-primary: var(--gray-50); /* fafafa */
+ --text-secondary: var(--gray-200);
+ --text-tertiary: var(--gray-400);
+ --text-quaternary: var(
+ --gray-450
+ ); /* >=4.5:1 on canvas/surface (was gray-500, 4.18) */
+ --text-on-inverse-primary: var(--gray-950);
+ --text-on-inverse-secondary: var(--gray-800);
+ --text-on-inverse-tertiary: var(--gray-600);
+ --text-on-inverse-quaternary: var(--gray-500);
+ --text-destructive: var(--red-400);
+
+ /* Border */
+ --border-primary: var(--white-a5);
+ --border-secondary: var(--white-a4);
+ --border-tertiary: var(--white-a3);
+ --border-strong: var(--white-a7);
+ --border-on-inverse-primary: var(--black-a5);
+ --border-on-inverse-secondary: var(--black-a4);
+
+ /* Icon (same as text in this system; surfaced for clarity) */
+ --icon-primary: var(--gray-300);
+ --icon-secondary: var(--gray-400);
+ --icon-tertiary: var(--gray-500);
+ --icon-quaternary: var(--gray-600);
+
+ /* Status */
+ --color-destructive: var(--red-400);
+ --color-selected: var(--blue-600);
+ --color-success: var(--green-500);
+ --color-warning: var(--amber-500);
+ --color-info: var(--blue-500);
+ --color-accent: var(--orange-500);
+ --color-accent-text: var(
+ --orange-500
+ ); /* accent used as text/fill — 5.23:1 on dark canvas */
+ --color-warning-text: var(
+ --amber-500
+ ); /* amber used as text (REQUIRED markers) — 9.22:1 on dark */
+
+ /* Ported from www: brand orange + grayscale chart ramp. Chart values are
+ identical in both www themes, so they live only in this default block. */
+ --brand: oklch(0.628 0.1699 40.08);
+ --chart-1: oklch(0.87 0 0);
+ --chart-2: oklch(0.556 0 0);
+ --chart-3: oklch(0.439 0 0);
+ --chart-4: oklch(0.371 0 0);
+ --chart-5: oklch(0.269 0 0);
+
+ color-scheme: dark;
}
/* ╔══════════════════════════════════════════════════════════════╗
║ SEMANTIC TOKENS — LIGHT ║
╚══════════════════════════════════════════════════════════════╝ */
:root[data-theme="light"] {
- --bg-canvas: var(--gray-50);
- --bg-surface: var(--white);
- --bg-raised: var(--gray-50);
- --bg-overlay: var(--white);
- --bg-inert: var(--black-a3);
- --bg-sidebar: var(--gray-100); /* recessed nav rail — sits below canvas */
-
- --bg-emph-primary: var(--black-a6);
- --bg-emph-secondary: var(--black-a4);
- --bg-emph-tertiary: var(--black-a3);
- --bg-emph-primary-inverse: var(--gray-900);
- --bg-emph-secondary-inverse: var(--gray-800);
- --bg-emph-tertiary-inverse: var(--gray-700);
-
- --text-primary: var(--gray-950);
- --text-secondary: var(--gray-700);
- --text-tertiary: var(--gray-600); /* 7.49:1 (was gray-500, 4.54 borderline) */
- --text-quaternary: var(--gray-500); /* 4.54:1 (was gray-400, 2.42 — AA fail) */
- --text-on-inverse-primary: var(--gray-50);
- --text-on-inverse-secondary: var(--gray-200);
- --text-on-inverse-tertiary: var(--gray-400);
- --text-on-inverse-quaternary: var(--gray-500);
-
- --border-primary: var(--black-a5);
- --border-secondary: var(--black-a4);
- --border-tertiary: var(--black-a3);
- --border-strong: var(--black-a7);
- --border-on-inverse-primary: var(--white-a5);
- --border-on-inverse-secondary: var(--white-a4);
-
- --icon-primary: var(--gray-700);
- --icon-secondary: var(--gray-500);
- --icon-tertiary: var(--gray-400);
- --icon-quaternary: var(--gray-300);
-
- --color-accent-text: #b8461d; /* darkened accent for text/fill on light — 5.12:1 (brand orange is only 3.63) */
- --color-warning-text: #92400e; /* darkened amber for text on light — 6.06:1 on inert (amber-500 is only 2.06) */
-
- color-scheme: light;
+ --bg-canvas: var(--gray-50);
+ --bg-surface: var(--white);
+ --bg-raised: var(--gray-50);
+ --bg-overlay: var(--white);
+ --bg-inert: var(--black-a3);
+ --bg-sidebar: var(
+ --gray-100
+ ); /* recessed nav rail — sits below canvas */
+
+ --bg-emph-primary: var(--black-a5);
+ --bg-emph-secondary: var(--black-a4);
+ --bg-emph-tertiary: var(--black-a3);
+ --bg-emph-primary-inverse: var(--gray-900);
+ --bg-emph-secondary-inverse: var(--gray-800);
+ --bg-emph-tertiary-inverse: var(--gray-700);
+
+ --text-primary: var(--gray-950);
+ --text-secondary: var(--gray-700);
+ --text-tertiary: var(
+ --gray-600
+ ); /* 7.49:1 (was gray-500, 4.54 borderline) */
+ --text-quaternary: var(
+ --gray-500
+ ); /* 4.54:1 (was gray-400, 2.42 — AA fail) */
+ --text-on-inverse-primary: var(--gray-50);
+ --text-on-inverse-secondary: var(--gray-200);
+ --text-on-inverse-tertiary: var(--gray-400);
+ --text-on-inverse-quaternary: var(--gray-500);
+
+ --border-primary: var(--black-a5);
+ --border-secondary: var(--black-a4);
+ --border-tertiary: var(--black-a3);
+ --border-strong: var(--black-a7);
+ --border-on-inverse-primary: var(--white-a5);
+ --border-on-inverse-secondary: var(--white-a4);
+
+ --icon-primary: var(--gray-700);
+ --icon-secondary: var(--gray-500);
+ --icon-tertiary: var(--gray-400);
+ --icon-quaternary: var(--gray-300);
+
+ --color-accent-text: #b8461d; /* darkened accent for text/fill on light — 5.12:1 (brand orange is only 3.63) */
+ --color-warning-text: #92400e; /* darkened amber for text on light — 6.06:1 on inert (amber-500 is only 2.06) */
+
+ --brand: oklch(
+ 0.7105 0.177 40.65
+ ); /* www's light-theme brand orange */
+
+ color-scheme: light;
}
/* ╔══════════════════════════════════════════════════════════════╗
║ TYPOGRAPHY ║
╚══════════════════════════════════════════════════════════════╝ */
:root {
- /* Font families */
- --font-sans: var(--font-geist), "Geist", -apple-system, BlinkMacSystemFont,
- "Segoe UI", system-ui, sans-serif;
- --font-mono: var(--font-geist-mono), "Geist Mono", ui-monospace,
- "SF Mono", Menlo, monospace;
- --font-code: var(--font-geist-mono), "Geist Mono", ui-monospace,
- "SF Mono", Menlo, monospace;
- --font-query: "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono", monospace;
-
- /* Default body */
- font-family: var(--font-sans);
- font-feature-settings: "ss01", "cv11"; /* Inter: stylistic alt 1 + alt 6,9 (a, g) */
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
- text-rendering: optimizeLegibility;
+ /* Font families */
+ --font-sans:
+ var(--font-geist), "Geist", -apple-system, BlinkMacSystemFont,
+ "Segoe UI", system-ui, sans-serif;
+ --font-mono:
+ var(--font-berkeley-mono), "Berkeley Mono", ui-monospace,
+ "SF Mono", Menlo, monospace;
+ --font-code:
+ var(--font-berkeley-mono), "Berkeley Mono", ui-monospace,
+ "SF Mono", Menlo, monospace;
+ --font-query:
+ "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono",
+ monospace;
+
+ /* Default body */
+ font-family: var(--font-sans);
+ font-feature-settings:
+ "ss01", "cv11"; /* Inter: stylistic alt 1 + alt 6,9 (a, g) */
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ text-rendering: optimizeLegibility;
}
/* ─── UI Sans (Inter) ───
Default UI face. 13/16 is the workhorse used throughout the
Console (table rows, menus, buttons, nav). 15/20 is a step up
for headings and dense scan-targets. */
-.type-ui-sans-md-450 { font: 450 13px/16px var(--font-sans); letter-spacing: -0.005em; }
-.type-ui-sans-md-500 { font: 500 13px/16px var(--font-sans); letter-spacing: -0.005em; }
-.type-ui-sans-md-600 { font: 600 13px/16px var(--font-sans); letter-spacing: -0.005em; }
-.type-ui-sans-lg-500 { font: 500 15px/20px var(--font-sans); letter-spacing: -0.010em; }
-.type-ui-sans-lg-600 { font: 600 15px/20px var(--font-sans); letter-spacing: -0.010em; }
-.type-ui-sans-md-num { font-variant-numeric: tabular-nums; letter-spacing: -0.025em; }
+.type-ui-sans-md-450 {
+ font: 450 13px/16px var(--font-sans);
+ letter-spacing: -0.005em;
+}
+.type-ui-sans-md-500 {
+ font: 500 13px/16px var(--font-sans);
+ letter-spacing: -0.005em;
+}
+.type-ui-sans-md-600 {
+ font: 600 13px/16px var(--font-sans);
+ letter-spacing: -0.005em;
+}
+.type-ui-sans-lg-500 {
+ font: 500 15px/20px var(--font-sans);
+ letter-spacing: -0.01em;
+}
+.type-ui-sans-lg-600 {
+ font: 600 15px/20px var(--font-sans);
+ letter-spacing: -0.01em;
+}
+.type-ui-sans-md-num {
+ font-variant-numeric: tabular-nums;
+ letter-spacing: -0.025em;
+}
/* ─── UI Mono (Berkeley Mono) ───
The signature Axiom texture. Used for: data values, IDs, code
tokens inline with UI, condensed uppercase labels in tables &
table-header / status pills. */
-.type-ui-mono-md-450 { font: 450 12px/16px var(--font-mono); }
-.type-ui-mono-md-600 { font: 600 12px/16px var(--font-mono); }
-.type-ui-mono-md-cnd { font: 450 12px/16px var(--font-mono); font-stretch: 75%; text-transform: uppercase; letter-spacing: 0.02em; }
-.type-ui-mono-md-cnd-600 { font: 600 12px/16px var(--font-mono); font-stretch: 75%; text-transform: uppercase; letter-spacing: 0.02em; }
+.type-ui-mono-md-450 {
+ font: 450 12px/16px var(--font-mono);
+}
+.type-ui-mono-md-600 {
+ font: 600 12px/16px var(--font-mono);
+}
+.type-ui-mono-md-cnd {
+ font: 450 12px/16px var(--font-mono);
+ font-stretch: 75%;
+ text-transform: uppercase;
+ letter-spacing: 0.02em;
+}
+.type-ui-mono-md-cnd-600 {
+ font: 600 12px/16px var(--font-mono);
+ font-stretch: 75%;
+ text-transform: uppercase;
+ letter-spacing: 0.02em;
+}
/* ─── Body Sans (Inter) ───
For prose-y surfaces (docs, settings copy, marketing). */
-.type-body-sans-md-500 { font: 500 13px/20px var(--font-sans); letter-spacing: -0.005em; }
-.type-body-sans-md-600 { font: 600 13px/20px var(--font-sans); letter-spacing: -0.005em; }
-.type-body-sans-lg-400 { font: 400 15px/22px var(--font-sans); letter-spacing: -0.010em; }
-.type-body-sans-lg-500 { font: 500 15px/22px var(--font-sans); letter-spacing: -0.010em; }
-.type-body-sans-lg-600 { font: 600 15px/22px var(--font-sans); letter-spacing: -0.010em; }
+.type-body-sans-md-500 {
+ font: 500 13px/20px var(--font-sans);
+ letter-spacing: -0.005em;
+}
+.type-body-sans-md-600 {
+ font: 600 13px/20px var(--font-sans);
+ letter-spacing: -0.005em;
+}
+.type-body-sans-lg-400 {
+ font: 400 15px/22px var(--font-sans);
+ letter-spacing: -0.01em;
+}
+.type-body-sans-lg-500 {
+ font: 500 15px/22px var(--font-sans);
+ letter-spacing: -0.01em;
+}
+.type-body-sans-lg-600 {
+ font: 600 15px/22px var(--font-sans);
+ letter-spacing: -0.01em;
+}
/* ─── Code Mono ───
For multi-line source: query editors, log viewers, JSON. */
-.type-code-mono-md-400 { font: 400 12px/16px var(--font-code); }
-.type-code-mono-md-600 { font: 600 12px/16px var(--font-code); }
+.type-code-mono-md-400 {
+ font: 400 12px/16px var(--font-code);
+}
+.type-code-mono-md-600 {
+ font: 600 12px/16px var(--font-code);
+}
/* ╔══════════════════════════════════════════════════════════════╗
║ SPACING — Tailwind v4 default scale (base 4px / 0.25rem) ║
╚══════════════════════════════════════════════════════════════╝ */
:root {
- --space-px: 1px;
- --space-0_5: 2px;
- --space-1: 4px;
- --space-1_5: 6px;
- --space-2: 8px;
- --space-3: 12px;
- --space-4: 16px;
- --space-5: 20px;
- --space-6: 24px;
- --space-8: 32px;
- --space-10: 40px;
- --space-12: 48px;
- --space-16: 64px;
- --space-24: 96px;
- --space-32: 128px;
- --space-48: 192px;
- --space-64: 256px;
- --space-96: 384px;
+ --space-px: 1px;
+ --space-0_5: 2px;
+ --space-1: 4px;
+ --space-1_5: 6px;
+ --space-2: 8px;
+ --space-3: 12px;
+ --space-4: 16px;
+ --space-5: 20px;
+ --space-6: 24px;
+ --space-8: 32px;
+ --space-10: 40px;
+ --space-12: 48px;
+ --space-16: 64px;
+ --space-24: 96px;
+ --space-32: 128px;
+ --space-48: 192px;
+ --space-64: 256px;
+ --space-96: 384px;
}
/* ╔══════════════════════════════════════════════════════════════╗
║ RADIUS ║
╚══════════════════════════════════════════════════════════════╝ */
:root {
- --radius-1: 2px;
- --radius-2: 4px;
- --radius-3: 6px; /* default button / input / chip */
- --radius-4: 8px;
- --radius-5: 10px;
- --radius-6: 12px; /* large card / surface section */
- --radius-8: 16px;
- --radius-full: 9999px;
+ --radius-1: 2px;
+ --radius-2: 4px;
+ --radius-3: 6px; /* default button / input / chip */
+ --radius-4: 8px;
+ --radius-5: 10px;
+ --radius-6: 12px; /* large card / surface section */
+ --radius-8: 16px;
+ --radius-full: 9999px;
}
/* ╔══════════════════════════════════════════════════════════════╗
@@ -287,72 +725,129 @@
║ are reserved for floating menus / dialogs. ║
╚══════════════════════════════════════════════════════════════╝ */
:root {
- --shadow-overlay:
- 0 0 0 1px var(--border-primary),
- 0 8px 24px -8px rgba(0,0,0,0.45),
- 0 2px 6px -2px rgba(0,0,0,0.35);
- --shadow-dialog:
- 0 0 0 1px var(--border-primary),
- 0 24px 48px -12px rgba(0,0,0,0.6),
- 0 4px 12px -4px rgba(0,0,0,0.4);
-
- --focus-ring: 0 0 0 2px var(--bg-canvas), 0 0 0 4px var(--color-selected);
+ --shadow-overlay:
+ 0 0 0 1px var(--border-primary),
+ 0 8px 24px -8px rgba(0, 0, 0, 0.45),
+ 0 2px 6px -2px rgba(0, 0, 0, 0.35);
+ --shadow-dialog:
+ 0 0 0 1px var(--border-primary),
+ 0 24px 48px -12px rgba(0, 0, 0, 0.6),
+ 0 4px 12px -4px rgba(0, 0, 0, 0.4);
+
+ --focus-ring:
+ 0 0 0 2px var(--bg-canvas), 0 0 0 4px var(--color-selected);
}
/* ╔══════════════════════════════════════════════════════════════╗
║ MOTION ║
╚══════════════════════════════════════════════════════════════╝ */
:root {
- --ease-out: cubic-bezier(0.22, 1, 0.36, 1);
- --ease-inout: cubic-bezier(0.65, 0, 0.35, 1);
- --duration-1: 80ms; /* hover / press */
- --duration-2: 140ms; /* default UI transition */
- --duration-3: 240ms; /* popover, dialog */
+ --ease-out: cubic-bezier(0.22, 1, 0.36, 1);
+ --ease-inout: cubic-bezier(0.65, 0, 0.35, 1);
+ --duration-1: 80ms; /* hover / press */
+ --duration-2: 140ms; /* default UI transition */
+ --duration-3: 240ms; /* popover, dialog */
}
/* ╔══════════════════════════════════════════════════════════════╗
║ SEMANTIC ELEMENT DEFAULTS ║
╚══════════════════════════════════════════════════════════════╝ */
-body {
- margin: 0;
- background: var(--bg-canvas);
- color: var(--text-primary);
- font: 500 13px/16px var(--font-sans);
- letter-spacing: -0.005em;
+/* In @layer base so component utilities (@layer utilities) can override
+ these element defaults; unlayered they would beat every utility. */
+@layer base {
+ body {
+ margin: 0;
+ background: var(--bg-canvas);
+ color: var(--text-primary);
+ font: 500 13px/16px var(--font-sans);
+ letter-spacing: -0.005em;
+ }
+
+ h1,
+ h2,
+ h3,
+ h4,
+ h5 {
+ margin: 0;
+ font-family: var(--font-sans);
+ font-weight: 600;
+ letter-spacing: -0.01em;
+ color: var(--text-primary);
+ }
+ h1 {
+ font-size: 32px;
+ line-height: 36px;
+ letter-spacing: -0.02em;
+ }
+ h2 {
+ font-size: 24px;
+ line-height: 28px;
+ letter-spacing: -0.015em;
+ }
+ h3 {
+ font-size: 18px;
+ line-height: 24px;
+ }
+ h4 {
+ font-size: 15px;
+ line-height: 20px;
+ letter-spacing: -0.01em;
+ }
+ h5 {
+ font-size: 13px;
+ line-height: 16px;
+ }
+
+ p {
+ margin: 0;
+ color: var(--text-secondary);
+ }
+ small {
+ font-size: 12px;
+ line-height: 16px;
+ color: var(--text-tertiary);
+ }
+
+ code,
+ kbd,
+ samp,
+ pre {
+ font-family: var(--font-code);
+ font-size: 12px;
+ line-height: 16px;
+ color: var(--text-primary);
+ }
+ kbd {
+ display: inline-flex;
+ align-items: center;
+ height: 18px;
+ padding: 0 5px;
+ border: 1px solid var(--border-primary);
+ border-radius: var(--radius-2);
+ background: var(--bg-emph-tertiary);
+ color: var(--text-secondary);
+ font-size: 11px;
+ letter-spacing: 0;
+ }
+
+ a {
+ color: var(--text-primary);
+ text-decoration: underline;
+ text-underline-offset: 2px;
+ text-decoration-color: var(--border-strong);
+ }
+ a:hover {
+ text-decoration-color: var(--text-primary);
+ }
+
+ hr {
+ border: 0;
+ border-top: 1px solid var(--border-primary);
+ margin: var(--space-4) 0;
+ }
}
-h1, h2, h3, h4, h5 { margin: 0; font-family: var(--font-sans); font-weight: 600; letter-spacing: -0.01em; color: var(--text-primary); }
-h1 { font-size: 32px; line-height: 36px; letter-spacing: -0.02em; }
-h2 { font-size: 24px; line-height: 28px; letter-spacing: -0.015em; }
-h3 { font-size: 18px; line-height: 24px; }
-h4 { font-size: 15px; line-height: 20px; letter-spacing: -0.010em; }
-h5 { font-size: 13px; line-height: 16px; }
-
-p { margin: 0; color: var(--text-secondary); }
-small { font-size: 12px; line-height: 16px; color: var(--text-tertiary); }
-
-code, kbd, samp, pre {
- font-family: var(--font-code);
- font-size: 12px;
- line-height: 16px;
- color: var(--text-primary);
-}
-kbd {
- display: inline-flex;
- align-items: center;
- height: 18px;
- padding: 0 5px;
- border: 1px solid var(--border-primary);
- border-radius: var(--radius-2);
- background: var(--bg-emph-tertiary);
- color: var(--text-secondary);
- font-size: 11px;
- letter-spacing: 0;
+::selection {
+ background: color-mix(in oklab, #ff7a2e 88%, transparent);
+ color: var(--text-primary);
}
-
-a { color: var(--text-primary); text-decoration: underline; text-underline-offset: 2px; text-decoration-color: var(--border-strong); }
-a:hover { text-decoration-color: var(--text-primary); }
-
-hr { border: 0; border-top: 1px solid var(--border-primary); margin: var(--space-4) 0; }
-
-::selection { background: color-mix(in oklab, #ff7a2e 88%, transparent); color: var(--text-primary); }
diff --git a/tests/e2e/docs.spec.ts b/tests/e2e/docs.spec.ts
index 4e41d2ccd..3a21c6fb8 100644
--- a/tests/e2e/docs.spec.ts
+++ b/tests/e2e/docs.spec.ts
@@ -37,7 +37,8 @@ test('API reference uses highlighted code, compact schemas, and persistent langu
[...new Set(elements.map((element) => getComputedStyle(element).color))]
));
expect(tokenColors.length).toBeGreaterThan(1);
- expect(tokenColors).toContain('rgb(240, 243, 246)');
+ // axiom-dark default token colour (lib/code-theme.ts).
+ expect(tokenColors).toContain('rgb(184, 184, 184)');
await expect(requestCode.locator('pre code')).toHaveCSS('border-top-width', '0px');
const parametersHeading = page.getByRole('heading', { name: 'Parameters', level: 2 });
@@ -261,9 +262,7 @@ test('landing content reserves the desktop table-of-contents rail', async ({ pag
await page.goto('/docs');
const hero = (await page.locator('.landing-hero').boundingBox())!;
- const search = (await page.locator('.hero-search').boundingBox())!;
expect(Math.abs(hero.x + hero.width / 2 - viewport.width / 2)).toBeLessThanOrEqual(1);
- expect(search.width).toBe(hero.width);
}
});
@@ -293,7 +292,7 @@ test('table of contents tracks the active heading and keeps a transparent surfac
const tocCode = codedTocLink.locator('code').first();
await expect(tocCode).toHaveCSS('color', await codedTocLink.evaluate((element) => getComputedStyle(element).color));
await expect(tocCode).toHaveCSS('font-size', await codedTocLink.evaluate((element) => getComputedStyle(element).fontSize));
- await expect(page.locator('link[rel="icon"]')).toHaveAttribute('href', '/docs/doc-assets/logo/favicon.svg?v=2');
+ await expect(page.locator('link[rel="icon"]')).toHaveAttribute('href', '/docs/favicon.ico');
});
test('query reference navigation and MDX components follow the compact interaction model', async ({ page }) => {
@@ -348,7 +347,7 @@ test('query reference navigation and MDX components follow the compact interacti
const outputTable = tabs.getByRole('table').first();
await expect(outputTable.locator('xpath=..')).toHaveCSS('border-radius', '4px');
- await expect(outputTable.getByRole('columnheader').first()).toHaveCSS('padding', '7px 10px');
+ await expect(outputTable.getByRole('columnheader').first()).toHaveCSS('padding', '8px 10px');
const relatedFunction = page.getByRole('link', { name: 'iff', exact: true }).last();
await expect(relatedFunction).toHaveAttribute('href', '/docs/apl/scalar-functions/conditional-function/iff');
@@ -375,7 +374,7 @@ test('Axiom article chrome, callouts, and heading links follow the docs interact
await expect(brand.locator('.brand-mark')).toBeVisible();
await expect(brand.locator('.brand-logo')).toHaveCount(0);
const badge = brand.locator('.brand-badge');
- await expect(badge).toHaveCSS('font-size', '12px');
+ await expect(badge).toHaveCSS('font-size', '14px');
await expect(badge).toHaveCSS('border-left-color', 'rgb(218, 92, 43)');
await expect(badge).toHaveCSS('border-radius', '0px');
await expect(badge).toHaveCSS('font-weight', '600');
@@ -398,7 +397,9 @@ test('Axiom article chrome, callouts, and heading links follow the docs interact
});
expect(noticeStyles.background).not.toBe(noticeStyles.canvas);
expect(noticeStyles.borderLeft).toBe('3px');
- expect(noticeStyles.font).not.toBe(noticeStyles.bodyFont);
+ // Notices share the body sans face; the left rule and tint carry the
+ // differentiation (they rendered in a distinct face before the Geist swap).
+ expect(noticeStyles.font).toBe(noticeStyles.bodyFont);
expect(noticeStyles.shadow).toBe('none');
const heading = page.getByRole('heading', { name: 'Ingestion architecture', level: 2 });
@@ -516,7 +517,8 @@ test('article copy keeps a distinct contrast hierarchy in both themes', async ({
const heading = page.getByRole('heading', { name: 'Ingestion architecture', level: 2 });
const boldLabel = page.locator('.doc-article .prose strong').first();
- await expect(bodyCopy).toHaveCSS('color', 'rgb(212, 212, 212)');
+ // Body copy matches the lede at --text-tertiary (gray-400 dark).
+ await expect(bodyCopy).toHaveCSS('color', 'rgb(163, 163, 163)');
await expect(heading).toHaveCSS('color', 'rgb(250, 250, 250)');
await expect(boldLabel).toHaveCSS('color', 'rgb(250, 250, 250)');