From 3112c54698784e4b5b0e9d31e8992a2f40d6d29a Mon Sep 17 00:00:00 2001 From: AlexZ005 Date: Thu, 8 Oct 2026 14:13:33 +0300 Subject: [PATCH 1/3] [fix] 40 F6-F11 dock and window chrome from the 1.31 review - F6 docked tab strip: the bar paints from a non-scrolling wrapper, so every tab (not just the first three) sits on it when scrolled and the edge fade masks only the tabs; one shared scroll position survives a tab pick (each panel mounts its own strip, which used to start at 0) - F7 window header names: one line + ellipsis, full name on hover and touch long-press ($lib/ui/fullName.js, on WindowChrome titles and the docked .tp-dock-sub which had no rule); a phone-narrow Animation moves the name out of the control row - F8 docked windows carry no close or undock button (tabs carry the close, the dock code workspace keeps its unsaved-tabs ask through registerDockCloser); the undock button sits left of "minimize the dock" and undocks the active tab, or every tab as one tabbed group (Settings > Interface > Windows & chrome > Undock button); a floating tab group gets a dock-all button left of "close all tabs" - F9 phone "+" (floating windows off) opens a sheet of every window with show/hide switches; with floating windows on it is the desktop menu - F10 a docked tab dropped onto/into a floating window joins it as a tab (windowTabs.windowAt + queueMerge); dragWindow's size watch and window-resize re-clamp stand down for tab members, which threw a revealed member off its group - F11 the Layouts popover is the kit ModalDialog (it painted with a theme var most themes no longer define); own desktop width because the kit width prop loses to the layered !important frame rule - bottomDock.armDockModes queues several dock-mode arms (the slot is write-once) Co-Authored-By: Claude Opus 5.5 (1M context) --- src/components/DockTabs.svelte | 191 ++++++++++++++---- src/components/DockViewsSheet.svelte | 92 +++++++++ src/components/Flow.svelte | 7 - src/components/editors/AnimationWindow.svelte | 29 ++- src/components/editors/CodeWorkspace.svelte | 8 +- src/components/editors/Explorer.svelte | 7 - src/components/editors/FlowCode.svelte | 2 - src/components/editors/HudEditor.svelte | 2 - src/components/editors/Profiler.svelte | 10 - src/components/editors/ShaderEditor.svelte | 21 +- src/components/editors/UvEditor.svelte | 2 - src/components/menu/LayoutsMenu.svelte | 87 +++----- src/components/menu/TabStrips.svelte | 17 +- .../menu/settings/InterfaceSettings.svelte | 3 + .../menu/settings/UndockButtonSettings.svelte | 24 +++ src/components/ui/WindowChrome.svelte | 3 +- src/lib/bottomDock.js | 41 ++++ src/lib/debugHooks.js | 1 + src/lib/dockMenu.js | 92 ++++++++- src/lib/dragWindow.js | 9 + src/lib/ui/fullName.js | 121 +++++++++++ src/lib/windowTabs.js | 48 +++++ src/styles/windows.css | 42 ++++ 23 files changed, 706 insertions(+), 153 deletions(-) create mode 100644 src/components/DockViewsSheet.svelte create mode 100644 src/components/menu/settings/UndockButtonSettings.svelte create mode 100644 src/lib/ui/fullName.js diff --git a/src/components/DockTabs.svelte b/src/components/DockTabs.svelte index f3ad525c4..89a84e36d 100644 --- a/src/components/DockTabs.svelte +++ b/src/components/DockTabs.svelte @@ -1,3 +1,8 @@ + + + +
+ +
    + {#each rows as row (row.key)} +
  • + + + {row.title} + {row.tooltip} + + setDockViewShown(row.key, on)} + /> +
  • + {/each} +
