ui-design

Core UI Design Principles

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "ui-design" with this command: npx skills add petrilahdelma/digitaltableteur/petrilahdelma-digitaltableteur-ui-design

UI Design Expert

Core UI Design Principles

When designing user interfaces, always follow these principles:

  • Visual Hierarchy: Guide attention through size, weight, color, contrast

  • Consistency: Use systematic patterns for predictability

  • White Space: Breathing room improves comprehension

  • Contrast: Ensure readability and focus

  • Alignment: Create order and visual connections

  • Repetition: Reinforce brand and structure

Design System Foundation

Design Tokens (Variables)

Purpose: Single source of truth for design decisions

Token Categories:

/* Color Tokens */ --color-primary: #0066cc; --color-secondary: #6c757d; --color-success: #28a745; --color-warning: #ffc107; --color-danger: #dc3545; --color-text: #212529; --color-background: #ffffff;

/* Spacing Scale (8px base) / --space-2: 0.125rem; / 2px / --space-4: 0.25rem; / 4px / --space-8: 0.5rem; / 8px / --space-12: 0.75rem; / 12px / --space-16: 1rem; / 16px / --space-24: 1.5rem; / 24px / --space-32: 2rem; / 32px / --space-48: 3rem; / 48px / --space-64: 4rem; / 64px */

/* Typography Scale (Modular 1.25 ratio) / --font-size-xs: 0.75rem; / 12px / --font-size-sm: 0.875rem; / 14px / --font-size-base: 1rem; / 16px / --font-size-lg: 1.25rem; / 20px / --font-size-xl: 1.5rem; / 24px / --font-size-2xl: 2rem; / 32px / --font-size-3xl: 2.5rem; / 40px / --font-size-4xl: 3rem; / 48px / --font-size-display: clamp(5rem, 10vw + 3rem, 8rem); / 80-128px */

/* Font Weights */ --font-weight-normal: 400; --font-weight-medium: 500; --font-weight-semibold: 600; --font-weight-bold: 700;

/* Line Heights */ --line-height-tight: 1.2; --line-height-normal: 1.5; --line-height-relaxed: 1.75;

/* Border Radius / --radius-sm: 0.25rem; / 4px / --radius-md: 0.5rem; / 8px / --radius-lg: 1rem; / 16px / --radius-full: 9999px; / Circle */

/* Shadows */ --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05); --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1); --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1); --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1);

/* Z-Index Scale */ --z-dropdown: 1000; --z-sticky: 1020; --z-fixed: 1030; --z-modal-backdrop: 1040; --z-modal: 1050; --z-popover: 1060; --z-tooltip: 1070;

Color System

Color Theory for UI

60-30-10 Rule:

  • 60%: Dominant color (backgrounds, large areas)

  • 30%: Secondary color (sections, panels)

  • 10%: Accent color (CTAs, highlights)

Semantic Color Palette

Primary (Brand): ├── primary-50: #e6f2ff (lightest - backgrounds) ├── primary-100: #b3d9ff ├── primary-200: #80c0ff ├── primary-300: #4da7ff ├── primary-400: #1a8eff ├── primary-500: #0066cc ← Base ├── primary-600: #0052a3 ├── primary-700: #003d7a ├── primary-800: #002952 └── primary-900: #001429 (darkest - text on light bg)

Success (Green): ├── Positive actions ├── Confirmation states └── Valid inputs

Warning (Yellow/Orange): ├── Caution states ├── Important notices └── Pending actions

Danger (Red): ├── Destructive actions ├── Error states └── Invalid inputs

Neutral (Gray): ├── Text hierarchy ├── Borders └── Disabled states

Color Accessibility (WCAG)

Contrast Ratios:

  • AA Standard: 4.5:1 for normal text, 3:1 for large text (18px+)

  • AAA Enhanced: 7:1 for normal text, 4.5:1 for large text

Test Colors:

Use WebAIM Contrast Checker

