299 lines
8.6 KiB
Vue
299 lines
8.6 KiB
Vue
<script setup>
|
|
definePageMeta({
|
|
title: "Popover",
|
|
layout: "admin",
|
|
});
|
|
|
|
const basicCode = `<template>
|
|
<Popover>
|
|
<PopoverTrigger>
|
|
<Button>Click me</Button>
|
|
</PopoverTrigger>
|
|
<PopoverContent>
|
|
<p>This is the popover content.</p>
|
|
</PopoverContent>
|
|
</Popover>
|
|
</template>`;
|
|
|
|
const positionCode = `<template>
|
|
<div class="flex gap-4">
|
|
<Popover>
|
|
<PopoverTrigger>
|
|
<Button>Top</Button>
|
|
</PopoverTrigger>
|
|
<PopoverContent side="top">
|
|
<p>This popover appears on top</p>
|
|
</PopoverContent>
|
|
</Popover>
|
|
|
|
<Popover>
|
|
<PopoverTrigger>
|
|
<Button>Right</Button>
|
|
</PopoverTrigger>
|
|
<PopoverContent side="right">
|
|
<p>This popover appears on the right</p>
|
|
</PopoverContent>
|
|
</Popover>
|
|
|
|
<Popover>
|
|
<PopoverTrigger>
|
|
<Button>Bottom</Button>
|
|
</PopoverTrigger>
|
|
<PopoverContent side="bottom">
|
|
<p>This popover appears at the bottom</p>
|
|
</PopoverContent>
|
|
</Popover>
|
|
|
|
<Popover>
|
|
<PopoverTrigger>
|
|
<Button>Left</Button>
|
|
</PopoverTrigger>
|
|
<PopoverContent side="left">
|
|
<p>This popover appears on the left</p>
|
|
</PopoverContent>
|
|
</Popover>
|
|
</div>
|
|
</template>`;
|
|
|
|
const alignmentCode = `<template>
|
|
<div class="flex gap-4">
|
|
<Popover>
|
|
<PopoverTrigger>
|
|
<Button>Start</Button>
|
|
</PopoverTrigger>
|
|
<PopoverContent align="start">
|
|
<p>Aligned to start</p>
|
|
</PopoverContent>
|
|
</Popover>
|
|
|
|
<Popover>
|
|
<PopoverTrigger>
|
|
<Button>Center</Button>
|
|
</PopoverTrigger>
|
|
<PopoverContent align="center">
|
|
<p>Aligned to center</p>
|
|
</PopoverContent>
|
|
</Popover>
|
|
|
|
<Popover>
|
|
<PopoverTrigger>
|
|
<Button>End</Button>
|
|
</PopoverTrigger>
|
|
<PopoverContent align="end">
|
|
<p>Aligned to end</p>
|
|
</PopoverContent>
|
|
</Popover>
|
|
</div>
|
|
</template>`;
|
|
</script>
|
|
|
|
<template>
|
|
<div class="space-y-6">
|
|
<!-- Introduction -->
|
|
<div class="mb-6">
|
|
<h1 class="text-2xl font-semibold">Popover</h1>
|
|
<p class="text-gray-600">A popover component that displays floating content when clicking on a trigger element.</p>
|
|
</div>
|
|
|
|
<!-- Basic Usage -->
|
|
<Card>
|
|
<CardHeader>
|
|
<CardTitle>
|
|
<h2 class="text-xl font-semibold">Basic Usage</h2>
|
|
</CardTitle>
|
|
<CardDescription>
|
|
A simple popover that appears when clicking a trigger element.
|
|
</CardDescription>
|
|
</CardHeader>
|
|
<CardContent>
|
|
<div class="mb-6">
|
|
<Popover>
|
|
<PopoverTrigger>
|
|
<Button>Click me</Button>
|
|
</PopoverTrigger>
|
|
<PopoverContent>
|
|
<p>This is the popover content.</p>
|
|
</PopoverContent>
|
|
</Popover>
|
|
</div>
|
|
<div class="mt-4">
|
|
<ClientOnly>
|
|
<CodeBlock :code="basicCode" language="markup" />
|
|
</ClientOnly>
|
|
</div>
|
|
</CardContent>
|
|
</Card>
|
|
|
|
<!-- Positioning -->
|
|
<Card>
|
|
<CardHeader>
|
|
<CardTitle>
|
|
<h2 class="text-xl font-semibold">Positioning</h2>
|
|
</CardTitle>
|
|
<CardDescription>
|
|
Control the position of the popover relative to its trigger using the side prop.
|
|
</CardDescription>
|
|
</CardHeader>
|
|
<CardContent>
|
|
<div class="mb-6">
|
|
<div class="flex gap-4">
|
|
<Popover>
|
|
<PopoverTrigger>
|
|
<Button>Top</Button>
|
|
</PopoverTrigger>
|
|
<PopoverContent side="top">
|
|
<p>This popover appears on top</p>
|
|
</PopoverContent>
|
|
</Popover>
|
|
|
|
<Popover>
|
|
<PopoverTrigger>
|
|
<Button>Right</Button>
|
|
</PopoverTrigger>
|
|
<PopoverContent side="right">
|
|
<p>This popover appears on the right</p>
|
|
</PopoverContent>
|
|
</Popover>
|
|
|
|
<Popover>
|
|
<PopoverTrigger>
|
|
<Button>Bottom</Button>
|
|
</PopoverTrigger>
|
|
<PopoverContent side="bottom">
|
|
<p>This popover appears at the bottom</p>
|
|
</PopoverContent>
|
|
</Popover>
|
|
|
|
<Popover>
|
|
<PopoverTrigger>
|
|
<Button>Left</Button>
|
|
</PopoverTrigger>
|
|
<PopoverContent side="left">
|
|
<p>This popover appears on the left</p>
|
|
</PopoverContent>
|
|
</Popover>
|
|
</div>
|
|
</div>
|
|
<div class="mt-4">
|
|
<ClientOnly>
|
|
<CodeBlock :code="positionCode" language="markup" />
|
|
</ClientOnly>
|
|
</div>
|
|
</CardContent>
|
|
</Card>
|
|
|
|
<!-- Alignment -->
|
|
<Card>
|
|
<CardHeader>
|
|
<CardTitle>
|
|
<h2 class="text-xl font-semibold">Alignment</h2>
|
|
</CardTitle>
|
|
<CardDescription>
|
|
Control how the popover aligns with its trigger using the align prop.
|
|
</CardDescription>
|
|
</CardHeader>
|
|
<CardContent>
|
|
<div class="mb-6">
|
|
<div class="flex gap-4">
|
|
<Popover>
|
|
<PopoverTrigger>
|
|
<Button>Start</Button>
|
|
</PopoverTrigger>
|
|
<PopoverContent align="start">
|
|
<p>Aligned to start</p>
|
|
</PopoverContent>
|
|
</Popover>
|
|
|
|
<Popover>
|
|
<PopoverTrigger>
|
|
<Button>Center</Button>
|
|
</PopoverTrigger>
|
|
<PopoverContent align="center">
|
|
<p>Aligned to center</p>
|
|
</PopoverContent>
|
|
</Popover>
|
|
|
|
<Popover>
|
|
<PopoverTrigger>
|
|
<Button>End</Button>
|
|
</PopoverTrigger>
|
|
<PopoverContent align="end">
|
|
<p>Aligned to end</p>
|
|
</PopoverContent>
|
|
</Popover>
|
|
</div>
|
|
</div>
|
|
<div class="mt-4">
|
|
<ClientOnly>
|
|
<CodeBlock :code="alignmentCode" language="markup" />
|
|
</ClientOnly>
|
|
</div>
|
|
</CardContent>
|
|
</Card>
|
|
|
|
<!-- API Reference -->
|
|
<Card>
|
|
<CardHeader>
|
|
<CardTitle>
|
|
<h2 class="text-xl font-semibold">API Reference</h2>
|
|
</CardTitle>
|
|
</CardHeader>
|
|
<CardContent>
|
|
<div class="space-y-6">
|
|
<!-- PopoverContent Props -->
|
|
<div>
|
|
<h3 class="text-lg font-semibold mb-4">PopoverContent Props</h3>
|
|
<Table>
|
|
<TableHeader>
|
|
<TableRow>
|
|
<TableHead>Prop</TableHead>
|
|
<TableHead>Type</TableHead>
|
|
<TableHead>Default</TableHead>
|
|
<TableHead>Description</TableHead>
|
|
</TableRow>
|
|
</TableHeader>
|
|
<TableBody>
|
|
<TableRow>
|
|
<TableCell>side</TableCell>
|
|
<TableCell><code>'top' | 'right' | 'bottom' | 'left'</code></TableCell>
|
|
<TableCell><code>'bottom'</code></TableCell>
|
|
<TableCell>The preferred side to place the popover relative to its trigger.</TableCell>
|
|
</TableRow>
|
|
<TableRow>
|
|
<TableCell>align</TableCell>
|
|
<TableCell><code>'start' | 'center' | 'end'</code></TableCell>
|
|
<TableCell><code>'center'</code></TableCell>
|
|
<TableCell>The preferred alignment along the trigger element.</TableCell>
|
|
</TableRow>
|
|
<TableRow>
|
|
<TableCell>sideOffset</TableCell>
|
|
<TableCell><code>number</code></TableCell>
|
|
<TableCell><code>4</code></TableCell>
|
|
<TableCell>The distance in pixels from the trigger.</TableCell>
|
|
</TableRow>
|
|
<TableRow>
|
|
<TableCell>alignOffset</TableCell>
|
|
<TableCell><code>number</code></TableCell>
|
|
<TableCell><code>0</code></TableCell>
|
|
<TableCell>The offset in pixels from the start or end alignment.</TableCell>
|
|
</TableRow>
|
|
</TableBody>
|
|
</Table>
|
|
</div>
|
|
|
|
<!-- Features -->
|
|
<div>
|
|
<h3 class="text-lg font-semibold mb-4">Features</h3>
|
|
<ul class="list-disc list-inside space-y-2">
|
|
<li>Automatic positioning to stay within viewport</li>
|
|
<li>Smooth animations and transitions</li>
|
|
<li>Click outside to dismiss</li>
|
|
<li>Flexible alignment options</li>
|
|
<li>Customizable offset and spacing</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</CardContent>
|
|
</Card>
|
|
</div>
|
|
</template> |