HUD surface
Animated hex grid, holographic shimmer on code, version chip glitch, cyan glow on H1.
Every component, callout, code language, and styling primitive the theme ships — visible at once. Use this page to spot regressions after any visual change.
This is a paragraph with bold text, italic text, strikethrough, and inline code styling. Inline code should appear in gold on dark surfaces and burgundy-deep on light. Links like this one should be cyan with a dashed underline that becomes solid on hover.
A second paragraph for line-height verification. The quick brown fox jumps over the lazy dog. Pack my box with five dozen liquor jugs. How vexingly quick daft zebras jump. The five boxing wizards jump quickly.
Unordered:
inline codeOrdered:
The signature <Glitch /> component, in inline and block variants:
Block (centered, full-width):
# add the theme to a Starlight projectbun add @abstractdata/starlight-theme
# run the dev serverbun dev
# build for productionbun run buildimport type { StarlightPlugin } from '@astrojs/starlight/types';
export interface Config { motion: 'full' | 'calm'; credit: 'auto' | 'hide'; version?: string;}
export default function plugin(opts: Config = {} as Config): StarlightPlugin { const motion = opts.motion ?? 'full'; return { name: '@abstractdata/starlight-theme', hooks: { 'config:setup'({ updateConfig, logger }) { updateConfig({ /* ... */ }); logger.info(`motion: ${motion}`); }, }, };}import { defineConfig } from 'astro/config';import starlight from '@astrojs/starlight';import abstractData from '@abstractdata/starlight-theme';import { abstractDataThemes } from '@abstractdata/starlight-theme/shiki';
export default defineConfig({ site: 'https://docs.example.com', integrations: [ starlight({ title: 'Acme Docs', expressiveCode: { themes: [...abstractDataThemes] }, plugins: [abstractData({ motion: 'full', version: 'v1.0.0' })], }), ],});from dataclasses import dataclassfrom typing import Literal
@dataclass(frozen=True)class ThemeConfig: motion: Literal["full", "calm"] = "full" credit: Literal["auto", "hide"] = "auto" version: str | None = None
def apply(config: ThemeConfig) -> None: """Apply the Abstract Data theme config.""" print(f"motion={config.motion} credit={config.credit}"):root { --ad-cyan: #00d9ff; --ad-gold: #d4af37; --ad-burgundy: #8b2635;}
.brand-headline { font-family: 'Orbitron Variable', sans-serif; color: var(--ad-cyan); text-shadow: 0 0 14px rgba(0, 217, 255, 0.45);}{ "name": "@abstractdata/starlight-theme", "version": "0.3.0", "exports": { ".": "./src/index.ts", "./shiki": "./src/shiki/index.ts" }}| Mode | Hex grid | Glow | Scanline | Glitch | Recommended for |
|---|---|---|---|---|---|
| HUD (default) | yes | yes | yes | yes | abstractdata.io, marketing-y docs |
| Calm | no | no | no | no | client docs, internal wikis |
bun add @abstractdata/starlight-themenpm install @abstractdata/starlight-themepnpm add @abstractdata/starlight-themeInstall the theme.
bun add @abstractdata/starlight-themeRegister the plugin in astro.config.mjs.
import abstractData from '@abstractdata/starlight-theme';
starlight({ plugins: [abstractData()] });Run the dev server and verify the brand renders.
bun devHUD surface
Animated hex grid, holographic shimmer on code, version chip glitch, cyan glow on H1.
Calm surface
Same palette and fonts, no animations. Recommended for prose-heavy client docs.
These meta-features are part of Astro’s expressive-code integration and are worth verifying in both dark and light modes.
import type { StarlightPlugin } from '@astrojs/starlight/types';
export interface Config { motion: 'full' | 'calm'; credit: 'auto' | 'hide'; version?: string;}
export default function plugin(opts: Config): StarlightPlugin { return { name: '@abstractdata/starlight-theme', hooks: {} };}const motion = opts.motion ?? 'full';const motion = opts.motion ?? 'calm';bun installbun devbun run buildbun run preview$ bun create @abstractdata/docs my-project┌─[ ABSTRACT DATA · DOCS ]─────────────────┐│ Scaffolding a branded Starlight site │└──────────────────────────────────────────┘
✓ my-project scaffolded.{ "entryPoints": ["../../my-lib/src/index.ts"], "tsconfig": "../../my-lib/tsconfig.json", "outputDir": "src/content/docs/api/ts"}All five variants Starlight ships:
New Caution Danger Note SuccessBadges inline with a heading:
<FileTree>A sample of Starlight’s built-in icon set (Heroicons + Phosphor subset):
Icon sizes:
“Documentation, engineered.”
— Abstract Data
Above the rule.
Below the rule.
Press ⌘ + K to open the search modal. Press Esc to close.
If everything above looks right, the theme is in good shape. If anything is off, open a screenshot diff against docs/round-2-mockup.html and tell me what’s drifting.