Agent skill

Ui4

by payloadcms in payloadcms/payload

Manually invoked skill for reskinning Payload UI components.

MITAuto-check passedFrontend & Design

Install Ui4

skills CLI
$ npx skills add payloadcms/payload --skill ui4 -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install payloadcms/payload ui4 --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/payloadcms/payload.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/ui4 .claude/skills/ui4 && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
ui4
GitHub stars
45k
Token cost
~5.8k tokens
SKILL.md length
1,755 words
Files
1
Skills in repo
9
Repo updated
First seen
Licence
MIT

At a glance

Manually invoked skill for reskinning Payload UI components.

  • Works in 7 steps: Icon Scan → SCSS → CSS Migration → Analyze Figma Component Variants → …
  • Frontend & Design work in your project
  • SKILL.md covers Process, CSS Structure, Red Flags - STOP and Step 7: Write Variant E2E Tests, plus 2 more sections
  • Calls pnpm

What it does

Ui4 is an agent skill from payloadcms/payload. Manually invoked skill for reskinning Payload UI components. Requires Figma URL. Usage: /ui4

Its SKILL.md is about 5.8k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Frontend & Design. It works with Figma, Payload CMS and React. The repository describes itself as: Payload is the open-source, fullstack Next.js framework, giving you instant backend superpowers. Get a full TypeScript backend and admin panel instantly. Use Payload as a… The licence is MIT.

When your agent uses it

  • Frontend & Design work in your project

Example prompts

  • “/ui4”

Workflow steps

7 steps, taken from the step headings in SKILL.md.

  1. Icon Scan
  2. SCSS → CSS Migration
  3. Analyze Figma Component Variants
  4. Restyle to Match Figma
  5. Ensure Test Collection Has All Variants
  6. Verify with Playwright (LOOP)
  7. User Confirmation

What it can do on your machine

Read from SKILL.md and the folder at commit c66a7be. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • pnpm

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use pnpm, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Ui4 loads about 5.8k tokens when it runs. Until then it costs about 24 tokens; SKILL.md has 1,755 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~24
When it runs · the whole SKILL.md, loaded when a task matches
~5.8k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from payloadcms/payload at commit c66a7be, republished under its MIT licence (© payloadcms). 1,755 words, ~5,805 tokens.

