Skip to content

45-docks: N5 dock tab flash, N7 hold Ctrl to place without docking, N8 empty strip remnant - #389

Merged
AlexZ005 merged 3 commits into
feat/45from
feat/45-docks
Oct 16, 2026
Merged

AlexZ005 merged 3 commits into
feat/45from
feat/45-docks

Conversation

@AlexZ005

Copy link
Copy Markdown
Collaborator

Lane 45-docks, roadmap 45 (the user's preview-1-35 review, toward 1.36.0): N5, N7, N8. N6 was deferred by the user, so no N6 code changes.

N5: no full-screen flash when switching dock tabs (951df1e)

  • Cause: PhoneDockHost (the dock frame that holds docked Statistics, Objects, Chat, AI assistant and Live profiler) measured its body's top (--pd-top) while the frame was hidden. That happens whenever an editor with its own frame is in front, such as the docked Image editor or Node editor. The hidden frame measured 0, so the next hosted window shown was placed from top 0 to bottom 0 (the whole browser window) for a frame.
  • Fix: skip the measurement while the frame has no box, and re-measure just before a window is shown in it.
  • Test: dock-switch-flash logs the window's position on every DOM change and every frame. On feat/44-int it fails 4 of 5 switches (top 0, height 900). After the fix all pass. The hosted → hosted control passes on both.

N7: hold Ctrl (Cmd) while dragging to place a window without docking (c57d3cd)

  • Default unchanged: a floating window dragged over a sidebar column, the dock's tab strip, the bottom band or another window's header still docks or merges.
  • Ctrl (Cmd on a Mac): while held, every one of those targets switches off and the window lands floating where it is dropped. Pressing or releasing the key mid-drag switches the target at once, even with the pointer still. This uses one small shared module, $lib/placeFree.js.
  • Where it applies: a single window (bottomDockDrop), a group dragged by its strip and a tab torn out of a group (TabStrips), and the header merge (windowTabs).
  • Hint text: the target has a second line, "Hold Ctrl to place without docking", on a surface pill. While Ctrl suppresses a target, a label beside the pointer reads "Placing without docking — release Ctrl to dock".
  • Touch: no modifier key. The window menu's Float stays the way to do it (docs fragment).
  • Test: window-place-free covers the column, the dock strip, the bottom band (with Cmd), the header merge and the group strip, each with a no-key control. It fails on feat/44-int (Ctrl still docked and merged) and passes after.
  • Existing test touched: sidebar-plus-empty 5.1 now reads only the label line, because window targets carry the hint.

N8: no tab remnant left of "+" on the empty dock (ab88a17)

  • Fix: the empty tab bar (a 4×24 px box with border, padding and inset surface) is hidden while the strip has no tab.
  • Test: dock-strip-empty covers all five built-in themes on desktop and the unfolded phone in dark and light. It fails 7 of 7 on base and passes after.

Gates

  • svelte-check 299 errors / 39 warnings, the same as the 1.35 baseline. Tokens, z-index and storage checks clean. vitest: 180 files, 2127 tests.
  • Neighbouring suites, all green (371 checks): dock-hosted-windows, sidebar-drop-targets, sidebar-plus-empty, dock-strip-drop, window-dock-menu, dock-split, phone-dock-tabs, dock-empty-focus, dock-tab-drag, sidebar-any-window.

Evidence

~/.code/lanes-30/after-45/45-docks/ holds before/after shots (n8-*, n7-*), docs-fragment.md and summary.md.

Still to check on a device

  • Cmd on a Mac.
  • The N5 flash on real hardware: the headless frame log reproduced it and shows it gone.

🤖 Generated with Claude Code

AlexZ005 and others added 3 commits October 15, 2026 23:41
… switch

- PhoneDockHost published --pd-top by measuring its body even while the frame was hidden (an editor
  with its own frame, e.g. the docked Image editor or Node editor, in front): 0px. A hosted window
  (Statistics, Objects, Chat, ...) shown next was placed top 0 -> bottom 0, the whole browser window,
  until the next measurement a frame later.
- publishTop() skips a frame with no box (keeps the last real edge) and markHosts() measures before
  it marks a window shown.
- Suite dock-switch-flash (mutation + frame log): red on feat/44-int in 4 of 5 switches (top 0,
  height 900), green after; the hosted -> hosted control green on both.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- DockTabs painted its tab bar (.dt-bar: inset surface, 1px border, 1px padding) with no tab in it,
  a 4x24 px sliver of "tabs" left of the "+" on the empty dock (44 M5). The bar is hidden (not
  unmounted - the W7 drag measures it) while the strip has no tab.
- Suite dock-strip-empty: desktop in all five built-in themes + unfolded dark/light, with the
  docked-tab control; red on feat/44-int in all 7 empty-strip checks, green after.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ce it without docking

- Decision (Visual Studio / JetBrains): a floating window dragged over a sidebar column, the dock's
  tab strip, the bottom band or another window's header still docks / merges by default; holding
  Ctrl (Cmd on a Mac) stands every one of those targets down, so the window is placed floating
  where it is dropped, over a sidebar or the dock too.
- $lib/placeFree.js (a leaf): the one switch, read from each pointer event and live from
  keydown/keyup while a drag watches it - pressing or releasing the key with the pointer still
  flips the target at once.
- Wired into bottomDockDrop (an ungrouped window), TabStrips (a dragged group and a torn-out tab)
  and windowTabs (the header merge).
- The target carries a second line, "Hold Ctrl to place without docking", on a surface pill so it
  reads over a busy column; while the key suppresses a target a chip beside the pointer says
  "Placing without docking - release Ctrl to dock" (kept inside the window).
- Touch has no modifier: the window menu's Float stays the path (docs fragment).
- Suite window-place-free: column / dock strip / bottom band (Cmd) / header merge / group strip,
  each with the no-key control; red on feat/44-int (Ctrl docked and merged), green after.
  sidebar-plus-empty 5.1 reads the zone's label line now (the window target carries the hint).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@AlexZ005
AlexZ005 merged commit 716392f into feat/45 Oct 16, 2026
7 checks passed
@AlexZ005
AlexZ005 deleted the feat/45-docks branch October 16, 2026 08:19
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