Skip to content

Library: title-strip tabs, one library, no side rail - #149

Open
SunkenInTime wants to merge 8 commits into
icarus-cloudfrom
t3code/library-title-strip
Open

Library: title-strip tabs, one library, no side rail#149
SunkenInTime wants to merge 8 commits into
icarus-cloudfrom
t3code/library-title-strip

Conversation

@SunkenInTime

Copy link
Copy Markdown
Owner

What changed

The library screen's only chrome is now a 40px strip drawn in place of the native title bar: My Library / Shared / Community tabs on the left; search, sort, New, and the account on the right. The hover rail, the 70px app bar, and the never-mounted FolderNavigatorSidebar are gone.

"This Computer" is no longer a place. My Library shows the local and cloud stores together at the root (deduplicated by id, cloud wins). Local strategies carry an On this device badge while the cloud is reachable. Opening a folder makes its store the active one, so every existing per-store path (create, move, edit, delete, share) keeps working unchanged. The breadcrumb moved into the content area and only shows inside a folder.

Window chrome. window_manager hides the native title bar on desktop. macOS keeps its traffic lights, re-centered on the strip by MainFlutterWindow.swift (Electron's approach: grow the title bar container, center the buttons in it). Windows and Linux get app-drawn caption buttons on the right (WindowCaptionButton from window_manager). The strip and the editor's top row are drag handles; double-click zooms. Web renders the same strip without inset or buttons.

Design exploration that led here is checked in at docs/mockups/library-nav-alternatives.html (open it, press 1–5; variant 2 is what shipped).

Behaviour changes worth knowing

  • Signed in, New › Strategy and New › Folder create in the cloud at the root. Signed out, or inside a local folder, they create locally.
  • Import .ica / Import Backup / Export Library live under New (desktop only).
  • Local folders render as pills (same as cloud) instead of the big folder cards. FolderCard stays for the folder edit dialog preview.
  • Sort is one icon menu (field + direction). Search is the existing expanding field, in the strip.
  • Drops across stores are refused (a local strategy cannot be dropped on a cloud folder).

Bug fixed along the way

cloudFoldersProvider was an async* stream that early-returned while the folder tree was loading. With no other listener holding the auto-disposed tree, every emission tore the tree down and re-subscribed it, so My Library sat on the skeleton forever. The old app-bar breadcrumb happened to keep the tree alive and hid this. It is now a plain derivation from the tree.

Not in this PR (deliberately)

  • Merging the two stores into one synced library (post-beta data work).
  • A per-strategy "Sync to cloud" action; the migration provider only does whole-library and is unused.
  • Deleted-state handling for local-only strategies inside a folder deleted elsewhere.
  • Community content; the placeholder is unchanged.

Testing

  • flutter test: 614 passing. New: library_navigation_provider_test, library_entries_test; strip tests replace the rail tests in cloud_beta_automation_semantics_test.
  • macOS debug build run against a real library: strip, traffic-light alignment, union root, badge, folder pill all verified on screen.
  • Windows and Linux are untested. Dara is taking Windows. Things to look at there: caption buttons render and work, window still resizes from the edges, maximize does not overflow the screen, the editor's top row drags the window.

🤖 Generated with Claude Code

The library screen's only chrome is now a 40px strip drawn in place of the
native title bar: My Library / Shared / Community tabs on the left; search,
sort, New, and the account on the right. The hover rail, the 70px app bar,
and the never-mounted folder sidebar are gone.

"This Computer" is no longer a destination. My Library shows the local and
cloud stores together at the root, deduplicated by id; local strategies
carry an "On this device" badge while the cloud is reachable. Opening a
folder makes its store active, so every existing per-store path (create,
move, edit, delete) keeps working unchanged. The breadcrumb moved into the
content area and only appears inside a folder.

Window chrome: window_manager hides the native title bar on desktop. macOS
keeps its traffic lights, re-centered on the strip by MainFlutterWindow;
Windows and Linux get app-drawn caption buttons. The editor's top row and
skeleton double as the drag handle.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Sep 4, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Team

Run ID: 3a4ecc67-0863-4b74-a9f8-7e5cd81541f7

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@greptile-apps

greptile-apps Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This change combines local and cloud content under My Library, adds compact title-strip navigation, and keeps folder operations associated with their owning store. Focused Flutter checks confirmed that cross-store drops are rejected, duplicate root rows resolve to the cloud copy, failed cloud folder creation does not write a local folder, and stale cloud-folder selections are cleared after deletion or access loss.

Confidence Score: 5/5

The verified mixed-library behaviors are safe to merge.

Focused Flutter tests exercised local strategy and folder drops on cloud destinations, cloud-preferred root merging, rejected cloud folder creation with a temporary Hive store, and clearing stale cloud folder IDs after removal, not-found, and forbidden responses.

Files Needing Attention: No remaining issue requires attention in the validated areas: lib/widgets/library_breadcrumb.dart, lib/widgets/folder_pill.dart, lib/widgets/library_entries.dart, lib/providers/folder_provider.dart, and lib/providers/collab/remote_library_provider.dart.

T-Rex T-Rex Logs

What T-Rex did

  • Local StrategyItem and FolderItem payloads targeting a cloud folder were rejected before any move action could run, and store-equality guards are present on both breadcrumb and folder-pill drop targets.
  • Merge helpers emit cloud rows first and exclude local rows with matching IDs, with existing tests and a same-ID probe retaining exactly one cloud row for each duplicate.
  • A cloud-selected provider was run with a repository that rejects folder creation, resulting in a single cloud request and an empty Hive folder box.
  • A selected cloud folder absent from the remote tree was cleared, and not-found and forbidden strategy-stream responses also cleared selected owned cloud folders; the existing provider regression suite passed.
  • The executed test constructed local StrategyItem and FolderItem payloads and asserted that onWillAcceptWithDetails returns false for each target, which prevents move calls from running due to Flutter's acceptance callback behavior.

View all artifacts

T-Rex Ran code and verified through T-Rex

Reviews (1): Last reviewed commit: "feat: replace the library rail with a ti..." | Re-trigger Greptile

SunkenInTime and others added 7 commits September 3, 2026 22:28
The map card is 65px tall and the row had 15px of top padding, so the
traffic lights (centred on the 40px strip) floated above every control.
Drop the padding and top-align the row: the 40px controls now share the
lights' centre line; only the map card hangs below.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The traffic lights were pinned to the library strip's 40px band, so on
macOS the 65px map card could never share their line. The editor header
now tells the window its band height over a small method channel and
MainFlutterWindow re-centres the lights on it; they move back up when the
editor closes. With that, every platform centres the controls, the map
card, and the window buttons on the same line.

Co-Authored-By: Claude Fable 5.1 <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