New Components: Field, Input Group, Item and more
Building Blocks for the Web
Clean, modern building blocks. Copy and paste into your apps. Works with all Vue frameworks. Open Source. Free forever.
Files
<script lang="ts">
export const iframeHeight = "800px"
export const description = "A dashboard with sidebar, data table, and analytics cards."
</script>
<script setup lang="ts">
import AppSidebar from "@/components/AppSidebar.vue"
import ChartAreaInteractive from "@/components/ChartAreaInteractive.vue"
import DataTable from "@/components/DataTable.vue"
import SectionCards from "@/components/SectionCards.vue"
import SiteHeader from "@/components/SiteHeader.vue"
import {
SidebarInset,
SidebarProvider,
} from "@/components/ui/sidebar"
const data = [
{
id: 1,
header: "Cover page",
type: "Cover page",
status: "In Process",
target: "18",
limit: "5",
reviewer: "Eddie Lake",
},
{
id: 2,
header: "Table of contents",
type: "Table of contents",
status: "Done",
target: "29",
limit: "24",
reviewer: "Eddie Lake",
},
{
id: 3,
header: "Executive summary",
type: "Narrative",
status: "Done",
target: "10",
limit: "13",
reviewer: "Eddie Lake",
},
{
id: 4,
header: "Technical approach",
type: "Narrative",
status: "Done",
target: "27",
limit: "23",
reviewer: "Jamik Tashpulatov",
},
{
id: 5,
header: "Design",
type: "Narrative",
status: "In Process",
target: "2",
limit: "16",
reviewer: "Jamik Tashpulatov",
},
{
id: 6,
header: "Capabilities",
type: "Narrative",
status: "In Process",
target: "20",
limit: "8",
reviewer: "Jamik Tashpulatov",
},
{
id: 7,
header: "Integration with existing systems",
type: "Narrative",
status: "In Process",
target: "19",
limit: "21",
reviewer: "Jamik Tashpulatov",
},
{
id: 8,
header: "Innovation and Advantages",
type: "Narrative",
status: "Done",
target: "25",
limit: "26",
reviewer: "Assign reviewer",
},
{
id: 9,
header: "Overview of EMR's Innovative Solutions",
type: "Technical content",
status: "Done",
target: "7",
limit: "23",
reviewer: "Assign reviewer",
},
{
id: 10,
header: "Advanced Algorithms and Machine Learning",
type: "Narrative",
status: "Done",
target: "30",
limit: "28",
reviewer: "Assign reviewer",
},
{
id: 11,
header: "Adaptive Communication Protocols",
type: "Narrative",
status: "Done",
target: "9",
limit: "31",
reviewer: "Assign reviewer",
},
{
id: 12,
header: "Advantages Over Current Technologies",
type: "Narrative",
status: "Done",
target: "12",
limit: "0",
reviewer: "Assign reviewer",
},
{
id: 13,
header: "Past Performance",
type: "Narrative",
status: "Done",
target: "22",
limit: "33",
reviewer: "Assign reviewer",
},
{
id: 14,
header: "Customer Feedback and Satisfaction Levels",
type: "Narrative",
status: "Done",
target: "15",
limit: "34",
reviewer: "Assign reviewer",
},
{
id: 15,
header: "Implementation Challenges and Solutions",
type: "Narrative",
status: "Done",
target: "3",
limit: "35",
reviewer: "Assign reviewer",
},
{
id: 16,
header: "Security Measures and Data Protection Policies",
type: "Narrative",
status: "In Process",
target: "6",
limit: "36",
reviewer: "Assign reviewer",
},
{
id: 17,
header: "Scalability and Future Proofing",
type: "Narrative",
status: "Done",
target: "4",
limit: "37",
reviewer: "Assign reviewer",
},
{
id: 18,
header: "Cost-Benefit Analysis",
type: "Plain language",
status: "Done",
target: "14",
limit: "38",
reviewer: "Assign reviewer",
},
{
id: 19,
header: "User Training and Onboarding Experience",
type: "Narrative",
status: "Done",
target: "17",
limit: "39",
reviewer: "Assign reviewer",
},
{
id: 20,
header: "Future Development Roadmap",
type: "Narrative",
status: "Done",
target: "11",
limit: "40",
reviewer: "Assign reviewer",
},
{
id: 21,
header: "System Architecture Overview",
type: "Technical content",
status: "In Process",
target: "24",
limit: "18",
reviewer: "Maya Johnson",
},
{
id: 22,
header: "Risk Management Plan",
type: "Narrative",
status: "Done",
target: "15",
limit: "22",
reviewer: "Carlos Rodriguez",
},
{
id: 23,
header: "Compliance Documentation",
type: "Legal",
status: "In Process",
target: "31",
limit: "27",
reviewer: "Sarah Chen",
},
{
id: 24,
header: "API Documentation",
type: "Technical content",
status: "Done",
target: "8",
limit: "12",
reviewer: "Raj Patel",
},
{
id: 25,
header: "User Interface Mockups",
type: "Visual",
status: "In Process",
target: "19",
limit: "25",
reviewer: "Leila Ahmadi",
},
{
id: 26,
header: "Database Schema",
type: "Technical content",
status: "Done",
target: "22",
limit: "20",
reviewer: "Thomas Wilson",
},
{
id: 27,
header: "Testing Methodology",
type: "Technical content",
status: "In Process",
target: "17",
limit: "14",
reviewer: "Assign reviewer",
},
{
id: 28,
header: "Deployment Strategy",
type: "Narrative",
status: "Done",
target: "26",
limit: "30",
reviewer: "Eddie Lake",
},
{
id: 29,
header: "Budget Breakdown",
type: "Financial",
status: "In Process",
target: "13",
limit: "16",
reviewer: "Jamik Tashpulatov",
},
{
id: 30,
header: "Market Analysis",
type: "Research",
status: "Done",
target: "29",
limit: "32",
reviewer: "Sophia Martinez",
},
]
</script>
<template>
<SidebarProvider
:style=" {
'--sidebar-width': 'calc(var(--spacing) * 72)',
'--header-height': 'calc(var(--spacing) * 12)',
}"
>
<AppSidebar variant="inset" />
<SidebarInset>
<SiteHeader />
<div class="flex flex-1 flex-col">
<div class="@container/main flex flex-1 flex-col gap-2">
<div class="flex flex-col gap-4 py-4 md:gap-6 md:py-6">
<SectionCards />
<div class="px-4 lg:px-6">
<ChartAreaInteractive />
</div>
<DataTable :data="data" />
</div>
</div>
</div>
</SidebarInset>
</SidebarProvider>
</template>
A dashboard with sidebar, charts and data table.
dashboard-01
Files
<script lang="ts">
export const description
= "A sidebar that collapses to icons."
export const iframeHeight = "800px"
export const containerClass = "w-full h-full"
</script>
<script setup lang="ts">
import AppSidebar from "@/components/AppSidebar.vue"
import {
Breadcrumb,
BreadcrumbItem,
BreadcrumbLink,
BreadcrumbList,
BreadcrumbPage,
BreadcrumbSeparator,
} from "@/components/ui/breadcrumb"
import { Separator } from "@/components/ui/separator"
import {
SidebarInset,
SidebarProvider,
SidebarTrigger,
} from "@/components/ui/sidebar"
</script>
<template>
<SidebarProvider>
<AppSidebar />
<SidebarInset>
<header class="flex h-16 shrink-0 items-center gap-2 transition-[width,height] ease-linear group-has-data-[collapsible=icon]/sidebar-wrapper:h-12">
<div class="flex items-center gap-2 px-4">
<SidebarTrigger class="-ml-1" />
<Separator
orientation="vertical"
class="mr-2 data-[orientation=vertical]:h-4"
/>
<Breadcrumb>
<BreadcrumbList>
<BreadcrumbItem class="hidden md:block">
<BreadcrumbLink href="#">
Building Your Application
</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbSeparator class="hidden md:block" />
<BreadcrumbItem>
<BreadcrumbPage>Data Fetching</BreadcrumbPage>
</BreadcrumbItem>
</BreadcrumbList>
</Breadcrumb>
</div>
</header>
<div class="flex flex-1 flex-col gap-4 p-4 pt-0">
<div class="grid auto-rows-min gap-4 md:grid-cols-3">
<div class="bg-muted/50 aspect-video rounded-xl" />
<div class="bg-muted/50 aspect-video rounded-xl" />
<div class="bg-muted/50 aspect-video rounded-xl" />
</div>
<div class="bg-muted/50 min-h-[100vh] flex-1 rounded-xl md:min-h-min" />
</div>
</SidebarInset>
</SidebarProvider>
</template>
A sidebar that collapses to icons
sidebar-07
Files
<script lang="ts">
export const iframeHeight = "800px"
export const description = "A sidebar with submenus."
</script>
<script setup lang="ts">
import AppSidebar from "@/components/AppSidebar.vue"
import {
Breadcrumb,
BreadcrumbItem,
BreadcrumbLink,
BreadcrumbList,
BreadcrumbPage,
BreadcrumbSeparator,
} from "@/components/ui/breadcrumb"
import { Separator } from "@/components/ui/separator"
import {
SidebarInset,
SidebarProvider,
SidebarTrigger,
} from "@/components/ui/sidebar"
</script>
<template>
<SidebarProvider>
<AppSidebar />
<SidebarInset>
<header class="flex h-16 shrink-0 items-center gap-2 border-b">
<div class="flex items-center gap-2 px-3">
<SidebarTrigger />
<Separator orientation="vertical" class="mr-2 h-4" />
<Breadcrumb>
<BreadcrumbList>
<BreadcrumbItem class="hidden md:block">
<BreadcrumbLink href="#">
Building Your Application
</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbSeparator class="hidden md:block" />
<BreadcrumbItem>
<BreadcrumbPage>Data Fetching</BreadcrumbPage>
</BreadcrumbItem>
</BreadcrumbList>
</Breadcrumb>
</div>
</header>
<div class="flex flex-1 flex-col gap-4 p-4">
<div class="grid auto-rows-min gap-4 md:grid-cols-3">
<div class="bg-muted/50 aspect-video rounded-xl" />
<div class="bg-muted/50 aspect-video rounded-xl" />
<div class="bg-muted/50 aspect-video rounded-xl" />
</div>
<div class="bg-muted/50 min-h-[100vh] flex-1 rounded-xl md:min-h-min" />
</div>
</SidebarInset>
</SidebarProvider>
</template>
A sidebar with submenus.
sidebar-03
Files
<script lang="ts">
export const description = "A login page with a muted background color."
</script>
<script setup lang="ts">
import { GalleryVerticalEnd } from "lucide-vue-next"
import LoginForm from "@/components/LoginForm.vue"
</script>
<template>
<div class="bg-muted flex min-h-svh flex-col items-center justify-center gap-6 p-6 md:p-10">
<div class="flex w-full max-w-sm flex-col gap-6">
<a href="#" class="flex items-center gap-2 self-center font-medium">
<div class="bg-primary text-primary-foreground flex size-6 items-center justify-center rounded-md">
<GalleryVerticalEnd class="size-4" />
</div>
Acme Inc.
</a>
<LoginForm />
</div>
</div>
</template>
A login page with a muted background color.
login-03
Files
<script lang="ts">
export const description = "A login page with form and image."
</script>
<script setup lang="ts">
import LoginForm from "@/components/LoginForm.vue"
</script>
<template>
<div class="bg-muted flex min-h-svh flex-col items-center justify-center p-6 md:p-10">
<div class="w-full max-w-sm md:max-w-4xl">
<LoginForm />
</div>
</div>
</template>
A login page with form and image.
login-04