From 79a75a4ace3a6b36960d7835f5a81516d10a97c0 Mon Sep 17 00:00:00 2001 From: Trevor Smith Date: Wed, 8 Apr 2026 12:17:11 -0500 Subject: [PATCH 01/17] feat(desktop): add modifier key state store for workspace number badges --- .../stores/modifier-key-state.test.ts | 56 +++++++++++++++++++ .../src/renderer/stores/modifier-key-state.ts | 29 ++++++++++ 2 files changed, 85 insertions(+) create mode 100644 apps/desktop/src/renderer/stores/modifier-key-state.test.ts create mode 100644 apps/desktop/src/renderer/stores/modifier-key-state.ts diff --git a/apps/desktop/src/renderer/stores/modifier-key-state.test.ts b/apps/desktop/src/renderer/stores/modifier-key-state.test.ts new file mode 100644 index 00000000000..180a43fcbb8 --- /dev/null +++ b/apps/desktop/src/renderer/stores/modifier-key-state.test.ts @@ -0,0 +1,56 @@ +import { beforeEach, describe, expect, test } from "bun:test"; +import { useModifierKeyStateStore } from "./modifier-key-state"; + +describe("useModifierKeyStateStore", () => { + beforeEach(() => { + useModifierKeyStateStore.getState().clearAll(); + }); + + test("initial state has empty heldKeys and isModifierHeld false", () => { + const state = useModifierKeyStateStore.getState(); + expect(state.heldKeys).toEqual(new Set()); + expect(state.isModifierHeld).toBe(false); + }); + + test("pressKey adds a key to heldKeys", () => { + useModifierKeyStateStore.getState().pressKey("Meta"); + expect(useModifierKeyStateStore.getState().heldKeys).toEqual( + new Set(["Meta"]), + ); + }); + + test("pressKey is a no-op if key already held", () => { + useModifierKeyStateStore.getState().pressKey("Meta"); + useModifierKeyStateStore.getState().pressKey("Meta"); + expect(useModifierKeyStateStore.getState().heldKeys).toEqual( + new Set(["Meta"]), + ); + expect(useModifierKeyStateStore.getState().heldKeys.size).toBe(1); + }); + + test("releaseKey removes a key from heldKeys", () => { + useModifierKeyStateStore.getState().pressKey("Meta"); + useModifierKeyStateStore.getState().pressKey("Control"); + useModifierKeyStateStore.getState().releaseKey("Meta"); + expect(useModifierKeyStateStore.getState().heldKeys).toEqual( + new Set(["Control"]), + ); + }); + + test("releaseKey is a no-op if key not held", () => { + useModifierKeyStateStore.getState().pressKey("Meta"); + useModifierKeyStateStore.getState().releaseKey("Control"); + expect(useModifierKeyStateStore.getState().heldKeys).toEqual( + new Set(["Meta"]), + ); + }); + + test("clearAll resets heldKeys to empty and isModifierHeld to false", () => { + useModifierKeyStateStore.getState().pressKey("Meta"); + useModifierKeyStateStore.getState().pressKey("Control"); + useModifierKeyStateStore.setState({ isModifierHeld: true }); + useModifierKeyStateStore.getState().clearAll(); + expect(useModifierKeyStateStore.getState().heldKeys).toEqual(new Set()); + expect(useModifierKeyStateStore.getState().isModifierHeld).toBe(false); + }); +}); diff --git a/apps/desktop/src/renderer/stores/modifier-key-state.ts b/apps/desktop/src/renderer/stores/modifier-key-state.ts new file mode 100644 index 00000000000..6ec1a4f3c9c --- /dev/null +++ b/apps/desktop/src/renderer/stores/modifier-key-state.ts @@ -0,0 +1,29 @@ +import { create } from "zustand"; + +interface ModifierKeyState { + heldKeys: Set; + isModifierHeld: boolean; + pressKey: (key: string) => void; + releaseKey: (key: string) => void; + clearAll: () => void; +} + +export const useModifierKeyStateStore = create((set) => ({ + heldKeys: new Set(), + isModifierHeld: false, + pressKey: (key) => + set((state) => { + if (state.heldKeys.has(key)) return state; + const next = new Set(state.heldKeys); + next.add(key); + return { heldKeys: next }; + }), + releaseKey: (key) => + set((state) => { + if (!state.heldKeys.has(key)) return state; + const next = new Set(state.heldKeys); + next.delete(key); + return { heldKeys: next }; + }), + clearAll: () => set({ heldKeys: new Set(), isModifierHeld: false }), +})); From a73bac62998439603289cb622bad5200b62092db Mon Sep 17 00:00:00 2001 From: Trevor Smith Date: Wed, 8 Apr 2026 12:21:23 -0500 Subject: [PATCH 02/17] feat(desktop): add hooks for modifier key detection from workspace shortcuts --- .../renderer/hooks/useModifierKeyListener.ts | 54 ++++++++++++++++ .../useWorkspaceShortcutModifiers.test.ts | 22 +++++++ .../hooks/useWorkspaceShortcutModifiers.ts | 62 +++++++++++++++++++ 3 files changed, 138 insertions(+) create mode 100644 apps/desktop/src/renderer/hooks/useModifierKeyListener.ts create mode 100644 apps/desktop/src/renderer/hooks/useWorkspaceShortcutModifiers.test.ts create mode 100644 apps/desktop/src/renderer/hooks/useWorkspaceShortcutModifiers.ts diff --git a/apps/desktop/src/renderer/hooks/useModifierKeyListener.ts b/apps/desktop/src/renderer/hooks/useModifierKeyListener.ts new file mode 100644 index 00000000000..5bda1748582 --- /dev/null +++ b/apps/desktop/src/renderer/hooks/useModifierKeyListener.ts @@ -0,0 +1,54 @@ +import { useEffect } from "react"; +import { useModifierKeyStateStore } from "renderer/stores/modifier-key-state"; +import { useWorkspaceShortcutModifiers } from "./useWorkspaceShortcutModifiers"; + +export function useModifierKeyListener(enabled: boolean) { + const { allModifierKeys, comboToIndices } = useWorkspaceShortcutModifiers(); + const { pressKey, releaseKey, clearAll } = useModifierKeyStateStore(); + + useEffect(() => { + if (!enabled) { + clearAll(); + return; + } + + function updateIsModifierHeld() { + const held = useModifierKeyStateStore.getState().heldKeys; + for (const combo of comboToIndices.keys()) { + const comboKeys = combo.split("+"); + if (comboKeys.length > 0 && comboKeys.every((k) => held.has(k))) { + useModifierKeyStateStore.setState({ isModifierHeld: true }); + return; + } + } + useModifierKeyStateStore.setState({ isModifierHeld: false }); + } + + function handleKeyDown(e: KeyboardEvent) { + if (allModifierKeys.has(e.key)) { + pressKey(e.key); + updateIsModifierHeld(); + } + } + function handleKeyUp(e: KeyboardEvent) { + if (allModifierKeys.has(e.key)) { + releaseKey(e.key); + updateIsModifierHeld(); + } + } + function handleBlur() { + clearAll(); + } + + window.addEventListener("keydown", handleKeyDown); + window.addEventListener("keyup", handleKeyUp); + window.addEventListener("blur", handleBlur); + + return () => { + window.removeEventListener("keydown", handleKeyDown); + window.removeEventListener("keyup", handleKeyUp); + window.removeEventListener("blur", handleBlur); + clearAll(); + }; + }, [enabled, allModifierKeys, comboToIndices, pressKey, releaseKey, clearAll]); +} diff --git a/apps/desktop/src/renderer/hooks/useWorkspaceShortcutModifiers.test.ts b/apps/desktop/src/renderer/hooks/useWorkspaceShortcutModifiers.test.ts new file mode 100644 index 00000000000..64cdef6c0de --- /dev/null +++ b/apps/desktop/src/renderer/hooks/useWorkspaceShortcutModifiers.test.ts @@ -0,0 +1,22 @@ +import { describe, expect, test } from "bun:test"; +import { parseBinding } from "./useWorkspaceShortcutModifiers"; + +describe("parseBinding", () => { + test("parses a simple binding like 'meta+1'", () => { + const result = parseBinding("meta+1"); + expect(result.modifierKeys).toEqual(["Meta"]); + expect(result.triggerKey).toBe("1"); + }); + + test("parses a multi-modifier binding like 'ctrl+shift+3'", () => { + const result = parseBinding("ctrl+shift+3"); + expect(result.modifierKeys).toEqual(["Control", "Shift"]); + expect(result.triggerKey).toBe("3"); + }); + + test("handles unknown modifier gracefully (passes through as-is)", () => { + const result = parseBinding("hyper+x"); + expect(result.modifierKeys).toEqual(["hyper"]); + expect(result.triggerKey).toBe("x"); + }); +}); diff --git a/apps/desktop/src/renderer/hooks/useWorkspaceShortcutModifiers.ts b/apps/desktop/src/renderer/hooks/useWorkspaceShortcutModifiers.ts new file mode 100644 index 00000000000..cb3a7050444 --- /dev/null +++ b/apps/desktop/src/renderer/hooks/useWorkspaceShortcutModifiers.ts @@ -0,0 +1,62 @@ +import { useMemo } from "react"; +import { getBinding, type HotkeyId } from "renderer/hotkeys"; +import { useHotkeyOverridesStore } from "renderer/hotkeys"; + +const WORKSPACE_HOTKEY_IDS: HotkeyId[] = [ + "JUMP_TO_WORKSPACE_1", + "JUMP_TO_WORKSPACE_2", + "JUMP_TO_WORKSPACE_3", + "JUMP_TO_WORKSPACE_4", + "JUMP_TO_WORKSPACE_5", + "JUMP_TO_WORKSPACE_6", + "JUMP_TO_WORKSPACE_7", + "JUMP_TO_WORKSPACE_8", + "JUMP_TO_WORKSPACE_9", +]; + +const MODIFIER_KEY_MAP: Record = { + meta: "Meta", + ctrl: "Control", + shift: "Shift", + alt: "Alt", +}; + +export interface WorkspaceShortcutInfo { + index: number; + triggerKey: string; + modifierKeys: string[]; +} + +export function parseBinding(binding: string): { + modifierKeys: string[]; + triggerKey: string; +} { + const parts = binding.split("+"); + const triggerKey = parts[parts.length - 1]; + const modifierKeys = parts.slice(0, -1).map((m) => MODIFIER_KEY_MAP[m] ?? m); + return { modifierKeys, triggerKey }; +} + +export function useWorkspaceShortcutModifiers() { + const overrides = useHotkeyOverridesStore((s) => s.overrides); + + return useMemo(() => { + const allModifierKeys = new Set(); + const shortcuts: WorkspaceShortcutInfo[] = []; + const comboToIndices = new Map(); + + for (let i = 0; i < WORKSPACE_HOTKEY_IDS.length; i++) { + const binding = getBinding(WORKSPACE_HOTKEY_IDS[i]); + if (!binding) continue; + const { modifierKeys, triggerKey } = parseBinding(binding); + for (const key of modifierKeys) allModifierKeys.add(key); + shortcuts.push({ index: i, triggerKey, modifierKeys }); + const comboKey = [...modifierKeys].sort().join("+"); + const existing = comboToIndices.get(comboKey) ?? []; + existing.push(i); + comboToIndices.set(comboKey, existing); + } + + return { allModifierKeys, shortcuts, comboToIndices }; + }, [overrides]); +} From 91015c69092f809a664996df5752e40d32dcf764 Mon Sep 17 00:00:00 2001 From: Trevor Smith Date: Wed, 8 Apr 2026 12:24:20 -0500 Subject: [PATCH 03/17] feat: add showWorkspaceNumbersOnModifier setting to local-db and tRPC --- .../src/lib/trpc/routers/settings/index.ts | 20 +++++++++++++++++++ packages/local-db/src/schema/schema.ts | 1 + 2 files changed, 21 insertions(+) diff --git a/apps/desktop/src/lib/trpc/routers/settings/index.ts b/apps/desktop/src/lib/trpc/routers/settings/index.ts index bb21e3b09fd..432f3e6ae56 100644 --- a/apps/desktop/src/lib/trpc/routers/settings/index.ts +++ b/apps/desktop/src/lib/trpc/routers/settings/index.ts @@ -1030,5 +1030,25 @@ export const createSettingsRouter = () => { .mutation(() => { return { success: true }; }), + + getShowWorkspaceNumbersOnModifier: publicProcedure.query(() => { + const row = getSettings(); + return row.showWorkspaceNumbersOnModifier ?? false; + }), + + setShowWorkspaceNumbersOnModifier: publicProcedure + .input(z.object({ enabled: z.boolean() })) + .mutation(({ input }) => { + localDb + .insert(settings) + .values({ id: 1, showWorkspaceNumbersOnModifier: input.enabled }) + .onConflictDoUpdate({ + target: settings.id, + set: { showWorkspaceNumbersOnModifier: input.enabled }, + }) + .run(); + + return { success: true }; + }), }); }; diff --git a/packages/local-db/src/schema/schema.ts b/packages/local-db/src/schema/schema.ts index 7009f0aa5dd..d78e5a5be23 100644 --- a/packages/local-db/src/schema/schema.ts +++ b/packages/local-db/src/schema/schema.ts @@ -234,6 +234,7 @@ export const settings = sqliteTable("settings", { exposeHostServiceViaRelay: integer("expose_host_service_via_relay", { mode: "boolean", }), + showWorkspaceNumbersOnModifier: integer("show_workspace_numbers_on_modifier", { mode: "boolean" }), }); export type InsertSettings = typeof settings.$inferInsert; From 1a7c0cf0b1393ef2b215a51ffe385f0e71365444 Mon Sep 17 00:00:00 2001 From: Trevor Smith Date: Wed, 8 Apr 2026 12:25:57 -0500 Subject: [PATCH 04/17] feat(desktop): add WorkspaceShortcutBadge component --- .../WorkspaceShortcutBadge.tsx | 23 +++++++++++++++++++ .../WorkspaceListItem/index.ts | 1 + 2 files changed, 24 insertions(+) create mode 100644 apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceListItem/WorkspaceShortcutBadge.tsx diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceListItem/WorkspaceShortcutBadge.tsx b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceListItem/WorkspaceShortcutBadge.tsx new file mode 100644 index 00000000000..08321f9c7d5 --- /dev/null +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceListItem/WorkspaceShortcutBadge.tsx @@ -0,0 +1,23 @@ +import { cn } from "@superset/ui/utils"; + +interface WorkspaceShortcutBadgeProps { + /** The key label to display (e.g., "1", "2") */ + label: string; + className?: string; +} + +export function WorkspaceShortcutBadge({ + label, + className, +}: WorkspaceShortcutBadgeProps) { + return ( + + {label} + + ); +} diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceListItem/index.ts b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceListItem/index.ts index ed2db7c33f1..e84cf77cdf6 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceListItem/index.ts +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceListItem/index.ts @@ -2,4 +2,5 @@ export type { DragItem } from "../types"; export { WORKSPACE_DND_TYPE } from "./constants"; export { WorkspaceDiffStats } from "./WorkspaceDiffStats"; export { WorkspaceListItem } from "./WorkspaceListItem"; +export { WorkspaceShortcutBadge } from "./WorkspaceShortcutBadge"; export { WorkspaceStatusBadge } from "./WorkspaceStatusBadge"; From deeed6a3fdca4a0fbbb8858fc2ecba19dd330a8a Mon Sep 17 00:00:00 2001 From: Trevor Smith Date: Wed, 8 Apr 2026 12:27:07 -0500 Subject: [PATCH 05/17] feat: add hidden prop to WorkspaceDiffStats for modifier-hold badge swap --- .../WorkspaceSidebar/WorkspaceListItem/WorkspaceDiffStats.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceListItem/WorkspaceDiffStats.tsx b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceListItem/WorkspaceDiffStats.tsx index 52367949236..73807211192 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceListItem/WorkspaceDiffStats.tsx +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceListItem/WorkspaceDiffStats.tsx @@ -4,18 +4,22 @@ interface WorkspaceDiffStatsProps { additions: number; deletions: number; isActive?: boolean; + /** When true, hide the diff stats (e.g., when modifier key is held to show shortcut badges) */ + hidden?: boolean; } export function WorkspaceDiffStats({ additions, deletions, isActive, + hidden = false, }: WorkspaceDiffStatsProps) { return ( From f9096a67bc22139e439c0da8f196713480e77c6c Mon Sep 17 00:00:00 2001 From: Trevor Smith Date: Wed, 8 Apr 2026 12:31:05 -0500 Subject: [PATCH 07/17] feat: mount modifier key listener in WorkspaceSidebar --- .../components/WorkspaceSidebar/WorkspaceSidebar.tsx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceSidebar.tsx b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceSidebar.tsx index e1415e2e854..1fb25100325 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceSidebar.tsx +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceSidebar.tsx @@ -1,6 +1,12 @@ import { useCallback, useEffect, useMemo } from "react"; +<<<<<<< HEAD import { V2AvailableBanner } from "renderer/components/V2AvailableBanner"; +||||||| parent of 4ff590ba9 (feat: mount modifier key listener in WorkspaceSidebar) +======= +import { useModifierKeyListener } from "renderer/hooks/useModifierKeyListener"; +>>>>>>> 4ff590ba9 (feat: mount modifier key listener in WorkspaceSidebar) import { useWorkspaceShortcuts } from "renderer/hooks/useWorkspaceShortcuts"; +import { electronTrpc } from "renderer/lib/electron-trpc"; import { useWorkspaceSelectionStore } from "renderer/stores/workspace-selection"; import { MultiDragPreview } from "./MultiDragPreview"; import { PortsList } from "./PortsList"; @@ -24,6 +30,10 @@ export function WorkspaceSidebar({ const { groups } = useWorkspaceShortcuts(); const clearSelection = useWorkspaceSelectionStore((s) => s.clearSelection); + const { data: showNumbersOnModifier = false } = + electronTrpc.settings.getShowWorkspaceNumbersOnModifier.useQuery(); + useModifierKeyListener(showNumbersOnModifier); + const projectShortcutIndices = useMemo( () => groups.reduce<{ indices: number[]; cumulative: number }>( From 374492653670d40f4bbd36bae6988ade83ddee99 Mon Sep 17 00:00:00 2001 From: Trevor Smith Date: Wed, 8 Apr 2026 12:33:28 -0500 Subject: [PATCH 08/17] feat: show shortcut badges on collapsed project headers when modifier held --- .../ProjectSection/ProjectHeader.tsx | 24 +++++++++++++++++ .../ProjectSection/ProjectSection.tsx | 26 +++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/ProjectSection/ProjectHeader.tsx b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/ProjectSection/ProjectHeader.tsx index 94aabb808a1..c44c41e7a4d 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/ProjectSection/ProjectHeader.tsx +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/ProjectSection/ProjectHeader.tsx @@ -31,6 +31,7 @@ import { navigateToWorkspace } from "renderer/routes/_authenticated/_dashboard/u import { useProjectRename } from "renderer/screens/main/hooks/useProjectRename"; import { STROKE_WIDTH } from "../constants"; import { RenameInput } from "../RenameInput"; +import { WorkspaceShortcutBadge } from "../WorkspaceListItem/WorkspaceShortcutBadge"; import { CloseProjectDialog } from "./CloseProjectDialog"; import { ProjectThumbnail } from "./ProjectThumbnail"; @@ -49,6 +50,8 @@ interface ProjectHeaderProps { onToggleCollapse: () => void; workspaceCount: number; onNewWorkspace: () => void; + /** Shortcut indices to display as badges when project is collapsed and modifier is held */ + shortcutIndices?: number[]; } export function ProjectHeader({ @@ -64,6 +67,7 @@ export function ProjectHeader({ onToggleCollapse, workspaceCount, onNewWorkspace, + shortcutIndices = [], }: ProjectHeaderProps) { const utils = electronTrpc.useUtils(); const navigate = useNavigate(); @@ -206,6 +210,16 @@ export function ProjectHeader({ {workspaceCount} workspace{workspaceCount !== 1 ? "s" : ""} + {shortcutIndices.length > 0 && ( +
+ {shortcutIndices.map((idx) => ( + + ))} +
+ )} @@ -303,6 +317,16 @@ export function ProjectHeader({ ({workspaceCount}) + {shortcutIndices.length > 0 && ( +
+ {shortcutIndices.map((idx) => ( + + ))} +
+ )} )} diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/ProjectSection/ProjectSection.tsx b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/ProjectSection/ProjectSection.tsx index 2e51d011de0..46491ed0437 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/ProjectSection/ProjectSection.tsx +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/ProjectSection/ProjectSection.tsx @@ -6,10 +6,12 @@ import { useDrag, useDrop } from "react-dnd"; import { electronTrpc } from "renderer/lib/electron-trpc"; import { useReorderProjects } from "renderer/react-query/projects"; import { useWorkspaceSidebarStore } from "renderer/stores"; +import { useModifierKeyStateStore } from "renderer/stores/modifier-key-state"; import { useOpenNewWorkspaceModal } from "renderer/stores/new-workspace-modal"; import { useSectionDropZone } from "../hooks"; import type { SidebarSection, SidebarWorkspace } from "../types"; import { WorkspaceListItem } from "../WorkspaceListItem"; +import { MAX_KEYBOARD_SHORTCUT_INDEX } from "../WorkspaceListItem/constants"; import { WorkspaceSection } from "../WorkspaceSection"; import { ProjectHeader } from "./ProjectHeader"; @@ -125,6 +127,28 @@ export function ProjectSection({ }; }, [shortcutBaseIndex, sections, topLevelItems, workspaces]); + const isModifierHeld = useModifierKeyStateStore((s) => s.isModifierHeld); + + // Collect shortcut indices for this project's workspaces (for collapsed header badges) + const projectShortcutIndices = useMemo(() => { + const indices: number[] = []; + for (const child of topLevelChildren) { + if (child.kind === "workspace") { + if (child.shortcutIndex < MAX_KEYBOARD_SHORTCUT_INDEX) { + indices.push(child.shortcutIndex); + } + } else { + for (let i = 0; i < child.section.workspaces.length; i++) { + const idx = child.shortcutBaseIndex + i; + if (idx < MAX_KEYBOARD_SHORTCUT_INDEX) { + indices.push(idx); + } + } + } + } + return indices; + }, [topLevelChildren]); + const topUngroupedDropZone = useSectionDropZone({ canAccept: (item) => item.sectionId !== null && item.projectId === projectId, @@ -247,6 +271,7 @@ export function ProjectSection({ onToggleCollapse={() => toggleProjectCollapsed(projectId)} workspaceCount={totalWorkspaceCount} onNewWorkspace={handleNewWorkspace} + shortcutIndices={isCollapsed && isModifierHeld ? projectShortcutIndices : []} /> @@ -349,6 +374,7 @@ export function ProjectSection({ onToggleCollapse={() => toggleProjectCollapsed(projectId)} workspaceCount={totalWorkspaceCount} onNewWorkspace={handleNewWorkspace} + shortcutIndices={isCollapsed && isModifierHeld ? projectShortcutIndices : []} /> From 1c3a923097a7494f7452c8800f3cc101ed511211 Mon Sep 17 00:00:00 2001 From: Trevor Smith Date: Wed, 8 Apr 2026 12:35:15 -0500 Subject: [PATCH 09/17] feat: add settings toggle for workspace number badges on modifier hold --- .../BehaviorSettings/BehaviorSettings.tsx | 60 +++++++++++++++++++ .../utils/settings-search/settings-search.ts | 16 +++++ 2 files changed, 76 insertions(+) diff --git a/apps/desktop/src/renderer/routes/_authenticated/settings/behavior/components/BehaviorSettings/BehaviorSettings.tsx b/apps/desktop/src/renderer/routes/_authenticated/settings/behavior/components/BehaviorSettings/BehaviorSettings.tsx index 8fb0050fc90..21d15dc4a5a 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/settings/behavior/components/BehaviorSettings/BehaviorSettings.tsx +++ b/apps/desktop/src/renderer/routes/_authenticated/settings/behavior/components/BehaviorSettings/BehaviorSettings.tsx @@ -36,6 +36,10 @@ export function BehaviorSettings({ visibleItems }: BehaviorSettingsProps) { SETTING_ITEM_ID.BEHAVIOR_OPEN_LINKS_IN_APP, visibleItems, ); + const showWorkspaceNumbers = isItemVisible( + SETTING_ITEM_ID.BEHAVIOR_WORKSPACE_NUMBERS, + visibleItems, + ); const utils = electronTrpc.useUtils(); @@ -125,6 +129,37 @@ export function BehaviorSettings({ visibleItems }: BehaviorSettingsProps) { }, ); + const { data: showWorkspaceNumbersOnModifier, isLoading: isNumbersLoading } = + electronTrpc.settings.getShowWorkspaceNumbersOnModifier.useQuery(); + const setShowWorkspaceNumbersOnModifier = + electronTrpc.settings.setShowWorkspaceNumbersOnModifier.useMutation({ + onMutate: async ({ enabled }) => { + await utils.settings.getShowWorkspaceNumbersOnModifier.cancel(); + const previous = + utils.settings.getShowWorkspaceNumbersOnModifier.getData(); + utils.settings.getShowWorkspaceNumbersOnModifier.setData( + undefined, + enabled, + ); + return { previous }; + }, + onError: (_err, _vars, context) => { + if (context?.previous !== undefined) { + utils.settings.getShowWorkspaceNumbersOnModifier.setData( + undefined, + context.previous, + ); + } + }, + onSettled: () => { + utils.settings.getShowWorkspaceNumbersOnModifier.invalidate(); + }, + }); + + const handleNumbersToggle = (enabled: boolean) => { + setShowWorkspaceNumbersOnModifier.mutate({ enabled }); + }; + return (
@@ -227,6 +262,31 @@ export function BehaviorSettings({ visibleItems }: BehaviorSettingsProps) { />
)} + {showWorkspaceNumbers && ( +
+
+ +

+ Display numbered badges on workspaces when holding the shortcut + modifier key +

+
+ +
+ )}
); diff --git a/apps/desktop/src/renderer/routes/_authenticated/settings/utils/settings-search/settings-search.ts b/apps/desktop/src/renderer/routes/_authenticated/settings/utils/settings-search/settings-search.ts index d7f25fab62f..0200e6c5bb6 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/settings/utils/settings-search/settings-search.ts +++ b/apps/desktop/src/renderer/routes/_authenticated/settings/utils/settings-search/settings-search.ts @@ -28,6 +28,7 @@ export const SETTING_ITEM_ID = { BEHAVIOR_FILE_OPEN_MODE: "behavior-file-open-mode", BEHAVIOR_RESOURCE_MONITOR: "behavior-resource-monitor", BEHAVIOR_OPEN_LINKS_IN_APP: "behavior-open-links-in-app", + BEHAVIOR_WORKSPACE_NUMBERS: "behavior-workspace-numbers", GIT_BRANCH_PREFIX: "git-branch-prefix", GIT_DELETE_LOCAL_BRANCH: "git-delete-local-branch", @@ -623,6 +624,21 @@ export const SETTINGS_ITEMS: SettingsItem[] = [ "url", ], }, + { + id: SETTING_ITEM_ID.BEHAVIOR_WORKSPACE_NUMBERS, + section: "behavior", + title: "Show workspace numbers on modifier hold", + description: + "Display numbered badges on workspaces when holding the shortcut modifier key", + keywords: [ + "workspace", + "number", + "badge", + "shortcut", + "modifier", + "keyboard", + ], + }, { id: SETTING_ITEM_ID.AGENTS_ENABLED, section: "agents", From 61e2e7430b3676d9e54d3a5525d0740db7cbe5e5 Mon Sep 17 00:00:00 2001 From: Trevor Smith Date: Wed, 8 Apr 2026 12:39:58 -0500 Subject: [PATCH 10/17] chore: lint and format fixes for workspace number badges feature --- .../src/renderer/hooks/useModifierKeyListener.ts | 9 ++++++++- .../renderer/hooks/useWorkspaceShortcutModifiers.ts | 12 ++++++++++-- .../components/BehaviorSettings/BehaviorSettings.tsx | 3 +-- .../ProjectSection/ProjectHeader.tsx | 5 +---- .../ProjectSection/ProjectSection.tsx | 8 ++++++-- .../WorkspaceListItem/WorkspaceListItem.tsx | 4 +--- packages/local-db/src/schema/schema.ts | 5 ++++- 7 files changed, 31 insertions(+), 15 deletions(-) diff --git a/apps/desktop/src/renderer/hooks/useModifierKeyListener.ts b/apps/desktop/src/renderer/hooks/useModifierKeyListener.ts index 5bda1748582..12ea05008a1 100644 --- a/apps/desktop/src/renderer/hooks/useModifierKeyListener.ts +++ b/apps/desktop/src/renderer/hooks/useModifierKeyListener.ts @@ -50,5 +50,12 @@ export function useModifierKeyListener(enabled: boolean) { window.removeEventListener("blur", handleBlur); clearAll(); }; - }, [enabled, allModifierKeys, comboToIndices, pressKey, releaseKey, clearAll]); + }, [ + enabled, + allModifierKeys, + comboToIndices, + pressKey, + releaseKey, + clearAll, + ]); } diff --git a/apps/desktop/src/renderer/hooks/useWorkspaceShortcutModifiers.ts b/apps/desktop/src/renderer/hooks/useWorkspaceShortcutModifiers.ts index cb3a7050444..5ab04d6a615 100644 --- a/apps/desktop/src/renderer/hooks/useWorkspaceShortcutModifiers.ts +++ b/apps/desktop/src/renderer/hooks/useWorkspaceShortcutModifiers.ts @@ -1,6 +1,9 @@ import { useMemo } from "react"; -import { getBinding, type HotkeyId } from "renderer/hotkeys"; -import { useHotkeyOverridesStore } from "renderer/hotkeys"; +import { + getBinding, + type HotkeyId, + useHotkeyOverridesStore, +} from "renderer/hotkeys"; const WORKSPACE_HOTKEY_IDS: HotkeyId[] = [ "JUMP_TO_WORKSPACE_1", @@ -41,6 +44,11 @@ export function useWorkspaceShortcutModifiers() { const overrides = useHotkeyOverridesStore((s) => s.overrides); return useMemo(() => { + // `overrides` isn't read directly here but `getBinding` reads the + // override store imperatively. Referencing the value forces the + // memo to recompute when the user changes hotkey bindings. + void overrides; + const allModifierKeys = new Set(); const shortcuts: WorkspaceShortcutInfo[] = []; const comboToIndices = new Map(); diff --git a/apps/desktop/src/renderer/routes/_authenticated/settings/behavior/components/BehaviorSettings/BehaviorSettings.tsx b/apps/desktop/src/renderer/routes/_authenticated/settings/behavior/components/BehaviorSettings/BehaviorSettings.tsx index 21d15dc4a5a..e1d84ba76fa 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/settings/behavior/components/BehaviorSettings/BehaviorSettings.tsx +++ b/apps/desktop/src/renderer/routes/_authenticated/settings/behavior/components/BehaviorSettings/BehaviorSettings.tsx @@ -281,8 +281,7 @@ export function BehaviorSettings({ visibleItems }: BehaviorSettingsProps) { checked={showWorkspaceNumbersOnModifier ?? false} onCheckedChange={handleNumbersToggle} disabled={ - isNumbersLoading || - setShowWorkspaceNumbersOnModifier.isPending + isNumbersLoading || setShowWorkspaceNumbersOnModifier.isPending } /> diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/ProjectSection/ProjectHeader.tsx b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/ProjectSection/ProjectHeader.tsx index c44c41e7a4d..0a32006b020 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/ProjectSection/ProjectHeader.tsx +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/ProjectSection/ProjectHeader.tsx @@ -213,10 +213,7 @@ export function ProjectHeader({ {shortcutIndices.length > 0 && (
{shortcutIndices.map((idx) => ( - + ))}
)} diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/ProjectSection/ProjectSection.tsx b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/ProjectSection/ProjectSection.tsx index 46491ed0437..089bb3d2a77 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/ProjectSection/ProjectSection.tsx +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/ProjectSection/ProjectSection.tsx @@ -271,7 +271,9 @@ export function ProjectSection({ onToggleCollapse={() => toggleProjectCollapsed(projectId)} workspaceCount={totalWorkspaceCount} onNewWorkspace={handleNewWorkspace} - shortcutIndices={isCollapsed && isModifierHeld ? projectShortcutIndices : []} + shortcutIndices={ + isCollapsed && isModifierHeld ? projectShortcutIndices : [] + } /> @@ -374,7 +376,9 @@ export function ProjectSection({ onToggleCollapse={() => toggleProjectCollapsed(projectId)} workspaceCount={totalWorkspaceCount} onNewWorkspace={handleNewWorkspace} - shortcutIndices={isCollapsed && isModifierHeld ? projectShortcutIndices : []} + shortcutIndices={ + isCollapsed && isModifierHeld ? projectShortcutIndices : [] + } /> diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceListItem/WorkspaceListItem.tsx b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceListItem/WorkspaceListItem.tsx index 327341905a1..d713c1ece23 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceListItem/WorkspaceListItem.tsx +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceListItem/WorkspaceListItem.tsx @@ -413,9 +413,7 @@ export function WorkspaceListItem({ /> )} {showShortcutBadge ? ( - + ) : (
{shortcutIndex !== undefined && diff --git a/packages/local-db/src/schema/schema.ts b/packages/local-db/src/schema/schema.ts index d78e5a5be23..46bfdba244e 100644 --- a/packages/local-db/src/schema/schema.ts +++ b/packages/local-db/src/schema/schema.ts @@ -234,7 +234,10 @@ export const settings = sqliteTable("settings", { exposeHostServiceViaRelay: integer("expose_host_service_via_relay", { mode: "boolean", }), - showWorkspaceNumbersOnModifier: integer("show_workspace_numbers_on_modifier", { mode: "boolean" }), + showWorkspaceNumbersOnModifier: integer( + "show_workspace_numbers_on_modifier", + { mode: "boolean" }, + ), }); export type InsertSettings = typeof settings.$inferInsert; From 0df56334dbf3c4f33a570583f1f37b554495ecb7 Mon Sep 17 00:00:00 2001 From: Trevor Smith Date: Wed, 8 Apr 2026 13:12:26 -0500 Subject: [PATCH 11/17] =?UTF-8?q?fix(desktop):=20use=20dynamic=20shortcut?= =?UTF-8?q?=20labels=20instead=20of=20hardcoded=20=E2=8C=98=20symbol?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Badge labels now derive from the actual hotkey binding via formatHotkeyDisplay, so they reflect platform (⌘1 on Mac, Ctrl+Shift+1 on Windows/Linux) and user overrides. Also moves the modifier-held badge outside the diff stats grid to prevent inheriting diff stats sizing. --- .../hooks/useWorkspaceShortcutModifiers.ts | 6 ++- .../ProjectSection/ProjectHeader.tsx | 21 ++++----- .../ProjectSection/ProjectSection.tsx | 26 ++++++----- .../WorkspaceListItem/WorkspaceListItem.tsx | 43 ++++++++++--------- .../WorkspaceSidebar/WorkspaceSidebar.tsx | 4 -- 5 files changed, 52 insertions(+), 48 deletions(-) diff --git a/apps/desktop/src/renderer/hooks/useWorkspaceShortcutModifiers.ts b/apps/desktop/src/renderer/hooks/useWorkspaceShortcutModifiers.ts index 5ab04d6a615..0986c796c51 100644 --- a/apps/desktop/src/renderer/hooks/useWorkspaceShortcutModifiers.ts +++ b/apps/desktop/src/renderer/hooks/useWorkspaceShortcutModifiers.ts @@ -1,7 +1,9 @@ import { useMemo } from "react"; import { + formatHotkeyDisplay, getBinding, type HotkeyId, + PLATFORM, useHotkeyOverridesStore, } from "renderer/hotkeys"; @@ -52,6 +54,7 @@ export function useWorkspaceShortcutModifiers() { const allModifierKeys = new Set(); const shortcuts: WorkspaceShortcutInfo[] = []; const comboToIndices = new Map(); + const shortcutLabels = new Map(); for (let i = 0; i < WORKSPACE_HOTKEY_IDS.length; i++) { const binding = getBinding(WORKSPACE_HOTKEY_IDS[i]); @@ -63,8 +66,9 @@ export function useWorkspaceShortcutModifiers() { const existing = comboToIndices.get(comboKey) ?? []; existing.push(i); comboToIndices.set(comboKey, existing); + shortcutLabels.set(i, formatHotkeyDisplay(binding, PLATFORM).text); } - return { allModifierKeys, shortcuts, comboToIndices }; + return { allModifierKeys, shortcuts, comboToIndices, shortcutLabels }; }, [overrides]); } diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/ProjectSection/ProjectHeader.tsx b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/ProjectSection/ProjectHeader.tsx index 0a32006b020..372c8fa4e60 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/ProjectSection/ProjectHeader.tsx +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/ProjectSection/ProjectHeader.tsx @@ -50,8 +50,8 @@ interface ProjectHeaderProps { onToggleCollapse: () => void; workspaceCount: number; onNewWorkspace: () => void; - /** Shortcut indices to display as badges when project is collapsed and modifier is held */ - shortcutIndices?: number[]; + /** Shortcut labels to display as badges when project is collapsed and modifier is held */ + shortcutLabels?: string[]; } export function ProjectHeader({ @@ -67,7 +67,7 @@ export function ProjectHeader({ onToggleCollapse, workspaceCount, onNewWorkspace, - shortcutIndices = [], + shortcutLabels = [], }: ProjectHeaderProps) { const utils = electronTrpc.useUtils(); const navigate = useNavigate(); @@ -210,10 +210,10 @@ export function ProjectHeader({ {workspaceCount} workspace{workspaceCount !== 1 ? "s" : ""} - {shortcutIndices.length > 0 && ( + {shortcutLabels.length > 0 && (
- {shortcutIndices.map((idx) => ( - + {shortcutLabels.map((label) => ( + ))}
)} @@ -314,13 +314,10 @@ export function ProjectHeader({ ({workspaceCount}) - {shortcutIndices.length > 0 && ( + {shortcutLabels.length > 0 && (
- {shortcutIndices.map((idx) => ( - + {shortcutLabels.map((label) => ( + ))}
)} diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/ProjectSection/ProjectSection.tsx b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/ProjectSection/ProjectSection.tsx index 089bb3d2a77..8dc94cac08c 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/ProjectSection/ProjectSection.tsx +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/ProjectSection/ProjectSection.tsx @@ -3,6 +3,7 @@ import { cn } from "@superset/ui/utils"; import { AnimatePresence, motion } from "framer-motion"; import { useEffect, useMemo, useRef } from "react"; import { useDrag, useDrop } from "react-dnd"; +import { useWorkspaceShortcutModifiers } from "renderer/hooks/useWorkspaceShortcutModifiers"; import { electronTrpc } from "renderer/lib/electron-trpc"; import { useReorderProjects } from "renderer/react-query/projects"; import { useWorkspaceSidebarStore } from "renderer/stores"; @@ -128,26 +129,29 @@ export function ProjectSection({ }, [shortcutBaseIndex, sections, topLevelItems, workspaces]); const isModifierHeld = useModifierKeyStateStore((s) => s.isModifierHeld); + const { shortcutLabels } = useWorkspaceShortcutModifiers(); - // Collect shortcut indices for this project's workspaces (for collapsed header badges) - const projectShortcutIndices = useMemo(() => { - const indices: number[] = []; + // Collect shortcut labels for this project's workspaces (for collapsed header badges) + const projectShortcutLabels = useMemo(() => { + const labels: string[] = []; for (const child of topLevelChildren) { if (child.kind === "workspace") { if (child.shortcutIndex < MAX_KEYBOARD_SHORTCUT_INDEX) { - indices.push(child.shortcutIndex); + const label = shortcutLabels.get(child.shortcutIndex); + if (label) labels.push(label); } } else { for (let i = 0; i < child.section.workspaces.length; i++) { const idx = child.shortcutBaseIndex + i; if (idx < MAX_KEYBOARD_SHORTCUT_INDEX) { - indices.push(idx); + const label = shortcutLabels.get(idx); + if (label) labels.push(label); } } } } - return indices; - }, [topLevelChildren]); + return labels; + }, [topLevelChildren, shortcutLabels]); const topUngroupedDropZone = useSectionDropZone({ canAccept: (item) => @@ -271,8 +275,8 @@ export function ProjectSection({ onToggleCollapse={() => toggleProjectCollapsed(projectId)} workspaceCount={totalWorkspaceCount} onNewWorkspace={handleNewWorkspace} - shortcutIndices={ - isCollapsed && isModifierHeld ? projectShortcutIndices : [] + shortcutLabels={ + isCollapsed && isModifierHeld ? projectShortcutLabels : [] } />
@@ -376,8 +380,8 @@ export function ProjectSection({ onToggleCollapse={() => toggleProjectCollapsed(projectId)} workspaceCount={totalWorkspaceCount} onNewWorkspace={handleNewWorkspace} - shortcutIndices={ - isCollapsed && isModifierHeld ? projectShortcutIndices : [] + shortcutLabels={ + isCollapsed && isModifierHeld ? projectShortcutLabels : [] } /> diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceListItem/WorkspaceListItem.tsx b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceListItem/WorkspaceListItem.tsx index d713c1ece23..378b7ff3a40 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceListItem/WorkspaceListItem.tsx +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceListItem/WorkspaceListItem.tsx @@ -6,6 +6,7 @@ import { useMatchRoute, useNavigate } from "@tanstack/react-router"; import { useEffect, useMemo, useRef } from "react"; import { HiMiniXMark } from "react-icons/hi2"; import { useCopyToClipboard } from "renderer/hooks/useCopyToClipboard"; +import { useWorkspaceShortcutModifiers } from "renderer/hooks/useWorkspaceShortcutModifiers"; import { HotkeyLabel } from "renderer/hotkeys"; import { electronTrpc } from "renderer/lib/electron-trpc"; import { useHoverGitHubStatus } from "renderer/lib/githubQueryPolicy"; @@ -111,6 +112,9 @@ export function WorkspaceListItem({ ); const isModifierHeld = useModifierKeyStateStore((s) => s.isModifierHeld); + const { shortcutLabels } = useWorkspaceShortcutModifiers(); + const shortcutLabel = + shortcutIndex !== undefined ? shortcutLabels.get(shortcutIndex) : undefined; const showShortcutBadge = isModifierHeld && shortcutIndex !== undefined && @@ -403,25 +407,24 @@ export function WorkspaceListItem({ /> )} -
- {diffStats && ( -
+ )} {(showBranchSubtitle || pr) && ( diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceSidebar.tsx b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceSidebar.tsx index 1fb25100325..851d454d867 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceSidebar.tsx +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceSidebar.tsx @@ -1,10 +1,6 @@ import { useCallback, useEffect, useMemo } from "react"; -<<<<<<< HEAD import { V2AvailableBanner } from "renderer/components/V2AvailableBanner"; -||||||| parent of 4ff590ba9 (feat: mount modifier key listener in WorkspaceSidebar) -======= import { useModifierKeyListener } from "renderer/hooks/useModifierKeyListener"; ->>>>>>> 4ff590ba9 (feat: mount modifier key listener in WorkspaceSidebar) import { useWorkspaceShortcuts } from "renderer/hooks/useWorkspaceShortcuts"; import { electronTrpc } from "renderer/lib/electron-trpc"; import { useWorkspaceSelectionStore } from "renderer/stores/workspace-selection"; From c1b1136de51009dd150cb34f5d661002ed8e927c Mon Sep 17 00:00:00 2001 From: Trevor Smith Date: Thu, 9 Apr 2026 15:34:33 -0500 Subject: [PATCH 12/17] fix(desktop): address PR review feedback for workspace number badges Remove dead `hidden` prop from WorkspaceDiffStats, fix inaccurate JSDoc on WorkspaceShortcutBadge, and add missing local-db migration for the showWorkspaceNumbersOnModifier settings column. --- .../WorkspaceListItem/WorkspaceDiffStats.tsx | 4 - .../WorkspaceShortcutBadge.tsx | 2 +- ...add_show_workspace_numbers_on_modifier.sql | 1 + .../local-db/drizzle/meta/0042_snapshot.json | 1494 +++++++++++++++++ packages/local-db/drizzle/meta/_journal.json | 9 +- 5 files changed, 1504 insertions(+), 6 deletions(-) create mode 100644 packages/local-db/drizzle/0042_add_show_workspace_numbers_on_modifier.sql create mode 100644 packages/local-db/drizzle/meta/0042_snapshot.json diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceListItem/WorkspaceDiffStats.tsx b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceListItem/WorkspaceDiffStats.tsx index 73807211192..52367949236 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceListItem/WorkspaceDiffStats.tsx +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceSidebar/WorkspaceListItem/WorkspaceDiffStats.tsx @@ -4,22 +4,18 @@ interface WorkspaceDiffStatsProps { additions: number; deletions: number; isActive?: boolean; - /** When true, hide the diff stats (e.g., when modifier key is held to show shortcut badges) */ - hidden?: boolean; } export function WorkspaceDiffStats({ additions, deletions, isActive, - hidden = false, }: WorkspaceDiffStatsProps) { return ( + )} ); diff --git a/apps/desktop/src/renderer/routes/_authenticated/settings/utils/settings-search/settings-search.ts b/apps/desktop/src/renderer/routes/_authenticated/settings/utils/settings-search/settings-search.ts index 90c84df1ec6..a50bd5cb657 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/settings/utils/settings-search/settings-search.ts +++ b/apps/desktop/src/renderer/routes/_authenticated/settings/utils/settings-search/settings-search.ts @@ -138,7 +138,7 @@ export const SETTING_ITEM_VARIANT: Record = { [SETTING_ITEM_ID.BEHAVIOR_FILE_OPEN_MODE]: "v1", [SETTING_ITEM_ID.BEHAVIOR_RESOURCE_MONITOR]: "shared", [SETTING_ITEM_ID.BEHAVIOR_OPEN_LINKS_IN_APP]: "v1", - [SETTING_ITEM_ID.BEHAVIOR_WORKSPACE_NUMBERS]: "v1", + [SETTING_ITEM_ID.BEHAVIOR_WORKSPACE_NUMBERS]: "shared", // Branch prefix exists in both UIs — v1 `GitSettings`, v2 `V2GitSettings`. [SETTING_ITEM_ID.GIT_BRANCH_PREFIX]: "shared",