algorithmic-color-pale…
Derive a full UI palette from one or two brand colours — state variants, brand-tinted greys, semantic colours. Use when building…
Group controls with Gestalt principles so users see what belongs together. Use when laying out components, navigation, toolbars, forms or dashboards.
Claude Code
$ npx -y skills add dembrandt/dembrandt-skills --skill gestalt-ui-organisation --agent claude-code
Codex
$ npx skills add dembrandt/dembrandt-skills --skill gestalt-ui-organisation -a codex -y
Cursor
$ npx skills add dembrandt/dembrandt-skills --skill gestalt-ui-organisation -a cursor -y
Gemini CLI
$ npx skills add dembrandt/dembrandt-skills --skill gestalt-ui-organisation -a gemini-cli -y
GitHub Copilot
$ npx skills add dembrandt/dembrandt-skills --skill gestalt-ui-organisation -a github-copilot -y
OpenCode
$ npx skills add dembrandt/dembrandt-skills --skill gestalt-ui-organisation -a opencode -y
Windsurf
$ npx skills add dembrandt/dembrandt-skills --skill gestalt-ui-organisation -a windsurf -y
name: gestalt-ui-organisation
description: Group controls with Gestalt principles so users see what belongs together. Use when laying out components, navigation, toolbars, forms or dashboards.
metadata:
priority: 7
docs:
- "https://www.interaction-design.org/literature/topics/gestalt-principles"
pathPatterns:
- "**/*.tsx"
- "**/*.jsx"
- "**/*.vue"
- "**/*.svelte"
- "components/**"
- "src/components/**"
- "design-system/**"
- "ui/**"
promptSignals:
phrases:
- "gestalt"
- "grouping"
- "visual hierarchy"
- "ui layout"
- "component organisation"
- "related controls"
- "ui clarity"
retrieval:
aliases:
- gestalt
- visual grouping
- ui organisation
- proximity
- similarity
- figure ground
intents:
- group related controls
- make ui clearer
- organise components
- show which elements belong together
- improve visual hierarchy
examples:
- group these buttons so users know they're related
- make it clearer which commands belong together
- organise this toolbar using gestaltUI should be organised so that the visual structure communicates relationships — which commands, controls, and elements belong together — without requiring users to read labels or documentation.
Elements that are close together are perceived as a group.
**Example:** A toolbar with `[Cut] [Copy] [Paste]` grouped tightly, then a wider gap before `[Undo] [Redo]`, communicates two distinct command groups without any visual divider.
Default to **whitespace, not divider lines**, for grouping. Most separators do work that spacing does better — they add noise and a "boxed-in" feel without adding information. Remove the majority and let proximity carry the grouping.
Caveat: a line takes almost no space, so removing it leaves groups too close. **Removing separators usually means adding spacing** — budget the whitespace (occasionally a subtle background or heading) rather than just deleting the line and leaving the layout cramped.
Elements packed tightly separate themselves; elements far apart need help. A compact table with short rows reads without any lines, because each row is already next to the one it belongs with. The same table at full width, or with tall rows, needs row lines or zebra striping, or the eye loses its place crossing the row.
So the question is not "lines or no lines" but how far the elements sit from each other. Pick the lightest device that bridges the gap, in this order: spacing, a subtle fill or stripe, a hairline, a boxed region. Set it per size: a wide table may carry row lines while its compact variant in a sidebar drops them.
Proximity also governs time: what a click produces should appear next to the click. When a left-hand menu opens content that starts at the far right, the eye crosses the whole screen for every selection, and the user re-orients each time.
Elements that look alike are perceived as related.
**Example:** Destructive actions (Delete, Remove) use a different colour than constructive actions (Save, Add), signalling different intent groups.
Elements enclosed in a shared region are perceived as a group.
**A region needs no border — but a borderless one needs air.** Enclosure can come from a border/fill *or* from whitespace alone. When a card has no border or background, generous internal padding and a clear gap to its neighbours are what make it read as one region; without a border doing that job, cut the air and separate cards collapse into one blur. Borderless is fine — cramped-and-borderless is not.
**Example:** Form sections grouped in bordered cards signal that fields inside each card form a logical unit.
Elements connected by lines or visual links are perceived as related.
Users distinguish foreground interactive elements from background context.
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.
Derive a full UI palette from one or two brand colours — state variants, brand-tinted greys, semantic colours. Use when building…
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…
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.