Ai ui-design

install
source · Clone the upstream repo
git clone https://github.com/wpank/ai
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/wpank/ai "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/design-systems/ui-design" ~/.claude/skills/wpank-ai-ui-design && rm -rf "$T"
manifest: skills/design-systems/ui-design/SKILL.md
source content

UI Design Fundamentals

The definitive guide for building production-grade web interfaces. Covers the full stack of design decisions from layout to motion.

WHEN To Use

  • Designing new UI components or pages
  • Building landing pages, dashboards, or applications
  • Reviewing code for design quality
  • Creating distinctive interfaces that avoid generic aesthetics
  • Implementing accessibility requirements

KEYWORDS

ui design, web design, layout, typography, color palette, spacing, visual hierarchy, responsive design, accessibility, motion design, component design, design tokens, frontend, css, tailwind

Installation

OpenClaw / Moltbot / Clawbot

npx clawhub@latest install ui-design

Design Philosophy

The 80/20 of Design Quality

FactorImpactTime Investment
Typography40%Choose 1-2 fonts well
Spacing25%Use consistent scale
Color20%Limit palette, ensure contrast
Everything else15%Shadows, borders, motion

Focus on typography and spacing first. They're 65% of perceived quality.

Commit to a Direction

Mediocrity is forgettable. Pick an extreme:

DirectionCharacteristicsUse When
Brutally MinimalStark, essential, nothing extraDeveloper tools, productivity
Luxury/RefinedPremium, subtle eleganceHigh-end products, fashion
PlayfulFun, bright, approachableConsumer apps, games
EditorialType-forward, grid-basedContent sites, magazines
IndustrialFunction-forward, robustB2B, enterprise

Layout

Grid vs Flexbox Decision

Layout NeedToolWhy
Page-level structureCSS Grid (
grid-template-areas
)
Named regions, explicit control
Navigation barsFlexboxSingle-axis,
gap
spacing
Card gridsGrid (
auto-fill
/
auto-fit
)
Responsive without media queries
CenteringGrid (
place-items: center
)
Shortest, most reliable
Sidebar + contentGrid (
250px 1fr
)
Fixed + fluid
Stacking/overlapsGrid +
grid-area: 1/1
No
position: absolute
needed

Container Strategy

/* Standard content width */
.container {
  width: 100%;
  max-width: 1280px;
  margin-inline: auto;
  padding-inline: clamp(1rem, 5vw, 3rem);
}

/* Full-bleed with contained content */
.full-bleed {
  width: 100vw;
  margin-left: calc(50% - 50vw);
}

Common Layout Mistakes

MistakeProblemFix
Mixing container widthsInconsistent alignmentUse single
max-w-*
value
Content behind fixed navbarHidden contentAdd
pt-[navbar-height]
No mobile paddingEdge-to-edge textAdd
px-4
minimum
Centered everythingWeak hierarchyLeft-align body text

Typography

Typography carries 90% of a design's personality.

Font Pairing by Context

ContextDisplay FontBody FontExample
EditorialHigh-contrast serifNeutral humanistPlayfair + Source Sans
SaaSGeometric sansMatching sansDM Sans + DM Mono
LuxuryThin modern serifElegant sansCormorant + Jost
DeveloperMonospace displayMonospace bodyJetBrains Mono + IBM Plex
PlayfulRounded/quirkyClean readableNunito + Outfit

Type Scale (1.25 ratio)

--text-xs: 0.64rem;   /* 10px - captions */
--text-sm: 0.8rem;    /* 13px - secondary */
--text-base: 1rem;    /* 16px - body */
--text-lg: 1.25rem;   /* 20px - lead */
--text-xl: 1.563rem;  /* 25px - h4 */
--text-2xl: 1.953rem; /* 31px - h3 */
--text-3xl: 2.441rem; /* 39px - h2 */
--text-4xl: 3.052rem; /* 49px - h1 */

Typography Rules

RuleValueWhy
Minimum body size16pxBelow is hard to read
Body line-height1.5-1.75Improves readability
Heading line-height1.1-1.2Tighter for large text
Line length60-75 charactersOptimal reading
Paragraph spacing1.5emClear separation

Typography Mistakes

MistakeProblemFix
System fonts onlyGeneric lookUse Google Fonts or variable fonts
Too many fontsVisual chaosMax 2 families
Weak weight contrastPoor hierarchyBold headings (600+), regular body
Long linesHard to readAdd
max-w-prose
(65ch)

Color

Building a Palette

Every palette needs five functional roles:

RolePurposeUsage
PrimaryBrand identityButtons, links, active states
NeutralText, backgroundsBody text, cards, dividers
AccentSecondary actionsTags, badges, highlights
SemanticFeedbackSuccess/warning/error states
SurfaceLayered backgroundsCards, modals, overlays

Surface Layering (Dark Mode)

Create depth through lightness, not shadows:

:root {
  --surface-0: hsl(220 15% 8%);   /* page background */
  --surface-1: hsl(220 15% 12%);  /* card */
  --surface-2: hsl(220 15% 16%);  /* raised element */
  --surface-3: hsl(220 15% 20%);  /* popover/modal */
}

Contrast Requirements (WCAG)

Text SizeMinimum RatioEnhanced (AAA)
Normal text (<18px)4.5:17:1
Large text (≥18px bold, ≥24px)3:14.5:1
UI components3:1

Color Mistakes

MistakeProblemFix
Purple gradient on white"AI aesthetic" clichéUse intentional brand colors
Low contrast textAccessibility failTest with contrast checker
Color-only indicatorsColorblind users excludedAdd icons/text
Too many colorsVisual noise3-5 colors maximum
Light gray text on whiteUnreadable
slate-600
minimum

Spacing

8px Base Unit Scale

--space-1: 0.25rem;  /* 4px - tight gaps */
--space-2: 0.5rem;   /* 8px - input padding */
--space-3: 0.75rem;  /* 12px - button padding */
--space-4: 1rem;     /* 16px - default spacing */
--space-6: 1.5rem;   /* 24px - section padding */
--space-8: 2rem;     /* 32px - section gaps */
--space-12: 3rem;    /* 48px - major breaks */
--space-16: 4rem;    /* 64px - page rhythm */

Spacing Rules

RuleImplementation
Use
gap
not margins
display: flex; gap: var(--space-4)
Consistent paddingSame values on all cards/sections
More space between groupsLess space within groups (Gestalt)
No arbitrary valuesOnly use scale tokens

Spacing Mistakes

MistakeProblemFix
Arbitrary pixel valuesInconsistent rhythmUse spacing scale only
Margin on childrenMargin collapse bugsUse
gap
on parent
Equal spacing everywhereNo visual groupingMore between, less within
Tight mobile paddingCramped feelingMinimum
p-4
on mobile

Visual Hierarchy

Guide the eye through deliberate contrast.

Hierarchy Techniques

TechniqueHowImpact
SizeHero 3-4x bodyImmediate focal point
WeightBold headings, regular bodyScannability
ColorPrimary vs mutedInformation layers
SpaceIsolation creates emphasisDraws attention
PositionTop-left anchors readingNatural flow

Card Hierarchy Pattern

Eyebrow  ← xs, uppercase, muted color
Title    ← xl, semibold, primary color
Body     ← base, secondary color, 1.6 line-height
Action   ← spaced apart, mt-4 minimum

Responsive Design

Breakpoint Strategy

BreakpointTargetKey Changes
< 640pxMobileSingle column, stacked nav, 44px touch targets
640-1024pxTabletTwo columns, collapsible sidebars
1024-1440pxDesktopFull layout, hover enabled
> 1440pxWideMax-width container, prevent ultra-wide lines

Fluid Techniques

/* Fluid typography */
h1 { font-size: clamp(2rem, 1.5rem + 2.5vw, 3.5rem); }

/* Fluid spacing */
section { padding-block: clamp(2rem, 1rem + 4vw, 6rem); }

/* Intrinsic grid */
.grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 20rem), 1fr));
  gap: var(--space-6);
}

Responsive Mistakes

MistakeProblemFix
No viewport metaBroken mobileAdd
width=device-width
Fixed widthsOverflow on mobileUse
max-w-*
and
%
Tiny touch targetsFrustrating tapsMinimum 44x44px
Hidden horizontal scrollBroken layoutTest at 375px width

Accessibility

Accessibility is not optional.

Critical Requirements

RequirementImplementationStandard
Color contrast4.5:1 normal, 3:1 largeWCAG 2.1 AA
Keyboard navigationTab order matches visualWCAG 2.1.1
Focus indicatorsVisible
:focus-visible
ring
WCAG 2.4.7
Semantic HTML
<button>
,
<nav>
,
<main>
WCAG 1.3.1
Alt textDescriptive for imagesWCAG 1.1.1
Motion safety
prefers-reduced-motion
WCAG 2.3.3
Touch targets44×44px minimumWCAG 2.5.8