https://webaim.org/resources/contrastchecker/

Or test in code

npm install wcag-color

Example:

✅ PASS: #0066cc text on #ffffff background (7.5:1) ❌ FAIL: #80c0ff text on #ffffff background (2.1:1)

Dark Mode Strategy

Approach: Invert semantic colors, not direct colors

/* Light Mode */ :root { --color-background: #ffffff; --color-surface: #f8f9fa; --color-text: #212529; --color-text-secondary: #6c757d; --color-border: #dee2e6; }

/* Dark Mode */ [data-theme="dark"] { --color-background: #1a1a1a; --color-surface: #2d2d2d; --color-text: #f8f9fa; --color-text-secondary: #adb5bd; --color-border: #495057;

/* Reduce saturation for less eye strain / --color-primary: #4da7ff; / Lighter than light mode / --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.5); / Deeper shadows */ }

Typography

Type Scale (Modular Scale)

Formula: base × ratio^n

Common Ratios:

  • 1.125 (Major Second): Subtle, dense

  • 1.25 (Major Third): Balanced ← Recommended

  • 1.333 (Perfect Fourth): Dynamic

  • 1.5 (Perfect Fifth): Dramatic

Digitaltableteur Scale (1.25 ratio):

Display: 80-128px (clamp) H1: 48px H2: 40px H3: 32px H4: 24px H5: 20px Body: 16px Small: 14px Caption: 12px

Font Pairing

Recommended Combinations:

Serif + Sans-Serif (Classic)

  • Headings: Playfair Display (serif)

  • Body: Inter (sans-serif)

Geometric + Humanist (Modern)

  • Headings: Montserrat (geometric)

  • Body: Open Sans (humanist)

Monospace + Sans (Technical)

  • Code: Fira Code (monospace)

  • UI: Roboto (sans-serif)

Digitaltableteur Stack:

--font-title: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; --font-body: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; --font-mono: 'Fira Code', 'Courier New', monospace;

Typographic Hierarchy

/* Display (Hero Headlines) / .display { font-size: var(--font-size-display); line-height: var(--line-height-tight); font-weight: var(--font-weight-bold); letter-spacing: -0.02em; / Tighter for large sizes */ }

/* H1 (Page Title) */ h1 { font-size: var(--font-size-4xl); line-height: var(--line-height-tight); font-weight: var(--font-weight-bold); }

/* H2 (Section Title) */ h2 { font-size: var(--font-size-3xl); line-height: var(--line-height-normal); font-weight: var(--font-weight-semibold); }

/* Body (Paragraph) / p { font-size: var(--font-size-base); line-height: var(--line-height-relaxed); font-weight: var(--font-weight-normal); max-width: 65ch; / Optimal reading width */ }

/* Small (Caption, Meta) */ small { font-size: var(--font-size-sm); line-height: var(--line-height-normal); color: var(--color-text-secondary); }

Readability Guidelines

  • Line Length: 45-75 characters (optimal: 65ch)

  • Line Height: 1.5× font size for body text

  • Paragraph Spacing: 1.5× line height

  • Letter Spacing: -0.02em for large text, 0em for body

Layout & Spacing

Grid System

12-Column Grid (flexible):

.container { max-width: 1200px; margin-inline: auto; padding-inline: var(--space-16); }

.grid { display: grid; grid-template-columns: repeat(12, 1fr); gap: var(--space-24); }

/* 3-column layout */ .col-4 { grid-column: span 4; }

/* Responsive */ @media (max-width: 768px) { .grid { grid-template-columns: 1fr; } .col-4 { grid-column: span 1; } }

Spacing System (8px Base)

Concept: All spacing uses multiples of 8px for visual consistency

2px: Micro (icon padding) 4px: Tiny (inline spacing) 8px: Small (tight elements) 12px: Compact (related items) 16px: Base (default spacing) 24px: Medium (section padding) 32px: Large (cards, panels) 48px: XL (major sections) 64px: XXL (hero sections)

