Shared system. Progressive runtime.

Start simple. Grow without rewrites.

Vue-native components, reactive composables, and installable source that fit naturally into templates, JSX, and applications of every size.

ProfileCard.vueReactive
<script setup> const saved = ref(false)</script><template> <Button @click="saved = true"> {{ saved ? 'Saved' : 'Save' }} </Button></template>

State changes. The template follows.

01

Installation

Use the Vue package or install items from the Vue registry.

→
02

Registry

Browse the Vue registry URLs and item inventory.

→
03

Components

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

→
04

Composables

Vue-native 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 previewReactive and interactive

Ship a Vue workspace

Configure your next registry-powered release.

Ready
tile.dev/vue-studio
Preview deploymentsBuild every branch with Nuxt.
Registry sync68%
home-showcase-demo.vueVUE
<script setup lang="ts">import { ref } from 'vue';import { Badge, Button, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Input } from '@tile-ui/vue';import { Switch } from '@tile-ui/vue';import { Progress } from '@tile-ui/vue'; type ShowcasePhase = 'idle' | 'adding' | 'removing'; const { stage, phase } = defineProps<{ stage: number; phase: ShowcasePhase }>();const project = ref('vue-studio');const preview = ref(true);const progress = ref(68);</script> <template>	<Card class="framework-showcase-card">		<CardHeader>			<div class="framework-showcase-card__title">				<div>					<CardTitle>Ship a Vue workspace</CardTitle>					<CardDescription class="framework-showcase-card__description">Configure your next registry-powered release.</CardDescription>				</div>				<Badge variant="secondary">Ready</Badge>			</div>		</CardHeader>		<CardContent class="framework-showcase-card__content">			<Input :model-value="project" label="Project name" :helper-text="`tile.dev/${project || 'workspace'}`" @update:model-value="project = $event" />			<div class="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 Nuxt.</span></div>				<Switch :model-value="preview" aria-label="Enable preview deployments" @update:model-value="preview = $event" />			</div>			<div class="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 class="framework-showcase-card__footer">			<Button class="framework-showcase-card__stage" :data-visible="stage >= 3" :data-active="stage === 3 ? phase : 'idle'" variant="outline" @click="progress = 0"				>Reset</Button			>			<Button>Deploy workspace</Button>		</CardFooter>	</Card></template> 

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

Built for the Vue ecosystem

Progressive from component to application.

  • Vue-native bindingReactive models and events fit directly into existing Vue flows.
  • Composables includedShare browser behavior without coupling it to component markup.
  • Nuxt readyComponents work across client rendering and server-rendered Vue apps.

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.