Skip to content

feat: Atlas perspectives frontend -- switcher, board filtering, membership (goal 0095 slice 2, ADR-0041) - #229

Merged
alicoding merged 2 commits into
mainfrom
perspectives-frontend
Aug 18, 2026
Merged

feat: Atlas perspectives frontend -- switcher, board filtering, membership (goal 0095 slice 2, ADR-0041)#229
alicoding merged 2 commits into
mainfrom
perspectives-frontend

Conversation

@alicoding

Copy link
Copy Markdown
Owner

The views half of the O(1) reference-architecture property, on the board:

  • The perspective switcher absorbs the Lens popover: All cards (default-is-absence) → named perspectives (rename/delete via kebab or right-click) → inline "New perspective…" → the old kind-hide checkboxes. The dead depth/peek toggle is removed with its test.
  • Board filtering: active perspective renders member cards only (service-guaranteed ancestry closure), links only when the link and both endpoints are members (ADR-0041's link rule); client filter mirrors Go's FilterByPerspective and is unit-tested. Auto-arrange disables at the one choke point while a perspective is active, so neither button, palette, nor keyboard can bypass it.
  • Membership: authoring-adds-to-active turned out fully server-side — the real fix was the frontend's slice-1 stub hardcoding activePerspectiveID to empty in every SetAtlasSession call, now genuinely persisted/restored. Context menus gain Add to/Remove from perspective (single + multi-select); the card page mounts a self-contained membership-chips component (one-line footprint, goal 0106 collision-aware). Quiet toast on add/remove.

Dedicated-server e2e (own ports, global-session reasoning in the header): create/switch/rename; filtering + closure + link rule + arrange-disabled; authoring-adds-to-active + the O(1) edit-reflects-everywhere property; membership remove + delete. 19/19 e2e, 551/551 vitest, full local gates green. Screenshot-reviewed against ADR-0041's contract.

Goal: docs/goals/0095-atlas-perspectives.md (slice 2 of 3).

🤖 Generated with Claude Code

https://claude.ai/code/session_01FW5GkkAG8du7tNdYLk2zSd

…rship editing (goal 0095 slice 2, ADR-0041)

The perspective switcher absorbs the Lens popover's slot in the board
toolbar: All cards / named perspectives / New perspective, with the
kind-hide filter demoted into its own Hide kinds section. Board
rendering filters to the active perspective's own member cards (closed
under ancestry by the already-shipped Go service) and member links
(hidden when either endpoint isn't a member too); Auto-arrange
disables while a perspective is active. Membership adds/removes from
both the card context menu (single + multi-select) and a new
self-contained card-page component, each with a quiet toast.
Authoring-adds-to-active turned out to be fully server-side (slice 1's
own hook) -- the missing piece was the frontend actually persisting
the active perspective into session state instead of hardcoding "".

Covered by a dedicated-server e2e spec (global session state, per
testing.md's shared-vs-dedicated rule) plus a unit test for the
client-side FilterByPerspective mirror.
@alicoding
alicoding enabled auto-merge (squash) August 18, 2026 07:36
@alicoding
alicoding merged commit fb05b6b into main Aug 18, 2026
26 of 27 checks passed
@alicoding
alicoding deleted the perspectives-frontend branch August 18, 2026 08:10
alicoding added a commit that referenced this pull request Aug 18, 2026
…ibling breadcrumbs (goal 0106 slice B) (#230)

* feat: the calm card page -- create-loop audit, minimap, sibling breadcrumbs (goal 0106 slice B)

The card page reads as a document, not a form: a compact property
strip (kind label, a Kind-declared "status" field as a chip, freshness
dot), a borderless type-to-write note, and every other optional field
(kind fields, source/mirror path, typed-link slot rows, Actions)
collapses to a one-line "+ Add" invitation when empty and expands
focused on click -- a title-only card's page now shows title + strip +
write-invitation and nothing else, including Contents, which mounts
only when the card has children or a mirror.

The placement popover's 'create'-mode resting view drops its Kind/
Title labels and Submit/Cancel row (kind chip + title input only,
Enter commits, Escape cancels) and its title input is now genuinely
autofocused (AnchoredOverlay's own focus trap was grabbing the kind
chip first); 'promote'/'area' modes keep their existing form.

The board gains React Flow's own MiniMap (bottom-right, styled to
tokens, moved to shared/ since composition/ and atlas/ both need it
now), a control-strip toggle button + palette command (localStorage-
persisted, default on), and every breadcrumb segment becomes a
sibling-dropdown trigger (name + card count, current one selected,
clicking any entry navigates).

0104's keyboard-nav key table (Tab/Shift-Tab, Option-arrows, Enter,
arrows, Escape) is now advertised in the command registry and
Shortcuts Help overlay, hintOnly + paletteHidden since the real
handling stays in useAtlasKeyboardNav.ts.

Fixes two real bugs the new minimap surfaced: three e2e flows placed
cards/notes/clicks in the board's bottom-right corner, which the
minimap now occupies -- moved to corners it doesn't cover, and
clickCorner's own 'bottom-right' option (now unsafe) is removed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FW5GkkAG8du7tNdYLk2zSd

* feat: relocate perspective membership into the calm page's property strip (goal 0106 slice B)

Goal 0095 slice 2 (PR #229) landed AtlasPerspectiveMembership as its
own mid-body row; moved it into AtlasCardPropertyStrip.tsx instead,
alongside kind/status/freshness -- one compact row, same quiet style,
still rendering nothing when the space has adopted no perspective.

Also migrates atlas-perspectives.spec.ts's one breadcrumb click (still
written against the pre-slice-B direct-navigate behavior) to the new
sibling-dropdown two-step interaction.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FW5GkkAG8du7tNdYLk2zSd

* test: mirror-path projection spec expands the calm page's quiet-add before filling

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FW5GkkAG8du7tNdYLk2zSd

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant