|
|
@@ -226,14 +226,14 @@ function Sidebar({
|
|
|
<div
|
|
|
data-slot='sidebar-container'
|
|
|
className={cn(
|
|
|
- 'fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-200 ease-linear md:flex',
|
|
|
+ 'fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[inset-inline,width] duration-200 ease-linear md:flex',
|
|
|
side === 'left'
|
|
|
- ? 'left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]'
|
|
|
- : 'right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]',
|
|
|
+ ? 'start-0 group-data-[collapsible=offcanvas]:-start-[calc(var(--sidebar-width))]'
|
|
|
+ : 'end-0 group-data-[collapsible=offcanvas]:-end-[calc(var(--sidebar-width))]',
|
|
|
// Adjust the padding for floating and inset variants.
|
|
|
variant === 'floating' || variant === 'inset'
|
|
|
? 'p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]'
|
|
|
- : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l',
|
|
|
+ : 'group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-e group-data-[side=right]:border-s',
|
|
|
className
|
|
|
)}
|
|
|
{...props}
|
|
|
@@ -288,12 +288,17 @@ function SidebarRail({ className, ...props }: React.ComponentProps<'button'>) {
|
|
|
onClick={toggleSidebar}
|
|
|
title='Toggle Sidebar'
|
|
|
className={cn(
|
|
|
- 'hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] sm:flex',
|
|
|
+ 'hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-end-4 group-data-[side=right]:start-0 after:absolute after:inset-y-0 after:start-1/2 after:w-[2px] sm:flex',
|
|
|
'in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize',
|
|
|
'[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize',
|
|
|
- 'hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full',
|
|
|
- '[[data-side=left][data-collapsible=offcanvas]_&]:-right-2',
|
|
|
- '[[data-side=right][data-collapsible=offcanvas]_&]:-left-2',
|
|
|
+ 'hover:group-data-[collapsible=offcanvas]:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:start-full',
|
|
|
+ '[[data-side=left][data-collapsible=offcanvas]_&]:-end-2',
|
|
|
+ '[[data-side=right][data-collapsible=offcanvas]_&]:-start-2',
|
|
|
+
|
|
|
+ // RTL support
|
|
|
+ 'rtl:translate-x-1/2',
|
|
|
+ 'rtl:in-data-[side=left]:cursor-e-resize rtl:in-data-[side=right]:cursor-w-resize',
|
|
|
+ 'rtl:[[data-side=left][data-state=collapsed]_&]:cursor-w-resize rtl:[[data-side=right][data-state=collapsed]_&]:cursor-e-resize',
|
|
|
className
|
|
|
)}
|
|
|
{...props}
|
|
|
@@ -307,7 +312,7 @@ function SidebarInset({ className, ...props }: React.ComponentProps<'main'>) {
|
|
|
data-slot='sidebar-inset'
|
|
|
className={cn(
|
|
|
'bg-background relative flex w-full flex-1 flex-col',
|
|
|
- 'md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2',
|
|
|
+ 'md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ms-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ms-2',
|
|
|
className
|
|
|
)}
|
|
|
{...props}
|
|
|
@@ -423,7 +428,7 @@ function SidebarGroupAction({
|
|
|
data-slot='sidebar-group-action'
|
|
|
data-sidebar='group-action'
|
|
|
className={cn(
|
|
|
- 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',
|
|
|
+ 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground absolute end-3 top-3.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',
|
|
|
// Increases the hit area of the button on mobile.
|
|
|
'after:absolute after:-inset-2 md:after:hidden',
|
|
|
'group-data-[collapsible=icon]:hidden',
|
|
|
@@ -471,7 +476,7 @@ function SidebarMenuItem({ className, ...props }: React.ComponentProps<'li'>) {
|
|
|
}
|
|
|
|
|
|
const sidebarMenuButtonVariants = cva(
|
|
|
- 'peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-hidden 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',
|
|
|
+ 'peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-start text-sm outline-hidden 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:pe-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: {
|
|
|
@@ -558,7 +563,7 @@ function SidebarMenuAction({
|
|
|
data-slot='sidebar-menu-action'
|
|
|
data-sidebar='menu-action'
|
|
|
className={cn(
|
|
|
- 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground peer-hover/menu-button:text-sidebar-accent-foreground absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',
|
|
|
+ 'text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground peer-hover/menu-button:text-sidebar-accent-foreground absolute end-1 top-1.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 outline-hidden transition-transform focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0',
|
|
|
// Increases the hit area of the button on mobile.
|
|
|
'after:absolute after:-inset-2 md:after:hidden',
|
|
|
'peer-data-[size=sm]/menu-button:top-1',
|
|
|
@@ -583,7 +588,7 @@ function SidebarMenuBadge({
|
|
|
data-slot='sidebar-menu-badge'
|
|
|
data-sidebar='menu-badge'
|
|
|
className={cn(
|
|
|
- 'text-sidebar-foreground pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums select-none',
|
|
|
+ 'text-sidebar-foreground pointer-events-none absolute end-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums select-none',
|
|
|
'peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground',
|
|
|
'peer-data-[size=sm]/menu-button:top-1',
|
|
|
'peer-data-[size=default]/menu-button:top-1.5',
|
|
|
@@ -640,7 +645,7 @@ function SidebarMenuSub({ className, ...props }: React.ComponentProps<'ul'>) {
|
|
|
data-slot='sidebar-menu-sub'
|
|
|
data-sidebar='menu-sub'
|
|
|
className={cn(
|
|
|
- 'border-sidebar-border mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l px-2.5 py-0.5',
|
|
|
+ 'border-sidebar-border mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-s px-2.5 py-0.5',
|
|
|
'group-data-[collapsible=icon]:hidden',
|
|
|
className
|
|
|
)}
|