
React Native
Render AI-generated or catalog-defined JSON UI specs into React Native screens without hand-building every component tree.
Install
npx skills add https://github.com/vercel-labs/json-render --skill react-nativeWhat is this skill?
- Maps @json-render JSON specs to native React Native component trees with data binding and actions
- Ships standard component definitions plus defineRegistry for custom components (e.g. icons)
- Uses Zod-backed defineCatalog for typed props, slots, and action definitions
- Supports visibility rules and dynamic props for AI-generated or server-driven layouts
- Pairs with @json-render/core schema and catalog patterns from the json-render ecosystem
Adoption & trust: 985 installs on skills.sh; 15k GitHub stars; 3/3 security scanners passed (skills.sh audits).
Recommended Skills
Vercel React Native Skillsvercel-labs/agent-skills
Firebase Basicsfirebase/agent-skills
Building Native Uiexpo/skills
Firebase Ai Logic Basicsfirebase/agent-skills
Native Data Fetchingexpo/skills
Firebase Firestorefirebase/agent-skills
Journey fit
Common Questions / FAQ
Is React Native safe to install?
skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.
SKILL.md
READMESKILL.md - React Native
# @json-render/react-native React Native renderer that converts JSON specs into native mobile component trees with standard components, data binding, visibility, actions, and dynamic props. ## Quick Start ```typescript import { defineCatalog } from "@json-render/core"; import { schema } from "@json-render/react-native/schema"; import { standardComponentDefinitions, standardActionDefinitions, } from "@json-render/react-native/catalog"; import { defineRegistry, Renderer, type Components } from "@json-render/react-native"; import { z } from "zod"; // Create catalog with standard + custom components const catalog = defineCatalog(schema, { components: { ...standardComponentDefinitions, Icon: { props: z.object({ name: z.string(), size: z.number().nullable(), color: z.string().nullable() }), slots: [], description: "Icon display", }, }, actions: standardActionDefinitions, }); // Register only custom components (standard ones are built-in) const { registry } = defineRegistry(catalog, { components: { Icon: ({ props }) => <Ionicons name={props.name} size={props.size ?? 24} />, } as Components<typeof catalog>, }); // Render function App({ spec }) { return ( <StateProvider initialState={{}}> <VisibilityProvider> <ActionProvider handlers={{}}> <Renderer spec={spec} registry={registry} /> </ActionProvider> </VisibilityProvider> </StateProvider> ); } ``` ## Standard Components ### Layout - `Container` - wrapper with padding, background, border radius - `Row` - horizontal flex layout with gap, alignment - `Column` - vertical flex layout with gap, alignment - `ScrollContainer` - scrollable area (vertical or horizontal) - `SafeArea` - safe area insets for notch/home indicator - `Pressable` - touchable wrapper that triggers actions on press - `Spacer` - fixed or flexible spacing - `Divider` - thin line separator ### Content - `Heading` - heading text (levels 1-6) - `Paragraph` - body text - `Label` - small label text - `Image` - image display with sizing modes - `Avatar` - circular avatar image - `Badge` - small status badge - `Chip` - tag/chip for categories ### Input - `Button` - pressable button with variants - `TextInput` - text input field - `Switch` - toggle switch - `Checkbox` - checkbox with label - `Slider` - range slider - `SearchBar` - search input ### Feedback - `Spinner` - loading indicator - `ProgressBar` - progress indicator ### Composite - `Card` - card container with optional header - `ListItem` - list row with title, subtitle, accessory - `Modal` - bottom sheet modal ## Visibility Conditions Use `visible` on elements. Syntax: `{ "$state": "/path" }`, `{ "$state": "/path", "eq": value }`, `{ "$state": "/path", "not": true }`, `[ cond1, cond2 ]` for AND. ## Pressable + setState Pattern Use `Pressable` with the built-in `setState` action for interactive UIs like tab bars: ```json { "type": "Pressable", "props": { "action": "setState", "actionParams": { "statePath": "/activeTab", "value": "home" } }, "children": ["home-icon", "home-label"] } ``` ## Dynamic Prop Expressions Any prop value can be a data-driven expression resolved at render time: - **`{ "$state": "/state/key" }`** - reads from state model (one-way read) - **`{ "$bindState": "/path" }`** - two-way binding: use on the natural value prop (value, checked, pressed, etc.) of form components. - **`{ "$bindItem": "field" }`** - two-way binding to a repeat item field. Use inside repeat scopes. - **`{ "$cond": <condition>, "$then": <value>, "$else": <value> }`** - conditional value ```json { "type": "TextInput", "props": { "value": { "$bindState": "/for