fix(contacts): contact = standard entity page (inline properties + body editor) + sidebar/panel consistency (9.23.6, F-388)#115
Merged
Conversation
…itor, shared searchbar, right panel closed by default - Contact detail is now the standard entity page: hero (avatar + borderless editable name), the person's properties as an inline shared-cells block at the top (Tasks-detail convention), and the shared BrainstormEditor (Lexical + Yjs) below, bound to the person's UniversalBody Y.Doc. - Legacy bio seeds the body on first open and is cleared after the first real edit (same contract as Tasks' notes migration); bio row dropped from the property defs, anniversary row added. - Sidebar: shared <Searchbar> replaces the hand-rolled .bs-input field (no more focus-ring overflow past the panel edge), list rows/groups get the inline inset they were missing. - Right properties panel: window-scoped panel-state with a CLOSED default (was hardcoded open on every launch). - Extracted plainTextToSerializedState/hasLegacyText/shouldClearLegacyText to @brainstorm/editor (2nd consumer); Tasks' seed-body delegates to it. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… editor-bearing app root - One provider wraps both property surfaces (inline page block + slide-over inspector) — one store / one catalog list() IPC instead of two. - The full-app root is no longer wrapped in <StrictMode>: the page now hosts a @lexical/yjs body editor and StrictMode's dev double-mount re-binds it to an already-applied Y.Doc (blank body on reopen) — same fix + rationale as apps/notes/src/main.tsx. The widget branch keeps StrictMode. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Reworks the Contacts detail into the standard entity page and fixes the left-panel/inspector inconsistencies reported 2026-07-08 (friction F-388, plan iteration 9.23.6 — docs PR: brainstorm-os/harness#39).
What changed
Contact page (the repeated ask): the detail now follows the Tasks-detail convention —
.bs-inputface class for the control ratchet,:rootoverrides strip the resting box/ring, Database-title-input precedent),properties-panelcells via onepersonPropertyRowspath feeding both this block and the slide-over inspector (anniversaryDate row added;biorow dropped),BrainstormEditorbody below, bound to the person'sUniversalBody/v1Y.Doc (useYDoc(person.id)through the app-installed resolver — the same transport as Notes/Journal/Tasks/Bookmarks). Legacybioseeds the body on first open and is cleared after the first real edit.Shared seeding helpers:
plainTextToSerializedState/hasLegacyText/shouldClearLegacyTextextracted to@brainstorm/editorat their second consumer; Tasks'seed-bodynow delegates (API + tests unchanged).Left panel: search is the shared
<Searchbar>(the bespoke.bs-inputcomposite's focus ring overflowed past the sidebar border — root cause was a missingmin-width: 0; the shared bar owns chrome/focus/clear-✕), sitting in a 44px slot on the panel-header baseline; the list scroller now carries the inline inset rows/group headers were missing.Right panel: rides
@brainstorm/sdk/panel-state(window-scoped sessionStorage) with a closed default — was hardcodeduseState(true), so every launch opened with the inspector covering the page.Editor-host hygiene: app root no longer wraps in
<StrictMode>(dev double-mount breaks the@lexical/yjsbinding — same rationale as Notes); onePropertiesProviderfor both property surfaces;ydocbridge declared on the runtime type.Verification
bun run verifygreen (typecheck packages+apps, all app bundles, 375 in-process pipeline tests);bun run lintgreen incl. control-faces / css-tokens / app-i18n ratchets; contacts suite 126 tests, newplain-text-statetests in@brainstorm/editor.228-deep-contactsre-run — create / rename / birthday-edit / persistence PASS (its stale old-layout selectors are superseded); new229-contacts-page-probe(in harness PR chore: remove experiments/ from the public repo #39) — 9/10 PASS: right panel closed on launch, shared searchbar, inline role edit reflected in the hero subtitle, body editor typing, body survives navigate-away-and-back (Y.Doc released + re-resolved), search filter. The one FAIL is the probe's own cleanup selector (clicked a hidden row-hover ⋯), not a product path — the header ⋯ menu renders Open / Pin / Import vCard / Export vCard / Delete correctly (228 shot 12).Security
No new capabilities, IPC methods, or dependencies beyond
lexical(already vendored, same pin as Bookmarks/Tasks) added to the contacts app bundle. The Y.Doc surface rides the existingentities.write:Person/v1grant, identical to Bookmarks' 9.18.7 wiring.🤖 Generated with Claude Code