From openkb
Generates a dark, neon-themed HTML slide deck from compiled KB content with glassmorphism panels and aurora gradient atmosphere. Use for presentations with a cyber/tech aesthetic.
How this skill is triggered — by the user, by Claude, or both
Slash command
/openkb:openkb-deck-neonThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are designing a presentation, not writing a research report. Each slide
You are designing a presentation, not writing a research report. Each slide carries one idea. In this visual direction, light, color and glow organize the slide — dark canvas holds it, neon points the eye, glass adds depth.
The user typed something like "make a deck about X" (and asked for a dark /
neon / 科技 look) inside openkb chat. You have wiki-read tools in your normal
tool set, plus a write_file tool that can write under output/**, plus a
tool to read this SKILL.md and files in skills/openkb-deck-neon/ if needed.
Pick a kebab-case slug (e.g. okf-pitch) and write the output to
output/decks/<slug>/index.html.
Exactly one file: output/decks/<slug>/index.html.
It must be self-contained: NO external <link rel="stylesheet">, NO
external <script src>, NO remote <img>, and NO web fonts (no Google
Fonts link — that is an external link and breaks self-containment). All CSS in
one inline <style>; keyboard-nav JS in one inline <script> at end of
<body> (no scaling script needed — CSS fills the viewport). Use the local font stacks in §Type system — do not reach for Inter,
Chakra Petch, Orbitron, or any fonts.googleapis.com import.
The body is a sequence of <section class="slide" data-type="..."> blocks;
each data-type is one of the 7 values in §Slide grammar. Keyboard nav:
← / → move between slides, F toggles fullscreen, P triggers print.
Use this fixed design system. Do not improvise nearby colors, do not add a fifth accent hue, do not bring in emojis. Glow and gradient are allowed here (unlike the editorial skill) — but they are seasoning, not the meal.
:root {
--bg: #080b11; /* near-black blue — the canvas, never pure #000 */
--bg-elev: #0f141d; /* raised surface / slide inner */
--ink: #eef2f7; /* primary text — body copy uses THIS, not muted */
--soft: #aeb8c7; /* secondary text */
--muted: #69748a; /* labels / folio / metadata */
--line: rgba(255,255,255,.09); /* hairline borders */
--glass: rgba(255,255,255,.04); /* glassmorphism fill */
--teal: #2dd4bf; /* PRIMARY accent */
--sky: #38bdf8; /* secondary accent */
--magenta: #e879f9; /* tertiary accent */
--amber: #f6b94b; /* highlight / numbers-in-code only */
}
These 4 neon hues + the neutrals are the only colors. No purple-on-white gradients, no rainbow, no per-slide recoloring.
--font-display: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto,
"PingFang SC", "Microsoft YaHei", sans-serif; /* heavy weights */
--font-mono: ui-monospace, "SF Mono", "JetBrains Mono", Menlo, Consolas,
monospace; /* labels, numbers, code, kickers */
Display titles use --font-display at weight 800 with letter-spacing:-.02em.
The tech character here comes from mono for every label / number / kicker /
code, not from a fancy downloaded display face.
Type scale — use clamp() so type scales with the viewport (fixed px look tiny
on a 2560px screen). vw drives the middle value; the rem caps keep it sane:
--type-display: clamp(2.8rem, 5.2vw, 5.5rem) / 1.05 — cover/chapter titles--type-title: clamp(1.9rem, 3.2vw, 3rem) / 1.12 — normal slide titles--type-body: clamp(1.05rem, 1.4vw, 1.4rem) / 1.6 — body copy (var(--ink))--type-quote: clamp(1.6rem, 2.6vw, 2.2rem) / 1.35 — pull quotes--type-label: size clamp(.66rem,.8vw,.8rem), letter-spacing:.22em, uppercase, mono — label tracksradial-gradients in teal / sky / magenta / amber,
low alpha (.10–.16), filter: blur(14px). Positioned off the title.feTurbulence noise data-URI at opacity:.04
(data-URI is inline, NOT an external image — allowed).radial-gradient background, alpha < .06.These three layers are what stop the dark background from looking flat/cheap.
clamp() sizing adapt to any window ratio:
html,body{height:100%;margin:0;overflow:hidden;background:var(--bg)}
.slide{position:fixed;inset:0;display:none;flex-direction:column;
justify-content:center;
padding:clamp(40px,5vh,72px) clamp(56px,5vw,128px)}
.slide.active{display:flex}
No scaling/transform tricks — CSS alone fills the viewport. On an ultrawide
window the slide is simply wider than 16:9; content reflows and the dark
background + aurora bleed to all four edges — never a centered card with dark
side-bands. One slide visible at a time; ← / → swap the active slide, F
fullscreen, P print (they do not scroll)..slide, which is the whole window). Inner
padding uses the clamp() values above so content breathes on any size.overflow:hidden + justify-content:center, a slide taller than the window
is clipped at BOTH top and bottom and is unreachable. Stay within the
bullet/word caps (§Failure modes), lean on the vh terms in the type scale so
text shrinks on short viewports, and if a slide would overflow, CUT content —
never let it clip.teal → sky → magenta, with box-shadow:0 0 14px of --teal. This is the
deck's signature — present on every slide.N / Total, right = source short label.--glass fill + backdrop-filter:blur(8px) + 1px --line border +
subtle inset highlight) is for compare columns and data cards only.background-clip:text) is reserved for
cover / chapter / closing big titles and data numbers — not for body.Use the WHOLE canvas — never a left sliver with a big empty right half. This is the #1 layout failure under fill-viewport. Every slide must span the width via ONE of these (vary them across the deck):
thesis / chapter / closing (and cover when it
has a visual). A 2-column grid that fills the slide:
.inner{display:grid; grid-template-columns:1.05fr .95fr; gap:clamp(40px,5vw,96px); align-items:center; width:100%; max-width:min(1600px,92vw); margin:0 auto}. Text in one column; a
first-class VISUAL in the other — a big labeled stat, a schema/spec
table, stacked labeled cards, or a simple diagram — sized width:100% to
fill its column, NEVER a thumbnail in a corner.
Build the visual with HTML + CSS (flex/grid); put every label in its own
HTML box so boxes auto-wrap and auto-space and never collide. Do NOT put
text in <svg><text> — SVG text does not wrap or reflow, so multiple labels
in a narrow column overlap into an unreadable smear. Use SVG ONLY for
lines / arrows / shapes between the HTML boxes (or skip SVG). Keep it to ≤4
nodes/cards with SHORT labels (node ≤2 words, caption ≤4 words); if labels run
long or there are many, use a VERTICAL stack of full-width rows, never a
cramped horizontal graph.cover, big thesis. The gradient display title
spans ~70vw across the upper canvas; subtitle + a thin full-width detail row
(kicker / stat strip / row of chips) beneath. The title fills the width, so
there is no right-hand void.data, quote. .inner{max-width:min(900px,72vw); margin:0 auto; text-align:center} with SYMMETRIC breathing room on both
sides (never one-sided dead space).compare — .inner{max-width:min(1180px,90vw); margin:0 auto; display:grid; grid-template-columns:1fr 1fr; gap:clamp(24px,3vw,56px)}, with
the glowing teal rule between columns.Per-slide self-test: is there a large empty right half? Then the layout is
wrong — widen the headline, add the visual column, or center it. The closing
diagram, compare columns, and any flow/graph MUST fill their region, never
shrink to a corner. Never size a content box to min-content/fit-content
(collapses to a sliver).
data big number: give it its OWN width — display:inline-block; width:max-content; max-width:92vw; white-space:nowrap; margin:0 auto — so it
is NOT clipped by the .inner text column, and (with background-clip:text)
the gradient covers the WHOLE string instead of stopping at the column edge
and leaving the last char unpainted/smeared under the glow. Size a SINGLE
number with clamp(3.5rem,11vh,9rem); a COMPARISON number (A → B, A vs B)
is far wider — drop it to clamp(2.4rem,7vh,5.5rem) and keep the whole string
(incl. the trailing %) inside 92vw, never overflowing. Body beneath stays
centered in the .inner as a readable ~3-line paragraph.--ink on --bg; never body copy in --muted/--soft
(exception: quote pull-quotes and cover/closing subtitles may be --soft).data-type values)data-type | Use | Neon signature |
|---|---|---|
cover | tag + huge gradient title + 1-line subtitle | strongest aurora; mono "OPENKB" top-left; gradient display title |
chapter | section divider: oversize number + name | number clamp(4rem,12vh,9rem) mono, teal with glow; name in --type-display |
thesis | one claim + short explanation | title fills ~60% height; ONE keyword in teal+glow; rest --ink |
quote | italic pull-quote + attribution | centered; left teal glowing vertical rule; quote in --soft |
compare | two-column comparison, 3–5 lines each | two glass panels; glowing teal vertical rule between them |
data | one number + label + one-line read | single number clamp(3.5rem,11vh,9rem); comparison A → B clamp(2.4rem,7vh,5.5rem); width:max-content;max-width:92vw (per §Composition); micro-copy in --type-label |
closing | mirrors cover; thanks / next step | same scale as cover; aurora dims toward calm |
Cover/closing have no chapter context → top-left label is "OPENKB".
concepts/ and summaries/
and read wiki/index.md. Build a mental map before deciding the argument.data-type assignments. Vary types — ≥4
distinct, no run of 3+ consecutive same type.output/decks/<slug>/index.html in one write_file call. Inline
all CSS, inline keyboard-nav JS, inline <svg> for any graphics, inline
noise as a data-URI. No external anything.fonts.googleapis.com, <script src>,
<link>, or remote <img>. Breaks self-containment AND the deck validator.
Use the local stacks; the look does not depend on a downloaded font.data-type.max-width or a
fixed 1280×720 box, leaving dark side-bands on a wide window. Slides are
position:fixed;inset:0 and fill the viewport edge-to-edge (§Frame).data box sizing to
min-content or a tiny max-width, squashing text into a narrow sliver on
a wide screen (and breaking big numbers). Wrap content in an .inner with
an explicit max-width (§Composition); big numbers white-space:nowrap.height="auto" written as an SVG attribute
(invalid; fires a console error). Give inline SVG a viewBox and size it
with CSS (width:100%;height:auto in a style) or fixed width/height
attributes — never height="auto" as an attribute.data comparison number (A → B/A vs B)
at the single-number font size overruns its container; the trailing %
falls outside the background-clip:text gradient and smears under the glow.
Give the number width:max-content; max-width:92vw and the smaller
comparison font size (§Composition).<svg><text> (which never
wraps) so multiple labels in the narrow visual column collide into a smear.
Build the visual in HTML/CSS with each label in its own auto-spaced box;
use SVG for lines/shapes only, ≤4 nodes, short labels (§Composition).output/decks/<slug>/index.html exist with NO external
<link>/<script src>/web-font import/remote <img>?data-type="cover" and one data-type="closing"?data-type values, no run of 3+ same?--ink (readable on dark) — quote pull-quotes and
cover/closing subtitles in --soft being the only allowed exceptions — and
is glow limited to titles / big numbers / graph nodes only?position:fixed;inset:0, no
max-width / fixed 1280px box, no letterbox side-bands)?.inner with an explicit max-width — no narrow
sliver / min-content collapse, and big numbers white-space:nowrap?If any answer is no, revise and re-run this self-check.
npx claudepluginhub vectifyai/openkbGenerates polished single-file HTML slide decks in the Editorial Monocle visual direction (warm cream, serif, brick-red) from compiled KB content.
Provides the Slides framework's component library, design tokens, theme rules, storytelling formats, and tone/diversity guidelines for generating on-brand HTML slide decks.
Generates a professionally designed HTML slide deck from a brief or content notes. Single-file output with 13 layout types and 8 style presets.