Tabs
pure-ui/tabsFreeComponent
A customizable tabs component
Install it
npx shadcn@latest add https://raw.githubusercontent.com/MusKRI/pure-ui/main/public/r/tabs.jsonSource
1"use client";23import { createContext, useContext, useEffect, useRef, useState } from "react";4import { Tabs as TabsPrimitive } from "@base-ui/react/tabs";56import { cn } from "@/lib/classes";78type TabsVariant = "segmented" | "underline" | "card";910function isValidVariant(variant: TabsVariant): variant is TabsVariant {11 return (12 variant === "segmented" || variant === "underline" || variant === "card"13 );14}1516interface TabsContextType {17 variant?: TabsVariant;18}1920const TabsContext = createContext<TabsContextType>({21 variant: "segmented",22});2324function useTabs() {25 const context = useContext(TabsContext);26 if (!context) {27 throw new Error("useTabs must be used within a Tabs component");28 }29 return context;30}3132interface TabsProps extends TabsPrimitive.Root.Props {33 variant?: TabsVariant;34}3536function Tabs({ className, variant = "segmented", ...props }: TabsProps) {37 const finalVariant = isValidVariant(variant) ? variant : "segmented";3839 return (40 <TabsContext.Provider value={{ variant: finalVariant }}>41 <TabsPrimitive.Root42 data-slot="tabs"43 className={cn(44 "flex gap-2 data-[orientation=vertical]:flex-row data-[orientation=horizontal]:flex-col",45 className46 )}47 {...props}48 />49 </TabsContext.Provider>50 );51}5253interface TabsListProps extends TabsPrimitive.List.Props {}5455function TabsList({ className, children, ...props }: TabsListProps) {56 const { variant } = useTabs();5758 return (59 <TabsPrimitive.List60 data-slot="tabs-list"61 className={cn(62 "relative z-0 flex max-w-full w-fit items-center justify-start gap-x-0.5 text-muted-foreground data-[orientation=vertical]:flex-col max-sm:data-[orientation=horizontal]:overflow-x-auto max-sm:data-[orientation=horizontal]:overflow-y-hidden",63 variant === "segmented" && "rounded-[12px] bg-muted p-1",64 variant === "underline" &&65 "data-[orientation=vertical]:px-1 data-[orientation=horizontal]:py-1",66 variant === "card" && "p-1",67 className68 )}69 {...props}70 >71 {children}72 <TabsPrimitive.Indicator73 data-slot="tabs-indicator"74 className={cn(75// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from Pure UI
All 291 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Accordionaccordion | Pure UI | Components | Free | 4 deps | |
| Avataravatar | Pure UI | Components | Free | 3 deps | |
| Badgebadge | Pure UI | Components | Free | 4 deps | |
| Buttonbutton | Pure UI | Components | Free | 4 deps | |
| Button Groupbutton-group | Pure UI | Components | Free | 4 deps | |
| Calendarcalendar | Pure UI | Components | Free | 4 deps | |
| Cardcard | Pure UI | Components | Free | 2 deps | |
| Checkboxcheckbox | Pure UI | Components | Free | 4 deps |
