mcpField
L
lab

lab

github.com/raphaelsalajaDesign & UI4744 installsUpdated 1d ago
Repository

About lab

lab is a development skill for inspecting and tuning real UI components by showing their variants and states together. It provides a development-only route and checks that entries are labeled, opened, and kept out of production.

Key features

  1. 01Displays component variants and states
  2. 02Uses real components, not copies
  3. 03Forces interactive states open
  4. 04Links entries to source locations
  5. 05Provides controls for custom properties
  6. 06Keeps the lab out of production

Use cases

  1. 01Reviewing component states in one view
  2. 02Tuning component properties
  3. 03Checking a development lab for omissions

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/raphaelsalaja/skills --skill lab

After installing, type/labin Claude Code to confirm it loaded.

Bundled filesagents/openai.yamllab.js

Details

From the project README

Lab

This skill builds a page for inspecting components. Every variant and every state of the real components sits open on one screen, so the user can tune them without clicking through the app.

Every state open, nothing faked

The lab renders the real components, not copies. States that need a click, such as an open menu or a hover, are forced open. The lab is a development page and never ships.

Exploring new options for one idea belongs to prototype. The values on the page come from defaults, motion, color and the project's tokens.

1. Find the states

Read each component and list its variants, sizes and states: hover, pressed, focus, open, selected, disabled, loading, empty and error. A lab that shows the resting state only is lab-every-state.

2. Build one route

Add one development-only route, such as /lab, that imports the real components. Copy lab.js into the app and load it once on that route. A lab built from copied markup is lab-real-components.

3. Force states open

Render menus, popovers, tooltips and submenus open with their controlled props or data-* attributes. Hold hover and focus with force on the entry, such as force="hover". A menu that needs a click to see is lab-states-open. Use the app's current theme unless the user asked for both. That is lab-one-theme.

4. Link each entry to its source

Wrap each state in a lab-entry naming its component, state and source line, as the header comment in lab.js shows. An unlabelled grid is lab-link-the-source. When the user asked to tune values, add a lab-tune for each custom property with its range.

The grid, labels, filters and controls ship with the skill, so write entries only. A lab page with its own grid, labels or styles is lab-shipped-frame.

5. Open it

Start the dev server and open the lab. A route named in the reply but never opened is lab-open-it.

6. Keep it out of the release

Gate the route and lab.js to development, or delete both before release. A lab reachable in production is lab-not-in-production.

The pair

Every check is a pair. The broken line sits beside the line that replaces it.

RuleBrokenReplacement
lab-every-stateThe resting button onlyRest, hover, pressed, focus, disabled and loading
lab-real-componentsCopied markup for each stateThe real Button imported
lab-states-openA menu behind a trigger<Menu open> with its submenu open
lab-one-themeLight and dark side by side, unaskedThe app's current theme
lab-link-the-sourceAn unlabelled gridMenu / Submenu Open linked to menu/index.tsx
lab-shipped-frameA lab grid and labels written from scratchlab.js loaded, only lab-entry elements written
lab-open-it"Added /lab"The lab opened for the user
lab-not-in-production/lab live on the production siteThe route gated to development

Reporting

Severity. HIGH is a lab built from copies, or a lab reachable in production. MEDIUM is a missing state, a state that still needs a click or a hand-written lab page. LOW is an unlabelled entry, or a lab that was not opened for the user.

Format. One finding per root cause:

file:line - [rule-id] what is wrong

Then a Rule | Count | Severity summary. Block when any HIGH remains, Approve otherwise. Mark every state you could not render as Not verified.

Comments

Markdown supported