Replies: 5 comments 2 replies
-
@0xalvee I think you could change its default behavior by playing with the tailwind style of DrawerContent.
This part to be more exact, you have bottom-0 by default, you might find yourself breaking stuff by changing them. |
Beta Was this translation helpful? Give feedback.
-
This is my implementation. 'use client';
import * as React from 'react';
import { Drawer as DrawerPrimitive } from 'vaul';
import { cva } from 'class-variance-authority';
import { cn } from '@/lib/utils';
const DrawerContext = React.createContext<{ direction?: 'right' | 'top' | 'bottom' | 'left' }>({
direction: 'right',
});
const Drawer = ({
shouldScaleBackground = true,
direction = 'right',
...props
}: React.ComponentProps<typeof DrawerPrimitive.Root>) => (
<DrawerContext.Provider value={{ direction }}>
<DrawerPrimitive.Root
shouldScaleBackground={shouldScaleBackground}
direction={direction}
{...props}
/>
</DrawerContext.Provider>
);
Drawer.displayName = 'Drawer';
const DrawerTrigger = DrawerPrimitive.Trigger;
const DrawerPortal = DrawerPrimitive.Portal;
const DrawerClose = DrawerPrimitive.Close;
const DrawerOverlay = React.forwardRef<
React.ElementRef<typeof DrawerPrimitive.Overlay>,
React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Overlay>
>(({ className, ...props }, ref) => (
<DrawerPrimitive.Overlay
ref={ref}
className={cn('fixed inset-0 z-50 bg-black/80', className)}
{...props}
/>
));
DrawerOverlay.displayName = DrawerPrimitive.Overlay.displayName;
const drawerContentVariants = cva('fixed z-50 flex h-auto flex-col border bg-background', {
variants: {
direction: {
right: 'ml-24 right-0 rounded-l-[10px] inset-y-0',
top: 'mb-24 top-0 rounded-b-[10px] inset-x-0',
bottom: 'mt-24 rounded-t-[10px] bottom-0 inset-x-0',
left: 'mr-24 left-0 rounded-r-[10px] inset-y-0',
},
},
defaultVariants: {
direction: 'right',
},
});
const DrawerContent = React.forwardRef<
React.ElementRef<typeof DrawerPrimitive.Content>,
React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Content>
>(({ className, children, ...props }, ref) => {
const { direction } = React.useContext(DrawerContext);
return (
<DrawerPortal>
<DrawerOverlay />
<DrawerPrimitive.Content
ref={ref}
className={cn(drawerContentVariants({ direction, className }))}
{...props}
>
{/* <div className='mx-auto mt-4 h-2 w-[100px] rounded-full bg-muted' /> */}
{children}
</DrawerPrimitive.Content>
</DrawerPortal>
);
});
DrawerContent.displayName = 'DrawerContent';
const DrawerHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (
<div className={cn('grid gap-1.5 p-4 text-center sm:text-left', className)} {...props} />
);
DrawerHeader.displayName = 'DrawerHeader';
const DrawerFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (
<div className={cn('mt-auto flex flex-col gap-2 p-4', className)} {...props} />
);
DrawerFooter.displayName = 'DrawerFooter';
const DrawerTitle = React.forwardRef<
React.ElementRef<typeof DrawerPrimitive.Title>,
React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Title>
>(({ className, ...props }, ref) => (
<DrawerPrimitive.Title
ref={ref}
className={cn('text-lg font-semibold leading-none tracking-tight', className)}
{...props}
/>
));
DrawerTitle.displayName = DrawerPrimitive.Title.displayName;
const DrawerDescription = React.forwardRef<
React.ElementRef<typeof DrawerPrimitive.Description>,
React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Description>
>(({ className, ...props }, ref) => (
<DrawerPrimitive.Description
ref={ref}
className={cn('text-sm text-muted-foreground', className)}
{...props}
/>
));
DrawerDescription.displayName = DrawerPrimitive.Description.displayName;
export {
Drawer,
DrawerPortal,
DrawerOverlay,
DrawerTrigger,
DrawerClose,
DrawerContent,
DrawerHeader,
DrawerFooter,
DrawerTitle,
DrawerDescription,
}; |
Beta Was this translation helpful? Give feedback.
-
You can use the sheet component in place of the drawer. It opens on the right |
Beta Was this translation helpful? Give feedback.
-
By the way i just realized that drawer was built on top of Vaul by emilkowalski_. as said in the doc. So I went to the Vaul doc and saw that : Vaul doc Side props So you can just : const Drawer = ({
shouldScaleBackground = true,
direction = "right",
...props
}: :) Hope it will help someone |
Beta Was this translation helpful? Give feedback.
-
https://vaul.emilkowal.ski/default#side-drawer
"use client"
import { Button } from "@/components/ui/button"
import {
Drawer,
DrawerClose,
DrawerContent,
DrawerDescription,
DrawerFooter,
DrawerHeader,
DrawerTitle,
DrawerTrigger
} from "@/components/ui/drawer"
export function SessionsDrawer() {
return (
<Drawer
// =====> Add direction
direction="right"
>
<DrawerTrigger asChild>
<Button variant="outline">Open Drawer</Button>
</DrawerTrigger>
<DrawerContent
// =======> Edit drawer className
className=" left-auto right-4 top-2 bottom-2 fixed z-50 outline-none w-[310px] flex bg-transparent border-none mt-0 "
>
{/* =====> Edit DrawerContent first child className */}
<div className="bg-zinc-50 h-full w-full grow p-5 flex flex-col rounded-[16px]">
<DrawerHeader>
<DrawerTitle>Move Goal</DrawerTitle>
<DrawerDescription>Set your daily activity goal.</DrawerDescription>
</DrawerHeader>
<DrawerFooter>
<Button>Submit</Button>
<DrawerClose asChild>
<Button variant="outline">Cancel</Button>
</DrawerClose>
</DrawerFooter>
</div>
</DrawerContent>
</Drawer>
)
}
|
Beta Was this translation helpful? Give feedback.
-
shadcn drawer can we open from right side?
Beta Was this translation helpful? Give feedback.
All reactions