Download SKILL.mdSave it as .claude/skills/ui4/SKILL.md (or your agent's skills folder).
name
ui4
description
Manually invoked skill for reskinning Payload UI components. Requires Figma URL. Usage: /ui4

Payload UI Reskin (ui4)

Figma URL is REQUIRED. If not provided, ask before proceeding.


Process

Step 0: Icon Scan

Goal: Identify icon dependencies before starting work.

  1. Scan component files for icon imports:

    grep -E "from.*icons|import.*Icon" packages/ui/src/elements/ComponentName/
  2. List existing icons in packages/ui/src/icons/:

    • Each icon has its own folder with index.tsx + index.css
  3. Compare Figma design to available icons:

    • Does the design use icons not currently in the component?
    • Does the design use icons that don't exist yet?
  4. Document findings:

    • Existing & used: No action needed
    • Existing but not imported: Will need to add import
    • Missing from codebase: Flag for user — need to source/create icon

Figma Icons Source:

When updating or creating icons, reference the Figma icon library at:

~/figma/figma/fpl/icons/src/icons/

Icon naming convention: icon-{size}-{name}.tsx (e.g., icon-16-close.tsx, icon-24-chevron-down.tsx)

To find the correct icon:

  1. Note the icon name from Figma design (e.g., "close", "chevron-down")
  2. Check both 16px and 24px variants if they exist
  3. Read the corresponding files and extract the SVG paths for each size

Icon implementation rules:

  1. Props: Icon components MUST accept these props (keep existing props when updating):

    typescript
    type IconProps = {
      readonly className?: string
      readonly size?: 16 | 24 // Add more sizes as needed
      // ... keep any existing component-specific props
    }
  2. Multi-size support: Store path data keyed by size:

    typescript
    const paths = {
      16: 'M4.854 4.146...', // from icon-16-{name}.tsx
      24: 'M6.854 6.146...', // from icon-24-{name}.tsx
    }
  3. SVG rendering: Use the size prop to select path and viewBox:

    tsx
    <svg width={size} height={size} viewBox={`0 0 ${size} ${size}`} fill="none">
      <path d={paths[size]} fill="currentColor" />
    </svg>
  4. Payload conventions:

    • Use fill="currentColor" instead of fill="var(--color-icon)"
    • Use fillRule and clipRule (React camelCase) instead of kebab-case
    • Default size should match most common usage (typically 24)
  5. Reference implementation: See packages/ui/src/icons/Chevron/index.tsx for the pattern.

If icons are missing from Figma source: Ask user how to proceed before continuing.


Step 1: SCSS → CSS Migration

Goal: Syntax conversion only. Component must look IDENTICAL after.

  1. Read component files: packages/ui/src/elements/ComponentName/ or packages/ui/src/fields/ComponentName/
  2. Create index.css with converted styles:
    • $var → var(--token)
    • Keep CSS nesting with & (preferred)
    • Remove @use/@import (tokens are global)
    • Inline any mixins
  3. Update import: import './index.scss' → import './index.css'
  4. Delete index.scss
  5. Wrap in @layer payload-default {}
  6. Convert legacy var(--base) to --spacer tokens (see below)
  7. Check for SCSS-only variables (see below)

SCSS Variable Dependencies

CRITICAL: The packages/ui/src/scss/ folder has been removed. All global tokens now live in packages/ui/src/css/. Any CSS variable you use must exist there.

Before using a variable, verify it exists in the CSS folder:

bash
grep -r "variable-name" packages/ui/src/css/

If a variable is only in SCSS:

  1. Check if there's an equivalent in the CSS folder
  2. If not, add it to the appropriate CSS file:
    • spacing.css — spacers, gutters, layout spacing, breakpoints
    • colors.css — color tokens
    • typography.css — font tokens
    • radius.css — border-radius tokens
    • utilities.css — accessibility, misc utilities

Common SCSS-only variables to watch for:

SCSS VariableCSS Equivalent / Action
--spacing-view-bottomDefined in spacing.css
--breakpoint-m-widthDefined in spacing.css (1024px)
--breakpoint-s-widthDefined in spacing.css (768px)
--gutter-hDefined in spacing.css
$breakpoint-m-widthUse var(--breakpoint-m-width) in media queries
@include mid-breakUse @media (max-width: 1024px)
@include small-breakUse @media (max-width: 768px)

Legacy Token Migration: var(--base) → --spacer

What is --base? A legacy spacing token equal to 20px (1.25rem). It must be replaced with --spacer-* tokens.

Spacer token values:

TokenValuePixels
--spacer-000px
--spacer-14px4px
--spacer-28px8px
--spacer-2-512px12px
--spacer-316px16px
--spacer-424px24px
--spacer-532px32px
--spacer-640px40px

Conversion strategy:

  1. Direct match: If the result equals a spacer token, use it directly:

    css
    /* Before: var(--base) = 20px → closest is --spacer-3 (16px) or --spacer-4 (24px) */
    padding: var(--base);
    
    /* After: Choose semantically correct size */
    padding: var(--spacer-4); /* if 24px is acceptable */
  2. Calculated values: When exact pixel value is important, use calc():

    css
    /* Before: calc(var(--base) * 0.5) = 10px */
    gap: calc(var(--base) * 0.5);
    
    /* After: calc(var(--spacer-1) * 2.5) = 10px */
    gap: calc(var(--spacer-1) * 2.5);
  3. ALWAYS round to nearest spacer token. Never use calc() to preserve non-standard pixel values. Round all calculated values to the nearest token:

    Pixel RangeTokenNotes
    0-2px--spacer-0Use 0
    3-6px--spacer-1 (4px)5-6px rounds to 4px
    7-10px--spacer-2 (8px)10px rounds DOWN to 8px
    11-14px--spacer-2-5 (12px)13.33px rounds to 12px
    15-20px--spacer-3 (16px)15px, 20px both round to 16px
    21-28px--spacer-4 (24px)
    29-36px--spacer-5 (32px)30px rounds to 32px
    37-48px--spacer-6 (40px)
  4. Common var(--base) conversions (base = 20px):

    OriginalPixelsRounded Token
    var(--base) * 0.255px--spacer-1 (4px)
    var(--base) * 0.36px--spacer-1 (4px)
    var(--base) * 0.48px--spacer-2
    var(--base) * 0.510px--spacer-2 (8px)
    var(--base) * 0.612px--spacer-2-5
    var(--base) / 1.513.3px--spacer-2-5 (12px)
    var(--base) * 0.7515px--spacer-3 (16px)
    var(--base) * 0.816px--spacer-3
    var(--base)20px--spacer-3 (16px) or --spacer-4 (24px)
    var(--base) * 1.224px--spacer-4
    var(--base) * 1.530px--spacer-5 (32px)
    var(--base) * 240px--spacer-6
    var(--base) * 360pxcalc(var(--spacer-4) * 2.5) — only use calc for values > 40px

    Rule: For values ≤ 40px, ALWAYS use a single token. For values > 40px, use calc() with a spacer token.

  5. Check Figma design: The best approach is to check the Figma design for the intended spacing value and use the matching --spacer-* token directly.


CRITICAL: SCSS nesting patterns that DON'T work in CSS:

1. BEM element concatenation (&__element):

scss
// SCSS - WORKS (produces .block__element)
.block {
  &__element {
    color: red;
  }
  &__other {
    color: blue;
  }
}
css
/* CSS - DOES NOT WORK! &__element is invalid */
/* You must use flat selectors: */
.block { ... }
.block__element { color: red; }
.block__other { color: blue; }

2. BEM modifier concatenation (&--modifier):

scss
// SCSS - WORKS (produces .block--active)
.block {
  &--active {
    background: blue;
  }
}
css
/* CSS - DOES NOT WORK! Use flat selector: */
.block { ... }
.block--active { background: blue; }

3. Parent reference from child:

scss
// SCSS - WORKS
.child {
  opacity: 0.5;
  .parent--active & {
    opacity: 1;
  }
}
css
/* CSS - DOES NOT WORK! Restructure: */
.child {
  opacity: 0.5;
}
.parent--active .child {
  opacity: 1;
}

What DOES work in CSS nesting:

  • &:hover, &:focus, &:active (pseudo-classes)
  • &::before, &::after (pseudo-elements)
  • .parent { .child { } } (descendant nesting with space)

Migration rule: Convert all &__ and &-- to flat BEM selectors.

Post-migration validation: After creating the CSS file, run the ui4-review skill to catch any remaining violations (SCSS nesting patterns, hardcoded values, legacy variables). Fix any issues before proceeding.

Step 2: Analyze Figma Component Variants

Goal: Understand ALL visual states before implementing CSS.

  1. Get metadata first to discover variants:

    mcp_figma2_get_metadata(fileKey, nodeId)
  2. Parse variant properties from symbol names. Common patterns:

    • State=Default, Validation=None, Selected=false, Read Only=false
    • Properties often include: State, Validation, Selected, Disabled, Read Only, Size
  3. Build a variant matrix:

    StateValidationSelectedRead OnlyCSS Mapping
    DefaultNonefalsefalsebase styles
    HoverNonefalsefalse:hover
    FocusNonefalsefalse:focus-visible
    DefaultInvalidfalsefalse.error or &--error
    DefaultNonetruefalse.is-selected
    DefaultNonefalsetrue.read-only, [disabled]
  4. Fetch design context for key variants (in parallel):

    • Default unselected
    • Selected
    • Hover
    • Focus
    • Invalid/Error
    • Disabled/Read-only
    mcp_figma2_get_design_context(fileKey, variantNodeId)
  5. Compare visual differences between variants:

    • Border color changes?
    • Background color changes?
    • Inner element visibility/opacity?
    • Focus ring/outline?
    • Text color changes?

If access fails: STOP. Ask user to share file.

Step 3: Restyle to Match Figma
  1. Read token files (do this BEFORE writing CSS):

    • packages/ui/src/css/spacing.css — spacer tokens
    • packages/ui/src/css/colors.css — color tokens
    • packages/ui/src/css/typography.css — text tokens
    • packages/ui/src/css/radius.css — border-radius tokens
    • packages/ui/src/css/utilities.css — accessibility tokens
  2. Update styles using tokens from files:

    • Colors: --bg-*, --text-*, --icon-*, --border-*
    • Spacing: --spacer-* (ALWAYS check file for matching value)
    • Typography: --text-body-*, --text-heading-*
    • Radius: --radius-none/small/medium/large/full
    • Focus states: --accessibility-focus-color (NEVER use --color-border-selected directly)
  3. Focus state rules:

    • Always use --accessibility-focus-color for focus outlines/borders
    • Use :focus-visible (not :focus) for keyboard-only focus
    • Standard focus outline: outline: 1px solid var(--accessibility-focus-color)
    • For parent containers: use :has(:focus-visible) to detect child focus
  4. Use canonical shorthands — see the shorthand table in .agents/skills/ui4-review/SKILL.md.

  5. Color rules — NEVER GUESS:

    • Always extract exact token from Figma design context — the get_design_context response includes CSS with token names
    • Don't assume hierarchy — e.g., don't assume "less prominent = tertiary". Check the design.
    • When creating new elements (icons, buttons, etc.), fetch the specific Figma node to get correct colors
    • If Figma shows a raw hex value, map it to the closest token and note this for user review
  6. Spacing rules:

    • First choice: use --spacer-* token
    • If no match: use rem and tell user
    • NEVER use px (except 1px borders)
Show full SKILL.md (850 more words)Show less
Step 4: Ensure Test Collection Has All Variants

Goal: Before visual verification, ensure the test collection has field variants for all states.

  1. Read the test collection config:

    test/v4/collections/{ComponentName}/index.ts
  2. Check for required variants based on Figma variant matrix from Step 2:

    Figma VariantRequired Field Config
    Default{ name: 'default', type: 'component' }
    Required{ name: 'required', type: 'component', required: true }
    Disabled{ name: 'disabled', type: 'component', admin: { disabled: true }, defaultValue: '...' }
    Read Only{ name: 'readOnly', type: 'component', admin: { readOnly: true }, defaultValue: '...' }
    With Description{ name: 'withDescription', type: 'component', admin: { description: 'Help text' } }
  3. Add missing variants if any are missing. Include defaultValue for disabled/readOnly so there's visible content to test.

  4. Restart dev server if collection was modified: pnpm run dev v4


Step 5: Verify with Playwright (LOOP)

Dev Server: Use pnpm run dev v4 when working on field components. The test/v4 suite has dedicated collections for each field type with various states (default, required, disabled).

URL Pattern:

  • Fields: http://localhost:3000/admin/collections/{field-type}-fields/create
  • Elements: Use the appropriate page that displays the element

Handling Modal Dialogs (beforeunload):

When the browser has unsaved changes, a "beforeunload" dialog may block ALL Playwright operations. You'll see this error pattern:

### Error
Error: Tool "browser_snapshot" does not handle the modal state.
### Modal state
- ["beforeunload" dialog with message ""]: can be handled by browser_handle_dialog

BEFORE retrying any operation, you MUST dismiss the dialog:

  1. Call browser_handle_dialog({ accept: true }) to dismiss
  2. Then retry your intended operation (navigate, snapshot, screenshot, etc.)

If the dialog persists after handling, call browser_close() to close the tab, then browser_navigate to reopen the page fresh.

Verification Steps:

  1. Navigate: browser_navigate to component page
  2. Screenshot: browser_take_screenshot({ fullPage: true })
  3. Compare to Figma design
  4. Check:
    • Padding correct?
    • Margin correct?
    • Gap correct?
    • Flex alignment correct?
    • Colors match?
  5. Verify ALL variant states:
    • Default state matches Figma default variant?
    • Hover state matches Figma hover variant? (use browser_hover)
    • Focus state matches Figma focus variant? (tab to element)
    • Error state matches Figma invalid variant? (trigger validation)
    • Disabled/read-only matches Figma disabled variant?
    • Selected state matches Figma selected variant? (if applicable)
  6. If wrong: fix CSS → goto step 1
  7. If correct: continue
Step 6: User Confirmation

Share screenshot and dev server URL. User validates or requests changes.


CSS Structure

Always use @layer and CSS nesting:

css
@layer payload-default {
  .component {
    display: flex;
    gap: var(--spacer-2);
    padding: var(--spacer-2) var(--spacer-3);
    background: var(--bg-default-secondary);
    border: 1px solid var(--border-default-default);
    border-radius: var(--radius-medium);

    &__header {
      display: flex;
      gap: var(--spacer-1);
    }

    &--error {
      border-color: var(--border-danger-strong);
    }

    &:hover {
      background: var(--bg-default-secondary-hover);
    }
  }
}

Red Flags - STOP

ThoughtReality
"I'll use flat selectors"Use CSS nesting with &
"I'll use 8px here"Read spacing.css, use token
"No matching spacer"Did you actually check spacing.css?
"I'll guess the colors"Read colors.css, use exact token
"Close enough"Screenshot and compare to Figma
"Skip verification"Always run Playwright loop
"Just need the default state"Get metadata first, analyze ALL variants
"I'll figure out states later"Build variant matrix BEFORE writing CSS

Step 7: Write Variant E2E Tests

Goal: Create e2e tests that verify all visual variants from the Figma design.

  1. Create test file in test/v4/collections/{ComponentName}/e2e.spec.ts

  2. Test structure:

    typescript
    import type { Page } from '@playwright/test'
    import { expect, test } from '@playwright/test'
    import path from 'path'
    import { fileURLToPath } from 'url'
    
    import {
      ensureCompilationIsDone,
      initPageConsoleErrorCatch,
    } from '../../../__helpers/e2e/helpers.js'
    import { AdminUrlUtil } from '../../../__helpers/shared/adminUrlUtil.js'
    import { initPayloadE2ENoConfig } from '../../../__helpers/shared/initPayloadE2ENoConfig.js'
    import { TEST_TIMEOUT_LONG } from '../../../playwright.config.js'
    import { componentFieldsSlug } from '../../slugs.js'
    
    const filename = fileURLToPath(import.meta.url)
    const currentFolder = path.dirname(filename)
    const dirname = path.resolve(currentFolder, '../../')
    
    const { beforeAll, describe } = test
    
    let page: Page
    let serverURL: string
    let url: AdminUrlUtil
    
    describe('ComponentName Field Variants', () => {
      beforeAll(async ({ browser }, testInfo) => {
        testInfo.setTimeout(TEST_TIMEOUT_LONG)
        ;({ serverURL } = await initPayloadE2ENoConfig({ dirname }))
        url = new AdminUrlUtil(serverURL, componentFieldsSlug)
        const context = await browser.newContext()
        page = await context.newPage()
        initPageConsoleErrorCatch(page)
        await ensureCompilationIsDone({ page, serverURL })
      })
    
      // Test each variant from the Figma design
    })
  3. Write tests for each Figma variant:

    Map the variant matrix from Step 2 to test cases:

    typescript
    test('default state renders correctly', async () => {
      await page.goto(url.create)
      const field = page.locator('#field-componentName')
      await expect(field).toBeVisible()
      // Verify visual properties match Figma default variant
    })
    
    test('hover state shows correct styling', async () => {
      await page.goto(url.create)
      const field = page.locator('#field-componentName')
      await field.hover()
      // Verify hover styles match Figma hover variant
    })
    
    test('focus state shows correct styling', async () => {
      await page.goto(url.create)
      const field = page.locator('#field-componentName')
      await field.focus()
      // Verify focus ring/outline matches Figma focus variant
    })
    
    test('error state renders correctly', async () => {
      await page.goto(url.create)
      // Trigger validation by submitting without required field
      await page.locator('button#action-save').click()
      const field = page.locator('#field-requiredComponent')
      // Verify error styling matches Figma invalid variant
    })
    
    test('disabled state renders correctly', async () => {
      await page.goto(url.create)
      const field = page.locator('#field-disabledComponent')
      await expect(field).toBeDisabled()
      // Verify disabled styling matches Figma disabled variant
    })
    
    test('read-only state renders correctly', async () => {
      await page.goto(url.create)
      const field = page.locator('#field-readOnlyComponent')
      await expect(field).toHaveAttribute('readonly')
      // Verify read-only styling matches Figma read-only variant
    })
  4. Collection variants already configured: (See Step 4)

    The test collection should already have all required variants from Step 4.

  5. Run tests to verify:

    bash
    pnpm run test:e2e --grep "ComponentName Field Variants"

Step 8: Run ui4-review

After user confirms the component looks correct, invoke the ui4-review skill.

This will:

  1. Scan all changed CSS files
  2. Auto-fix any remaining hardcoded values
  3. Report what was fixed/flagged

Reference

  • Example migrated component: packages/ui/src/elements/Button/index.css
  • Token files: packages/ui/src/css/*.css
  • Legacy token migration: See Step 1 for var(--base) → --spacer conversion table
  • v4 test suite: test/v4/ — dedicated collections per field type
    • Each collection should have: default, required, disabled, readOnly field variants
    • Disabled/readOnly fields need defaultValue for visible content
    • Run with: pnpm run dev v4
    • URL: http://localhost:3000/admin/collections/{slug}/create
    • Available: text-fields, textarea-fields, email-fields, number-fields, password-fields, checkbox-fields, select-fields, relationship-fields, upload-fields, slug-fields, code-fields, json-fields, collapsible-fields, group-fields, tabs-fields, point-fields, radio-fields, row-fields, array-fields, blocks-fields, date-fields
  • E2E test examples: See test/fields/collections/*/e2e.spec.ts for patterns
    • Test helper imports from test/__helpers/e2e/helpers.js
    • Use AdminUrlUtil for URL construction
    • Use initPayloadE2ENoConfig for test setup

© payloadcms, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .agents/skills/ui4 of payloadcms/payload.

Open the folder on GitHubat commit c66a7be

Compare with similar skills

Ui4 next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Ui4 compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Ui4 this skillpayloadcms/payload45k—~5.8kAutomated safety check: PassMIT
Design To CodeMigoXLab/coderio1142 repos~1.2kAutomated safety check: PassApache-2.0
Extract DesignManavarya09/design-extract4.2k—~786Automated safety check: NotesMIT
Wonder BlocksKhan/wonder-blocks163—~3.2kAutomated safety check: PassMIT
React To Figma Makelintendo/Axhub-Skills127—~4.2kAutomated safety check: PassMIT
Connect Component To Figmadequelabs/cauldron129—~2kAutomated safety check: PassMPL-2.0

Similar skills

  • Design To Code

    MigoXLab/coderio

    Pixel-perfect Figma to React conversion using coderio. An agent skill from MigoXLab/coderio.

    114 GitHub starsUsed in 2 repos~1.2k tokens
    Frontend & DesignAuto-check passed
  • Extract Design

    Manavarya09/design-extract

    Extract the full design language from any website URL. An agent skill from Manavarya09/design-extract.

    4.2k GitHub stars~786 tokensUpdated 9 days ago
    Frontend & DesignAuto-check: notes
  • Wonder Blocks

    Khan/wonder-blocks

    Implements user interfaces using the Wonder Blocks (WB) design system — Khan Academy's React component library.

    163 GitHub stars~3.2k tokensUpdated today
    Frontend & DesignAuto-check passed
  • React To Figma Make

    lintendo/Axhub-Skills

    A skill your agent uses when 需要把现有 React、Vite、Next.js、V0 或 AI Studio 页面转换为 Figma Make 可导入的 .fig 资产,或补齐、更新、验证已有 Figma Make 导出壳和 canvas.fig。

    127 GitHub stars~4.2k tokensUpdated 1 mo ago
    Frontend & DesignAuto-check passed
  • Connect Component To Figma

    dequelabs/cauldron

    Add a Figma Code Connect (.figma.tsx) file for a Cauldron React component.

    129 GitHub stars~2k tokensUpdated today
    Frontend & DesignAuto-check passed
  • Figma Build

    awdr74100/figwright

    Build a Figma design from code or a description — the reverse of figma-codegen.

    982 GitHub stars~2k tokensUpdated today
    Frontend & DesignAuto-check passed

More from payloadcms/payload

All 9 skills in this repo
  • Record PR Demo

    payloadcms/payload

    A skill your agent uses when a Payload pull request needs a concise visual walkthrough for reviewers.

    45k GitHub stars~1k tokensUpdated today
    Auto-check passed
  • Payload

    payloadcms/payload

    A skill your agent uses when working with Payload projects (payload.config.ts, collections, fields, hooks, access control, Payload API).

    45k GitHub starsUsed in 5 repos~6.2k tokens
    Auto-check passed
  • Audit Dependencies

    payloadcms/payload

    A skill your agent uses when fixing dependency vulnerabilities, running pnpm audit, or when the audit-dependencies CI check fails

    45k GitHub stars~2.8k tokensUpdated today
    Auto-check passed
  • Generate Translations

    payloadcms/payload

    A skill your agent uses when new translation keys are added to packages to generate new translations strings

    45k GitHub stars~1.1k tokensUpdated today
    Auto-check passed
  • Triage CI Flake

    payloadcms/payload

    A skill your agent uses when CI tests fail on main branch after PR merge, when investigating flaky test failures, or when user provides a PR URL/number to aggregate all failing tests

    45k GitHub stars~4.4k tokensUpdated today
    Auto-check passed
  • Ui4 Convert Tests

    payloadcms/payload

    A skill your agent uses when UI changes are complete and e2e tests need updating.

    45k GitHub stars~3.5k tokensUpdated today
    Auto-check passed

Questions about Ui4

What does Ui4 do?

Manually invoked skill for reskinning Payload UI components. Ui4 is an agent skill from payloadcms/payload. Manually invoked skill for reskinning Payload UI components.

When should I use Ui4?

Ui4 fits situations like: frontend & Design work in your project.

How do I install Ui4 in Claude Code?

Run `npx skills add payloadcms/payload --skill ui4 -a claude-code`. Or copy the skill folder (.agents/skills/ui4 in payloadcms/payload) into .claude/skills/ui4 in your project. Claude Code loads it when a task matches its description.

How do I install Ui4 in Codex?

Run `npx skills add payloadcms/payload --skill ui4 -a codex`. Or copy the skill folder (.agents/skills/ui4 in payloadcms/payload) into .agents/skills/ui4 in your project. Codex loads it when a task matches its description.

Can I use Ui4 in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add payloadcms/payload --skill ui4 -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/ui4, .gemini/skills/ui4, .github/skills/ui4 and .opencode/skills/ui4 in your project.

What does Ui4 need to run?

Going by SKILL.md and its folder, Ui4 needs the command-line tools its instructions call (pnpm).

Does Ui4 access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Ui4 safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Ui4 use?

Ui4 is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Ui4 use?

About 5.8k tokens (SKILL.md is roughly 23k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Ui4?

Skills that share tags, products or a category with Ui4: Design To Code (MigoXLab/coderio, 114 stars), Extract Design (Manavarya09/design-extract, 4.2k stars), Wonder Blocks (Khan/wonder-blocks, 163 stars) and React To Figma Make (lintendo/Axhub-Skills, 127 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Ui4?

payloadcms (a GitHub organization) maintains it in payloadcms/payload, which has 45,140 GitHub stars. The repository holds 9 skills in this directory. The repository was last updated on October 8, 2026.

Source: payloadcms/payload on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.