From a327890b5732614c76838ab775da11a744195ebd Mon Sep 17 00:00:00 2001 From: Kyle Pope Date: Wed, 18 Mar 2026 01:10:36 +0800 Subject: [PATCH] Fix dropdown clipping: use fixed positioning to escape overflow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit UserActionsMenu and SnoozeDropdown were clipped by parent containers with overflow-x-auto/overflow-y-auto. Switch from absolute to fixed positioning — compute viewport-relative coordinates on open via getBoundingClientRect. Dropdowns now render above all overflow boundaries. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../src/components/admin/UserActionsMenu.tsx | 16 +++++++++++-- .../components/reminders/SnoozeDropdown.tsx | 23 +++++++++++++++---- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/frontend/src/components/admin/UserActionsMenu.tsx b/frontend/src/components/admin/UserActionsMenu.tsx index 60c99d5..b808e7b 100644 --- a/frontend/src/components/admin/UserActionsMenu.tsx +++ b/frontend/src/components/admin/UserActionsMenu.tsx @@ -46,6 +46,8 @@ export default function UserActionsMenu({ user, currentUsername }: UserActionsMe const [roleSubmenuOpen, setRoleSubmenuOpen] = useState(false); const [tempPassword, setTempPassword] = useState(null); const menuRef = useRef(null); + const buttonRef = useRef(null); + const [menuPos, setMenuPos] = useState<{ top: number; right: number } | null>(null); const updateRole = useUpdateRole(); const resetPassword = useResetPassword(); @@ -123,10 +125,17 @@ export default function UserActionsMenu({ user, currentUsername }: UserActionsMe return (
{open && ( -
+
{/* Edit Role */}
{open && ( -
+
{options.map((opt) => (