# Implementation Plan: Combatant Row Declutter **Branch**: `019-combatant-row-declutter` | **Date**: 2026-03-06 | **Spec**: [spec.md](./spec.md) **Input**: Feature specification from `/specs/019-combatant-row-declutter/spec.md` ## Summary Replace always-visible HP adjustment controls (QuickHpInput with delta input + Sword/Heart buttons) and AC input field with compact, on-demand interaction patterns. HP becomes a clickable value that opens a popover for damage/healing. AC becomes a static shield+number display with click-to-edit inline editing. This is purely a web adapter (UI) change — domain and application layers are untouched. ## Technical Context **Language/Version**: TypeScript 5.8 (strict mode, verbatimModuleSyntax) **Primary Dependencies**: React 19, Vite 6, Tailwind CSS v4, Lucide React (icons) **Storage**: N/A (no storage changes — existing localStorage persistence unchanged) **Testing**: Vitest (unit tests for pure functions; UI behavior verified manually) **Target Platform**: Desktop and tablet-width browsers **Project Type**: Web application (monorepo with domain/application/web layers) **Performance Goals**: N/A (no performance-sensitive changes) **Constraints**: Keyboard-accessible, no domain/application layer modifications **Scale/Scope**: 1 component modified (CombatantRow), 1 component removed (QuickHpInput), 1 new component (HpAdjustPopover). AC and Max HP click-to-edit are implemented inline within CombatantRow (no separate component files) ## Constitution Check *GATE: Must pass before Phase 0 research. Re-check after Phase 1 design.* | Principle | Status | Notes | |-----------|--------|-------| | I. Deterministic Domain Core | PASS | No domain changes | | II. Layered Architecture | PASS | All changes in adapter layer (apps/web) only | | III. Agent Boundary | N/A | No agent features involved | | IV. Clarification-First | PASS | Feature description was fully specified, no ambiguities | | V. Escalation Gates | PASS | All changes within spec scope | | VI. MVP Baseline Language | PASS | No permanent bans introduced | | VII. No Gameplay Rules | PASS | No gameplay mechanics in plan | **Pre-design gate: PASS** — no violations. ## Project Structure ### Documentation (this feature) ```text specs/019-combatant-row-declutter/ ├── plan.md # This file ├── research.md # Phase 0 output ├── data-model.md # Phase 1 output ├── quickstart.md # Phase 1 output └── tasks.md # Phase 2 output (/speckit.tasks command) ``` ### Source Code (repository root) ```text apps/web/src/components/ ├── combatant-row.tsx # MODIFY: replace CurrentHpInput with clickable display + popover, │ # replace AcInput with click-to-edit static display ├── hp-adjust-popover.tsx # NEW: popover with numeric input + Damage/Heal buttons ├── quick-hp-input.tsx # REMOVE: replaced by hp-adjust-popover └── ui/ ├── button.tsx # existing (used by popover) └── input.tsx # existing (used by popover and AC inline edit) ``` **Structure Decision**: All changes are confined to `apps/web/src/components/`. No new directories needed. The existing monorepo structure (domain → application → web) is preserved. No contracts directory needed since this is an internal UI refactor with no external interfaces. ## Post-Design Constitution Re-Check | Principle | Status | Notes | |-----------|--------|-------| | I. Deterministic Domain Core | PASS | No domain changes | | II. Layered Architecture | PASS | Only adapter-layer files touched | | IV. Clarification-First | PASS | No new ambiguities introduced | | V. Escalation Gates | PASS | All within spec scope | **Post-design gate: PASS** — no violations.