ui-design-brain-cursor-skill

Cursor skill that gives AI agents production-grade UI component knowledge with best practices, layout patterns, and design-system conventions for 60+ interface components

Skill file

Preview skill file
---
name: ui-design-brain-cursor-skill
description: Cursor skill that gives AI agents production-grade UI component knowledge with best practices, layout patterns, and design-system conventions for 60+ interface components
triggers:
  - "build a UI component following best practices"
  - "create a settings page with proper layout"
  - "design a dashboard with modern patterns"
  - "generate production-ready interface code"
  - "implement a data table with proper structure"
  - "build a form with accessibility standards"
  - "create a navigation component following conventions"
  - "design a modal dialog with best practices"
---

# UI Design Brain Cursor Skill

> Skill by [ara.so](https://ara.so) — Design Skills collection.

This skill gives Cursor AI real UI component knowledge — curated best practices, proven layout patterns, and design-system conventions for 60+ interface components — so it generates production-grade UI instead of generic output.

## What This Skill Provides

**Component Knowledge Base**: 60 production-ready component patterns sourced from [component.gallery](https://component.gallery) with:

- **Best practices** per component (accessibility, sizing, behavior)
- **Common layouts** — proven arrangements
- **Aliases** — recognizes components by any name
- **Anti-patterns** — specific things to avoid
- **Design philosophy** — modern, minimal, SaaS-quality standards

**Design Directions**: 5 built-in style presets:
- Modern SaaS (default) — clean, spacious, professional
- Apple-level Minimal — ultra-clean with generous whitespace
- Enterprise/Corporate — information-dense, keyboard-navigable
- Creative/Portfolio — bold, expressive, editorial
- Data Dashboard — optimized for scannability

## Installation

### Option A: Personal Skill (All Projects)

```bash
git clone https://github.com/carmahhawwari/ui-design-brain.git \
  ~/.cursor/skills/ui-design-brain
```

### Option B: Project Skill (Shared with Team)

```bash
git clone https://github.com/carmahhawwari/ui-design-brain.git \
  .cursor/skills/ui-design-brain
```

### Option C: Manual Installation

Copy `SKILL.md` and `components.md` into:
- `~/.cursor/skills/ui-design-brain/` (personal), or
- `.cursor/skills/ui-design-brain/` (project)

## How to Use

Once installed, the skill activates automatically when you ask Cursor to build UI. **No explicit reference needed.**

### Basic Usage

Ask naturally — the skill identifies components and applies best practices:

```
Build a settings page with sidebar navigation, toggle preferences, and profile section
```

```
Create a data table with search, filters, sortable columns, and pagination
```

```
Design a SaaS dashboard with KPI cards, chart area, and activity feed
```

### Requesting Specific Design Directions

```
Build a pricing page with Apple-minimal aesthetic
```

```
Create an enterprise dashboard with dense information layout
```

```
Design a creative portfolio hero section
```

## Component Coverage (60 Components)

| Category | Components |
|----------|-----------|
| **Input** | Button, Checkbox, Radio button, Text input, Textarea, Select, Combobox, Date input, Datepicker, File upload, Search input, Slider, Toggle, Color picker, Rich text editor |
| **Navigation** | Navigation, Breadcrumbs, Tabs, Pagination, Stepper, Skip link, Tree view |
| **Layout** | Card, Stack, Separator, Header, Footer, Drawer, Modal, Popover |
| **Content** | Heading, Image, Video, Quote, List, Table, Hero |
| **Feedback** | Alert, Toast, Progress bar, Progress indicator, Spinner, Skeleton, Empty state, Tooltip |
| **Data** | Badge, Avatar, Rating, Icon |
| **Forms** | Form, Fieldset, Label, Button group, Segmented control |
| **Advanced** | Accordion, Carousel, Dropdown menu, Visually hidden |

## Key Patterns & Best Practices

### Accessibility-First Approach

The skill enforces:

```tsx
// Modal — focus trapping
function Modal({ isOpen, onClose, children }) {
  const firstFocusableRef = useRef(null);
  
  useEffect(() => {
    if (isOpen) {
      firstFocusableRef.current?.focus();
      // Trap focus within modal
      document.body.style.overflow = 'hidden';
    }
    return () => {
      document.body.style.overflow = '';
    };
  }, [isOpen]);

  return (
    <div 
      role="dialog" 
      aria-modal="true"
      className={isOpen ? 'modal-open' : 'modal-closed'}
    >
      <button ref={firstFocusableRef} onClick={onClose} aria-label="Close">
        ×
      </button>
      {children}
    </div>
  );
}
```

```tsx
// Button — accessible states
<button
  type="button"
  disabled={isLoading}
  aria-busy={isLoading}
  aria-label={isLoading ? 'Loading...' : 'Submit'}
  className="btn-primary"
>
  {isLoading ? <Spinner /> : 'Submit'}
</button>
```

### Component Composition Patterns

**Data Table with Full Features**:

```tsx
function DataTable({ data, columns }) {
  const [sortConfig, setSortConfig] = useState({ key: null, direction: 'asc' });
  const [filters, setFilters] = useState({});
  const [page, setPage] = useState(1);
  const [searchQuery, setSearchQuery] = useState('');

  const filteredData = useMemo(() => {
    return data
      .filter(row => 
        Object.entries(filters).every(([key, value]) => 
          !value || row[key] === value
        )
      )
      .filter(row =>
        !searchQuery || 
        Object.values(row).some(val => 
          String(val).toLowerCase().includes(searchQuery.toLowerCase())
        )
      );
  }, [data, filters, searchQuery]);

  const sortedData = useMemo(() => {
    if (!sortConfig.key) return filteredData;
    return [...filteredData].sort((a, b) => {
      if (a[sortConfig.key] < b[sortConfig.key]) {
        return sortConfig.direction === 'asc' ? -1 : 1;
      }
      if (a[sortConfig.key] > b[sortConfig.key]) {
        return sortConfig.direction === 'asc' ? 1 : -1;
      }
      return 0;
    });
  }, [filteredData, sortConfig]);

  const paginatedData = sortedData.slice(
    (page - 1) * PAGE_SIZE,
    page * PAGE_SIZE
  );

  return (
    <div className="data-table-container">
      <div className="table-controls">
        <SearchInput 
          value={searchQuery}
          onChange={setSearchQuery}
          placeholder="Search..."
        />
        <FilterBar filters={filters} onChange={setFilters} />
      </div>
      
      <table role="table" aria-label="Data table">
        <thead>
          <tr>
            {columns.map(col => (
              <th 
                key={col.key}
                onClick={() => handleSort(col.key)}
                aria-sort={sortConfig.key === col.key ? sortConfig.direction : 'none'}
              >
                {col.label}
                <SortIcon direction={sortConfig.key === col.key ? sortConfig.direction : null} />
              </th>
            ))}
          </tr>
        </thead>
        <tbody>
          {paginatedData.map(row => (
            <tr key={row.id}>
              {columns.map(col => (
                <td key={col.key}>{row[col.key]}</td>
              ))}
            </tr>
          ))}
        </tbody>
      </table>
      
      <Pagination
        currentPage={page}
        totalPages={Math.ceil(sortedData.length / PAGE_SIZE)}
        onPageChange={setPage}
      />
    </div>
  );
}
```

**Settings Page Layout**:

```tsx
function SettingsPage() {
  return (
    <div className="settings-layout">
      <aside className="settings-sidebar">
        <nav aria-label="Settings navigation">
          <a href="#profile" className="active">Profile</a>
          <a href="#security">Security</a>
          <a href="#notifications">Notifications</a>
          <a href="#billing">Billing</a>
        </nav>
      </aside>
      
      <main className="settings-content">
        <section id="profile">
          <Heading level={2}>Profile Settings</Heading>
          
          <Form onSubmit={handleSubmit}>
            <Fieldset legend="Personal Information">
              <Label htmlFor="name">Full Name</Label>
              <TextInput id="name" name="name" required />
              
              <Label htmlFor="email">Email</Label>
              <TextInput id="email" type="email" name="email" required />
              
              <Label htmlFor="avatar">Profile Picture</Label>
              <FileUpload 
                id="avatar" 
                accept="image/*"
                maxSize={5 * 1024 * 1024}
              />
            </Fieldset>
            
            <Fieldset legend="Preferences">
              <Toggle
                id="newsletter"
                label="Subscribe to newsletter"
                checked={preferences.newsletter}
                onChange={handleToggle}
              />
              
              <Toggle
                id="dark-mode"
                label="Enable dark mode"
                checked={preferences.darkMode}
                onChange={handleToggle}
              />
            </Fieldset>
            
            <Button type="submit" variant="primary">
              Save Changes
            </Button>
          </Form>
        </section>
      </main>
    </div>
  );
}
```

**Dashboard with KPIs**:

```tsx
function Dashboard() {
  return (
    <div className="dashboard-grid">
      <header className="dashboard-header">
        <Heading level={1}>Analytics Dashboard</Heading>
        <DateRangePicker onChange={handleDateChange} />
      </header>
      
      <section className="kpi-cards">
        <Card>
          <div className="kpi-value">$24,532</div>
          <div className="kpi-label">Revenue</div>
          <div className="kpi-change positive">+12.5%</div>
        </Card>
        
        <Card>
          <div className="kpi-value">1,243</div>
          <div className="kpi-label">New Users</div>
          <div className="kpi-change positive">+8.2%</div>
        </Card>
        
        <Card>
          <div className="kpi-value">89.2%</div>
          <div className="kpi-label">Conversion Rate</div>
          <div className="kpi-change negative">-2.1%</div>
        </Card>
      </section>
      
      <Card className="chart-area">
        <Heading level={2}>Revenue Trend</Heading>
        <LineChart data={revenueData} />
      </Card>
      
      <aside className="activity-feed">
        <Heading level={2}>Recent Activity</Heading>
        <List>
          {activities.map(activity => (
            <li key={activity.id}>
              <Avatar src={activity.user.avatar} size="sm" />
              <div>
                <div className="activity-text">{activity.text}</div>
                <time className="activity-time">{activity.timestamp}</time>
              </div>
            </li>
          ))}
        </List>
      </aside>
    </div>
  );
}
```

## Anti-Patterns to Avoid

The skill enforces avoidance of:

1. **Generic div soup** — Use semantic HTML (`<nav>`, `<main>`, `<article>`)
2. **Missing ARIA labels** — All interactive elements must be labeled
3. **Non-keyboard-accessible custom controls** — Handle Enter, Space, Arrow keys
4. **Hardcoded breakpoints without mobile-first** — Use responsive design
5. **Loading states without feedback** — Always show spinners/skeletons
6. **Forms without validation feedback** — Show errors inline
7. **Modals without focus management** — Trap and restore focus
8. **Tables without sortable headers** — Data tables should be interactive
9. **Missing empty states** — Handle zero-data scenarios gracefully
10. **Inconsistent spacing** — Use design token system

## Design System Tokens

The skill assumes you have CSS variables or a token system:

```css
/* Spacing scale */
--space-xs: 0.25rem;   /* 4px */
--space-sm: 0.5rem;    /* 8px */
--space-md: 1rem;      /* 16px */
--space-lg: 1.5rem;    /* 24px */
--space-xl: 2rem;      /* 32px */
--space-2xl: 3rem;     /* 48px */

/* Typography scale */
--text-xs: 0.75rem;    /* 12px */
--text-sm: 0.875rem;   /* 14px */
--text-base: 1rem;     /* 16px */
--text-lg: 1.125rem;   /* 18px */
--text-xl: 1.25rem;    /* 20px */
--text-2xl: 1.5rem;    /* 24px */
--text-3xl: 1.875rem;  /* 30px */

/* Colors */
--color-primary: #3b82f6;
--color-success: #10b981;
--color-warning: #f59e0b;
--color-error: #ef4444;
--color-neutral-50: #f9fafb;
--color-neutral-900: #111827;

/* Border radius */
--radius-sm: 0.25rem;
--radius-md: 0.375rem;
--radius-lg: 0.5rem;
--radius-full: 9999px;
```

## Troubleshooting

### Skill Not Activating

1. **Check installation path**:
   ```bash
   ls ~/.cursor/skills/ui-design-brain/
   # Should show: SKILL.md, components.md, README.md
   ```

2. **Restart Cursor** after installation

3. **Verify skill is loaded** — check Cursor's skill settings

### Generic Output Still Generated

**Be explicit in your request**:
```
Build a production-ready settings page with proper accessibility
```

Instead of:
```
Make a settings page
```

### Missing Component Knowledge

If a component isn't covered, reference it explicitly:
```
Build a notification center using toast patterns and empty state best practices
```

### Style Conflicts

If generated styles conflict with your design system:
```
Build this form using our existing Tailwind classes and design tokens
```

## Advanced Usage

### Custom Component Extensions

Ask the agent to extend existing patterns:

```
Create a multi-step wizard using stepper, form, and button group patterns with validation
```

```
Build a kanban board using card, drag-and-drop, and empty state patterns
```

### Framework-Specific Generation

Specify your stack:

```
Build a Next.js server component data table with React Server Actions for mutations
```

```
Create a Vue 3 composition API modal with TypeScript and proper teleport usage
```

### Performance Optimization

```
Generate a virtualized table for 10,000+ rows using windowing techniques
```

```
Create a lazy-loaded image gallery with progressive enhancement
```

## File Structure

```
ui-design-brain/
├── SKILL.md          # Main AI agent instructions
├── components.md     # 60-component reference
├── LICENSE.txt       # MIT license
└── README.md         # Human documentation
```

## Contributing

To extend component coverage:

1. Edit `components.md` following existing format:
   - Component name
   - Aliases
   - Description
   - Best practices (bullet list)
   - Common layouts (with code examples)

2. Add to quick reference in `SKILL.md` if commonly used

3. Keep total lines under 500 in `SKILL.md`

## License

MIT — See LICENSE.txt

Component data sourced from [component.gallery](https://component.gallery)

---

**Quick Reference Card**

| Task | Natural Prompt |
|------|---------------|
| Settings page | "Build settings page with sidebar nav and toggles" |
| Data table | "Create sortable table with search and filters" |
| Dashboard | "Design SaaS dashboard with KPIs and chart area" |
| Form | "Build multi-step form with validation" |
| Modal | "Create accessible modal dialog" |
| Navigation | "Build responsive header with dropdown menu" |

Source

Creator's repository · aradotso/design-skills

View on GitHub

Security

Security checks in progress
Results will appear here once audits complete
Checked by 3 independent security firms
Does it try to trick the AI?Not yet checkedPending · Gen Agent Trust Hub
Does it sneak in hidden code?Not yet checkedPending · Socket
Does it have known bugs?Not yet checkedPending · Snyk