Application:

/* Component Internal Spacing / .card { padding: var(--space-24); / 24px */ }

/* Component External Spacing / .card + .card { margin-block-start: var(--space-16); / 16px gap */ }

/* Section Spacing / .section { padding-block: var(--space-64); / 64px top/bottom */ }

Whitespace Principles

Law of Proximity: Related items closer, unrelated farther

Bad Example: ┌─────────────┐ │ Title │ ← 8px gap │ Subtitle │ ← 8px gap │ Author │ ← 8px gap (too uniform) │ Date │ └─────────────┘

Good Example: ┌─────────────┐ │ Title │ ← 4px gap (related) │ Subtitle │ ← 24px gap (separate group) │ Author │ ← 4px gap (related) │ Date │ └─────────────┘

Component Visual Design

Button Anatomy

┌────────────────────────────┐ │ [Icon] Label [Icon] │ ← Text: 14-16px, weight: 500-600 │ ↑ ↑ ↑ │ │ 8px 12px 8px │ ← Spacing └────────────────────────────┘ ↑ ↑ 12px padding 12px padding

Height: 40-48px (min 44px for touch) Border-radius: 8px

Button Hierarchy:

/* Primary (High emphasis) */ .btn-primary { background-color: var(--color-primary); color: white; font-weight: 600; box-shadow: var(--shadow-sm); }

.btn-primary:hover { background-color: var(--color-primary-600); box-shadow: var(--shadow-md); transform: translateY(-1px); }

/* Secondary (Medium emphasis) */ .btn-secondary { background-color: transparent; color: var(--color-primary); border: 2px solid var(--color-primary); }

/* Tertiary (Low emphasis) */ .btn-tertiary { background-color: transparent; color: var(--color-primary); text-decoration: underline; }

Card Design

.card { /* Structure */ background-color: var(--color-surface); border-radius: var(--radius-lg); padding: var(--space-24);

/* Depth */ box-shadow: var(--shadow-md);

/* Interaction */ transition: transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1), box-shadow 0.3s ease; }

.card:hover { transform: scale(1.02); box-shadow: var(--shadow-xl); }

/* Card Anatomy */ .card-header { margin-block-end: var(--space-16); }

.card-title { font-size: var(--font-size-xl); font-weight: var(--font-weight-semibold); color: var(--color-text); }

.card-content { font-size: var(--font-size-base); line-height: var(--line-height-relaxed); color: var(--color-text-secondary); }

.card-footer { margin-block-start: var(--space-24); padding-block-start: var(--space-16); border-block-start: 1px solid var(--color-border); }

Form Input Design

.input { /* Size */ min-height: 48px; padding: 12px 16px;

/* Typography */ font-size: var(--font-size-base); line-height: 1.5;

/* Visual */ background-color: var(--color-background); border: 2px solid var(--color-border); border-radius: var(--radius-md);

/* Interaction */ transition: all 0.2s ease; }

.input:focus { outline: none; border-color: var(--color-primary); box-shadow: 0 0 0 4px rgba(0, 102, 204, 0.1); /* Focus ring */ }

.input:invalid { border-color: var(--color-danger); }

.input:disabled { background-color: var(--color-surface); color: var(--color-text-secondary); cursor: not-allowed; }

/* Label */ .label { display: block; font-size: var(--font-size-sm); font-weight: var(--font-weight-medium); color: var(--color-text); margin-block-end: var(--space-8); }

/* Helper Text */ .help-text { font-size: var(--font-size-sm); color: var(--color-text-secondary); margin-block-start: var(--space-4); }

/* Error Message */ .error-message { font-size: var(--font-size-sm); color: var(--color-danger); margin-block-start: var(--space-4); display: flex; align-items: center; gap: var(--space-4); }

Iconography

Icon System Guidelines

Size Scale:

16px: Inline with text 20px: Buttons, inputs 24px: Navigation, cards 32px: Feature highlights 48px: Empty states, placeholders

