TopNav search bar: Replaced the fake button (openCatalogSearch("collection")) with a real <input> element. The input has a left-aligned clickable search icon and is styled as a proper search bar (w-48 lg:w-64). On Enter or icon click, useNavigate() routes to /global-items with the query as a q search param. Input clears after navigation. Desktop-only (hidden md:flex).
Global items catalog page: Route now declares validateSearch: z.object({ q: z.string().optional().catch(undefined) }). The component reads { q } = Route.useSearch() and passes it directly to useGlobalItems(q || undefined). The local searchInput state, debouncedQuery state, debounce useEffect, and the entire search input UI block have been removed. When q is present, a "Showing results for X" label appears below the title. Empty state message switches based on whether q is set.