From e32793bafddeb200b570cdce90e5b23bcfdba34c Mon Sep 17 00:00:00 2001 From: tomymaritano Date: Fri, 28 Aug 2026 23:41:41 -0300 Subject: [PATCH] feat(desktop): GSAP hover and press on sidebar rows Hover slides 6px, press 8px, rest snaps back. Delegated from the sidebar onto [data-chrome-press]. Reduced-motion and Low skip it. --- .../components/sidebar/NotebookItem.tsx | 1 + .../renderer/components/sidebar/Sidebar.tsx | 12 ++- .../sidebar/SidebarQuickFilters.tsx | 1 + .../components/sidebar/StatusFilters.tsx | 1 + .../renderer/components/sidebar/TagsList.tsx | 1 + .../motion/__tests__/chromePress.test.ts | 88 +++++++++++++++++ .../motion/__tests__/gsapRuntime.test.ts | 10 ++ .../src/renderer/motion/chromePress.ts | 94 +++++++++++++++++++ .../src/renderer/motion/gsapRuntime.ts | 32 ++++++- .../2026-08-28-electron-ux-quality.md | 1 + 10 files changed, 238 insertions(+), 3 deletions(-) create mode 100644 apps/desktop/src/renderer/motion/__tests__/chromePress.test.ts create mode 100644 apps/desktop/src/renderer/motion/chromePress.ts diff --git a/apps/desktop/src/renderer/components/sidebar/NotebookItem.tsx b/apps/desktop/src/renderer/components/sidebar/NotebookItem.tsx index 559dfd8b..55315a09 100644 --- a/apps/desktop/src/renderer/components/sidebar/NotebookItem.tsx +++ b/apps/desktop/src/renderer/components/sidebar/NotebookItem.tsx @@ -368,6 +368,7 @@ export const NotebookItem = memo(function NotebookItem({ dropPosition && `drop-${dropPosition}`, isDragging && 'dragging' )} + data-chrome-press="" style={depth > 0 ? { paddingLeft: `${8 + depth * 16}px` } : undefined} onClick={handleClick} onDoubleClick={handleDoubleClick} diff --git a/apps/desktop/src/renderer/components/sidebar/Sidebar.tsx b/apps/desktop/src/renderer/components/sidebar/Sidebar.tsx index cbae1cd4..aac510b8 100644 --- a/apps/desktop/src/renderer/components/sidebar/Sidebar.tsx +++ b/apps/desktop/src/renderer/components/sidebar/Sidebar.tsx @@ -21,6 +21,7 @@ import { } from '../../hooks/useNavigation'; import { EnableSyncModal } from '../sync'; import { useSyncOnboarding } from '../../hooks/useSyncOnboarding'; +import { bindChromePress } from '../../motion/chromePress'; import { SidebarHeader } from './SidebarHeader'; import { SidebarBreadcrumb } from './SidebarBreadcrumb'; import { SidebarQuickFilters } from './SidebarQuickFilters'; @@ -216,6 +217,9 @@ export function Sidebar({ onOpenGraph }: SidebarProps) { return () => window.removeEventListener('keydown', onKey); }, [inWorkspace, exitWorkspace]); + const sidebarRef = useRef(null); + useEffect(() => bindChromePress(sidebarRef.current), []); + const prevNotebookId = useRef(selectedNotebookId); const [paneDirection, setPaneDirection] = useState<'in' | 'out'>('in'); useEffect(() => { @@ -233,7 +237,7 @@ export function Sidebar({ onOpenGraph }: SidebarProps) { }, [selectedNotebookId, notebookContext.path]); return ( -