diff --git a/apps/x/apps/renderer/src/components/meetings-view.tsx b/apps/x/apps/renderer/src/components/meetings-view.tsx index 58700b43..b2aaa2e0 100644 --- a/apps/x/apps/renderer/src/components/meetings-view.tsx +++ b/apps/x/apps/renderer/src/components/meetings-view.tsx @@ -1,4 +1,5 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react' +import { createPortal } from 'react-dom' import { Calendar, ChevronDown, Clock, ExternalLink, Loader2, MapPin, Mic, Square, UserRound, UsersRound, Video, X } from 'lucide-react' import { Button } from '@/components/ui/button' @@ -548,8 +549,8 @@ function UpcomingDayCard({ day, isToday }: { day: DayGroup; isToday: boolean }) const count = day.events.length return ( -
-
+
+
{dayNum} @@ -604,7 +605,7 @@ function UpcomingEventItem({ event, isLast }: { event: UpcomingEvent; isLast: bo className={cn( 'group flex w-full cursor-pointer items-center gap-4 px-5 py-3 text-left transition-colors', !isLast && 'border-b', - isNow ? 'bg-background' : 'hover:bg-background', + isNow ? 'bg-muted' : 'hover:bg-muted/50', )} > @@ -786,22 +787,39 @@ function SplitJoinButton({ onJoinAndNotes, onNotesOnly }: { onNotesOnly: () => void }) { const [open, setOpen] = useState(false) - const ref = useRef(null) + const containerRef = useRef(null) + const menuRef = useRef(null) + // Fixed-position coords for the portaled menu so it isn't clipped by the + // calendar card's `overflow-hidden`. + const [menuPos, setMenuPos] = useState<{ top: number; right: number } | null>(null) + + const updatePos = useCallback(() => { + const rect = containerRef.current?.getBoundingClientRect() + if (!rect) return + setMenuPos({ top: rect.bottom + 4, right: window.innerWidth - rect.right }) + }, []) useEffect(() => { if (!open) return + updatePos() const handler = (e: MouseEvent) => { const target = e.target - if (ref.current && target instanceof globalThis.Node && !ref.current.contains(target)) { - setOpen(false) - } + if (!(target instanceof globalThis.Node)) return + if (containerRef.current?.contains(target) || menuRef.current?.contains(target)) return + setOpen(false) } document.addEventListener('mousedown', handler) - return () => document.removeEventListener('mousedown', handler) - }, [open]) + window.addEventListener('resize', updatePos) + window.addEventListener('scroll', updatePos, true) + return () => { + document.removeEventListener('mousedown', handler) + window.removeEventListener('resize', updatePos) + window.removeEventListener('scroll', updatePos, true) + } + }, [open, updatePos]) return ( -
+
- {open && ( -
- -
- )} + {open && menuPos + ? createPortal( +
+ +
, + document.body, + ) + : null}
) }