From 48c205503f9b436b3609c348c7bf44e7dd852926 Mon Sep 17 00:00:00 2001 From: zernonia Date: Sat, 19 Oct 2024 09:51:30 +0200 Subject: [PATCH] feat: add default sidebar --- .../registry/default/ui/sidebar/Sidebar.vue | 86 +++++++++++++++++++ .../default/ui/sidebar/SidebarContent.vue | 17 ++++ .../default/ui/sidebar/SidebarFooter.vue | 17 ++++ .../default/ui/sidebar/SidebarGroup.vue | 17 ++++ .../default/ui/sidebar/SidebarGroupAction.vue | 27 ++++++ .../ui/sidebar/SidebarGroupContent.vue | 17 ++++ .../default/ui/sidebar/SidebarGroupLabel.vue | 24 ++++++ .../default/ui/sidebar/SidebarHeader.vue | 17 ++++ .../default/ui/sidebar/SidebarInput.vue | 21 +++++ .../default/ui/sidebar/SidebarInset.vue | 20 +++++ .../default/ui/sidebar/SidebarMenu.vue | 17 ++++ .../default/ui/sidebar/SidebarMenuAction.vue | 32 +++++++ .../default/ui/sidebar/SidebarMenuBadge.vue | 25 ++++++ .../default/ui/sidebar/SidebarMenuButton.vue | 47 ++++++++++ .../ui/sidebar/SidebarMenuButtonChild.vue | 32 +++++++ .../default/ui/sidebar/SidebarMenuItem.vue | 17 ++++ .../ui/sidebar/SidebarMenuSkeleton.vue | 33 +++++++ .../default/ui/sidebar/SidebarMenuSub.vue | 21 +++++ .../ui/sidebar/SidebarMenuSubButton.vue | 32 +++++++ .../default/ui/sidebar/SidebarMenuSubItem.vue | 8 ++ .../default/ui/sidebar/SidebarProvider.vue | 76 ++++++++++++++++ .../default/ui/sidebar/SidebarRail.vue | 32 +++++++ .../default/ui/sidebar/SidebarSeparator.vue | 18 ++++ .../default/ui/sidebar/SidebarTrigger.vue | 26 ++++++ .../lib/registry/default/ui/sidebar/index.ts | 49 +++++++++++ .../lib/registry/default/ui/sidebar/utils.ts | 19 ++++ 26 files changed, 747 insertions(+) create mode 100644 apps/www/src/lib/registry/default/ui/sidebar/Sidebar.vue create mode 100644 apps/www/src/lib/registry/default/ui/sidebar/SidebarContent.vue create mode 100644 apps/www/src/lib/registry/default/ui/sidebar/SidebarFooter.vue create mode 100644 apps/www/src/lib/registry/default/ui/sidebar/SidebarGroup.vue create mode 100644 apps/www/src/lib/registry/default/ui/sidebar/SidebarGroupAction.vue create mode 100644 apps/www/src/lib/registry/default/ui/sidebar/SidebarGroupContent.vue create mode 100644 apps/www/src/lib/registry/default/ui/sidebar/SidebarGroupLabel.vue create mode 100644 apps/www/src/lib/registry/default/ui/sidebar/SidebarHeader.vue create mode 100644 apps/www/src/lib/registry/default/ui/sidebar/SidebarInput.vue create mode 100644 apps/www/src/lib/registry/default/ui/sidebar/SidebarInset.vue create mode 100644 apps/www/src/lib/registry/default/ui/sidebar/SidebarMenu.vue create mode 100644 apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuAction.vue create mode 100644 apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuBadge.vue create mode 100644 apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuButton.vue create mode 100644 apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuButtonChild.vue create mode 100644 apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuItem.vue create mode 100644 apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuSkeleton.vue create mode 100644 apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuSub.vue create mode 100644 apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuSubButton.vue create mode 100644 apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuSubItem.vue create mode 100644 apps/www/src/lib/registry/default/ui/sidebar/SidebarProvider.vue create mode 100644 apps/www/src/lib/registry/default/ui/sidebar/SidebarRail.vue create mode 100644 apps/www/src/lib/registry/default/ui/sidebar/SidebarSeparator.vue create mode 100644 apps/www/src/lib/registry/default/ui/sidebar/SidebarTrigger.vue create mode 100644 apps/www/src/lib/registry/default/ui/sidebar/index.ts create mode 100644 apps/www/src/lib/registry/default/ui/sidebar/utils.ts diff --git a/apps/www/src/lib/registry/default/ui/sidebar/Sidebar.vue b/apps/www/src/lib/registry/default/ui/sidebar/Sidebar.vue new file mode 100644 index 00000000..8a085f3c --- /dev/null +++ b/apps/www/src/lib/registry/default/ui/sidebar/Sidebar.vue @@ -0,0 +1,86 @@ + + + diff --git a/apps/www/src/lib/registry/default/ui/sidebar/SidebarContent.vue b/apps/www/src/lib/registry/default/ui/sidebar/SidebarContent.vue new file mode 100644 index 00000000..4b6244a4 --- /dev/null +++ b/apps/www/src/lib/registry/default/ui/sidebar/SidebarContent.vue @@ -0,0 +1,17 @@ + + + diff --git a/apps/www/src/lib/registry/default/ui/sidebar/SidebarFooter.vue b/apps/www/src/lib/registry/default/ui/sidebar/SidebarFooter.vue new file mode 100644 index 00000000..9d145c05 --- /dev/null +++ b/apps/www/src/lib/registry/default/ui/sidebar/SidebarFooter.vue @@ -0,0 +1,17 @@ + + + diff --git a/apps/www/src/lib/registry/default/ui/sidebar/SidebarGroup.vue b/apps/www/src/lib/registry/default/ui/sidebar/SidebarGroup.vue new file mode 100644 index 00000000..adc6843c --- /dev/null +++ b/apps/www/src/lib/registry/default/ui/sidebar/SidebarGroup.vue @@ -0,0 +1,17 @@ + + + diff --git a/apps/www/src/lib/registry/default/ui/sidebar/SidebarGroupAction.vue b/apps/www/src/lib/registry/default/ui/sidebar/SidebarGroupAction.vue new file mode 100644 index 00000000..74cac4ea --- /dev/null +++ b/apps/www/src/lib/registry/default/ui/sidebar/SidebarGroupAction.vue @@ -0,0 +1,27 @@ + + + diff --git a/apps/www/src/lib/registry/default/ui/sidebar/SidebarGroupContent.vue b/apps/www/src/lib/registry/default/ui/sidebar/SidebarGroupContent.vue new file mode 100644 index 00000000..37390c93 --- /dev/null +++ b/apps/www/src/lib/registry/default/ui/sidebar/SidebarGroupContent.vue @@ -0,0 +1,17 @@ + + + diff --git a/apps/www/src/lib/registry/default/ui/sidebar/SidebarGroupLabel.vue b/apps/www/src/lib/registry/default/ui/sidebar/SidebarGroupLabel.vue new file mode 100644 index 00000000..83826c3e --- /dev/null +++ b/apps/www/src/lib/registry/default/ui/sidebar/SidebarGroupLabel.vue @@ -0,0 +1,24 @@ + + + diff --git a/apps/www/src/lib/registry/default/ui/sidebar/SidebarHeader.vue b/apps/www/src/lib/registry/default/ui/sidebar/SidebarHeader.vue new file mode 100644 index 00000000..eecaddb2 --- /dev/null +++ b/apps/www/src/lib/registry/default/ui/sidebar/SidebarHeader.vue @@ -0,0 +1,17 @@ + + + diff --git a/apps/www/src/lib/registry/default/ui/sidebar/SidebarInput.vue b/apps/www/src/lib/registry/default/ui/sidebar/SidebarInput.vue new file mode 100644 index 00000000..44711f4c --- /dev/null +++ b/apps/www/src/lib/registry/default/ui/sidebar/SidebarInput.vue @@ -0,0 +1,21 @@ + + + diff --git a/apps/www/src/lib/registry/default/ui/sidebar/SidebarInset.vue b/apps/www/src/lib/registry/default/ui/sidebar/SidebarInset.vue new file mode 100644 index 00000000..b5f3a53f --- /dev/null +++ b/apps/www/src/lib/registry/default/ui/sidebar/SidebarInset.vue @@ -0,0 +1,20 @@ + + + diff --git a/apps/www/src/lib/registry/default/ui/sidebar/SidebarMenu.vue b/apps/www/src/lib/registry/default/ui/sidebar/SidebarMenu.vue new file mode 100644 index 00000000..3bfd73e6 --- /dev/null +++ b/apps/www/src/lib/registry/default/ui/sidebar/SidebarMenu.vue @@ -0,0 +1,17 @@ + + + diff --git a/apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuAction.vue b/apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuAction.vue new file mode 100644 index 00000000..aa504c2f --- /dev/null +++ b/apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuAction.vue @@ -0,0 +1,32 @@ + + + diff --git a/apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuBadge.vue b/apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuBadge.vue new file mode 100644 index 00000000..f8789687 --- /dev/null +++ b/apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuBadge.vue @@ -0,0 +1,25 @@ + + + diff --git a/apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuButton.vue b/apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuButton.vue new file mode 100644 index 00000000..45c8e6a6 --- /dev/null +++ b/apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuButton.vue @@ -0,0 +1,47 @@ + + + diff --git a/apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuButtonChild.vue b/apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuButtonChild.vue new file mode 100644 index 00000000..0f5100ad --- /dev/null +++ b/apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuButtonChild.vue @@ -0,0 +1,32 @@ + + + diff --git a/apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuItem.vue b/apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuItem.vue new file mode 100644 index 00000000..b6000734 --- /dev/null +++ b/apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuItem.vue @@ -0,0 +1,17 @@ + + + diff --git a/apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuSkeleton.vue b/apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuSkeleton.vue new file mode 100644 index 00000000..9bcad9d0 --- /dev/null +++ b/apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuSkeleton.vue @@ -0,0 +1,33 @@ + + + diff --git a/apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuSub.vue b/apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuSub.vue new file mode 100644 index 00000000..0bb5af79 --- /dev/null +++ b/apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuSub.vue @@ -0,0 +1,21 @@ + + + diff --git a/apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuSubButton.vue b/apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuSubButton.vue new file mode 100644 index 00000000..c7c142cf --- /dev/null +++ b/apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuSubButton.vue @@ -0,0 +1,32 @@ + + + diff --git a/apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuSubItem.vue b/apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuSubItem.vue new file mode 100644 index 00000000..a0cfb71d --- /dev/null +++ b/apps/www/src/lib/registry/default/ui/sidebar/SidebarMenuSubItem.vue @@ -0,0 +1,8 @@ + + + diff --git a/apps/www/src/lib/registry/default/ui/sidebar/SidebarProvider.vue b/apps/www/src/lib/registry/default/ui/sidebar/SidebarProvider.vue new file mode 100644 index 00000000..0a8ca6fe --- /dev/null +++ b/apps/www/src/lib/registry/default/ui/sidebar/SidebarProvider.vue @@ -0,0 +1,76 @@ + + + diff --git a/apps/www/src/lib/registry/default/ui/sidebar/SidebarRail.vue b/apps/www/src/lib/registry/default/ui/sidebar/SidebarRail.vue new file mode 100644 index 00000000..d291d9e5 --- /dev/null +++ b/apps/www/src/lib/registry/default/ui/sidebar/SidebarRail.vue @@ -0,0 +1,32 @@ + + + diff --git a/apps/www/src/lib/registry/default/ui/sidebar/SidebarSeparator.vue b/apps/www/src/lib/registry/default/ui/sidebar/SidebarSeparator.vue new file mode 100644 index 00000000..8a5d771e --- /dev/null +++ b/apps/www/src/lib/registry/default/ui/sidebar/SidebarSeparator.vue @@ -0,0 +1,18 @@ + + + diff --git a/apps/www/src/lib/registry/default/ui/sidebar/SidebarTrigger.vue b/apps/www/src/lib/registry/default/ui/sidebar/SidebarTrigger.vue new file mode 100644 index 00000000..dd4e6893 --- /dev/null +++ b/apps/www/src/lib/registry/default/ui/sidebar/SidebarTrigger.vue @@ -0,0 +1,26 @@ + + + diff --git a/apps/www/src/lib/registry/default/ui/sidebar/index.ts b/apps/www/src/lib/registry/default/ui/sidebar/index.ts new file mode 100644 index 00000000..3338381c --- /dev/null +++ b/apps/www/src/lib/registry/default/ui/sidebar/index.ts @@ -0,0 +1,49 @@ +import { 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 { injectSidebarContext } 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', + }, + }, +) diff --git a/apps/www/src/lib/registry/default/ui/sidebar/utils.ts b/apps/www/src/lib/registry/default/ui/sidebar/utils.ts new file mode 100644 index 00000000..91662bf4 --- /dev/null +++ b/apps/www/src/lib/registry/default/ui/sidebar/utils.ts @@ -0,0 +1,19 @@ +import type { ComputedRef, Ref } from 'vue' +import { createContext } from 'radix-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 [injectSidebarContext, provideSidebarContext] = createContext<{ + state: ComputedRef<'expanded' | 'collapsed'> + open: Ref + setOpen: (value: boolean) => void + isMobile: Ref + openMobile: Ref + setOpenMobile: (value: boolean) => void + toggleSidebar: () => void +}>('Sidebar')