feat: update-layout & add uuid tool (#4)

Co-authored-by: typist <git@mail.typist.cc>
Reviewed-on: #4
This commit is contained in:
2025-10-28 00:55:42 +08:00
parent 0c54293312
commit 24594deecc
8 changed files with 107 additions and 37 deletions

View File

@@ -1,22 +1,32 @@
import { Sidebar, SidebarContent, SidebarFooter, SidebarHeader, SidebarMenuButton, SidebarMenuItem } from "@/components/ui/sidebar";
import { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarMenuButton, SidebarMenuItem } from "@/components/ui/sidebar";
import { tools } from "@/components/tool";
import { Link } from "react-router-dom";
export const AppSidebar = () => (
<Sidebar>
<SidebarHeader>
<SidebarHeader className="text-2xl font-bold flex justify-center items-center">
Lite Kit
</SidebarHeader>
<SidebarContent>
{
tools.map((tool) => (
<SidebarMenuItem key={tool.name}>
<SidebarMenuButton>
{tool.icon}
{tool.name}
</SidebarMenuButton>
</SidebarMenuItem>
))
}
<SidebarGroup>
<SidebarGroupLabel>
Tools
</SidebarGroupLabel>
<SidebarGroupContent>
{
tools.map((tool) => (
<SidebarMenuItem key={tool.name}>
<SidebarMenuButton asChild>
<Link to={`/tool/${tool.path}`} title={tool.description}>
{tool.icon}
{tool.name}
</Link>
</SidebarMenuButton>
</SidebarMenuItem>
))
}
</SidebarGroupContent>
</SidebarGroup>
</SidebarContent>
<SidebarFooter>
<a href="mailto:litek@mail.typist.cc">contact us</a>

View File

@@ -1,8 +1,14 @@
interface Tool {
name: string;
description: string;
icon: React.ReactNode;
component: React.ReactNode;
}
import { Hash } from 'lucide-react'
export const tools: Tool[] = [];
import type { Tool } from "./type";
import { UUID } from './uuid'
export const tools: Tool[] = [
{
path: "uuid",
name: "UUID Generator",
description: "Generate a UUID",
icon: <Hash />,
component: <UUID />,
}
];

View File

@@ -0,0 +1,9 @@
import type { ReactNode } from "react";
export interface Tool {
path: string;
name: string;
icon: ReactNode;
description: string;
component: ReactNode;
}

View File

@@ -0,0 +1,22 @@
import { type FC } from "react";
import * as uuid from 'uuid'
import { nanoid } from 'nanoid'
export const UUID: FC = () => {
return (
<div className="flex flex-col gap-4">
<span className="text-sm text-muted-foreground">Refresh the page to generate new UUID</span>
<label>UUID Version 1</label>
<span>{uuid.v1()}</span>
<label>UUID Version 4</label>
<span>{uuid.v4()}</span>
<label>UUID Version 6</label>
<span>{uuid.v6()}</span>
<label>UUID Version 7</label>
<span>{uuid.v7()}</span>
<label>Nano ID</label>
<span>{nanoid()}</span>
</div>
);
};

View File

@@ -1,14 +1,20 @@
import { SidebarProvider, SidebarTrigger } from "@/components/ui/sidebar"
import { Sidebar } from "@/components/ui/sidebar"
import type { FC } from "react"
import { Outlet } from "react-router-dom";
import { SidebarProvider, SidebarTrigger } from "@/components/ui/sidebar"
import { AppSidebar } from "@/components/sidebar";
export const Layout: FC = () => (
<SidebarProvider>
<Sidebar />
<main>
<SidebarTrigger />
<Outlet />
</main>
<AppSidebar />
<div className="p-4 flex flex-col w-full h-[100vh]">
<nav className="flex items-center justify-between">
<SidebarTrigger className="size-10" />
<div role="actions" />
</nav>
<main className="flex-1 overflow-auto p-4">
<Outlet />
</main>
</div>
</SidebarProvider>
);

View File

@@ -4,8 +4,8 @@ import {
RouterProvider,
} from "react-router-dom";
import { Layout } from "./layout";
import { tools } from "@/components/tool";
import { Layout } from "./layout";
// 路由配置
const router = createBrowserRouter([
@@ -14,17 +14,17 @@ const router = createBrowserRouter([
element: <Layout />,
children: [
{
path: "tools",
path: "tool",
children: [
...tools.map((tool) => (
{
path: tool.name,
path: tool.path,
element: tool.component,
}
)),
{
index: true,
element: null,
loader: () => redirect("/tool/uuid"),
},
]
},
@@ -32,15 +32,11 @@ const router = createBrowserRouter([
},
{
index: true,
loader: () => {
return redirect("/tools");
},
loader: () => redirect("/tool"),
},
{
path: "*",
loader: () => {
return redirect("/tools");
},
loader: () => redirect("/tool"),
},
]);