chenzhaoyang
2025-12-17 063da0bf961e1d35e25dc107f883f7492f4c5a7c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
import type { Meta, StoryObj } from "@storybook/react";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "./tabs";
 
const meta: Meta<typeof Tabs> = {
  component: Tabs,
  title: "UI/Tabs",
  argTypes: {
    variant: {
      control: "select",
      options: ["default", "flat"],
      description: "Visual variant of the tabs",
    },
    defaultValue: {
      control: "text",
      description: "Default active tab",
    },
  },
};
 
export default meta;
type Story = StoryObj<typeof Tabs>;
 
/**
 * Default variant with pill-style tabs in a bordered container.
 * This variant features rounded corners, background colors, and a distinct active state.
 */
export const Default: Story = {
  args: {
    variant: "default",
    defaultValue: "tab1",
  },
  render: (args) => (
    <Tabs {...args}>
      <TabsList>
        <TabsTrigger value="tab1">Account</TabsTrigger>
        <TabsTrigger value="tab2">Password</TabsTrigger>
        <TabsTrigger value="tab3">Settings</TabsTrigger>
      </TabsList>
      <TabsContent value="tab1">
        <div className="p-wide border border-neutral-border rounded-smaller">
          <h3 className="text-heading-regular font-semibold mb-tight">Account Settings</h3>
          <p className="text-body-regular text-neutral-content-subtle">
            Manage your account settings and set email preferences.
          </p>
        </div>
      </TabsContent>
      <TabsContent value="tab2">
        <div className="p-wide border border-neutral-border rounded-smaller">
          <h3 className="text-heading-regular font-semibold mb-tight">Password</h3>
          <p className="text-body-regular text-neutral-content-subtle">
            Change your password here. After saving, you'll be logged out.
          </p>
        </div>
      </TabsContent>
      <TabsContent value="tab3">
        <div className="p-wide border border-neutral-border rounded-smaller">
          <h3 className="text-heading-regular font-semibold mb-tight">Settings</h3>
          <p className="text-body-regular text-neutral-content-subtle">
            Configure your application preferences and notifications.
          </p>
        </div>
      </TabsContent>
    </Tabs>
  ),
};
 
/**
 * Flat variant with underline indicator for active tabs.
 * This variant features a minimalist design with no background container,
 * perfect for navigation-style tabs.
 */
export const Flat: Story = {
  args: {
    variant: "flat",
    defaultValue: "existing",
  },
  render: (args) => (
    <Tabs {...args}>
      <TabsList>
        <TabsTrigger value="existing">Add Existing Members</TabsTrigger>
        <TabsTrigger value="invite">Invite Members</TabsTrigger>
      </TabsList>
      <TabsContent value="existing">
        <div className="p-wide border border-neutral-border rounded-smaller">
          <h3 className="text-heading-regular font-semibold mb-tight">Add Existing Members</h3>
          <p className="text-body-regular text-neutral-content-subtle">
            Select members from the organization to add to this project.
          </p>
        </div>
      </TabsContent>
      <TabsContent value="invite">
        <div className="p-wide border border-neutral-border rounded-smaller">
          <h3 className="text-heading-regular font-semibold mb-tight">Invite Members</h3>
          <p className="text-body-regular text-neutral-content-subtle">
            Send email invitations to new members to join this project.
          </p>
        </div>
      </TabsContent>
    </Tabs>
  ),
};
 
/**
 * Example with custom className overrides to demonstrate styling flexibility
 */
export const CustomStyling: Story = {
  args: {
    variant: "flat",
    defaultValue: "custom1",
  },
  render: (args) => (
    <div className="max-w-3xl p-widest bg-neutral-surface rounded-smaller">
      <Tabs {...args}>
        <TabsList className="border-b-4 border-neutral-300 gap-widest">
          <TabsTrigger
            value="custom1"
            className="text-heading-regular font-bold uppercase tracking-wide data-[state=active]:border-b-4 data-[state=active]:border-success data-[state=active]:text-success"
          >
            Dashboard
          </TabsTrigger>
          <TabsTrigger
            value="custom2"
            className="text-heading-regular font-bold uppercase tracking-wide data-[state=active]:border-b-4 data-[state=active]:border-success data-[state=active]:text-success"
          >
            Analytics
          </TabsTrigger>
          <TabsTrigger
            value="custom3"
            className="text-heading-regular font-bold uppercase tracking-wide data-[state=active]:border-b-4 data-[state=active]:border-success data-[state=active]:text-success"
          >
            Reports
          </TabsTrigger>
        </TabsList>
        <TabsContent value="custom1" className="mt-widest p-wider bg-success-surface rounded-small">
          <h3 className="text-heading-large font-bold text-success mb-tight">Dashboard Overview</h3>
          <p className="text-body-large text-neutral-content">
            This example shows how you can customize tabs with different colors, borders, spacing, and typography.
          </p>
        </TabsContent>
        <TabsContent value="custom2" className="mt-widest p-wider bg-success-surface rounded-small">
          <h3 className="text-heading-large font-bold text-success mb-tight">Analytics Data</h3>
          <p className="text-body-large text-neutral-content">
            Custom green theme with bold typography and larger spacing demonstrates the flexibility of the component.
          </p>
        </TabsContent>
        <TabsContent value="custom3" className="mt-widest p-wider bg-success-surface rounded-small">
          <h3 className="text-heading-large font-bold text-success mb-tight">Detailed Reports</h3>
          <p className="text-body-large text-neutral-content">
            You can override any aspect of the tabs styling to match your specific design requirements.
          </p>
        </TabsContent>
      </Tabs>
    </div>
  ),
};