Skip to content

Commit e8808ae

Browse files
feat: add tabs (#56)
1 parent 60de2b9 commit e8808ae

File tree

8 files changed

+137
-1
lines changed

8 files changed

+137
-1
lines changed

.changeset/chatty-bikes-clap.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@zenml-io/react-component-library": minor
3+
---
4+
5+
add tabs

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@
8888
"@radix-ui/react-collapsible": "^1.0.3",
8989
"@radix-ui/react-dropdown-menu": "^2.0.6",
9090
"@radix-ui/react-slot": "^1.0.2",
91+
"@radix-ui/react-tabs": "^1.0.4",
9192
"@tanstack/react-table": "^8.15.3",
9293
"class-variance-authority": "^0.7.0",
9394
"clsx": "^2.1.0",

pnpm-lock.yaml

+30
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/components/Tabs/Tabs.stories.tsx

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { Meta } from "@storybook/react";
2+
import React from "react";
3+
import { Tabs, TabsContent, TabsList, TabsTrigger } from "./index";
4+
import { StoryObj } from "@storybook/react";
5+
6+
const meta = {
7+
title: "Elements/Tabs",
8+
component: Tabs,
9+
argTypes: {},
10+
parameters: {
11+
layout: "centered"
12+
},
13+
14+
tags: ["autodocs"]
15+
} satisfies Meta<typeof Tabs>;
16+
17+
export default meta;
18+
19+
type Story = StoryObj<typeof meta>;
20+
21+
export const DefaultVariant: Story = {
22+
name: "Tabs",
23+
render: () => (
24+
<Tabs defaultValue="tab1">
25+
<TabsList>
26+
<TabsTrigger className="text-text-md" value="tab1">
27+
<span>Tab 1</span>
28+
</TabsTrigger>
29+
<TabsTrigger className="text-text-md" value="tab2">
30+
<span>Tab 2</span>
31+
</TabsTrigger>
32+
<TabsTrigger className="text-text-md" value="tab3">
33+
<span>Tab 3</span>
34+
</TabsTrigger>
35+
</TabsList>
36+
37+
<TabsContent className="m-0 mt-5 border-0 bg-white p-0 h-[500px]" value="tab1">
38+
<div>Tab Content 1</div>
39+
</TabsContent>
40+
<TabsContent className="m-0 mt-5 border-0 bg-white p-0 h-[500px]" value="tab2">
41+
<div>Tab Content 2</div>
42+
</TabsContent>
43+
<TabsContent className="m-0 mt-5 border-0 bg-white p-0 h-[500px]" value="tab3">
44+
<div>Tab Content 3</div>
45+
</TabsContent>
46+
</Tabs>
47+
)
48+
};

src/components/Tabs/Tabs.tsx

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import * as React from "react";
2+
import * as TabsPrimitive from "@radix-ui/react-tabs";
3+
import { cn } from "../../utilities";
4+
5+
const Tabs = TabsPrimitive.Root;
6+
7+
const TabsList = React.forwardRef<
8+
React.ElementRef<typeof TabsPrimitive.List>,
9+
React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>
10+
>(({ className, ...props }, ref) => (
11+
<TabsPrimitive.List
12+
ref={ref}
13+
className={cn("flex shrink-0 flex-wrap justify-start border-b text-text-sm", className)}
14+
{...props}
15+
/>
16+
));
17+
TabsList.displayName = TabsPrimitive.List.displayName;
18+
19+
const TabsTrigger = React.forwardRef<
20+
React.ElementRef<typeof TabsPrimitive.Trigger>,
21+
React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>
22+
>(({ className, ...props }, ref) => (
23+
<TabsPrimitive.Trigger
24+
ref={ref}
25+
className={cn(
26+
"group/trigger px-3 py-2 data-[state=active]:text-theme-text-brand data-[state=active]:shadow-inner data-[state=active]:shadow-primary-400 hover:data-[state=inactive]:shadow-inner hover:data-[state=inactive]:shadow-neutral-200",
27+
className
28+
)}
29+
{...props}
30+
/>
31+
));
32+
TabsTrigger.displayName = TabsPrimitive.Trigger.displayName;
33+
34+
const TabsContent = React.forwardRef<
35+
React.ElementRef<typeof TabsPrimitive.Content>,
36+
React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>
37+
>(({ className, ...props }, ref) => (
38+
<TabsPrimitive.Content
39+
ref={ref}
40+
className={cn(
41+
"mt-5 grow rounded-md border border-theme-border-moderate bg-white p-7 outline-none",
42+
className
43+
)}
44+
{...props}
45+
/>
46+
));
47+
TabsContent.displayName = TabsPrimitive.Content.displayName;
48+
49+
export { Tabs, TabsList, TabsTrigger, TabsContent };

src/components/Tabs/index.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from "./Tabs";

src/components/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ export * from "./Table";
99
export * from "./Tag";
1010
export * from "./Badge";
1111
export * from "./Spinner";
12+
export * from "./Tabs";
1213
export * from "./Collapsible";

src/tailwind/index.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,8 @@ export const zenmlPlugin = plugin(
359359
}
360360
},
361361
boxShadow: {
362-
sm: "0px 0px 4px 0px rgba(0, 0, 0, 0.10)"
362+
sm: "0px 0px 4px 0px rgba(0, 0, 0, 0.10)",
363+
inner: "inset 0 -2px 0 0,0 2px 0 0"
363364
},
364365
backgroundImage: {
365366
"gradient-dark":

0 commit comments

Comments
 (0)