@7onic-ui/react 0.3.8 → 0.3.10
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/README.md +2 -2
- package/dist/chart.js +1 -1
- package/dist/chart.js.map +1 -1
- package/dist/chart.mjs +4 -10
- package/dist/chart.mjs.map +1 -1
- package/dist/chunk-234NAXGV.mjs +252 -0
- package/dist/chunk-234NAXGV.mjs.map +1 -0
- package/dist/chunk-53MIUPSY.mjs +13 -0
- package/dist/chunk-53MIUPSY.mjs.map +1 -0
- package/dist/chunk-BN5BEA3V.mjs +195 -0
- package/dist/chunk-BN5BEA3V.mjs.map +1 -0
- package/dist/chunk-COW3B62M.mjs +214 -0
- package/dist/chunk-COW3B62M.mjs.map +1 -0
- package/dist/chunk-CTH6SN5Y.mjs +114 -0
- package/dist/chunk-CTH6SN5Y.mjs.map +1 -0
- package/dist/chunk-D3NTQNDW.mjs +440 -0
- package/dist/chunk-D3NTQNDW.mjs.map +1 -0
- package/dist/chunk-DDRYEJBJ.mjs +164 -0
- package/dist/chunk-DDRYEJBJ.mjs.map +1 -0
- package/dist/chunk-DJAEXCRU.mjs +190 -0
- package/dist/chunk-DJAEXCRU.mjs.map +1 -0
- package/dist/chunk-DRVHHEAY.mjs +145 -0
- package/dist/chunk-DRVHHEAY.mjs.map +1 -0
- package/dist/chunk-DTLNWOTR.mjs +482 -0
- package/dist/chunk-DTLNWOTR.mjs.map +1 -0
- package/dist/chunk-DYYQOHQR.mjs +214 -0
- package/dist/chunk-DYYQOHQR.mjs.map +1 -0
- package/dist/chunk-FHUAH6AJ.mjs +93 -0
- package/dist/chunk-FHUAH6AJ.mjs.map +1 -0
- package/dist/chunk-GD4YE5AE.mjs +209 -0
- package/dist/chunk-GD4YE5AE.mjs.map +1 -0
- package/dist/chunk-GRCJ35DX.mjs +144 -0
- package/dist/chunk-GRCJ35DX.mjs.map +1 -0
- package/dist/chunk-HHX4GABH.mjs +129 -0
- package/dist/chunk-HHX4GABH.mjs.map +1 -0
- package/dist/chunk-IPCIC2BI.mjs +148 -0
- package/dist/chunk-IPCIC2BI.mjs.map +1 -0
- package/dist/chunk-IY3R2VGB.mjs +272 -0
- package/dist/chunk-IY3R2VGB.mjs.map +1 -0
- package/dist/chunk-JCJEVXER.mjs +170 -0
- package/dist/chunk-JCJEVXER.mjs.map +1 -0
- package/dist/chunk-KBPYAMGS.mjs +157 -0
- package/dist/chunk-KBPYAMGS.mjs.map +1 -0
- package/dist/chunk-LJJ6K4IU.mjs +318 -0
- package/dist/chunk-LJJ6K4IU.mjs.map +1 -0
- package/dist/chunk-MRUVGHGP.mjs +375 -0
- package/dist/chunk-MRUVGHGP.mjs.map +1 -0
- package/dist/chunk-N4K2BDGM.mjs +153 -0
- package/dist/chunk-N4K2BDGM.mjs.map +1 -0
- package/dist/chunk-NWFMJWGX.mjs +165 -0
- package/dist/chunk-NWFMJWGX.mjs.map +1 -0
- package/dist/chunk-PTAPPOKU.mjs +117 -0
- package/dist/chunk-PTAPPOKU.mjs.map +1 -0
- package/dist/chunk-PVTBM7V7.mjs +316 -0
- package/dist/chunk-PVTBM7V7.mjs.map +1 -0
- package/dist/chunk-Q5WVLK2L.mjs +77 -0
- package/dist/chunk-Q5WVLK2L.mjs.map +1 -0
- package/dist/chunk-RKSB2N5L.mjs +206 -0
- package/dist/chunk-RKSB2N5L.mjs.map +1 -0
- package/dist/chunk-S4DGVKBK.mjs +151 -0
- package/dist/chunk-S4DGVKBK.mjs.map +1 -0
- package/dist/chunk-S4T4PU7F.mjs +114 -0
- package/dist/chunk-S4T4PU7F.mjs.map +1 -0
- package/dist/chunk-SZPZOGPC.mjs +394 -0
- package/dist/chunk-SZPZOGPC.mjs.map +1 -0
- package/dist/chunk-T546XBQG.mjs +443 -0
- package/dist/chunk-T546XBQG.mjs.map +1 -0
- package/dist/chunk-UWTT5AE6.mjs +145 -0
- package/dist/chunk-UWTT5AE6.mjs.map +1 -0
- package/dist/chunk-V5UFWYFI.mjs +255 -0
- package/dist/chunk-V5UFWYFI.mjs.map +1 -0
- package/dist/chunk-VUPGBB5X.mjs +150 -0
- package/dist/chunk-VUPGBB5X.mjs.map +1 -0
- package/dist/chunk-W6YNEU53.mjs +175 -0
- package/dist/chunk-W6YNEU53.mjs.map +1 -0
- package/dist/chunk-WWSN5YME.mjs +222 -0
- package/dist/chunk-WWSN5YME.mjs.map +1 -0
- package/dist/chunk-XK52LYR4.mjs +182 -0
- package/dist/chunk-XK52LYR4.mjs.map +1 -0
- package/dist/chunk-YIAH6KHV.mjs +164 -0
- package/dist/chunk-YIAH6KHV.mjs.map +1 -0
- package/dist/chunk-Z6JWWCNL.mjs +108 -0
- package/dist/chunk-Z6JWWCNL.mjs.map +1 -0
- package/dist/chunk-ZDRUTJ4T.mjs +119 -0
- package/dist/chunk-ZDRUTJ4T.mjs.map +1 -0
- package/dist/components/accordion.mjs +19 -0
- package/dist/components/accordion.mjs.map +1 -0
- package/dist/components/alert.mjs +15 -0
- package/dist/components/alert.mjs.map +1 -0
- package/dist/components/avatar.mjs +23 -0
- package/dist/components/avatar.mjs.map +1 -0
- package/dist/components/badge.mjs +11 -0
- package/dist/components/badge.mjs.map +1 -0
- package/dist/components/breadcrumb.mjs +23 -0
- package/dist/components/breadcrumb.mjs.map +1 -0
- package/dist/components/button-group.mjs +11 -0
- package/dist/components/button-group.mjs.map +1 -0
- package/dist/components/button.mjs +12 -0
- package/dist/components/button.mjs.map +1 -0
- package/dist/components/card.mjs +25 -0
- package/dist/components/card.mjs.map +1 -0
- package/dist/components/chat-input.mjs +15 -0
- package/dist/components/chat-input.mjs.map +1 -0
- package/dist/components/chat-message.mjs +17 -0
- package/dist/components/chat-message.mjs.map +1 -0
- package/dist/components/checkbox.mjs +12 -0
- package/dist/components/checkbox.mjs.map +1 -0
- package/dist/components/divider.mjs +11 -0
- package/dist/components/divider.mjs.map +1 -0
- package/dist/components/drawer.mjs +33 -0
- package/dist/components/drawer.mjs.map +1 -0
- package/dist/components/dropdown.mjs +35 -0
- package/dist/components/dropdown.mjs.map +1 -0
- package/dist/components/field.mjs +17 -0
- package/dist/components/field.mjs.map +1 -0
- package/dist/components/icon-button.mjs +12 -0
- package/dist/components/icon-button.mjs.map +1 -0
- package/dist/components/input.mjs +12 -0
- package/dist/components/input.mjs.map +1 -0
- package/dist/components/metric-card.mjs +23 -0
- package/dist/components/metric-card.mjs.map +1 -0
- package/dist/components/modal.mjs +57 -0
- package/dist/components/modal.mjs.map +1 -0
- package/dist/components/navigation-menu.mjs +27 -0
- package/dist/components/navigation-menu.mjs.map +1 -0
- package/dist/components/pagination.mjs +33 -0
- package/dist/components/pagination.mjs.map +1 -0
- package/dist/components/popover.mjs +23 -0
- package/dist/components/popover.mjs.map +1 -0
- package/dist/components/progress.mjs +11 -0
- package/dist/components/progress.mjs.map +1 -0
- package/dist/components/quick-reply.mjs +15 -0
- package/dist/components/quick-reply.mjs.map +1 -0
- package/dist/components/radio-group.mjs +16 -0
- package/dist/components/radio-group.mjs.map +1 -0
- package/dist/components/segmented.mjs +15 -0
- package/dist/components/segmented.mjs.map +1 -0
- package/dist/components/select.mjs +23 -0
- package/dist/components/select.mjs.map +1 -0
- package/dist/components/skeleton.mjs +11 -0
- package/dist/components/skeleton.mjs.map +1 -0
- package/dist/components/slider.mjs +11 -0
- package/dist/components/slider.mjs.map +1 -0
- package/dist/components/spinner.mjs +11 -0
- package/dist/components/spinner.mjs.map +1 -0
- package/dist/components/switch.mjs +12 -0
- package/dist/components/switch.mjs.map +1 -0
- package/dist/components/table.mjs +23 -0
- package/dist/components/table.mjs.map +1 -0
- package/dist/components/tabs.mjs +19 -0
- package/dist/components/tabs.mjs.map +1 -0
- package/dist/components/textarea.mjs +12 -0
- package/dist/components/textarea.mjs.map +1 -0
- package/dist/components/toast.mjs +13 -0
- package/dist/components/toast.mjs.map +1 -0
- package/dist/components/toggle-group.mjs +15 -0
- package/dist/components/toggle-group.mjs.map +1 -0
- package/dist/components/toggle.mjs +11 -0
- package/dist/components/toggle.mjs.map +1 -0
- package/dist/components/tooltip.mjs +21 -0
- package/dist/components/tooltip.mjs.map +1 -0
- package/dist/components/typing-indicator.mjs +11 -0
- package/dist/components/typing-indicator.mjs.map +1 -0
- package/dist/index.js +22 -7
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +296 -7521
- package/dist/index.mjs.map +1 -1
- package/llms.txt +29 -25
- package/package.json +4 -3
- package/dist/chart.d.mts +0 -147
- package/dist/index.d.mts +0 -1535
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
cn
|
|
4
|
+
} from "./chunk-53MIUPSY.mjs";
|
|
5
|
+
|
|
6
|
+
// src/components/ui/tabs.tsx
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
import * as TabsPrimitive from "@radix-ui/react-tabs";
|
|
9
|
+
import { cva } from "class-variance-authority";
|
|
10
|
+
var TabsStyleContext = React.createContext({});
|
|
11
|
+
var useTabsStyleContext = () => React.useContext(TabsStyleContext);
|
|
12
|
+
var tabsListVariants = cva(
|
|
13
|
+
"inline-flex items-center text-text-subtle",
|
|
14
|
+
{
|
|
15
|
+
variants: {
|
|
16
|
+
variant: {
|
|
17
|
+
line: "border-b border-border bg-transparent gap-0",
|
|
18
|
+
enclosed: "border-b border-border bg-transparent gap-0",
|
|
19
|
+
pill: "bg-background-muted p-1 gap-1"
|
|
20
|
+
},
|
|
21
|
+
fitted: {
|
|
22
|
+
true: "w-full",
|
|
23
|
+
false: ""
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
defaultVariants: {
|
|
27
|
+
variant: "line",
|
|
28
|
+
fitted: false
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
);
|
|
32
|
+
var TabsList = React.forwardRef(({ className, variant, size, fitted, color, radius, ...props }, ref) => {
|
|
33
|
+
const resolvedVariant = variant || "line";
|
|
34
|
+
return /* @__PURE__ */ React.createElement(TabsStyleContext.Provider, { value: { variant: resolvedVariant, size: size || "default", fitted: fitted ?? false, color: color || "default", radius: radius || "md" } }, /* @__PURE__ */ React.createElement(
|
|
35
|
+
TabsPrimitive.List,
|
|
36
|
+
{
|
|
37
|
+
ref,
|
|
38
|
+
className: cn(
|
|
39
|
+
tabsListVariants({ variant, fitted }),
|
|
40
|
+
resolvedVariant === "pill" && pillListRadiusClasses[radius || "md"],
|
|
41
|
+
className
|
|
42
|
+
),
|
|
43
|
+
...props
|
|
44
|
+
}
|
|
45
|
+
));
|
|
46
|
+
});
|
|
47
|
+
TabsList.displayName = "TabsList";
|
|
48
|
+
var tabsTriggerVariants = cva(
|
|
49
|
+
[
|
|
50
|
+
"inline-flex items-center justify-center gap-2 whitespace-nowrap",
|
|
51
|
+
"transition-all duration-micro ease-out cursor-pointer",
|
|
52
|
+
// Keyboard-only focus ring: see pointer tracking in TabsTrigger
|
|
53
|
+
"[&:focus-visible:not([data-pointer-focus])]:focus-ring",
|
|
54
|
+
"disabled:pointer-events-none disabled:text-text-subtle disabled:opacity-50"
|
|
55
|
+
].join(" "),
|
|
56
|
+
{
|
|
57
|
+
variants: {
|
|
58
|
+
variant: {
|
|
59
|
+
line: [
|
|
60
|
+
"border-b-2 border-transparent -mb-px",
|
|
61
|
+
"hover:text-foreground hover:border-border",
|
|
62
|
+
"data-[state=active]:text-foreground data-[state=active]:font-semibold"
|
|
63
|
+
].join(" "),
|
|
64
|
+
enclosed: [
|
|
65
|
+
"border border-transparent -mb-px",
|
|
66
|
+
"hover:text-foreground",
|
|
67
|
+
"data-[state=active]:text-foreground data-[state=active]:font-semibold data-[state=active]:bg-background",
|
|
68
|
+
"data-[state=active]:border-border data-[state=active]:border-b-background"
|
|
69
|
+
].join(" "),
|
|
70
|
+
pill: [
|
|
71
|
+
"hover:text-foreground",
|
|
72
|
+
"data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:font-semibold data-[state=active]:shadow-sm"
|
|
73
|
+
].join(" ")
|
|
74
|
+
},
|
|
75
|
+
size: {
|
|
76
|
+
sm: "h-8 text-sm",
|
|
77
|
+
// 32px, 13px
|
|
78
|
+
md: "h-9 text-sm",
|
|
79
|
+
// 36px, 13px
|
|
80
|
+
default: "h-10 text-md",
|
|
81
|
+
// 40px, 14px
|
|
82
|
+
lg: "h-12 text-base"
|
|
83
|
+
// 48px, 16px
|
|
84
|
+
},
|
|
85
|
+
fitted: {
|
|
86
|
+
true: "flex-1",
|
|
87
|
+
false: ""
|
|
88
|
+
}
|
|
89
|
+
},
|
|
90
|
+
compoundVariants: [
|
|
91
|
+
// Padding per variant × size
|
|
92
|
+
{ variant: "line", size: "sm", className: "px-3" },
|
|
93
|
+
{ variant: "line", size: "md", className: "px-3.5" },
|
|
94
|
+
{ variant: "line", size: "default", className: "px-4" },
|
|
95
|
+
{ variant: "line", size: "lg", className: "px-6" },
|
|
96
|
+
{ variant: "enclosed", size: "sm", className: "px-3" },
|
|
97
|
+
{ variant: "enclosed", size: "md", className: "px-3.5" },
|
|
98
|
+
{ variant: "enclosed", size: "default", className: "px-4" },
|
|
99
|
+
{ variant: "enclosed", size: "lg", className: "px-6" },
|
|
100
|
+
// Pill: reduced height + Segmented-matching font/padding
|
|
101
|
+
{ variant: "pill", size: "sm", className: "h-6 text-xs px-3.5" },
|
|
102
|
+
{ variant: "pill", size: "md", className: "h-7 text-sm px-3.5" },
|
|
103
|
+
{ variant: "pill", size: "default", className: "h-8 text-sm px-4" },
|
|
104
|
+
{ variant: "pill", size: "lg", className: "h-10 text-md px-6" }
|
|
105
|
+
],
|
|
106
|
+
defaultVariants: {
|
|
107
|
+
variant: "line",
|
|
108
|
+
size: "default",
|
|
109
|
+
fitted: false
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
);
|
|
113
|
+
var triggerIconSizeClasses = {
|
|
114
|
+
sm: "[&>svg]:icon-xs",
|
|
115
|
+
// 14px
|
|
116
|
+
md: "[&>svg]:icon-sm",
|
|
117
|
+
// 16px
|
|
118
|
+
default: "[&>svg]:icon-sm",
|
|
119
|
+
// 16px
|
|
120
|
+
lg: "[&>svg]:icon-sm"
|
|
121
|
+
// 16px
|
|
122
|
+
};
|
|
123
|
+
var lineColorClasses = {
|
|
124
|
+
default: "data-[state=active]:border-foreground",
|
|
125
|
+
primary: "data-[state=active]:border-primary"
|
|
126
|
+
};
|
|
127
|
+
var enclosedRadiusClasses = {
|
|
128
|
+
none: "rounded-t-none",
|
|
129
|
+
sm: "rounded-t-sm",
|
|
130
|
+
base: "rounded-t",
|
|
131
|
+
md: "rounded-t-md",
|
|
132
|
+
lg: "rounded-t-lg",
|
|
133
|
+
xl: "rounded-t-xl"
|
|
134
|
+
};
|
|
135
|
+
var pillListRadiusClasses = {
|
|
136
|
+
none: "rounded-none",
|
|
137
|
+
sm: "rounded-sm",
|
|
138
|
+
base: "rounded",
|
|
139
|
+
md: "rounded-md",
|
|
140
|
+
lg: "rounded-lg",
|
|
141
|
+
xl: "rounded-xl",
|
|
142
|
+
"2xl": "rounded-2xl",
|
|
143
|
+
"3xl": "rounded-3xl",
|
|
144
|
+
full: "rounded-full"
|
|
145
|
+
};
|
|
146
|
+
var pillItemRadiusClasses = {
|
|
147
|
+
none: "rounded-none",
|
|
148
|
+
sm: "rounded-sm",
|
|
149
|
+
base: "rounded",
|
|
150
|
+
md: "rounded-md",
|
|
151
|
+
lg: "rounded-md",
|
|
152
|
+
xl: "rounded-lg",
|
|
153
|
+
"2xl": "rounded-xl",
|
|
154
|
+
"3xl": "rounded-2xl",
|
|
155
|
+
full: "rounded-full"
|
|
156
|
+
};
|
|
157
|
+
var TabsTrigger = React.forwardRef(({ className, children, onPointerDown, onKeyDown, onBlur, ...props }, ref) => {
|
|
158
|
+
const { variant, size, fitted, color, radius } = useTabsStyleContext();
|
|
159
|
+
const resolvedSize = size || "default";
|
|
160
|
+
const [pointerFocus, setPointerFocus] = React.useState(false);
|
|
161
|
+
return /* @__PURE__ */ React.createElement(
|
|
162
|
+
TabsPrimitive.Trigger,
|
|
163
|
+
{
|
|
164
|
+
ref,
|
|
165
|
+
className: cn(
|
|
166
|
+
tabsTriggerVariants({ variant, size: resolvedSize, fitted }),
|
|
167
|
+
triggerIconSizeClasses[resolvedSize],
|
|
168
|
+
variant === "line" && lineColorClasses[color || "default"],
|
|
169
|
+
variant === "enclosed" && enclosedRadiusClasses[radius || "md"],
|
|
170
|
+
variant === "pill" && pillItemRadiusClasses[radius || "md"],
|
|
171
|
+
className
|
|
172
|
+
),
|
|
173
|
+
"data-pointer-focus": pointerFocus ? "" : void 0,
|
|
174
|
+
onPointerDown: (event) => {
|
|
175
|
+
setPointerFocus(true);
|
|
176
|
+
onPointerDown?.(event);
|
|
177
|
+
},
|
|
178
|
+
onKeyDown: (event) => {
|
|
179
|
+
setPointerFocus(false);
|
|
180
|
+
onKeyDown?.(event);
|
|
181
|
+
},
|
|
182
|
+
onBlur: (event) => {
|
|
183
|
+
setPointerFocus(false);
|
|
184
|
+
onBlur?.(event);
|
|
185
|
+
},
|
|
186
|
+
...props
|
|
187
|
+
},
|
|
188
|
+
children
|
|
189
|
+
);
|
|
190
|
+
});
|
|
191
|
+
TabsTrigger.displayName = "TabsTrigger";
|
|
192
|
+
var TabsContent = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React.createElement(
|
|
193
|
+
TabsPrimitive.Content,
|
|
194
|
+
{
|
|
195
|
+
ref,
|
|
196
|
+
className: cn(
|
|
197
|
+
"mt-4 focus-visible:focus-ring",
|
|
198
|
+
className
|
|
199
|
+
),
|
|
200
|
+
...props
|
|
201
|
+
}
|
|
202
|
+
));
|
|
203
|
+
TabsContent.displayName = "TabsContent";
|
|
204
|
+
var Tabs = TabsPrimitive.Root;
|
|
205
|
+
|
|
206
|
+
export {
|
|
207
|
+
tabsListVariants,
|
|
208
|
+
TabsList,
|
|
209
|
+
tabsTriggerVariants,
|
|
210
|
+
TabsTrigger,
|
|
211
|
+
TabsContent,
|
|
212
|
+
Tabs
|
|
213
|
+
};
|
|
214
|
+
//# sourceMappingURL=chunk-COW3B62M.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/tabs.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as TabsPrimitive from '@radix-ui/react-tabs'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@/lib/utils'\n\n// Context to pass style props from TabsList to TabsTrigger\ntype TabsStyleContextValue = {\n variant?: 'line' | 'enclosed' | 'pill'\n size?: 'sm' | 'md' | 'default' | 'lg'\n fitted?: boolean\n color?: 'default' | 'primary'\n radius?: 'none' | 'sm' | 'base' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'\n}\nconst TabsStyleContext = React.createContext<TabsStyleContextValue>({})\nconst useTabsStyleContext = () => React.useContext(TabsStyleContext)\n\n// ─── TabsList ────────────────────────────────────────────────\n\nconst tabsListVariants = cva(\n 'inline-flex items-center text-text-subtle',\n {\n variants: {\n variant: {\n line: 'border-b border-border bg-transparent gap-0',\n enclosed: 'border-b border-border bg-transparent gap-0',\n pill: 'bg-background-muted p-1 gap-1',\n },\n fitted: {\n true: 'w-full',\n false: '',\n },\n },\n defaultVariants: {\n variant: 'line',\n fitted: false,\n },\n }\n)\n\nexport interface TabsListProps\n extends React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>,\n VariantProps<typeof tabsListVariants> {\n size?: 'sm' | 'md' | 'default' | 'lg'\n /** Indicator color for line variant */\n color?: 'default' | 'primary'\n /** Top border-radius for enclosed variant, container radius for pill variant */\n radius?: 'none' | 'sm' | 'base' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | 'full'\n}\n\nconst TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n TabsListProps\n>(({ className, variant, size, fitted, color, radius, ...props }, ref) => {\n const resolvedVariant = variant || 'line'\n return (\n <TabsStyleContext.Provider value={{ variant: resolvedVariant, size: size || 'default', fitted: fitted ?? false, color: color || 'default', radius: radius || 'md' }}>\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n tabsListVariants({ variant, fitted }),\n resolvedVariant === 'pill' && pillListRadiusClasses[radius || 'md'],\n className\n )}\n {...props}\n />\n </TabsStyleContext.Provider>\n )\n})\nTabsList.displayName = 'TabsList'\n\n// ─── TabsTrigger ─────────────────────────────────────────────\n\nconst tabsTriggerVariants = cva(\n [\n 'inline-flex items-center justify-center gap-2 whitespace-nowrap',\n 'transition-all duration-micro ease-out cursor-pointer',\n // Keyboard-only focus ring: see pointer tracking in TabsTrigger\n '[&:focus-visible:not([data-pointer-focus])]:focus-ring',\n 'disabled:pointer-events-none disabled:text-text-subtle disabled:opacity-50',\n ].join(' '),\n {\n variants: {\n variant: {\n line: [\n 'border-b-2 border-transparent -mb-px',\n 'hover:text-foreground hover:border-border',\n 'data-[state=active]:text-foreground data-[state=active]:font-semibold',\n ].join(' '),\n enclosed: [\n 'border border-transparent -mb-px',\n 'hover:text-foreground',\n 'data-[state=active]:text-foreground data-[state=active]:font-semibold data-[state=active]:bg-background',\n 'data-[state=active]:border-border data-[state=active]:border-b-background',\n ].join(' '),\n pill: [\n 'hover:text-foreground',\n 'data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:font-semibold data-[state=active]:shadow-sm',\n ].join(' '),\n },\n size: {\n sm: 'h-8 text-sm', // 32px, 13px\n md: 'h-9 text-sm', // 36px, 13px\n default: 'h-10 text-md', // 40px, 14px\n lg: 'h-12 text-base', // 48px, 16px\n },\n fitted: {\n true: 'flex-1',\n false: '',\n },\n },\n compoundVariants: [\n // Padding per variant × size\n { variant: 'line', size: 'sm', className: 'px-3' },\n { variant: 'line', size: 'md', className: 'px-3.5' },\n { variant: 'line', size: 'default', className: 'px-4' },\n { variant: 'line', size: 'lg', className: 'px-6' },\n { variant: 'enclosed', size: 'sm', className: 'px-3' },\n { variant: 'enclosed', size: 'md', className: 'px-3.5' },\n { variant: 'enclosed', size: 'default', className: 'px-4' },\n { variant: 'enclosed', size: 'lg', className: 'px-6' },\n // Pill: reduced height + Segmented-matching font/padding\n { variant: 'pill', size: 'sm', className: 'h-6 text-xs px-3.5' },\n { variant: 'pill', size: 'md', className: 'h-7 text-sm px-3.5' },\n { variant: 'pill', size: 'default', className: 'h-8 text-sm px-4' },\n { variant: 'pill', size: 'lg', className: 'h-10 text-md px-6' },\n ],\n defaultVariants: {\n variant: 'line',\n size: 'default',\n fitted: false,\n },\n }\n)\n\n// Icon size mapping for tabs (same as Button icon+text pattern)\nconst triggerIconSizeClasses = {\n sm: '[&>svg]:icon-xs', // 14px\n md: '[&>svg]:icon-sm', // 16px\n default: '[&>svg]:icon-sm', // 16px\n lg: '[&>svg]:icon-sm', // 16px\n} as const\n\nexport interface TabsTriggerProps\n extends React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>,\n Omit<VariantProps<typeof tabsTriggerVariants>, 'variant' | 'size' | 'fitted'> {}\n\n// Line variant: active indicator color\nconst lineColorClasses = {\n default: 'data-[state=active]:border-foreground',\n primary: 'data-[state=active]:border-primary',\n} as const\n\n// Enclosed variant: top border-radius\nconst enclosedRadiusClasses = {\n none: 'rounded-t-none',\n sm: 'rounded-t-sm',\n base: 'rounded-t',\n md: 'rounded-t-md',\n lg: 'rounded-t-lg',\n xl: 'rounded-t-xl',\n} as const\n\n// Pill variant: container radius (applied to TabsList, matches Segmented scale)\nconst pillListRadiusClasses = {\n none: 'rounded-none',\n sm: 'rounded-sm',\n base: 'rounded',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n '2xl': 'rounded-2xl',\n '3xl': 'rounded-3xl',\n full: 'rounded-full',\n} as const\n\n// Pill variant: item radius (one step smaller than container, matches Segmented item scale)\nconst pillItemRadiusClasses = {\n none: 'rounded-none',\n sm: 'rounded-sm',\n base: 'rounded',\n md: 'rounded-md',\n lg: 'rounded-md',\n xl: 'rounded-lg',\n '2xl': 'rounded-xl',\n '3xl': 'rounded-2xl',\n full: 'rounded-full',\n} as const\n\nconst TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n TabsTriggerProps\n>(({ className, children, onPointerDown, onKeyDown, onBlur, ...props }, ref) => {\n const { variant, size, fitted, color, radius } = useTabsStyleContext()\n const resolvedSize = size || 'default'\n // Radix Tabs 1.2+ calls focus() on mouse down, so :focus-visible matches after any\n // earlier keyboard input. Mark pointer-initiated focus to keep the ring keyboard-only.\n const [pointerFocus, setPointerFocus] = React.useState(false)\n\n return (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n tabsTriggerVariants({ variant, size: resolvedSize, fitted }),\n triggerIconSizeClasses[resolvedSize],\n variant === 'line' && lineColorClasses[color || 'default'],\n variant === 'enclosed' && enclosedRadiusClasses[(radius || 'md') as keyof typeof enclosedRadiusClasses],\n variant === 'pill' && pillItemRadiusClasses[radius || 'md'],\n className\n )}\n data-pointer-focus={pointerFocus ? '' : undefined}\n onPointerDown={(event) => {\n setPointerFocus(true)\n onPointerDown?.(event)\n }}\n onKeyDown={(event) => {\n setPointerFocus(false)\n onKeyDown?.(event)\n }}\n onBlur={(event) => {\n setPointerFocus(false)\n onBlur?.(event)\n }}\n {...props}\n >\n {children}\n </TabsPrimitive.Trigger>\n )\n})\nTabsTrigger.displayName = 'TabsTrigger'\n\n// ─── TabsContent ─────────────────────────────────────────────\n\nexport interface TabsContentProps\n extends React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content> {}\n\nconst TabsContent = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Content>,\n TabsContentProps\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n 'mt-4 focus-visible:focus-ring',\n className\n )}\n {...props}\n />\n))\nTabsContent.displayName = 'TabsContent'\n\n// ─── Tabs (Root) ─────────────────────────────────────────────\n\nconst Tabs = TabsPrimitive.Root\n\nexport {\n Tabs,\n TabsList,\n TabsTrigger,\n TabsContent,\n tabsListVariants,\n tabsTriggerVariants,\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
cn
|
|
4
|
+
} from "./chunk-53MIUPSY.mjs";
|
|
5
|
+
|
|
6
|
+
// src/components/ui/skeleton.tsx
|
|
7
|
+
import * as React from "react";
|
|
8
|
+
import { cva } from "class-variance-authority";
|
|
9
|
+
var PULSE_DURATION_MS = 2e3;
|
|
10
|
+
var WAVE_DURATION_MS = 1800;
|
|
11
|
+
var WAVE_GRADIENT = [
|
|
12
|
+
"transparent 0%",
|
|
13
|
+
"transparent 30%",
|
|
14
|
+
"var(--color-background-elevated) 50%",
|
|
15
|
+
"transparent 70%",
|
|
16
|
+
"transparent 100%"
|
|
17
|
+
].join(", ");
|
|
18
|
+
var MULTI_LINE_WIDTHS = ["100%", "92%", "100%", "85%", "75%"];
|
|
19
|
+
var skeletonVariants = cva(
|
|
20
|
+
"bg-background-muted",
|
|
21
|
+
{
|
|
22
|
+
variants: {
|
|
23
|
+
variant: {
|
|
24
|
+
text: "rounded-md h-4 w-full",
|
|
25
|
+
circular: "rounded-full w-10 h-10",
|
|
26
|
+
rectangular: "rounded-xl w-full h-24"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
defaultVariants: {
|
|
30
|
+
variant: "text"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
);
|
|
34
|
+
var SkeletonBlock = React.forwardRef(
|
|
35
|
+
({
|
|
36
|
+
className,
|
|
37
|
+
variant = "text",
|
|
38
|
+
animation = "pulse",
|
|
39
|
+
width,
|
|
40
|
+
height,
|
|
41
|
+
radius,
|
|
42
|
+
style,
|
|
43
|
+
...props
|
|
44
|
+
}, ref) => {
|
|
45
|
+
return /* @__PURE__ */ React.createElement(
|
|
46
|
+
"div",
|
|
47
|
+
{
|
|
48
|
+
ref,
|
|
49
|
+
"aria-hidden": "true",
|
|
50
|
+
className: cn(
|
|
51
|
+
skeletonVariants({ variant }),
|
|
52
|
+
animation === "pulse" && "animate-skeleton-pulse",
|
|
53
|
+
animation === "wave" && "relative overflow-hidden",
|
|
54
|
+
className
|
|
55
|
+
),
|
|
56
|
+
style: {
|
|
57
|
+
...style,
|
|
58
|
+
...width != null ? { width } : {},
|
|
59
|
+
...height != null ? { height } : {},
|
|
60
|
+
...radius != null ? { borderRadius: radius } : {},
|
|
61
|
+
...animation === "pulse" ? { animationDuration: `${PULSE_DURATION_MS}ms` } : {}
|
|
62
|
+
},
|
|
63
|
+
...props
|
|
64
|
+
},
|
|
65
|
+
animation === "wave" && /* @__PURE__ */ React.createElement(
|
|
66
|
+
"div",
|
|
67
|
+
{
|
|
68
|
+
className: "absolute inset-0 animate-skeleton-wave",
|
|
69
|
+
style: {
|
|
70
|
+
animationDuration: `${WAVE_DURATION_MS}ms`,
|
|
71
|
+
background: `linear-gradient(90deg, ${WAVE_GRADIENT})`
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
)
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
);
|
|
78
|
+
SkeletonBlock.displayName = "SkeletonBlock";
|
|
79
|
+
var Skeleton = React.forwardRef(
|
|
80
|
+
({
|
|
81
|
+
count,
|
|
82
|
+
loading,
|
|
83
|
+
children,
|
|
84
|
+
variant = "text",
|
|
85
|
+
...rest
|
|
86
|
+
}, ref) => {
|
|
87
|
+
if (loading !== void 0) {
|
|
88
|
+
if (!loading) return /* @__PURE__ */ React.createElement(React.Fragment, null, children);
|
|
89
|
+
}
|
|
90
|
+
if (count != null && count > 1 && variant === "text") {
|
|
91
|
+
return /* @__PURE__ */ React.createElement("div", { ref, className: "space-y-2.5", "aria-hidden": "true" }, Array.from({ length: count }, (_, i) => {
|
|
92
|
+
const widthPattern = MULTI_LINE_WIDTHS[i % MULTI_LINE_WIDTHS.length];
|
|
93
|
+
const isLast = i === count - 1;
|
|
94
|
+
return /* @__PURE__ */ React.createElement(
|
|
95
|
+
SkeletonBlock,
|
|
96
|
+
{
|
|
97
|
+
key: i,
|
|
98
|
+
variant: "text",
|
|
99
|
+
style: { width: isLast ? "60%" : widthPattern },
|
|
100
|
+
...rest
|
|
101
|
+
}
|
|
102
|
+
);
|
|
103
|
+
}));
|
|
104
|
+
}
|
|
105
|
+
return /* @__PURE__ */ React.createElement(SkeletonBlock, { ref, variant, ...rest });
|
|
106
|
+
}
|
|
107
|
+
);
|
|
108
|
+
Skeleton.displayName = "Skeleton";
|
|
109
|
+
|
|
110
|
+
export {
|
|
111
|
+
skeletonVariants,
|
|
112
|
+
Skeleton
|
|
113
|
+
};
|
|
114
|
+
//# sourceMappingURL=chunk-CTH6SN5Y.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/skeleton.tsx"],"sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@/lib/utils'\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Pulse animation duration in ms (slower = more premium) */\nconst PULSE_DURATION_MS = 2000\n/** Wave animation duration in ms */\nconst WAVE_DURATION_MS = 1800\n\n/**\n * Wave shimmer gradient — wide sweep with soft edges.\n * 5 gradient stops create a broader, smoother light band.\n */\nconst WAVE_GRADIENT = [\n 'transparent 0%',\n 'transparent 30%',\n 'var(--color-background-elevated) 50%',\n 'transparent 70%',\n 'transparent 100%',\n].join(', ')\n\n/**\n * Multi-line text width pattern.\n * Last line is always shorter for natural appearance.\n */\nconst MULTI_LINE_WIDTHS = ['100%', '92%', '100%', '85%', '75%'] as const\n\n// ============================================================================\n// Variants (CVA)\n// ============================================================================\n\nconst skeletonVariants = cva(\n 'bg-background-muted',\n {\n variants: {\n variant: {\n text: 'rounded-md h-4 w-full',\n circular: 'rounded-full w-10 h-10',\n rectangular: 'rounded-xl w-full h-24',\n },\n },\n defaultVariants: {\n variant: 'text',\n },\n }\n)\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface SkeletonProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof skeletonVariants> {\n /** Animation style */\n animation?: 'pulse' | 'wave' | false\n /** Custom width */\n width?: string | number\n /** Custom height */\n height?: string | number\n /** Custom border radius */\n radius?: string | number\n /** Number of text lines (text variant only, generates stacked lines) */\n count?: number\n /** Conditional loading — true: show skeleton, false: render children */\n loading?: boolean\n /** Children to render when loading=false */\n children?: React.ReactNode\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nconst SkeletonBlock = React.forwardRef<HTMLDivElement, Omit<SkeletonProps, 'count' | 'loading' | 'children'>>(\n ({\n className,\n variant = 'text',\n animation = 'pulse',\n width,\n height,\n radius,\n style,\n ...props\n }, ref) => {\n return (\n <div\n ref={ref}\n aria-hidden=\"true\"\n className={cn(\n skeletonVariants({ variant }),\n animation === 'pulse' && 'animate-skeleton-pulse',\n animation === 'wave' && 'relative overflow-hidden',\n className,\n )}\n style={{\n ...style,\n ...(width != null ? { width } : {}),\n ...(height != null ? { height } : {}),\n ...(radius != null ? { borderRadius: radius } : {}),\n ...(animation === 'pulse' ? { animationDuration: `${PULSE_DURATION_MS}ms` } : {}),\n }}\n {...props}\n >\n {animation === 'wave' && (\n <div\n className=\"absolute inset-0 animate-skeleton-wave\"\n style={{\n animationDuration: `${WAVE_DURATION_MS}ms`,\n background: `linear-gradient(90deg, ${WAVE_GRADIENT})`,\n }}\n />\n )}\n </div>\n )\n }\n)\nSkeletonBlock.displayName = 'SkeletonBlock'\n\nconst Skeleton = React.forwardRef<HTMLDivElement, SkeletonProps>(\n ({\n count,\n loading,\n children,\n variant = 'text',\n ...rest\n }, ref) => {\n // loading mode — show skeleton or children\n if (loading !== undefined) {\n if (!loading) return <>{children}</>\n // When loading, fall through to render skeleton\n }\n\n // count mode — render multiple text lines\n if (count != null && count > 1 && variant === 'text') {\n return (\n <div ref={ref} className=\"space-y-2.5\" aria-hidden=\"true\">\n {Array.from({ length: count }, (_, i) => {\n const widthPattern = MULTI_LINE_WIDTHS[i % MULTI_LINE_WIDTHS.length]\n const isLast = i === count - 1\n return (\n <SkeletonBlock\n key={i}\n variant=\"text\"\n style={{ width: isLast ? '60%' : widthPattern }}\n {...rest}\n />\n )\n })}\n </div>\n )\n }\n\n return <SkeletonBlock ref={ref} variant={variant} {...rest} />\n }\n)\nSkeleton.displayName = 'Skeleton'\n\nexport { Skeleton, skeletonVariants }\n"],"mappings":";;;;;;AAEA,YAAY,WAAW;AACvB,SAAS,WAA8B;AAQvC,IAAM,oBAAoB;AAE1B,IAAM,mBAAmB;AAMzB,IAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,IAAI;AAMX,IAAM,oBAAoB,CAAC,QAAQ,OAAO,QAAQ,OAAO,KAAK;AAM9D,IAAM,mBAAmB;AAAA,EACvB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,MAAM;AAAA,QACN,UAAU;AAAA,QACV,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,IACX;AAAA,EACF;AACF;AA6BA,IAAM,gBAAsB;AAAA,EAC1B,CAAC;AAAA,IACC;AAAA,IACA,UAAU;AAAA,IACV,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GAAG,QAAQ;AACT,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,eAAY;AAAA,QACZ,WAAW;AAAA,UACT,iBAAiB,EAAE,QAAQ,CAAC;AAAA,UAC5B,cAAc,WAAW;AAAA,UACzB,cAAc,UAAU;AAAA,UACxB;AAAA,QACF;AAAA,QACA,OAAO;AAAA,UACL,GAAG;AAAA,UACH,GAAI,SAAS,OAAO,EAAE,MAAM,IAAI,CAAC;AAAA,UACjC,GAAI,UAAU,OAAO,EAAE,OAAO,IAAI,CAAC;AAAA,UACnC,GAAI,UAAU,OAAO,EAAE,cAAc,OAAO,IAAI,CAAC;AAAA,UACjD,GAAI,cAAc,UAAU,EAAE,mBAAmB,GAAG,iBAAiB,KAAK,IAAI,CAAC;AAAA,QACjF;AAAA,QACC,GAAG;AAAA;AAAA,MAEH,cAAc,UACb;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO;AAAA,YACL,mBAAmB,GAAG,gBAAgB;AAAA,YACtC,YAAY,0BAA0B,aAAa;AAAA,UACrD;AAAA;AAAA,MACF;AAAA,IAEJ;AAAA,EAEJ;AACF;AACA,cAAc,cAAc;AAE5B,IAAM,WAAiB;AAAA,EACrB,CAAC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,GAAG;AAAA,EACL,GAAG,QAAQ;AAET,QAAI,YAAY,QAAW;AACzB,UAAI,CAAC,QAAS,QAAO,0DAAG,QAAS;AAAA,IAEnC;AAGA,QAAI,SAAS,QAAQ,QAAQ,KAAK,YAAY,QAAQ;AACpD,aACE,oCAAC,SAAI,KAAU,WAAU,eAAc,eAAY,UAChD,MAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,CAAC,GAAG,MAAM;AACvC,cAAM,eAAe,kBAAkB,IAAI,kBAAkB,MAAM;AACnE,cAAM,SAAS,MAAM,QAAQ;AAC7B,eACE;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,SAAQ;AAAA,YACR,OAAO,EAAE,OAAO,SAAS,QAAQ,aAAa;AAAA,YAC7C,GAAG;AAAA;AAAA,QACN;AAAA,MAEJ,CAAC,CACH;AAAA,IAEJ;AAEA,WAAO,oCAAC,iBAAc,KAAU,SAAmB,GAAG,MAAM;AAAA,EAC9D;AACF;AACA,SAAS,cAAc;","names":[]}
|