diff --git a/app/components/TabLink.tsx b/app/components/TabLink.tsx index 2b31284..6b4ff4a 100644 --- a/app/components/TabLink.tsx +++ b/app/components/TabLink.tsx @@ -1,7 +1,8 @@ import { NavLink } from '@remix-run/react' -import clsx from 'clsx' import type { ReactNode } from 'react' +import { cn } from '~/utils/cn' + type Properties = { readonly name: string; readonly to: string; @@ -12,13 +13,20 @@ export default function TabLink({ name, to, icon }: Properties) { return ( clsx( - 'flex items-center gap-x-2 p-2 border-b-2 text-md text-nowrap', - isActive ? 'border-white' : 'border-transparent', - isPending && 'animate-pulse' + prefetch='intent' + className={({ isActive }) => cn( + 'border-b-2 py-1.5', + isActive ? 'border-white' : 'border-transparent' )} > - {icon} {name} +
+ {icon} {name} +
) } diff --git a/app/routes/_data.tsx b/app/routes/_data.tsx index 7d5dd92..e177cc6 100644 --- a/app/routes/_data.tsx +++ b/app/routes/_data.tsx @@ -1,8 +1,10 @@ import { type LoaderFunctionArgs, redirect } from '@remix-run/node' -import { Outlet, useLoaderData } from '@remix-run/react' +import { Outlet, useLoaderData, useNavigation } from '@remix-run/react' +import { ProgressBar } from 'react-aria-components' import { ErrorPopup } from '~/components/Error' import Header from '~/components/Header' +import { cn } from '~/utils/cn' import { getContext } from '~/utils/config' import { HeadscaleError, pull } from '~/utils/headscale' import { destroySession, getSession } from '~/utils/sessions' @@ -40,11 +42,22 @@ export async function loader({ request }: LoaderFunctionArgs) { export default function Layout() { const data = useLoaderData() + const nav = useNavigation() return ( <> + +
+
-
diff --git a/tailwind.config.ts b/tailwind.config.ts index f8dab8a..e07946d 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -24,6 +24,19 @@ export default { colors: { main: colors.slate, ui: colors.neutral + }, + keyframes: { + loader: { + from: { + transform: 'translateX(-100%)' + }, + to: { + transform: 'translateX(100%)' + } + } + }, + animation: { + loading: 'loader 0.8s infinite ease-in-out' } } },