Fix mobile drawer More list overflowing viewport by rendering inline

This commit is contained in:
Chad Curtis
2026-02-28 03:22:34 -06:00
parent 8761f4d197
commit 50be154dc4
2 changed files with 52 additions and 1 deletions
+1
View File
@@ -164,6 +164,7 @@ export function MobileDrawer({ open, onOpenChange }: MobileDrawerProps) {
onNavigate={handleClose}
open={moreMenuOpen}
onOpenChange={setMoreMenuOpen}
inline
/>
</nav>
+51 -1
View File
@@ -16,10 +16,12 @@ interface SidebarMoreMenuProps {
onNavigate?: () => void;
open: boolean;
onOpenChange: (open: boolean) => void;
/** Render items inline (no portal dropdown) — use inside scrollable containers like the mobile drawer */
inline?: boolean;
}
export function SidebarMoreMenu({
editing, hiddenItems, onDoneEditing, onStartEditing, onAdd, onNavigate, open, onOpenChange,
editing, hiddenItems, onDoneEditing, onStartEditing, onAdd, onNavigate, open, onOpenChange, inline,
}: SidebarMoreMenuProps) {
if (editing) {
return (
@@ -33,6 +35,54 @@ export function SidebarMoreMenu({
);
}
if (inline) {
return (
<div className="flex flex-col">
{/* Toggle button */}
<button
onClick={() => onOpenChange(!open)}
className="flex items-center gap-4 px-4 py-2.5 rounded-full transition-colors text-sm text-muted-foreground/60 hover:text-muted-foreground hover:bg-secondary/40 bg-background/85"
>
<Plus className="size-4" />
<span>More...</span>
</button>
{/* Inline expanded list */}
{open && (
<div className="flex flex-col gap-0.5 pl-2">
{hiddenItems.map((item) => (
<div key={item.id} className="flex items-center">
<Link
to={itemPath(item.id)}
onClick={() => { onOpenChange(false); onNavigate?.(); }}
className="flex items-center gap-3 flex-1 min-w-0 px-2 py-2 rounded-sm text-sm hover:bg-secondary/60 transition-colors"
>
{sidebarItemIcon(item.id, 'size-5 shrink-0')}
<span className="truncate">{item.label}</span>
</Link>
<button
onClick={() => { onAdd(item.id); onOpenChange(false); }}
className="size-8 flex items-center justify-center shrink-0 rounded-sm text-muted-foreground hover:text-primary hover:bg-primary/10 transition-colors"
title={`Add ${item.label} to sidebar`}
>
<Plus className="size-4" />
</button>
</div>
))}
{hiddenItems.length > 0 && <div className="h-px bg-border my-1" />}
<button
onClick={() => { onStartEditing(); onOpenChange(false); }}
className="flex items-center gap-3 w-full px-2 py-2 rounded-sm text-sm hover:bg-secondary/60 transition-colors cursor-pointer"
>
<Pencil className="size-5" />
<span>Edit sidebar</span>
</button>
</div>
)}
</div>
);
}
return (
<DropdownMenu open={open} onOpenChange={onOpenChange}>
<DropdownMenuTrigger asChild>