@luxfi/ui 6.1.3 → 7.0.0
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.
- package/dist/accordion.cjs +213 -0
- package/dist/accordion.d.cts +74 -0
- package/dist/accordion.d.ts +74 -0
- package/dist/accordion.js +186 -0
- package/dist/alert.cjs +553 -0
- package/dist/alert.d.cts +30 -0
- package/dist/alert.d.ts +30 -0
- package/dist/alert.js +531 -0
- package/dist/avatar.cjs +149 -0
- package/dist/avatar.d.cts +25 -0
- package/dist/avatar.d.ts +25 -0
- package/dist/avatar.js +125 -0
- package/dist/badge.cjs +611 -0
- package/dist/badge.d.cts +23 -0
- package/dist/badge.d.ts +23 -0
- package/dist/badge.js +589 -0
- package/dist/bank.cjs +272 -0
- package/dist/bank.d.cts +76 -0
- package/dist/bank.d.ts +76 -0
- package/dist/bank.js +258 -0
- package/dist/button.cjs +689 -0
- package/dist/button.d.cts +52 -0
- package/dist/button.d.ts +52 -0
- package/dist/button.js +664 -0
- package/dist/checkbox.cjs +265 -0
- package/dist/checkbox.d.cts +31 -0
- package/dist/checkbox.d.ts +31 -0
- package/dist/checkbox.js +241 -0
- package/dist/close-button.cjs +73 -0
- package/dist/close-button.d.cts +9 -0
- package/dist/close-button.d.ts +9 -0
- package/dist/close-button.js +51 -0
- package/dist/collapsible.cjs +702 -0
- package/dist/collapsible.d.cts +23 -0
- package/dist/collapsible.d.ts +23 -0
- package/dist/collapsible.js +679 -0
- package/dist/color-mode.cjs +96 -0
- package/dist/color-mode.d.cts +25 -0
- package/dist/color-mode.d.ts +25 -0
- package/dist/color-mode.js +72 -0
- package/dist/dialog.cjs +279 -0
- package/dist/dialog.d.cts +66 -0
- package/dist/dialog.d.ts +66 -0
- package/dist/dialog.js +246 -0
- package/dist/drawer.cjs +207 -0
- package/dist/drawer.d.cts +36 -0
- package/dist/drawer.d.ts +36 -0
- package/dist/drawer.js +175 -0
- package/dist/empty-state.cjs +93 -0
- package/dist/empty-state.d.cts +13 -0
- package/dist/empty-state.d.ts +13 -0
- package/dist/empty-state.js +71 -0
- package/dist/expiration-selector.cjs +138 -0
- package/dist/expiration-selector.d.cts +16 -0
- package/dist/expiration-selector.d.ts +16 -0
- package/dist/expiration-selector.js +116 -0
- package/dist/field.cjs +183 -0
- package/dist/field.d.cts +24 -0
- package/dist/field.d.ts +24 -0
- package/dist/field.js +160 -0
- package/dist/greeks-display.cjs +114 -0
- package/dist/greeks-display.d.cts +14 -0
- package/dist/greeks-display.d.ts +14 -0
- package/dist/greeks-display.js +92 -0
- package/dist/heading.cjs +46 -0
- package/dist/heading.d.cts +10 -0
- package/dist/heading.d.ts +10 -0
- package/dist/heading.js +40 -0
- package/dist/icon-button.cjs +491 -0
- package/dist/icon-button.d.cts +33 -0
- package/dist/icon-button.d.ts +33 -0
- package/dist/icon-button.js +470 -0
- package/dist/image.cjs +572 -0
- package/dist/image.d.cts +57 -0
- package/dist/image.d.ts +57 -0
- package/dist/image.js +551 -0
- package/dist/index.cjs +7316 -0
- package/dist/index.d.cts +58 -0
- package/dist/index.d.ts +58 -0
- package/dist/index.js +7137 -0
- package/dist/input-group.cjs +155 -0
- package/dist/input-group.d.cts +17 -0
- package/dist/input-group.d.ts +17 -0
- package/dist/input-group.js +133 -0
- package/dist/input.cjs +65 -0
- package/dist/input.d.cts +11 -0
- package/dist/input.d.ts +11 -0
- package/dist/input.js +59 -0
- package/dist/link.cjs +630 -0
- package/dist/link.d.cts +37 -0
- package/dist/link.d.ts +37 -0
- package/dist/link.js +606 -0
- package/dist/menu.cjs +305 -0
- package/dist/menu.d.cts +84 -0
- package/dist/menu.d.ts +84 -0
- package/dist/menu.js +269 -0
- package/dist/option-chain.cjs +221 -0
- package/dist/option-chain.d.cts +37 -0
- package/dist/option-chain.d.ts +37 -0
- package/dist/option-chain.js +199 -0
- package/dist/option-position.cjs +164 -0
- package/dist/option-position.d.cts +29 -0
- package/dist/option-position.d.ts +29 -0
- package/dist/option-position.js +142 -0
- package/dist/pin-input.cjs +182 -0
- package/dist/pin-input.d.cts +25 -0
- package/dist/pin-input.d.ts +25 -0
- package/dist/pin-input.js +160 -0
- package/dist/pnl-diagram.cjs +453 -0
- package/dist/pnl-diagram.d.cts +11 -0
- package/dist/pnl-diagram.d.ts +11 -0
- package/dist/pnl-diagram.js +431 -0
- package/dist/popover.cjs +327 -0
- package/dist/popover.d.cts +73 -0
- package/dist/popover.d.ts +73 -0
- package/dist/popover.js +294 -0
- package/dist/progress-circle.cjs +152 -0
- package/dist/progress-circle.d.cts +47 -0
- package/dist/progress-circle.d.ts +47 -0
- package/dist/progress-circle.js +128 -0
- package/dist/progress.cjs +117 -0
- package/dist/progress.d.cts +28 -0
- package/dist/progress.d.ts +28 -0
- package/dist/progress.js +94 -0
- package/dist/provider.cjs +62 -0
- package/dist/provider.d.cts +7 -0
- package/dist/provider.d.ts +7 -0
- package/dist/provider.js +40 -0
- package/dist/radio.cjs +177 -0
- package/dist/radio.d.cts +53 -0
- package/dist/radio.d.ts +53 -0
- package/dist/radio.js +153 -0
- package/dist/rating.cjs +80 -0
- package/dist/rating.d.cts +14 -0
- package/dist/rating.d.ts +14 -0
- package/dist/rating.js +58 -0
- package/dist/select.cjs +791 -0
- package/dist/select.d.cts +130 -0
- package/dist/select.d.ts +130 -0
- package/dist/select.js +757 -0
- package/dist/separator.cjs +57 -0
- package/dist/separator.d.cts +13 -0
- package/dist/separator.d.ts +13 -0
- package/dist/separator.js +51 -0
- package/dist/skeleton.cjs +370 -0
- package/dist/skeleton.d.cts +60 -0
- package/dist/skeleton.d.ts +60 -0
- package/dist/skeleton.js +346 -0
- package/dist/slider.cjs +138 -0
- package/dist/slider.d.cts +24 -0
- package/dist/slider.d.ts +24 -0
- package/dist/slider.js +115 -0
- package/dist/strategy-builder.cjs +373 -0
- package/dist/strategy-builder.d.cts +26 -0
- package/dist/strategy-builder.d.ts +26 -0
- package/dist/strategy-builder.js +351 -0
- package/dist/switch.cjs +163 -0
- package/dist/switch.d.cts +27 -0
- package/dist/switch.d.ts +27 -0
- package/dist/switch.js +140 -0
- package/dist/table.cjs +1044 -0
- package/dist/table.d.cts +107 -0
- package/dist/table.d.ts +107 -0
- package/dist/table.js +1013 -0
- package/dist/tabs.cjs +240 -0
- package/dist/tabs.d.cts +78 -0
- package/dist/tabs.d.ts +78 -0
- package/dist/tabs.js +213 -0
- package/dist/tag.cjs +651 -0
- package/dist/tag.d.cts +21 -0
- package/dist/tag.d.ts +21 -0
- package/dist/tag.js +628 -0
- package/dist/textarea.cjs +65 -0
- package/dist/textarea.d.cts +11 -0
- package/dist/textarea.d.ts +11 -0
- package/dist/textarea.js +59 -0
- package/dist/toaster.cjs +99 -0
- package/dist/toaster.d.cts +29 -0
- package/dist/toaster.d.ts +29 -0
- package/dist/toaster.js +96 -0
- package/dist/tooltip.cjs +171 -0
- package/dist/tooltip.d.cts +39 -0
- package/dist/tooltip.d.ts +39 -0
- package/dist/tooltip.js +148 -0
- package/dist/utils.cjs +11 -0
- package/dist/utils.d.cts +5 -0
- package/dist/utils.d.ts +5 -0
- package/dist/utils.js +9 -0
- package/package.json +283 -90
- package/src/accordion.tsx +285 -0
- package/src/alert.tsx +221 -0
- package/src/avatar.tsx +174 -0
- package/src/badge.tsx +158 -0
- package/src/bank.tsx +325 -0
- package/src/button.tsx +411 -0
- package/src/checkbox.tsx +307 -0
- package/src/close-button.tsx +51 -0
- package/src/collapsible.tsx +126 -0
- package/src/color-mode.tsx +125 -0
- package/src/dialog.tsx +356 -0
- package/src/drawer.tsx +186 -0
- package/src/empty-state.tsx +97 -0
- package/src/expiration-selector.tsx +163 -0
- package/src/field.tsx +202 -0
- package/src/greeks-display.tsx +138 -0
- package/src/heading.tsx +55 -0
- package/src/icon-button.tsx +192 -0
- package/src/image.tsx +280 -0
- package/src/index.ts +267 -138
- package/src/input-group.tsx +159 -0
- package/src/input.tsx +60 -0
- package/src/link.tsx +326 -0
- package/src/menu.tsx +471 -0
- package/src/option-chain.tsx +261 -0
- package/src/option-position.tsx +200 -0
- package/src/pin-input.tsx +187 -0
- package/src/pnl-diagram.tsx +458 -0
- package/src/popover.tsx +400 -0
- package/src/progress-circle.tsx +180 -0
- package/src/progress.tsx +109 -0
- package/src/provider.tsx +12 -0
- package/src/radio.tsx +175 -0
- package/src/rating.tsx +79 -0
- package/src/select.tsx +696 -0
- package/src/separator.tsx +59 -0
- package/src/skeleton.tsx +302 -0
- package/src/slider.tsx +152 -0
- package/src/strategy-builder.tsx +466 -0
- package/src/switch.tsx +158 -0
- package/src/table.tsx +621 -0
- package/src/tabs.tsx +354 -0
- package/src/tag.tsx +159 -0
- package/src/textarea.tsx +60 -0
- package/src/toaster.tsx +117 -0
- package/src/tokens.css +438 -0
- package/src/tooltip.tsx +184 -0
- package/src/utils/cn.ts +7 -0
- package/src/utils.ts +6 -0
- package/tokens.css +438 -0
- package/LICENSE +0 -122
- package/README.md +0 -109
package/dist/tabs.cjs
ADDED
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var RadixTabs = require('@radix-ui/react-tabs');
|
|
5
|
+
var React = require('react');
|
|
6
|
+
var clsx = require('clsx');
|
|
7
|
+
var tailwindMerge = require('tailwind-merge');
|
|
8
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
9
|
+
|
|
10
|
+
function _interopNamespace(e) {
|
|
11
|
+
if (e && e.__esModule) return e;
|
|
12
|
+
var n = Object.create(null);
|
|
13
|
+
if (e) {
|
|
14
|
+
Object.keys(e).forEach(function (k) {
|
|
15
|
+
if (k !== 'default') {
|
|
16
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
17
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
18
|
+
enumerable: true,
|
|
19
|
+
get: function () { return e[k]; }
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
n.default = e;
|
|
25
|
+
return Object.freeze(n);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
var RadixTabs__namespace = /*#__PURE__*/_interopNamespace(RadixTabs);
|
|
29
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
30
|
+
|
|
31
|
+
// src/tabs.tsx
|
|
32
|
+
function cn(...inputs) {
|
|
33
|
+
return tailwindMerge.twMerge(clsx.clsx(inputs));
|
|
34
|
+
}
|
|
35
|
+
var ROOT_SIZE_CLASSES = {
|
|
36
|
+
sm: "[--tabs-height:2rem] [--tabs-content-padding:1.5rem]",
|
|
37
|
+
md: "[--tabs-height:2.5rem] [--tabs-content-padding:1.5rem]",
|
|
38
|
+
free: ""
|
|
39
|
+
};
|
|
40
|
+
var TabsRoot = React__namespace.forwardRef(
|
|
41
|
+
function TabsRoot2(props, ref) {
|
|
42
|
+
const {
|
|
43
|
+
variant = "solid",
|
|
44
|
+
size = "md",
|
|
45
|
+
fitted,
|
|
46
|
+
lazyMount: _lazyMount,
|
|
47
|
+
unmountOnExit: _unmountOnExit,
|
|
48
|
+
onValueChange,
|
|
49
|
+
className,
|
|
50
|
+
...rest
|
|
51
|
+
} = props;
|
|
52
|
+
const handleValueChange = React__namespace.useCallback(
|
|
53
|
+
(value) => {
|
|
54
|
+
if (!onValueChange) return;
|
|
55
|
+
onValueChange({ value });
|
|
56
|
+
},
|
|
57
|
+
[onValueChange]
|
|
58
|
+
);
|
|
59
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
60
|
+
RadixTabs__namespace.Root,
|
|
61
|
+
{
|
|
62
|
+
ref,
|
|
63
|
+
"data-variant": variant,
|
|
64
|
+
"data-size": size,
|
|
65
|
+
"data-fitted": fitted ? "" : void 0,
|
|
66
|
+
className: cn(
|
|
67
|
+
"relative",
|
|
68
|
+
ROOT_SIZE_CLASSES[size],
|
|
69
|
+
className
|
|
70
|
+
),
|
|
71
|
+
onValueChange: onValueChange ? handleValueChange : void 0,
|
|
72
|
+
...rest
|
|
73
|
+
}
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
);
|
|
77
|
+
var TabsList = React__namespace.forwardRef(
|
|
78
|
+
function TabsList2(props, ref) {
|
|
79
|
+
const {
|
|
80
|
+
className,
|
|
81
|
+
// Strip Chakra style props
|
|
82
|
+
flexWrap: _flexWrap,
|
|
83
|
+
alignItems: _alignItems,
|
|
84
|
+
whiteSpace: _whiteSpace,
|
|
85
|
+
bgColor: _bgColor,
|
|
86
|
+
marginBottom: _marginBottom,
|
|
87
|
+
mx: _mx,
|
|
88
|
+
px: _px,
|
|
89
|
+
w: _w,
|
|
90
|
+
overflowX: _overflowX,
|
|
91
|
+
overscrollBehaviorX: _overscrollBehaviorX,
|
|
92
|
+
css: _css,
|
|
93
|
+
position: _position,
|
|
94
|
+
boxShadow: _boxShadow,
|
|
95
|
+
top: _top,
|
|
96
|
+
zIndex: _zIndex,
|
|
97
|
+
style: styleProp,
|
|
98
|
+
asChild,
|
|
99
|
+
loop,
|
|
100
|
+
...rest
|
|
101
|
+
} = props;
|
|
102
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
103
|
+
RadixTabs__namespace.List,
|
|
104
|
+
{
|
|
105
|
+
ref,
|
|
106
|
+
asChild,
|
|
107
|
+
loop,
|
|
108
|
+
className: cn(
|
|
109
|
+
"inline-flex w-full relative isolate flex-row",
|
|
110
|
+
"min-h-[var(--tabs-height,2.5rem)]",
|
|
111
|
+
className
|
|
112
|
+
),
|
|
113
|
+
style: styleProp,
|
|
114
|
+
...rest
|
|
115
|
+
}
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
);
|
|
119
|
+
var TRIGGER_BASE = "outline-none min-w-[var(--tabs-height,2.5rem)] h-[var(--tabs-height,2.5rem)] flex items-center relative cursor-pointer gap-2 focus-visible:z-[1] focus-visible:outline-2 focus-visible:outline-offset-0 disabled:cursor-not-allowed disabled:opacity-50";
|
|
120
|
+
var TRIGGER_SIZE_CLASSES = {
|
|
121
|
+
sm: "py-1 px-3 text-sm",
|
|
122
|
+
md: "py-2 px-4 text-base",
|
|
123
|
+
free: ""
|
|
124
|
+
};
|
|
125
|
+
var TRIGGER_VARIANT_CLASSES = {
|
|
126
|
+
solid: "font-semibold gap-1 rounded-md bg-transparent text-tabs-solid-fg data-[state=active]:bg-selected-control-bg data-[state=active]:text-selected-control-text data-[state=active]:hover:text-selected-control-text hover:text-hover",
|
|
127
|
+
secondary: "font-medium bg-transparent text-tabs-secondary-fg border-2 border-solid border-tabs-secondary-border rounded-md data-[state=active]:bg-selected-control-bg data-[state=active]:text-selected-control-text data-[state=active]:border-transparent data-[state=active]:hover:border-transparent hover:text-hover hover:border-hover",
|
|
128
|
+
segmented: "bg-transparent text-text-primary border-2 border-solid border-selected-control-bg hover:text-hover data-[state=active]:text-selected-control-text data-[state=active]:bg-selected-control-bg data-[state=active]:border-selected-control-bg data-[state=active]:hover:text-selected-control-text",
|
|
129
|
+
unstyled: ""
|
|
130
|
+
};
|
|
131
|
+
var TabsTrigger = React__namespace.forwardRef(
|
|
132
|
+
function TabsTrigger2(props, ref) {
|
|
133
|
+
const {
|
|
134
|
+
className,
|
|
135
|
+
// Strip Chakra style props
|
|
136
|
+
scrollSnapAlign: _scrollSnapAlign,
|
|
137
|
+
flexShrink: _flexShrink,
|
|
138
|
+
bgColor: _bgColor,
|
|
139
|
+
w: _w,
|
|
140
|
+
py: _py,
|
|
141
|
+
borderRadius: _borderRadius,
|
|
142
|
+
fontWeight: _fontWeight,
|
|
143
|
+
color: _color,
|
|
144
|
+
_hover,
|
|
145
|
+
position: _position,
|
|
146
|
+
top: _top,
|
|
147
|
+
left: _left,
|
|
148
|
+
visibility: _visibility,
|
|
149
|
+
...rest
|
|
150
|
+
} = props;
|
|
151
|
+
const internalRef = React__namespace.useRef(null);
|
|
152
|
+
const mergedRef = useMergedRef(ref, internalRef);
|
|
153
|
+
const { variant, size, fitted } = useTabsContext(internalRef);
|
|
154
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
155
|
+
RadixTabs__namespace.Trigger,
|
|
156
|
+
{
|
|
157
|
+
ref: mergedRef,
|
|
158
|
+
className: cn(
|
|
159
|
+
"group",
|
|
160
|
+
TRIGGER_BASE,
|
|
161
|
+
TRIGGER_SIZE_CLASSES[size],
|
|
162
|
+
TRIGGER_VARIANT_CLASSES[variant],
|
|
163
|
+
fitted && "flex-1 text-center justify-center",
|
|
164
|
+
className
|
|
165
|
+
),
|
|
166
|
+
...rest
|
|
167
|
+
}
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
);
|
|
171
|
+
var TabsContent = React__namespace.forwardRef(
|
|
172
|
+
function TabsContent2(props, ref) {
|
|
173
|
+
const { className, padding: _padding, ...rest } = props;
|
|
174
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
175
|
+
RadixTabs__namespace.Content,
|
|
176
|
+
{
|
|
177
|
+
ref,
|
|
178
|
+
className: cn(
|
|
179
|
+
"w-full pt-[var(--tabs-content-padding,1.5rem)]",
|
|
180
|
+
"focus-visible:outline-2 focus-visible:outline-offset-[-2px]",
|
|
181
|
+
className
|
|
182
|
+
),
|
|
183
|
+
...rest
|
|
184
|
+
}
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
);
|
|
188
|
+
var COUNTER_OVERLOAD = 50;
|
|
189
|
+
var TabsCounter = ({ count }) => {
|
|
190
|
+
if (count === void 0 || count === null) {
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
194
|
+
"span",
|
|
195
|
+
{
|
|
196
|
+
className: cn(
|
|
197
|
+
"group-hover:text-inherit",
|
|
198
|
+
count > 0 ? "text-text-secondary" : "text-[rgba(16,17,18,0.24)] dark:text-[rgba(255,255,255,0.24)]"
|
|
199
|
+
),
|
|
200
|
+
children: count > COUNTER_OVERLOAD ? `${COUNTER_OVERLOAD}+` : count
|
|
201
|
+
}
|
|
202
|
+
);
|
|
203
|
+
};
|
|
204
|
+
function useTabsContext(triggerRef) {
|
|
205
|
+
const [ctx, setCtx] = React__namespace.useState({ variant: "solid", size: "md", fitted: false });
|
|
206
|
+
React__namespace.useEffect(() => {
|
|
207
|
+
const el = triggerRef.current;
|
|
208
|
+
if (!el) return;
|
|
209
|
+
const root = el.closest("[data-variant]");
|
|
210
|
+
if (!root) return;
|
|
211
|
+
setCtx({
|
|
212
|
+
variant: root.getAttribute("data-variant") ?? "solid",
|
|
213
|
+
size: root.getAttribute("data-size") ?? "md",
|
|
214
|
+
fitted: root.hasAttribute("data-fitted")
|
|
215
|
+
});
|
|
216
|
+
}, [triggerRef]);
|
|
217
|
+
return ctx;
|
|
218
|
+
}
|
|
219
|
+
function useMergedRef(...refs) {
|
|
220
|
+
return React__namespace.useCallback(
|
|
221
|
+
(instance) => {
|
|
222
|
+
for (const ref of refs) {
|
|
223
|
+
if (!ref) continue;
|
|
224
|
+
if (typeof ref === "function") {
|
|
225
|
+
ref(instance);
|
|
226
|
+
} else {
|
|
227
|
+
ref.current = instance;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
},
|
|
231
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
232
|
+
refs
|
|
233
|
+
);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
exports.TabsContent = TabsContent;
|
|
237
|
+
exports.TabsCounter = TabsCounter;
|
|
238
|
+
exports.TabsList = TabsList;
|
|
239
|
+
exports.TabsRoot = TabsRoot;
|
|
240
|
+
exports.TabsTrigger = TabsTrigger;
|
package/dist/tabs.d.cts
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import * as RadixTabs from '@radix-ui/react-tabs';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
|
|
4
|
+
type TabsVariant = 'solid' | 'secondary' | 'segmented' | 'unstyled';
|
|
5
|
+
type TabsSize = 'sm' | 'md' | 'free';
|
|
6
|
+
interface TabsProps extends Omit<React.ComponentPropsWithoutRef<typeof RadixTabs.Root>, 'onValueChange'> {
|
|
7
|
+
/** Visual variant. Default: "solid". */
|
|
8
|
+
variant?: TabsVariant;
|
|
9
|
+
/** Size preset. Default: "md". */
|
|
10
|
+
size?: TabsSize;
|
|
11
|
+
/** Stretch triggers to fill the list width. */
|
|
12
|
+
fitted?: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* @deprecated Chakra-compat. Radix mounts lazily by default (content only
|
|
15
|
+
* renders when active). Kept so call-sites don't break at compile time.
|
|
16
|
+
*/
|
|
17
|
+
lazyMount?: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* @deprecated Chakra-compat. Radix unmounts inactive content by default.
|
|
20
|
+
* Kept so call-sites don't break at compile time.
|
|
21
|
+
*/
|
|
22
|
+
unmountOnExit?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Chakra-compatible value-change handler.
|
|
25
|
+
* Accepts both `(details: { value: string }) => void` (Chakra convention)
|
|
26
|
+
* and `(value: string) => void` (Radix convention).
|
|
27
|
+
*/
|
|
28
|
+
onValueChange?: ((details: {
|
|
29
|
+
value: string;
|
|
30
|
+
}) => void) | ((value: string) => void);
|
|
31
|
+
}
|
|
32
|
+
declare const TabsRoot: React.ForwardRefExoticComponent<TabsProps & React.RefAttributes<HTMLDivElement>>;
|
|
33
|
+
interface TabsListProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
34
|
+
asChild?: boolean;
|
|
35
|
+
loop?: boolean;
|
|
36
|
+
flexWrap?: string;
|
|
37
|
+
alignItems?: string;
|
|
38
|
+
whiteSpace?: string;
|
|
39
|
+
bgColor?: string;
|
|
40
|
+
marginBottom?: number | string;
|
|
41
|
+
mx?: string | Record<string, string>;
|
|
42
|
+
px?: string | Record<string, string>;
|
|
43
|
+
w?: string | Record<string, string>;
|
|
44
|
+
overflowX?: string | Record<string, string>;
|
|
45
|
+
overscrollBehaviorX?: string;
|
|
46
|
+
css?: Record<string, unknown>;
|
|
47
|
+
position?: string;
|
|
48
|
+
boxShadow?: string | Record<string, string>;
|
|
49
|
+
top?: number | string;
|
|
50
|
+
zIndex?: string | Record<string, string>;
|
|
51
|
+
}
|
|
52
|
+
declare const TabsList: React.ForwardRefExoticComponent<TabsListProps & React.RefAttributes<HTMLDivElement>>;
|
|
53
|
+
interface TabsTriggerProps extends Omit<React.ComponentPropsWithoutRef<typeof RadixTabs.Trigger>, 'dir'> {
|
|
54
|
+
scrollSnapAlign?: string;
|
|
55
|
+
flexShrink?: number;
|
|
56
|
+
bgColor?: string | Record<string, string>;
|
|
57
|
+
w?: string;
|
|
58
|
+
py?: string;
|
|
59
|
+
borderRadius?: string;
|
|
60
|
+
fontWeight?: string;
|
|
61
|
+
color?: string;
|
|
62
|
+
_hover?: Record<string, string>;
|
|
63
|
+
position?: string;
|
|
64
|
+
top?: string;
|
|
65
|
+
left?: string;
|
|
66
|
+
visibility?: string;
|
|
67
|
+
}
|
|
68
|
+
declare const TabsTrigger: React.ForwardRefExoticComponent<TabsTriggerProps & React.RefAttributes<HTMLButtonElement>>;
|
|
69
|
+
interface TabsContentProps extends React.ComponentPropsWithoutRef<typeof RadixTabs.Content> {
|
|
70
|
+
padding?: number | string;
|
|
71
|
+
}
|
|
72
|
+
declare const TabsContent: React.ForwardRefExoticComponent<TabsContentProps & React.RefAttributes<HTMLDivElement>>;
|
|
73
|
+
interface TabsCounterProps {
|
|
74
|
+
count?: number | null;
|
|
75
|
+
}
|
|
76
|
+
declare const TabsCounter: ({ count }: TabsCounterProps) => React.ReactElement | null;
|
|
77
|
+
|
|
78
|
+
export { TabsContent, type TabsContentProps, TabsCounter, type TabsCounterProps, TabsList, type TabsListProps, type TabsProps, TabsRoot, TabsTrigger, type TabsTriggerProps };
|
package/dist/tabs.d.ts
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import * as RadixTabs from '@radix-ui/react-tabs';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
|
|
4
|
+
type TabsVariant = 'solid' | 'secondary' | 'segmented' | 'unstyled';
|
|
5
|
+
type TabsSize = 'sm' | 'md' | 'free';
|
|
6
|
+
interface TabsProps extends Omit<React.ComponentPropsWithoutRef<typeof RadixTabs.Root>, 'onValueChange'> {
|
|
7
|
+
/** Visual variant. Default: "solid". */
|
|
8
|
+
variant?: TabsVariant;
|
|
9
|
+
/** Size preset. Default: "md". */
|
|
10
|
+
size?: TabsSize;
|
|
11
|
+
/** Stretch triggers to fill the list width. */
|
|
12
|
+
fitted?: boolean;
|
|
13
|
+
/**
|
|
14
|
+
* @deprecated Chakra-compat. Radix mounts lazily by default (content only
|
|
15
|
+
* renders when active). Kept so call-sites don't break at compile time.
|
|
16
|
+
*/
|
|
17
|
+
lazyMount?: boolean;
|
|
18
|
+
/**
|
|
19
|
+
* @deprecated Chakra-compat. Radix unmounts inactive content by default.
|
|
20
|
+
* Kept so call-sites don't break at compile time.
|
|
21
|
+
*/
|
|
22
|
+
unmountOnExit?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Chakra-compatible value-change handler.
|
|
25
|
+
* Accepts both `(details: { value: string }) => void` (Chakra convention)
|
|
26
|
+
* and `(value: string) => void` (Radix convention).
|
|
27
|
+
*/
|
|
28
|
+
onValueChange?: ((details: {
|
|
29
|
+
value: string;
|
|
30
|
+
}) => void) | ((value: string) => void);
|
|
31
|
+
}
|
|
32
|
+
declare const TabsRoot: React.ForwardRefExoticComponent<TabsProps & React.RefAttributes<HTMLDivElement>>;
|
|
33
|
+
interface TabsListProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
34
|
+
asChild?: boolean;
|
|
35
|
+
loop?: boolean;
|
|
36
|
+
flexWrap?: string;
|
|
37
|
+
alignItems?: string;
|
|
38
|
+
whiteSpace?: string;
|
|
39
|
+
bgColor?: string;
|
|
40
|
+
marginBottom?: number | string;
|
|
41
|
+
mx?: string | Record<string, string>;
|
|
42
|
+
px?: string | Record<string, string>;
|
|
43
|
+
w?: string | Record<string, string>;
|
|
44
|
+
overflowX?: string | Record<string, string>;
|
|
45
|
+
overscrollBehaviorX?: string;
|
|
46
|
+
css?: Record<string, unknown>;
|
|
47
|
+
position?: string;
|
|
48
|
+
boxShadow?: string | Record<string, string>;
|
|
49
|
+
top?: number | string;
|
|
50
|
+
zIndex?: string | Record<string, string>;
|
|
51
|
+
}
|
|
52
|
+
declare const TabsList: React.ForwardRefExoticComponent<TabsListProps & React.RefAttributes<HTMLDivElement>>;
|
|
53
|
+
interface TabsTriggerProps extends Omit<React.ComponentPropsWithoutRef<typeof RadixTabs.Trigger>, 'dir'> {
|
|
54
|
+
scrollSnapAlign?: string;
|
|
55
|
+
flexShrink?: number;
|
|
56
|
+
bgColor?: string | Record<string, string>;
|
|
57
|
+
w?: string;
|
|
58
|
+
py?: string;
|
|
59
|
+
borderRadius?: string;
|
|
60
|
+
fontWeight?: string;
|
|
61
|
+
color?: string;
|
|
62
|
+
_hover?: Record<string, string>;
|
|
63
|
+
position?: string;
|
|
64
|
+
top?: string;
|
|
65
|
+
left?: string;
|
|
66
|
+
visibility?: string;
|
|
67
|
+
}
|
|
68
|
+
declare const TabsTrigger: React.ForwardRefExoticComponent<TabsTriggerProps & React.RefAttributes<HTMLButtonElement>>;
|
|
69
|
+
interface TabsContentProps extends React.ComponentPropsWithoutRef<typeof RadixTabs.Content> {
|
|
70
|
+
padding?: number | string;
|
|
71
|
+
}
|
|
72
|
+
declare const TabsContent: React.ForwardRefExoticComponent<TabsContentProps & React.RefAttributes<HTMLDivElement>>;
|
|
73
|
+
interface TabsCounterProps {
|
|
74
|
+
count?: number | null;
|
|
75
|
+
}
|
|
76
|
+
declare const TabsCounter: ({ count }: TabsCounterProps) => React.ReactElement | null;
|
|
77
|
+
|
|
78
|
+
export { TabsContent, type TabsContentProps, TabsCounter, type TabsCounterProps, TabsList, type TabsListProps, type TabsProps, TabsRoot, TabsTrigger, type TabsTriggerProps };
|
package/dist/tabs.js
ADDED
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import * as RadixTabs from '@radix-ui/react-tabs';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { clsx } from 'clsx';
|
|
5
|
+
import { twMerge } from 'tailwind-merge';
|
|
6
|
+
import { jsx } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
// src/tabs.tsx
|
|
9
|
+
function cn(...inputs) {
|
|
10
|
+
return twMerge(clsx(inputs));
|
|
11
|
+
}
|
|
12
|
+
var ROOT_SIZE_CLASSES = {
|
|
13
|
+
sm: "[--tabs-height:2rem] [--tabs-content-padding:1.5rem]",
|
|
14
|
+
md: "[--tabs-height:2.5rem] [--tabs-content-padding:1.5rem]",
|
|
15
|
+
free: ""
|
|
16
|
+
};
|
|
17
|
+
var TabsRoot = React.forwardRef(
|
|
18
|
+
function TabsRoot2(props, ref) {
|
|
19
|
+
const {
|
|
20
|
+
variant = "solid",
|
|
21
|
+
size = "md",
|
|
22
|
+
fitted,
|
|
23
|
+
lazyMount: _lazyMount,
|
|
24
|
+
unmountOnExit: _unmountOnExit,
|
|
25
|
+
onValueChange,
|
|
26
|
+
className,
|
|
27
|
+
...rest
|
|
28
|
+
} = props;
|
|
29
|
+
const handleValueChange = React.useCallback(
|
|
30
|
+
(value) => {
|
|
31
|
+
if (!onValueChange) return;
|
|
32
|
+
onValueChange({ value });
|
|
33
|
+
},
|
|
34
|
+
[onValueChange]
|
|
35
|
+
);
|
|
36
|
+
return /* @__PURE__ */ jsx(
|
|
37
|
+
RadixTabs.Root,
|
|
38
|
+
{
|
|
39
|
+
ref,
|
|
40
|
+
"data-variant": variant,
|
|
41
|
+
"data-size": size,
|
|
42
|
+
"data-fitted": fitted ? "" : void 0,
|
|
43
|
+
className: cn(
|
|
44
|
+
"relative",
|
|
45
|
+
ROOT_SIZE_CLASSES[size],
|
|
46
|
+
className
|
|
47
|
+
),
|
|
48
|
+
onValueChange: onValueChange ? handleValueChange : void 0,
|
|
49
|
+
...rest
|
|
50
|
+
}
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
);
|
|
54
|
+
var TabsList = React.forwardRef(
|
|
55
|
+
function TabsList2(props, ref) {
|
|
56
|
+
const {
|
|
57
|
+
className,
|
|
58
|
+
// Strip Chakra style props
|
|
59
|
+
flexWrap: _flexWrap,
|
|
60
|
+
alignItems: _alignItems,
|
|
61
|
+
whiteSpace: _whiteSpace,
|
|
62
|
+
bgColor: _bgColor,
|
|
63
|
+
marginBottom: _marginBottom,
|
|
64
|
+
mx: _mx,
|
|
65
|
+
px: _px,
|
|
66
|
+
w: _w,
|
|
67
|
+
overflowX: _overflowX,
|
|
68
|
+
overscrollBehaviorX: _overscrollBehaviorX,
|
|
69
|
+
css: _css,
|
|
70
|
+
position: _position,
|
|
71
|
+
boxShadow: _boxShadow,
|
|
72
|
+
top: _top,
|
|
73
|
+
zIndex: _zIndex,
|
|
74
|
+
style: styleProp,
|
|
75
|
+
asChild,
|
|
76
|
+
loop,
|
|
77
|
+
...rest
|
|
78
|
+
} = props;
|
|
79
|
+
return /* @__PURE__ */ jsx(
|
|
80
|
+
RadixTabs.List,
|
|
81
|
+
{
|
|
82
|
+
ref,
|
|
83
|
+
asChild,
|
|
84
|
+
loop,
|
|
85
|
+
className: cn(
|
|
86
|
+
"inline-flex w-full relative isolate flex-row",
|
|
87
|
+
"min-h-[var(--tabs-height,2.5rem)]",
|
|
88
|
+
className
|
|
89
|
+
),
|
|
90
|
+
style: styleProp,
|
|
91
|
+
...rest
|
|
92
|
+
}
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
);
|
|
96
|
+
var TRIGGER_BASE = "outline-none min-w-[var(--tabs-height,2.5rem)] h-[var(--tabs-height,2.5rem)] flex items-center relative cursor-pointer gap-2 focus-visible:z-[1] focus-visible:outline-2 focus-visible:outline-offset-0 disabled:cursor-not-allowed disabled:opacity-50";
|
|
97
|
+
var TRIGGER_SIZE_CLASSES = {
|
|
98
|
+
sm: "py-1 px-3 text-sm",
|
|
99
|
+
md: "py-2 px-4 text-base",
|
|
100
|
+
free: ""
|
|
101
|
+
};
|
|
102
|
+
var TRIGGER_VARIANT_CLASSES = {
|
|
103
|
+
solid: "font-semibold gap-1 rounded-md bg-transparent text-tabs-solid-fg data-[state=active]:bg-selected-control-bg data-[state=active]:text-selected-control-text data-[state=active]:hover:text-selected-control-text hover:text-hover",
|
|
104
|
+
secondary: "font-medium bg-transparent text-tabs-secondary-fg border-2 border-solid border-tabs-secondary-border rounded-md data-[state=active]:bg-selected-control-bg data-[state=active]:text-selected-control-text data-[state=active]:border-transparent data-[state=active]:hover:border-transparent hover:text-hover hover:border-hover",
|
|
105
|
+
segmented: "bg-transparent text-text-primary border-2 border-solid border-selected-control-bg hover:text-hover data-[state=active]:text-selected-control-text data-[state=active]:bg-selected-control-bg data-[state=active]:border-selected-control-bg data-[state=active]:hover:text-selected-control-text",
|
|
106
|
+
unstyled: ""
|
|
107
|
+
};
|
|
108
|
+
var TabsTrigger = React.forwardRef(
|
|
109
|
+
function TabsTrigger2(props, ref) {
|
|
110
|
+
const {
|
|
111
|
+
className,
|
|
112
|
+
// Strip Chakra style props
|
|
113
|
+
scrollSnapAlign: _scrollSnapAlign,
|
|
114
|
+
flexShrink: _flexShrink,
|
|
115
|
+
bgColor: _bgColor,
|
|
116
|
+
w: _w,
|
|
117
|
+
py: _py,
|
|
118
|
+
borderRadius: _borderRadius,
|
|
119
|
+
fontWeight: _fontWeight,
|
|
120
|
+
color: _color,
|
|
121
|
+
_hover,
|
|
122
|
+
position: _position,
|
|
123
|
+
top: _top,
|
|
124
|
+
left: _left,
|
|
125
|
+
visibility: _visibility,
|
|
126
|
+
...rest
|
|
127
|
+
} = props;
|
|
128
|
+
const internalRef = React.useRef(null);
|
|
129
|
+
const mergedRef = useMergedRef(ref, internalRef);
|
|
130
|
+
const { variant, size, fitted } = useTabsContext(internalRef);
|
|
131
|
+
return /* @__PURE__ */ jsx(
|
|
132
|
+
RadixTabs.Trigger,
|
|
133
|
+
{
|
|
134
|
+
ref: mergedRef,
|
|
135
|
+
className: cn(
|
|
136
|
+
"group",
|
|
137
|
+
TRIGGER_BASE,
|
|
138
|
+
TRIGGER_SIZE_CLASSES[size],
|
|
139
|
+
TRIGGER_VARIANT_CLASSES[variant],
|
|
140
|
+
fitted && "flex-1 text-center justify-center",
|
|
141
|
+
className
|
|
142
|
+
),
|
|
143
|
+
...rest
|
|
144
|
+
}
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
);
|
|
148
|
+
var TabsContent = React.forwardRef(
|
|
149
|
+
function TabsContent2(props, ref) {
|
|
150
|
+
const { className, padding: _padding, ...rest } = props;
|
|
151
|
+
return /* @__PURE__ */ jsx(
|
|
152
|
+
RadixTabs.Content,
|
|
153
|
+
{
|
|
154
|
+
ref,
|
|
155
|
+
className: cn(
|
|
156
|
+
"w-full pt-[var(--tabs-content-padding,1.5rem)]",
|
|
157
|
+
"focus-visible:outline-2 focus-visible:outline-offset-[-2px]",
|
|
158
|
+
className
|
|
159
|
+
),
|
|
160
|
+
...rest
|
|
161
|
+
}
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
);
|
|
165
|
+
var COUNTER_OVERLOAD = 50;
|
|
166
|
+
var TabsCounter = ({ count }) => {
|
|
167
|
+
if (count === void 0 || count === null) {
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
return /* @__PURE__ */ jsx(
|
|
171
|
+
"span",
|
|
172
|
+
{
|
|
173
|
+
className: cn(
|
|
174
|
+
"group-hover:text-inherit",
|
|
175
|
+
count > 0 ? "text-text-secondary" : "text-[rgba(16,17,18,0.24)] dark:text-[rgba(255,255,255,0.24)]"
|
|
176
|
+
),
|
|
177
|
+
children: count > COUNTER_OVERLOAD ? `${COUNTER_OVERLOAD}+` : count
|
|
178
|
+
}
|
|
179
|
+
);
|
|
180
|
+
};
|
|
181
|
+
function useTabsContext(triggerRef) {
|
|
182
|
+
const [ctx, setCtx] = React.useState({ variant: "solid", size: "md", fitted: false });
|
|
183
|
+
React.useEffect(() => {
|
|
184
|
+
const el = triggerRef.current;
|
|
185
|
+
if (!el) return;
|
|
186
|
+
const root = el.closest("[data-variant]");
|
|
187
|
+
if (!root) return;
|
|
188
|
+
setCtx({
|
|
189
|
+
variant: root.getAttribute("data-variant") ?? "solid",
|
|
190
|
+
size: root.getAttribute("data-size") ?? "md",
|
|
191
|
+
fitted: root.hasAttribute("data-fitted")
|
|
192
|
+
});
|
|
193
|
+
}, [triggerRef]);
|
|
194
|
+
return ctx;
|
|
195
|
+
}
|
|
196
|
+
function useMergedRef(...refs) {
|
|
197
|
+
return React.useCallback(
|
|
198
|
+
(instance) => {
|
|
199
|
+
for (const ref of refs) {
|
|
200
|
+
if (!ref) continue;
|
|
201
|
+
if (typeof ref === "function") {
|
|
202
|
+
ref(instance);
|
|
203
|
+
} else {
|
|
204
|
+
ref.current = instance;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
},
|
|
208
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
209
|
+
refs
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
export { TabsContent, TabsCounter, TabsList, TabsRoot, TabsTrigger };
|