UIPreview
UIPreview
A component that provides a preview of content within a customizable device frame, useful for displaying responsive designs or content previews.
<template> <UIPreview :href="previewUrl" :deviceClasses="'device-mobile'" :pageClasses="'bg-white'" :html="previewContent" > <template #loading> <UISkeleton :rows="5" /> </template>
<template #error> <div class="text-error-600"> Failed to load preview </div> </template> </UIPreview></template>
<script setup lang="ts">const previewUrl = ref('https://example.com')const previewContent = ref('<div>Preview content</div>')</script>Props
href(string): URL to previewdeviceClasses(string): Custom classes for device framepageClasses(string): Custom classes for contenthtml(string): HTML content to previewloading(boolean): Show loading stateerror(boolean): Show error statescale(number): Preview scale factorwidth(number | string): Preview widthheight(number | string): Preview heightscrollable(boolean): Enable content scrolling
Events
load: Emitted when preview loadserror: Emitted on preview errorresize: Emitted when preview resizes
Slots
default: Custom preview contentloading: Custom loading stateerror: Custom error statetoolbar: Custom toolbar contentfooter: Custom footer content
Usage Examples
- Basic URL Preview:
<template> <UIPreview href="https://example.com" /></template>- Custom HTML Content:
<template> <UIPreview :html="htmlContent" :deviceClasses="'device-tablet'" > <template #toolbar> <div class="flex justify-between p-2"> <span>Preview</span> <UIButton @click="refreshPreview"> Refresh </UIButton> </div> </template> </UIPreview></template>
<script setup>const htmlContent = ref(` <div class="p-4"> <h1>Preview Title</h1> <p>Preview content...</p> </div>`)</script>- Responsive Preview:
<template> <div class="space-y-4"> <UIPreview :href="url" deviceClasses="device-mobile" width="375px" />
<UIPreview :href="url" deviceClasses="device-tablet" width="768px" />
<UIPreview :href="url" deviceClasses="device-desktop" width="1024px" /> </div></template>- Interactive Preview:
<template> <UIPreview :html="emailTemplate" :scrollable="true" class="h-[500px]" > <template #toolbar> <div class="flex gap-2"> <UISelect v-model:value="selectedDevice" :options="deviceOptions" /> <UIButton @click="sendTestEmail"> Send Test </UIButton> </div> </template> </UIPreview></template>Best Practices
-
Device Frames:
- Use appropriate device frames
- Maintain aspect ratios
- Support responsive scaling
- Include device chrome
-
Content Handling:
- Sanitize HTML content
- Handle loading states
- Manage error cases
- Support dynamic updates
-
Performance:
- Optimize preview rendering
- Cache preview content
- Lazy load resources
- Handle large content
-
Accessibility:
- Provide keyboard navigation
- Include ARIA labels
- Support screen readers
- Maintain focus management
Common Use Cases
- Email Template Preview:
<template> <UIPreview :html="emailHTML" deviceClasses="device-email" > <template #toolbar> <EmailPreviewToolbar @send-test="sendTestEmail" @edit="editTemplate" /> </template> </UIPreview></template>- Website Responsive Preview:
<template> <UIPreview :href="websiteUrl" :deviceClasses="deviceClass" :width="deviceWidth" > <template #toolbar> <ResponsiveControls v-model:device="selectedDevice" @rotate="rotateDevice" /> </template> </UIPreview></template>- Design System Preview:
<template> <UIPreview :html="componentPreview" deviceClasses="device-component" > <template #toolbar> <div class="flex gap-2"> <UISelect v-model:value="theme" :options="themeOptions" /> <UIButton @click="copyCode"> Copy Code </UIButton> </div> </template> </UIPreview></template>Device Frame Classes
Available device frame classes:
device-mobile: Mobile phone framedevice-tablet: Tablet device framedevice-desktop: Desktop monitor framedevice-laptop: Laptop device framedevice-browser: Browser window framedevice-email: Email client framedevice-component: Minimal component frame