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.