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}
)
}