--- phase: 16-multi-signer-ui plan: "02" subsystem: ui tags: [react, typescript, preparepanel, signer-list, send-block-validation] # Dependency graph requires: - phase: 16-multi-signer-ui plan: "01" provides: signers prop, onSignersChange, onUnassignedFieldIdsChange threaded from DocumentPageClient provides: - SIGNER_COLORS palette constant ['#6366f1', '#f43f5e', '#10b981', '#f59e0b'] - Signer list UI in PreparePanel (email input + "Add Signer" button + colored dot rows + aria-labeled × remove) - handleAddSigner / handleRemoveSigner with duplicate/format validation - Send-block validation: fetch fields → check no-signers guard → check unassigned isClientVisibleField fields - Inline error messages: "Add at least one signer..." and "{N} field(s) need a signer assigned..." - signers persisted to documents.signers via prepare POST body affects: [16-04-dashboard-badge] --- # Phase 16 Plan 02: PreparePanel Signer List UI Summary ## What Was Built Modified `PreparePanel.tsx` (+104 lines) and `prepare/route.ts` (+5 lines): **PreparePanel.tsx:** - `SIGNER_COLORS = ['#6366f1', '#f43f5e', '#10b981', '#f59e0b']` — auto-assigned by index - Props destructured: `signers`, `onSignersChange`, `onUnassignedFieldIdsChange` - `handleAddSigner` — validates email format + duplicate, assigns next color from palette, calls `onSignersChange` - `handleRemoveSigner` — filters signer from list, clears `unassignedFieldIds` - Signer list UI section (Draft-only, inserted above Prepare and Send): - Email `` + "Add Signer" `