27 lines
2.4 KiB
Markdown
27 lines
2.4 KiB
Markdown
# Research: Fix HP Popover Overflow
|
|
|
|
## R-001: Positioning strategy for popover inside scroll container
|
|
|
|
**Decision**: Use `position: fixed` with `useLayoutEffect` + `getBoundingClientRect` to position the popover relative to the viewport, escaping the scroll container's overflow clipping.
|
|
|
|
**Rationale**: The `ConditionPicker` component uses `position: absolute` with a `flipped` state for vertical overflow, but that pattern does not work for the HP popover's horizontal overflow. The popover sits inside a scroll container (`flex-1 overflow-y-auto`) which clips absolutely-positioned children. Both `right-0` alignment and `translateX` shifts are ineffective because the scroll container clips the overflowing content regardless. `position: fixed` removes the popover from the container's clipping context entirely.
|
|
|
|
**Alternatives considered**:
|
|
- `position: absolute` with `right-0` flip (ConditionPicker pattern): The relative parent (`ClickableHp`) is too small, so `right-0` barely shifts the popover. The scroll container still clips it. Rejected.
|
|
- `position: absolute` with `translateX(-Npx)`: Same clipping issue. Rejected.
|
|
- `overflow-x: hidden` on scroll container: Clips the popover instead of showing a scrollbar — same visual problem. Rejected.
|
|
- Floating UI / Popper.js: Heavy dependency for a simple case. Rejected.
|
|
- CSS `anchor-positioning`: Not yet widely supported across browsers. Rejected.
|
|
|
|
## R-002: Viewport measurement for overflow detection
|
|
|
|
**Decision**: Use `document.documentElement.clientWidth` instead of `window.innerWidth` for viewport width measurement.
|
|
|
|
**Rationale**: When the popover overflows the viewport, `window.innerWidth` expands to include the scrollbar area, causing overflow detection to report no overflow. `document.documentElement.clientWidth` returns the CSS viewport width excluding scrollbars, giving an accurate measurement even when overflow has already occurred.
|
|
|
|
## R-003: Horizontal scrollbar cause
|
|
|
|
**Decision**: The fix addresses the root cause (popover overflow) rather than masking the symptom (scrollbar).
|
|
|
|
**Rationale**: The scrollbar appeared because the combatant list container (`flex-1 overflow-y-auto min-h-0`) has default `overflow-x: visible`. The absolutely-positioned popover extended beyond the viewport, creating the scrollbar. Switching to `position: fixed` removes the popover from the document flow entirely, so it cannot cause overflow on any ancestor container.
|