Room list: unjoined project-room groups collapse behind one Browse entry #67

Merged
void merged 2 commits from void/browse-collapse into dev 2026-11-10 14:47:43 +00:00
Member

Libby's front-door finding: long groups of unjoined project rooms, each row a Join button, stand between the user and the first conversation.

Rule (pure, splitGroups in buildEstate.ts): within a tier, a steward group in which the user has joined or been invited to any room stays up front exactly as before (unjoined siblings included). A group where every room is joinable moves behind one entry per tier, "Browse N more rooms". Loose estate rooms (Swarm, Operator, General, Members) and joined rooms are never grouped away.

Behaviour: Browse is closed by default on every screen, which also satisfies the phone design law (inactive elements hide, vertical space is cheaper than horizontal). Opening it shows the groups as before, each still collapsible. The open state is remembered per device in the same closedNavCategories store as the other sections (key estate|browse|<tier>).

Tests: 4 new on splitGroups (all-unjoined goes to Browse and loose rooms stay; one joined room keeps its group up front with siblings; an invite keeps its group up front, fails if the rule is narrowed to joined; nothing is lost). vitest 607/607. The component wiring has no render test (no react renderer in the repo).

Overlap: touches only EstateNavigator.tsx Tier and buildEstate.ts; no change to the join path or to navigator-s8-lows items.

Not merged: for Libby to read. Not deployed.

🤖 Generated with Claude Code

Libby's front-door finding: long groups of unjoined project rooms, each row a Join button, stand between the user and the first conversation. **Rule (pure, `splitGroups` in `buildEstate.ts`):** within a tier, a steward group in which the user has joined *or been invited to* any room stays up front exactly as before (unjoined siblings included). A group where every room is joinable moves behind one entry per tier, "Browse N more rooms". Loose estate rooms (Swarm, Operator, General, Members) and joined rooms are never grouped away. **Behaviour:** Browse is closed by default on every screen, which also satisfies the phone design law (inactive elements hide, vertical space is cheaper than horizontal). Opening it shows the groups as before, each still collapsible. The open state is remembered per device in the same closedNavCategories store as the other sections (key `estate|browse|<tier>`). **Tests:** 4 new on `splitGroups` (all-unjoined goes to Browse and loose rooms stay; one joined room keeps its group up front with siblings; an invite keeps its group up front, fails if the rule is narrowed to `joined`; nothing is lost). vitest 607/607. The component wiring has no render test (no react renderer in the repo). **Overlap:** touches only `EstateNavigator.tsx` `Tier` and `buildEstate.ts`; no change to the join path or to `navigator-s8-lows` items. Not merged: for Libby to read. Not deployed. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Room list: groups of unjoined project rooms wait behind one Browse entry
All checks were successful
Build pull request / Build pull request (pull_request) Successful in 3m37s
3c92696507
A steward group with no joined or invited room collapses into "Browse N more rooms"
per tier, closed on every screen and remembered per device; a group the user is in
anything of, loose estate rooms, and joined rooms stay up front. splitGroups is the
pure rule, tested.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Category buttons expose aria-expanded
All checks were successful
Build pull request / Build pull request (pull_request) Successful in 3m17s
3c868254e5
RoomNavCategoryButton set open/closed only through its chevron. It now sets
aria-expanded from `closed` (absent when the section does not toggle); tested by
rendering to static markup.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
void merged commit dce50eeaf6 into dev 2026-11-10 14:47:43 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
GameCult/Ratatoskr!67
No description provided.