76 lines
3.7 KiB
Markdown
76 lines
3.7 KiB
Markdown
# 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.
|