Terminal Mono(等宽终端)
A locked, single-theme deck plugin derived from the MIT-licensed
nicobailon/visual-explainer
slide-deck template, restyled with the Terminal Mono aesthetic from its
references/slide-patterns.md. Developer-native and typographically strict:
near-black ground, monospace everything, one green voice, a faint dot grid.
Zero skeuomorphism, zero effects. No $ prompts, no red/yellow/green
window chrome, no CRT scanlines, no vignettes, no glows. This theme stands on
typographic discipline and the dot-grid texture alone. (The skeuomorphic
"terminal theater" look belongs to a different plugin — do not drift there.)
Start from example.html in this plugin folder. It is the proven seed: copy
its :root tokens (both themes), deck/slide CSS, dot-grid treatment, and the
entire SlideEngine script verbatim, then replace only the slide content. Do not
rewrite the design system, and do not introduce any color or font outside this
spec.
Design tokens (locked — list verbatim in :root)
Dark is the default theme; light mode switches automatically via
prefers-color-scheme: light. Both blocks are part of the locked spec —
dual-theme support is the visual-explainer family signature and must ship in
every deck.
:root {
--font-body: 'Geist Mono', 'SF Mono', Consolas, monospace;
--font-mono: 'Geist Mono', 'SF Mono', Consolas, monospace;
--bg: #0a0e14; /* near-black ground */
--surface: #12161e;
--surface2: #1a1f2a;
--surface-elevated: #222836;
--border: rgba(80, 250, 123, 0.06); /* low-opacity green hairline */
--border-bright: rgba(80, 250, 123, 0.12);
--text: #c8d6e5;
--text-dim: #7d8c9b; /* AA on --bg for body text */
--accent: #50fa7b; /* Dracula green — the only voice */
--accent-dim: rgba(80, 250, 123, 0.08);
--code-bg: #060a10;
--code-text: #c8d6e5;
--dot: rgba(80, 250, 123, 0.05); /* dot-grid ink */
}
@media (prefers-color-scheme: light) {
:root {
--bg: #f4f6f8;
--surface: #ffffff;
--surface2: #eaecf0;
--surface-elevated: #f8f9fa;
--border: rgba(0, 80, 40, 0.08);
--border-bright: rgba(0, 80, 40, 0.16);
--text: #1a2332;
--text-dim: #5a6a7a;
--accent: #0d7a3e; /* deep green for light ground */
--accent-dim: rgba(13, 122, 62, 0.08);
--code-bg: #1a2332; /* code blocks stay dark in light mode */
--code-text: #c8d6e5;
--dot: rgba(13, 122, 62, 0.07);
}
}
Typography (locked)
- One typeface for everything: Geist Mono 400/500/600/700 from Google
Fonts (
https://fonts.googleapis.com/css2?family=Geist+Mono:wght@400;500;600;700&display=swap).
Fallback stack 'SF Mono', Consolas, monospace. No second typeface, ever.
- Titles are large weight-400 mono, never bold display. Display
clamp(36px, 7vw, 88px) weight 400 letter-spacing -2px; headings
clamp(24px, 4vw, 42px) weight 400 letter-spacing -1px.
- Labels/eyebrows: 10-13px, weight 600, uppercase, letter-spacing 1.5-2px,
accent color. Subtitles: uppercase mono in
--text-dim.
- Body and bullets: 15-20px, line-height ~1.6,
--text-dim.
- Numbers use
font-variant-numeric: tabular-nums.
Signature devices (locked)
- Dot grid on every slide:
background-image: radial-gradient(var(--dot) 1px, transparent 1px); background-size: 24px 24px;
This replaces the radial accent glows other family themes use — no glows here.
- Hairlines, not shadows: 1px borders in
--border / --border-bright.
No box-shadows, no blurs (except the nav-dots backdrop blur from the seed).
- Square geometry: border-radius 0-2px everywhere; bullet ticks are 7px
squares in
--accent (no round dots); deck dots are squares.
- Corner bracket decor (title/closing slides only): two 1.5px accent
lines at ~0.25 opacity forming an L in a corner, as inline SVG.
- Section divider numbers: giant mono numerals (up to 260px), weight 400,
accent color at 0.05 opacity, centered behind the heading.
Deck engine & navigation (keep verbatim from the seed)
.deck is a 100dvh scroll-snap container; each page is one
<section class="slide"> (also 100dvh, scroll-snap-align: start).
- SlideEngine (plain JS, no dependencies) builds the chrome: 2px accent
progress bar, square dot rail (right, backdrop-blurred),
n / N counter,
fading hints. Keyboard ←/→, ↑/↓, Space, PageUp/PageDown,
Home/End; touch swipe (50px threshold); IntersectionObserver toggles
.visible for entrance reveals.
- Hash routing: current slide mirrored to
#/<n> via
history.replaceState; deep links restore on load and hashchange.
- Reveals:
.reveal children stagger in at 0.1s steps when the slide gains
.visible; animate only opacity/transform; prefers-reduced-motion
disables all of it.
Layout masters (all present in example.html — compose from these)
- Title — centered; corner brackets; uppercase eyebrow, accent display
title, uppercase sub-line.
- Section divider — giant ghost numeral behind heading + subtitle.
- Content — 3fr/2fr grid: label + heading + square-tick bullets left,
restrained line-art SVG aside right (1px strokes, accent, low opacity).
- Split before/after — two full-height panels (
--surface /
--surface2), 1px --border-bright divider; "before" label in
--text-dim, "after" label in --accent.
- Diagram — pure CSS/SVG pipeline:
.pipe-node boxes (1px hairline,
mono name + uppercase meta) joined by 1px connector lines with CSS-triangle
arrowheads and tiny uppercase edge labels; accent-bordered nodes mark
emphasis; legend row below. Never mermaid, never any external JS.
- Dashboard — KPI card grid: big tabular-nums value (accent or text),
uppercase label, dim trend line.
- Table — hairline-framed table; uppercase mono headers on
--surface2,
zebra rows, accent-tint hover, inline code chips in --accent-dim.
- Code —
--code-bg block with accent filename tab; .hl accent and
.cm dim spans for highlighting (code stays dark in both themes).
- Quote — centered; an oversized
> glyph in accent at 0.08 opacity as
the quote mark (no curly serif quotes), upright mono blockquote, uppercase
cite.
- Closing — left-aligned display heading with one accent
<em> word,
top hairline, corner bracket, uppercase next-steps sub-line.
Hard rules
- Single self-contained HTML file: all CSS and JS inline; only the Google
Fonts stylesheet may be external. No Chart.js, no mermaid, no CDN scripts,
no remote images; icons and diagram art are inline SVG or pure CSS.
- Default 8-11 slides for a standard deck; honor the requested slide count
when the user picks one. Split content into more slides instead of
shrinking type or letting a slide scroll.
- Only the spec colors: the two greens (
#50fa7b dark / #0d7a3e light),
the listed surfaces and text tones. No red/blue/yellow semantic colors —
express "before/risk/off" with --text-dim and "after/win/on" with
--accent.
- Only Geist Mono. Bold weights (600/700) are reserved for labels and small
emphasis, never for titles.
- Keep both theme token blocks; never hard-code a themed color where a token
exists.
- Start from
example.html; replace content only — never redesign the theme.
1---2name: ve-terminal-mono3description: OpenDesign from the CLI: driving the full design workflow with the `od` command — scripted, composable, agent-ready. Built as a decision-grade AI literacy deck for developers, power users.4---5
6# Terminal Mono(等宽终端)
7
8A locked, single-theme deck plugin derived from the MIT-licensed
9[nicobailon/visual-explainer](https://github.com/nicobailon/visual-explainer)
10slide-deck template, restyled with the **Terminal Mono** aesthetic from its
11`references/slide-patterns.md`. Developer-native and typographically strict:
12near-black ground, monospace everything, one green voice, a faint dot grid.
13
14**Zero skeuomorphism, zero effects.** No `$` prompts, no red/yellow/green
15window chrome, no CRT scanlines, no vignettes, no glows. This theme stands on
16typographic discipline and the dot-grid texture alone. (The skeuomorphic
17"terminal theater" look belongs to a different plugin — do not drift there.)
18
19**Start from `example.html` in this plugin folder. It is the proven seed: copy
20its `:root` tokens (both themes), deck/slide CSS, dot-grid treatment, and the
21entire SlideEngine script verbatim, then replace only the slide content. Do not
22rewrite the design system, and do not introduce any color or font outside this
23spec.**
24
25## Design tokens (locked — list verbatim in `:root`)
26
27Dark is the default theme; light mode switches automatically via
28`prefers-color-scheme: light`. **Both blocks are part of the locked spec** —
29dual-theme support is the visual-explainer family signature and must ship in
30every deck.
31
32```css
33:root {
34 --font-body: 'Geist Mono', 'SF Mono', Consolas, monospace;
35 --font-mono: 'Geist Mono', 'SF Mono', Consolas, monospace;
36 --bg: #0a0e14; /* near-black ground */
37 --surface: #12161e;
38 --surface2: #1a1f2a;
39 --surface-elevated: #222836;
40 --border: rgba(80, 250, 123, 0.06); /* low-opacity green hairline */
41 --border-bright: rgba(80, 250, 123, 0.12);
42 --text: #c8d6e5;
43 --text-dim: #7d8c9b; /* AA on --bg for body text */
44 --accent: #50fa7b; /* Dracula green — the only voice */
45 --accent-dim: rgba(80, 250, 123, 0.08);
46 --code-bg: #060a10;
47 --code-text: #c8d6e5;
48 --dot: rgba(80, 250, 123, 0.05); /* dot-grid ink */
49}
50
51@media (prefers-color-scheme: light) {
52 :root {
53 --bg: #f4f6f8;
54 --surface: #ffffff;
55 --surface2: #eaecf0;
56 --surface-elevated: #f8f9fa;
57 --border: rgba(0, 80, 40, 0.08);
58 --border-bright: rgba(0, 80, 40, 0.16);
59 --text: #1a2332;
60 --text-dim: #5a6a7a;
61 --accent: #0d7a3e; /* deep green for light ground */
62 --accent-dim: rgba(13, 122, 62, 0.08);
63 --code-bg: #1a2332; /* code blocks stay dark in light mode */
64 --code-text: #c8d6e5;
65 --dot: rgba(13, 122, 62, 0.07);
66 }
67}
68```
69
70## Typography (locked)
71
72- **One typeface for everything**: Geist Mono 400/500/600/700 from Google
73 Fonts (`https://fonts.googleapis.com/css2?family=Geist+Mono:wght@400;500;600;700&display=swap`).
74 Fallback stack `'SF Mono', Consolas, monospace`. No second typeface, ever.
75- **Titles are large weight-400 mono, never bold display.** Display
76 `clamp(36px, 7vw, 88px)` weight 400 letter-spacing -2px; headings
77 `clamp(24px, 4vw, 42px)` weight 400 letter-spacing -1px.
78- Labels/eyebrows: 10-13px, weight 600, uppercase, letter-spacing 1.5-2px,
79 accent color. Subtitles: uppercase mono in `--text-dim`.
80- Body and bullets: 15-20px, line-height ~1.6, `--text-dim`.
81- Numbers use `font-variant-numeric: tabular-nums`.
82
83## Signature devices (locked)
84
85- **Dot grid on every slide**:
86 `background-image: radial-gradient(var(--dot) 1px, transparent 1px); background-size: 24px 24px;`
87 This replaces the radial accent glows other family themes use — no glows here.
88- **Hairlines, not shadows**: 1px borders in `--border` / `--border-bright`.
89 No box-shadows, no blurs (except the nav-dots backdrop blur from the seed).
90- **Square geometry**: border-radius 0-2px everywhere; bullet ticks are 7px
91 squares in `--accent` (no round dots); deck dots are squares.
92- **Corner bracket decor** (title/closing slides only): two 1.5px accent
93 lines at ~0.25 opacity forming an L in a corner, as inline SVG.
94- Section divider numbers: giant mono numerals (up to 260px), weight 400,
95 accent color at 0.05 opacity, centered behind the heading.
96
97## Deck engine & navigation (keep verbatim from the seed)
98
99- `.deck` is a `100dvh` scroll-snap container; each page is one
100 `<section class="slide">` (also `100dvh`, `scroll-snap-align: start`).
101- SlideEngine (plain JS, no dependencies) builds the chrome: 2px accent
102 progress bar, square dot rail (right, backdrop-blurred), `n / N` counter,
103 fading hints. Keyboard `←`/`→`, `↑`/`↓`, `Space`, `PageUp`/`PageDown`,
104 `Home`/`End`; touch swipe (50px threshold); IntersectionObserver toggles
105 `.visible` for entrance reveals.
106- **Hash routing**: current slide mirrored to `#/<n>` via
107 `history.replaceState`; deep links restore on load and `hashchange`.
108- Reveals: `.reveal` children stagger in at 0.1s steps when the slide gains
109 `.visible`; animate only opacity/transform; `prefers-reduced-motion`
110 disables all of it.
111
112## Layout masters (all present in example.html — compose from these)
113
1141. **Title** — centered; corner brackets; uppercase eyebrow, accent display
115 title, uppercase sub-line.
1162. **Section divider** — giant ghost numeral behind heading + subtitle.
1173. **Content** — 3fr/2fr grid: label + heading + square-tick bullets left,
118 restrained line-art SVG aside right (1px strokes, accent, low opacity).
1194. **Split before/after** — two full-height panels (`--surface` /
120 `--surface2`), 1px `--border-bright` divider; "before" label in
121 `--text-dim`, "after" label in `--accent`.
1225. **Diagram** — pure CSS/SVG pipeline: `.pipe-node` boxes (1px hairline,
123 mono name + uppercase meta) joined by 1px connector lines with CSS-triangle
124 arrowheads and tiny uppercase edge labels; accent-bordered nodes mark
125 emphasis; legend row below. **Never mermaid, never any external JS.**
1266. **Dashboard** — KPI card grid: big tabular-nums value (accent or text),
127 uppercase label, dim trend line.
1287. **Table** — hairline-framed table; uppercase mono headers on `--surface2`,
129 zebra rows, accent-tint hover, inline `code` chips in `--accent-dim`.
1308. **Code** — `--code-bg` block with accent filename tab; `.hl` accent and
131 `.cm` dim spans for highlighting (code stays dark in both themes).
1329. **Quote** — centered; an oversized `>` glyph in accent at 0.08 opacity as
133 the quote mark (no curly serif quotes), upright mono blockquote, uppercase
134 cite.
13510. **Closing** — left-aligned display heading with one accent `<em>` word,
136 top hairline, corner bracket, uppercase next-steps sub-line.
137
138## Hard rules
139
140- Single self-contained HTML file: all CSS and JS inline; only the Google
141 Fonts stylesheet may be external. No Chart.js, no mermaid, no CDN scripts,
142 no remote images; icons and diagram art are inline SVG or pure CSS.
143- Default 8-11 slides for a standard deck; honor the requested slide count
144 when the user picks one. Split content into more slides instead of
145 shrinking type or letting a slide scroll.
146- Only the spec colors: the two greens (`#50fa7b` dark / `#0d7a3e` light),
147 the listed surfaces and text tones. No red/blue/yellow semantic colors —
148 express "before/risk/off" with `--text-dim` and "after/win/on" with
149 `--accent`.
150- Only Geist Mono. Bold weights (600/700) are reserved for labels and small
151 emphasis, never for titles.
152- Keep both theme token blocks; never hard-code a themed color where a token
153 exists.
154- Start from `example.html`; replace content only — never redesign the theme.