From 0576d6e61c3f9ce85d9baad88ec6b06f08fe932c Mon Sep 17 00:00:00 2001 From: toanhoang Date: Mon, 3 Aug 2026 06:36:16 -0400 Subject: [PATCH] feat: add shared UI nav + fetch hook + table/select/label/textarea primitives Basic infra for a functional (no-polish) UI pass over existing entity APIs. --- src/app/layout.tsx | 16 ++- src/components/nav.tsx | 55 ++++++++++ src/components/ui/label.tsx | 24 +++++ src/components/ui/select.tsx | 190 +++++++++++++++++++++++++++++++++ src/components/ui/table.tsx | 116 ++++++++++++++++++++ src/components/ui/textarea.tsx | 18 ++++ src/hooks/use-api-list.ts | 91 ++++++++++++++++ 7 files changed, 508 insertions(+), 2 deletions(-) create mode 100644 src/components/nav.tsx create mode 100644 src/components/ui/label.tsx create mode 100644 src/components/ui/select.tsx create mode 100644 src/components/ui/table.tsx create mode 100644 src/components/ui/textarea.tsx create mode 100644 src/hooks/use-api-list.ts diff --git a/src/app/layout.tsx b/src/app/layout.tsx index a7b38f0..a4199e0 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,15 +1,27 @@ import type { ReactNode } from "react"; import "./globals.css"; +import { auth } from "@/auth"; +import { Nav } from "@/components/nav"; export const metadata = { title: "Asset & License Management", description: "Internal IT asset & license management — Ubisoft VN local IT", }; -export default function RootLayout({ children }: { children: ReactNode }) { +// Root layout wraps every route, including /login (middleware.ts can't +// exclude it — it's the one page unauthenticated users must be able to +// reach). Gate