tab for tabs

This commit is contained in:
2026-02-07 17:24:10 +00:00
parent f85eb7628d
commit 29628591a0

View File

@@ -26,6 +26,9 @@ const asciiFiles = [
"cat-loaf.txt", "cat-loaf.txt",
]; ];
const homeTabs = ["work", "travel"] as const;
type HomeTab = (typeof homeTabs)[number];
function App() { function App() {
return ( return (
<Routes> <Routes>
@@ -42,6 +45,7 @@ function Home() {
const isDevMode = import.meta.env.VITE_PUBLIC_DEV === "1"; const isDevMode = import.meta.env.VITE_PUBLIC_DEV === "1";
const navigate = useNavigate(); const navigate = useNavigate();
const [asciiArt, setAsciiArt] = useState(""); const [asciiArt, setAsciiArt] = useState("");
const [activeTab, setActiveTab] = useState<HomeTab>("work");
const [activeIndex, setActiveIndex] = useState<number | null>(null); const [activeIndex, setActiveIndex] = useState<number | null>(null);
const [hasPointerInteraction, setHasPointerInteraction] = useState(false); const [hasPointerInteraction, setHasPointerInteraction] = useState(false);
const [asciiFile] = useState( const [asciiFile] = useState(
@@ -82,6 +86,18 @@ function Home() {
const handleKeyDown = (event: KeyboardEvent) => { const handleKeyDown = (event: KeyboardEvent) => {
if (event.defaultPrevented || event.isComposing) return; if (event.defaultPrevented || event.isComposing) return;
if (event.metaKey || event.ctrlKey || event.altKey) return; if (event.metaKey || event.ctrlKey || event.altKey) return;
if (event.key === "Tab") {
event.preventDefault();
setActiveTab((prev) => {
const currentIndex = homeTabs.indexOf(prev);
const safeIndex = currentIndex === -1 ? 0 : currentIndex;
const nextIndex = (safeIndex + 1) % homeTabs.length;
return homeTabs[nextIndex];
});
return;
}
if (isInteractiveTarget(event.target)) return; if (isInteractiveTarget(event.target)) return;
const key = event.key.length === 1 ? event.key.toLowerCase() : event.key; const key = event.key.length === 1 ? event.key.toLowerCase() : event.key;
@@ -181,38 +197,41 @@ function Home() {
Age: <TimeSince date={new Date(2004, 10, 4, 11, 47, 0)} /> Age: <TimeSince date={new Date(2004, 10, 4, 11, 47, 0)} />
</div> </div>
</div> </div>
<Tabs defaultValue="work" className="w-full max-w-5xl gap-0"> <Tabs
<TabsContent value="work" className="-mb-[1.5px] p-2 border"> value={activeTab}
<div className="grid grid-cols-1 gap-2 md:grid-cols-2"> onValueChange={(value) => setActiveTab(value as HomeTab)}
{visibleProjects.map((project, index) => ( className="w-full max-w-5xl gap-0"
<ProjectListItem >
key={project.metadata.slug}
metadata={project.metadata}
isDevMode={isDevMode}
isActive={activeIndex !== null && index === activeIndex}
enableHover={hasPointerInteraction}
/>
))}
</div>
</TabsContent>
<TabsContent value="travel" className="-mb-[1.5px] p-2 border">
test{" "}
</TabsContent>
<TabsList variant="line" className="h-auto w-full gap-0 p-0"> <TabsList variant="line" className="h-auto w-full gap-0 p-0">
<TabsTrigger <TabsTrigger
value="work" value={homeTabs[0]}
className="border-border -mr-[1px] after:hidden data-[state=active]:text-accent" className="border-border -mr-[1px] after:hidden data-[state=active]:text-accent"
> >
Work Work
</TabsTrigger> </TabsTrigger>
<TabsTrigger <TabsTrigger
value="travel" value={homeTabs[1]}
className="border-border after:hidden data-[state=active]:text-accent" className="border-border after:hidden data-[state=active]:text-accent"
> >
Travel Travel
</TabsTrigger> </TabsTrigger>
</TabsList> </TabsList>
<TabsContent value="travel" className="pt-2" /> <div className="-mt-[1.5px] p-2 border">
<TabsContent value={homeTabs[0]}>
<div className="grid grid-cols-1 gap-2 md:grid-cols-2">
{visibleProjects.map((project, index) => (
<ProjectListItem
key={project.metadata.slug}
metadata={project.metadata}
isDevMode={isDevMode}
isActive={activeIndex !== null && index === activeIndex}
enableHover={hasPointerInteraction}
/>
))}
</div>
</TabsContent>
<TabsContent value={homeTabs[1]}>test </TabsContent>
</div>
</Tabs> </Tabs>
<div className="w-full max-w-5xl grid grid-cols-1 md:grid-cols-[1fr_auto_1fr] items-center gap-3 md:gap-4"> <div className="w-full max-w-5xl grid grid-cols-1 md:grid-cols-[1fr_auto_1fr] items-center gap-3 md:gap-4">
<div className="flex items-center gap-6"> <div className="flex items-center gap-6">