@betfin/ui 0.1.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/chunk-3CAXHUAL.js +23 -0
- package/dist/chunk-3CAXHUAL.js.map +1 -0
- package/dist/chunk-3YCD2QLS.js +113 -0
- package/dist/chunk-3YCD2QLS.js.map +1 -0
- package/dist/chunk-5CXIFF6J.js +46 -0
- package/dist/chunk-5CXIFF6J.js.map +1 -0
- package/dist/chunk-EP6DYU4N.js +26 -0
- package/dist/chunk-EP6DYU4N.js.map +1 -0
- package/dist/chunk-FHYW2QBY.js +21 -0
- package/dist/chunk-FHYW2QBY.js.map +1 -0
- package/dist/chunk-HRFMTZ55.js +49 -0
- package/dist/chunk-HRFMTZ55.js.map +1 -0
- package/dist/chunk-ILNHKDYA.js +107 -0
- package/dist/chunk-ILNHKDYA.js.map +1 -0
- package/dist/chunk-JTVU6ANA.js +37 -0
- package/dist/chunk-JTVU6ANA.js.map +1 -0
- package/dist/chunk-K7JWN6NH.js +21 -0
- package/dist/chunk-K7JWN6NH.js.map +1 -0
- package/dist/chunk-QZIKXMHP.js +131 -0
- package/dist/chunk-QZIKXMHP.js.map +1 -0
- package/dist/chunk-SSC2M625.js +24 -0
- package/dist/chunk-SSC2M625.js.map +1 -0
- package/dist/chunk-TLULUIYC.js +14 -0
- package/dist/chunk-TLULUIYC.js.map +1 -0
- package/dist/chunk-VJ6P5FFS.js +90 -0
- package/dist/chunk-VJ6P5FFS.js.map +1 -0
- package/dist/chunk-Y2TKUANL.js +11 -0
- package/dist/chunk-Y2TKUANL.js.map +1 -0
- package/dist/components/accordion.d.ts +6 -0
- package/dist/components/accordion.js +59 -0
- package/dist/components/accordion.js.map +1 -0
- package/dist/components/alert-dialog.d.ts +18 -0
- package/dist/components/alert-dialog.js +144 -0
- package/dist/components/alert-dialog.js.map +1 -0
- package/dist/components/app-header.d.ts +19 -0
- package/dist/components/app-header.js +17 -0
- package/dist/components/app-header.js.map +1 -0
- package/dist/components/badge.d.ts +7 -0
- package/dist/components/badge.js +47 -0
- package/dist/components/badge.js.map +1 -0
- package/dist/components/bet-value.d.ts +49 -0
- package/dist/components/bet-value.js +12 -0
- package/dist/components/bet-value.js.map +1 -0
- package/dist/components/breadcrumb.d.ts +10 -0
- package/dist/components/breadcrumb.js +65 -0
- package/dist/components/breadcrumb.js.map +1 -0
- package/dist/components/button.d.ts +8 -0
- package/dist/components/button.js +10 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/calendar.d.ts +10 -0
- package/dist/components/calendar.js +145 -0
- package/dist/components/calendar.js.map +1 -0
- package/dist/components/carousel.d.ts +28 -0
- package/dist/components/carousel.js +153 -0
- package/dist/components/carousel.js.map +1 -0
- package/dist/components/chart.d.ts +39 -0
- package/dist/components/chart.js +219 -0
- package/dist/components/chart.js.map +1 -0
- package/dist/components/checkbox.d.ts +3 -0
- package/dist/components/checkbox.js +26 -0
- package/dist/components/checkbox.js.map +1 -0
- package/dist/components/collapsible.d.ts +5 -0
- package/dist/components/collapsible.js +20 -0
- package/dist/components/collapsible.js.map +1 -0
- package/dist/components/command.d.ts +19 -0
- package/dist/components/command.js +130 -0
- package/dist/components/command.js.map +1 -0
- package/dist/components/context-menu.d.ts +29 -0
- package/dist/components/context-menu.js +186 -0
- package/dist/components/context-menu.js.map +1 -0
- package/dist/components/dialog.d.ts +17 -0
- package/dist/components/dialog.js +28 -0
- package/dist/components/dialog.js.map +1 -0
- package/dist/components/drawer.d.ts +16 -0
- package/dist/components/drawer.js +164 -0
- package/dist/components/drawer.js.map +1 -0
- package/dist/components/dropdown-menu.d.ts +29 -0
- package/dist/components/dropdown-menu.js +207 -0
- package/dist/components/dropdown-menu.js.map +1 -0
- package/dist/components/input-group.d.ts +18 -0
- package/dist/components/input-group.js +22 -0
- package/dist/components/input-group.js.map +1 -0
- package/dist/components/input.d.ts +3 -0
- package/dist/components/input.js +8 -0
- package/dist/components/input.js.map +1 -0
- package/dist/components/loading.d.ts +9 -0
- package/dist/components/loading.js +26 -0
- package/dist/components/loading.js.map +1 -0
- package/dist/components/member-profile.d.ts +79 -0
- package/dist/components/member-profile.js +342 -0
- package/dist/components/member-profile.js.map +1 -0
- package/dist/components/popover.d.ts +9 -0
- package/dist/components/popover.js +52 -0
- package/dist/components/popover.js.map +1 -0
- package/dist/components/progress.d.ts +7 -0
- package/dist/components/progress.js +40 -0
- package/dist/components/progress.js.map +1 -0
- package/dist/components/radio-group.d.ts +5 -0
- package/dist/components/radio-group.js +31 -0
- package/dist/components/radio-group.js.map +1 -0
- package/dist/components/scroll-area.d.ts +4 -0
- package/dist/components/scroll-area.js +42 -0
- package/dist/components/scroll-area.js.map +1 -0
- package/dist/components/select.d.ts +15 -0
- package/dist/components/select.js +136 -0
- package/dist/components/select.js.map +1 -0
- package/dist/components/separator.d.ts +3 -0
- package/dist/components/separator.js +8 -0
- package/dist/components/separator.js.map +1 -0
- package/dist/components/sheet.d.ts +14 -0
- package/dist/components/sheet.js +23 -0
- package/dist/components/sheet.js.map +1 -0
- package/dist/components/sidebar.d.ts +63 -0
- package/dist/components/sidebar.js +536 -0
- package/dist/components/sidebar.js.map +1 -0
- package/dist/components/skeleton.d.ts +2 -0
- package/dist/components/skeleton.js +8 -0
- package/dist/components/skeleton.js.map +1 -0
- package/dist/components/slider.d.ts +3 -0
- package/dist/components/slider.js +45 -0
- package/dist/components/slider.js.map +1 -0
- package/dist/components/sonner.d.ts +3 -0
- package/dist/components/sonner.js +39 -0
- package/dist/components/sonner.js.map +1 -0
- package/dist/components/switch.d.ts +5 -0
- package/dist/components/switch.js +36 -0
- package/dist/components/switch.js.map +1 -0
- package/dist/components/table.d.ts +12 -0
- package/dist/components/table.js +56 -0
- package/dist/components/table.js.map +1 -0
- package/dist/components/tabs.d.ts +10 -0
- package/dist/components/tabs.js +63 -0
- package/dist/components/tabs.js.map +1 -0
- package/dist/components/textarea.d.ts +3 -0
- package/dist/components/textarea.js +8 -0
- package/dist/components/textarea.js.map +1 -0
- package/dist/components/toggle-group.d.ts +11 -0
- package/dist/components/toggle-group.js +80 -0
- package/dist/components/toggle-group.js.map +1 -0
- package/dist/components/toggle.d.ts +8 -0
- package/dist/components/toggle.js +11 -0
- package/dist/components/toggle.js.map +1 -0
- package/dist/components/tooltip.d.ts +6 -0
- package/dist/components/tooltip.js +14 -0
- package/dist/components/tooltip.js.map +1 -0
- package/dist/hooks/use-mobile.d.ts +1 -0
- package/dist/hooks/use-mobile.js +7 -0
- package/dist/hooks/use-mobile.js.map +1 -0
- package/dist/lib/date.d.ts +14 -0
- package/dist/lib/date.js +24 -0
- package/dist/lib/date.js.map +1 -0
- package/dist/lib/format.d.ts +16 -0
- package/dist/lib/format.js +9 -0
- package/dist/lib/format.js.map +1 -0
- package/dist/lib/utils.d.ts +2 -0
- package/dist/lib/utils.js +7 -0
- package/dist/lib/utils.js.map +1 -0
- package/package.json +71 -0
- package/src/styles/globals.css +151 -0
- package/src/styles/theme.css +144 -0
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
Skeleton
|
|
4
|
+
} from "../chunk-TLULUIYC.js";
|
|
5
|
+
import {
|
|
6
|
+
Input
|
|
7
|
+
} from "../chunk-EP6DYU4N.js";
|
|
8
|
+
import {
|
|
9
|
+
Dialog,
|
|
10
|
+
DialogClose,
|
|
11
|
+
DialogContent,
|
|
12
|
+
DialogDescription,
|
|
13
|
+
DialogFooter,
|
|
14
|
+
DialogHeader,
|
|
15
|
+
DialogTitle
|
|
16
|
+
} from "../chunk-3YCD2QLS.js";
|
|
17
|
+
import {
|
|
18
|
+
BetCoin,
|
|
19
|
+
BetValue
|
|
20
|
+
} from "../chunk-ILNHKDYA.js";
|
|
21
|
+
import "../chunk-K7JWN6NH.js";
|
|
22
|
+
import "../chunk-HRFMTZ55.js";
|
|
23
|
+
import {
|
|
24
|
+
Button
|
|
25
|
+
} from "../chunk-5CXIFF6J.js";
|
|
26
|
+
import {
|
|
27
|
+
cn
|
|
28
|
+
} from "../chunk-Y2TKUANL.js";
|
|
29
|
+
|
|
30
|
+
// src/components/member-profile.tsx
|
|
31
|
+
import {
|
|
32
|
+
ArrowLeftRightIcon,
|
|
33
|
+
CheckIcon,
|
|
34
|
+
CopyIcon,
|
|
35
|
+
ExternalLinkIcon,
|
|
36
|
+
GiftIcon,
|
|
37
|
+
Layers3Icon,
|
|
38
|
+
Link2Icon,
|
|
39
|
+
Loader2Icon,
|
|
40
|
+
NetworkIcon,
|
|
41
|
+
PencilIcon,
|
|
42
|
+
SpadeIcon,
|
|
43
|
+
SparklesIcon,
|
|
44
|
+
UsersIcon
|
|
45
|
+
} from "lucide-react";
|
|
46
|
+
import { useState } from "react";
|
|
47
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
48
|
+
var INVITE_SIDES = [
|
|
49
|
+
{ side: "L", label: "Straight left", hint: "Fills the left leg (SL)" },
|
|
50
|
+
{ side: "R", label: "Straight right", hint: "Fills the right leg (SR)" },
|
|
51
|
+
{ side: null, label: "Normal", hint: "Auto-balanced weaker leg (N)" }
|
|
52
|
+
];
|
|
53
|
+
function shortAddress(address, size = 4) {
|
|
54
|
+
if (!address || address.length < size * 2 + 2) return address;
|
|
55
|
+
return `${address.slice(0, size + 2)}\u2026${address.slice(-size)}`;
|
|
56
|
+
}
|
|
57
|
+
function MemberProfile({
|
|
58
|
+
open,
|
|
59
|
+
onOpenChange,
|
|
60
|
+
member,
|
|
61
|
+
loading,
|
|
62
|
+
onCopyAddress,
|
|
63
|
+
onCreateInvite,
|
|
64
|
+
onCopyInviteLink,
|
|
65
|
+
onSaveUsername,
|
|
66
|
+
canEditUsername,
|
|
67
|
+
savingUsername,
|
|
68
|
+
explorerUrl
|
|
69
|
+
}) {
|
|
70
|
+
const [showStrongLeg, setShowStrongLeg] = useState(false);
|
|
71
|
+
return /* @__PURE__ */ jsx(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs(DialogContent, { className: "max-h-[90vh] overflow-y-auto sm:max-w-[780px]", children: [
|
|
72
|
+
/* @__PURE__ */ jsxs(DialogHeader, { children: [
|
|
73
|
+
/* @__PURE__ */ jsx(DialogTitle, { children: "Member profile" }),
|
|
74
|
+
/* @__PURE__ */ jsx(DialogDescription, { children: "Identity, network standing and volume for this member." })
|
|
75
|
+
] }),
|
|
76
|
+
loading || !member ? /* @__PURE__ */ jsxs("div", { className: "grid gap-4", children: [
|
|
77
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "h-28 w-full" }),
|
|
78
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "h-20 w-full" }),
|
|
79
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "h-40 w-full" })
|
|
80
|
+
] }) : /* @__PURE__ */ jsxs("div", { className: "mt-1.5 flex flex-col gap-[18px]", children: [
|
|
81
|
+
/* @__PURE__ */ jsx(
|
|
82
|
+
IdentityStrip,
|
|
83
|
+
{
|
|
84
|
+
member,
|
|
85
|
+
onCopyAddress,
|
|
86
|
+
onSaveUsername,
|
|
87
|
+
canEdit: canEditUsername,
|
|
88
|
+
saving: savingUsername,
|
|
89
|
+
explorerUrl
|
|
90
|
+
},
|
|
91
|
+
`${member.address}:${member.editableUsername ?? ""}`
|
|
92
|
+
),
|
|
93
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-[repeat(auto-fit,minmax(190px,1fr))] gap-3", children: [
|
|
94
|
+
/* @__PURE__ */ jsx(Stat, { icon: UsersIcon, label: "Inviter", sub: "Direct upline", children: member.inviter ? /* @__PURE__ */ jsx(AddressLink, { address: member.inviter, explorerUrl }) : /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "\u2014" }) }),
|
|
95
|
+
/* @__PURE__ */ jsxs(Stat, { icon: NetworkIcon, label: "Network", sub: `${(member.totalCount ?? 0).toLocaleString("en")} total`, children: [
|
|
96
|
+
(member.directCount ?? 0).toLocaleString("en"),
|
|
97
|
+
" direct"
|
|
98
|
+
] }),
|
|
99
|
+
/* @__PURE__ */ jsx(Stat, { icon: GiftIcon, label: "Referral earnings", sub: `Across ${(member.directCount ?? 0).toLocaleString("en")} directs`, children: /* @__PURE__ */ jsx(BetValue, { value: member.referralEarnings ?? 0, gold: true, size: 14 }) })
|
|
100
|
+
] }),
|
|
101
|
+
/* @__PURE__ */ jsxs("section", { children: [
|
|
102
|
+
/* @__PURE__ */ jsx("h3", { className: "mb-2.5 font-extrabold text-[15px]", children: "Member's volume" }),
|
|
103
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-[repeat(auto-fit,minmax(180px,1fr))] gap-3", children: [
|
|
104
|
+
/* @__PURE__ */ jsx(Stat, { icon: Layers3Icon, label: "Staking volume", children: /* @__PURE__ */ jsx(BetValue, { value: member.stakingVolume ?? 0, size: 14 }) }),
|
|
105
|
+
/* @__PURE__ */ jsx(Stat, { icon: SpadeIcon, label: "Betting volume", children: /* @__PURE__ */ jsx(BetValue, { value: member.bettingVolume ?? 0, size: 14 }) }),
|
|
106
|
+
/* @__PURE__ */ jsx(Stat, { icon: SparklesIcon, label: "Lifetime rewards", children: /* @__PURE__ */ jsx(BetValue, { value: member.lifetimeRewards ?? 0, gold: true, size: 14 }) })
|
|
107
|
+
] })
|
|
108
|
+
] }),
|
|
109
|
+
/* @__PURE__ */ jsxs("section", { children: [
|
|
110
|
+
/* @__PURE__ */ jsx("h3", { className: "mb-2.5 font-extrabold text-[15px]", children: "Member's network volume" }),
|
|
111
|
+
/* @__PURE__ */ jsxs("div", { className: "rounded-2xl border border-border bg-card px-4 pt-1 pb-4", children: [
|
|
112
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-[1.2fr_1fr_1fr] gap-3 py-3 font-bold text-[12.5px] text-muted-foreground uppercase tracking-[0.4px]", children: [
|
|
113
|
+
/* @__PURE__ */ jsx("span", { children: "Product" }),
|
|
114
|
+
/* @__PURE__ */ jsx("span", { children: "Direct volume" }),
|
|
115
|
+
/* @__PURE__ */ jsx("span", { children: "Linear volume" })
|
|
116
|
+
] }),
|
|
117
|
+
/* @__PURE__ */ jsx(
|
|
118
|
+
NetRow,
|
|
119
|
+
{
|
|
120
|
+
icon: Layers3Icon,
|
|
121
|
+
label: "Staking",
|
|
122
|
+
volume: member.network?.staking,
|
|
123
|
+
directSub: "total staking",
|
|
124
|
+
linearSub: "total staking",
|
|
125
|
+
border: false
|
|
126
|
+
}
|
|
127
|
+
),
|
|
128
|
+
/* @__PURE__ */ jsx(NetRow, { icon: SpadeIcon, label: "Betting", volume: member.network?.betting, directSub: "total bets", linearSub: "total bets" }),
|
|
129
|
+
/* @__PURE__ */ jsxs(
|
|
130
|
+
"button",
|
|
131
|
+
{
|
|
132
|
+
type: "button",
|
|
133
|
+
onClick: () => setShowStrongLeg((v) => !v),
|
|
134
|
+
title: "Toggle between weak and strong leg volume",
|
|
135
|
+
className: "mx-auto mt-3.5 flex w-fit cursor-pointer items-center gap-2 rounded-[10px] border border-[color-mix(in_oklab,var(--primary)_45%,var(--border))] bg-[color-mix(in_oklab,var(--primary)_8%,transparent)] px-3.5 py-2 transition-colors hover:bg-[color-mix(in_oklab,var(--primary)_14%,transparent)]",
|
|
136
|
+
children: [
|
|
137
|
+
/* @__PURE__ */ jsx(ArrowLeftRightIcon, { className: "size-4 text-primary" }),
|
|
138
|
+
/* @__PURE__ */ jsx("span", { className: "text-[13.5px] text-muted-foreground", children: showStrongLeg ? "Strong leg volume" : "Weak leg volume" }),
|
|
139
|
+
/* @__PURE__ */ jsx("span", { className: "font-extrabold", children: /* @__PURE__ */ jsx(BetValue, { value: (showStrongLeg ? member.strongLegVolume : member.weakLegVolume) ?? 0, gold: true, size: 13 }) })
|
|
140
|
+
]
|
|
141
|
+
}
|
|
142
|
+
)
|
|
143
|
+
] })
|
|
144
|
+
] }),
|
|
145
|
+
onCopyInviteLink && /* @__PURE__ */ jsxs("section", { children: [
|
|
146
|
+
/* @__PURE__ */ jsx("h3", { className: "mb-1 font-extrabold text-[15px]", children: "Copy invitation link" }),
|
|
147
|
+
/* @__PURE__ */ jsxs("p", { className: "mb-2.5 text-[12.5px] text-muted-foreground leading-[1.45]", children: [
|
|
148
|
+
"Invite new members under this user. You stay the referrer; new invitees are placed beneath",
|
|
149
|
+
" ",
|
|
150
|
+
/* @__PURE__ */ jsx("span", { className: "font-semibold text-foreground", children: member.username ?? shortAddress(member.address) }),
|
|
151
|
+
"."
|
|
152
|
+
] }),
|
|
153
|
+
/* @__PURE__ */ jsx("div", { className: "grid grid-cols-[repeat(auto-fit,minmax(180px,1fr))] gap-2.5", children: INVITE_SIDES.map((it) => /* @__PURE__ */ jsxs(
|
|
154
|
+
"button",
|
|
155
|
+
{
|
|
156
|
+
type: "button",
|
|
157
|
+
onClick: () => onCopyInviteLink(it.side),
|
|
158
|
+
className: "flex items-center gap-2 rounded-[10px] border border-border bg-card px-3.5 py-2.5 text-left transition-colors hover:border-[color-mix(in_oklab,var(--primary)_45%,var(--border))] hover:bg-[color-mix(in_oklab,var(--primary)_8%,transparent)]",
|
|
159
|
+
children: [
|
|
160
|
+
/* @__PURE__ */ jsx(CopyIcon, { className: "size-4 shrink-0 text-primary" }),
|
|
161
|
+
/* @__PURE__ */ jsxs("span", { className: "min-w-0", children: [
|
|
162
|
+
/* @__PURE__ */ jsx("span", { className: "block font-bold text-[13.5px]", children: it.label }),
|
|
163
|
+
/* @__PURE__ */ jsx("span", { className: "block text-[11.5px] text-muted-foreground", children: it.hint })
|
|
164
|
+
] })
|
|
165
|
+
]
|
|
166
|
+
},
|
|
167
|
+
it.label
|
|
168
|
+
)) })
|
|
169
|
+
] })
|
|
170
|
+
] }),
|
|
171
|
+
/* @__PURE__ */ jsxs(DialogFooter, { children: [
|
|
172
|
+
/* @__PURE__ */ jsx(DialogClose, { render: /* @__PURE__ */ jsx(Button, { variant: "outline" }), children: "Close" }),
|
|
173
|
+
member && onCreateInvite && /* @__PURE__ */ jsxs(Button, { onClick: () => onCreateInvite(member), children: [
|
|
174
|
+
/* @__PURE__ */ jsx(Link2Icon, { className: "size-4" }),
|
|
175
|
+
"Create invitation link"
|
|
176
|
+
] })
|
|
177
|
+
] })
|
|
178
|
+
] }) });
|
|
179
|
+
}
|
|
180
|
+
var USERNAME_RULE = /^[a-zA-Z0-9_]{3,32}$/;
|
|
181
|
+
function IdentityStrip({
|
|
182
|
+
member,
|
|
183
|
+
onCopyAddress,
|
|
184
|
+
onSaveUsername,
|
|
185
|
+
canEdit,
|
|
186
|
+
saving,
|
|
187
|
+
explorerUrl
|
|
188
|
+
}) {
|
|
189
|
+
const [editing, setEditing] = useState(false);
|
|
190
|
+
const [name, setName] = useState(member.editableUsername ?? "");
|
|
191
|
+
const [copied, setCopied] = useState(false);
|
|
192
|
+
const isSelf = Boolean(member.isSelf);
|
|
193
|
+
const valid = USERNAME_RULE.test(name);
|
|
194
|
+
const copy = () => {
|
|
195
|
+
navigator.clipboard?.writeText(member.address);
|
|
196
|
+
onCopyAddress?.(member.address);
|
|
197
|
+
setCopied(true);
|
|
198
|
+
setTimeout(() => setCopied(false), 1400);
|
|
199
|
+
};
|
|
200
|
+
const save = () => {
|
|
201
|
+
if (!valid || saving) return;
|
|
202
|
+
onSaveUsername?.(member, name);
|
|
203
|
+
};
|
|
204
|
+
const displayName = member.username || shortAddress(member.address);
|
|
205
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-start gap-[18px] rounded-[14px] border border-border bg-[color-mix(in_oklab,var(--primary)_4%,var(--card))] p-[18px]", children: [
|
|
206
|
+
/* @__PURE__ */ jsx("span", { className: "grid size-24 shrink-0 place-items-center rounded-full shadow-[0_0_0_4px_color-mix(in_oklab,var(--primary)_22%,transparent)]", children: /* @__PURE__ */ jsx(BetCoin, { size: 96 }) }),
|
|
207
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-[220px] flex-1", children: [
|
|
208
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2.5", children: [
|
|
209
|
+
editing ? /* @__PURE__ */ jsx(
|
|
210
|
+
Input,
|
|
211
|
+
{
|
|
212
|
+
value: name,
|
|
213
|
+
autoFocus: true,
|
|
214
|
+
disabled: saving,
|
|
215
|
+
maxLength: 32,
|
|
216
|
+
placeholder: isSelf ? "Choose a username" : "Add a nickname",
|
|
217
|
+
onChange: (e) => setName(e.target.value),
|
|
218
|
+
onKeyDown: (e) => {
|
|
219
|
+
if (e.key === "Enter") save();
|
|
220
|
+
},
|
|
221
|
+
className: "h-9 w-52 font-bold text-lg"
|
|
222
|
+
}
|
|
223
|
+
) : /* @__PURE__ */ jsx("span", { className: "font-extrabold text-[22px]", children: displayName }),
|
|
224
|
+
canEdit && (editing ? /* @__PURE__ */ jsx(Button, { variant: "default", size: "icon-sm", "aria-label": "Save", disabled: !valid || saving, onClick: save, children: saving ? /* @__PURE__ */ jsx(Loader2Icon, { className: "size-4 animate-spin" }) : /* @__PURE__ */ jsx(CheckIcon, { className: "size-4" }) }) : /* @__PURE__ */ jsx(Button, { variant: "outline", size: "icon-sm", "aria-label": isSelf ? "Edit username" : "Set nickname", onClick: () => setEditing(true), children: /* @__PURE__ */ jsx(PencilIcon, { className: "size-4" }) }))
|
|
225
|
+
] }),
|
|
226
|
+
editing && /* @__PURE__ */ jsx("p", { className: "mt-1.5 text-[12px] text-muted-foreground", children: name && !valid ? "3\u201332 characters, letters, numbers and _ only." : isSelf ? "Your public username \u2014 visible on-chain to everyone." : "A private nickname for this member \u2014 only you can see it." }),
|
|
227
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-3 flex max-w-[460px] items-center gap-2 rounded-[10px] border border-input bg-background py-2 pr-2 pl-3", children: [
|
|
228
|
+
/* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate font-mono text-[13.5px]", children: member.address }),
|
|
229
|
+
explorerUrl && /* @__PURE__ */ jsx(
|
|
230
|
+
"a",
|
|
231
|
+
{
|
|
232
|
+
href: explorerUrl(member.address),
|
|
233
|
+
target: "_blank",
|
|
234
|
+
rel: "noopener noreferrer",
|
|
235
|
+
"aria-label": "View on explorer",
|
|
236
|
+
title: "View on explorer",
|
|
237
|
+
className: "grid place-items-center rounded-lg p-1.5 text-muted-foreground transition-colors hover:bg-foreground/8 hover:text-foreground",
|
|
238
|
+
children: /* @__PURE__ */ jsx(ExternalLinkIcon, { className: "size-4" })
|
|
239
|
+
}
|
|
240
|
+
),
|
|
241
|
+
/* @__PURE__ */ jsx(
|
|
242
|
+
"button",
|
|
243
|
+
{
|
|
244
|
+
type: "button",
|
|
245
|
+
onClick: copy,
|
|
246
|
+
"aria-label": "Copy address",
|
|
247
|
+
title: "Copy address",
|
|
248
|
+
className: cn(
|
|
249
|
+
"grid place-items-center rounded-lg p-1.5 transition-colors hover:bg-foreground/8 hover:text-foreground",
|
|
250
|
+
copied ? "text-[#25c26e]" : "text-muted-foreground"
|
|
251
|
+
),
|
|
252
|
+
children: copied ? /* @__PURE__ */ jsx(CheckIcon, { className: "size-4" }) : /* @__PURE__ */ jsx(CopyIcon, { className: "size-4" })
|
|
253
|
+
}
|
|
254
|
+
)
|
|
255
|
+
] }),
|
|
256
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-2.5 flex flex-wrap items-center gap-4 text-[12.5px] text-muted-foreground", children: [
|
|
257
|
+
member.registered && /* @__PURE__ */ jsxs("span", { children: [
|
|
258
|
+
"Registered ",
|
|
259
|
+
/* @__PURE__ */ jsx("span", { className: "text-foreground", children: member.registered })
|
|
260
|
+
] }),
|
|
261
|
+
member.memberDays != null && /* @__PURE__ */ jsxs("span", { children: [
|
|
262
|
+
"Member for ",
|
|
263
|
+
/* @__PURE__ */ jsxs("span", { className: "text-foreground", children: [
|
|
264
|
+
member.memberDays,
|
|
265
|
+
" days"
|
|
266
|
+
] })
|
|
267
|
+
] }),
|
|
268
|
+
member.nftId != null && /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1.5", children: [
|
|
269
|
+
"Membership NFT",
|
|
270
|
+
/* @__PURE__ */ jsxs(
|
|
271
|
+
"a",
|
|
272
|
+
{
|
|
273
|
+
href: member.nftUrl ?? "#",
|
|
274
|
+
target: "_blank",
|
|
275
|
+
rel: "noopener noreferrer",
|
|
276
|
+
className: "inline-flex items-center gap-1 font-semibold text-primary hover:opacity-80",
|
|
277
|
+
children: [
|
|
278
|
+
"#",
|
|
279
|
+
member.nftId,
|
|
280
|
+
/* @__PURE__ */ jsx(ExternalLinkIcon, { className: "size-3" })
|
|
281
|
+
]
|
|
282
|
+
}
|
|
283
|
+
)
|
|
284
|
+
] })
|
|
285
|
+
] })
|
|
286
|
+
] })
|
|
287
|
+
] });
|
|
288
|
+
}
|
|
289
|
+
function Stat({ icon: Icon, label, sub, children }) {
|
|
290
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-3 rounded-xl border border-border bg-card p-3.5", children: [
|
|
291
|
+
/* @__PURE__ */ jsx("span", { className: "grid size-[38px] shrink-0 place-items-center rounded-[10px] bg-[color-mix(in_oklab,var(--primary)_14%,transparent)] text-primary", children: /* @__PURE__ */ jsx(Icon, { className: "size-5" }) }),
|
|
292
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
|
|
293
|
+
/* @__PURE__ */ jsx("div", { className: "text-[12.5px] text-muted-foreground", children: label }),
|
|
294
|
+
/* @__PURE__ */ jsx("div", { className: "mt-0.5 flex flex-wrap items-center gap-1.5 font-bold text-base text-foreground", children }),
|
|
295
|
+
sub && /* @__PURE__ */ jsx("div", { className: "mt-0.5 text-[12.5px] text-muted-foreground", children: sub })
|
|
296
|
+
] })
|
|
297
|
+
] });
|
|
298
|
+
}
|
|
299
|
+
function NetRow({
|
|
300
|
+
icon: Icon,
|
|
301
|
+
label,
|
|
302
|
+
volume,
|
|
303
|
+
directSub,
|
|
304
|
+
linearSub,
|
|
305
|
+
border = true
|
|
306
|
+
}) {
|
|
307
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("grid grid-cols-[1.2fr_1fr_1fr] items-center gap-3 py-3.5", border && "border-border border-t"), children: [
|
|
308
|
+
/* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-2.5 font-semibold text-foreground", children: [
|
|
309
|
+
/* @__PURE__ */ jsx("span", { className: "grid place-items-center text-primary", children: /* @__PURE__ */ jsx(Icon, { className: "size-5" }) }),
|
|
310
|
+
label
|
|
311
|
+
] }),
|
|
312
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
313
|
+
/* @__PURE__ */ jsx("div", { className: "font-bold", children: /* @__PURE__ */ jsx(BetValue, { value: volume?.direct ?? 0, size: 13 }) }),
|
|
314
|
+
/* @__PURE__ */ jsx("div", { className: "mt-0.5 text-muted-foreground text-xs", children: directSub })
|
|
315
|
+
] }),
|
|
316
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
317
|
+
/* @__PURE__ */ jsx("div", { className: "font-bold", children: /* @__PURE__ */ jsx(BetValue, { value: volume?.linear ?? 0, size: 13 }) }),
|
|
318
|
+
/* @__PURE__ */ jsx("div", { className: "mt-0.5 text-muted-foreground text-xs", children: linearSub })
|
|
319
|
+
] })
|
|
320
|
+
] });
|
|
321
|
+
}
|
|
322
|
+
function AddressLink({ address, explorerUrl }) {
|
|
323
|
+
const short = shortAddress(address);
|
|
324
|
+
if (!explorerUrl) return /* @__PURE__ */ jsx("span", { children: short });
|
|
325
|
+
return /* @__PURE__ */ jsxs(
|
|
326
|
+
"a",
|
|
327
|
+
{
|
|
328
|
+
href: explorerUrl(address),
|
|
329
|
+
target: "_blank",
|
|
330
|
+
rel: "noopener noreferrer",
|
|
331
|
+
className: "inline-flex items-center gap-1.5 font-bold text-primary hover:opacity-80",
|
|
332
|
+
children: [
|
|
333
|
+
short,
|
|
334
|
+
/* @__PURE__ */ jsx(ExternalLinkIcon, { className: "size-3" })
|
|
335
|
+
]
|
|
336
|
+
}
|
|
337
|
+
);
|
|
338
|
+
}
|
|
339
|
+
export {
|
|
340
|
+
MemberProfile
|
|
341
|
+
};
|
|
342
|
+
//# sourceMappingURL=member-profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/member-profile.tsx"],"sourcesContent":["'use client';\n\nimport { BetCoin, BetValue } from '@betfin/ui/components/bet-value';\nimport { Button } from '@betfin/ui/components/button';\nimport { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '@betfin/ui/components/dialog';\nimport { Input } from '@betfin/ui/components/input';\nimport { Skeleton } from '@betfin/ui/components/skeleton';\nimport { cn } from '@betfin/ui/lib/utils';\nimport {\n\tArrowLeftRightIcon,\n\tCheckIcon,\n\tCopyIcon,\n\tExternalLinkIcon,\n\tGiftIcon,\n\tLayers3Icon,\n\tLink2Icon,\n\tLoader2Icon,\n\tNetworkIcon,\n\tPencilIcon,\n\tSpadeIcon,\n\tSparklesIcon,\n\tUsersIcon,\n} from 'lucide-react';\nimport { type ComponentType, type ReactNode, useState } from 'react';\n\n/**\n * Shared, presentation-only member-profile dialog. Data-driven — it receives a\n * `member` object and callbacks, and does no fetching of its own, so every app\n * can render the same profile modal. The data source and open/close wiring live\n * in the app-side provider (see `@workspace/member-profile`).\n */\n\n/**\n * Invitation-link placement side, relative to the member the modal is opened for:\n * - 'L' → straight-left (SL), 'R' → straight-right (SR), null → normal/auto (N).\n */\nexport type InviteSide = 'L' | 'R' | null;\n\n/** The three placement options offered in the \"Copy invitation link\" section. */\nconst INVITE_SIDES: { side: InviteSide; label: string; hint: string }[] = [\n\t{ side: 'L', label: 'Straight left', hint: 'Fills the left leg (SL)' },\n\t{ side: 'R', label: 'Straight right', hint: 'Fills the right leg (SR)' },\n\t{ side: null, label: 'Normal', hint: 'Auto-balanced weaker leg (N)' },\n];\n\n/** A member's direct/linear volume split for one product. */\nexport interface MemberNetworkVolume {\n\tdirect?: number | bigint;\n\tlinear?: number | bigint;\n}\n\nexport interface MemberProfileData {\n\t/** Full member wallet address. */\n\taddress: string;\n\t/** Resolved display name (custom nickname > own username); falls back to the shortened address. */\n\tusername?: string;\n\t/** Whether the profiled member is the connected viewer — drives what the editor means. */\n\tisSelf?: boolean;\n\t/**\n\t * Current value of the field the viewer may edit: their OWN username when\n\t * viewing themselves, or their private nickname for this member otherwise.\n\t */\n\teditableUsername?: string;\n\t/** Full inviter (upline) wallet address. */\n\tinviter?: string;\n\t/** Registered-date label (already formatted). */\n\tregistered?: string;\n\t/** Days since registration. */\n\tmemberDays?: number;\n\t/** Membership NFT token id and its explorer link. */\n\tnftId?: string | number;\n\tnftUrl?: string;\n\tdirectCount?: number;\n\ttotalCount?: number;\n\t/** Referral (matching) earnings — a number or a raw on-chain bigint (18-decimals). */\n\treferralEarnings?: number | bigint;\n\t/** Member's own volumes. */\n\tstakingVolume?: number | bigint;\n\tbettingVolume?: number | bigint;\n\t/** Lifetime rewards earned. */\n\tlifetimeRewards?: number | bigint;\n\t/** Network (downline) volume split per product. */\n\tnetwork?: { staking?: MemberNetworkVolume; betting?: MemberNetworkVolume };\n\t/** Weak-leg binary volume. */\n\tweakLegVolume?: number | bigint;\n\t/** Strong-leg binary volume. */\n\tstrongLegVolume?: number | bigint;\n}\n\nexport interface MemberProfileProps {\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n\tmember: MemberProfileData | null;\n\tloading?: boolean;\n\tonCopyAddress?: (address: string) => void;\n\tonCreateInvite?: (member: MemberProfileData) => void;\n\t/**\n\t * Copy an invitation link that places new invitees under THIS member (the\n\t * inviter being the connected wallet). When provided, the modal shows a\n\t * \"Copy invitation link\" section with straight-left / straight-right / normal.\n\t */\n\tonCopyInviteLink?: (side: InviteSide) => void;\n\t/** Persist an edited username/nickname. Provider routes it to the right on-chain write. */\n\tonSaveUsername?: (member: MemberProfileData, username: string) => void;\n\t/** Whether to show the edit affordance (only when a wallet is connected). */\n\tcanEditUsername?: boolean;\n\t/** Whether a username/nickname write is in flight (drives the save spinner). */\n\tsavingUsername?: boolean;\n\t/** Build an explorer URL for an address; when provided, wallet/inviter get \"view on explorer\" links. */\n\texplorerUrl?: (address: string) => string;\n}\n\nfunction shortAddress(address: string, size = 4): string {\n\tif (!address || address.length < size * 2 + 2) return address;\n\treturn `${address.slice(0, size + 2)}…${address.slice(-size)}`;\n}\n\nexport function MemberProfile({\n\topen,\n\tonOpenChange,\n\tmember,\n\tloading,\n\tonCopyAddress,\n\tonCreateInvite,\n\tonCopyInviteLink,\n\tonSaveUsername,\n\tcanEditUsername,\n\tsavingUsername,\n\texplorerUrl,\n}: MemberProfileProps) {\n\tconst [showStrongLeg, setShowStrongLeg] = useState(false);\n\treturn (\n\t\t<Dialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<DialogContent className=\"max-h-[90vh] overflow-y-auto sm:max-w-[780px]\">\n\t\t\t\t<DialogHeader>\n\t\t\t\t\t<DialogTitle>Member profile</DialogTitle>\n\t\t\t\t\t<DialogDescription>Identity, network standing and volume for this member.</DialogDescription>\n\t\t\t\t</DialogHeader>\n\n\t\t\t\t{loading || !member ? (\n\t\t\t\t\t<div className=\"grid gap-4\">\n\t\t\t\t\t\t<Skeleton className=\"h-28 w-full\" />\n\t\t\t\t\t\t<Skeleton className=\"h-20 w-full\" />\n\t\t\t\t\t\t<Skeleton className=\"h-40 w-full\" />\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\t<div className=\"mt-1.5 flex flex-col gap-[18px]\">\n\t\t\t\t\t\t<IdentityStrip\n\t\t\t\t\t\t\tkey={`${member.address}:${member.editableUsername ?? ''}`}\n\t\t\t\t\t\t\tmember={member}\n\t\t\t\t\t\t\tonCopyAddress={onCopyAddress}\n\t\t\t\t\t\t\tonSaveUsername={onSaveUsername}\n\t\t\t\t\t\t\tcanEdit={canEditUsername}\n\t\t\t\t\t\t\tsaving={savingUsername}\n\t\t\t\t\t\t\texplorerUrl={explorerUrl}\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t{/* Quick stats */}\n\t\t\t\t\t\t<div className=\"grid grid-cols-[repeat(auto-fit,minmax(190px,1fr))] gap-3\">\n\t\t\t\t\t\t\t<Stat icon={UsersIcon} label=\"Inviter\" sub=\"Direct upline\">\n\t\t\t\t\t\t\t\t{member.inviter ? <AddressLink address={member.inviter} explorerUrl={explorerUrl} /> : <span className=\"text-muted-foreground\">—</span>}\n\t\t\t\t\t\t\t</Stat>\n\t\t\t\t\t\t\t<Stat icon={NetworkIcon} label=\"Network\" sub={`${(member.totalCount ?? 0).toLocaleString('en')} total`}>\n\t\t\t\t\t\t\t\t{(member.directCount ?? 0).toLocaleString('en')} direct\n\t\t\t\t\t\t\t</Stat>\n\t\t\t\t\t\t\t<Stat icon={GiftIcon} label=\"Referral earnings\" sub={`Across ${(member.directCount ?? 0).toLocaleString('en')} directs`}>\n\t\t\t\t\t\t\t\t<BetValue value={member.referralEarnings ?? 0} gold size={14} />\n\t\t\t\t\t\t\t</Stat>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{/* Member's volume */}\n\t\t\t\t\t\t<section>\n\t\t\t\t\t\t\t<h3 className=\"mb-2.5 font-extrabold text-[15px]\">Member's volume</h3>\n\t\t\t\t\t\t\t<div className=\"grid grid-cols-[repeat(auto-fit,minmax(180px,1fr))] gap-3\">\n\t\t\t\t\t\t\t\t<Stat icon={Layers3Icon} label=\"Staking volume\">\n\t\t\t\t\t\t\t\t\t<BetValue value={member.stakingVolume ?? 0} size={14} />\n\t\t\t\t\t\t\t\t</Stat>\n\t\t\t\t\t\t\t\t<Stat icon={SpadeIcon} label=\"Betting volume\">\n\t\t\t\t\t\t\t\t\t<BetValue value={member.bettingVolume ?? 0} size={14} />\n\t\t\t\t\t\t\t\t</Stat>\n\t\t\t\t\t\t\t\t<Stat icon={SparklesIcon} label=\"Lifetime rewards\">\n\t\t\t\t\t\t\t\t\t<BetValue value={member.lifetimeRewards ?? 0} gold size={14} />\n\t\t\t\t\t\t\t\t</Stat>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</section>\n\n\t\t\t\t\t\t{/* Network volume */}\n\t\t\t\t\t\t<section>\n\t\t\t\t\t\t\t<h3 className=\"mb-2.5 font-extrabold text-[15px]\">Member's network volume</h3>\n\t\t\t\t\t\t\t<div className=\"rounded-2xl border border-border bg-card px-4 pt-1 pb-4\">\n\t\t\t\t\t\t\t\t<div className=\"grid grid-cols-[1.2fr_1fr_1fr] gap-3 py-3 font-bold text-[12.5px] text-muted-foreground uppercase tracking-[0.4px]\">\n\t\t\t\t\t\t\t\t\t<span>Product</span>\n\t\t\t\t\t\t\t\t\t<span>Direct volume</span>\n\t\t\t\t\t\t\t\t\t<span>Linear volume</span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<NetRow\n\t\t\t\t\t\t\t\t\ticon={Layers3Icon}\n\t\t\t\t\t\t\t\t\tlabel=\"Staking\"\n\t\t\t\t\t\t\t\t\tvolume={member.network?.staking}\n\t\t\t\t\t\t\t\t\tdirectSub=\"total staking\"\n\t\t\t\t\t\t\t\t\tlinearSub=\"total staking\"\n\t\t\t\t\t\t\t\t\tborder={false}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<NetRow icon={SpadeIcon} label=\"Betting\" volume={member.network?.betting} directSub=\"total bets\" linearSub=\"total bets\" />\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={() => setShowStrongLeg((v) => !v)}\n\t\t\t\t\t\t\t\t\ttitle=\"Toggle between weak and strong leg volume\"\n\t\t\t\t\t\t\t\t\tclassName=\"mx-auto mt-3.5 flex w-fit cursor-pointer items-center gap-2 rounded-[10px] border border-[color-mix(in_oklab,var(--primary)_45%,var(--border))] bg-[color-mix(in_oklab,var(--primary)_8%,transparent)] px-3.5 py-2 transition-colors hover:bg-[color-mix(in_oklab,var(--primary)_14%,transparent)]\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<ArrowLeftRightIcon className=\"size-4 text-primary\" />\n\t\t\t\t\t\t\t\t\t<span className=\"text-[13.5px] text-muted-foreground\">{showStrongLeg ? 'Strong leg volume' : 'Weak leg volume'}</span>\n\t\t\t\t\t\t\t\t\t<span className=\"font-extrabold\">\n\t\t\t\t\t\t\t\t\t\t<BetValue value={(showStrongLeg ? member.strongLegVolume : member.weakLegVolume) ?? 0} gold size={13} />\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</section>\n\n\t\t\t\t\t\t{/* Copy invitation link — places new invitees under this member */}\n\t\t\t\t\t\t{onCopyInviteLink && (\n\t\t\t\t\t\t\t<section>\n\t\t\t\t\t\t\t\t<h3 className=\"mb-1 font-extrabold text-[15px]\">Copy invitation link</h3>\n\t\t\t\t\t\t\t\t<p className=\"mb-2.5 text-[12.5px] text-muted-foreground leading-[1.45]\">\n\t\t\t\t\t\t\t\t\tInvite new members under this user. You stay the referrer; new invitees are placed beneath{' '}\n\t\t\t\t\t\t\t\t\t<span className=\"font-semibold text-foreground\">{member.username ?? shortAddress(member.address)}</span>.\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t<div className=\"grid grid-cols-[repeat(auto-fit,minmax(180px,1fr))] gap-2.5\">\n\t\t\t\t\t\t\t\t\t{INVITE_SIDES.map((it) => (\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\tkey={it.label}\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => onCopyInviteLink(it.side)}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-2 rounded-[10px] border border-border bg-card px-3.5 py-2.5 text-left transition-colors hover:border-[color-mix(in_oklab,var(--primary)_45%,var(--border))] hover:bg-[color-mix(in_oklab,var(--primary)_8%,transparent)]\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<CopyIcon className=\"size-4 shrink-0 text-primary\" />\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"min-w-0\">\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"block font-bold text-[13.5px]\">{it.label}</span>\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"block text-[11.5px] text-muted-foreground\">{it.hint}</span>\n\t\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</section>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<DialogFooter>\n\t\t\t\t\t<DialogClose render={<Button variant=\"outline\" />}>Close</DialogClose>\n\t\t\t\t\t{member && onCreateInvite && (\n\t\t\t\t\t\t<Button onClick={() => onCreateInvite(member)}>\n\t\t\t\t\t\t\t<Link2Icon className=\"size-4\" />\n\t\t\t\t\t\t\tCreate invitation link\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t)}\n\t\t\t\t</DialogFooter>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t);\n}\n\n// Mirror of the contract's on-chain validation (LengthStrategy 3–32 +\n// ValidCharactersStrategy). Kept inline so this design-system component stays\n// free of data-layer deps; see `isValidUsername` in `@workspace/core/usernames`.\nconst USERNAME_RULE = /^[a-zA-Z0-9_]{3,32}$/;\n\nfunction IdentityStrip({\n\tmember,\n\tonCopyAddress,\n\tonSaveUsername,\n\tcanEdit,\n\tsaving,\n\texplorerUrl,\n}: {\n\tmember: MemberProfileData;\n\tonCopyAddress?: (address: string) => void;\n\tonSaveUsername?: (member: MemberProfileData, username: string) => void;\n\tcanEdit?: boolean;\n\tsaving?: boolean;\n\texplorerUrl?: (address: string) => string;\n}) {\n\t// Local edit state resets automatically when the profiled member (or the\n\t// editable value, after a successful save) changes — the parent remounts this\n\t// component via a `key` on member.address/editableUsername.\n\tconst [editing, setEditing] = useState(false);\n\tconst [name, setName] = useState(member.editableUsername ?? '');\n\tconst [copied, setCopied] = useState(false);\n\n\tconst isSelf = Boolean(member.isSelf);\n\tconst valid = USERNAME_RULE.test(name);\n\n\tconst copy = () => {\n\t\tnavigator.clipboard?.writeText(member.address);\n\t\tonCopyAddress?.(member.address);\n\t\tsetCopied(true);\n\t\tsetTimeout(() => setCopied(false), 1400);\n\t};\n\n\tconst save = () => {\n\t\tif (!valid || saving) return;\n\t\tonSaveUsername?.(member, name);\n\t\t// Stay in edit mode; on success the parent remounts (key change) and resets.\n\t};\n\n\tconst displayName = member.username || shortAddress(member.address);\n\n\treturn (\n\t\t<div className=\"flex flex-wrap items-start gap-[18px] rounded-[14px] border border-border bg-[color-mix(in_oklab,var(--primary)_4%,var(--card))] p-[18px]\">\n\t\t\t<span className=\"grid size-24 shrink-0 place-items-center rounded-full shadow-[0_0_0_4px_color-mix(in_oklab,var(--primary)_22%,transparent)]\">\n\t\t\t\t<BetCoin size={96} />\n\t\t\t</span>\n\t\t\t<div className=\"min-w-[220px] flex-1\">\n\t\t\t\t<div className=\"flex flex-wrap items-center gap-2.5\">\n\t\t\t\t\t{editing ? (\n\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\tvalue={name}\n\t\t\t\t\t\t\tautoFocus\n\t\t\t\t\t\t\tdisabled={saving}\n\t\t\t\t\t\t\tmaxLength={32}\n\t\t\t\t\t\t\tplaceholder={isSelf ? 'Choose a username' : 'Add a nickname'}\n\t\t\t\t\t\t\tonChange={(e) => setName(e.target.value)}\n\t\t\t\t\t\t\tonKeyDown={(e) => {\n\t\t\t\t\t\t\t\tif (e.key === 'Enter') save();\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tclassName=\"h-9 w-52 font-bold text-lg\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<span className=\"font-extrabold text-[22px]\">{displayName}</span>\n\t\t\t\t\t)}\n\t\t\t\t\t{canEdit &&\n\t\t\t\t\t\t(editing ? (\n\t\t\t\t\t\t\t<Button variant=\"default\" size=\"icon-sm\" aria-label=\"Save\" disabled={!valid || saving} onClick={save}>\n\t\t\t\t\t\t\t\t{saving ? <Loader2Icon className=\"size-4 animate-spin\" /> : <CheckIcon className=\"size-4\" />}\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<Button variant=\"outline\" size=\"icon-sm\" aria-label={isSelf ? 'Edit username' : 'Set nickname'} onClick={() => setEditing(true)}>\n\t\t\t\t\t\t\t\t<PencilIcon className=\"size-4\" />\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t))}\n\t\t\t\t</div>\n\n\t\t\t\t{editing && (\n\t\t\t\t\t<p className=\"mt-1.5 text-[12px] text-muted-foreground\">\n\t\t\t\t\t\t{name && !valid\n\t\t\t\t\t\t\t? '3–32 characters, letters, numbers and _ only.'\n\t\t\t\t\t\t\t: isSelf\n\t\t\t\t\t\t\t\t? 'Your public username — visible on-chain to everyone.'\n\t\t\t\t\t\t\t\t: 'A private nickname for this member — only you can see it.'}\n\t\t\t\t\t</p>\n\t\t\t\t)}\n\n\t\t\t\t{/* Wallet chip */}\n\t\t\t\t<div className=\"mt-3 flex max-w-[460px] items-center gap-2 rounded-[10px] border border-input bg-background py-2 pr-2 pl-3\">\n\t\t\t\t\t<span className=\"min-w-0 flex-1 truncate font-mono text-[13.5px]\">{member.address}</span>\n\t\t\t\t\t{explorerUrl && (\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref={explorerUrl(member.address)}\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\taria-label=\"View on explorer\"\n\t\t\t\t\t\t\ttitle=\"View on explorer\"\n\t\t\t\t\t\t\tclassName=\"grid place-items-center rounded-lg p-1.5 text-muted-foreground transition-colors hover:bg-foreground/8 hover:text-foreground\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<ExternalLinkIcon className=\"size-4\" />\n\t\t\t\t\t\t</a>\n\t\t\t\t\t)}\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={copy}\n\t\t\t\t\t\taria-label=\"Copy address\"\n\t\t\t\t\t\ttitle=\"Copy address\"\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'grid place-items-center rounded-lg p-1.5 transition-colors hover:bg-foreground/8 hover:text-foreground',\n\t\t\t\t\t\t\tcopied ? 'text-[#25c26e]' : 'text-muted-foreground',\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{copied ? <CheckIcon className=\"size-4\" /> : <CopyIcon className=\"size-4\" />}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"mt-2.5 flex flex-wrap items-center gap-4 text-[12.5px] text-muted-foreground\">\n\t\t\t\t\t{member.registered && (\n\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\tRegistered <span className=\"text-foreground\">{member.registered}</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t\t{member.memberDays != null && (\n\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\tMember for <span className=\"text-foreground\">{member.memberDays} days</span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t\t{member.nftId != null && (\n\t\t\t\t\t\t<span className=\"inline-flex items-center gap-1.5\">\n\t\t\t\t\t\t\tMembership NFT\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\thref={member.nftUrl ?? '#'}\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\t\tclassName=\"inline-flex items-center gap-1 font-semibold text-primary hover:opacity-80\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t#{member.nftId}\n\t\t\t\t\t\t\t\t<ExternalLinkIcon className=\"size-3\" />\n\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nfunction Stat({ icon: Icon, label, sub, children }: { icon: ComponentType<{ className?: string }>; label: string; sub?: string; children: ReactNode }) {\n\treturn (\n\t\t<div className=\"flex items-start gap-3 rounded-xl border border-border bg-card p-3.5\">\n\t\t\t<span className=\"grid size-[38px] shrink-0 place-items-center rounded-[10px] bg-[color-mix(in_oklab,var(--primary)_14%,transparent)] text-primary\">\n\t\t\t\t<Icon className=\"size-5\" />\n\t\t\t</span>\n\t\t\t<div className=\"min-w-0 flex-1\">\n\t\t\t\t<div className=\"text-[12.5px] text-muted-foreground\">{label}</div>\n\t\t\t\t<div className=\"mt-0.5 flex flex-wrap items-center gap-1.5 font-bold text-base text-foreground\">{children}</div>\n\t\t\t\t{sub && <div className=\"mt-0.5 text-[12.5px] text-muted-foreground\">{sub}</div>}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nfunction NetRow({\n\ticon: Icon,\n\tlabel,\n\tvolume,\n\tdirectSub,\n\tlinearSub,\n\tborder = true,\n}: {\n\ticon: ComponentType<{ className?: string }>;\n\tlabel: string;\n\tvolume?: MemberNetworkVolume;\n\tdirectSub: string;\n\tlinearSub: string;\n\tborder?: boolean;\n}) {\n\treturn (\n\t\t<div className={cn('grid grid-cols-[1.2fr_1fr_1fr] items-center gap-3 py-3.5', border && 'border-border border-t')}>\n\t\t\t<span className=\"inline-flex items-center gap-2.5 font-semibold text-foreground\">\n\t\t\t\t<span className=\"grid place-items-center text-primary\">\n\t\t\t\t\t<Icon className=\"size-5\" />\n\t\t\t\t</span>\n\t\t\t\t{label}\n\t\t\t</span>\n\t\t\t<div>\n\t\t\t\t<div className=\"font-bold\">\n\t\t\t\t\t<BetValue value={volume?.direct ?? 0} size={13} />\n\t\t\t\t</div>\n\t\t\t\t<div className=\"mt-0.5 text-muted-foreground text-xs\">{directSub}</div>\n\t\t\t</div>\n\t\t\t<div>\n\t\t\t\t<div className=\"font-bold\">\n\t\t\t\t\t<BetValue value={volume?.linear ?? 0} size={13} />\n\t\t\t\t</div>\n\t\t\t\t<div className=\"mt-0.5 text-muted-foreground text-xs\">{linearSub}</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nfunction AddressLink({ address, explorerUrl }: { address: string; explorerUrl?: (address: string) => string }) {\n\tconst short = shortAddress(address);\n\tif (!explorerUrl) return <span>{short}</span>;\n\treturn (\n\t\t<a\n\t\t\thref={explorerUrl(address)}\n\t\t\ttarget=\"_blank\"\n\t\t\trel=\"noopener noreferrer\"\n\t\t\tclassName=\"inline-flex items-center gap-1.5 font-bold text-primary hover:opacity-80\"\n\t\t>\n\t\t\t{short}\n\t\t\t<ExternalLinkIcon className=\"size-3\" />\n\t\t</a>\n\t);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Popover as PopoverPrimitive } from '@base-ui/react/popover';
|
|
2
|
+
import type * as React from 'react';
|
|
3
|
+
declare function Popover({ ...props }: PopoverPrimitive.Root.Props): React.JSX.Element;
|
|
4
|
+
declare function PopoverTrigger({ ...props }: PopoverPrimitive.Trigger.Props): React.JSX.Element;
|
|
5
|
+
declare function PopoverContent({ className, align, alignOffset, side, sideOffset, ...props }: PopoverPrimitive.Popup.Props & Pick<PopoverPrimitive.Positioner.Props, 'align' | 'alignOffset' | 'side' | 'sideOffset'>): React.JSX.Element;
|
|
6
|
+
declare function PopoverHeader({ className, ...props }: React.ComponentProps<'div'>): React.JSX.Element;
|
|
7
|
+
declare function PopoverTitle({ className, ...props }: PopoverPrimitive.Title.Props): React.JSX.Element;
|
|
8
|
+
declare function PopoverDescription({ className, ...props }: PopoverPrimitive.Description.Props): React.JSX.Element;
|
|
9
|
+
export { Popover, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger };
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
cn
|
|
4
|
+
} from "../chunk-Y2TKUANL.js";
|
|
5
|
+
|
|
6
|
+
// src/components/popover.tsx
|
|
7
|
+
import { Popover as PopoverPrimitive } from "@base-ui/react/popover";
|
|
8
|
+
import { jsx } from "react/jsx-runtime";
|
|
9
|
+
function Popover({ ...props }) {
|
|
10
|
+
return /* @__PURE__ */ jsx(PopoverPrimitive.Root, { "data-slot": "popover", ...props });
|
|
11
|
+
}
|
|
12
|
+
function PopoverTrigger({ ...props }) {
|
|
13
|
+
return /* @__PURE__ */ jsx(PopoverPrimitive.Trigger, { "data-slot": "popover-trigger", ...props });
|
|
14
|
+
}
|
|
15
|
+
function PopoverContent({
|
|
16
|
+
className,
|
|
17
|
+
align = "center",
|
|
18
|
+
alignOffset = 0,
|
|
19
|
+
side = "bottom",
|
|
20
|
+
sideOffset = 4,
|
|
21
|
+
...props
|
|
22
|
+
}) {
|
|
23
|
+
return /* @__PURE__ */ jsx(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsx(PopoverPrimitive.Positioner, { align, alignOffset, side, sideOffset, className: "isolate z-50", children: /* @__PURE__ */ jsx(
|
|
24
|
+
PopoverPrimitive.Popup,
|
|
25
|
+
{
|
|
26
|
+
"data-slot": "popover-content",
|
|
27
|
+
className: cn(
|
|
28
|
+
"data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:fade-in-0 data-open:zoom-in-95 data-closed:fade-out-0 data-closed:zoom-out-95 z-50 flex max-h-(--available-height) w-72 origin-(--transform-origin) flex-col gap-2.5 overflow-y-auto rounded-lg bg-popover p-2.5 text-popover-foreground text-sm shadow-md outline-hidden ring-1 ring-foreground/10 duration-100 data-closed:animate-out data-open:animate-in",
|
|
29
|
+
className
|
|
30
|
+
),
|
|
31
|
+
...props
|
|
32
|
+
}
|
|
33
|
+
) }) });
|
|
34
|
+
}
|
|
35
|
+
function PopoverHeader({ className, ...props }) {
|
|
36
|
+
return /* @__PURE__ */ jsx("div", { "data-slot": "popover-header", className: cn("flex flex-col gap-0.5 text-sm", className), ...props });
|
|
37
|
+
}
|
|
38
|
+
function PopoverTitle({ className, ...props }) {
|
|
39
|
+
return /* @__PURE__ */ jsx(PopoverPrimitive.Title, { "data-slot": "popover-title", className: cn("font-medium", className), ...props });
|
|
40
|
+
}
|
|
41
|
+
function PopoverDescription({ className, ...props }) {
|
|
42
|
+
return /* @__PURE__ */ jsx(PopoverPrimitive.Description, { "data-slot": "popover-description", className: cn("text-muted-foreground", className), ...props });
|
|
43
|
+
}
|
|
44
|
+
export {
|
|
45
|
+
Popover,
|
|
46
|
+
PopoverContent,
|
|
47
|
+
PopoverDescription,
|
|
48
|
+
PopoverHeader,
|
|
49
|
+
PopoverTitle,
|
|
50
|
+
PopoverTrigger
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=popover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/popover.tsx"],"sourcesContent":["'use client';\n\nimport { Popover as PopoverPrimitive } from '@base-ui/react/popover';\nimport { cn } from '@betfin/ui/lib/utils';\nimport type * as React from 'react';\n\nfunction Popover({ ...props }: PopoverPrimitive.Root.Props) {\n\treturn <PopoverPrimitive.Root data-slot=\"popover\" {...props} />;\n}\n\nfunction PopoverTrigger({ ...props }: PopoverPrimitive.Trigger.Props) {\n\treturn <PopoverPrimitive.Trigger data-slot=\"popover-trigger\" {...props} />;\n}\n\nfunction PopoverContent({\n\tclassName,\n\talign = 'center',\n\talignOffset = 0,\n\tside = 'bottom',\n\tsideOffset = 4,\n\t...props\n}: PopoverPrimitive.Popup.Props & Pick<PopoverPrimitive.Positioner.Props, 'align' | 'alignOffset' | 'side' | 'sideOffset'>) {\n\treturn (\n\t\t<PopoverPrimitive.Portal>\n\t\t\t<PopoverPrimitive.Positioner align={align} alignOffset={alignOffset} side={side} sideOffset={sideOffset} className=\"isolate z-50\">\n\t\t\t\t<PopoverPrimitive.Popup\n\t\t\t\t\tdata-slot=\"popover-content\"\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t'data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:fade-in-0 data-open:zoom-in-95 data-closed:fade-out-0 data-closed:zoom-out-95 z-50 flex max-h-(--available-height) w-72 origin-(--transform-origin) flex-col gap-2.5 overflow-y-auto rounded-lg bg-popover p-2.5 text-popover-foreground text-sm shadow-md outline-hidden ring-1 ring-foreground/10 duration-100 data-closed:animate-out data-open:animate-in',\n\t\t\t\t\t\tclassName,\n\t\t\t\t\t)}\n\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t\t</PopoverPrimitive.Positioner>\n\t\t</PopoverPrimitive.Portal>\n\t);\n}\n\nfunction PopoverHeader({ className, ...props }: React.ComponentProps<'div'>) {\n\treturn <div data-slot=\"popover-header\" className={cn('flex flex-col gap-0.5 text-sm', className)} {...props} />;\n}\n\nfunction PopoverTitle({ className, ...props }: PopoverPrimitive.Title.Props) {\n\treturn <PopoverPrimitive.Title data-slot=\"popover-title\" className={cn('font-medium', className)} {...props} />;\n}\n\nfunction PopoverDescription({ className, ...props }: PopoverPrimitive.Description.Props) {\n\treturn <PopoverPrimitive.Description data-slot=\"popover-description\" className={cn('text-muted-foreground', className)} {...props} />;\n}\n\nexport { Popover, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger };\n"],"mappings":";;;;;;AAEA,SAAS,WAAW,wBAAwB;AAKpC;AADR,SAAS,QAAQ,EAAE,GAAG,MAAM,GAAgC;AAC3D,SAAO,oBAAC,iBAAiB,MAAjB,EAAsB,aAAU,WAAW,GAAG,OAAO;AAC9D;AAEA,SAAS,eAAe,EAAE,GAAG,MAAM,GAAmC;AACrE,SAAO,oBAAC,iBAAiB,SAAjB,EAAyB,aAAU,mBAAmB,GAAG,OAAO;AACzE;AAEA,SAAS,eAAe;AAAA,EACvB;AAAA,EACA,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,OAAO;AAAA,EACP,aAAa;AAAA,EACb,GAAG;AACJ,GAA4H;AAC3H,SACC,oBAAC,iBAAiB,QAAjB,EACA,8BAAC,iBAAiB,YAAjB,EAA4B,OAAc,aAA0B,MAAY,YAAwB,WAAU,gBAClH;AAAA,IAAC,iBAAiB;AAAA,IAAjB;AAAA,MACA,aAAU;AAAA,MACV,WAAW;AAAA,QACV;AAAA,QACA;AAAA,MACD;AAAA,MACC,GAAG;AAAA;AAAA,EACL,GACD,GACD;AAEF;AAEA,SAAS,cAAc,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC5E,SAAO,oBAAC,SAAI,aAAU,kBAAiB,WAAW,GAAG,iCAAiC,SAAS,GAAI,GAAG,OAAO;AAC9G;AAEA,SAAS,aAAa,EAAE,WAAW,GAAG,MAAM,GAAiC;AAC5E,SAAO,oBAAC,iBAAiB,OAAjB,EAAuB,aAAU,iBAAgB,WAAW,GAAG,eAAe,SAAS,GAAI,GAAG,OAAO;AAC9G;AAEA,SAAS,mBAAmB,EAAE,WAAW,GAAG,MAAM,GAAuC;AACxF,SAAO,oBAAC,iBAAiB,aAAjB,EAA6B,aAAU,uBAAsB,WAAW,GAAG,yBAAyB,SAAS,GAAI,GAAG,OAAO;AACpI;","names":[]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Progress as ProgressPrimitive } from '@base-ui/react/progress';
|
|
2
|
+
declare function Progress({ className, children, value, ...props }: ProgressPrimitive.Root.Props): import("react").JSX.Element;
|
|
3
|
+
declare function ProgressTrack({ className, ...props }: ProgressPrimitive.Track.Props): import("react").JSX.Element;
|
|
4
|
+
declare function ProgressIndicator({ className, ...props }: ProgressPrimitive.Indicator.Props): import("react").JSX.Element;
|
|
5
|
+
declare function ProgressLabel({ className, ...props }: ProgressPrimitive.Label.Props): import("react").JSX.Element;
|
|
6
|
+
declare function ProgressValue({ className, ...props }: ProgressPrimitive.Value.Props): import("react").JSX.Element;
|
|
7
|
+
export { Progress, ProgressIndicator, ProgressLabel, ProgressTrack, ProgressValue };
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cn
|
|
3
|
+
} from "../chunk-Y2TKUANL.js";
|
|
4
|
+
|
|
5
|
+
// src/components/progress.tsx
|
|
6
|
+
import { Progress as ProgressPrimitive } from "@base-ui/react/progress";
|
|
7
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
function Progress({ className, children, value, ...props }) {
|
|
9
|
+
return /* @__PURE__ */ jsxs(ProgressPrimitive.Root, { value, "data-slot": "progress", className: cn("flex flex-wrap gap-3", className), ...props, children: [
|
|
10
|
+
children,
|
|
11
|
+
/* @__PURE__ */ jsx(ProgressTrack, { children: /* @__PURE__ */ jsx(ProgressIndicator, {}) })
|
|
12
|
+
] });
|
|
13
|
+
}
|
|
14
|
+
function ProgressTrack({ className, ...props }) {
|
|
15
|
+
return /* @__PURE__ */ jsx(
|
|
16
|
+
ProgressPrimitive.Track,
|
|
17
|
+
{
|
|
18
|
+
className: cn("relative flex h-1 w-full items-center overflow-x-hidden rounded-full bg-muted", className),
|
|
19
|
+
"data-slot": "progress-track",
|
|
20
|
+
...props
|
|
21
|
+
}
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
function ProgressIndicator({ className, ...props }) {
|
|
25
|
+
return /* @__PURE__ */ jsx(ProgressPrimitive.Indicator, { "data-slot": "progress-indicator", className: cn("h-full bg-primary transition-all", className), ...props });
|
|
26
|
+
}
|
|
27
|
+
function ProgressLabel({ className, ...props }) {
|
|
28
|
+
return /* @__PURE__ */ jsx(ProgressPrimitive.Label, { className: cn("font-medium text-sm", className), "data-slot": "progress-label", ...props });
|
|
29
|
+
}
|
|
30
|
+
function ProgressValue({ className, ...props }) {
|
|
31
|
+
return /* @__PURE__ */ jsx(ProgressPrimitive.Value, { className: cn("ml-auto text-muted-foreground text-sm tabular-nums", className), "data-slot": "progress-value", ...props });
|
|
32
|
+
}
|
|
33
|
+
export {
|
|
34
|
+
Progress,
|
|
35
|
+
ProgressIndicator,
|
|
36
|
+
ProgressLabel,
|
|
37
|
+
ProgressTrack,
|
|
38
|
+
ProgressValue
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/progress.tsx"],"sourcesContent":["import { Progress as ProgressPrimitive } from '@base-ui/react/progress';\n\nimport { cn } from '@betfin/ui/lib/utils';\n\nfunction Progress({ className, children, value, ...props }: ProgressPrimitive.Root.Props) {\n\treturn (\n\t\t<ProgressPrimitive.Root value={value} data-slot=\"progress\" className={cn('flex flex-wrap gap-3', className)} {...props}>\n\t\t\t{children}\n\t\t\t<ProgressTrack>\n\t\t\t\t<ProgressIndicator />\n\t\t\t</ProgressTrack>\n\t\t</ProgressPrimitive.Root>\n\t);\n}\n\nfunction ProgressTrack({ className, ...props }: ProgressPrimitive.Track.Props) {\n\treturn (\n\t\t<ProgressPrimitive.Track\n\t\t\tclassName={cn('relative flex h-1 w-full items-center overflow-x-hidden rounded-full bg-muted', className)}\n\t\t\tdata-slot=\"progress-track\"\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction ProgressIndicator({ className, ...props }: ProgressPrimitive.Indicator.Props) {\n\treturn <ProgressPrimitive.Indicator data-slot=\"progress-indicator\" className={cn('h-full bg-primary transition-all', className)} {...props} />;\n}\n\nfunction ProgressLabel({ className, ...props }: ProgressPrimitive.Label.Props) {\n\treturn <ProgressPrimitive.Label className={cn('font-medium text-sm', className)} data-slot=\"progress-label\" {...props} />;\n}\n\nfunction ProgressValue({ className, ...props }: ProgressPrimitive.Value.Props) {\n\treturn <ProgressPrimitive.Value className={cn('ml-auto text-muted-foreground text-sm tabular-nums', className)} data-slot=\"progress-value\" {...props} />;\n}\n\nexport { Progress, ProgressIndicator, ProgressLabel, ProgressTrack, ProgressValue };\n"],"mappings":";;;;;AAAA,SAAS,YAAY,yBAAyB;AAM5C,SAGE,KAHF;AAFF,SAAS,SAAS,EAAE,WAAW,UAAU,OAAO,GAAG,MAAM,GAAiC;AACzF,SACC,qBAAC,kBAAkB,MAAlB,EAAuB,OAAc,aAAU,YAAW,WAAW,GAAG,wBAAwB,SAAS,GAAI,GAAG,OAC/G;AAAA;AAAA,IACD,oBAAC,iBACA,8BAAC,qBAAkB,GACpB;AAAA,KACD;AAEF;AAEA,SAAS,cAAc,EAAE,WAAW,GAAG,MAAM,GAAkC;AAC9E,SACC;AAAA,IAAC,kBAAkB;AAAA,IAAlB;AAAA,MACA,WAAW,GAAG,iFAAiF,SAAS;AAAA,MACxG,aAAU;AAAA,MACT,GAAG;AAAA;AAAA,EACL;AAEF;AAEA,SAAS,kBAAkB,EAAE,WAAW,GAAG,MAAM,GAAsC;AACtF,SAAO,oBAAC,kBAAkB,WAAlB,EAA4B,aAAU,sBAAqB,WAAW,GAAG,oCAAoC,SAAS,GAAI,GAAG,OAAO;AAC7I;AAEA,SAAS,cAAc,EAAE,WAAW,GAAG,MAAM,GAAkC;AAC9E,SAAO,oBAAC,kBAAkB,OAAlB,EAAwB,WAAW,GAAG,uBAAuB,SAAS,GAAG,aAAU,kBAAkB,GAAG,OAAO;AACxH;AAEA,SAAS,cAAc,EAAE,WAAW,GAAG,MAAM,GAAkC;AAC9E,SAAO,oBAAC,kBAAkB,OAAlB,EAAwB,WAAW,GAAG,sDAAsD,SAAS,GAAG,aAAU,kBAAkB,GAAG,OAAO;AACvJ;","names":[]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Radio as RadioPrimitive } from '@base-ui/react/radio';
|
|
2
|
+
import { RadioGroup as RadioGroupPrimitive } from '@base-ui/react/radio-group';
|
|
3
|
+
declare function RadioGroup({ className, ...props }: RadioGroupPrimitive.Props): import("react").JSX.Element;
|
|
4
|
+
declare function RadioGroupItem({ className, ...props }: RadioPrimitive.Root.Props): import("react").JSX.Element;
|
|
5
|
+
export { RadioGroup, RadioGroupItem };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
cn
|
|
4
|
+
} from "../chunk-Y2TKUANL.js";
|
|
5
|
+
|
|
6
|
+
// src/components/radio-group.tsx
|
|
7
|
+
import { Radio as RadioPrimitive } from "@base-ui/react/radio";
|
|
8
|
+
import { RadioGroup as RadioGroupPrimitive } from "@base-ui/react/radio-group";
|
|
9
|
+
import { jsx } from "react/jsx-runtime";
|
|
10
|
+
function RadioGroup({ className, ...props }) {
|
|
11
|
+
return /* @__PURE__ */ jsx(RadioGroupPrimitive, { "data-slot": "radio-group", className: cn("grid w-full gap-2", className), ...props });
|
|
12
|
+
}
|
|
13
|
+
function RadioGroupItem({ className, ...props }) {
|
|
14
|
+
return /* @__PURE__ */ jsx(
|
|
15
|
+
RadioPrimitive.Root,
|
|
16
|
+
{
|
|
17
|
+
"data-slot": "radio-group-item",
|
|
18
|
+
className: cn(
|
|
19
|
+
"group/radio-group-item peer relative flex aspect-square size-4 shrink-0 rounded-full border border-input outline-none after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground dark:bg-input/30 dark:data-checked:bg-primary dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",
|
|
20
|
+
className
|
|
21
|
+
),
|
|
22
|
+
...props,
|
|
23
|
+
children: /* @__PURE__ */ jsx(RadioPrimitive.Indicator, { "data-slot": "radio-group-indicator", className: "flex size-4 items-center justify-center", children: /* @__PURE__ */ jsx("span", { className: "absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2 rounded-full bg-primary-foreground" }) })
|
|
24
|
+
}
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
export {
|
|
28
|
+
RadioGroup,
|
|
29
|
+
RadioGroupItem
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=radio-group.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/radio-group.tsx"],"sourcesContent":["'use client';\n\nimport { Radio as RadioPrimitive } from '@base-ui/react/radio';\nimport { RadioGroup as RadioGroupPrimitive } from '@base-ui/react/radio-group';\n\nimport { cn } from '@betfin/ui/lib/utils';\n\nfunction RadioGroup({ className, ...props }: RadioGroupPrimitive.Props) {\n\treturn <RadioGroupPrimitive data-slot=\"radio-group\" className={cn('grid w-full gap-2', className)} {...props} />;\n}\n\nfunction RadioGroupItem({ className, ...props }: RadioPrimitive.Root.Props) {\n\treturn (\n\t\t<RadioPrimitive.Root\n\t\t\tdata-slot=\"radio-group-item\"\n\t\t\tclassName={cn(\n\t\t\t\t'group/radio-group-item peer relative flex aspect-square size-4 shrink-0 rounded-full border border-input outline-none after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 aria-invalid:aria-checked:border-primary data-checked:border-primary data-checked:bg-primary data-checked:text-primary-foreground dark:bg-input/30 dark:data-checked:bg-primary dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t>\n\t\t\t<RadioPrimitive.Indicator data-slot=\"radio-group-indicator\" className=\"flex size-4 items-center justify-center\">\n\t\t\t\t<span className=\"absolute top-1/2 left-1/2 size-2 -translate-x-1/2 -translate-y-1/2 rounded-full bg-primary-foreground\" />\n\t\t\t</RadioPrimitive.Indicator>\n\t\t</RadioPrimitive.Root>\n\t);\n}\n\nexport { RadioGroup, RadioGroupItem };\n"],"mappings":";;;;;;AAEA,SAAS,SAAS,sBAAsB;AACxC,SAAS,cAAc,2BAA2B;AAK1C;AADR,SAAS,WAAW,EAAE,WAAW,GAAG,MAAM,GAA8B;AACvE,SAAO,oBAAC,uBAAoB,aAAU,eAAc,WAAW,GAAG,qBAAqB,SAAS,GAAI,GAAG,OAAO;AAC/G;AAEA,SAAS,eAAe,EAAE,WAAW,GAAG,MAAM,GAA8B;AAC3E,SACC;AAAA,IAAC,eAAe;AAAA,IAAf;AAAA,MACA,aAAU;AAAA,MACV,WAAW;AAAA,QACV;AAAA,QACA;AAAA,MACD;AAAA,MACC,GAAG;AAAA,MAEJ,8BAAC,eAAe,WAAf,EAAyB,aAAU,yBAAwB,WAAU,2CACrE,8BAAC,UAAK,WAAU,yGAAwG,GACzH;AAAA;AAAA,EACD;AAEF;","names":[]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { ScrollArea as ScrollAreaPrimitive } from '@base-ui/react/scroll-area';
|
|
2
|
+
declare function ScrollArea({ className, children, ...props }: ScrollAreaPrimitive.Root.Props): import("react").JSX.Element;
|
|
3
|
+
declare function ScrollBar({ className, orientation, ...props }: ScrollAreaPrimitive.Scrollbar.Props): import("react").JSX.Element;
|
|
4
|
+
export { ScrollArea, ScrollBar };
|