55import unicodedata
66
77# the score cutoff -> returns only strong to medium hits without sneaking in the weaker ones + acts as a natural max cap to the results
8- CUTTOFF = 0.6
8+ CUTOFF = 0.6
99
10- class FuzzySearch (rx .State ):
10+ class FuzzySearch (rx .State ): # type: ignore[misc]
1111 query : str
1212
1313 idxed_docs : list [dict ] = indexed_docs
@@ -70,7 +70,7 @@ async def serve_fuzzy_blogs(self):
7070 ]
7171
7272 score = self ._score_match (query_words , blog_fields )
73- if score > CUTTOFF :
73+ if score > CUTOFF :
7474 scored_results .append ((score , blog ))
7575
7676 scored_results .sort (key = lambda x : x [0 ], reverse = True )
@@ -94,7 +94,7 @@ async def serve_fuzzy_query(self):
9494 flat_terms = [w for words in term_words_list for w in words ]
9595
9696 score = self ._score_match (query_words , flat_terms )
97- if score > CUTTOFF :
97+ if score > CUTOFF :
9898 scored_results .append ((score , doc ))
9999
100100 scored_results .sort (key = lambda x : x [0 ], reverse = True )
@@ -124,7 +124,7 @@ def keyboard_shortcut_script() -> rx.Component:
124124 )
125125
126126
127- def search_trigger () -> rx .Component :
127+ def search_trigger () -> rx .Component : # type: ignore[misc]
128128 """Render the search trigger button."""
129129 return rx .box (
130130 rx .icon (
@@ -296,28 +296,44 @@ def search_result_start(item: dict):
296296 )
297297
298298
299+ def no_results_found ():
300+ return rx .box (
301+ rx .el .p (
302+ rx .fragment (
303+ "No results found for " ,
304+ rx .el .strong (f"'{ FuzzySearch .query } '" ),
305+ ),
306+ ),
307+ class_name = "w-full flex items-center justify-center text-sm py-4" ,
308+ )
309+
299310def search_content ():
300311 return rx .scroll_area (
301312 rx .cond (
302313 FuzzySearch .query .length () >= 3 ,
303- rx .box (
304- # Docs results
314+ rx .cond (
315+ ( FuzzySearch . idxed_docs_results . length () >= 1 ) | ( FuzzySearch . idxed_blogs_results . length () >= 1 ),
305316 rx .box (
306- rx .foreach (
307- FuzzySearch .idxed_docs_results ,
308- lambda value : search_result (value ["parts" ].to (list ), value )
317+ # Docs results
318+ rx .box (
319+ rx .foreach (
320+ FuzzySearch .idxed_docs_results ,
321+ lambda value : search_result (value ["parts" ].to (list ), value )
322+ ),
323+ class_name = "flex flex-col gap-y-2" ,
309324 ),
310- class_name = "flex flex-col gap-y-2" ,
311- ),
312- # Blog results
313- rx . box (
314- rx . foreach (
315- FuzzySearch . idxed_blogs_results ,
316- lambda value : search_result_blog ( value )
325+ # Blog results
326+ rx . box (
327+ rx . foreach (
328+ FuzzySearch . idxed_blogs_results ,
329+ lambda value : search_result_blog ( value )
330+ ) ,
331+ class_name = "flex flex-col gap-y-2" ,
317332 ),
318- class_name = "flex flex-col gap-y-2 " ,
333+ class_name = "flex flex-col" ,
319334 ),
320- class_name = "flex flex-col" ,
335+ # No results
336+ no_results_found (),
321337 ),
322338 rx .box (
323339 rx .foreach (suggestion_items , lambda value : search_result_start (value )),
@@ -329,7 +345,7 @@ def search_content():
329345
330346
331347def typesense_search ():
332- """Create the main Typesense search component."""
348+ """Create the main search component."""
333349 return rx .fragment (
334350 rx .dialog .root (
335351 rx .dialog .trigger (search_trigger (), id = "search-trigger" ),
0 commit comments