From 734d16432a5ebc23be197580a5c97a99cf580f6d Mon Sep 17 00:00:00 2001 From: Satya Patel Date: Wed, 28 Jan 2026 10:48:20 -0800 Subject: [PATCH 1/3] feat(desktop): move sidebar toggle to topbar with hotkey tooltip Move the sidebar toggle button from WorkspaceSidebarHeader to the TopBar, positioning it after the traffic lights on Mac. The tooltip now displays the user's configured hotkey using HotkeyTooltipContent. --- .../screens/main/components/TopBar/index.tsx | 44 +++++++++++- .../WorkspaceSidebarHeader.tsx | 69 +------------------ 2 files changed, 45 insertions(+), 68 deletions(-) diff --git a/apps/desktop/src/renderer/screens/main/components/TopBar/index.tsx b/apps/desktop/src/renderer/screens/main/components/TopBar/index.tsx index 9e36080cd8c..7c44a4a8f59 100644 --- a/apps/desktop/src/renderer/screens/main/components/TopBar/index.tsx +++ b/apps/desktop/src/renderer/screens/main/components/TopBar/index.tsx @@ -1,5 +1,9 @@ +import { Tooltip, TooltipContent, TooltipTrigger } from "@superset/ui/tooltip"; import { useParams } from "@tanstack/react-router"; +import { LuPanelLeft, LuPanelLeftClose, LuPanelLeftOpen } from "react-icons/lu"; +import { HotkeyTooltipContent } from "renderer/components/HotkeyTooltipContent"; import { electronTrpc } from "renderer/lib/electron-trpc"; +import { useWorkspaceSidebarStore } from "renderer/stores"; import { OpenInMenuButton } from "./OpenInMenuButton"; import { OrganizationDropdown } from "./OrganizationDropdown"; import { WindowControls } from "./WindowControls"; @@ -11,9 +15,26 @@ export function TopBar() { { id: workspaceId ?? "" }, { enabled: !!workspaceId }, ); + const { isCollapsed, toggleCollapsed } = useWorkspaceSidebarStore(); + const collapsed = isCollapsed(); // Default to Mac layout while loading to avoid overlap with traffic lights const isMac = platform === undefined || platform === "darwin"; + const getToggleIcon = (isHovering: boolean) => { + if (collapsed) { + return isHovering ? ( + + ) : ( + + ); + } + return isHovering ? ( + + ) : ( + + ); + }; + return (
+ > + + + + + + + + +
diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceSidebarHeader/WorkspaceSidebarHeader.tsx b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceSidebarHeader/WorkspaceSidebarHeader.tsx index d9acbddb7c6..10ffe4fdc02 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceSidebarHeader/WorkspaceSidebarHeader.tsx +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceSidebarHeader/WorkspaceSidebarHeader.tsx @@ -3,16 +3,9 @@ import { Tooltip, TooltipContent, TooltipTrigger } from "@superset/ui/tooltip"; import { cn } from "@superset/ui/utils"; import { useMatchRoute, useNavigate } from "@tanstack/react-router"; import { useFeatureFlagEnabled } from "posthog-js/react"; -import { useState } from "react"; import { HiOutlineClipboardDocumentList } from "react-icons/hi2"; -import { - LuLayers, - LuPanelLeft, - LuPanelLeftClose, - LuPanelLeftOpen, -} from "react-icons/lu"; -import { useWorkspaceSidebarStore } from "renderer/stores"; -import { STROKE_WIDTH, STROKE_WIDTH_THIN } from "../constants"; +import { LuLayers } from "react-icons/lu"; +import { STROKE_WIDTH } from "../constants"; import { NewWorkspaceButton } from "./NewWorkspaceButton"; interface WorkspaceSidebarHeaderProps { @@ -24,8 +17,6 @@ export function WorkspaceSidebarHeader({ }: WorkspaceSidebarHeaderProps) { const navigate = useNavigate(); const matchRoute = useMatchRoute(); - const { toggleCollapsed } = useWorkspaceSidebarStore(); - const [isHovering, setIsHovering] = useState(false); const hasTasksAccess = useFeatureFlagEnabled( FEATURE_FLAGS.ELECTRIC_TASKS_ACCESS, ); @@ -47,43 +38,9 @@ export function WorkspaceSidebarHeader({ navigate({ to: "/tasks" }); }; - const handleToggleSidebar = () => { - toggleCollapsed(); - }; - - const getToggleIcon = () => { - if (isCollapsed) { - return isHovering ? ( - - ) : ( - - ); - } - return isHovering ? ( - - ) : ( - - ); - }; - if (isCollapsed) { return (
- - - - - Toggle sidebar - - - - Toggle sidebar - - + + + + + + ); +} diff --git a/apps/desktop/src/renderer/screens/main/components/TopBar/SidebarToggle/index.ts b/apps/desktop/src/renderer/screens/main/components/TopBar/SidebarToggle/index.ts new file mode 100644 index 00000000000..6ed6715b715 --- /dev/null +++ b/apps/desktop/src/renderer/screens/main/components/TopBar/SidebarToggle/index.ts @@ -0,0 +1 @@ +export { SidebarToggle } from "./SidebarToggle"; diff --git a/apps/desktop/src/renderer/screens/main/components/TopBar/TopBar.tsx b/apps/desktop/src/renderer/screens/main/components/TopBar/TopBar.tsx new file mode 100644 index 00000000000..957918344bb --- /dev/null +++ b/apps/desktop/src/renderer/screens/main/components/TopBar/TopBar.tsx @@ -0,0 +1,43 @@ +import { useParams } from "@tanstack/react-router"; +import { electronTrpc } from "renderer/lib/electron-trpc"; +import { OpenInMenuButton } from "./OpenInMenuButton"; +import { OrganizationDropdown } from "./OrganizationDropdown"; +import { SidebarToggle } from "./SidebarToggle"; +import { WindowControls } from "./WindowControls"; + +export function TopBar() { + const { data: platform } = electronTrpc.window.getPlatform.useQuery(); + const { workspaceId } = useParams({ strict: false }); + const { data: workspace } = electronTrpc.workspaces.get.useQuery( + { id: workspaceId ?? "" }, + { enabled: !!workspaceId }, + ); + // Default to Mac layout while loading to avoid overlap with traffic lights + const isMac = platform === undefined || platform === "darwin"; + + return ( +
+
+ +
+ +
+ +
+ {workspace?.worktreePath && ( + + )} + + {!isMac && } +
+
+ ); +} diff --git a/apps/desktop/src/renderer/screens/main/components/TopBar/WindowControls.tsx b/apps/desktop/src/renderer/screens/main/components/TopBar/WindowControls/WindowControls.tsx similarity index 100% rename from apps/desktop/src/renderer/screens/main/components/TopBar/WindowControls.tsx rename to apps/desktop/src/renderer/screens/main/components/TopBar/WindowControls/WindowControls.tsx diff --git a/apps/desktop/src/renderer/screens/main/components/TopBar/WindowControls/index.ts b/apps/desktop/src/renderer/screens/main/components/TopBar/WindowControls/index.ts new file mode 100644 index 00000000000..87f577b6f5d --- /dev/null +++ b/apps/desktop/src/renderer/screens/main/components/TopBar/WindowControls/index.ts @@ -0,0 +1 @@ +export { WindowControls } from "./WindowControls"; diff --git a/apps/desktop/src/renderer/screens/main/components/TopBar/index.ts b/apps/desktop/src/renderer/screens/main/components/TopBar/index.ts new file mode 100644 index 00000000000..7cc3ff0450b --- /dev/null +++ b/apps/desktop/src/renderer/screens/main/components/TopBar/index.ts @@ -0,0 +1 @@ +export { TopBar } from "./TopBar"; diff --git a/apps/desktop/src/renderer/screens/main/components/TopBar/index.tsx b/apps/desktop/src/renderer/screens/main/components/TopBar/index.tsx deleted file mode 100644 index 7c44a4a8f59..00000000000 --- a/apps/desktop/src/renderer/screens/main/components/TopBar/index.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import { Tooltip, TooltipContent, TooltipTrigger } from "@superset/ui/tooltip"; -import { useParams } from "@tanstack/react-router"; -import { LuPanelLeft, LuPanelLeftClose, LuPanelLeftOpen } from "react-icons/lu"; -import { HotkeyTooltipContent } from "renderer/components/HotkeyTooltipContent"; -import { electronTrpc } from "renderer/lib/electron-trpc"; -import { useWorkspaceSidebarStore } from "renderer/stores"; -import { OpenInMenuButton } from "./OpenInMenuButton"; -import { OrganizationDropdown } from "./OrganizationDropdown"; -import { WindowControls } from "./WindowControls"; - -export function TopBar() { - const { data: platform } = electronTrpc.window.getPlatform.useQuery(); - const { workspaceId } = useParams({ strict: false }); - const { data: workspace } = electronTrpc.workspaces.get.useQuery( - { id: workspaceId ?? "" }, - { enabled: !!workspaceId }, - ); - const { isCollapsed, toggleCollapsed } = useWorkspaceSidebarStore(); - const collapsed = isCollapsed(); - // Default to Mac layout while loading to avoid overlap with traffic lights - const isMac = platform === undefined || platform === "darwin"; - - const getToggleIcon = (isHovering: boolean) => { - if (collapsed) { - return isHovering ? ( - - ) : ( - - ); - } - return isHovering ? ( - - ) : ( - - ); - }; - - return ( -
-
- - - - - - - - -
- -
- -
- {workspace?.worktreePath && ( - - )} - - {!isMac && } -
-
- ); -} From 24c3afdd8c8f0b2ef50da5a6b7c89a822c05f765 Mon Sep 17 00:00:00 2001 From: Satya Patel Date: Wed, 28 Jan 2026 10:59:51 -0800 Subject: [PATCH 3/3] refactor(desktop): co-locate TopBar with dashboard layout Move TopBar from screens/main/components to routes/_authenticated/_dashboard/components to properly co-locate it next to the layout that uses it. Update import paths accordingly. --- .../_dashboard}/components/TopBar/TopBar.tsx | 8 ++++---- .../components}/OpenInMenuButton/OpenInMenuButton.tsx | 0 .../TopBar/components}/OpenInMenuButton/index.ts | 0 .../OrganizationDropdown/OrganizationDropdown.tsx | 0 .../TopBar/components}/OrganizationDropdown/index.ts | 0 .../TopBar/components}/SidebarToggle/SidebarToggle.tsx | 0 .../components/TopBar/components}/SidebarToggle/index.ts | 0 .../TopBar/components}/WindowControls/WindowControls.tsx | 0 .../components/TopBar/components}/WindowControls/index.ts | 0 .../_authenticated/_dashboard}/components/TopBar/index.ts | 0 .../renderer/routes/_authenticated/_dashboard/layout.tsx | 2 +- .../screens/main/components/StartView/StartTopBar.tsx | 2 +- 12 files changed, 6 insertions(+), 6 deletions(-) rename apps/desktop/src/renderer/{screens/main => routes/_authenticated/_dashboard}/components/TopBar/TopBar.tsx (81%) rename apps/desktop/src/renderer/{screens/main/components/TopBar => routes/_authenticated/_dashboard/components/TopBar/components}/OpenInMenuButton/OpenInMenuButton.tsx (100%) rename apps/desktop/src/renderer/{screens/main/components/TopBar => routes/_authenticated/_dashboard/components/TopBar/components}/OpenInMenuButton/index.ts (100%) rename apps/desktop/src/renderer/{screens/main/components/TopBar => routes/_authenticated/_dashboard/components/TopBar/components}/OrganizationDropdown/OrganizationDropdown.tsx (100%) rename apps/desktop/src/renderer/{screens/main/components/TopBar => routes/_authenticated/_dashboard/components/TopBar/components}/OrganizationDropdown/index.ts (100%) rename apps/desktop/src/renderer/{screens/main/components/TopBar => routes/_authenticated/_dashboard/components/TopBar/components}/SidebarToggle/SidebarToggle.tsx (100%) rename apps/desktop/src/renderer/{screens/main/components/TopBar => routes/_authenticated/_dashboard/components/TopBar/components}/SidebarToggle/index.ts (100%) rename apps/desktop/src/renderer/{screens/main/components/TopBar => routes/_authenticated/_dashboard/components/TopBar/components}/WindowControls/WindowControls.tsx (100%) rename apps/desktop/src/renderer/{screens/main/components/TopBar => routes/_authenticated/_dashboard/components/TopBar/components}/WindowControls/index.ts (100%) rename apps/desktop/src/renderer/{screens/main => routes/_authenticated/_dashboard}/components/TopBar/index.ts (100%) diff --git a/apps/desktop/src/renderer/screens/main/components/TopBar/TopBar.tsx b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/TopBar/TopBar.tsx similarity index 81% rename from apps/desktop/src/renderer/screens/main/components/TopBar/TopBar.tsx rename to apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/TopBar/TopBar.tsx index 957918344bb..4bbaaca5074 100644 --- a/apps/desktop/src/renderer/screens/main/components/TopBar/TopBar.tsx +++ b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/TopBar/TopBar.tsx @@ -1,9 +1,9 @@ import { useParams } from "@tanstack/react-router"; import { electronTrpc } from "renderer/lib/electron-trpc"; -import { OpenInMenuButton } from "./OpenInMenuButton"; -import { OrganizationDropdown } from "./OrganizationDropdown"; -import { SidebarToggle } from "./SidebarToggle"; -import { WindowControls } from "./WindowControls"; +import { OpenInMenuButton } from "./components/OpenInMenuButton"; +import { OrganizationDropdown } from "./components/OrganizationDropdown"; +import { SidebarToggle } from "./components/SidebarToggle"; +import { WindowControls } from "./components/WindowControls"; export function TopBar() { const { data: platform } = electronTrpc.window.getPlatform.useQuery(); diff --git a/apps/desktop/src/renderer/screens/main/components/TopBar/OpenInMenuButton/OpenInMenuButton.tsx b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/TopBar/components/OpenInMenuButton/OpenInMenuButton.tsx similarity index 100% rename from apps/desktop/src/renderer/screens/main/components/TopBar/OpenInMenuButton/OpenInMenuButton.tsx rename to apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/TopBar/components/OpenInMenuButton/OpenInMenuButton.tsx diff --git a/apps/desktop/src/renderer/screens/main/components/TopBar/OpenInMenuButton/index.ts b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/TopBar/components/OpenInMenuButton/index.ts similarity index 100% rename from apps/desktop/src/renderer/screens/main/components/TopBar/OpenInMenuButton/index.ts rename to apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/TopBar/components/OpenInMenuButton/index.ts diff --git a/apps/desktop/src/renderer/screens/main/components/TopBar/OrganizationDropdown/OrganizationDropdown.tsx b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/TopBar/components/OrganizationDropdown/OrganizationDropdown.tsx similarity index 100% rename from apps/desktop/src/renderer/screens/main/components/TopBar/OrganizationDropdown/OrganizationDropdown.tsx rename to apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/TopBar/components/OrganizationDropdown/OrganizationDropdown.tsx diff --git a/apps/desktop/src/renderer/screens/main/components/TopBar/OrganizationDropdown/index.ts b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/TopBar/components/OrganizationDropdown/index.ts similarity index 100% rename from apps/desktop/src/renderer/screens/main/components/TopBar/OrganizationDropdown/index.ts rename to apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/TopBar/components/OrganizationDropdown/index.ts diff --git a/apps/desktop/src/renderer/screens/main/components/TopBar/SidebarToggle/SidebarToggle.tsx b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/TopBar/components/SidebarToggle/SidebarToggle.tsx similarity index 100% rename from apps/desktop/src/renderer/screens/main/components/TopBar/SidebarToggle/SidebarToggle.tsx rename to apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/TopBar/components/SidebarToggle/SidebarToggle.tsx diff --git a/apps/desktop/src/renderer/screens/main/components/TopBar/SidebarToggle/index.ts b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/TopBar/components/SidebarToggle/index.ts similarity index 100% rename from apps/desktop/src/renderer/screens/main/components/TopBar/SidebarToggle/index.ts rename to apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/TopBar/components/SidebarToggle/index.ts diff --git a/apps/desktop/src/renderer/screens/main/components/TopBar/WindowControls/WindowControls.tsx b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/TopBar/components/WindowControls/WindowControls.tsx similarity index 100% rename from apps/desktop/src/renderer/screens/main/components/TopBar/WindowControls/WindowControls.tsx rename to apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/TopBar/components/WindowControls/WindowControls.tsx diff --git a/apps/desktop/src/renderer/screens/main/components/TopBar/WindowControls/index.ts b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/TopBar/components/WindowControls/index.ts similarity index 100% rename from apps/desktop/src/renderer/screens/main/components/TopBar/WindowControls/index.ts rename to apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/TopBar/components/WindowControls/index.ts diff --git a/apps/desktop/src/renderer/screens/main/components/TopBar/index.ts b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/TopBar/index.ts similarity index 100% rename from apps/desktop/src/renderer/screens/main/components/TopBar/index.ts rename to apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/TopBar/index.ts diff --git a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/layout.tsx b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/layout.tsx index ca434cc58ee..36e0f50e705 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/layout.tsx +++ b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/layout.tsx @@ -6,7 +6,6 @@ import { } from "@tanstack/react-router"; import { electronTrpc } from "renderer/lib/electron-trpc"; import { ResizablePanel } from "renderer/screens/main/components/ResizablePanel"; -import { TopBar } from "renderer/screens/main/components/TopBar"; import { WorkspaceSidebar } from "renderer/screens/main/components/WorkspaceSidebar"; import { useAppHotkey } from "renderer/stores/hotkeys"; import { useOpenNewWorkspaceModal } from "renderer/stores/new-workspace-modal"; @@ -15,6 +14,7 @@ import { MAX_WORKSPACE_SIDEBAR_WIDTH, useWorkspaceSidebarStore, } from "renderer/stores/workspace-sidebar-state"; +import { TopBar } from "./components/TopBar"; export const Route = createFileRoute("/_authenticated/_dashboard")({ component: DashboardLayout, diff --git a/apps/desktop/src/renderer/screens/main/components/StartView/StartTopBar.tsx b/apps/desktop/src/renderer/screens/main/components/StartView/StartTopBar.tsx index 02e53f550fc..2474e8c7c26 100644 --- a/apps/desktop/src/renderer/screens/main/components/StartView/StartTopBar.tsx +++ b/apps/desktop/src/renderer/screens/main/components/StartView/StartTopBar.tsx @@ -1,5 +1,5 @@ import { electronTrpc } from "renderer/lib/electron-trpc"; -import { WindowControls } from "../TopBar/WindowControls"; +import { WindowControls } from "renderer/routes/_authenticated/_dashboard/components/TopBar/components/WindowControls"; export function StartTopBar() { const { data: platform, isLoading } =