v0.3.0 — Detail-panel rebuild, search, mobile cards
What's new
- New navigation: deal/contact details now slide in from the right with a back-stack — drill from a deal into its contact (or vice versa) and pop your way back. Click the contact name on a deal, click a deal row on a contact: both push onto the panel.
- View / edit / create modes in a single panel for both deals and contacts. The old centered modal is gone.
+ New Deal/+ New Contactin the toolbar (right of the view switcher), label switches per active view.- Contact search — case-insensitive across name, company, and email — with a clear (×) button.
- Deals column on the contacts table: count + active pipeline value, or
count · closedwhen nothing is active. - Mobile: contacts table renders as cards below 640px; panel becomes a full-screen sheet; 44px touch targets across all interactive elements.
- Map view removed — was noise; ~1000 LOC deleted.
- Theming: every color and font now reads from host theme tokens via a centralized
useStyleTokens()helper. No more hardcoded hex. - Idempotent startup linker:
link_deals_to_contactsruns once at server boot so seeded deals always carrybelongs_toedges. - Schema fields nullable:
value,probability,close_dateon the deal schema now admitnull. The UI sendsnullwhen a user clears a field in edit mode (was a silent no-op before). - Structured server errors surface as
data.error/data.message/data.detail(or JSON) instead of[object Object]. - Race-safe ContactView loads via per-load seq counters so fast drill-downs don't land contact-A's data under contact-B's header.
No breaking changes to the MCP tool surface or entity schemas.
Companion fix: nimblebrain#191 — host bridge now accepts ui/update-model-context notifications, so useVisibleState pushes are no longer dropped. This release's panel-context payload (openPanel, panelDepth) needs that fix to reach the agent.
Full PR: #4