@@ -331,16 +331,35 @@ export function SearchModal({
331331 return items
332332 } , [ workspaces , workflows , pages , blocks , triggers , tools , docs ] )
333333
334- // Filter items based on search query
335- const filteredItems = useMemo ( ( ) => {
336- if ( ! searchQuery . trim ( ) ) return allItems
334+ const sectionOrder = useMemo < SearchItem [ 'type' ] [ ] > (
335+ ( ) => [ 'workspace' , 'workflow' , 'page' , 'tool' , 'trigger' , 'block' , 'doc' ] ,
336+ [ ]
337+ )
337338
338- const query = searchQuery . toLowerCase ( )
339- return allItems . filter (
340- ( item ) =>
341- item . name . toLowerCase ( ) . includes ( query ) || item . description ?. toLowerCase ( ) . includes ( query )
339+ // Filter items based on search query and enforce section ordering
340+ const filteredItems = useMemo ( ( ) => {
341+ const orderMap = sectionOrder . reduce < Record < SearchItem [ 'type' ] , number > > (
342+ ( acc , type , index ) => {
343+ acc [ type ] = index
344+ return acc
345+ } ,
346+ { } as Record < SearchItem [ 'type' ] , number >
342347 )
343- } , [ allItems , searchQuery ] )
348+
349+ const baseItems = ! searchQuery . trim ( )
350+ ? allItems
351+ : allItems . filter (
352+ ( item ) =>
353+ item . name . toLowerCase ( ) . includes ( searchQuery . toLowerCase ( ) ) ||
354+ item . description ?. toLowerCase ( ) . includes ( searchQuery . toLowerCase ( ) )
355+ )
356+
357+ return [ ...baseItems ] . sort ( ( a , b ) => {
358+ const aOrder = orderMap [ a . type ] ?? Number . MAX_SAFE_INTEGER
359+ const bOrder = orderMap [ b . type ] ?? Number . MAX_SAFE_INTEGER
360+ return aOrder - bOrder
361+ } )
362+ } , [ allItems , searchQuery , sectionOrder ] )
344363
345364 // Reset selected index when filtered items change
346365 useEffect ( ( ) => {
@@ -469,7 +488,7 @@ export function SearchModal({
469488 < Dialog open = { open } onOpenChange = { onOpenChange } >
470489 < DialogPortal >
471490 < DialogOverlay
472- className = 'bg-white/80 dark:bg-[#1b1b1b]/90'
491+ className = 'z-40 bg-white/80 dark:bg-[#1b1b1b]/90'
473492 style = { { backdropFilter : 'blur(4px)' } }
474493 />
475494 < DialogPrimitive . Content className = 'fixed top-[15%] left-[50%] z-50 flex w-[500px] translate-x-[-50%] flex-col gap-[12px] p-0 focus:outline-none focus-visible:outline-none' >
@@ -493,7 +512,8 @@ export function SearchModal({
493512 { /* Floating results container */ }
494513 { filteredItems . length > 0 ? (
495514 < div className = 'scrollbar-thin scrollbar-thumb-border scrollbar-track-transparent max-h-[400px] overflow-y-auto rounded-[10px] py-[10px] shadow-sm' >
496- { Object . entries ( groupedItems ) . map ( ( [ type , items ] ) => {
515+ { sectionOrder . map ( ( type ) => {
516+ const items = groupedItems [ type ] || [ ]
497517 if ( items . length === 0 ) return null
498518
499519 return (
0 commit comments