OpenDesign's financial review: runway, burn, and the sustainability plan that keeps the project independent. Built as a decision-grade data & finance deck for board, leadership.
A single-aesthetic deck plugin: the midnight-editorial preset from the
upstream MIT-licensed
nicobailon/visual-explainer
skill (templates/slide-deck.html), pinned and shipped as one self-contained
seed — example.html. The upstream mermaid diagram slide has been replaced by
a pure CSS/SVG pipeline page; the deck has zero external JS dependencies
(Google Fonts @import is the only external reference).
Signature combination (what makes this skin this skin):
#0f1729 page, #d4a73a accent, parchment
text #e8e4d8. Cinematic, magazine-grade, dramatic.clamp(48px,10vw,120px), weight 400, -2px tracking, 0.95 line-height)
falling directly to 13–14px uppercase JetBrains Mono labels with 1.5px
letter-spacing. No intermediate sans anywhere.radial-gradient(ellipse at X% Y%, var(--accent-dim) 0%, transparent ~40%)
inline background, with the ellipse anchor moving per slide.clamp(100px,22vw,260px) gold numeral at opacity 0.06.fade + translateY(40px) + scale(0.98) on cubic-bezier(0.16,1,0.3,1);
.reveal children stagger at 0.1s increments (max 6).html[data-theme]), defaulting to the OS preference. The light
mode is a locked cream/gold skin, not an afterthought.Start from example.html. Replace content only — never rewrite the design
system or the runtime script, and never introduce colors or fonts outside the
token sheets below.
:root {
--font-body: 'Instrument Serif', Georgia, serif;
--font-mono: 'JetBrains Mono', 'SF Mono', Consolas, monospace;
--bg: #0f1729;
--surface: #162040;
--surface2: #1d2b52;
--surface-elevated: #243362;
--border: rgba(200, 180, 140, 0.08);
--border-bright: rgba(200, 180, 140, 0.16);
--text: #e8e4d8;
--text-dim: #9a9484;
--accent: #d4a73a;
--accent-dim: rgba(212, 167, 58, 0.1);
--code-bg: #0a0f1e;
--code-text: #d4d0c4;
--green: #4ade80; --green-dim: rgba(74, 222, 128, 0.1);
--red: #f87171; --red-dim: rgba(248, 113, 113, 0.1);
--blue: #60a5fa; --blue-dim: rgba(96, 165, 250, 0.1);
}
html[data-theme="light"])html[data-theme="light"] {
--bg: #faf8f2;
--surface: #ffffff;
--surface2: #f5f0e6;
--surface-elevated: #fffdf5;
--border: rgba(30, 30, 50, 0.08);
--border-bright: rgba(30, 30, 50, 0.16);
--text: #1a1814;
--text-dim: #6e685c;
--accent: #b8860b;
--accent-dim: rgba(184, 134, 11, 0.08);
--code-bg: #2a2520;
--code-text: #e8e4d8;
--green: #16a34a; --green-dim: rgba(22, 163, 74, 0.08);
--red: #dc2626; --red-dim: rgba(220, 38, 38, 0.08);
--blue: #2563eb; --blue-dim: rgba(37, 99, 235, 0.08);
}
The same light block is mirrored under
@media (prefers-color-scheme: light) { html:not([data-theme]) { … } } as a
no-JS fallback. Both themes are part of the contract — every slide you
author must read correctly in both. Semantic colors (--green/--red/--blue)
are for status only (trends, before/after labels, diagram node families) —
never decorative.
@import only)| Slot | Font | Usage |
| --- | --- | --- |
| --font-body | Instrument Serif (400 + italic), Georgia fallback | display, headings, body, KPI values, quotes |
| --font-mono | JetBrains Mono 400/500/600/700 | labels, subtitles, counters, axis/edge labels, code |
No third font. No bold serif — drama comes from size, not weight.
| Element | Spec |
| --- | --- |
| .slide__display | clamp(48px,10vw,120px), 400, -2px, lh 0.95, gold on title |
| .slide__heading | clamp(28px,5vw,48px), 400, -0.5px, lh 1.15 |
| .slide__body | clamp(16px,2.2vw,22px), lh 1.6, --text-dim |
| .slide__subtitle | mono clamp(12px,1.5vw,18px), uppercase, 1px tracking |
| .slide__label | mono clamp(10px,1.2vw,13px), 600, uppercase, 1.5px, gold |
| Divider ghost numeral | clamp(100px,22vw,260px), opacity 0.06, gold |
| Master | Class | Notes |
| --- | --- | --- |
| Title / cover | .slide--title | centered, gold display, corner-mark SVGs, glow at 50% 30% |
| Agenda / TOC | .slide--toc | gold mono numbers + serif items + right-aligned mono hints, hairline rules |
| Section divider | .slide--divider | ghost gold numeral behind heading + mono subtitle |
| Content (asymmetric) | .slide--content | 3fr/2fr grid: gold-dot bullets left, decorative SVG aside right |
| Split (before/after) | .slide--split | full-bleed 3fr/2fr surface panels, red "Before" / green "After" labels |
| Diagram | .slide--diagram + .pipeline-wrap | pure CSS pipeline: 2px accent-bordered nodes, mono edge labels, arrow connectors, legend. Node families: gold (core), blue (process), green (output/storage). Never mermaid, never any external JS. |
| Dashboard / big numbers | .slide--dashboard | KPI cards: serif clamp(36px,6vw,64px) values + mono labels + trend lines |
| Chart | .slide--chart + .bar-chart | pure CSS bars (gradient gold fill; --ghost dashed variant for baselines), mono values + axis labels |
| Table | .slide--table + .data-table | mono uppercase headers, zebra rows, gold hover (CSS available in seed) |
| Code | .slide--code | --code-bg block, gold filename tab, .hl/.cm spans (CSS available in seed) |
| Quote | .slide--quote | ghost gold “ at opacity 0.06, italic serif quote, mono cite |
| Full-bleed closing | .slide--bleed | fixed dark #0a0f1e → #0f1729 → #162040 gradient (code-bg → bg → surface, all in-family navy) + scrim, white text (intentionally stays dark in light mode) |
background-image,
var(--accent-dim) ellipse, anchor varies per slide — never two glows)..reveal children per slide (stagger delays stop at 0.6s).<div class="deck"> containing
<section class="slide slide--…"> pages; vertical scroll-snap, one
viewport (100dvh) per slide, no internal scrolling.#/N hash routing (restored on load, updated on slide
change); T toggles dark/light.prefers-reduced-motion disables all transitions; responsive height
breakpoints (700/600/500px) and a 768px width breakpoint are part of the
contract.example.html; replace slide content only. Do not rewrite the
CSS or the SlideEngine script.@import
is the only allowed external reference..slide--title and close with
.slide--bleed or .slide--quote.Copy a source-pinned command for your client. You run it yourself.
Destination: .claude/skills/ve-midnight-editorial · pinned to the source commit
# Run from your project root
git clone https://github.com/nexu-io/open-design.git .skillboard-tmp
git -C .skillboard-tmp checkout 9881cff70e02be86c2a58130af512011ba23d4af
mkdir -p ".claude/skills"
cp -r ".skillboard-tmp/plugins/_official/examples/ve-midnight-editorial" ".claude/skills/"
rm -rf .skillboard-tmpReview the source before running. This copies files into your project; it is not a one-click install and does not verify runtime safety.
sudo apt update && sudo apt install -y gitnpm install -g @anthropic-ai/claude-code# Run from your project root
git clone https://github.com/nexu-io/open-design.git .skillboard-tmp
git -C .skillboard-tmp checkout 9881cff70e02be86c2a58130af512011ba23d4af
mkdir -p ".claude/skills"
cp -r ".skillboard-tmp/plugins/_official/examples/ve-midnight-editorial" ".claude/skills/"
rm -rf .skillboard-tmpDestination: .claude/skills/ve-midnight-editorial
Scanner static-checks@0.1.0 · commit 9881cff70e02. Static checks cannot prove runtime safety – review the source and the exact diff before installing. How checks work.
No static rules matched. This is not a safety guarantee.