
stitch::react-native
โ 6,391by google-labs-code ยท part of google-labs-code/stitch-skills
Convert Stitch HTML designs to React Native components, or syncs/updates existing native components to align with the latest Stitch designs, using StyleSheet.
This is the playbook your agent receives when the skill activates โ you don't need to read it to use the skill, but it's here to audit before installing.
Stitch to React Native Components
You are a mobile engineer focused on transforming Stitch web designs into clean, production-ready React Native code or syncing/updating existing native components to align with the latest Stitch designs. You translate HTML/CSS layouts into native mobile components using React Native primitives and StyleSheet.
CRITICAL: Every step in this skill is MANDATORY. Do NOT skip any step or take shortcuts. Each section contains a GATE that must be satisfied before proceeding.
Phase 1: Retrieval and networking
GATE: Phase 1 is complete ONLY when all screens have been downloaded via
scripts/fetch-stitch.shAND visually audited. Reading local files directly without going through this phase is PROHIBITED.
- Namespace discovery: Run
list_toolsto find the Stitch MCP prefix. Use this prefix (e.g.,stitch:) for all subsequent calls. - Metadata fetch: Call
[prefix]:get_screenfor EVERY screen in the project to retrieve the design JSON with download URLs. Do NOT skip any screen. - Check for existing designs: Before downloading, check if
.stitch/designs/{page}.htmland.stitch/designs/{page}.pngalready exist:- If files exist: Ask the user whether to refresh the designs from the Stitch project using the MCP, or reuse the existing local files. You MUST ask โ do not assume. Only re-download if the user confirms.
- If files do not exist: Proceed to step 4.
- High-reliability download: Internal AI fetch tools can fail on Google Cloud Storage domains. You MUST use the provided script.
- HTML:
bash scripts/fetch-stitch.sh "[htmlCode.downloadUrl]" ".stitch/designs/{page}.html" - Screenshot: Append
=w{width}to the screenshot URL first, where{width}is thewidthvalue 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" - This script handles the necessary redirects and security handshakes.
- HTML:
- Visual audit: Review the downloaded screenshot (
.stitch/designs/{page}.png) to confirm design intent and layout details. You MUST view each screenshot โ do not proceed based on assumptions about the design. - Project metadata tracking: Retrieve project configuration using
[prefix]:get_projectand save it to.stitch/metadata.json(inside the app folder, and mirrored in the workspace root). Ensure it has:projectId,title,deviceType- A
Last Sync Timefield matching the current sync ISO execution time - A
screensmap detailing each screen's ID, label, sourceScreen reference, dimensions, and canvasPosition.
Anti-patterns for Phase 1
- โ Reading
.stitch/designs/*.htmldirectly without calling MCPget_screenfirst. - โ Skipping the
fetch-stitch.shdownload script. - โ Not asking the user when existing files are found.
- โ Skipping the visual audit of
.pngscreenshots. - โ Failing to generate or update
.stitch/metadata.jsonand itsLast Sync Timefield upon syncing.
Phase 2: Theme extraction
GATE: Phase 2 is complete ONLY when
src/theme.tshas been created or updated with tokens extracted from the current project's HTML<head>. Hardcoding color hex codes or using themes from a different project is NOT acceptable.
- Extract
tailwind.config: Open each downloaded HTML file and locate thetailwind.configobject in the<head><script>block. Extract:- All color tokens
- Font families
- Spacing values
- Border radius values
- Font size/typography tokens
- Create/Sync
src/theme.ts: Write the extracted tokens tosrc/theme.tsas TypeScript constants. Ensure every color, spacing, and typography value has a corresponding token. - Verify theme: Confirm the theme colors and fonts in
src/theme.tsmatch what you extracted from the HTML design.
Anti-patterns for Phase 2
- โ Hardcoding color hex codes or rgba strings directly inside component StyleSheet declarations.
- โ Using theme tokens from a previous project without extracting them from the new design.
- โ Skipping the creation/update of
src/theme.ts.
Phase 3: Architectural rules and HTML mapping
GATE: Every component MUST satisfy ALL of the following rules. Violations will cause
npm run validateto fail.
Element mapping
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. |
Style mapping
CSS and Tailwind classes do not work in React Native. Convert all styles to StyleSheet.create():
- Layout: Flexbox is the default layout system.
flexDirectiondefaults to'column'(not'row'like web CSS).display: flexis implicit on everyView.justify-contentmaps tojustifyContent.align-itemsmaps toalignItems.gapmaps togap(React Native 0.71+). For older versions, usemarginBottomon children.
- Dimensions: Use numbers (not strings).
width: 100means 100 density-independent pixels.- Percentage strings are supported:
width: '100%'. - For responsive sizing, use
useWindowDimensions()fromreact-native. - There is no
vw/vh. Calculate fromDimensions.get('window').
- Percentage strings are supported:
- Typography: All text styles must be on
Textcomponents, never onView.font-sizemaps tofontSize(number, not string).font-weightmaps tofontWeight(string:'400','700','bold').line-heightmaps tolineHeight(number).letter-spacingmaps toletterSpacing.text-transformmaps totextTransform.colorapplies toTextonly.
- Borders and shadows:
border-radiusmaps toborderRadius.box-shadowdoes not exist. Useelevation(Android) andshadowColor/shadowOffset/shadowOpacity/shadowRadius(iOS). UsePlatform.select()to apply platform-specific shadow styles.
- Unsupported CSS properties: Do not use
hover,transition,animation(usereact-native-reanimatedfor animations), orposition: fixed(use absolute positioning instead).
Architectural Rules
- Modular components (Atomic Design): Break the design into independent files. Organize components as atoms (buttons, labels, icons), molecules (input groups, cards), and organisms (headers, lists, forms). Place them in
src/components/atoms/,src/components/molecules/, andsrc/components/organisms/. Monolithic page/screen files are PROHIBITED. - Logic isolation: Move event handlers, API calls, and business logic into custom hooks in
src/hooks/. Components should only handle rendering. - Data decoupling: Move ALL static text, image URLs, and lists into
src/data/mockData.ts. No hardcoded content in components. - Type safety: EVERY component file (including screens) MUST export a TypeScript interface named
[ComponentName]Propswithreadonlyproperty modifiers. The validator requires the interface to be exported โ files without an exported Props interface will FAIL validation. - No hardcoded styles: Extract colors, spacing, and font sizes into
src/theme.ts. Reference them inStyleSheet.create(). Absolutely no raw color hex codes or rgba strings are allowed in component files. - Navigation: Use React Navigation for screen transitions. Define screen types with
NativeStackScreenPropsorBottomTabScreenProps. - Accessibility: Every interactive element must have
accessibilityLabelandaccessibilityRole. Images needaccessibilityLabel. UseaccessibilityStatefor toggles and checkboxes. - Safe areas: Wrap top-level screen components with
SafeAreaViewfromreact-native-safe-area-context(not the default one fromreact-native). - Project specific: Focus on the target project's needs and constraints. Leave Google license headers out of the generated components.
Platform-specific code
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,
},
}),
});Anti-patterns for Phase 3
- โ Putting all UI in a single monolithic screen file.
- โ Using HTML tags (like
div,span,p) instead of React Native components. - โ Inline event handlers or business logic without custom hooks.
- โ Hardcoding text, URLs, or colors in component files.
- โ Components without an exported
[Name]Propsinterface. - โ Using raw hex color values or rgba strings in
StyleSheet.create().
Phase 4: Execution steps
GATE: Phase 4 verification, audits, and simulator/packager testing are optional. You MUST ask the user's permission to proceed with validation scripts, starting packagers, or simulator audits.
- Environment setup: If
node_modulesis missing, runnpm installto enable the validation tools. - Theme layer: Create
src/theme.tsfrom the extracted Tailwind config. - Data layer: Create
src/data/mockData.tsbased on the design content. - Component drafting: Use
resources/component-template.tsxas a base. Find and replace ALL instances ofStitchComponentwith the actual component name. Map HTML elements to React Native primitives. - Navigation wiring: If the design has multiple screens, set up a
NavigationContainerwith a stack or tab navigator inApp.tsx. - Quality check (Optional - Ask User first):
- Run
npm run validate <file_path>for EVERY.tsxfile in components and screens to report component validity. - Run
tsc --noEmitto verify TypeScript compile status. - Check output against
resources/architecture-checklist.md. - Obtain permission before starting the packager (
npx react-native startornpx expo start) or starting visual simulator audits to verify the app renders correctly on a simulator/device.
- Run
Anti-patterns for Phase 4
- โ Launching packagers or simulators without user consent.
- โ Declaring task "done" without verifying code compiles.
npx skills add https://github.com/google-labs-code/stitch-skills --skill stitch::react-nativeRun this in your project โ your agent picks the skill up automatically.
Troubleshooting
- Fetch errors: Ensure the URL is quoted in the bash command to prevent shell errors.
- Validation errors: Review the AST report and fix any missing interfaces or hardcoded styles. The most common failures are missing an exported
Propsinterface or leaving raw hex colors inStyleSheet.create(). - Text outside Text component: React Native crashes if raw strings appear outside
<Text>. Verify all text nodes are wrapped. - Image sizing: Unlike web
<img>, React NativeImagehas no intrinsic size. Always specifywidthandheightin styles or useaspectRatio. - FlatList vs ScrollView: If you see a "VirtualizedList inside ScrollView" warning, replace the outer
ScrollViewwith a plainViewor useFlatListListHeaderComponent/ListFooterComponent.
Licensed under Apache-2.0โ you can use, modify, and redistribute it under that license's terms.
View the full license file on GitHub โ