@@ -73,6 +73,7 @@ type SearchResultItem = RoundSearchResultItem | SessionSearchResultItem | Projec
7373const RECENT_SEARCH_LIMIT = 20 ;
7474const RECENT_SEARCH_BADGE_LIMIT = 8 ;
7575const RECENT_SEARCH_STORAGE_KEY = "lovcode:search-overlay:recent-searches" ;
76+ const SEARCH_VIEW_STORAGE_KEY = "lovcode:search-overlay:view-mode" ;
7677const FULL_TEXT_SEARCH_LIMIT = 600 ;
7778const MATCH_CONTEXT_RADIUS = 96 ;
7879
@@ -348,10 +349,31 @@ function writeRecentSearches(searches: string[]) {
348349 }
349350}
350351
352+ function isSearchViewMode ( value : unknown ) : value is SearchViewMode {
353+ return SEARCH_VIEW_MODES . some ( ( mode ) => mode . id === value ) ;
354+ }
355+
356+ function readSearchViewMode ( ) : SearchViewMode {
357+ try {
358+ const stored = window . localStorage . getItem ( SEARCH_VIEW_STORAGE_KEY ) ;
359+ return isSearchViewMode ( stored ) ? stored : "round" ;
360+ } catch {
361+ return "round" ;
362+ }
363+ }
364+
365+ function writeSearchViewMode ( mode : SearchViewMode ) {
366+ try {
367+ window . localStorage . setItem ( SEARCH_VIEW_STORAGE_KEY , mode ) ;
368+ } catch {
369+ // Ignore storage failures; the in-memory view switch still works.
370+ }
371+ }
372+
351373export default function SearchOverlay ( ) {
352374 const [ query , setQuery ] = useState ( "" ) ;
353375 const [ sourceResults , setSourceResults ] = useState < SearchResultItem [ ] > ( [ ] ) ;
354- const [ viewMode , setViewMode ] = useState < SearchViewMode > ( "round" ) ;
376+ const [ viewMode , setViewMode ] = useState < SearchViewMode > ( readSearchViewMode ) ;
355377 const [ searching , setSearching ] = useState ( false ) ;
356378 const [ indexBuilding , setIndexBuilding ] = useState ( false ) ;
357379 const [ indexReady , setIndexReady ] = useState ( false ) ;
@@ -525,6 +547,10 @@ export default function SearchOverlay() {
525547 return ( ) => clearTimeout ( timer ) ;
526548 } , [ trimmedQuery , rememberSearch ] ) ;
527549
550+ useEffect ( ( ) => {
551+ writeSearchViewMode ( viewMode ) ;
552+ } , [ viewMode ] ) ;
553+
528554 useEffect ( ( ) => {
529555 setActiveIdx ( 0 ) ;
530556 } , [ query , results . length , viewMode ] ) ;
@@ -623,6 +649,24 @@ export default function SearchOverlay() {
623649 ) }
624650 </ div >
625651
652+ { ! trimmedQuery && recentSearchBadges . length > 0 && (
653+ < div className = "mt-2 flex min-w-0 items-center gap-1.5 overflow-hidden whitespace-nowrap" aria-label = "Recent searches" >
654+ < span className = "shrink-0 text-[11px] text-muted-foreground" > Recent</ span >
655+ { recentSearchBadges . map ( ( term ) => (
656+ < button
657+ key = { term }
658+ type = "button"
659+ onClick = { ( ) => onSelectRecentSearch ( term ) }
660+ className = "max-w-[12rem] shrink-0 truncate rounded-lg border border-border bg-card-alt px-2 py-1 text-[11px] text-muted-foreground transition-colors hover:bg-card hover:text-foreground"
661+ aria-label = { `Search for ${ term } ` }
662+ title = { term }
663+ >
664+ { term }
665+ </ button >
666+ ) ) }
667+ </ div >
668+ ) }
669+
626670 < div className = "mt-2 flex items-center justify-between gap-2" >
627671 < div className = "inline-flex rounded-lg border border-border bg-card-alt p-0.5" aria-label = "Search view" >
628672 { SEARCH_VIEW_MODES . map ( ( mode ) => {
@@ -653,24 +697,6 @@ export default function SearchOverlay() {
653697 </ span >
654698 ) }
655699 </ div >
656-
657- { ! trimmedQuery && recentSearchBadges . length > 0 && (
658- < div className = "mt-2 flex flex-wrap items-center gap-1.5" aria-label = "Recent searches" >
659- < span className = "shrink-0 text-[11px] text-muted-foreground" > Recent</ span >
660- { recentSearchBadges . map ( ( term ) => (
661- < button
662- key = { term }
663- type = "button"
664- onClick = { ( ) => onSelectRecentSearch ( term ) }
665- className = "max-w-[12rem] truncate rounded-lg border border-border bg-card-alt px-2 py-1 text-[11px] text-muted-foreground transition-colors hover:bg-card hover:text-foreground"
666- aria-label = { `Search for ${ term } ` }
667- title = { term }
668- >
669- { term }
670- </ button >
671- ) ) }
672- </ div >
673- ) }
674700 </ div >
675701 </ div >
676702
0 commit comments