{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"0n-bottom-pull","type":"registry:block","title":"Bottom Pull","description":"Mobile-friendly bottom-anchored drawer with title, body, and footer slots. Pre-composed so you don’t plumb every Drawer subcomponent.","dependencies":["vaul"],"registryDependencies":["button","drawer"],"files":[{"path":"components/0n/bottom-pull.tsx","type":"registry:block","target":"components/0n/bottom-pull.tsx","content":"'use client'\n\n/**\n * 0n Bottom Pull — mobile-friendly drawer that slides up from the bottom.\n * Pre-composed with title, body, and primary action slots. Built on\n * shadcn Drawer (vaul under the hood).\n *\n * Install:\n *   npx shadcn@latest add https://0nmcp.com/r/0n-bottom-pull.json\n *\n * Use:\n *   <BottomPull\n *     trigger={<Button>Open</Button>}\n *     title=\"Quick actions\"\n *     description=\"Best for mobile flows.\"\n *     primaryAction={{ label: 'Done' }}\n *   >\n *     <p>Body content.</p>\n *   </BottomPull>\n */\n\nimport { useState, type ReactNode } from 'react'\nimport {\n  Drawer,\n  DrawerClose,\n  DrawerContent,\n  DrawerDescription,\n  DrawerFooter,\n  DrawerHeader,\n  DrawerTitle,\n  DrawerTrigger,\n} from '@/components/ui/drawer'\nimport { Button } from '@/components/ui/button'\n\ninterface Action {\n  label: string\n  onClick?: () => void\n  variant?: 'default' | 'outline' | 'ghost' | 'destructive'\n}\n\nexport interface BottomPullProps {\n  trigger: ReactNode\n  title: string\n  description?: string\n  children?: ReactNode\n  primaryAction?: Action\n  open?: boolean\n  onOpenChange?: (next: boolean) => void\n}\n\nexport function BottomPull({\n  trigger,\n  title,\n  description,\n  children,\n  primaryAction,\n  open,\n  onOpenChange,\n}: BottomPullProps) {\n  const [internal, setInternal] = useState(false)\n  const isOpen = open ?? internal\n  const setOpen = (v: boolean) => {\n    if (open === undefined) setInternal(v)\n    onOpenChange?.(v)\n  }\n\n  return (\n    <Drawer open={isOpen} onOpenChange={setOpen}>\n      <DrawerTrigger asChild>{trigger}</DrawerTrigger>\n      <DrawerContent>\n        <DrawerHeader>\n          <DrawerTitle>{title}</DrawerTitle>\n          {description ? <DrawerDescription>{description}</DrawerDescription> : null}\n        </DrawerHeader>\n        {children ? <div className=\"px-4 pb-2\">{children}</div> : null}\n        <DrawerFooter>\n          {primaryAction ? (\n            <Button\n              variant={primaryAction.variant ?? 'default'}\n              onClick={() => {\n                primaryAction.onClick?.()\n                setOpen(false)\n              }}\n            >\n              {primaryAction.label}\n            </Button>\n          ) : null}\n          <DrawerClose asChild>\n            <Button variant=\"outline\">Close</Button>\n          </DrawerClose>\n        </DrawerFooter>\n      </DrawerContent>\n    </Drawer>\n  )\n}\n"}]}