Skip to content

feat(ui): segmented Projects | Workspaces sub-tabs#289

Merged
physercoe merged 1 commit into
mainfrom
feat/projects-segmented-tabs
Jun 14, 2026
Merged

feat(ui): segmented Projects | Workspaces sub-tabs#289
physercoe merged 1 commit into
mainfrom
feat/projects-segmented-tabs

Conversation

@physercoe

Copy link
Copy Markdown
Owner

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 SegmentedButtonProjects (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.

  • Graceful degradation: when only one kind is present, keep the existing labelled single scroll — never a segmented control with an empty side to tap into.
  • Selected segment = a screen-local autoDispose StateProvider (resets on leave).
  • 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 (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

@physercoe physercoe force-pushed the feat/projects-segmented-tabs branch from b0eb93f to 38d9c82 Compare June 14, 2026 04:38
…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>
@physercoe physercoe force-pushed the feat/projects-segmented-tabs branch from 38d9c82 to 012f3dd Compare June 14, 2026 04:45
@physercoe physercoe merged commit 60bef34 into main Jun 14, 2026
4 checks passed
@physercoe physercoe deleted the feat/projects-segmented-tabs branch June 14, 2026 04:48
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>
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