Skip to content

Folder navigation polish: spring-loaded tunneling, whole-card rows, native-feel fixes#155

Merged
HamptonMakes merged 4 commits into
mainfrom
folder-navigation-polish
Jul 22, 2026
Merged

Folder navigation polish: spring-loaded tunneling, whole-card rows, native-feel fixes#155
HamptonMakes merged 4 commits into
mainfrom
folder-navigation-polish

Conversation

@HamptonMakes

Copy link
Copy Markdown
Collaborator

Follow-up to #153, from staging review feedback.

Drag & drop grows Finder semantics

  • Spring-loaded folders: hover a folder mid-drag → two pulses → it opens. In the sidebar, branches expand multi-level and snap shut when the cursor leaves.
  • Tunneling in the main pane: springing on a folder row or breadcrumb navigates the pane into that folder mid-drag (prefetched during the hover dwell). Abandon the drag and the pane snaps back home; drop and it commits with a Turbo visit.
  • The whole pane is a drop target ("file right here"); folder rows and crumbs inside win via stopPropagation.
  • Loud drop-target highlight, busy pulse + ghosted source while a move is in flight, user-select: none on draggables (selectable text was hijacking press-and-drag into a navigation).

Rows and navigation

  • Whole plan-row card is clickable (stretched title link) and prefetches on hover for instant navigation.
  • Backspace on a plan page returns to the folder you came from. Turbo Drive never updates document.referrer, so the same-origin check always failed and Backspace dumped you at the workspace root; the controller now tracks in-app visits itself. Cold opens (direct link/new tab) fall back to the plan's folder in your library.
  • Folder.paths_by_id's walk guard is now a real cycle guard (visited set) instead of a depth clamp, so deeper-than-cap hierarchies render full paths.

Native feel, secretly HTML (now a hard requirement in AGENTS.md)

  • scrollbar-gutter: stable kills the page-width jiggle between workspace and plan pages.
  • Attachments upload in place: XHR progress bar, Turbo Stream section update, self-dismissing toasts — no more scroll-to-top reload.
  • Save bookmark sits beside the plan title (stamped from outside the broadcast-rendered header, which can't know the viewer).
  • Presence avatars link to profiles; plan tag chips link to search (not your workspace); sidebar hidden filters read as opt-in reveals ("Show my private plans").

Testing

  • Full suite: 1313 examples, 0 failures.
  • New system specs: spring/tunnel flows via synthetic DragEvents, bookmark-beside-title, Backspace-back-to-folder (both warm and cold open); request specs for the Turbo Stream attachment flow; model specs for deep/cyclic folder paths.

🤖 Generated with Claude Code

…ative-feel fixes

Drag and drop grows Finder semantics: hovering a folder (row, crumb, or
sidebar node) mid-drag pulses twice and then tunnels the pane into that
folder — prefetched during the dwell, restored if the drag is abandoned,
committed with a Turbo visit on drop. The whole pane accepts drops for
"file right here"; inner targets win via stopPropagation. Sidebar
branches spring open multi-level and snap shut when the cursor leaves.

Rows are now fully clickable (stretched title link) and prefetch on
hover. Backspace on a plan page goes back to the folder you came from:
Turbo never updates document.referrer, so the controller tracks in-app
visits itself, and cold opens fall back to the plan's folder in your
library instead of the workspace root. Folder.paths_by_id's walk guard
is now a real cycle guard, so deeper-than-cap data renders full paths.

Native-feel fixes, now a hard requirement in AGENTS.md: stable
scrollbar gutter kills the workspace/plan width jiggle; attachments
upload in place with an XHR progress bar + Turbo Stream update and
toasts instead of a scroll-to-top reload. The save bookmark moves next
to the plan title (stamped from outside the broadcast-rendered header),
presence avatars link to profiles, tag chips link to search, and the
sidebar's hidden filters read as "Show my private plans" / "Show
archived".

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

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 85a4624363

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread engine/app/javascript/controllers/coplan/dropzone_controller.js
Comment thread engine/app/controllers/coplan/attachments_controller.rb
HamptonMakes and others added 3 commits July 21, 2026 16:11
…, inline back matter (#156)

Light mode gets real definition: a faintly dark --card-edge outline plus
a soft shadow on rows and cards, over a slightly darker page background —
the old white-on-white glass edges disappeared entirely. Rows lose their
tag chips (the sidebar already filters by tag) and their hover bookmark
(drag & drop files rows; the plan page's title bookmark is the click
path), and the byline pins to the card's top-right corner instead of
drifting wherever the title wrap left it. "Since you last looked" gets
room to breathe.

Sticky sidebars taller than the viewport used to pin their overflow
below the fold where no amount of scrolling could reach it — the
workspace sidebar and the document outline are now their own scroll
containers.

References and attachments move inside the content column, closing out
the document after a rule instead of sitting below both columns (where
long outlines collided with them). Empty sections are one quiet line,
not a padded card. The text-selection target is scoped to an inner
wrapper so back matter can't take comment anchors that would never
resolve.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Abort in-flight uploads when the dropzone controller disconnects: every
plan page has the same #plan-attachments target, so a Turbo navigation
mid-upload would let plan A's late response replace plan B's section.

Stream the attachment and reference counters (footnote header AND the
document outline) alongside the section replacement — they were rendered
by the redirect these stream responses replaced, and went stale.

While a drag is live the workspace pane grows bottom padding and a
minimum height: an empty folder — especially one just tunneled into —
offered almost nothing to drop on. Padding, not margin, so the runway
is inside the pane's drop target.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… land

Toggling a checkbox bumps the revision, and Broadcaster.replace_plan_content
answers with a whole-body re-render over the plan's Turbo Stream.
wait_for_version only polls the DB, so the spec could grab the second
checkbox from the old DOM an instant before the swap landed and click a
detached node (StaleElementReferenceError — seen locally once and on CI).

The custom coplan-replace-if-clean action stamps the incoming revision on
#plan-content-body after swapping, so waiting for that stamp is a race-free
signal that the re-render has already happened.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@HamptonMakes
HamptonMakes merged commit 1c35965 into main Jul 22, 2026
4 checks passed
@HamptonMakes
HamptonMakes deleted the folder-navigation-polish branch July 22, 2026 14:58
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