Focus Styles

:focus-visible {
  outline: 2px solid var(--color-primary);
  outline-offset: 2px;
}

/* Remove default only if custom exists */
:focus:not(:focus-visible) {
  outline: none;
}

Motion Safety

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    transition-duration: 0.01ms !important;
  }
}

Motion & Animation

Use motion to communicate, not decorate.

Timing Guidelines

InteractionDurationEasing
Button hover150msease-out
Modal open250msease-out
Modal close200msease-in
Page transition300msease-in-out
Stagger delay50-80ms per item
Micro-feedback100msease-out

Staggered Entrance

.item {
  opacity: 0;
  translate: 0 1rem;
  animation: reveal 0.5s ease-out forwards;
}
.item:nth-child(1) { animation-delay: 0ms; }
.item:nth-child(2) { animation-delay: 60ms; }
.item:nth-child(3) { animation-delay: 120ms; }

@keyframes reveal {
  to { opacity: 1; translate: 0 0; }
}

Motion Mistakes

MistakeProblemFix
Animating width/heightPerformance hitUse
transform
only
> 500ms durationFeels sluggish150-300ms for most
Motion everywhereOverwhelmingFocus on entrances/exits
No reduced-motionAccessibility failAlways check preference

Component States

Every interactive element needs clear states.

StateVisual Treatment
DefaultBase styling
HoverSubtle background/shadow shift
Active/PressedSlight inset, reduced shadow
FocusHigh-visibility ring
Disabled50% opacity,
not-allowed
cursor
LoadingSpinner or skeleton

Button Example

.btn {
  transition: all 150ms ease-out;
}
.btn:hover {
  background: var(--color-primary-600);
}
.btn:active {
  transform: scale(0.98);
}
.btn:focus-visible {
  outline: 2px solid var(--color-primary);
  outline-offset: 2px;
}
.btn:disabled {
  opacity: 0.5;
  cursor: not-allowed;
}

Design Tokens Architecture

Structure tokens in three layers:

/* Layer 1: Primitives */
--blue-500: oklch(0.55 0.2 250);
--gray-100: oklch(0.95 0.005 250);
--radius-md: 0.5rem;

/* Layer 2: Semantic */
--color-primary: var(--blue-500);
--color-surface: var(--gray-100);
--radius-button: var(--radius-md);

/* Layer 3: Component */
--btn-bg: var(--color-primary);
--btn-radius: var(--radius-button);
--btn-padding: var(--space-2) var(--space-4);

This allows theme switching by remapping Layer 2 only.


Pre-Delivery Checklist

Typography

  • Intentional font pairing (not system defaults)
  • Consistent type scale
  • Line length ≤ 75 characters
  • 16px minimum body text

Color

  • Cohesive palette (3-5 colors)
  • WCAG contrast met (4.5:1 normal, 3:1 large)
  • Semantic colors defined
  • Dark mode tested (if applicable)

Spacing

  • Consistent rhythm using scale
  • No arbitrary pixel values
  • Proper mobile padding

Hierarchy

  • Clear visual flow
  • Primary action obvious
  • Information layered by importance

Responsive

  • Mobile tested (375px)
  • No horizontal overflow
  • Touch targets ≥ 44px

Accessibility

  • Keyboard navigable
  • Focus visible
  • Screen reader tested
  • Motion-safe

States

  • Hover on all interactive elements
  • Focus-visible on all focusable
  • Loading states for async
  • Error states for forms

Performance

  • Images optimized (WebP, srcset)
  • Fonts subset
  • Animations use
    transform
    /
    opacity

NEVER Do

  1. NEVER skip contrast checking — Test every text/background combination
  2. NEVER use color alone — Always pair with icons/text for meaning
  3. NEVER remove focus outlines — Unless replacing with visible alternative
  4. NEVER use arbitrary spacing — Stick to the scale
  5. NEVER animate layout properties — Only
    transform
    and
    opacity
  6. NEVER ignore reduced-motion — Always check the preference
  7. NEVER center everything — Left-align body text
  8. NEVER use tiny touch targets — 44px minimum
  9. NEVER use low-contrast text
    slate-600
    minimum on white
  10. NEVER use generic system fonts — Choose intentional typography

Related Skills

  • ui-ux-pro-max
    — Searchable design databases with CLI
  • frontend-design
    — Creative aesthetics, avoiding "AI slop"
  • theme-factory
    — Applying themes to artifacts
  • design-system-patterns
    — Token architecture and theming