Skip to main content
Glama

mcp-google-sheets

drawer.tsx4.73 kB
'use client'; import * as React from 'react'; import { Drawer as DrawerPrimitive } from 'vaul'; import { cn } from '@/lib/utils'; interface DrawerContentProps extends React.ComponentProps<typeof DrawerPrimitive.Content> { fullscreen?: boolean; } function Drawer({ onOpenChange, open, closeOnEscape = true, ...props }: React.ComponentProps<typeof DrawerPrimitive.Root> & { closeOnEscape?: boolean; }) { React.useEffect(() => { if (!open || !onOpenChange || !closeOnEscape) return; const handleKeyDown = (event: KeyboardEvent) => { if (event.key === 'Escape' && closeOnEscape) { onOpenChange(false); } }; window.addEventListener('keydown', handleKeyDown); return () => window.removeEventListener('keydown', handleKeyDown); }, [open, onOpenChange, closeOnEscape]); return ( <DrawerPrimitive.Root data-slot="drawer" open={open} onOpenChange={onOpenChange} {...props} /> ); } function DrawerTrigger({ ...props }: React.ComponentProps<typeof DrawerPrimitive.Trigger>) { return <DrawerPrimitive.Trigger data-slot="drawer-trigger" {...props} />; } function DrawerPortal({ ...props }: React.ComponentProps<typeof DrawerPrimitive.Portal>) { return <DrawerPrimitive.Portal data-slot="drawer-portal" {...props} />; } function DrawerClose({ ...props }: React.ComponentProps<typeof DrawerPrimitive.Close>) { return <DrawerPrimitive.Close data-slot="drawer-close" {...props} />; } function DrawerContent({ className, children, fullscreen = false, ...props }: DrawerContentProps) { return ( <DrawerPortal data-slot="drawer-portal"> {fullscreen && ( <style> {` [data-vaul-drawer][data-vaul-drawer-direction="right"]::after { display: none !important; } `} </style> )} <DrawerPrimitive.Content data-slot="drawer-content" className={cn( 'group/drawer-content bg-background fixed z-50 flex h-auto flex-col shadow-lg outline-none select-text', 'data-[vaul-drawer-direction=top]:inset-x-0 data-[vaul-drawer-direction=top]:top-0 data-[vaul-drawer-direction=top]:mb-24 data-[vaul-drawer-direction=top]:max-h-[80vh] data-[vaul-drawer-direction=top]:rounded-b-lg data-[vaul-drawer-direction=top]:border-b', 'data-[vaul-drawer-direction=bottom]:inset-x-0 data-[vaul-drawer-direction=bottom]:bottom-0 data-[vaul-drawer-direction=bottom]:mt-24 data-[vaul-drawer-direction=bottom]:max-h-[80vh] data-[vaul-drawer-direction=bottom]:rounded-t-lg data-[vaul-drawer-direction=bottom]:border-t', 'data-[vaul-drawer-direction=right]:inset-y-0 data-[vaul-drawer-direction=right]:right-0 data-[vaul-drawer-direction=right]:shadow-[-10px_0_10px_-3px_rgba(0,0,0,0.1)]', 'data-[vaul-drawer-direction=left]:inset-y-0 data-[vaul-drawer-direction=left]:left-0 data-[vaul-drawer-direction=left]:shadow-[10px_0_10px_-3px_rgba(0,0,0,0.1)]', fullscreen && 'w-screen max-w-none', className, )} {...props} > {!fullscreen && ( <div className="bg-muted mx-auto mt-4 hidden h-2 w-[100px] shrink-0 rounded-full group-data-[vaul-drawer-direction=bottom]/drawer-content:block" /> )} {children} </DrawerPrimitive.Content> </DrawerPortal> ); } function DrawerHeader({ className, ...props }: React.ComponentProps<'div'>) { return ( <div data-slot="drawer-header" className={cn( 'flex flex-col border border-b gap-0.5 p-0 group-data-[vaul-drawer-direction=bottom]/drawer-content:text-center group-data-[vaul-drawer-direction=top]/drawer-content:text-center md:gap-1.5 md:text-left', className, )} {...props} /> ); } function DrawerFooter({ className, ...props }: React.ComponentProps<'div'>) { return ( <div data-slot="drawer-footer" className={cn('mt-auto flex flex-col gap-2 p-4', className)} {...props} /> ); } function DrawerTitle({ className, ...props }: React.ComponentProps<typeof DrawerPrimitive.Title>) { return ( <DrawerPrimitive.Title data-slot="drawer-title" className={cn('text-foreground font-semibold', className)} {...props} /> ); } function DrawerDescription({ className, ...props }: React.ComponentProps<typeof DrawerPrimitive.Description>) { return ( <DrawerPrimitive.Description data-slot="drawer-description" className={cn('text-muted-foreground text-sm', className)} {...props} /> ); } export { Drawer, DrawerPortal, DrawerTrigger, DrawerClose, DrawerContent, DrawerHeader, DrawerFooter, DrawerTitle, DrawerDescription, };

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/activepieces/activepieces'

If you have feedback or need assistance with the MCP directory API, please join our Discord server