@dust-tt/sparkle 0.2.281 → 0.2.282-rc-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,130 +0,0 @@
1
- import React from "react";
2
- import { noHrefLink, SparkleContext, } from "../context";
3
- import { ChevronRightIcon } from "../icons";
4
- import { classNames } from "../lib/utils";
5
- import { Icon } from "./Icon";
6
- import { Tooltip } from "./Tooltip";
7
- var tabClasses = {
8
- default: {
9
- base: "s-text-element-800 s-border-transparent s-cursor-pointer s-border-b-2",
10
- hover: "hover:s-text-action-500 hover:s-border-action-300",
11
- dark: {
12
- base: "dark:s-text-element-700-dark",
13
- hover: "dark:hover:s-text-action-600-dark",
14
- },
15
- },
16
- selected: {
17
- base: "s-border-action-500 s-text-action-500 s-cursor-default s-border-b-2",
18
- hover: "",
19
- dark: {
20
- base: "dark:s-border-action-500-dark dark:s-text-action-500-dark",
21
- hover: "",
22
- },
23
- },
24
- stepperDefault: {
25
- base: "s-text-element-800 s-cursor-pointer",
26
- hover: "hover:s-text-action-500",
27
- dark: {
28
- base: "dark:s-text-element-700-dark",
29
- hover: "dark:hover:s-text-action-600-dark",
30
- },
31
- },
32
- stepperSelected: {
33
- base: "s-text-action-500 s-cursor-default",
34
- hover: "",
35
- dark: {
36
- base: "dark:dark:s-text-action-500-dark",
37
- hover: "",
38
- },
39
- },
40
- };
41
- var iconClasses = {
42
- default: {
43
- base: "s-text-element-600",
44
- hover: "group-hover/tab:s-text-action-400",
45
- dark: {
46
- base: "dark:s-text-element-600-dark",
47
- hover: "dark:group-hover/tab:s-text-action-500-dark",
48
- },
49
- },
50
- selected: {
51
- base: "s-text-action-400",
52
- hover: "",
53
- dark: {
54
- base: "dark:s-text-action-500-dark",
55
- hover: "",
56
- },
57
- },
58
- };
59
- var tabSizingClasses = {
60
- hug: "",
61
- expand: "s-flex-1",
62
- };
63
- /**
64
- * Tab component displaying a list of tabs.
65
- *
66
- * Tab click action is specified:
67
- * - either per tab, by providing either an href or an onClick handler in tab
68
- * data (mutually exclusive);
69
- * - or globally, by providing a setCurrentTab function.
70
- * Both per-tab and global actions can be set, the per-tab action taking precedence.
71
- */
72
- export function Tab(_a) {
73
- var _b = _a.variant, variant = _b === void 0 ? "default" : _b, tabs = _a.tabs, setCurrentTab = _a.setCurrentTab, className = _a.className, _c = _a.tabClassName, tabClassName = _c === void 0 ? "" : _c;
74
- var components = React.useContext(SparkleContext).components;
75
- var renderTabs = function () {
76
- return tabs.map(function (tab, i) {
77
- var _a, _b, _c, _d, _e;
78
- var tabStateClasses = variant === "stepper"
79
- ? tab.current
80
- ? tabClasses.stepperSelected
81
- : tabClasses.stepperDefault
82
- : tab.current
83
- ? tabClasses.selected
84
- : tabClasses.default;
85
- var iconStateClasses = tab.current
86
- ? iconClasses.selected
87
- : iconClasses.default;
88
- var finalTabClasses = classNames("s-group/tab s-justify-center s-flex s-text-sm s-font-semibold s-py-2.5 s-transition-all ease-out s-duration-400 s-whitespace-nowrap s-select-none", variant === "default"
89
- ? tab.icon
90
- ? tab.hideLabel
91
- ? "s-px-3"
92
- : "s-pr-3.5 s-pl-2.5"
93
- : "s-px-3"
94
- : "s-pl-1", tabStateClasses.base, tabStateClasses.hover, tabStateClasses.dark.base, tabStateClasses.dark.hover, tabClassName, tab.disabled ? "s-opacity-50 s-pointer-events-none" : "");
95
- var finalIconClasses = classNames("s-transition-colors s-duration-400", iconStateClasses.base, iconStateClasses.hover, iconStateClasses.dark.base, iconStateClasses.dark.hover, tabClassName);
96
- var Link = tab.href
97
- ? components.link
98
- : noHrefLink;
99
- // precedence on href and onClick (mutually exclusive), then setCurrentTab
100
- var setCurrentTabFn = function (e) {
101
- if (!tab.id) {
102
- throw new Error("Tab id is required to use setCurrentTab");
103
- }
104
- setCurrentTab === null || setCurrentTab === void 0 ? void 0 : setCurrentTab(tab.id, e);
105
- };
106
- var onClickAction = tab.href
107
- ? undefined
108
- : (_a = tab.onClick) !== null && _a !== void 0 ? _a : setCurrentTabFn;
109
- var content = (React.createElement(Link, { key: tab.label, className: finalTabClasses, "aria-current": tab.current ? "page" : undefined, onClick: onClickAction, href: tab.href || "#" },
110
- React.createElement("div", { className: tab.current
111
- ? "s-flex s-gap-x-2"
112
- : "s-flex s-gap-x-2 s-transition s-duration-300 s-ease-out" },
113
- tab.icon && (React.createElement(Icon, { visual: tab.icon, className: finalIconClasses, size: "sm" })), (_b = tab.hideLabel) !== null && _b !== void 0 ? _b : tab.label,
114
- variant === "stepper" && i < tabs.length - 1 && (React.createElement(Icon, { visual: ChevronRightIcon, className: "s-mx-2 s-text-element-500", size: "sm" })))));
115
- return tab.hideLabel ? (tab.label ? (React.createElement(React.Fragment, { key: "tab-".concat(i) },
116
- React.createElement("div", { className: tabSizingClasses[(_c = tab.sizing) !== null && _c !== void 0 ? _c : "hug"] },
117
- React.createElement(Tooltip, { trigger: content, label: tab.label })),
118
- tab.hasSeparator && (React.createElement("div", { className: "s-flex s-h-full s-grow", key: "sep-".concat(i) })))) : (React.createElement(React.Fragment, { key: "tab-".concat(i) },
119
- React.createElement("div", { className: tabSizingClasses[(_d = tab.sizing) !== null && _d !== void 0 ? _d : "hug"] }, content),
120
- tab.hasSeparator && (React.createElement("div", { className: "s-flex s-h-full s-grow", key: "sep-".concat(i) }))))) : (React.createElement(React.Fragment, { key: "tab-".concat(i) },
121
- React.createElement("div", { className: tabSizingClasses[(_e = tab.sizing) !== null && _e !== void 0 ? _e : "hug"] }, content),
122
- tab.hasSeparator && (React.createElement("div", { className: "s-flex s-h-full s-grow", key: "sep-".concat(i) }))));
123
- });
124
- };
125
- return (React.createElement("div", { className: classNames(variant === "default"
126
- ? "s-border-b s-border-structure-200 dark:s-border-structure-200-dark"
127
- : "", className !== null && className !== void 0 ? className : "", "s-overflow-x-auto s-overflow-y-hidden s-scrollbar-hide") },
128
- React.createElement("nav", { className: "s-flex s-space-x-0", "aria-label": "Tabs" }, renderTabs())));
129
- }
130
- //# sourceMappingURL=Tab.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Tab.js","sourceRoot":"","sources":["../../../src/components/Tab.tsx"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- import React from "react";
2
- import { Tab } from "../index_with_tw_base";
3
- declare const meta: {
4
- title: string;
5
- component: typeof Tab;
6
- };
7
- export default meta;
8
- export declare const TabExample: () => React.JSX.Element;
9
- //# sourceMappingURL=Tab.stories.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Tab.stories.d.ts","sourceRoot":"","sources":["../../../src/stories/Tab.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAIL,GAAG,EAEJ,MAAM,uBAAuB,CAAC;AAM/B,QAAA,MAAM,IAAI;;;CAGkB,CAAC;AAE7B,eAAe,IAAI,CAAC;AAEpB,eAAO,MAAM,UAAU,yBAiFtB,CAAC"}
@@ -1,80 +0,0 @@
1
- import { __read } from "tslib";
2
- import React from "react";
3
- import { CircleIcon, RobotIcon, SquareIcon, Tab, TriangleIcon, } from "../index_with_tw_base";
4
- import { ChatBubbleBottomCenterTextIcon, Cog6ToothIcon, } from "../index_with_tw_base";
5
- var meta = {
6
- title: "Components/Tab",
7
- component: Tab,
8
- };
9
- export default meta;
10
- export var TabExample = function () {
11
- var _a = __read(React.useState("chat"), 2), currentTab = _a[0], setCurrentTab = _a[1];
12
- var _b = __read(React.useState("instructions"), 2), currentTab2 = _b[0], setCurrentTab2 = _b[1];
13
- return (React.createElement("div", { className: "s-flex s-flex-col s-gap-10" },
14
- React.createElement("div", { className: "s-w-[320px]" },
15
- React.createElement(Tab, { tabs: [
16
- {
17
- label: "Chat",
18
- id: "chat",
19
- current: currentTab === "chat",
20
- icon: ChatBubbleBottomCenterTextIcon,
21
- sizing: "expand",
22
- },
23
- {
24
- label: "Build",
25
- id: "build",
26
- current: currentTab === "build",
27
- icon: RobotIcon,
28
- sizing: "expand",
29
- },
30
- {
31
- label: "Admin",
32
- id: "admin",
33
- current: currentTab === "admin",
34
- icon: RobotIcon,
35
- sizing: "expand",
36
- hasSeparator: true,
37
- disabled: true,
38
- },
39
- {
40
- label: "Settings",
41
- id: "settings",
42
- hideLabel: true,
43
- current: false,
44
- icon: Cog6ToothIcon,
45
- },
46
- ], setCurrentTab: function (tabId, event) {
47
- // add logic here
48
- event.preventDefault();
49
- setCurrentTab(tabId);
50
- } })),
51
- React.createElement("div", { className: "s-w-full" },
52
- React.createElement(Tab, { variant: "stepper", tabs: [
53
- {
54
- label: "Instructions",
55
- id: "instructions",
56
- current: currentTab2 === "instructions",
57
- icon: SquareIcon,
58
- sizing: "hug",
59
- },
60
- {
61
- label: "Data sources & Actions",
62
- id: "data",
63
- current: currentTab2 === "data",
64
- icon: CircleIcon,
65
- sizing: "hug",
66
- },
67
- {
68
- label: "Naming",
69
- id: "naming",
70
- current: currentTab2 === "naming",
71
- icon: TriangleIcon,
72
- sizing: "hug",
73
- },
74
- ], setCurrentTab: function (tabId, event) {
75
- // add logic here
76
- event.preventDefault();
77
- setCurrentTab2(tabId);
78
- } }))));
79
- };
80
- //# sourceMappingURL=Tab.stories.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Tab.stories.js","sourceRoot":"","sources":["../../../src/stories/Tab.stories.tsx"],"names":[],"mappings":";AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EACL,UAAU,EACV,SAAS,EACT,UAAU,EACV,GAAG,EACH,YAAY,GACb,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,8BAA8B,EAC9B,aAAa,GACd,MAAM,uBAAuB,CAAC;AAE/B,IAAM,IAAI,GAAG;IACX,KAAK,EAAE,gBAAgB;IACvB,SAAS,EAAE,GAAG;CACY,CAAC;AAE7B,eAAe,IAAI,CAAC;AAEpB,MAAM,CAAC,IAAM,UAAU,GAAG;IAClB,IAAA,KAAA,OAA8B,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAA,EAAnD,UAAU,QAAA,EAAE,aAAa,QAA0B,CAAC;IACrD,IAAA,KAAA,OAAgC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAA,EAA7D,WAAW,QAAA,EAAE,cAAc,QAAkC,CAAC;IACrE,OAAO,CACL,6BAAK,SAAS,EAAC,4BAA4B;QACzC,6BAAK,SAAS,EAAC,aAAa;YAC1B,oBAAC,GAAG,IACF,IAAI,EAAE;oBACJ;wBACE,KAAK,EAAE,MAAM;wBACb,EAAE,EAAE,MAAM;wBACV,OAAO,EAAE,UAAU,KAAK,MAAM;wBAC9B,IAAI,EAAE,8BAA8B;wBACpC,MAAM,EAAE,QAAQ;qBACjB;oBACD;wBACE,KAAK,EAAE,OAAO;wBACd,EAAE,EAAE,OAAO;wBACX,OAAO,EAAE,UAAU,KAAK,OAAO;wBAC/B,IAAI,EAAE,SAAS;wBACf,MAAM,EAAE,QAAQ;qBACjB;oBACD;wBACE,KAAK,EAAE,OAAO;wBACd,EAAE,EAAE,OAAO;wBACX,OAAO,EAAE,UAAU,KAAK,OAAO;wBAC/B,IAAI,EAAE,SAAS;wBACf,MAAM,EAAE,QAAQ;wBAChB,YAAY,EAAE,IAAI;wBAClB,QAAQ,EAAE,IAAI;qBACf;oBACD;wBACE,KAAK,EAAE,UAAU;wBACjB,EAAE,EAAE,UAAU;wBACd,SAAS,EAAE,IAAI;wBACf,OAAO,EAAE,KAAK;wBACd,IAAI,EAAE,aAAa;qBACpB;iBACF,EACD,aAAa,EAAE,UAAC,KAAK,EAAE,KAAK;oBAC1B,iBAAiB;oBACjB,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvB,aAAa,CAAC,KAAK,CAAC,CAAC;gBACvB,CAAC,GACD,CACE;QACN,6BAAK,SAAS,EAAC,UAAU;YACvB,oBAAC,GAAG,IACF,OAAO,EAAC,SAAS,EACjB,IAAI,EAAE;oBACJ;wBACE,KAAK,EAAE,cAAc;wBACrB,EAAE,EAAE,cAAc;wBAClB,OAAO,EAAE,WAAW,KAAK,cAAc;wBACvC,IAAI,EAAE,UAAU;wBAChB,MAAM,EAAE,KAAK;qBACd;oBACD;wBACE,KAAK,EAAE,wBAAwB;wBAC/B,EAAE,EAAE,MAAM;wBACV,OAAO,EAAE,WAAW,KAAK,MAAM;wBAC/B,IAAI,EAAE,UAAU;wBAChB,MAAM,EAAE,KAAK;qBACd;oBACD;wBACE,KAAK,EAAE,QAAQ;wBACf,EAAE,EAAE,QAAQ;wBACZ,OAAO,EAAE,WAAW,KAAK,QAAQ;wBACjC,IAAI,EAAE,YAAY;wBAClB,MAAM,EAAE,KAAK;qBACd;iBACF,EACD,aAAa,EAAE,UAAC,KAAK,EAAE,KAAK;oBAC1B,iBAAiB;oBACjB,KAAK,CAAC,cAAc,EAAE,CAAC;oBACvB,cAAc,CAAC,KAAK,CAAC,CAAC;gBACxB,CAAC,GACD,CACE,CACF,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -1,243 +0,0 @@
1
- import React, { ComponentType, MouseEvent, ReactNode } from "react";
2
-
3
- import {
4
- noHrefLink,
5
- SparkleContext,
6
- SparkleContextLinkType,
7
- } from "@sparkle/context";
8
- import { ChevronRightIcon } from "@sparkle/icons";
9
- import { classNames } from "@sparkle/lib/utils";
10
-
11
- import { Icon } from "./Icon";
12
- import { Tooltip } from "./Tooltip";
13
-
14
- type TabType<E> = {
15
- current: boolean;
16
- disabled?: boolean;
17
- hasSeparator?: boolean;
18
- hideLabel?: boolean;
19
- icon?: ComponentType<{ className?: string }>;
20
- id?: E;
21
- label: string;
22
- sizing?: "hug" | "expand";
23
- } & (
24
- | { onClick?: (event: MouseEvent<HTMLAnchorElement>) => void; href?: never }
25
- | { onClick?: never; href: string }
26
- );
27
-
28
- type TabProps<E> = {
29
- variant?: "default" | "stepper";
30
- tabs: Array<TabType<E>>;
31
- setCurrentTab?: (tabId: E, e: MouseEvent<HTMLAnchorElement>) => void;
32
- tabClassName?: string;
33
- className?: string;
34
- };
35
-
36
- const tabClasses = {
37
- default: {
38
- base: "s-text-element-800 s-border-transparent s-cursor-pointer s-border-b-2",
39
- hover: "hover:s-text-action-500 hover:s-border-action-300",
40
- dark: {
41
- base: "dark:s-text-element-700-dark",
42
- hover: "dark:hover:s-text-action-600-dark",
43
- },
44
- },
45
- selected: {
46
- base: "s-border-action-500 s-text-action-500 s-cursor-default s-border-b-2",
47
- hover: "",
48
- dark: {
49
- base: "dark:s-border-action-500-dark dark:s-text-action-500-dark",
50
- hover: "",
51
- },
52
- },
53
- stepperDefault: {
54
- base: "s-text-element-800 s-cursor-pointer",
55
- hover: "hover:s-text-action-500",
56
- dark: {
57
- base: "dark:s-text-element-700-dark",
58
- hover: "dark:hover:s-text-action-600-dark",
59
- },
60
- },
61
- stepperSelected: {
62
- base: "s-text-action-500 s-cursor-default",
63
- hover: "",
64
- dark: {
65
- base: "dark:dark:s-text-action-500-dark",
66
- hover: "",
67
- },
68
- },
69
- };
70
-
71
- const iconClasses = {
72
- default: {
73
- base: "s-text-element-600",
74
- hover: "group-hover/tab:s-text-action-400",
75
- dark: {
76
- base: "dark:s-text-element-600-dark",
77
- hover: "dark:group-hover/tab:s-text-action-500-dark",
78
- },
79
- },
80
- selected: {
81
- base: "s-text-action-400",
82
- hover: "",
83
- dark: {
84
- base: "dark:s-text-action-500-dark",
85
- hover: "",
86
- },
87
- },
88
- };
89
-
90
- const tabSizingClasses = {
91
- hug: "",
92
- expand: "s-flex-1",
93
- };
94
-
95
- /**
96
- * Tab component displaying a list of tabs.
97
- *
98
- * Tab click action is specified:
99
- * - either per tab, by providing either an href or an onClick handler in tab
100
- * data (mutually exclusive);
101
- * - or globally, by providing a setCurrentTab function.
102
- * Both per-tab and global actions can be set, the per-tab action taking precedence.
103
- */
104
- export function Tab<E>({
105
- variant = "default",
106
- tabs,
107
- setCurrentTab,
108
- className,
109
- tabClassName = "",
110
- }: TabProps<E>) {
111
- const { components } = React.useContext(SparkleContext);
112
-
113
- const renderTabs = () =>
114
- tabs.map((tab, i) => {
115
- const tabStateClasses =
116
- variant === "stepper"
117
- ? tab.current
118
- ? tabClasses.stepperSelected
119
- : tabClasses.stepperDefault
120
- : tab.current
121
- ? tabClasses.selected
122
- : tabClasses.default;
123
- const iconStateClasses = tab.current
124
- ? iconClasses.selected
125
- : iconClasses.default;
126
-
127
- const finalTabClasses = classNames(
128
- "s-group/tab s-justify-center s-flex s-text-sm s-font-semibold s-py-2.5 s-transition-all ease-out s-duration-400 s-whitespace-nowrap s-select-none",
129
- variant === "default"
130
- ? tab.icon
131
- ? tab.hideLabel
132
- ? "s-px-3"
133
- : "s-pr-3.5 s-pl-2.5"
134
- : "s-px-3"
135
- : "s-pl-1",
136
-
137
- tabStateClasses.base,
138
- tabStateClasses.hover,
139
- tabStateClasses.dark.base,
140
- tabStateClasses.dark.hover,
141
- tabClassName,
142
- tab.disabled ? "s-opacity-50 s-pointer-events-none" : ""
143
- );
144
-
145
- const finalIconClasses = classNames(
146
- "s-transition-colors s-duration-400",
147
- iconStateClasses.base,
148
- iconStateClasses.hover,
149
- iconStateClasses.dark.base,
150
- iconStateClasses.dark.hover,
151
- tabClassName
152
- );
153
-
154
- const Link: SparkleContextLinkType = tab.href
155
- ? components.link
156
- : noHrefLink;
157
-
158
- // precedence on href and onClick (mutually exclusive), then setCurrentTab
159
- const setCurrentTabFn = (e: MouseEvent<HTMLAnchorElement>) => {
160
- if (!tab.id) {
161
- throw new Error("Tab id is required to use setCurrentTab");
162
- }
163
- setCurrentTab?.(tab.id, e);
164
- };
165
- const onClickAction = tab.href
166
- ? undefined
167
- : tab.onClick ?? setCurrentTabFn;
168
-
169
- const content: ReactNode = (
170
- <Link
171
- key={tab.label}
172
- className={finalTabClasses}
173
- aria-current={tab.current ? "page" : undefined}
174
- onClick={onClickAction}
175
- href={tab.href || "#"}
176
- >
177
- <div
178
- className={
179
- tab.current
180
- ? "s-flex s-gap-x-2"
181
- : "s-flex s-gap-x-2 s-transition s-duration-300 s-ease-out"
182
- }
183
- >
184
- {tab.icon && (
185
- <Icon visual={tab.icon} className={finalIconClasses} size="sm" />
186
- )}
187
- {tab.hideLabel ?? tab.label}
188
- {variant === "stepper" && i < tabs.length - 1 && (
189
- <Icon
190
- visual={ChevronRightIcon}
191
- className="s-mx-2 s-text-element-500"
192
- size="sm"
193
- />
194
- )}
195
- </div>
196
- </Link>
197
- );
198
- return tab.hideLabel ? (
199
- tab.label ? (
200
- <React.Fragment key={`tab-${i}`}>
201
- <div className={tabSizingClasses[tab.sizing ?? "hug"]}>
202
- <Tooltip trigger={content} label={tab.label} />
203
- </div>
204
- {tab.hasSeparator && (
205
- <div className="s-flex s-h-full s-grow" key={`sep-${i}`} />
206
- )}
207
- </React.Fragment>
208
- ) : (
209
- <React.Fragment key={`tab-${i}`}>
210
- <div className={tabSizingClasses[tab.sizing ?? "hug"]}>
211
- {content}
212
- </div>
213
- {tab.hasSeparator && (
214
- <div className="s-flex s-h-full s-grow" key={`sep-${i}`} />
215
- )}
216
- </React.Fragment>
217
- )
218
- ) : (
219
- <React.Fragment key={`tab-${i}`}>
220
- <div className={tabSizingClasses[tab.sizing ?? "hug"]}>{content}</div>
221
- {tab.hasSeparator && (
222
- <div className="s-flex s-h-full s-grow" key={`sep-${i}`} />
223
- )}
224
- </React.Fragment>
225
- );
226
- });
227
-
228
- return (
229
- <div
230
- className={classNames(
231
- variant === "default"
232
- ? "s-border-b s-border-structure-200 dark:s-border-structure-200-dark"
233
- : "",
234
- className ?? "",
235
- "s-overflow-x-auto s-overflow-y-hidden s-scrollbar-hide"
236
- )}
237
- >
238
- <nav className="s-flex s-space-x-0" aria-label="Tabs">
239
- {renderTabs()}
240
- </nav>
241
- </div>
242
- );
243
- }
@@ -1,104 +0,0 @@
1
- import type { Meta } from "@storybook/react";
2
- import React from "react";
3
-
4
- import {
5
- CircleIcon,
6
- RobotIcon,
7
- SquareIcon,
8
- Tab,
9
- TriangleIcon,
10
- } from "../index_with_tw_base";
11
- import {
12
- ChatBubbleBottomCenterTextIcon,
13
- Cog6ToothIcon,
14
- } from "../index_with_tw_base";
15
-
16
- const meta = {
17
- title: "Components/Tab",
18
- component: Tab,
19
- } satisfies Meta<typeof Tab>;
20
-
21
- export default meta;
22
-
23
- export const TabExample = () => {
24
- const [currentTab, setCurrentTab] = React.useState("chat");
25
- const [currentTab2, setCurrentTab2] = React.useState("instructions");
26
- return (
27
- <div className="s-flex s-flex-col s-gap-10">
28
- <div className="s-w-[320px]">
29
- <Tab
30
- tabs={[
31
- {
32
- label: "Chat",
33
- id: "chat",
34
- current: currentTab === "chat",
35
- icon: ChatBubbleBottomCenterTextIcon,
36
- sizing: "expand",
37
- },
38
- {
39
- label: "Build",
40
- id: "build",
41
- current: currentTab === "build",
42
- icon: RobotIcon,
43
- sizing: "expand",
44
- },
45
- {
46
- label: "Admin",
47
- id: "admin",
48
- current: currentTab === "admin",
49
- icon: RobotIcon,
50
- sizing: "expand",
51
- hasSeparator: true,
52
- disabled: true,
53
- },
54
- {
55
- label: "Settings",
56
- id: "settings",
57
- hideLabel: true,
58
- current: false,
59
- icon: Cog6ToothIcon,
60
- },
61
- ]}
62
- setCurrentTab={(tabId, event) => {
63
- // add logic here
64
- event.preventDefault();
65
- setCurrentTab(tabId);
66
- }}
67
- />
68
- </div>
69
- <div className="s-w-full">
70
- <Tab
71
- variant="stepper"
72
- tabs={[
73
- {
74
- label: "Instructions",
75
- id: "instructions",
76
- current: currentTab2 === "instructions",
77
- icon: SquareIcon,
78
- sizing: "hug",
79
- },
80
- {
81
- label: "Data sources & Actions",
82
- id: "data",
83
- current: currentTab2 === "data",
84
- icon: CircleIcon,
85
- sizing: "hug",
86
- },
87
- {
88
- label: "Naming",
89
- id: "naming",
90
- current: currentTab2 === "naming",
91
- icon: TriangleIcon,
92
- sizing: "hug",
93
- },
94
- ]}
95
- setCurrentTab={(tabId, event) => {
96
- // add logic here
97
- event.preventDefault();
98
- setCurrentTab2(tabId);
99
- }}
100
- />
101
- </div>
102
- </div>
103
- );
104
- };