"use client"
/**
* Responsive Sheet
*
* Dialog on desktop, Drawer (pull-down) on mobile.
* Automatically switches based on screen width using useIsMobile hook.
*/
import * as React from 'react';
import { useIsMobile } from '../../../hooks';
import {
Dialog,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
DialogTitle,
} from '../../overlay/dialog';
import {
Drawer,
DrawerContent,
DrawerDescription,
DrawerFooter,
DrawerHeader,
DrawerTitle,
} from '../../overlay/drawer';
// ─────────────────────────────────────────────────────────────────────────────
// Context
// ─────────────────────────────────────────────────────────────────────────────
const ResponsiveSheetContext = React.createContext<{ isMobile: boolean }>({
isMobile: false,
});
// ─────────────────────────────────────────────────────────────────────────────
// Root
// ─────────────────────────────────────────────────────────────────────────────
interface ResponsiveSheetProps {
open: boolean;
onOpenChange: (open: boolean) => void;
children: React.ReactNode;
}
function ResponsiveSheet({ open, onOpenChange, children }: ResponsiveSheetProps) {
const isMobile = useIsMobile();
if (isMobile) {
return (
{children}
);
}
return (
);
}
ResponsiveSheet.displayName = "ResponsiveSheet"
// ─────────────────────────────────────────────────────────────────────────────
// Content
// ─────────────────────────────────────────────────────────────────────────────
interface ResponsiveSheetContentProps {
children: React.ReactNode;
className?: string;
}
function ResponsiveSheetContent({ children, className }: ResponsiveSheetContentProps) {
const { isMobile } = React.useContext(ResponsiveSheetContext);
if (isMobile) {
// Preserve legacy content-hugging behavior; new Drawer default is `md`.
return {children};
}
return {children};
}
ResponsiveSheetContent.displayName = "ResponsiveSheetContent"
// ─────────────────────────────────────────────────────────────────────────────
// Header
// ─────────────────────────────────────────────────────────────────────────────
interface ResponsiveSheetHeaderProps extends React.HTMLAttributes {}
function ResponsiveSheetHeader({ className, ...props }: ResponsiveSheetHeaderProps) {
const { isMobile } = React.useContext(ResponsiveSheetContext);
if (isMobile) {
return ;
}
return ;
}
ResponsiveSheetHeader.displayName = "ResponsiveSheetHeader"
// ─────────────────────────────────────────────────────────────────────────────
// Title
// ─────────────────────────────────────────────────────────────────────────────
interface ResponsiveSheetTitleProps extends React.HTMLAttributes {}
function ResponsiveSheetTitle({ className, ...props }: ResponsiveSheetTitleProps) {
const { isMobile } = React.useContext(ResponsiveSheetContext);
if (isMobile) {
return ;
}
return ;
}
ResponsiveSheetTitle.displayName = "ResponsiveSheetTitle"
// ─────────────────────────────────────────────────────────────────────────────
// Description
// ─────────────────────────────────────────────────────────────────────────────
interface ResponsiveSheetDescriptionProps extends React.HTMLAttributes {}
function ResponsiveSheetDescription({ className, ...props }: ResponsiveSheetDescriptionProps) {
const { isMobile } = React.useContext(ResponsiveSheetContext);
if (isMobile) {
return ;
}
return ;
}
ResponsiveSheetDescription.displayName = "ResponsiveSheetDescription"
// ─────────────────────────────────────────────────────────────────────────────
// Footer
// ─────────────────────────────────────────────────────────────────────────────
interface ResponsiveSheetFooterProps extends React.HTMLAttributes {}
function ResponsiveSheetFooter({ className, ...props }: ResponsiveSheetFooterProps) {
const { isMobile } = React.useContext(ResponsiveSheetContext);
if (isMobile) {
return ;
}
return ;
}
ResponsiveSheetFooter.displayName = "ResponsiveSheetFooter"
// ─────────────────────────────────────────────────────────────────────────────
// Exports
// ─────────────────────────────────────────────────────────────────────────────
export {
ResponsiveSheet,
ResponsiveSheetContent,
ResponsiveSheetHeader,
ResponsiveSheetTitle,
ResponsiveSheetDescription,
ResponsiveSheetFooter,
};