-
+
diff --git a/components/ui/avatar/Avatar.vue b/components/ui/avatar/Avatar.vue
new file mode 100644
index 0000000..d4af2fd
--- /dev/null
+++ b/components/ui/avatar/Avatar.vue
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
diff --git a/components/ui/avatar/AvatarFallback.vue b/components/ui/avatar/AvatarFallback.vue
new file mode 100644
index 0000000..a520940
--- /dev/null
+++ b/components/ui/avatar/AvatarFallback.vue
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
diff --git a/components/ui/avatar/AvatarImage.vue b/components/ui/avatar/AvatarImage.vue
new file mode 100644
index 0000000..183321f
--- /dev/null
+++ b/components/ui/avatar/AvatarImage.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
diff --git a/components/ui/avatar/index.ts b/components/ui/avatar/index.ts
new file mode 100644
index 0000000..a36e05a
--- /dev/null
+++ b/components/ui/avatar/index.ts
@@ -0,0 +1,24 @@
+import { type VariantProps, cva } from "class-variance-authority";
+
+export { default as Avatar } from "./Avatar.vue";
+export { default as AvatarFallback } from "./AvatarFallback.vue";
+export { default as AvatarImage } from "./AvatarImage.vue";
+
+export const avatarVariant = cva(
+ "inline-flex items-center justify-center font-normal text-foreground select-none shrink-0 bg-secondary overflow-hidden",
+ {
+ variants: {
+ size: {
+ sm: "h-10 w-10 text-xs",
+ base: "h-16 w-16 text-2xl",
+ lg: "h-32 w-32 text-5xl",
+ },
+ shape: {
+ circle: "rounded-full",
+ square: "rounded-md",
+ },
+ },
+ },
+);
+
+export type AvatarVariants = VariantProps
;
diff --git a/components/ui/breadcrumb/Breadcrumb.vue b/components/ui/breadcrumb/Breadcrumb.vue
new file mode 100644
index 0000000..9271e7a
--- /dev/null
+++ b/components/ui/breadcrumb/Breadcrumb.vue
@@ -0,0 +1,13 @@
+
+
+
+
+
diff --git a/components/ui/breadcrumb/BreadcrumbEllipsis.vue b/components/ui/breadcrumb/BreadcrumbEllipsis.vue
new file mode 100644
index 0000000..eb57c2b
--- /dev/null
+++ b/components/ui/breadcrumb/BreadcrumbEllipsis.vue
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+ More
+
+
diff --git a/components/ui/breadcrumb/BreadcrumbItem.vue b/components/ui/breadcrumb/BreadcrumbItem.vue
new file mode 100644
index 0000000..a5e702a
--- /dev/null
+++ b/components/ui/breadcrumb/BreadcrumbItem.vue
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
diff --git a/components/ui/breadcrumb/BreadcrumbLink.vue b/components/ui/breadcrumb/BreadcrumbLink.vue
new file mode 100644
index 0000000..8ff2a9c
--- /dev/null
+++ b/components/ui/breadcrumb/BreadcrumbLink.vue
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
diff --git a/components/ui/breadcrumb/BreadcrumbList.vue b/components/ui/breadcrumb/BreadcrumbList.vue
new file mode 100644
index 0000000..3a312c2
--- /dev/null
+++ b/components/ui/breadcrumb/BreadcrumbList.vue
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
diff --git a/components/ui/breadcrumb/BreadcrumbPage.vue b/components/ui/breadcrumb/BreadcrumbPage.vue
new file mode 100644
index 0000000..5e42989
--- /dev/null
+++ b/components/ui/breadcrumb/BreadcrumbPage.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
diff --git a/components/ui/breadcrumb/BreadcrumbSeparator.vue b/components/ui/breadcrumb/BreadcrumbSeparator.vue
new file mode 100644
index 0000000..0e3f7fa
--- /dev/null
+++ b/components/ui/breadcrumb/BreadcrumbSeparator.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
diff --git a/components/ui/breadcrumb/index.ts b/components/ui/breadcrumb/index.ts
new file mode 100644
index 0000000..e51a7ed
--- /dev/null
+++ b/components/ui/breadcrumb/index.ts
@@ -0,0 +1,7 @@
+export { default as Breadcrumb } from "./Breadcrumb.vue";
+export { default as BreadcrumbEllipsis } from "./BreadcrumbEllipsis.vue";
+export { default as BreadcrumbItem } from "./BreadcrumbItem.vue";
+export { default as BreadcrumbLink } from "./BreadcrumbLink.vue";
+export { default as BreadcrumbList } from "./BreadcrumbList.vue";
+export { default as BreadcrumbPage } from "./BreadcrumbPage.vue";
+export { default as BreadcrumbSeparator } from "./BreadcrumbSeparator.vue";
diff --git a/components/ui/button/Button.vue b/components/ui/button/Button.vue
new file mode 100644
index 0000000..111e0fa
--- /dev/null
+++ b/components/ui/button/Button.vue
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
diff --git a/components/ui/button/index.ts b/components/ui/button/index.ts
new file mode 100644
index 0000000..80c6187
--- /dev/null
+++ b/components/ui/button/index.ts
@@ -0,0 +1,34 @@
+import { type VariantProps, cva } from "class-variance-authority";
+export { default as Button } from "./Button.vue";
+
+export const buttonVariants = cva(
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
+ {
+ variants: {
+ variant: {
+ default:
+ "bg-primary text-primary2-foreground shadow hover:bg-primary/90",
+ destructive:
+ "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",
+ outline:
+ "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",
+ secondary:
+ "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",
+ ghost: "hover:bg-accent hover:text-accent-foreground",
+ link: "text-primary underline-offset-4 hover:underline",
+ },
+ size: {
+ default: "h-9 px-4 py-2",
+ sm: "h-8 rounded-md px-3 text-xs",
+ lg: "h-10 rounded-md px-8",
+ icon: "h-9 w-9",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ size: "default",
+ },
+ },
+);
+
+export type ButtonVariants = VariantProps;
diff --git a/components/ui/collapsible/Collapsible.vue b/components/ui/collapsible/Collapsible.vue
new file mode 100644
index 0000000..c39dae0
--- /dev/null
+++ b/components/ui/collapsible/Collapsible.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
diff --git a/components/ui/collapsible/CollapsibleContent.vue b/components/ui/collapsible/CollapsibleContent.vue
new file mode 100644
index 0000000..42d722d
--- /dev/null
+++ b/components/ui/collapsible/CollapsibleContent.vue
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
diff --git a/components/ui/collapsible/CollapsibleTrigger.vue b/components/ui/collapsible/CollapsibleTrigger.vue
new file mode 100644
index 0000000..baf5fe9
--- /dev/null
+++ b/components/ui/collapsible/CollapsibleTrigger.vue
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
diff --git a/components/ui/collapsible/index.ts b/components/ui/collapsible/index.ts
new file mode 100644
index 0000000..289bdbb
--- /dev/null
+++ b/components/ui/collapsible/index.ts
@@ -0,0 +1,3 @@
+export { default as Collapsible } from "./Collapsible.vue";
+export { default as CollapsibleContent } from "./CollapsibleContent.vue";
+export { default as CollapsibleTrigger } from "./CollapsibleTrigger.vue";
diff --git a/components/ui/dropdown-menu/DropdownMenu.vue b/components/ui/dropdown-menu/DropdownMenu.vue
new file mode 100644
index 0000000..031ea14
--- /dev/null
+++ b/components/ui/dropdown-menu/DropdownMenu.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
diff --git a/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue b/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue
new file mode 100644
index 0000000..a004d7e
--- /dev/null
+++ b/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/ui/dropdown-menu/DropdownMenuContent.vue b/components/ui/dropdown-menu/DropdownMenuContent.vue
new file mode 100644
index 0000000..b5a0f8b
--- /dev/null
+++ b/components/ui/dropdown-menu/DropdownMenuContent.vue
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
diff --git a/components/ui/dropdown-menu/DropdownMenuGroup.vue b/components/ui/dropdown-menu/DropdownMenuGroup.vue
new file mode 100644
index 0000000..b1af9b7
--- /dev/null
+++ b/components/ui/dropdown-menu/DropdownMenuGroup.vue
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
diff --git a/components/ui/dropdown-menu/DropdownMenuItem.vue b/components/ui/dropdown-menu/DropdownMenuItem.vue
new file mode 100644
index 0000000..0bee012
--- /dev/null
+++ b/components/ui/dropdown-menu/DropdownMenuItem.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
diff --git a/components/ui/dropdown-menu/DropdownMenuLabel.vue b/components/ui/dropdown-menu/DropdownMenuLabel.vue
new file mode 100644
index 0000000..4aae19f
--- /dev/null
+++ b/components/ui/dropdown-menu/DropdownMenuLabel.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
diff --git a/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue b/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue
new file mode 100644
index 0000000..bf765f4
--- /dev/null
+++ b/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
diff --git a/components/ui/dropdown-menu/DropdownMenuRadioItem.vue b/components/ui/dropdown-menu/DropdownMenuRadioItem.vue
new file mode 100644
index 0000000..38f2106
--- /dev/null
+++ b/components/ui/dropdown-menu/DropdownMenuRadioItem.vue
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/ui/dropdown-menu/DropdownMenuSeparator.vue b/components/ui/dropdown-menu/DropdownMenuSeparator.vue
new file mode 100644
index 0000000..d34e0cd
--- /dev/null
+++ b/components/ui/dropdown-menu/DropdownMenuSeparator.vue
@@ -0,0 +1,24 @@
+
+
+
+
+
diff --git a/components/ui/dropdown-menu/DropdownMenuShortcut.vue b/components/ui/dropdown-menu/DropdownMenuShortcut.vue
new file mode 100644
index 0000000..774d4de
--- /dev/null
+++ b/components/ui/dropdown-menu/DropdownMenuShortcut.vue
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
diff --git a/components/ui/dropdown-menu/DropdownMenuSub.vue b/components/ui/dropdown-menu/DropdownMenuSub.vue
new file mode 100644
index 0000000..ab75de7
--- /dev/null
+++ b/components/ui/dropdown-menu/DropdownMenuSub.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
diff --git a/components/ui/dropdown-menu/DropdownMenuSubContent.vue b/components/ui/dropdown-menu/DropdownMenuSubContent.vue
new file mode 100644
index 0000000..005133c
--- /dev/null
+++ b/components/ui/dropdown-menu/DropdownMenuSubContent.vue
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
diff --git a/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue b/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue
new file mode 100644
index 0000000..f84be2b
--- /dev/null
+++ b/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
diff --git a/components/ui/dropdown-menu/DropdownMenuTrigger.vue b/components/ui/dropdown-menu/DropdownMenuTrigger.vue
new file mode 100644
index 0000000..4eb062c
--- /dev/null
+++ b/components/ui/dropdown-menu/DropdownMenuTrigger.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
diff --git a/components/ui/dropdown-menu/index.ts b/components/ui/dropdown-menu/index.ts
new file mode 100644
index 0000000..40938d7
--- /dev/null
+++ b/components/ui/dropdown-menu/index.ts
@@ -0,0 +1,16 @@
+export { default as DropdownMenu } from "./DropdownMenu.vue";
+
+export { default as DropdownMenuCheckboxItem } from "./DropdownMenuCheckboxItem.vue";
+export { default as DropdownMenuContent } from "./DropdownMenuContent.vue";
+export { default as DropdownMenuGroup } from "./DropdownMenuGroup.vue";
+export { default as DropdownMenuItem } from "./DropdownMenuItem.vue";
+export { default as DropdownMenuLabel } from "./DropdownMenuLabel.vue";
+export { default as DropdownMenuRadioGroup } from "./DropdownMenuRadioGroup.vue";
+export { default as DropdownMenuRadioItem } from "./DropdownMenuRadioItem.vue";
+export { default as DropdownMenuSeparator } from "./DropdownMenuSeparator.vue";
+export { default as DropdownMenuShortcut } from "./DropdownMenuShortcut.vue";
+export { default as DropdownMenuSub } from "./DropdownMenuSub.vue";
+export { default as DropdownMenuSubContent } from "./DropdownMenuSubContent.vue";
+export { default as DropdownMenuSubTrigger } from "./DropdownMenuSubTrigger.vue";
+export { default as DropdownMenuTrigger } from "./DropdownMenuTrigger.vue";
+export { DropdownMenuPortal } from "radix-vue";
diff --git a/components/ui/input/Input.vue b/components/ui/input/Input.vue
new file mode 100644
index 0000000..770afee
--- /dev/null
+++ b/components/ui/input/Input.vue
@@ -0,0 +1,23 @@
+
+
+
+
+
diff --git a/components/ui/input/index.ts b/components/ui/input/index.ts
new file mode 100644
index 0000000..110f046
--- /dev/null
+++ b/components/ui/input/index.ts
@@ -0,0 +1 @@
+export { default as Input } from "./Input.vue";
diff --git a/components/ui/separator/Separator.vue b/components/ui/separator/Separator.vue
new file mode 100644
index 0000000..1c818b8
--- /dev/null
+++ b/components/ui/separator/Separator.vue
@@ -0,0 +1,35 @@
+
+
+
+
+ {{ props.label }}
+
+
diff --git a/components/ui/separator/index.ts b/components/ui/separator/index.ts
new file mode 100644
index 0000000..aae7f1a
--- /dev/null
+++ b/components/ui/separator/index.ts
@@ -0,0 +1 @@
+export { default as Separator } from "./Separator.vue";
diff --git a/components/ui/sheet/Sheet.vue b/components/ui/sheet/Sheet.vue
new file mode 100644
index 0000000..ce65a77
--- /dev/null
+++ b/components/ui/sheet/Sheet.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
diff --git a/components/ui/sheet/SheetClose.vue b/components/ui/sheet/SheetClose.vue
new file mode 100644
index 0000000..bc3b70a
--- /dev/null
+++ b/components/ui/sheet/SheetClose.vue
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
diff --git a/components/ui/sheet/SheetContent.vue b/components/ui/sheet/SheetContent.vue
new file mode 100644
index 0000000..2595164
--- /dev/null
+++ b/components/ui/sheet/SheetContent.vue
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/ui/sheet/SheetDescription.vue b/components/ui/sheet/SheetDescription.vue
new file mode 100644
index 0000000..c77cdf3
--- /dev/null
+++ b/components/ui/sheet/SheetDescription.vue
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
diff --git a/components/ui/sheet/SheetFooter.vue b/components/ui/sheet/SheetFooter.vue
new file mode 100644
index 0000000..a3af5f8
--- /dev/null
+++ b/components/ui/sheet/SheetFooter.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
diff --git a/components/ui/sheet/SheetHeader.vue b/components/ui/sheet/SheetHeader.vue
new file mode 100644
index 0000000..1e6ef1f
--- /dev/null
+++ b/components/ui/sheet/SheetHeader.vue
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
diff --git a/components/ui/sheet/SheetTitle.vue b/components/ui/sheet/SheetTitle.vue
new file mode 100644
index 0000000..dc7c865
--- /dev/null
+++ b/components/ui/sheet/SheetTitle.vue
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
diff --git a/components/ui/sheet/SheetTrigger.vue b/components/ui/sheet/SheetTrigger.vue
new file mode 100644
index 0000000..7872f1c
--- /dev/null
+++ b/components/ui/sheet/SheetTrigger.vue
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
diff --git a/components/ui/sheet/index.ts b/components/ui/sheet/index.ts
new file mode 100644
index 0000000..dec8c1f
--- /dev/null
+++ b/components/ui/sheet/index.ts
@@ -0,0 +1,29 @@
+import { type VariantProps, cva } from "class-variance-authority";
+
+export { default as Sheet } from "./Sheet.vue";
+export { default as SheetClose } from "./SheetClose.vue";
+export { default as SheetContent } from "./SheetContent.vue";
+export { default as SheetDescription } from "./SheetDescription.vue";
+export { default as SheetFooter } from "./SheetFooter.vue";
+export { default as SheetHeader } from "./SheetHeader.vue";
+export { default as SheetTitle } from "./SheetTitle.vue";
+export { default as SheetTrigger } from "./SheetTrigger.vue";
+
+export const sheetVariants = cva(
+ "fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500",
+ {
+ variants: {
+ side: {
+ top: "inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",
+ bottom: "inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",
+ left: "inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",
+ right: "inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm",
+ },
+ },
+ defaultVariants: {
+ side: "right",
+ },
+ },
+);
+
+export type SheetVariants = VariantProps;
diff --git a/components/ui/sidebar/Sidebar.vue b/components/ui/sidebar/Sidebar.vue
new file mode 100644
index 0000000..684aff0
--- /dev/null
+++ b/components/ui/sidebar/Sidebar.vue
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/ui/sidebar/SidebarContent.vue b/components/ui/sidebar/SidebarContent.vue
new file mode 100644
index 0000000..5295678
--- /dev/null
+++ b/components/ui/sidebar/SidebarContent.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
diff --git a/components/ui/sidebar/SidebarFooter.vue b/components/ui/sidebar/SidebarFooter.vue
new file mode 100644
index 0000000..232eb58
--- /dev/null
+++ b/components/ui/sidebar/SidebarFooter.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
diff --git a/components/ui/sidebar/SidebarGroup.vue b/components/ui/sidebar/SidebarGroup.vue
new file mode 100644
index 0000000..2e72119
--- /dev/null
+++ b/components/ui/sidebar/SidebarGroup.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
diff --git a/components/ui/sidebar/SidebarGroupAction.vue b/components/ui/sidebar/SidebarGroupAction.vue
new file mode 100644
index 0000000..01a816f
--- /dev/null
+++ b/components/ui/sidebar/SidebarGroupAction.vue
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
diff --git a/components/ui/sidebar/SidebarGroupContent.vue b/components/ui/sidebar/SidebarGroupContent.vue
new file mode 100644
index 0000000..07a56a2
--- /dev/null
+++ b/components/ui/sidebar/SidebarGroupContent.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
diff --git a/components/ui/sidebar/SidebarGroupLabel.vue b/components/ui/sidebar/SidebarGroupLabel.vue
new file mode 100644
index 0000000..18663f9
--- /dev/null
+++ b/components/ui/sidebar/SidebarGroupLabel.vue
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
diff --git a/components/ui/sidebar/SidebarHeader.vue b/components/ui/sidebar/SidebarHeader.vue
new file mode 100644
index 0000000..7f1e0ba
--- /dev/null
+++ b/components/ui/sidebar/SidebarHeader.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
diff --git a/components/ui/sidebar/SidebarInput.vue b/components/ui/sidebar/SidebarInput.vue
new file mode 100644
index 0000000..a87c75a
--- /dev/null
+++ b/components/ui/sidebar/SidebarInput.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
diff --git a/components/ui/sidebar/SidebarInset.vue b/components/ui/sidebar/SidebarInset.vue
new file mode 100644
index 0000000..219fe55
--- /dev/null
+++ b/components/ui/sidebar/SidebarInset.vue
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
diff --git a/components/ui/sidebar/SidebarMenu.vue b/components/ui/sidebar/SidebarMenu.vue
new file mode 100644
index 0000000..f097a80
--- /dev/null
+++ b/components/ui/sidebar/SidebarMenu.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
diff --git a/components/ui/sidebar/SidebarMenuAction.vue b/components/ui/sidebar/SidebarMenuAction.vue
new file mode 100644
index 0000000..cd32f75
--- /dev/null
+++ b/components/ui/sidebar/SidebarMenuAction.vue
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
diff --git a/components/ui/sidebar/SidebarMenuBadge.vue b/components/ui/sidebar/SidebarMenuBadge.vue
new file mode 100644
index 0000000..10235f6
--- /dev/null
+++ b/components/ui/sidebar/SidebarMenuBadge.vue
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
diff --git a/components/ui/sidebar/SidebarMenuButton.vue b/components/ui/sidebar/SidebarMenuButton.vue
new file mode 100644
index 0000000..e2fedcb
--- /dev/null
+++ b/components/ui/sidebar/SidebarMenuButton.vue
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ tooltip }}
+
+
+
+
+
diff --git a/components/ui/sidebar/SidebarMenuButtonChild.vue b/components/ui/sidebar/SidebarMenuButtonChild.vue
new file mode 100644
index 0000000..10413d0
--- /dev/null
+++ b/components/ui/sidebar/SidebarMenuButtonChild.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
diff --git a/components/ui/sidebar/SidebarMenuItem.vue b/components/ui/sidebar/SidebarMenuItem.vue
new file mode 100644
index 0000000..fc2d2d0
--- /dev/null
+++ b/components/ui/sidebar/SidebarMenuItem.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
diff --git a/components/ui/sidebar/SidebarMenuSkeleton.vue b/components/ui/sidebar/SidebarMenuSkeleton.vue
new file mode 100644
index 0000000..37f8cf0
--- /dev/null
+++ b/components/ui/sidebar/SidebarMenuSkeleton.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
diff --git a/components/ui/sidebar/SidebarMenuSub.vue b/components/ui/sidebar/SidebarMenuSub.vue
new file mode 100644
index 0000000..013e6ec
--- /dev/null
+++ b/components/ui/sidebar/SidebarMenuSub.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
diff --git a/components/ui/sidebar/SidebarMenuSubButton.vue b/components/ui/sidebar/SidebarMenuSubButton.vue
new file mode 100644
index 0000000..635cbbc
--- /dev/null
+++ b/components/ui/sidebar/SidebarMenuSubButton.vue
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
diff --git a/components/ui/sidebar/SidebarMenuSubItem.vue b/components/ui/sidebar/SidebarMenuSubItem.vue
new file mode 100644
index 0000000..b04030b
--- /dev/null
+++ b/components/ui/sidebar/SidebarMenuSubItem.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/components/ui/sidebar/SidebarProvider.vue b/components/ui/sidebar/SidebarProvider.vue
new file mode 100644
index 0000000..67bec37
--- /dev/null
+++ b/components/ui/sidebar/SidebarProvider.vue
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
diff --git a/components/ui/sidebar/SidebarRail.vue b/components/ui/sidebar/SidebarRail.vue
new file mode 100644
index 0000000..617bfc5
--- /dev/null
+++ b/components/ui/sidebar/SidebarRail.vue
@@ -0,0 +1,32 @@
+
+
+
+
+
diff --git a/components/ui/sidebar/SidebarSeparator.vue b/components/ui/sidebar/SidebarSeparator.vue
new file mode 100644
index 0000000..c32edc2
--- /dev/null
+++ b/components/ui/sidebar/SidebarSeparator.vue
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/components/ui/sidebar/SidebarTrigger.vue b/components/ui/sidebar/SidebarTrigger.vue
new file mode 100644
index 0000000..cf93cdf
--- /dev/null
+++ b/components/ui/sidebar/SidebarTrigger.vue
@@ -0,0 +1,26 @@
+
+
+
+
+
diff --git a/components/ui/sidebar/index.ts b/components/ui/sidebar/index.ts
new file mode 100644
index 0000000..30fa19a
--- /dev/null
+++ b/components/ui/sidebar/index.ts
@@ -0,0 +1,54 @@
+import { type VariantProps, cva } from "class-variance-authority";
+
+export { default as Sidebar } from "./Sidebar.vue";
+export { default as SidebarContent } from "./SidebarContent.vue";
+export { default as SidebarFooter } from "./SidebarFooter.vue";
+export { default as SidebarGroup } from "./SidebarGroup.vue";
+export { default as SidebarGroupAction } from "./SidebarGroupAction.vue";
+export { default as SidebarGroupContent } from "./SidebarGroupContent.vue";
+export { default as SidebarGroupLabel } from "./SidebarGroupLabel.vue";
+export { default as SidebarHeader } from "./SidebarHeader.vue";
+export { default as SidebarInput } from "./SidebarInput.vue";
+export { default as SidebarInset } from "./SidebarInset.vue";
+export { default as SidebarMenu } from "./SidebarMenu.vue";
+export { default as SidebarMenuAction } from "./SidebarMenuAction.vue";
+export { default as SidebarMenuBadge } from "./SidebarMenuBadge.vue";
+export { default as SidebarMenuButton } from "./SidebarMenuButton.vue";
+export { default as SidebarMenuItem } from "./SidebarMenuItem.vue";
+export { default as SidebarMenuSkeleton } from "./SidebarMenuSkeleton.vue";
+export { default as SidebarMenuSub } from "./SidebarMenuSub.vue";
+export { default as SidebarMenuSubButton } from "./SidebarMenuSubButton.vue";
+export { default as SidebarMenuSubItem } from "./SidebarMenuSubItem.vue";
+export { default as SidebarProvider } from "./SidebarProvider.vue";
+export { default as SidebarRail } from "./SidebarRail.vue";
+export { default as SidebarSeparator } from "./SidebarSeparator.vue";
+export { default as SidebarTrigger } from "./SidebarTrigger.vue";
+
+export { useSidebar } from "./utils";
+
+export const sidebarMenuButtonVariants = cva(
+ "peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0",
+ {
+ variants: {
+ variant: {
+ default:
+ "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
+ outline:
+ "bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]",
+ },
+ size: {
+ default: "h-8 text-sm",
+ sm: "h-7 text-xs",
+ lg: "h-12 text-sm group-data-[collapsible=icon]:!p-0",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ size: "default",
+ },
+ },
+);
+
+export type SidebarMenuButtonVariants = VariantProps<
+ typeof sidebarMenuButtonVariants
+>;
diff --git a/components/ui/sidebar/utils.ts b/components/ui/sidebar/utils.ts
new file mode 100644
index 0000000..7ca0669
--- /dev/null
+++ b/components/ui/sidebar/utils.ts
@@ -0,0 +1,19 @@
+import { createContext } from "radix-vue";
+import type { ComputedRef, Ref } from "vue";
+
+export const SIDEBAR_COOKIE_NAME = "sidebar:state";
+export const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
+export const SIDEBAR_WIDTH = "16rem";
+export const SIDEBAR_WIDTH_MOBILE = "18rem";
+export const SIDEBAR_WIDTH_ICON = "3rem";
+export const SIDEBAR_KEYBOARD_SHORTCUT = "b";
+
+export const [useSidebar, provideSidebarContext] = createContext<{
+ state: ComputedRef<"expanded" | "collapsed">;
+ open: Ref;
+ setOpen: (value: boolean) => void;
+ isMobile: Ref;
+ openMobile: Ref;
+ setOpenMobile: (value: boolean) => void;
+ toggleSidebar: () => void;
+}>("Sidebar");
diff --git a/components/ui/skeleton/Skeleton.vue b/components/ui/skeleton/Skeleton.vue
new file mode 100644
index 0000000..a439d32
--- /dev/null
+++ b/components/ui/skeleton/Skeleton.vue
@@ -0,0 +1,14 @@
+
+
+
+
+
diff --git a/components/ui/skeleton/index.ts b/components/ui/skeleton/index.ts
new file mode 100644
index 0000000..72cb1d9
--- /dev/null
+++ b/components/ui/skeleton/index.ts
@@ -0,0 +1 @@
+export { default as Skeleton } from "./Skeleton.vue";
diff --git a/components/ui/tooltip/Tooltip.vue b/components/ui/tooltip/Tooltip.vue
new file mode 100644
index 0000000..b6bdadf
--- /dev/null
+++ b/components/ui/tooltip/Tooltip.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
diff --git a/components/ui/tooltip/TooltipContent.vue b/components/ui/tooltip/TooltipContent.vue
new file mode 100644
index 0000000..d39c48b
--- /dev/null
+++ b/components/ui/tooltip/TooltipContent.vue
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
diff --git a/components/ui/tooltip/TooltipProvider.vue b/components/ui/tooltip/TooltipProvider.vue
new file mode 100644
index 0000000..0293593
--- /dev/null
+++ b/components/ui/tooltip/TooltipProvider.vue
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
diff --git a/components/ui/tooltip/TooltipTrigger.vue b/components/ui/tooltip/TooltipTrigger.vue
new file mode 100644
index 0000000..c6e1c6f
--- /dev/null
+++ b/components/ui/tooltip/TooltipTrigger.vue
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
diff --git a/components/ui/tooltip/index.ts b/components/ui/tooltip/index.ts
new file mode 100644
index 0000000..0a8a878
--- /dev/null
+++ b/components/ui/tooltip/index.ts
@@ -0,0 +1,4 @@
+export { default as Tooltip } from "./Tooltip.vue";
+export { default as TooltipContent } from "./TooltipContent.vue";
+export { default as TooltipProvider } from "./TooltipProvider.vue";
+export { default as TooltipTrigger } from "./TooltipTrigger.vue";
diff --git a/layouts/app.vue b/layouts/app.vue
index 3251da9..de25805 100644
--- a/layouts/app.vue
+++ b/layouts/app.vue
@@ -1,40 +1,15 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+