A combatant at 0 HP renders its row sections with opacity-50, and the HP popover lived inside the HP section. CSS opacity applies to the whole subtree, so position: fixed did not escape it — the popover you need to heal a downed creature came up half-transparent. Render it through createPortal into document.body, matching what ConditionPicker and DetailPopover already do. Positioning now takes an anchorRef instead of reading parentElement, since the portal's parent is the body, and the z-index moves to z-50 alongside the other portaled popovers. The standalone popover test has to mount the anchor before the popover: React attaches a parent's ref after its children's layout effects run, so a same-mount anchorRef is still null when the popover measures itself. That matches the app, where the popover only opens on click. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>