(null);
+ const [searchQuery, setSearchQuery] = useState("");
// Load persisted state on mount; OmniProxy is pinned by default on first visit
useEffect(() => {
@@ -266,6 +269,11 @@ export default function Sidebar({
const activeHref = getActiveSidebarHref(pathname, allVisibleItems);
+ const isSearching = searchQuery.trim().length > 0;
+ const displaySections = isSearching
+ ? filterSidebarSectionsByQuery(visibleSections, searchQuery)
+ : visibleSections;
+
// Auto-expand the section containing the active page (without closing others)
useEffect(() => {
if (collapsed) return;
@@ -518,6 +526,21 @@ export default function Sidebar({
+ {!collapsed && (
+
+ setSearchQuery(e.target.value)}
+ placeholder={tc("search")}
+ aria-label={tc("search")}
+ icon="search"
+ className="gap-0"
+ inputClassName="py-1.5 text-xs"
+ />
+
+ )}
+