From f90c3a2851bc84e159cf278b21352a676bee0210 Mon Sep 17 00:00:00 2001 From: Trang Doan Date: Tue, 9 Jun 2026 16:52:48 -0400 Subject: [PATCH 1/3] ENG-1840: Align advanced search highlight with Roam/BlueprintJS styling. Replace custom purple selection chrome with Blueprint menu-item hover gray for result rows and native active states for filter/sort toolbar buttons. Co-authored-by: Cursor --- .../AdvancedSearchDialog.tsx | 79 +++++++++++-------- .../DiscourseNodeTypeFilter.tsx | 7 +- .../components/DiscourseNodeSortControl.tsx | 7 +- apps/roam/src/styles/styles.css | 7 ++ 4 files changed, 56 insertions(+), 44 deletions(-) diff --git a/apps/roam/src/components/AdvancedNodeSearchDialog/AdvancedSearchDialog.tsx b/apps/roam/src/components/AdvancedNodeSearchDialog/AdvancedSearchDialog.tsx index a5d6bbdd6..c61d0bc03 100644 --- a/apps/roam/src/components/AdvancedNodeSearchDialog/AdvancedSearchDialog.tsx +++ b/apps/roam/src/components/AdvancedNodeSearchDialog/AdvancedSearchDialog.tsx @@ -9,6 +9,8 @@ import { Button, Dialog, InputGroup, + Menu, + MenuItem, NonIdealState, Spinner, SpinnerSize, @@ -87,27 +89,23 @@ const ResultRow = ({ onMouseEnter: () => void; result: SearchResult; }) => ( - + text={ + + {renderHighlightedText(stripTypePrefix(result.title), keywords)} + + } + /> ); const PreviewPane = ({ result }: { result: SearchResult | null }) => { @@ -284,8 +282,20 @@ const AdvancedNodeSearchDialog = ({ const panel = resultsPanelRef.current; if (!panel) return; - const activeRow = panel.querySelector('[aria-selected="true"]'); - activeRow?.scrollIntoView({ block: "nearest" }); + const activeRow = panel.querySelector( + '[data-active="true"]', + ) as HTMLElement | null; + if (!activeRow) return; + + const containerRect = panel.getBoundingClientRect(); + const itemRect = activeRow.getBoundingClientRect(); + + if ( + itemRect.bottom > containerRect.bottom || + itemRect.top < containerRect.top + ) { + activeRow.scrollIntoView({ block: "nearest", behavior: "auto" }); + } }, [activeIndex, activeResult?.uid, debouncedSearchTerm]); const onInsert = useCallback(async () => { @@ -450,21 +460,22 @@ const AdvancedNodeSearchDialog = ({ <>
- {results.map((result, index) => ( - setActiveIndex(index)} - onMouseEnter={() => setActiveIndex(index)} - result={result} - /> - ))} + + {results.map((result, index) => ( + setActiveIndex(index)} + onMouseEnter={() => setActiveIndex(index)} + result={result} + /> + ))} +
diff --git a/apps/roam/src/components/AdvancedNodeSearchDialog/DiscourseNodeTypeFilter.tsx b/apps/roam/src/components/AdvancedNodeSearchDialog/DiscourseNodeTypeFilter.tsx index 0eef336b9..5ce4c5b97 100644 --- a/apps/roam/src/components/AdvancedNodeSearchDialog/DiscourseNodeTypeFilter.tsx +++ b/apps/roam/src/components/AdvancedNodeSearchDialog/DiscourseNodeTypeFilter.tsx @@ -252,17 +252,14 @@ export const DiscourseNodeTypeFilter = ({ const filterButton = ( ); const PreviewPane = ({ result }: { result: SearchResult | null }) => { @@ -276,18 +284,8 @@ const AdvancedNodeSearchDialog = ({ const panel = resultsPanelRef.current; if (!panel) return; - const activeRow = panel.querySelector('[data-active="true"]'); - if (!activeRow) return; - - const containerRect = panel.getBoundingClientRect(); - const itemRect = activeRow.getBoundingClientRect(); - - if ( - itemRect.bottom > containerRect.bottom || - itemRect.top < containerRect.top - ) { - activeRow.scrollIntoView({ block: "nearest", behavior: "auto" }); - } + const activeRow = panel.querySelector('[aria-selected="true"]'); + activeRow?.scrollIntoView({ block: "nearest" }); }, [activeIndex, activeResult?.uid, debouncedSearchTerm]); const onInsert = useCallback(async () => { @@ -452,22 +450,21 @@ const AdvancedNodeSearchDialog = ({ <>
- - {results.map((result, index) => ( - setActiveIndex(index)} - onMouseEnter={() => setActiveIndex(index)} - result={result} - /> - ))} - + {results.map((result, index) => ( + setActiveIndex(index)} + onMouseEnter={() => setActiveIndex(index)} + result={result} + /> + ))}
diff --git a/apps/roam/src/components/AdvancedNodeSearchDialog/DiscourseNodeTypeFilter.tsx b/apps/roam/src/components/AdvancedNodeSearchDialog/DiscourseNodeTypeFilter.tsx index 5ce4c5b97..5b3880d5a 100644 --- a/apps/roam/src/components/AdvancedNodeSearchDialog/DiscourseNodeTypeFilter.tsx +++ b/apps/roam/src/components/AdvancedNodeSearchDialog/DiscourseNodeTypeFilter.tsx @@ -252,14 +252,17 @@ export const DiscourseNodeTypeFilter = ({ const filterButton = (