import { useEffect, useState } from 'react'; import { Link, Outlet, useNavigate, useRouterState } from '@tanstack/react-router'; import { parseAsStringEnum, useQueryState } from 'nuqs'; import { NuqsAdapter } from 'nuqs/adapters/tanstack-router'; import { Menu, Moon, Package, PackagePlus, RefreshCw, Sun, X } from 'lucide-react'; import { Button, buttonVariants } from '../components/ui/button'; import { Toaster } from '../components/ui/sonner'; import { INSTALL_DIALOG_EVENT, THEME_STORAGE_KEY } from './constants'; import { AnimatedText, Spinner } from './components'; import { DashboardDataProvider, useDashboardActions } from './data'; import type { ScopeFilter, Theme } from './types'; import { getThemeFromDom, scopeLabel } from './utils'; export function RootLayout() { const [theme, setTheme] = useState(getThemeFromDom); useEffect(() => { setTheme(getThemeFromDom()); }, []); return (
); } function TopBar(props: { theme: Theme; onThemeChange: (theme: Theme) => void }) { const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); const pathname = useRouterState({ select: (state) => state.location.pathname, }); const navigate = useNavigate(); const { isRefreshing, refresh } = useDashboardActions(); const [scopeFilter, setScopeFilter] = useQueryState( 'scope', parseAsStringEnum(['all', 'project', 'global']).withDefault('all') ); const isBrowseActive = pathname === '/' || pathname.startsWith('/skill/'); const showScopeFilter = pathname === '/'; const toggleTheme = () => { const nextTheme: Theme = props.theme === 'dark' ? 'light' : 'dark'; document.documentElement.classList.toggle('dark', nextTheme === 'dark'); localStorage.setItem(THEME_STORAGE_KEY, nextTheme); props.onThemeChange(nextTheme); }; const openInstallDialog = () => { if (pathname !== '/') { void navigate({ to: '/', search: (previous) => ({ ...previous, install: '1' }), }); return; } window.dispatchEvent(new Event(INSTALL_DIALOG_EVENT)); }; const handleRefresh = () => { void refresh().catch(() => undefined); }; return (
Skills Browser
{isMobileMenuOpen ? ( ) : null}
); }