mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2025-11-14 08:42:08 +10:00
69 lines
2.0 KiB
TypeScript
69 lines
2.0 KiB
TypeScript
import { t } from "@lingui/macro";
|
|
import { ListIcon, SquaresFourIcon } from "@phosphor-icons/react";
|
|
import { ScrollArea, Tabs, TabsContent, TabsList, TabsTrigger } from "@reactive-resume/ui";
|
|
import { motion } from "framer-motion";
|
|
import { Helmet } from "react-helmet-async";
|
|
import { useLocalStorage } from "usehooks-ts";
|
|
|
|
import { GridView } from "./_layouts/grid";
|
|
import { ListView } from "./_layouts/list";
|
|
|
|
type Layout = "grid" | "list";
|
|
|
|
export const ResumesPage = () => {
|
|
const [layout, setLayout] = useLocalStorage<Layout>("dashboard-layout", "grid", {
|
|
initializeWithValue: true,
|
|
});
|
|
|
|
return (
|
|
<>
|
|
<Helmet>
|
|
<title>
|
|
{t`Resumes`} - {t`Reactive Resume`}
|
|
</title>
|
|
</Helmet>
|
|
|
|
<Tabs
|
|
value={layout}
|
|
className="space-y-4"
|
|
onValueChange={(value) => {
|
|
setLayout(value as Layout);
|
|
}}
|
|
>
|
|
<div className="flex items-center justify-between">
|
|
<motion.h1
|
|
initial={{ opacity: 0, x: -50 }}
|
|
animate={{ opacity: 1, x: 0 }}
|
|
className="text-4xl font-bold tracking-tight"
|
|
>
|
|
{t`Resumes`}
|
|
</motion.h1>
|
|
|
|
<TabsList>
|
|
<TabsTrigger value="grid" className="size-8 p-0 sm:h-8 sm:w-auto sm:px-4">
|
|
<SquaresFourIcon />
|
|
<span className="ml-2 hidden sm:block">{t`Grid`}</span>
|
|
</TabsTrigger>
|
|
<TabsTrigger value="list" className="size-8 p-0 sm:h-8 sm:w-auto sm:px-4">
|
|
<ListIcon />
|
|
<span className="ml-2 hidden sm:block">{t`List`}</span>
|
|
</TabsTrigger>
|
|
</TabsList>
|
|
</div>
|
|
|
|
<ScrollArea
|
|
allowOverflow
|
|
className="h-[calc(100vh-140px)] overflow-visible lg:h-[calc(100vh-88px)]"
|
|
>
|
|
<TabsContent value="grid">
|
|
<GridView />
|
|
</TabsContent>
|
|
<TabsContent value="list">
|
|
<ListView />
|
|
</TabsContent>
|
|
</ScrollArea>
|
|
</Tabs>
|
|
</>
|
|
);
|
|
};
|