# Quickstart: Fix Zero-HP Opacity **Feature**: 020-fix-zero-hp-opacity **Date**: 2026-03-06 ## Problem When a combatant reaches 0 HP, the entire row gets `opacity-50` applied to the outermost container. This cascades to absolutely-positioned child elements (HP adjust popover and condition picker dropdown), making them semi-transparent and hard to use. ## Fix Location **Single file**: `apps/web/src/components/combatant-row.tsx` ## Fix Strategy 1. Remove `opacity-50` from the outer row `
` (line 312). 2. Apply `opacity-50` to individual leaf/display elements within the row when `status === "unconscious"`: - Initiative input - Name display - AC display - HP current value button (inside `ClickableHp`) - HP separator slash - Max HP display - Concentration button - Condition tags - Remove button 3. The `HpAdjustPopover` and `ConditionPicker` components — which are absolutely positioned overlays — are **not** wrapped in any dimmed container, so they render at full opacity. ## Key Constraint CSS `opacity` on a parent element creates a stacking context that affects all children. There is no way to "undo" a parent's opacity on a child element. The fix must ensure popovers are never DOM descendants of an element with reduced opacity. ## Verification ```bash pnpm --filter web dev # Start dev server # 1. Add a combatant, set max HP, reduce current HP to 0 # 2. Click HP value — popover should appear at full opacity # 3. Click conditions area — picker should appear at full opacity # 4. Row content (name, initiative, etc.) should still appear dimmed ``` ## Quality Gate ```bash pnpm check # Must pass before commit ```