Install
openclaw skills install @sakib-dalal/theme-engineopenclaw skills install @sakib-dalal/theme-engineA theme is not a colour picker. It is two libraries composed into tokens, then re-expressed per surface: the same inks paint a web page, a PDF, a LaTeX document, a VS Code window, a terminal and an agent's chat UI.
This skill is the whole pipeline: reference → libraries → contrast-gated tokens → surface emitters.
Any request of the form “make it look like X” where X is an image, a brand, a poster or a mood:
Don't use for a one-off colour tweak on an existing theme (change the one token instead), or for raw image generation.
GROUNDS (stocks/surfaces) × INKS (accent pairs) → derive() → tokens → surface emitters
riso — muted, register-based print inks (Cobalt & Rose, Vermilion & Slate…)vivid — high-chroma, everyday stand-out (Vivid Magenta, Electric Blue, Ultraviolet)hi-vis — fluorescent / safety, engineered to grab attention (Hi-Vis Yellow, Laser Green)accent — one loud colour, everything else quiet (Signal Orange)Full maths, the CLI, and the uniqueness/assignment scheme: references/engine.md.
--list shows the grid and every theme has both plates.templates/token_engine.py --emit css|vscode|latex|json|skin. One engine,
one palette, many outputs. Recipes: references/surfaces.md.| surface | emitter / recipe | artefact to verify |
|---|---|---|
| Web page / landing / UI kit | CSS custom properties on :root | screenshot at 1440 / 900 / 390 |
| Component library / design system | token JSON → CSS + Tailwind config | component page in all states |
| Document / report (docx, PDF) | token JSON → style map (fonts, scale, colours, rules) | exported PDF, page 1 + table page |
| LaTeX (report, paper, poster) | generated .sty with xcolor definitions | pdflatex compiles, PDF inspected |
| VS Code | theme JSON (workbench + tokenColors + terminal ANSI) | JSON parses; theme loads |
| Terminal / CLI | ANSI 16-colour map | legible on both light and dark |
| Agent / app skin | skin YAML / CSS variables | app repaints; palette resolves |
| Slides | display + body + code styles | PDF export inspected |
Per-surface code, key names and gotchas: references/surfaces.md.
#000 on #fff. Warm stock #F2EEE2–#FDF3E3, ink #12100E–#1D1D1D.border-radius: 0
unless the host demands otherwise.#D6FF00 on stock is ~1.3:1 — a fill, or a type colour on a
dark board only. Split fill/text tokens and let the walk decide.editor.*. An unstyled sidebar, tabs, status bar and terminal
ANSI reads as half-finished. Emit the full workbench set.xcolor. Load xcolor (with the options you need) before
\definecolor, and keep \colorlet aliases for semantic names.wght@0,400;0,600;0,700 returns the variable file
(larger, and double-paints in some Chromium builds at display size). Pin the faces you use.inset: -40% before rotation, or corners go empty.SKILL.md
templates/token_engine.py grounds × inks → tokens; --emit css|vscode|latex|json|skin
references/engine.md the maths, the CLI, uniqueness/assignment, contrast gates
references/surfaces.md per-surface emitters: web, docs/PDF, LaTeX, VS Code, terminal, agents
references/editorial-print.md print/editorial composition grammar (dot type, specimen sheets)
Worked example, complete and verified: ~/Downloads/JACKAL_THEME_ENGINE — 150-theme marble engine,
live specimen sheet, previews. Read preview/*.png before starting.
token_engine.py --list → the full grid; --report → “text pairings under AA: none”.--emit vscode → JSON parses (python -m json.tool), keys are real VS Code keys, terminal ANSI
has 16 entries.--emit latex → pdflatex compiles a two-page sample with no undefined-colour warnings.--emit css → variables resolve; the page renders at 1440 / 900 / 390 without overflow.