shadcn-vue/apps/www/src/lib/registry/default/block/Dashboard01.vue
2024-10-14 19:48:05 +08:00

463 lines
17 KiB
Vue

<script lang="ts">
export const description = 'An application shell with a header and main content area. The header has a navbar, a search input and and a user nav dropdown. The user nav is toggled by a button with an avatar image. The main content area is divided into two rows. The first row has a grid of cards with statistics. The second row has a grid of cards with a table of recent transactions and a list of recent sales.'
export const iframeHeight = '825px'
export const containerClass = 'w-full h-full'
</script>
<script setup lang="ts">
import { Avatar, AvatarFallback, AvatarImage } from '@/lib/registry/default/ui/avatar'
import { Badge } from '@/lib/registry/default/ui/badge'
import { Button } from '@/lib/registry/default/ui/button'
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/lib/registry/default/ui/card'
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger } from '@/lib/registry/default/ui/dropdown-menu'
import { Input } from '@/lib/registry/default/ui/input'
import { Sheet, SheetContent, SheetTrigger } from '@/lib/registry/default/ui/sheet'
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/lib/registry/default/ui/table'
import { Activity, ArrowUpRight, CircleUser, CreditCard, DollarSign, Menu, Package2, Search, Users } from 'lucide-vue-next'
</script>
<template>
<div class="flex min-h-screen w-full flex-col">
<header class="sticky top-0 flex h-16 items-center gap-4 border-b bg-background px-4 md:px-6">
<nav class="hidden flex-col gap-6 text-lg font-medium md:flex md:flex-row md:items-center md:gap-5 md:text-sm lg:gap-6">
<a
href="#"
class="flex items-center gap-2 text-lg font-semibold md:text-base"
>
<Package2 class="h-6 w-6" />
<span class="sr-only">Acme Inc</span>
</a>
<a
href="#"
class="text-foreground transition-colors hover:text-foreground"
>
Dashboard
</a>
<a
href="#"
class="text-muted-foreground transition-colors hover:text-foreground"
>
Orders
</a>
<a
href="#"
class="text-muted-foreground transition-colors hover:text-foreground"
>
Products
</a>
<a
href="#"
class="text-muted-foreground transition-colors hover:text-foreground"
>
Customers
</a>
<a
href="#"
class="text-muted-foreground transition-colors hover:text-foreground"
>
Analytics
</a>
</nav>
<Sheet>
<SheetTrigger as-child>
<Button
variant="outline"
size="icon"
class="shrink-0 md:hidden"
>
<Menu class="h-5 w-5" />
<span class="sr-only">Toggle navigation menu</span>
</Button>
</SheetTrigger>
<SheetContent side="left">
<nav class="grid gap-6 text-lg font-medium">
<a
href="#"
class="flex items-center gap-2 text-lg font-semibold"
>
<Package2 class="h-6 w-6" />
<span class="sr-only">Acme Inc</span>
</a>
<a href="#" class="hover:text-foreground">
Dashboard
</a>
<a
href="#"
class="text-muted-foreground hover:text-foreground"
>
Orders
</a>
<a
href="#"
class="text-muted-foreground hover:text-foreground"
>
Products
</a>
<a
href="#"
class="text-muted-foreground hover:text-foreground"
>
Customers
</a>
<a
href="#"
class="text-muted-foreground hover:text-foreground"
>
Analytics
</a>
</nav>
</SheetContent>
</Sheet>
<div class="flex w-full items-center gap-4 md:ml-auto md:gap-2 lg:gap-4">
<form class="ml-auto flex-1 sm:flex-initial">
<div class="relative">
<Search class="absolute left-2.5 top-2.5 h-4 w-4 text-muted-foreground" />
<Input
type="search"
placeholder="Search products..."
class="pl-8 sm:w-[300px] md:w-[200px] lg:w-[300px]"
/>
</div>
</form>
<DropdownMenu>
<DropdownMenuTrigger as-child>
<Button variant="secondary" size="icon" class="rounded-full">
<CircleUser class="h-5 w-5" />
<span class="sr-only">Toggle user menu</span>
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="end">
<DropdownMenuLabel>My Account</DropdownMenuLabel>
<DropdownMenuSeparator />
<DropdownMenuItem>Settings</DropdownMenuItem>
<DropdownMenuItem>Support</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuItem>Logout</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
</div>
</header>
<main class="flex flex-1 flex-col gap-4 p-4 md:gap-8 md:p-8">
<div class="grid gap-4 md:grid-cols-2 md:gap-8 lg:grid-cols-4">
<Card>
<CardHeader class="flex flex-row items-center justify-between space-y-0 pb-2">
<CardTitle class="text-sm font-medium">
Total Revenue
</CardTitle>
<DollarSign class="h-4 w-4 text-muted-foreground" />
</CardHeader>
<CardContent>
<div class="text-2xl font-bold">
$45,231.89
</div>
<p class="text-xs text-muted-foreground">
+20.1% from last month
</p>
</CardContent>
</Card>
<Card>
<CardHeader class="flex flex-row items-center justify-between space-y-0 pb-2">
<CardTitle class="text-sm font-medium">
Subscriptions
</CardTitle>
<Users class="h-4 w-4 text-muted-foreground" />
</CardHeader>
<CardContent>
<div class="text-2xl font-bold">
+2350
</div>
<p class="text-xs text-muted-foreground">
+180.1% from last month
</p>
</CardContent>
</Card>
<Card>
<CardHeader class="flex flex-row items-center justify-between space-y-0 pb-2">
<CardTitle class="text-sm font-medium">
Sales
</CardTitle>
<CreditCard class="h-4 w-4 text-muted-foreground" />
</CardHeader>
<CardContent>
<div class="text-2xl font-bold">
+12,234
</div>
<p class="text-xs text-muted-foreground">
+19% from last month
</p>
</CardContent>
</Card>
<Card>
<CardHeader class="flex flex-row items-center justify-between space-y-0 pb-2">
<CardTitle class="text-sm font-medium">
Active Now
</CardTitle>
<Activity class="h-4 w-4 text-muted-foreground" />
</CardHeader>
<CardContent>
<div class="text-2xl font-bold">
+573
</div>
<p class="text-xs text-muted-foreground">
+201 since last hour
</p>
</CardContent>
</Card>
</div>
<div class="grid gap-4 md:gap-8 lg:grid-cols-2 xl:grid-cols-3">
<Card class="xl:col-span-2">
<CardHeader class="flex flex-row items-center">
<div class="grid gap-2">
<CardTitle>Transactions</CardTitle>
<CardDescription>
Recent transactions from your store.
</CardDescription>
</div>
<Button as-child size="sm" class="ml-auto gap-1">
<a href="#">
View All
<ArrowUpRight class="h-4 w-4" />
</a>
</Button>
</CardHeader>
<CardContent>
<Table>
<TableHeader>
<TableRow>
<TableHead>Customer</TableHead>
<TableHead class="hidden xl:table-column">
Type
</TableHead>
<TableHead class="hidden xl:table-column">
Status
</TableHead>
<TableHead class="hidden xl:table-column">
Date
</TableHead>
<TableHead class="text-right">
Amount
</TableHead>
</TableRow>
</TableHeader>
<TableBody>
<TableRow>
<TableCell>
<div class="font-medium">
Liam Johnson
</div>
<div class="hidden text-sm text-muted-foreground md:inline">
liam@example.com
</div>
</TableCell>
<TableCell class="hidden xl:table-column">
Sale
</TableCell>
<TableCell class="hidden xl:table-column">
<Badge class="text-xs" variant="outline">
Approved
</Badge>
</TableCell>
<TableCell class="hidden md:table-cell lg:hidden xl:table-column">
2023-06-23
</TableCell>
<TableCell class="text-right">
$250.00
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<div class="font-medium">
Olivia Smith
</div>
<div class="hidden text-sm text-muted-foreground md:inline">
olivia@example.com
</div>
</TableCell>
<TableCell class="hidden xl:table-column">
Refund
</TableCell>
<TableCell class="hidden xl:table-column">
<Badge class="text-xs" variant="outline">
Declined
</Badge>
</TableCell>
<TableCell class="hidden md:table-cell lg:hidden xl:table-column">
2023-06-24
</TableCell>
<TableCell class="text-right">
$150.00
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<div class="font-medium">
Noah Williams
</div>
<div class="hidden text-sm text-muted-foreground md:inline">
noah@example.com
</div>
</TableCell>
<TableCell class="hidden xl:table-column">
Subscription
</TableCell>
<TableCell class="hidden xl:table-column">
<Badge class="text-xs" variant="outline">
Approved
</Badge>
</TableCell>
<TableCell class="hidden md:table-cell lg:hidden xl:table-column">
2023-06-25
</TableCell>
<TableCell class="text-right">
$350.00
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<div class="font-medium">
Emma Brown
</div>
<div class="hidden text-sm text-muted-foreground md:inline">
emma@example.com
</div>
</TableCell>
<TableCell class="hidden xl:table-column">
Sale
</TableCell>
<TableCell class="hidden xl:table-column">
<Badge class="text-xs" variant="outline">
Approved
</Badge>
</TableCell>
<TableCell class="hidden md:table-cell lg:hidden xl:table-column">
2023-06-26
</TableCell>
<TableCell class="text-right">
$450.00
</TableCell>
</TableRow>
<TableRow>
<TableCell>
<div class="font-medium">
Liam Johnson
</div>
<div class="hidden text-sm text-muted-foreground md:inline">
liam@example.com
</div>
</TableCell>
<TableCell class="hidden xl:table-column">
Sale
</TableCell>
<TableCell class="hidden xl:table-column">
<Badge class="text-xs" variant="outline">
Approved
</Badge>
</TableCell>
<TableCell class="hidden md:table-cell lg:hidden xl:table-column">
2023-06-27
</TableCell>
<TableCell class="text-right">
$550.00
</TableCell>
</TableRow>
</TableBody>
</Table>
</CardContent>
</Card>
<Card>
<CardHeader>
<CardTitle>Recent Sales</CardTitle>
</CardHeader>
<CardContent class="grid gap-8">
<div class="flex items-center gap-4">
<Avatar class="hidden h-9 w-9 sm:flex">
<AvatarImage src="/avatars/01.png" alt="Avatar" />
<AvatarFallback>OM</AvatarFallback>
</Avatar>
<div class="grid gap-1">
<p class="text-sm font-medium leading-none">
Olivia Martin
</p>
<p class="text-sm text-muted-foreground">
olivia.martin@email.com
</p>
</div>
<div class="ml-auto font-medium">
+$1,999.00
</div>
</div>
<div class="flex items-center gap-4">
<Avatar class="hidden h-9 w-9 sm:flex">
<AvatarImage src="/avatars/02.png" alt="Avatar" />
<AvatarFallback>JL</AvatarFallback>
</Avatar>
<div class="grid gap-1">
<p class="text-sm font-medium leading-none">
Jackson Lee
</p>
<p class="text-sm text-muted-foreground">
jackson.lee@email.com
</p>
</div>
<div class="ml-auto font-medium">
+$39.00
</div>
</div>
<div class="flex items-center gap-4">
<Avatar class="hidden h-9 w-9 sm:flex">
<AvatarImage src="/avatars/03.png" alt="Avatar" />
<AvatarFallback>IN</AvatarFallback>
</Avatar>
<div class="grid gap-1">
<p class="text-sm font-medium leading-none">
Isabella Nguyen
</p>
<p class="text-sm text-muted-foreground">
isabella.nguyen@email.com
</p>
</div>
<div class="ml-auto font-medium">
+$299.00
</div>
</div>
<div class="flex items-center gap-4">
<Avatar class="hidden h-9 w-9 sm:flex">
<AvatarImage src="/avatars/04.png" alt="Avatar" />
<AvatarFallback>WK</AvatarFallback>
</Avatar>
<div class="grid gap-1">
<p class="text-sm font-medium leading-none">
William Kim
</p>
<p class="text-sm text-muted-foreground">
will@email.com
</p>
</div>
<div class="ml-auto font-medium">
+$99.00
</div>
</div>
<div class="flex items-center gap-4">
<Avatar class="hidden h-9 w-9 sm:flex">
<AvatarImage src="/avatars/05.png" alt="Avatar" />
<AvatarFallback>SD</AvatarFallback>
</Avatar>
<div class="grid gap-1">
<p class="text-sm font-medium leading-none">
Sofia Davis
</p>
<p class="text-sm text-muted-foreground">
sofia.davis@email.com
</p>
</div>
<div class="ml-auto font-medium">
+$39.00
</div>
</div>
</CardContent>
</Card>
</div>
</main>
</div>
</template>