Shared system. React composition.

Build the interface. Keep the control.

Composable React components, practical hooks, and installable source for teams that want a design system without a black box.

workspace.tsxLive tree
<Workspace>
<Form>
useMedia()
<Input />
<Button />

Props flow down. Intent stays with you.

01

Installation

Install the React package or add components from the React registry.

02

Registry

Browse the React registry items published by Tile UI.

03

Components

Read usage notes for Button, Input, Textarea, Label, and Card.

04

Hooks

Client-side helpers for clipboard, storage, and media-query workflows.

05

Examples

See complete example compositions built from the same primitives.

Rendered from the source

See it, it’s yours.

Explore the component and its code.

Live previewComposable and interactive

Ship a React workspace

Configure your next registry-powered release.

Ready
tile.dev/react-studio
Preview deploymentsBuild every branch with React.
Registry sync68%
home-showcase-demo.tsxTSX
'use client'; import { useState } from 'react';import { Badge, Button, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Input } from '@tile-ui/react';import { Switch } from '@tile-ui/react';import { Progress } from '@tile-ui/react'; export function HomeShowcaseDemo({ stage, phase }: { stage: number; phase: 'idle' | 'adding' | 'removing' }) {	const [project, setProject] = useState('react-studio');	const [preview, setPreview] = useState(true);	const [progress, setProgress] = useState(68); 	return (		<Card className="framework-showcase-card">			<CardHeader>				<div className="framework-showcase-card__title">					<div>						<CardTitle>Ship a React workspace</CardTitle>						<CardDescription className="framework-showcase-card__description">Configure your next registry-powered release.</CardDescription>					</div>					<Badge variant="secondary">Ready</Badge>				</div>			</CardHeader>			<CardContent className="framework-showcase-card__content">				<Input label="Project name" value={project} onChange={(event) => setProject(event.target.value)} helperText={`tile.dev/${project || 'workspace'}`} />				<div className="framework-showcase-card__row framework-showcase-card__stage" data-visible={stage >= 1} data-active={stage === 1 ? phase : 'idle'}>					<div>						<strong>Preview deployments</strong>						<span>Build every branch with React.</span>					</div>					<Switch checked={preview} onCheckedChange={(value) => setPreview(value === true)} aria-label="Enable preview deployments" />				</div>				<div className="framework-showcase-card__progress framework-showcase-card__stage" data-visible={stage >= 2} data-active={stage === 2 ? phase : 'idle'}>					<div>						<strong>Registry sync</strong>						<span>{progress}%</span>					</div>					<Progress value={progress} aria-label="Registry sync progress" />				</div>			</CardContent>			<CardFooter className="framework-showcase-card__footer">				<Button					className="framework-showcase-card__stage"					data-visible={stage >= 3}					data-active={stage === 3 ? phase : 'idle'}					variant="outline"					onClick={() => setProgress(0)}>					Reset				</Button>				<Button>Deploy workspace</Button>			</CardFooter>		</Card>	);} 

Drag to compare · Use arrow keys when the divider is focused

Built for the React ecosystem

From local state to production rendering.

  • Client + serverDesigned for interactive clients and modern React server rendering.
  • Hooks includedReusable browser behavior through a dedicated hooks entry point.
  • Source availableInstall registry items directly into the application you own.

One system, every runtime

Your framework, your components.

Tile UI carries the same design language and source-owned workflow across frameworks, without flattening their native patterns.