Skip to content

Commit 43dc4c4

Browse files
committed
Allow arrow down to focus document tree from search
1 parent 87256f2 commit 43dc4c4

1 file changed

Lines changed: 34 additions & 1 deletion

File tree

components/Sidebar.tsx

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ const findNodeAndSiblings = (nodes: DocumentNode[], id: string): {node: Document
8686
};
8787

8888
const Sidebar: React.FC<SidebarProps> = (props) => {
89-
const { documentTree, navigableItems, searchTerm, setSearchTerm, setSelectedIds, lastClickedId, setLastClickedId, onContextMenu, renamingNodeId, onRenameComplete, onExpandAll, onCollapseAll, commands, pendingRevealId, onRevealHandled, onNewFromClipboard, customShortcuts } = props;
89+
const { documentTree, navigableItems, searchTerm, setSearchTerm, setSelectedIds, lastClickedId, setLastClickedId, onContextMenu, renamingNodeId, onRenameComplete, onExpandAll, onCollapseAll, commands, pendingRevealId, onRevealHandled, onNewFromClipboard, customShortcuts, onSelectTemplate, onSelectNode } = props;
9090
const [focusedItemId, setFocusedItemId] = useState<string | null>(null);
9191
const [isTemplatesCollapsed, setIsTemplatesCollapsed] = useState(false);
9292
const [templatesPanelHeight, setTemplatesPanelHeight] = useState(DEFAULT_TEMPLATES_PANEL_HEIGHT);
@@ -104,6 +104,38 @@ const Sidebar: React.FC<SidebarProps> = (props) => {
104104

105105

106106
const sidebarRef = useRef<HTMLDivElement>(null);
107+
const handleSearchKeyDown = useCallback(
108+
(event: React.KeyboardEvent<HTMLInputElement>) => {
109+
if (event.key !== 'ArrowDown') {
110+
return;
111+
}
112+
113+
const firstNavigableItem = navigableItems[0];
114+
if (!firstNavigableItem) {
115+
return;
116+
}
117+
118+
event.preventDefault();
119+
event.currentTarget.blur();
120+
setFocusedItemId(firstNavigableItem.id);
121+
setSelectedIds(new Set([firstNavigableItem.id]));
122+
setLastClickedId(firstNavigableItem.id);
123+
124+
if (firstNavigableItem.type === 'template') {
125+
onSelectTemplate(firstNavigableItem.id);
126+
} else {
127+
const syntheticEvent = {
128+
shiftKey: false,
129+
ctrlKey: false,
130+
metaKey: false,
131+
} as React.MouseEvent;
132+
onSelectNode(firstNavigableItem.id, syntheticEvent);
133+
}
134+
135+
sidebarRef.current?.focus();
136+
},
137+
[navigableItems, onSelectNode, onSelectTemplate, setLastClickedId, setSelectedIds]
138+
);
107139
const isResizingTemplates = useRef(false);
108140

109141
// Effect to manage focus state
@@ -432,6 +464,7 @@ const Sidebar: React.FC<SidebarProps> = (props) => {
432464
placeholder="Search..."
433465
value={searchTerm}
434466
onChange={(e) => setSearchTerm(e.target.value)}
467+
onKeyDown={handleSearchKeyDown}
435468
className="w-full bg-background border border-border-color rounded-md pl-9 pr-9 py-1 text-xs text-text-main focus:ring-2 focus:ring-primary focus:outline-none placeholder:text-text-secondary"
436469
/>
437470
{searchTerm.trim() && (

0 commit comments

Comments
 (0)