Build your design system components using the full power of React and TypeScript. Handoff seamlessly integrates React components into your documentation site while maintaining type safety and providing interactive previews.
A straightforward React component using TypeScript for property definitions.
example.tsxtsx1import React from 'react'; 2 3interface IconButtonProps { 4 icon: string; 5 variant?: 'primary' | 'secondary'; 6 onClick?: () => void; 7} 8 9export const IconButton: React.FC<IconButtonProps> = ({ icon, variant = 'primary', onClick }) => { 10 return ( 11 <button className={`btn-icon btn-${variant}`} onClick={onClick}> 12 <i className={`icon-${icon}`} /> 13 </button> 14 ); 15};
A complex component demonstrating sub-components and nested property mapping.
example.tsxtsx1import React from 'react'; 2 3interface Column { 4 key: string; 5 header: string; 6} 7 8interface DataGridProps { 9 columns: Column[]; 10 data: any[]; 11 theme?: 'light' | 'dark'; 12} 13 14export const DataGrid: React.FC<DataGridProps> = ({ columns, data, theme = 'light' }) => { 15 return ( 16 <div className={`data-grid grid-${theme}`}> 17 <div className="grid-header"> 18 {columns.map(col => ( 19 <div key={col.key} className="grid-col-header">{col.header}</div> 20 ))} 21 </div> 22 <div className="grid-body"> 23 {data.map((row, i) => ( 24 <div key={i} className="grid-row"> 25 {columns.map(col => ( 26 <div key={col.key} className="grid-cell">{row[col.key]}</div> 27 ))} 28 </div> 29 ))} 30 </div> 31 </div> 32 ); 33};
When using React templates in Handoff:
interface definitions are respected, ensuring that manual edits in the documentation site remain valid.config.json for seamless Figma-to-code synchronization.