+
+
+ + diff --git a/src/components/Flow.svelte b/src/components/Flow.svelte index 0d72d5252..dd5dab6b7 100644 --- a/src/components/Flow.svelte +++ b/src/components/Flow.svelte @@ -201,13 +201,6 @@ onpointerup={endResize} > -
diff --git a/src/components/editors/AnimationWindow.svelte b/src/components/editors/AnimationWindow.svelte index 60aa95d86..f6edbccea 100644 --- a/src/components/editors/AnimationWindow.svelte +++ b/src/components/editors/AnimationWindow.svelte @@ -40,6 +40,7 @@ import DockTabs from '../DockTabs.svelte'; import WindowChrome from '../ui/WindowChrome.svelte'; import ScrollStrip from '../ui/ScrollStrip.svelte'; + import { fullName } from '$lib/ui/fullName.js'; import Segmented from '../ui/Segmented.svelte'; import { createGesture } from '$lib/modalGrab'; // W5: the BINDING for this pane's grab key lives in the shortcut registry (an @@ -2669,14 +2670,22 @@ onpointerup={endResize} >
-
- Animation - {target ? target.name || 'object' : 'no selection'} - {#if compact && target}{@render paneSwitch()}{/if} - - - -
+ + {#if compact && target} +
+ Animation + {target.name || 'object'} +
+
{@render paneSwitch()}
+ {:else} +
+ Animation + {target ? target.name || 'object' : 'no selection'} +
+ {/if}
{@render body()}
@@ -2707,14 +2716,14 @@ > {#snippet heading()} Animation - {target ? target.name || 'object' : 'no selection'} - {#if compact && target}{@render paneSwitch()}{/if} + {target ? target.name || 'object' : 'no selection'} {/snippet} {#snippet actions()} {/snippet} + {#if compact && target}
{@render paneSwitch()}
{/if} {@render body()}
registerDockCloser('code', requestCloseWorkspace)); async function closeSavingAll() { const failed = await saveAllCodeTabs(); if (failed.length) { @@ -762,8 +766,6 @@ {@render openGraph()} {@render sideToggle('right')} - -
{@render main()} diff --git a/src/components/editors/Explorer.svelte b/src/components/editors/Explorer.svelte index 27a2467cb..94cc4981f 100644 --- a/src/components/editors/Explorer.svelte +++ b/src/components/editors/Explorer.svelte @@ -8328,13 +8328,6 @@ {@render logChip()} {@render storageChip()} {@render identityChip()} -
{@render content()} diff --git a/src/components/editors/FlowCode.svelte b/src/components/editors/FlowCode.svelte index 1dfcc8bed..696eb9cff 100644 --- a/src/components/editors/FlowCode.svelte +++ b/src/components/editors/FlowCode.svelte @@ -232,8 +232,6 @@ Flow Code {@render editorActions()} - -
{@render body()} diff --git a/src/components/editors/HudEditor.svelte b/src/components/editors/HudEditor.svelte index 106374edc..58778f22f 100644 --- a/src/components/editors/HudEditor.svelte +++ b/src/components/editors/HudEditor.svelte @@ -1454,8 +1454,6 @@
HUD editor - -
{@render body()} diff --git a/src/components/editors/Profiler.svelte b/src/components/editors/Profiler.svelte index 4eaf64578..2cf74dd49 100644 --- a/src/components/editors/Profiler.svelte +++ b/src/components/editors/Profiler.svelte @@ -827,16 +827,6 @@ {@render controls()} - -
{@render body()} diff --git a/src/components/editors/ShaderEditor.svelte b/src/components/editors/ShaderEditor.svelte index bec319577..0d7f7ebf7 100644 --- a/src/components/editors/ShaderEditor.svelte +++ b/src/components/editors/ShaderEditor.svelte @@ -693,12 +693,15 @@
diff --git a/src/components/editors/UvEditor.svelte b/src/components/editors/UvEditor.svelte index 1d14245c6..41a5b2c18 100644 --- a/src/components/editors/UvEditor.svelte +++ b/src/components/editors/UvEditor.svelte @@ -2021,8 +2021,6 @@
UV editor - -
{@render body()} diff --git a/src/components/menu/LayoutsMenu.svelte b/src/components/menu/LayoutsMenu.svelte index e6613052d..06089eb32 100644 --- a/src/components/menu/LayoutsMenu.svelte +++ b/src/components/menu/LayoutsMenu.svelte @@ -1,71 +1,46 @@ + { - if ($layoutsMenuOpen && e.key === 'Escape') layoutsMenuOpen.set(false); + if ($layoutsMenuOpen && e.key === 'Escape') close(); }} /> -{#if $layoutsMenuOpen} -
-
- Workspace layouts - -
- -
-{/if} + $layoutsMenuOpen, (v) => layoutsMenuOpen.set(v)} + aria-label="Workspace layouts" +> + + diff --git a/src/components/menu/TabStrips.svelte b/src/components/menu/TabStrips.svelte index 8ca4c2e41..9cf5d3ab9 100644 --- a/src/components/menu/TabStrips.svelte +++ b/src/components/menu/TabStrips.svelte @@ -8,7 +8,8 @@ import { focusTick, raiseWindowNode } from '$lib/windowFocus'; import ContextMenu from '../ContextMenu.svelte'; import Icon from '../ui/Icon.svelte'; - import { DOCK_ICONS } from '$lib/bottomDock'; + import { DOCK_ICONS, DOCK_FAMILY } from '$lib/bottomDock'; + import { dockAllOf } from '$lib/dockMenu'; // 38 NOTES-38 #23: the view icon before each tab's name — the dock's icons plus the // windows that only ever float @@ -122,6 +123,20 @@ {/each}
+ + {#if group.members.some((/** @type {string} */ k) => DOCK_FAMILY.includes(k))} + + {/if}