app-shell
Top bar, sidebar rail, app launcher, tenant and environment cue, status bar. Use when designing the persistent shell, a…
Derive a full UI palette from one or two brand colours — state variants, brand-tinted greys, semantic colours. Use when building or expanding a colour system.
Claude Code
$ npx -y skills add dembrandt/dembrandt-skills --skill algorithmic-color-palette --agent claude-code
Codex
$ npx skills add dembrandt/dembrandt-skills --skill algorithmic-color-palette -a codex -y
Cursor
$ npx skills add dembrandt/dembrandt-skills --skill algorithmic-color-palette -a cursor -y
Gemini CLI
$ npx skills add dembrandt/dembrandt-skills --skill algorithmic-color-palette -a gemini-cli -y
GitHub Copilot
$ npx skills add dembrandt/dembrandt-skills --skill algorithmic-color-palette -a github-copilot -y
OpenCode
$ npx skills add dembrandt/dembrandt-skills --skill algorithmic-color-palette -a opencode -y
Windsurf
$ npx skills add dembrandt/dembrandt-skills --skill algorithmic-color-palette -a windsurf -y
name: algorithmic-color-palette
description: Derive a full UI palette from one or two brand colours — state variants, brand-tinted greys, semantic colours. Use when building or expanding a colour system.
metadata:
priority: 8
pathPatterns:
- "**/*.css"
- "**/*.scss"
- "**/tokens/**"
- "**/theme/**"
- "tailwind.config.*"
- "design-system/**"
promptSignals:
phrases:
- "colour palette"
- "color palette"
- "brand colours"
- "derive colours"
- "colour tokens"
- "hover colour"
- "shade"
- "tint"
- "colour system"
retrieval:
aliases:
- colour system
- algorithmic colours
- brand colour palette
- derive shades
- colour tokens
intents:
- generate a colour palette from brand colours
- derive hover and active colours
- create grey palette from brand
- build a full colour system
- extend a limited brand palette
examples:
- generate a full colour palette from this brand blue
- what colour should the hover state be
- create a grey palette that fits this brand
- derive semantic colours from the brand primaryA brand palette of 2–3 colours is not enough for a UI. You need shades for states (hover, active, disabled), neutrals for backgrounds and borders, and semantic colours for status. Deriving these algorithmically from the brand colours produces a palette that feels coherent — everything is visually related to the brand rather than pulled from a generic grey or a stock colour library.
> **Don't guess the seed colours — extract them (dembrandt engine, optional).** If the brand already exists on the web, pull its *real* palette off the live site instead of eyeballing a hex: `get_color_palette` (or the `extract-design` skill) returns the actual computed brand and neutral colours from the DOM, which you then expand with the methods below. See [`extract-design`](../extract-design/SKILL.md) for setup.
From each brand colour, generate at minimum three variants: base, darker (hover/active), lighter (tint/background).
base: hsl(H, S%, L%) hover: hsl(H, S%, L% - 8%) ← darken by reducing lightness active: hsl(H, S%, L% - 14%) ← darken further tint: hsl(H, S%, L% + 40%) ← lighten significantly for backgrounds subtle: hsl(H, S% * 0.3, L% + 45%) ← heavily desaturated, near-white
--color-primary-subtle: hsl(224, 21%, 94%); /* background tint */ --color-primary-tint: hsl(224, 70%, 67%); /* light variant */ --color-primary: hsl(224, 70%, 27%); /* base */ --color-primary-hover: hsl(224, 70%, 19%); /* hover: -8% lightness */ --color-primary-active: hsl(224, 70%, 13%); /* active: -14% lightness */
If the brand has a green or teal, shift it toward a clearer success green:
--color-success-subtle: hsl(142, 20%, 94%); --color-success: hsl(142, 60%, 35%); --color-success-hover: hsl(142, 60%, 27%);
Generic greys (`#666`, `#999`, `#eee`) feel disconnected from the brand. Desaturating the brand hue produces greys that are subtly tinted — warm, cool, or neutral depending on the brand — and feel like they belong to the same palette.
Pure black `#000000` on pure white `#FFFFFF` causes halation and eye strain. Use a near-black such as `#222222` (`grey-900`) for text and an off-white such as `#EEEEEE` (`grey-50`) for backgrounds; the softened pair still passes WCAG AA/AAA and reads as less harsh.
Named chips with hex values are not a system until each colour has a role: surface, surface tint, text, link, accent, decoration. Name the humble roles too, the off-white behind cards, stripes and hairlines. A role left unnamed is filled by a framework default, which is how an off-brand neutral ends up painting most of the pixels. Two teams inventing the same missing tint with different values means a role is missing, not a colour.
brand hue H grey-900: hsl(H, 12%, 10%) ← near-black, text grey-700: hsl(H, 10%, 30%) ← dark text, icons grey-500: hsl(H, 8%, 50%) ← secondary text, placeholders grey-300: hsl(H, 6%, 70%) ← disabled text, subtle labels grey-200: hsl(H, 5%, 82%) ← borders, dividers grey-100: hsl(H, 4%, 92%) ← input backgrounds, table stripes grey-50: hsl(H, 3%, 96%) ← page background, subtle fills
--color-grey-900: hsl(224, 12%, 10%); /* #16171f — slightly blue-black */ --color-grey-500: hsl(224, 8%, 50%); /* #7b7e8a — cool grey */ --color-grey-200: hsl(224, 5%, 82%); /* #cfd0d5 — cool light border */ --color-grey-50: hsl(224, 3%, 96%); /* #f4f4f6 — near-white with a hint of blue */
Compare to generic `#f5f5f5` (no hue) — the brand-tinted version is subtly different but feels intentional.
Status colours (error, warning, success, info) should feel harmonious with the brand. To achieve cohesion, align their **Saturation** and **Lightness** to create a consistent "visual weight" across the status set.
1. **Pick the Hues:** Use standard semantic hues (0 for Error, 38 for Warning, 142 for Success). 2. **Align S & L:** Use the saturation and lightness of your Brand Primary as a starting point. 3. **Adjust for Perceived Brightness:** Hues like Yellow/Orange (Warning) feel brighter than Blue/Red. Reduce the lightness of Warning by 5–10% compared to Success or Error to ensure they feel equally "heavy" on the page.
| Semantic | Hue (H) | Saturation (S) | Lightness (L) | |---|---|---|---| | **Error** | 0–10 | Match
Enterprise UX secrets, now built into your AI agent. Your agent writes the component in seconds. It does not know the modal should be a drawer, or that the grey it picked fails contrast. These skills carry that judgment: what to do, and what breaks otherwise.
Top bar, sidebar rail, app launcher, tenant and environment cue, status bar. Use when designing the persistent shell, a…
Product visuals must show the real product with real data. Use when building landing pages, hero sections, screenshots or demo…
Shape language across type, radius and icons carries brand personality. Use when starting a design system, picking icons or…
Rest, hover, active, focus, disabled and loading states, derived from the base colour. Use when designing buttons, links, inputs…
Rebuild a live web page 1:1 from measurement into Figma, Penpot or code, then verify it. Use when reproducing a page or checking…
Light, dark or both, and when a theme selector is worth it. Use when defining a base palette or deciding on dark mode support.
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.