Context
Two shared-UI panels fold several independent state machines into one component.
- composer.tsx (1124): draft persistence (draftStoreRef, saveCurrentDraft, swap-effect
323-341) + prompt-history nav (481-526) + @/ mention state machine (270-280, 550-580,
610-667) + drag/drop+paste import (669-737) + toolbars (822-1114).
- plan-reminder-panel.tsx (863): ~20 useState mixing edit-form fields (127-134), list
filter/sort/search (145-148), run-history range, dialog + per-action pending; the
create/edit dialog form (668-860, ~190 JSX lines) is self-contained.
Proposed
- Composer: extract useComposerDraft, useComposerHistory, useMentionPopup (or a
child), and a ; composer orchestrates only.
- Plan-reminder: extract owning all form state + submit; the
panel keeps list/runs/query state.
Acceptance
Each hook/component owns one concern; the panels no longer hold every field.
Context
Two shared-UI panels fold several independent state machines into one component.
323-341) + prompt-history nav (481-526) + @/ mention state machine (270-280, 550-580,
610-667) + drag/drop+paste import (669-737) + toolbars (822-1114).
filter/sort/search (145-148), run-history range, dialog + per-action pending; the
create/edit dialog form (668-860, ~190 JSX lines) is self-contained.
Proposed
child), and a ; composer orchestrates only.
panel keeps list/runs/query state.
Acceptance
Each hook/component owns one concern; the panels no longer hold every field.