Style:

  • Stroke width: 2px (consistent across set)

  • Corner radius: 2px (rounded, friendly)

  • Grid: 24×24px with 2px padding

Usage:

import { MagnifyingGlass, User, XCircle } from '@phosphor-icons/react';

// Default size (24px) <MagnifyingGlass />

// Custom size <MagnifyingGlass size={32} weight="bold" />

// With color <User color="var(--color-primary)" />

Accessibility:

// Decorative icon (hidden from screen readers) <MagnifyingGlass aria-hidden="true" />

// Functional icon (needs label) <button aria-label="Search"> <MagnifyingGlass /> </button>

Animation & Motion

Animation Principles

  • Purposeful: Motion guides attention or provides feedback

  • Subtle: Enhance, don't distract (200-400ms)

  • Natural: Use easing curves, not linear

  • Respectful: Honor prefers-reduced-motion

Easing Functions

/* Material Design Easing / --ease-standard: cubic-bezier(0.4, 0.0, 0.2, 1); / Default / --ease-decelerate: cubic-bezier(0.0, 0.0, 0.2, 1); / Enter screen / --ease-accelerate: cubic-bezier(0.4, 0.0, 1, 1); / Exit screen */

/* Elastic (playful) */ --ease-elastic: cubic-bezier(0.34, 1.56, 0.64, 1);

/* Usage */ .button { transition: transform 0.3s var(--ease-standard); }

.button:hover { transform: scale(1.05); }

Common Animations

Fade In:

@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }

.fade-in { animation: fadeIn 0.3s var(--ease-standard); }

Slide Up:

@keyframes slideUp { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } }

.slide-up { animation: slideUp 0.4s var(--ease-decelerate); }

Gradient Flow (Digitaltableteur):

@keyframes gradient-move { 0%, 100% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } }

.gradient-text { background: linear-gradient(120deg, #667eea, #764ba2, #f093fb); background-size: 200% 200%; animation: gradient-move 4s ease-in-out infinite; background-clip: text; -webkit-text-fill-color: transparent; }

Reduced Motion

/* Respect user preference */ @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } }

Responsive Design

Breakpoints

/* Mobile First Approach */

/* Small (mobile) - default, no media query */ .container { padding: var(--space-16); }

/* Medium (tablet) - 768px+ */ @media (min-width: 768px) { .container { padding: var(--space-24); } }

/* Large (desktop) - 1024px+ */ @media (min-width: 1024px) { .container { padding: var(--space-32); max-width: 1200px; } }

/* Extra Large (wide desktop) - 1440px+ */ @media (min-width: 1440px) { .container { max-width: 1400px; } }

Fluid Typography

/* Scales smoothly between breakpoints / h1 { font-size: clamp(2rem, 5vw + 1rem, 4rem); / Min: 32px, Ideal: 5vw+16px, Max: 64px */ }

p { font-size: clamp(1rem, 1vw + 0.75rem, 1.25rem); /* Min: 16px, Ideal: 1vw+12px, Max: 20px */ }

Design-to-Dev Handoff (Figma)

Figma Best Practices

Layer Naming:

✅ Good: button-primary-large ❌ Bad: Rectangle 23

Component Organization:

Components/ ├── Foundations/ │ ├── Colors │ ├── Typography │ └── Spacing ├── Atoms/ │ ├── Button │ ├── Input │ └── Icon ├── Molecules/ │ ├── Card │ └── Form Field └── Organisms/ ├── Header └── Footer

Auto Layout (Flexbox equivalent):

  • Use for all components

  • Set spacing, padding explicitly

  • Configure resizing behavior

Variants (Component states):

Button: ├── Variant: Primary, Secondary, Tertiary ├── Size: Small, Medium, Large ├── State: Default, Hover, Active, Disabled └── Icon: Left, Right, None

