feat(ui): segmented Projects | Workspaces sub-tabs#289
Merged
Conversation
b0eb93f to
38d9c82
Compare
…reen With many goal-projects, the standing-Workspaces section was buried at the bottom of one long scroll. When BOTH partitions are populated, render a pinned Material 3 SegmentedButton (the same widget this screen's status/sort filters use) — `Projects (N) | Workspaces (M)` — each driving its own scroll, so either set is one tap away with no scrolling past the other. Canonical Material/HIG pattern for two peer collections with distinct mental models (the code already notes "bounded outcome vs. ongoing container"). Graceful degradation: when only one kind is present, keep the existing labelled single scroll — never a segmented control with an empty side. The selected segment is a screen-local autoDispose StateProvider; partition scrolls use AlwaysScrollableScrollPhysics so pull-to-refresh still fires on a short list. Labels reuse the existing sectionProjects/sectionWorkspaces keys (no new ARB strings). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
38d9c82 to
012f3dd
Compare
physercoe
pushed a commit
that referenced
this pull request
Jun 14, 2026
Hub robustness sweep (#74–#79) + Projects-tab segmented sub-tabs. - ADR-045 D4 storage maintenance (#288) - raw-SQL-error no-leak sweep (#280/#283), rows.Err audit (#286), FTS/routing status codes (#287), owner-or-steward gate (#281), read-pool cap + rows.Close defer (#292), additive pagination (#293) - segmented Projects | Workspaces tabs (#289) Co-Authored-By: Claude Opus 4.8 <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.
The Projects tab stacked Projects (goals) then Workspaces (
kind='standing') in one scroll, so with many goals the standing-Workspaces set was buried at the bottom — awkward to reach.Change
When both partitions are populated, a pinned Material 3
SegmentedButton—Projects (N) | Workspaces (M)— switches between two independent scrolls. It's the same widget this screen already uses for its status/sort filters, and the canonical Material/HIG pattern for two peer collections with distinct mental models (the code already notes "bounded outcome vs. ongoing container"). Either set is now one tap away with no scrolling past the other.autoDisposeStateProvider(resets on leave).AlwaysScrollableScrollPhysicsso pull-to-refresh still fires on a short list.sectionProjects/sectionWorkspaceskeys — no new ARB strings (interpolated count starts with$, so the hardcoded-string lint skips it).Director-selected layout (segmented sub-tabs) over collapsible-sticky / reorder alternatives.
Verify
No local Flutter — relies on CI
flutter analyze+ builds. Director device-test: open Projects with both goals and workspaces present → segmented control appears, tapping Workspaces shows only workspaces with no scroll-past; with only one kind present → single labelled list, no control.🤖 Generated with Claude Code