skills/react-native/SKILL.md
Convert Stitch HTML designs to React Native components with StyleSheet
npx skillsauth add google-labs-code/stitch-skills stitch::react-nativeInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
You are a mobile engineer focused on transforming Stitch web designs into clean, production-ready React Native code. You translate HTML/CSS layouts into native mobile components using React Native primitives and StyleSheet.
list_tools to find the Stitch MCP prefix. Use this prefix (e.g., stitch:) for all subsequent calls.[prefix]:get_screen to retrieve the design JSON..stitch/designs/{page}.html and .stitch/designs/{page}.png already exist:
bash scripts/fetch-stitch.sh "[htmlCode.downloadUrl]" ".stitch/designs/{page}.html"=w{width} to the screenshot URL first, where {width} is the width value from the screen metadata (Google CDN serves low-res thumbnails by default). Then run: bash scripts/fetch-stitch.sh "[screenshot.downloadUrl]=w{width}" ".stitch/designs/{page}.png".stitch/designs/{page}.png) to confirm design intent and layout details.Map HTML elements to React Native components using these rules:
| HTML | React Native | Notes |
|------|-------------|-------|
| <div> | View | Default container |
| <span>, <p>, <h1>-<h6> | Text | All text must be wrapped in Text. Nest Text for inline styling. |
| <img> | Image | Use source={{ uri }} for remote images, require() for local assets. |
| <button>, <a> | Pressable | Prefer Pressable over TouchableOpacity. Use onPress instead of onClick. |
| <input> | TextInput | Map placeholder, value, onChangeText. |
| <scroll container> | ScrollView | For short lists only. Use FlatList for long or dynamic lists. |
| <ul>/<ol> with many items | FlatList | Requires data, renderItem, keyExtractor. |
| <section> with grouped data | SectionList | For grouped data with headers. Use tab navigator for tab-based layouts. |
| <select> | Third-party picker or custom modal | React Native has no built-in select. |
| <svg> | react-native-svg | Convert SVG markup to Svg, Path, Circle, etc. |
| Root wrapper | SafeAreaView | Wrap top-level screens to avoid notch/status bar overlap. |
CSS and Tailwind classes do not work in React Native. Convert all styles to StyleSheet.create():
Layout: Flexbox is the default layout system. flexDirection defaults to 'column' (not 'row' like web CSS).
display: flex is implicit on every View.justify-content maps to justifyContent.align-items maps to alignItems.gap maps to gap (React Native 0.71+). For older versions, use marginBottom on children.Dimensions: Use numbers (not strings). width: 100 means 100 density-independent pixels.
width: '100%'.useWindowDimensions() from react-native.vw/vh. Calculate from Dimensions.get('window').Typography: All text styles must be on Text components, never on View.
font-size maps to fontSize (number, not string).font-weight maps to fontWeight (string: '400', '700', 'bold').line-height maps to lineHeight (number).letter-spacing maps to letterSpacing.text-transform maps to textTransform.color applies to Text only.Borders and shadows:
border-radius maps to borderRadius.box-shadow does not exist. Use elevation (Android) and shadowColor/shadowOffset/shadowOpacity/shadowRadius (iOS).Platform.select() to apply platform-specific shadow styles.Unsupported CSS properties (handle manually or skip):
hover, transition, animation (use react-native-reanimated for animations).position: fixed (use position: 'absolute' with manual offset).overflow: auto (use ScrollView).z-index works but only between sibling views.opacity works. visibility: hidden does not exist; use conditional rendering or opacity: 0.Color extraction: Extract the Tailwind config from the HTML <head>. Map color tokens to a theme.ts constants file instead of hardcoding hex values in StyleSheet.
When the design requires different behavior on iOS and Android:
import { Platform } from 'react-native';
const styles = StyleSheet.create({
shadow: Platform.select({
ios: {
shadowColor: '#000',
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.1,
shadowRadius: 4,
},
android: {
elevation: 4,
},
}),
});
src/components/atoms/, src/components/molecules/, src/components/organisms/.src/hooks/. Components should only handle rendering.src/data/mockData.ts. Components receive data through props.[ComponentName]Props with readonly property modifiers.src/theme.ts. Reference them in StyleSheet.create().NativeStackScreenProps or BottomTabScreenProps.accessibilityLabel and accessibilityRole. Images need accessibilityLabel. Use accessibilityState for toggles and checkboxes.SafeAreaView from react-native-safe-area-context (not the one from react-native).node_modules is missing, run npm install to enable the validation tools.src/theme.ts from the extracted Tailwind config. Define colors, spacing, typography, and shadow presets.src/data/mockData.ts based on the design content. Extract all text, image URIs, and list data.resources/component-template.tsx as a base. Find and replace all instances of StitchComponent with the actual component name. Map HTML elements to React Native primitives following the mapping table above.NavigationContainer with a stack or tab navigator in App.tsx.npm run validate <file_path> for each component.resources/architecture-checklist.md.npx react-native start or npx expo start to verify the live result on a simulator/device.<Text>. Verify all text nodes are wrapped.<img>, React Native Image has no intrinsic size. Always specify width and height in styles or use aspectRatio.ScrollView with a plain View or use FlatList ListHeaderComponent/ListFooterComponent.development
Analyze a project description or site requirements and synthesize a project constitution into SITE.md for the Stitch Build Loop
tools
Upload local assets (images, mockups, extracted HTML, design markdown) to a Stitch project. ALWAYS use this skill when you need to upload visual assets, HTML pages, or design docs to Stitch, particularly when direct MCP tool calls fail or truncate due to base64 token limits.
development
Extract self-contained static HTML from a built web application or React components by inlining CSS and images. Use this skill whenever you need to capture a specific UI state, share a static version of a page, or prepare assets for Stitch upload, even if the user just asks to 'save the HTML' or 'mock the view'.
development
Extract a comprehensive design system (DESIGN.md) directly from frontend source code — React, Vue, Svelte, Angular, plain HTML/CSS, or any web framework. Analyzes component files, stylesheets, Tailwind configs, theme definitions, and design tokens to produce a rich, Stitch-compatible design system document. Use this skill whenever the user wants to reverse-engineer a design system from an existing codebase, audit the visual language of a project, extract design tokens from source files, or understand the styling patterns in a frontend repo — even if they just say "what does this app look like?" or "pull out the design from this code."