Handoff Checklist

  • All text layers use shared text styles

  • All colors reference design tokens (not hex values)

  • Spacing uses 8px grid

  • Components use Auto Layout

  • All states documented (hover, active, disabled)

  • Responsive behavior specified

  • Accessibility notes added (alt text, ARIA labels)

  • Interactive prototype for complex flows

  • Developer mode enabled (CSS code snippets)

Visual Hierarchy Techniques

Size & Scale

Largest: Display Headlines (guide attention immediately) ↓ Large: Page Titles (establish context) ↓ Medium: Section Headings (organize content) ↓ Base: Body Text (readable, comfortable) ↓ Small: Captions, Meta (supporting info)

Weight & Contrast

Boldest: CTAs, Primary Actions (demand action) ↓ Bold: Headings (structure) ↓ Semibold: Subheadings, Labels (clarity) ↓ Regular: Body (readability) ↓ Light: De-emphasized Text (background info)

Color Emphasis

High Contrast: Black on White (critical info) Medium Contrast: Gray on White (secondary info) Low Contrast: Light Gray on White (tertiary info) Accent Color: Brand Color (CTAs, highlights)

Brand Application (Digitaltableteur)

Brand Colors

--accent-pink: #ff006e; --accent-purple: #8338ec; --accent-cyan: #00d9ff; --accent-teal: #06ffa5; --accent-yellow: #ffbe0b; --accent-violet: #7209b7;

/* Gradient (Signature) */ --home-gradient: linear-gradient(120deg, #667eea 0%, #764ba2 50%, #f093fb 100%);

Section Accent Pattern

// Rotate accent colors for visual rhythm <section className={styles.sectionAccentPink}> {/* Content */} </section>

<section className={styles.sectionAccentCyan}> {/* Content */} </section>

<section className={styles.sectionAccentYellow}> {/* Content */} </section>

Gradient Text (CTAs)

.gradientText { background: var(--home-gradient); background-size: 200% 200%; background-clip: text; -webkit-background-clip: text; -webkit-text-fill-color: transparent; animation: gradient-move 4s ease-in-out infinite; }

Micro-Interactions (Visual Feedback)

Button States

.button { /* Idle */ background-color: var(--color-primary); transform: scale(1); transition: all 0.2s ease; }

.button:hover { /* Hover */ background-color: var(--color-primary-600); transform: scale(1.05); box-shadow: var(--shadow-lg); }

.button:active { /* Active (pressed) */ transform: scale(0.98); box-shadow: var(--shadow-sm); }

.button:focus-visible { /* Focus (keyboard) */ outline: 4px solid rgba(0, 102, 204, 0.3); outline-offset: 2px; }

.button:disabled { /* Disabled */ background-color: var(--color-surface); color: var(--color-text-secondary); cursor: not-allowed; transform: scale(1); }

Loading States

// Skeleton loader <div className={styles.skeleton} />

/* CSS */ .skeleton { background: linear-gradient( 90deg, var(--color-surface) 0%, var(--color-border) 50%, var(--color-surface) 100% ); background-size: 200% 100%; animation: loading 1.5s ease-in-out infinite; }

@keyframes loading { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }

When to Use This Skill

Activate this skill when:

  • Designing UI components or patterns

  • Creating design systems or style guides

  • Choosing colors, typography, or spacing

  • Building visual hierarchies

  • Designing for accessibility (color contrast)

  • Creating design tokens or CSS variables

  • Working with Figma or design tools

  • Defining animation and motion

  • Designing responsive layouts

  • Creating brand application guidelines

  • Designing micro-interactions

  • Conducting design QA or reviews

  • Handing off designs to developers

Remember: Consistency and accessibility are non-negotiable. Always test designs with real users and assistive technologies.

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

General

ux-design

No summary provided by upstream source.

Repository SourceNeeds Review
General

ui-design

No summary provided by upstream source.

Repository SourceNeeds Review
General

ui-design

No summary provided by upstream source.

Repository SourceNeeds Review
General

ui-design

No summary provided by upstream source.

Repository SourceNeeds Review