UI Design System
try-works/role-model
React UI component systems with TailwindCSS + Radix + shadcn/ui.
Guide for building UI with Montage (Wanted Design System) in React/Next.js projects.
$ npx skills add wanteddev/montage-web --skill montage-react -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install wanteddev/montage-web montage-react --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/wanteddev/montage-web.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude-plugin/montage-web-guide/skills/montage-react .claude/skills/montage-react && rm -rf skills-srcUse ~/.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/
Install the "montage-react" agent skill from https://github.com/wanteddev/montage-web/tree/main/.claude-plugin/montage-web-guide/skills/montage-react into .claude/skills/montage-react/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "montage-react", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/wanteddev/montage-web/tree/main/.claude-plugin/montage-web-guide/skills/montage-reactType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add wanteddev/montage-web --skill montage-react -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install wanteddev/montage-web montage-react --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/wanteddev/montage-web.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude-plugin/montage-web-guide/skills/montage-react .agents/skills/montage-react && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "montage-react" agent skill from https://github.com/wanteddev/montage-web/tree/main/.claude-plugin/montage-web-guide/skills/montage-react into .agents/skills/montage-react/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "montage-react", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add wanteddev/montage-web --skill montage-react -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install wanteddev/montage-web montage-react --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/wanteddev/montage-web.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude-plugin/montage-web-guide/skills/montage-react .cursor/skills/montage-react && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "montage-react" agent skill from https://github.com/wanteddev/montage-web/tree/main/.claude-plugin/montage-web-guide/skills/montage-react into .cursor/skills/montage-react/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "montage-react", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/wanteddev/montage-web.git --path .claude-plugin/montage-web-guide/skills/montage-react--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add wanteddev/montage-web --skill montage-react -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install wanteddev/montage-web montage-react --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/wanteddev/montage-web.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude-plugin/montage-web-guide/skills/montage-react .gemini/skills/montage-react && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "montage-react" agent skill from https://github.com/wanteddev/montage-web/tree/main/.claude-plugin/montage-web-guide/skills/montage-react into .gemini/skills/montage-react/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "montage-react", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install wanteddev/montage-web montage-reactInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add wanteddev/montage-web --skill montage-react -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/wanteddev/montage-web.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude-plugin/montage-web-guide/skills/montage-react .github/skills/montage-react && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "montage-react" agent skill from https://github.com/wanteddev/montage-web/tree/main/.claude-plugin/montage-web-guide/skills/montage-react into .github/skills/montage-react/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "montage-react", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add wanteddev/montage-web --skill montage-react -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install wanteddev/montage-web montage-react --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/wanteddev/montage-web.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude-plugin/montage-web-guide/skills/montage-react .opencode/skills/montage-react && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "montage-react" agent skill from https://github.com/wanteddev/montage-web/tree/main/.claude-plugin/montage-web-guide/skills/montage-react into .opencode/skills/montage-react/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "montage-react", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
montage-reactGuide for building UI with Montage (Wanted Design System) in React/Next.js projects.
Montage React is an agent skill from wanteddev/montage-web. Guide for building UI with Montage (Wanted Design System) in React/Next.js projects. Triggers on component implementation, page/screen creation, styling (sx, theme, design tokens), icons, and utility functions. Active in projects using @wanteddev/wds packages.
Its SKILL.md is about 3.4k 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, covering Design tokens and Design systems. It works with React, Model Context Protocol and Next.js. The repository describes itself as: 🎨 Wanted Web Design System - Montage. The licence is MIT.
10 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit c564409. It shows what the files ask for, not the result of running them.
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.
No scripts in the folder and no shell commands in SKILL.md (its code samples are typescript).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Montage React loads about 3.4k tokens when it runs. Until then it costs about 69 tokens; SKILL.md has 1,408 words of instructions outside code blocks.
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.
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.
The full file from wanteddev/montage-web at commit c564409, republished under its MIT licence (© wanteddev). 1,408 words, ~3,391 tokens.
.claude/skills/montage-react/SKILL.md (or your agent's skills folder).Skill that is automatically applied when developing components based on Wanted Design System (Montage) in React projects.
Apply this skill when any of the following conditions are met:
@wanteddev/wds, @wanteddev/wds-icon, @wanteddev/wds-dummy, @wanteddev/wds-brandBefore using any MCP tools, always verify the montage-mcp-server connection first.
Call mcp__montage-mcp-server__health_check to check the connection status.
/mcp to connect montage-mcp-server./mcp will initiate the auth flow.If the connection check fails, do not proceed. Wait for the user's response.
Gather required information in parallel at the start. Avoid unnecessary sequential calls.
When setting up React.js or Next.js from scratch, use:
mcp__montage-mcp-server__getting_startedAlways call in parallel:
mcp__montage-mcp-server__wds_coding_guidelines — coding guidelinesmcp__montage-mcp-server__list_components — available component listAdd in parallel when needed:
mcp__montage-mcp-server__list_tokens — when custom styling is requiredmcp__montage-mcp-server__get_color_usage — when color application is neededmcp__montage-mcp-server__list_icons — when icons are neededmcp__montage-mcp-server__list_dummy_components — when a placeholder GNB / Footer / bottom tab bar is needed for a demo or previewmcp__montage-mcp-server__list_brand_assets — when the Wanted brand logo (or other brand mark) is neededWhen using Montage components, never guess — always look up the detailed specs.
mcp__montage-mcp-server__get_component({ componentName: "ComponentName" })Important: Looking up the parent component instead of a sub-component gives you the full composition pattern (Anatomy) and all APIs at once.
get_component({ componentName: "Modal" }) — includes ModalContainer, ModalNavigation, etc.get_component({ componentName: "Card" }) — includes CardThumbnail, CardContent, etc.get_component({ componentName: "Tab" }) — includes TabList, TabListItem, TabPanel, etc.When unsure which Typography variant to use, call get_component({ componentName: "Typography" }) to check the size table for each variant.
Follow these patterns for vibe design or page implementation requests.
Basic page skeleton:
import { Box, FlexBox, containerStyle } from '@wanteddev/wds';
<FlexBox flexDirection="column" sx={{ minHeight: '100vh' }}>
<Box as="header" sx={containerStyle(true)}>
...
</Box>
<Box as="main" sx={containerStyle(true)}>
...
</Box>
<Box as="footer" sx={containerStyle(true)}>
...
</Box>
</FlexBox>;For
containerStyledetails, useget_utility_function("containerStyle").
| Purpose | Component |
|---|---|
| One-directional layout (row/column) | FlexBox |
| 12-column grid layout | Grid + GridItem |
| Page container | containerStyle() utility |
| General wrapper/styling | Box |
When implementing a Figma design directly, ignore this guide and use the exact spacing values defined in Figma.
Otherwise (vibe design or freeform composition), do not use spacing tokens. Use px values directly instead.
gap="12px" or gap="16px"gap="24px" ~ gap="32px"gap="40px" ~ gap="48px"gap prop or specify padding, margin in px via sxThree methods are available. Pick based on what's changing:
sm={{ size: "large" }})respondTo / respondDown utilitiesuseMediaQuery hookUse mobile-first sizing, then override with sm, md, lg, xl. Typically only sm breakpoint is used.
TextButton, IconButton (variant background, normal), ListCell, RadioGroupItem, Checkbox, AvatarButton, ToggleIcon have interaction areas larger than their visual bounds — give slightly more spacing room.ScrollArea with border-radius, add [data-role='scroll-area-bar-wrapper'] { padding-block: ${radius}; } to avoid unnatural scrollbar.sx propWhen using a theme function in the sx prop, the theme is injected automatically. No need to pass it manually like
wrapperStyle(theme).
// style.ts
export const buttonStyle = (isActive: boolean) => (theme: Theme) => css`
color: ${isActive
? theme.semantic.primary.normal
: theme.semantic.label.alternative};
`;
// index.tsx
<Box sx={buttonStyle(isActive)} />;When icons are needed, check the Montage icon library first via mcp__montage-mcp-server__list_icons. Always prefer Montage icons over creating new ones.
Use utility functions provided by Montage. Look up available utilities via mcp__montage-mcp-server__list_utility_functions, and get detailed usage with mcp__montage-mcp-server__get_utility_function.
Use Montage design tokens instead of hardcoded values. Look up available tokens via mcp__montage-mcp-server__list_tokens.
Never use CSS variable (var(--semantic-...)) directly. Always access colors through the theme callback (e.g., sx={theme => ({ color: theme.semantic.label.normal })}). CSS variable names are internal implementation details and may change without notice.
Colors: use semantic color tokens instead of #RRGGBB (fall back to atomic colors if not possible). Use get_color_usage to look up which token to use for a given purpose.
Typography: use the Typography component or typographyStyle utility. Use get_component({ componentName: "Typography" }) to look up the variant/size table.
Shadows: use theme.semantic.elevation.shadow.normal.*
Opacity: must use addOpacity utility + theme.opacity[N]. Theme color values are CSS variables (e.g. var(--semantic-primary-normal)), so appending hex alpha strings directly will NOT work. Available opacity keys: 0, 5, 8, 12, 16, 22, 28, 35, 43, 52, 61, 74, 88, 97, 100.
// use addOpacity utility
import { addOpacity } from '@wanteddev/wds';
import type { Theme } from '@wanteddev/wds';
const wrapperStyle = (theme: Theme) => css`
background-color: addOpacity(
theme.semantic.primary.normal,
theme.opacity[5]
);
border: 1px solid
${addOpacity(theme.semantic.primary.normal, theme.opacity[22])};
`;When implementing a Figma design:
If Figma specifies an opacity value that does not match any theme.opacity[N] key, use the raw number directly (e.g., opacity: 0.07) instead of a token.
If the Figma design renders the opacity as a colored overlay layer (not fading the element itself), implement it via ::before / ::after pseudo-element so child content stays fully opaque. When the parent has border-radius, the pseudo-element must also set borderRadius: 'inherit', otherwise the overlay will overflow the rounded corners.
// style.ts
import { css } from '@wanteddev/wds';
import type { Theme } from '@wanteddev/wds';
export const overlayStyle = (theme: Theme) => css`
position: relative;
border-radius: 12px;
&::before {
content: '';
position: absolute;
inset: 0;
border-radius: inherit;
background-color: ${theme.semantic.fill.normal};
opacity: ${theme.opacity[8]};
}
`;// index.tsx
import { overlayStyle } from './style';
<Box sx={overlayStyle} />;Do not use spacing tokens. Use px values directly.
@wanteddev/wds-dummy)The @wanteddev/wds-dummy package provides presentational-only reference scaffolds (NavBar, Footer, BottomTabBar) that mirror the wanted.co.kr layout.
onClick, no routing, no state). For real product code, copy the structure and rebuild it against your own data, links, and handlers using primitives from @wanteddev/wds.forwardRef components and accept a standard sx prop. BottomTabBar is intended for viewports below the sm breakpoint — wrap it accordingly if you also render NavBar on the same page.mcp__montage-mcp-server__list_dummy_components. To see the exact JSX (e.g. to copy and adapt), read the source from packages/wds-dummy/src/components/<component>/index.tsx.import { NavBar, Footer, BottomTabBar } from '@wanteddev/wds-dummy';
<>
<NavBar />
<main>{/* page content */}</main>
<Footer />
<BottomTabBar />
</>;Official Wanted brand marks. Use as-is — do not recolor, restyle, redraw, or crop.
LogoWanted (@wanteddev/wds-brand)Use when you need the "[symbol] wanted" wordmark (symbol + text together) — e.g. GNB, footer, splash, marketing surfaces.
width (default 112), height (default 32), plus standard sx and any <svg> attributes. Forwards ref to SVGSVGElement.aria-label (e.g. "Wanted Logo") when the logo stands alone in an interactive or landmark element.112:32 (≈ 3.5:1) aspect ratio when resizing.import { LogoWanted } from '@wanteddev/wds-brand';
<LogoWanted aria-label="Wanted Logo" />
<LogoWanted width={168} height={48} aria-label="Wanted Logo" />;IconSymbol (@wanteddev/wds-icon)Use when you need just the Wanted symbol mark (no wordmark) — e.g. favicons, app icons, compact headers, loading indicators, badges. Renders as a 1:1 square.
fontSize (defaults to 1em). Built-in <title> provides accessible name "원티드 심벌".LogoWanted to fake a symbol-only mark — always use IconSymbol.import { IconSymbol } from '@wanteddev/wds-icon';
<IconSymbol sx={{ fontSize: '32px' }} />;Look up the full list of brand assets via mcp__montage-mcp-server__list_brand_assets. Prefer these over importing or recreating any other Wanted logo SVG.
Verify the following after completing a component/page:
get_component before using components? (no guessing)@wanteddev/wds-dummy scaffolds instead of hand-rolling a fake GNB/Footer/tab bar?LogoWanted from @wanteddev/wds-brand (not a custom SVG)?IconSymbol from @wanteddev/wds-icon (not a cropped LogoWanted)?© wanteddev, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude-plugin/montage-web-guide/skills/montage-react of wanteddev/montage-web.
Open the folder on GitHubat commit c564409
Montage React 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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Montage React this skillwanteddev/montage-web | 117 | — | ~3.4k | Automated safety check: Pass | MIT | |
| UI Design Systemtry-works/role-model | 117 | — | ~5k | Automated safety check: Pass | MIT | |
| Shadcn Tailwind UILiarMTTT/TavernWeave | 148 | — | ~1.7k | Automated safety check: Pass | Custom licence | |
| Persian Rtl UITronIsHere/vibefarsiui | 207 | — | ~1.7k | Automated safety check: Warn | None | |
| Docs LookupProgrammerAnthony/Expert-Coding-Harness | 235 | — | ~640 | Automated safety check: Pass | MIT | |
| Chakra UI v3 Builderchakra-ui/chakra-ui | 41k | — | ~3.1k | Automated safety check: Pass | MIT |
try-works/role-model
React UI component systems with TailwindCSS + Radix + shadcn/ui.
LiarMTTT/TavernWeave
Build, restyle, or review accessible React interfaces that use shadcn/ui, Radix UI primitives, and Tailwind CSS.
TronIsHere/vibefarsiui
Build right-to-left Persian (Farsi) UI in React and Tailwind the way an Iranian product team would: logical CSS only, Persian fonts without letter-spacing, Persian digits and «تومان», Jalali dates…
ProgrammerAnthony/Expert-Coding-Harness
通过 Context7 MCP 获取库和框架的实时最新文档,而非依赖训练数据,防止 API 幻觉。适用于查询任何库或框架的用法、配置、示例代码。触发词:怎么用、怎么配置、API参考、文档、示例代码、用法、接口、库文档、框架文档、documentation、docs、how to use、API…
chakra-ui/chakra-ui
Builds responsive, accessible Chakra UI v3 components and layouts, sets up Chakra in new or existing projects, and designs themes with tokens, semantic tokens and recipes.
warpdotdev/warp
Required groundwork before any use_figma call: the rules and reference files for running JavaScript in a Figma file through the Plugin API without common failures.
wanteddev/montage-web
Sync icons from the Figma file into wds-icon and open a PR by dispatching the figma-icon-sync-code-connect.yml GitHub Actions workflow.
wanteddev/montage-web
Create a GitHub pull request from the current branch. An agent skill from wanteddev/montage-web.
Works with
Categories
Guide for building UI with Montage (Wanted Design System) in React/Next.js projects. Montage React is an agent skill from wanteddev/montage-web.js projects.
Montage React fits situations like: component implementation; page/screen creation; utility functions.
Run `npx skills add wanteddev/montage-web --skill montage-react -a claude-code`. Or copy the skill folder (.claude-plugin/montage-web-guide/skills/montage-react in wanteddev/montage-web) into .claude/skills/montage-react in your project. Claude Code loads it when a task matches its description.
Run `npx skills add wanteddev/montage-web --skill montage-react -a codex`. Or copy the skill folder (.claude-plugin/montage-web-guide/skills/montage-react in wanteddev/montage-web) into .agents/skills/montage-react in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add wanteddev/montage-web --skill montage-react -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/montage-react, .gemini/skills/montage-react, .github/skills/montage-react and .opencode/skills/montage-react in your project.
SKILL.md names no scripts, command-line tools or credentials: Montage React is instructions for the agent only.
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.
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.
Montage React is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.4k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Montage React: UI Design System (try-works/role-model, 117 stars), Shadcn Tailwind UI (LiarMTTT/TavernWeave, 148 stars), Persian Rtl UI (TronIsHere/vibefarsiui, 207 stars) and Docs Lookup (ProgrammerAnthony/Expert-Coding-Harness, 235 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
wanteddev (a GitHub organization) maintains it in wanteddev/montage-web, which has 117 GitHub stars. The repository holds 3 skills in this directory. The repository was last updated on October 7, 2026.
Source: wanteddev/montage-web on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.