Stitch-kit stitch-react-components
Converts Stitch designs into modular Vite + React components — TypeScript, theme-mapped Tailwind, dark mode via CSS variables, and clean component architecture. Use this for Vite/React apps without App Router. For Next.js 15 App Router, use stitch-nextjs-components instead.
git clone https://github.com/gabelul/stitch-kit
T=$(mktemp -d) && git clone --depth=1 https://github.com/gabelul/stitch-kit "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/stitch-react-components" ~/.claude/skills/gabelul-stitch-kit-stitch-react-components && rm -rf "$T"
skills/stitch-react-components/SKILL.mdStitch → Vite / React Components
Constraint: Only use this skill when the user explicitly mentions "Stitch" and React (Vite, CRA, or just "React app" without Next.js).
You are a frontend engineer converting Stitch mobile/desktop designs into clean, modular React components using Vite + TypeScript. This skill targets plain React apps — not Next.js App Router. For Next.js, use
stitch-nextjs-components instead.
When to use this skill vs. Next.js
| Scenario | Use |
|---|---|
| User says "React app", "Vite", "CRA" | |
| User says "Next.js", "App Router", "SSR" | |
| User wants shadcn/ui components added after | → then |
| User wants server-side rendering or file-based routing | |
Prerequisites
- Stitch MCP Server configured (or use downloaded HTML directly)
- Node.js + npm/pnpm
- Vite + React project initialized:
npm create vite@latest my-app -- --template react-ts
Step 1: Retrieve the design
- Run
→ find Stitch MCP prefixlist_tools - Call
with numeric[prefix]:get_screen
andprojectIdscreenId - Download HTML:
bash scripts/fetch-stitch.sh "[htmlCode.downloadUrl]" "temp/source.html" - Check
— verify layout matches expectationsscreenshot.downloadUrl
Step 2: Project structure
src/ ├── components/ ← One file per component │ └── [Name].tsx ├── data/ │ └── mockData.ts ← Static content (never in components) ├── theme/ │ ├── tokens.ts ← Design token constants │ └── useTheme.ts ← Dark mode hook ├── types/ │ └── index.ts ← Shared TypeScript types ├── App.tsx ← Root component └── main.tsx ← Entry point
Step 3: Extract design tokens
From the Stitch HTML
<head>, find the tailwind.config or CSS variable definitions.
// src/theme/tokens.ts — extract hex values from Stitch HTML export const lightTokens = { background: '#FFFFFF', surface: '#F4F4F5', primary: '#6366F1', primaryFg: '#FFFFFF', text: '#09090B', textMuted: '#71717A', border: '#E4E4E7', } as const export const darkTokens = { background: '#09090B', surface: '#18181B', primary: '#818CF8', primaryFg: '#09090B', text: '#FAFAFA', textMuted: '#A1A1AA', border: '#27272A', } as const export type ThemeTokens = typeof lightTokens
// src/theme/useTheme.ts import { useEffect, useState } from 'react' import { lightTokens, darkTokens, type ThemeTokens } from './tokens' /** * Returns current theme tokens based on system color scheme. * Listens for system-level dark/light mode changes. */ export function useTheme(): ThemeTokens { const [isDark, setIsDark] = useState( () => window.matchMedia('(prefers-color-scheme: dark)').matches ) useEffect(() => { const mq = window.matchMedia('(prefers-color-scheme: dark)') const handler = (e: MediaQueryListEvent) => setIsDark(e.matches) mq.addEventListener('change', handler) return () => mq.removeEventListener('change', handler) }, []) return isDark ? darkTokens : lightTokens }
Step 4: Component conversion rules
Layout mapping
| HTML/CSS | → React / Tailwind |
|---|---|
| |
| |
| |
| |
| |
| Long list | |
| |
Tailwind class mapping
Use the Stitch HTML classes directly in JSX where they don't reference Stitch-specific tokens. Map Stitch tokens to CSS variables:
// Stitch HTML: bg-primary → CSS variable → Tailwind arbitrary value // OR: use inline style with token value // Option A — Tailwind arbitrary value (if custom tokens in tailwind.config) <div className="bg-[--color-primary] text-[--color-primaryFg]"> // Option B — inline style with useTheme() const theme = useTheme() <div style={{ backgroundColor: theme.primary, color: theme.primaryFg }}>
Component template
// src/components/StitchComponent.tsx /** * Props for StitchComponent — all data via props, never fetched inside. */ interface StitchComponentProps { /** Primary heading text */ title: string /** Supporting description — optional */ description?: string /** Primary action callback */ onAction?: () => void } /** * StitchComponent — [describe purpose in one sentence] */ export function StitchComponent({ title, description, onAction, }: Readonly<StitchComponentProps>) { const theme = useTheme() return ( <div className="rounded-xl border p-4 gap-2 flex flex-col" style={{ backgroundColor: theme.surface, borderColor: theme.border, }} > <h3 className="text-base font-semibold" style={{ color: theme.text }}> {title} </h3> {description ? ( <p className="text-sm" style={{ color: theme.textMuted }}> {description} </p> ) : null} {onAction ? ( <button onClick={onAction} className="rounded-lg px-4 py-2 text-sm font-medium transition-opacity hover:opacity-90" style={{ backgroundColor: theme.primary, color: theme.primaryFg }} type="button" > Action </button> ) : null} </div> ) }
Step 5: Architectural rules
- One component per file — no single-file spaghetti
- Static data in
— never hardcoded in JSXsrc/data/mockData.ts - Shared types in
src/types/index.ts - Every component has
interfaceReadonly<ComponentNameProps> - No hardcoded hex colors — use
or CSS variablesuseTheme() - No
typesany
Step 6: Integration with shadcn/ui
After converting the Stitch design to base React components, you can layer in shadcn/ui:
npx shadcn@latest init # Set up shadcn in your Vite project npx shadcn@latest add button card input dialog
Then use
stitch-shadcn-ui skill to replace raw HTML elements with shadcn components while preserving the Stitch design tokens.
Troubleshooting
| Issue | Fix |
|---|---|
| Tailwind classes not applying | Check includes in content |
| Dark mode not toggling | Verify is called at component level, not hoisted |
| Images not showing | Add explicit and or use |
| Type error on props | Ensure wrapper and all required props are provided |
References
— Boilerplate componentresources/component-template.tsx
— Pre-ship checklistresources/architecture-checklist.md
— Token + class mapping guide (Stitch HTML → React/Tailwind)references/tailwind-to-react.md
— Reliable GCS HTML downloaderscripts/fetch-stitch.sh
— Add shadcn/ui components after base conversionstitch-shadcn-ui
— Tailwind utility class lookupdocs/tailwind-reference.md