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'
}
}
},