@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.
Files changed (160) hide show
  1. package/dist/chunk-3CAXHUAL.js +23 -0
  2. package/dist/chunk-3CAXHUAL.js.map +1 -0
  3. package/dist/chunk-3YCD2QLS.js +113 -0
  4. package/dist/chunk-3YCD2QLS.js.map +1 -0
  5. package/dist/chunk-5CXIFF6J.js +46 -0
  6. package/dist/chunk-5CXIFF6J.js.map +1 -0
  7. package/dist/chunk-EP6DYU4N.js +26 -0
  8. package/dist/chunk-EP6DYU4N.js.map +1 -0
  9. package/dist/chunk-FHYW2QBY.js +21 -0
  10. package/dist/chunk-FHYW2QBY.js.map +1 -0
  11. package/dist/chunk-HRFMTZ55.js +49 -0
  12. package/dist/chunk-HRFMTZ55.js.map +1 -0
  13. package/dist/chunk-ILNHKDYA.js +107 -0
  14. package/dist/chunk-ILNHKDYA.js.map +1 -0
  15. package/dist/chunk-JTVU6ANA.js +37 -0
  16. package/dist/chunk-JTVU6ANA.js.map +1 -0
  17. package/dist/chunk-K7JWN6NH.js +21 -0
  18. package/dist/chunk-K7JWN6NH.js.map +1 -0
  19. package/dist/chunk-QZIKXMHP.js +131 -0
  20. package/dist/chunk-QZIKXMHP.js.map +1 -0
  21. package/dist/chunk-SSC2M625.js +24 -0
  22. package/dist/chunk-SSC2M625.js.map +1 -0
  23. package/dist/chunk-TLULUIYC.js +14 -0
  24. package/dist/chunk-TLULUIYC.js.map +1 -0
  25. package/dist/chunk-VJ6P5FFS.js +90 -0
  26. package/dist/chunk-VJ6P5FFS.js.map +1 -0
  27. package/dist/chunk-Y2TKUANL.js +11 -0
  28. package/dist/chunk-Y2TKUANL.js.map +1 -0
  29. package/dist/components/accordion.d.ts +6 -0
  30. package/dist/components/accordion.js +59 -0
  31. package/dist/components/accordion.js.map +1 -0
  32. package/dist/components/alert-dialog.d.ts +18 -0
  33. package/dist/components/alert-dialog.js +144 -0
  34. package/dist/components/alert-dialog.js.map +1 -0
  35. package/dist/components/app-header.d.ts +19 -0
  36. package/dist/components/app-header.js +17 -0
  37. package/dist/components/app-header.js.map +1 -0
  38. package/dist/components/badge.d.ts +7 -0
  39. package/dist/components/badge.js +47 -0
  40. package/dist/components/badge.js.map +1 -0
  41. package/dist/components/bet-value.d.ts +49 -0
  42. package/dist/components/bet-value.js +12 -0
  43. package/dist/components/bet-value.js.map +1 -0
  44. package/dist/components/breadcrumb.d.ts +10 -0
  45. package/dist/components/breadcrumb.js +65 -0
  46. package/dist/components/breadcrumb.js.map +1 -0
  47. package/dist/components/button.d.ts +8 -0
  48. package/dist/components/button.js +10 -0
  49. package/dist/components/button.js.map +1 -0
  50. package/dist/components/calendar.d.ts +10 -0
  51. package/dist/components/calendar.js +145 -0
  52. package/dist/components/calendar.js.map +1 -0
  53. package/dist/components/carousel.d.ts +28 -0
  54. package/dist/components/carousel.js +153 -0
  55. package/dist/components/carousel.js.map +1 -0
  56. package/dist/components/chart.d.ts +39 -0
  57. package/dist/components/chart.js +219 -0
  58. package/dist/components/chart.js.map +1 -0
  59. package/dist/components/checkbox.d.ts +3 -0
  60. package/dist/components/checkbox.js +26 -0
  61. package/dist/components/checkbox.js.map +1 -0
  62. package/dist/components/collapsible.d.ts +5 -0
  63. package/dist/components/collapsible.js +20 -0
  64. package/dist/components/collapsible.js.map +1 -0
  65. package/dist/components/command.d.ts +19 -0
  66. package/dist/components/command.js +130 -0
  67. package/dist/components/command.js.map +1 -0
  68. package/dist/components/context-menu.d.ts +29 -0
  69. package/dist/components/context-menu.js +186 -0
  70. package/dist/components/context-menu.js.map +1 -0
  71. package/dist/components/dialog.d.ts +17 -0
  72. package/dist/components/dialog.js +28 -0
  73. package/dist/components/dialog.js.map +1 -0
  74. package/dist/components/drawer.d.ts +16 -0
  75. package/dist/components/drawer.js +164 -0
  76. package/dist/components/drawer.js.map +1 -0
  77. package/dist/components/dropdown-menu.d.ts +29 -0
  78. package/dist/components/dropdown-menu.js +207 -0
  79. package/dist/components/dropdown-menu.js.map +1 -0
  80. package/dist/components/input-group.d.ts +18 -0
  81. package/dist/components/input-group.js +22 -0
  82. package/dist/components/input-group.js.map +1 -0
  83. package/dist/components/input.d.ts +3 -0
  84. package/dist/components/input.js +8 -0
  85. package/dist/components/input.js.map +1 -0
  86. package/dist/components/loading.d.ts +9 -0
  87. package/dist/components/loading.js +26 -0
  88. package/dist/components/loading.js.map +1 -0
  89. package/dist/components/member-profile.d.ts +79 -0
  90. package/dist/components/member-profile.js +342 -0
  91. package/dist/components/member-profile.js.map +1 -0
  92. package/dist/components/popover.d.ts +9 -0
  93. package/dist/components/popover.js +52 -0
  94. package/dist/components/popover.js.map +1 -0
  95. package/dist/components/progress.d.ts +7 -0
  96. package/dist/components/progress.js +40 -0
  97. package/dist/components/progress.js.map +1 -0
  98. package/dist/components/radio-group.d.ts +5 -0
  99. package/dist/components/radio-group.js +31 -0
  100. package/dist/components/radio-group.js.map +1 -0
  101. package/dist/components/scroll-area.d.ts +4 -0
  102. package/dist/components/scroll-area.js +42 -0
  103. package/dist/components/scroll-area.js.map +1 -0
  104. package/dist/components/select.d.ts +15 -0
  105. package/dist/components/select.js +136 -0
  106. package/dist/components/select.js.map +1 -0
  107. package/dist/components/separator.d.ts +3 -0
  108. package/dist/components/separator.js +8 -0
  109. package/dist/components/separator.js.map +1 -0
  110. package/dist/components/sheet.d.ts +14 -0
  111. package/dist/components/sheet.js +23 -0
  112. package/dist/components/sheet.js.map +1 -0
  113. package/dist/components/sidebar.d.ts +63 -0
  114. package/dist/components/sidebar.js +536 -0
  115. package/dist/components/sidebar.js.map +1 -0
  116. package/dist/components/skeleton.d.ts +2 -0
  117. package/dist/components/skeleton.js +8 -0
  118. package/dist/components/skeleton.js.map +1 -0
  119. package/dist/components/slider.d.ts +3 -0
  120. package/dist/components/slider.js +45 -0
  121. package/dist/components/slider.js.map +1 -0
  122. package/dist/components/sonner.d.ts +3 -0
  123. package/dist/components/sonner.js +39 -0
  124. package/dist/components/sonner.js.map +1 -0
  125. package/dist/components/switch.d.ts +5 -0
  126. package/dist/components/switch.js +36 -0
  127. package/dist/components/switch.js.map +1 -0
  128. package/dist/components/table.d.ts +12 -0
  129. package/dist/components/table.js +56 -0
  130. package/dist/components/table.js.map +1 -0
  131. package/dist/components/tabs.d.ts +10 -0
  132. package/dist/components/tabs.js +63 -0
  133. package/dist/components/tabs.js.map +1 -0
  134. package/dist/components/textarea.d.ts +3 -0
  135. package/dist/components/textarea.js +8 -0
  136. package/dist/components/textarea.js.map +1 -0
  137. package/dist/components/toggle-group.d.ts +11 -0
  138. package/dist/components/toggle-group.js +80 -0
  139. package/dist/components/toggle-group.js.map +1 -0
  140. package/dist/components/toggle.d.ts +8 -0
  141. package/dist/components/toggle.js +11 -0
  142. package/dist/components/toggle.js.map +1 -0
  143. package/dist/components/tooltip.d.ts +6 -0
  144. package/dist/components/tooltip.js +14 -0
  145. package/dist/components/tooltip.js.map +1 -0
  146. package/dist/hooks/use-mobile.d.ts +1 -0
  147. package/dist/hooks/use-mobile.js +7 -0
  148. package/dist/hooks/use-mobile.js.map +1 -0
  149. package/dist/lib/date.d.ts +14 -0
  150. package/dist/lib/date.js +24 -0
  151. package/dist/lib/date.js.map +1 -0
  152. package/dist/lib/format.d.ts +16 -0
  153. package/dist/lib/format.js +9 -0
  154. package/dist/lib/format.js.map +1 -0
  155. package/dist/lib/utils.d.ts +2 -0
  156. package/dist/lib/utils.js +7 -0
  157. package/dist/lib/utils.js.map +1 -0
  158. package/package.json +71 -0
  159. package/src/styles/globals.css +151 -0
  160. package/src/styles/theme.css +144 -0
@@ -0,0 +1,23 @@
1
+ import {
2
+ cn
3
+ } from "./chunk-Y2TKUANL.js";
4
+
5
+ // src/components/separator.tsx
6
+ import { Separator as SeparatorPrimitive } from "@base-ui/react/separator";
7
+ import { jsx } from "react/jsx-runtime";
8
+ function Separator({ className, orientation = "horizontal", ...props }) {
9
+ return /* @__PURE__ */ jsx(
10
+ SeparatorPrimitive,
11
+ {
12
+ "data-slot": "separator",
13
+ orientation,
14
+ className: cn("shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch", className),
15
+ ...props
16
+ }
17
+ );
18
+ }
19
+
20
+ export {
21
+ Separator
22
+ };
23
+ //# sourceMappingURL=chunk-3CAXHUAL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/separator.tsx"],"sourcesContent":["import { Separator as SeparatorPrimitive } from '@base-ui/react/separator';\n\nimport { cn } from '@betfin/ui/lib/utils';\n\nfunction Separator({ className, orientation = 'horizontal', ...props }: SeparatorPrimitive.Props) {\n\treturn (\n\t\t<SeparatorPrimitive\n\t\t\tdata-slot=\"separator\"\n\t\t\torientation={orientation}\n\t\t\tclassName={cn('shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch', className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport { Separator };\n"],"mappings":";;;;;AAAA,SAAS,aAAa,0BAA0B;AAM9C;AAFF,SAAS,UAAU,EAAE,WAAW,cAAc,cAAc,GAAG,MAAM,GAA6B;AACjG,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV;AAAA,MACA,WAAW,GAAG,gHAAgH,SAAS;AAAA,MACtI,GAAG;AAAA;AAAA,EACL;AAEF;","names":[]}
@@ -0,0 +1,113 @@
1
+ import {
2
+ Button
3
+ } from "./chunk-5CXIFF6J.js";
4
+ import {
5
+ cn
6
+ } from "./chunk-Y2TKUANL.js";
7
+
8
+ // src/components/dialog.tsx
9
+ import { Dialog as DialogPrimitive } from "@base-ui/react/dialog";
10
+ import { XIcon } from "lucide-react";
11
+ import { jsx, jsxs } from "react/jsx-runtime";
12
+ function Dialog({ ...props }) {
13
+ return /* @__PURE__ */ jsx(DialogPrimitive.Root, { "data-slot": "dialog", ...props });
14
+ }
15
+ function DialogTrigger({ ...props }) {
16
+ return /* @__PURE__ */ jsx(DialogPrimitive.Trigger, { "data-slot": "dialog-trigger", ...props });
17
+ }
18
+ function DialogPortal({ ...props }) {
19
+ return /* @__PURE__ */ jsx(DialogPrimitive.Portal, { "data-slot": "dialog-portal", ...props });
20
+ }
21
+ function DialogClose({ ...props }) {
22
+ return /* @__PURE__ */ jsx(DialogPrimitive.Close, { "data-slot": "dialog-close", ...props });
23
+ }
24
+ function DialogOverlay({ className, ...props }) {
25
+ return /* @__PURE__ */ jsx(
26
+ DialogPrimitive.Backdrop,
27
+ {
28
+ "data-slot": "dialog-overlay",
29
+ className: cn(
30
+ "data-open:fade-in-0 data-closed:fade-out-0 fixed inset-0 isolate z-50 bg-black/10 duration-100 data-closed:animate-out data-open:animate-in supports-backdrop-filter:backdrop-blur-xs",
31
+ className
32
+ ),
33
+ ...props
34
+ }
35
+ );
36
+ }
37
+ function DialogContent({
38
+ className,
39
+ children,
40
+ showCloseButton = true,
41
+ ...props
42
+ }) {
43
+ return /* @__PURE__ */ jsxs(DialogPortal, { children: [
44
+ /* @__PURE__ */ jsx(DialogOverlay, {}),
45
+ /* @__PURE__ */ jsxs(
46
+ DialogPrimitive.Popup,
47
+ {
48
+ "data-slot": "dialog-content",
49
+ className: cn(
50
+ "data-open:fade-in-0 data-open:zoom-in-95 data-closed:fade-out-0 data-closed:zoom-out-95 fixed top-1/2 left-1/2 z-50 grid max-h-[90dvh] w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 overflow-y-auto rounded-xl bg-popover p-4 text-popover-foreground text-sm outline-none ring-1 ring-foreground/10 duration-100 data-closed:animate-out data-open:animate-in sm:max-w-sm",
51
+ className
52
+ ),
53
+ ...props,
54
+ children: [
55
+ children,
56
+ showCloseButton && /* @__PURE__ */ jsxs(DialogPrimitive.Close, { "data-slot": "dialog-close", render: /* @__PURE__ */ jsx(Button, { variant: "ghost", className: "absolute top-2 right-2", size: "icon-sm" }), children: [
57
+ /* @__PURE__ */ jsx(XIcon, {}),
58
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
59
+ ] })
60
+ ]
61
+ }
62
+ )
63
+ ] });
64
+ }
65
+ function DialogHeader({ className, ...props }) {
66
+ return /* @__PURE__ */ jsx("div", { "data-slot": "dialog-header", className: cn("flex flex-col gap-2", className), ...props });
67
+ }
68
+ function DialogFooter({
69
+ className,
70
+ showCloseButton = false,
71
+ children,
72
+ ...props
73
+ }) {
74
+ return /* @__PURE__ */ jsxs(
75
+ "div",
76
+ {
77
+ "data-slot": "dialog-footer",
78
+ className: cn("-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 sm:flex-row sm:justify-end", className),
79
+ ...props,
80
+ children: [
81
+ children,
82
+ showCloseButton && /* @__PURE__ */ jsx(DialogPrimitive.Close, { render: /* @__PURE__ */ jsx(Button, { variant: "outline" }), children: "Close" })
83
+ ]
84
+ }
85
+ );
86
+ }
87
+ function DialogTitle({ className, ...props }) {
88
+ return /* @__PURE__ */ jsx(DialogPrimitive.Title, { "data-slot": "dialog-title", className: cn("font-heading font-medium text-base leading-none", className), ...props });
89
+ }
90
+ function DialogDescription({ className, ...props }) {
91
+ return /* @__PURE__ */ jsx(
92
+ DialogPrimitive.Description,
93
+ {
94
+ "data-slot": "dialog-description",
95
+ className: cn("text-muted-foreground text-sm *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground", className),
96
+ ...props
97
+ }
98
+ );
99
+ }
100
+
101
+ export {
102
+ Dialog,
103
+ DialogTrigger,
104
+ DialogPortal,
105
+ DialogClose,
106
+ DialogOverlay,
107
+ DialogContent,
108
+ DialogHeader,
109
+ DialogFooter,
110
+ DialogTitle,
111
+ DialogDescription
112
+ };
113
+ //# sourceMappingURL=chunk-3YCD2QLS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/dialog.tsx"],"sourcesContent":["'use client';\n\nimport { Dialog as DialogPrimitive } from '@base-ui/react/dialog';\nimport { Button } from '@betfin/ui/components/button';\n\nimport { cn } from '@betfin/ui/lib/utils';\nimport { XIcon } from 'lucide-react';\nimport type * as React from 'react';\n\nfunction Dialog({ ...props }: DialogPrimitive.Root.Props) {\n\treturn <DialogPrimitive.Root data-slot=\"dialog\" {...props} />;\n}\n\nfunction DialogTrigger({ ...props }: DialogPrimitive.Trigger.Props) {\n\treturn <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />;\n}\n\nfunction DialogPortal({ ...props }: DialogPrimitive.Portal.Props) {\n\treturn <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />;\n}\n\nfunction DialogClose({ ...props }: DialogPrimitive.Close.Props) {\n\treturn <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />;\n}\n\nfunction DialogOverlay({ className, ...props }: DialogPrimitive.Backdrop.Props) {\n\treturn (\n\t\t<DialogPrimitive.Backdrop\n\t\t\tdata-slot=\"dialog-overlay\"\n\t\t\tclassName={cn(\n\t\t\t\t'data-open:fade-in-0 data-closed:fade-out-0 fixed inset-0 isolate z-50 bg-black/10 duration-100 data-closed:animate-out data-open:animate-in supports-backdrop-filter:backdrop-blur-xs',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction DialogContent({\n\tclassName,\n\tchildren,\n\tshowCloseButton = true,\n\t...props\n}: DialogPrimitive.Popup.Props & {\n\tshowCloseButton?: boolean;\n}) {\n\treturn (\n\t\t<DialogPortal>\n\t\t\t<DialogOverlay />\n\t\t\t<DialogPrimitive.Popup\n\t\t\t\tdata-slot=\"dialog-content\"\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'data-open:fade-in-0 data-open:zoom-in-95 data-closed:fade-out-0 data-closed:zoom-out-95 fixed top-1/2 left-1/2 z-50 grid max-h-[90dvh] w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 overflow-y-auto rounded-xl bg-popover p-4 text-popover-foreground text-sm outline-none ring-1 ring-foreground/10 duration-100 data-closed:animate-out data-open:animate-in sm:max-w-sm',\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t\t{showCloseButton && (\n\t\t\t\t\t<DialogPrimitive.Close data-slot=\"dialog-close\" render={<Button variant=\"ghost\" className=\"absolute top-2 right-2\" size=\"icon-sm\" />}>\n\t\t\t\t\t\t<XIcon />\n\t\t\t\t\t\t<span className=\"sr-only\">Close</span>\n\t\t\t\t\t</DialogPrimitive.Close>\n\t\t\t\t)}\n\t\t\t</DialogPrimitive.Popup>\n\t\t</DialogPortal>\n\t);\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<'div'>) {\n\treturn <div data-slot=\"dialog-header\" className={cn('flex flex-col gap-2', className)} {...props} />;\n}\n\nfunction DialogFooter({\n\tclassName,\n\tshowCloseButton = false,\n\tchildren,\n\t...props\n}: React.ComponentProps<'div'> & {\n\tshowCloseButton?: boolean;\n}) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"dialog-footer\"\n\t\t\tclassName={cn('-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 sm:flex-row sm:justify-end', className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t\t{showCloseButton && <DialogPrimitive.Close render={<Button variant=\"outline\" />}>Close</DialogPrimitive.Close>}\n\t\t</div>\n\t);\n}\n\nfunction DialogTitle({ className, ...props }: DialogPrimitive.Title.Props) {\n\treturn <DialogPrimitive.Title data-slot=\"dialog-title\" className={cn('font-heading font-medium text-base leading-none', className)} {...props} />;\n}\n\nfunction DialogDescription({ className, ...props }: DialogPrimitive.Description.Props) {\n\treturn (\n\t\t<DialogPrimitive.Description\n\t\t\tdata-slot=\"dialog-description\"\n\t\t\tclassName={cn('text-muted-foreground text-sm *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground', className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger };\n"],"mappings":";;;;;;;;AAEA,SAAS,UAAU,uBAAuB;AAI1C,SAAS,aAAa;AAId,cAiDH,YAjDG;AADR,SAAS,OAAO,EAAE,GAAG,MAAM,GAA+B;AACzD,SAAO,oBAAC,gBAAgB,MAAhB,EAAqB,aAAU,UAAU,GAAG,OAAO;AAC5D;AAEA,SAAS,cAAc,EAAE,GAAG,MAAM,GAAkC;AACnE,SAAO,oBAAC,gBAAgB,SAAhB,EAAwB,aAAU,kBAAkB,GAAG,OAAO;AACvE;AAEA,SAAS,aAAa,EAAE,GAAG,MAAM,GAAiC;AACjE,SAAO,oBAAC,gBAAgB,QAAhB,EAAuB,aAAU,iBAAiB,GAAG,OAAO;AACrE;AAEA,SAAS,YAAY,EAAE,GAAG,MAAM,GAAgC;AAC/D,SAAO,oBAAC,gBAAgB,OAAhB,EAAsB,aAAU,gBAAgB,GAAG,OAAO;AACnE;AAEA,SAAS,cAAc,EAAE,WAAW,GAAG,MAAM,GAAmC;AAC/E,SACC;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACA,aAAU;AAAA,MACV,WAAW;AAAA,QACV;AAAA,QACA;AAAA,MACD;AAAA,MACC,GAAG;AAAA;AAAA,EACL;AAEF;AAEA,SAAS,cAAc;AAAA,EACtB;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB,GAAG;AACJ,GAEG;AACF,SACC,qBAAC,gBACA;AAAA,wBAAC,iBAAc;AAAA,IACf;AAAA,MAAC,gBAAgB;AAAA,MAAhB;AAAA,QACA,aAAU;AAAA,QACV,WAAW;AAAA,UACV;AAAA,UACA;AAAA,QACD;AAAA,QACC,GAAG;AAAA,QAEH;AAAA;AAAA,UACA,mBACA,qBAAC,gBAAgB,OAAhB,EAAsB,aAAU,gBAAe,QAAQ,oBAAC,UAAO,SAAQ,SAAQ,WAAU,0BAAyB,MAAK,WAAU,GACjI;AAAA,gCAAC,SAAM;AAAA,YACP,oBAAC,UAAK,WAAU,WAAU,mBAAK;AAAA,aAChC;AAAA;AAAA;AAAA,IAEF;AAAA,KACD;AAEF;AAEA,SAAS,aAAa,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC3E,SAAO,oBAAC,SAAI,aAAU,iBAAgB,WAAW,GAAG,uBAAuB,SAAS,GAAI,GAAG,OAAO;AACnG;AAEA,SAAS,aAAa;AAAA,EACrB;AAAA,EACA,kBAAkB;AAAA,EAClB;AAAA,EACA,GAAG;AACJ,GAEG;AACF,SACC;AAAA,IAAC;AAAA;AAAA,MACA,aAAU;AAAA,MACV,WAAW,GAAG,4GAA4G,SAAS;AAAA,MAClI,GAAG;AAAA,MAEH;AAAA;AAAA,QACA,mBAAmB,oBAAC,gBAAgB,OAAhB,EAAsB,QAAQ,oBAAC,UAAO,SAAQ,WAAU,GAAI,mBAAK;AAAA;AAAA;AAAA,EACvF;AAEF;AAEA,SAAS,YAAY,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC1E,SAAO,oBAAC,gBAAgB,OAAhB,EAAsB,aAAU,gBAAe,WAAW,GAAG,mDAAmD,SAAS,GAAI,GAAG,OAAO;AAChJ;AAEA,SAAS,kBAAkB,EAAE,WAAW,GAAG,MAAM,GAAsC;AACtF,SACC;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACA,aAAU;AAAA,MACV,WAAW,GAAG,sGAAsG,SAAS;AAAA,MAC5H,GAAG;AAAA;AAAA,EACL;AAEF;","names":[]}
@@ -0,0 +1,46 @@
1
+ import {
2
+ cn
3
+ } from "./chunk-Y2TKUANL.js";
4
+
5
+ // src/components/button.tsx
6
+ import { Button as ButtonPrimitive } from "@base-ui/react/button";
7
+ import { cva } from "class-variance-authority";
8
+ import { jsx } from "react/jsx-runtime";
9
+ var buttonVariants = cva(
10
+ "group/button inline-flex shrink-0 select-none items-center justify-center whitespace-nowrap rounded-lg border border-transparent bg-clip-padding font-medium text-sm outline-none transition-all focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0",
11
+ {
12
+ variants: {
13
+ variant: {
14
+ default: "bg-primary text-primary-foreground hover:bg-primary/80",
15
+ outline: "border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",
16
+ secondary: "bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",
17
+ ghost: "hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",
18
+ destructive: "bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 dark:hover:bg-destructive/30",
19
+ link: "text-primary underline-offset-4 hover:underline"
20
+ },
21
+ size: {
22
+ default: "h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
23
+ xs: "h-6 gap-1 in-data-[slot=button-group]:rounded-lg rounded-[min(var(--radius-md),10px)] px-2 text-xs has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",
24
+ sm: "h-7 gap-1 in-data-[slot=button-group]:rounded-lg rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",
25
+ lg: "h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
26
+ icon: "size-8",
27
+ "icon-xs": "size-6 in-data-[slot=button-group]:rounded-lg rounded-[min(var(--radius-md),10px)] [&_svg:not([class*='size-'])]:size-3",
28
+ "icon-sm": "size-7 in-data-[slot=button-group]:rounded-lg rounded-[min(var(--radius-md),12px)]",
29
+ "icon-lg": "size-9"
30
+ }
31
+ },
32
+ defaultVariants: {
33
+ variant: "default",
34
+ size: "default"
35
+ }
36
+ }
37
+ );
38
+ function Button({ className, variant = "default", size = "default", ...props }) {
39
+ return /* @__PURE__ */ jsx(ButtonPrimitive, { "data-slot": "button", className: cn(buttonVariants({ variant, size, className })), ...props });
40
+ }
41
+
42
+ export {
43
+ buttonVariants,
44
+ Button
45
+ };
46
+ //# sourceMappingURL=chunk-5CXIFF6J.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/button.tsx"],"sourcesContent":["import { Button as ButtonPrimitive } from '@base-ui/react/button';\nimport { cn } from '@betfin/ui/lib/utils';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nconst buttonVariants = cva(\n\t\"group/button inline-flex shrink-0 select-none items-center justify-center whitespace-nowrap rounded-lg border border-transparent bg-clip-padding font-medium text-sm outline-none transition-all focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tdefault: 'bg-primary text-primary-foreground hover:bg-primary/80',\n\t\t\t\toutline:\n\t\t\t\t\t'border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50',\n\t\t\t\tsecondary:\n\t\t\t\t\t'bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground',\n\t\t\t\tghost: 'hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50',\n\t\t\t\tdestructive:\n\t\t\t\t\t'bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 dark:hover:bg-destructive/30',\n\t\t\t\tlink: 'text-primary underline-offset-4 hover:underline',\n\t\t\t},\n\t\t\tsize: {\n\t\t\t\tdefault: 'h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2',\n\t\t\t\txs: \"h-6 gap-1 in-data-[slot=button-group]:rounded-lg rounded-[min(var(--radius-md),10px)] px-2 text-xs has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3\",\n\t\t\t\tsm: \"h-7 gap-1 in-data-[slot=button-group]:rounded-lg rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5\",\n\t\t\t\tlg: 'h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2',\n\t\t\t\ticon: 'size-8',\n\t\t\t\t'icon-xs': \"size-6 in-data-[slot=button-group]:rounded-lg rounded-[min(var(--radius-md),10px)] [&_svg:not([class*='size-'])]:size-3\",\n\t\t\t\t'icon-sm': 'size-7 in-data-[slot=button-group]:rounded-lg rounded-[min(var(--radius-md),12px)]',\n\t\t\t\t'icon-lg': 'size-9',\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tvariant: 'default',\n\t\t\tsize: 'default',\n\t\t},\n\t},\n);\n\nfunction Button({ className, variant = 'default', size = 'default', ...props }: ButtonPrimitive.Props & VariantProps<typeof buttonVariants>) {\n\treturn <ButtonPrimitive data-slot=\"button\" className={cn(buttonVariants({ variant, size, className }))} {...props} />;\n}\n\nexport { Button, buttonVariants };\n"],"mappings":";;;;;AAAA,SAAS,UAAU,uBAAuB;AAE1C,SAAS,WAA8B;AAoC/B;AAlCR,IAAM,iBAAiB;AAAA,EACtB;AAAA,EACA;AAAA,IACC,UAAU;AAAA,MACT,SAAS;AAAA,QACR,SAAS;AAAA,QACT,SACC;AAAA,QACD,WACC;AAAA,QACD,OAAO;AAAA,QACP,aACC;AAAA,QACD,MAAM;AAAA,MACP;AAAA,MACA,MAAM;AAAA,QACL,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,WAAW;AAAA,QACX,WAAW;AAAA,QACX,WAAW;AAAA,MACZ;AAAA,IACD;AAAA,IACA,iBAAiB;AAAA,MAChB,SAAS;AAAA,MACT,MAAM;AAAA,IACP;AAAA,EACD;AACD;AAEA,SAAS,OAAO,EAAE,WAAW,UAAU,WAAW,OAAO,WAAW,GAAG,MAAM,GAAgE;AAC5I,SAAO,oBAAC,mBAAgB,aAAU,UAAS,WAAW,GAAG,eAAe,EAAE,SAAS,MAAM,UAAU,CAAC,CAAC,GAAI,GAAG,OAAO;AACpH;","names":[]}
@@ -0,0 +1,26 @@
1
+ import {
2
+ cn
3
+ } from "./chunk-Y2TKUANL.js";
4
+
5
+ // src/components/input.tsx
6
+ import { Input as InputPrimitive } from "@base-ui/react/input";
7
+ import { jsx } from "react/jsx-runtime";
8
+ function Input({ className, type, ...props }) {
9
+ return /* @__PURE__ */ jsx(
10
+ InputPrimitive,
11
+ {
12
+ type,
13
+ "data-slot": "input",
14
+ className: cn(
15
+ "h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base outline-none transition-colors file:inline-flex file:h-6 file:border-0 file:bg-transparent file:font-medium file:text-foreground file:text-sm placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 dark:disabled:bg-input/80",
16
+ className
17
+ ),
18
+ ...props
19
+ }
20
+ );
21
+ }
22
+
23
+ export {
24
+ Input
25
+ };
26
+ //# sourceMappingURL=chunk-EP6DYU4N.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/input.tsx"],"sourcesContent":["import { Input as InputPrimitive } from '@base-ui/react/input';\nimport { cn } from '@betfin/ui/lib/utils';\nimport type * as React from 'react';\n\nfunction Input({ className, type, ...props }: React.ComponentProps<'input'>) {\n\treturn (\n\t\t<InputPrimitive\n\t\t\ttype={type}\n\t\t\tdata-slot=\"input\"\n\t\t\tclassName={cn(\n\t\t\t\t'h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base outline-none transition-colors file:inline-flex file:h-6 file:border-0 file:bg-transparent file:font-medium file:text-foreground file:text-sm placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 dark:disabled:bg-input/80',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport { Input };\n"],"mappings":";;;;;AAAA,SAAS,SAAS,sBAAsB;AAMtC;AAFF,SAAS,MAAM,EAAE,WAAW,MAAM,GAAG,MAAM,GAAkC;AAC5E,SACC;AAAA,IAAC;AAAA;AAAA,MACA;AAAA,MACA,aAAU;AAAA,MACV,WAAW;AAAA,QACV;AAAA,QACA;AAAA,MACD;AAAA,MACC,GAAG;AAAA;AAAA,EACL;AAEF;","names":[]}
@@ -0,0 +1,21 @@
1
+ // src/hooks/use-mobile.ts
2
+ import * as React from "react";
3
+ var MOBILE_BREAKPOINT = 768;
4
+ function getIsMobile() {
5
+ return typeof window !== "undefined" && window.innerWidth < MOBILE_BREAKPOINT;
6
+ }
7
+ function useIsMobile() {
8
+ const [isMobile, setIsMobile] = React.useState(getIsMobile);
9
+ React.useEffect(() => {
10
+ const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);
11
+ const onChange = () => setIsMobile(getIsMobile());
12
+ mql.addEventListener("change", onChange);
13
+ return () => mql.removeEventListener("change", onChange);
14
+ }, []);
15
+ return isMobile;
16
+ }
17
+
18
+ export {
19
+ useIsMobile
20
+ };
21
+ //# sourceMappingURL=chunk-FHYW2QBY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/use-mobile.ts"],"sourcesContent":["import * as React from 'react';\n\nconst MOBILE_BREAKPOINT = 768;\n\nfunction getIsMobile() {\n\treturn typeof window !== 'undefined' && window.innerWidth < MOBILE_BREAKPOINT;\n}\n\nexport function useIsMobile() {\n\tconst [isMobile, setIsMobile] = React.useState(getIsMobile);\n\n\tReact.useEffect(() => {\n\t\tconst mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);\n\t\tconst onChange = () => setIsMobile(getIsMobile());\n\t\tmql.addEventListener('change', onChange);\n\t\treturn () => mql.removeEventListener('change', onChange);\n\t}, []);\n\n\treturn isMobile;\n}\n"],"mappings":";AAAA,YAAY,WAAW;AAEvB,IAAM,oBAAoB;AAE1B,SAAS,cAAc;AACtB,SAAO,OAAO,WAAW,eAAe,OAAO,aAAa;AAC7D;AAEO,SAAS,cAAc;AAC7B,QAAM,CAAC,UAAU,WAAW,IAAU,eAAS,WAAW;AAE1D,EAAM,gBAAU,MAAM;AACrB,UAAM,MAAM,OAAO,WAAW,eAAe,oBAAoB,CAAC,KAAK;AACvE,UAAM,WAAW,MAAM,YAAY,YAAY,CAAC;AAChD,QAAI,iBAAiB,UAAU,QAAQ;AACvC,WAAO,MAAM,IAAI,oBAAoB,UAAU,QAAQ;AAAA,EACxD,GAAG,CAAC,CAAC;AAEL,SAAO;AACR;","names":[]}
@@ -0,0 +1,49 @@
1
+ import {
2
+ cn
3
+ } from "./chunk-Y2TKUANL.js";
4
+
5
+ // src/components/tooltip.tsx
6
+ import { Tooltip as TooltipPrimitive } from "@base-ui/react/tooltip";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ function TooltipProvider({ delay = 0, ...props }) {
9
+ return /* @__PURE__ */ jsx(TooltipPrimitive.Provider, { "data-slot": "tooltip-provider", delay, ...props });
10
+ }
11
+ function Tooltip({ ...props }) {
12
+ return /* @__PURE__ */ jsx(TooltipPrimitive.Root, { "data-slot": "tooltip", ...props });
13
+ }
14
+ function TooltipTrigger({ ...props }) {
15
+ return /* @__PURE__ */ jsx(TooltipPrimitive.Trigger, { "data-slot": "tooltip-trigger", ...props });
16
+ }
17
+ function TooltipContent({
18
+ className,
19
+ side = "top",
20
+ sideOffset = 4,
21
+ align = "center",
22
+ alignOffset = 0,
23
+ children,
24
+ ...props
25
+ }) {
26
+ return /* @__PURE__ */ jsx(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsx(TooltipPrimitive.Positioner, { align, alignOffset, side, sideOffset, className: "isolate z-50", children: /* @__PURE__ */ jsxs(
27
+ TooltipPrimitive.Popup,
28
+ {
29
+ "data-slot": "tooltip-content",
30
+ className: cn(
31
+ "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-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:fade-in-0 data-open:zoom-in-95 data-closed:fade-out-0 data-closed:zoom-out-95 z-50 inline-flex w-fit max-w-xs origin-(--transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-background text-xs has-data-[slot=kbd]:pr-1.5 data-[state=delayed-open]:animate-in data-closed:animate-out data-open:animate-in **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm",
32
+ className
33
+ ),
34
+ ...props,
35
+ children: [
36
+ children,
37
+ /* @__PURE__ */ jsx(TooltipPrimitive.Arrow, { className: "z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground data-[side=bottom]:top-1 data-[side=inline-end]:top-1/2! data-[side=inline-start]:top-1/2! data-[side=left]:top-1/2! data-[side=right]:top-1/2! data-[side=inline-start]:-right-1 data-[side=left]:-right-1 data-[side=top]:-bottom-2.5 data-[side=inline-end]:-left-1 data-[side=right]:-left-1 data-[side=inline-end]:-translate-y-1/2 data-[side=inline-start]:-translate-y-1/2 data-[side=left]:-translate-y-1/2 data-[side=right]:-translate-y-1/2" })
38
+ ]
39
+ }
40
+ ) }) });
41
+ }
42
+
43
+ export {
44
+ TooltipProvider,
45
+ Tooltip,
46
+ TooltipTrigger,
47
+ TooltipContent
48
+ };
49
+ //# sourceMappingURL=chunk-HRFMTZ55.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/tooltip.tsx"],"sourcesContent":["import { Tooltip as TooltipPrimitive } from '@base-ui/react/tooltip';\n\nimport { cn } from '@betfin/ui/lib/utils';\n\nfunction TooltipProvider({ delay = 0, ...props }: TooltipPrimitive.Provider.Props) {\n\treturn <TooltipPrimitive.Provider data-slot=\"tooltip-provider\" delay={delay} {...props} />;\n}\n\nfunction Tooltip({ ...props }: TooltipPrimitive.Root.Props) {\n\treturn <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />;\n}\n\nfunction TooltipTrigger({ ...props }: TooltipPrimitive.Trigger.Props) {\n\treturn <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />;\n}\n\nfunction TooltipContent({\n\tclassName,\n\tside = 'top',\n\tsideOffset = 4,\n\talign = 'center',\n\talignOffset = 0,\n\tchildren,\n\t...props\n}: TooltipPrimitive.Popup.Props & Pick<TooltipPrimitive.Positioner.Props, 'align' | 'alignOffset' | 'side' | 'sideOffset'>) {\n\treturn (\n\t\t<TooltipPrimitive.Portal>\n\t\t\t<TooltipPrimitive.Positioner align={align} alignOffset={alignOffset} side={side} sideOffset={sideOffset} className=\"isolate z-50\">\n\t\t\t\t<TooltipPrimitive.Popup\n\t\t\t\t\tdata-slot=\"tooltip-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-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:fade-in-0 data-open:zoom-in-95 data-closed:fade-out-0 data-closed:zoom-out-95 z-50 inline-flex w-fit max-w-xs origin-(--transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-background text-xs has-data-[slot=kbd]:pr-1.5 data-[state=delayed-open]:animate-in data-closed:animate-out data-open:animate-in **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm',\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\t\t{children}\n\t\t\t\t\t<TooltipPrimitive.Arrow className=\"z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground data-[side=bottom]:top-1 data-[side=inline-end]:top-1/2! data-[side=inline-start]:top-1/2! data-[side=left]:top-1/2! data-[side=right]:top-1/2! data-[side=inline-start]:-right-1 data-[side=left]:-right-1 data-[side=top]:-bottom-2.5 data-[side=inline-end]:-left-1 data-[side=right]:-left-1 data-[side=inline-end]:-translate-y-1/2 data-[side=inline-start]:-translate-y-1/2 data-[side=left]:-translate-y-1/2 data-[side=right]:-translate-y-1/2\" />\n\t\t\t\t</TooltipPrimitive.Popup>\n\t\t\t</TooltipPrimitive.Positioner>\n\t\t</TooltipPrimitive.Portal>\n\t);\n}\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };\n"],"mappings":";;;;;AAAA,SAAS,WAAW,wBAAwB;AAKpC,cAuBJ,YAvBI;AADR,SAAS,gBAAgB,EAAE,QAAQ,GAAG,GAAG,MAAM,GAAoC;AAClF,SAAO,oBAAC,iBAAiB,UAAjB,EAA0B,aAAU,oBAAmB,OAAe,GAAG,OAAO;AACzF;AAEA,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,OAAO;AAAA,EACP,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,cAAc;AAAA,EACd;AAAA,EACA,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,MAEH;AAAA;AAAA,QACD,oBAAC,iBAAiB,OAAjB,EAAuB,WAAU,4hBAA2hB;AAAA;AAAA;AAAA,EAC9jB,GACD,GACD;AAEF;","names":[]}
@@ -0,0 +1,107 @@
1
+ import {
2
+ formatBet,
3
+ toBetNumber
4
+ } from "./chunk-K7JWN6NH.js";
5
+ import {
6
+ Tooltip,
7
+ TooltipContent,
8
+ TooltipProvider,
9
+ TooltipTrigger
10
+ } from "./chunk-HRFMTZ55.js";
11
+ import {
12
+ cn
13
+ } from "./chunk-Y2TKUANL.js";
14
+
15
+ // src/components/bet-value.tsx
16
+ import { jsx, jsxs } from "react/jsx-runtime";
17
+ function BetCoin({ size = "1em", className, style }) {
18
+ const custom = typeof window !== "undefined" ? window.__BET_ICON__ : void 0;
19
+ if (custom) {
20
+ return /* @__PURE__ */ jsx(
21
+ "img",
22
+ {
23
+ src: custom,
24
+ alt: "",
25
+ "aria-hidden": true,
26
+ className: cn("inline-block shrink-0 object-contain align-text-bottom", className),
27
+ style: { width: size, height: size, ...style }
28
+ }
29
+ );
30
+ }
31
+ return (
32
+ // biome-ignore lint/a11y/noSvgWithoutTitle: decorative token glyph (aria-hidden)
33
+ /* @__PURE__ */ jsxs(
34
+ "svg",
35
+ {
36
+ xmlns: "http://www.w3.org/2000/svg",
37
+ width: size,
38
+ height: size,
39
+ viewBox: "0 0 12 12",
40
+ fill: "none",
41
+ "aria-hidden": true,
42
+ className,
43
+ style: { flexShrink: 0, display: "inline-block", verticalAlign: "text-bottom", ...style },
44
+ children: [
45
+ /* @__PURE__ */ jsx("circle", { cx: "6", cy: "6", r: "6", fill: "#FFC800" }),
46
+ /* @__PURE__ */ jsx(
47
+ "path",
48
+ {
49
+ d: "M6.13 8.57C5.73 8.57 5.38 8.47 5.07 8.26C4.77 8.05 4.55 7.77 4.42 7.42C4.28 7.07 4.25 6.7 4.33 6.3L5.12 2.24C5.14 2.1 5.21 1.98 5.32 1.87C5.43 1.77 5.57 1.71 5.74 1.71C5.87 1.71 5.99 1.75 6.09 1.83C6.2 1.9 6.27 2 6.32 2.12C6.36 2.24 6.37 2.36 6.34 2.5L6.07 3.91H6.39L6 4.09C6.07 3.98 6.16 3.88 6.27 3.79C6.39 3.7 6.51 3.64 6.65 3.59C6.79 3.55 6.94 3.53 7.09 3.53C7.41 3.53 7.69 3.64 7.94 3.85C8.19 4.07 8.37 4.36 8.48 4.72C8.59 5.08 8.6 5.45 8.51 5.84L8.3 6.86C8.23 7.2 8.09 7.5 7.88 7.76C7.67 8.02 7.42 8.22 7.12 8.36C6.82 8.5 6.49 8.57 6.13 8.57L6.13 8.57ZM6.21 7.43C6.36 7.43 6.49 7.4 6.61 7.33C6.73 7.26 6.83 7.17 6.92 7.05C7.01 6.93 7.07 6.79 7.1 6.63L7.29 5.64C7.32 5.46 7.32 5.29 7.27 5.15C7.22 5 7.14 4.88 7.03 4.79C6.92 4.7 6.79 4.66 6.64 4.66C6.5 4.66 6.37 4.69 6.25 4.76C6.13 4.83 6.03 4.93 5.94 5.05C5.85 5.17 5.8 5.31 5.77 5.46L5.58 6.45C5.54 6.63 5.55 6.79 5.59 6.95C5.63 7.1 5.71 7.21 5.82 7.3C5.93 7.39 6.06 7.43 6.22 7.43L6.21 7.43Z",
50
+ fill: "#0F121D"
51
+ }
52
+ ),
53
+ /* @__PURE__ */ jsx(
54
+ "path",
55
+ {
56
+ d: "M3.49 8.58C3.84 8.96 4.23 9.23 4.66 9.42C5.09 9.6 5.54 9.69 6 9.69C6.46 9.69 6.91 9.6 7.34 9.42C7.76 9.23 8.16 8.96 8.51 8.58C8.52 8.57 8.54 8.57 8.56 8.58C8.57 8.59 8.57 8.61 8.57 8.62C8.4 9.12 8.02 9.56 7.56 9.85C7.09 10.14 6.55 10.29 6 10.29C5.45 10.29 4.91 10.14 4.44 9.85C3.98 9.56 3.6 9.13 3.43 8.62C3.42 8.6 3.43 8.58 3.45 8.57C3.47 8.57 3.48 8.57 3.49 8.58H3.49Z",
57
+ fill: "#0F121D"
58
+ }
59
+ )
60
+ ]
61
+ }
62
+ )
63
+ );
64
+ }
65
+ function BetValue({
66
+ value,
67
+ gold,
68
+ size = "1em",
69
+ icon = true,
70
+ iconPosition = "right",
71
+ prefix,
72
+ tooltipSide = "top",
73
+ className,
74
+ style,
75
+ ...opts
76
+ }) {
77
+ const text = formatBet(value, opts);
78
+ const coin = icon ? /* @__PURE__ */ jsx(BetCoin, { size }) : null;
79
+ const exact = `${toBetNumber(value, opts.decimals).toLocaleString("en")} BET`;
80
+ return /* @__PURE__ */ jsx(TooltipProvider, { delay: 200, children: /* @__PURE__ */ jsxs(Tooltip, { children: [
81
+ /* @__PURE__ */ jsxs(
82
+ TooltipTrigger,
83
+ {
84
+ render: /* @__PURE__ */ jsx(
85
+ "span",
86
+ {
87
+ className: cn("inline-flex cursor-default items-center gap-1", className),
88
+ style: { color: gold ? "var(--primary)" : void 0, fontVariantNumeric: "tabular-nums", ...style }
89
+ }
90
+ ),
91
+ children: [
92
+ iconPosition === "left" && coin,
93
+ prefix,
94
+ text,
95
+ iconPosition === "right" && coin
96
+ ]
97
+ }
98
+ ),
99
+ /* @__PURE__ */ jsx(TooltipContent, { side: tooltipSide, children: exact })
100
+ ] }) });
101
+ }
102
+
103
+ export {
104
+ BetCoin,
105
+ BetValue
106
+ };
107
+ //# sourceMappingURL=chunk-ILNHKDYA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/bet-value.tsx"],"sourcesContent":["import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@betfin/ui/components/tooltip';\nimport { type FormatBetOptions, formatBet, toBetNumber } from '@betfin/ui/lib/format';\nimport { cn } from '@betfin/ui/lib/utils';\nimport type { CSSProperties } from 'react';\n\ndeclare global {\n\tinterface Window {\n\t\t/** Whitelabel override for the coin glyph, set by the host from the manifest\n\t\t * (`branding.betIcon`). A window global so it crosses the module-federation\n\t\t * boundary — remotes render BetCoin against the host's window. */\n\t\t__BET_ICON__?: string;\n\t}\n}\n\n/**\n * The BET coin token — the single source of the coin glyph. Renders the default\n * gold coin (from the original Betfin design system), or a whitelabel image when\n * `window.__BET_ICON__` is set.\n */\nexport function BetCoin({ size = '1em', className, style }: { size?: number | string; className?: string; style?: CSSProperties }) {\n\tconst custom = typeof window !== 'undefined' ? window.__BET_ICON__ : undefined;\n\tif (custom) {\n\t\treturn (\n\t\t\t<img\n\t\t\t\tsrc={custom}\n\t\t\t\talt=\"\"\n\t\t\t\taria-hidden\n\t\t\t\tclassName={cn('inline-block shrink-0 object-contain align-text-bottom', className)}\n\t\t\t\tstyle={{ width: size, height: size, ...style }}\n\t\t\t/>\n\t\t);\n\t}\n\treturn (\n\t\t// biome-ignore lint/a11y/noSvgWithoutTitle: decorative token glyph (aria-hidden)\n\t\t<svg\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\twidth={size}\n\t\t\theight={size}\n\t\t\tviewBox=\"0 0 12 12\"\n\t\t\tfill=\"none\"\n\t\t\taria-hidden\n\t\t\tclassName={className}\n\t\t\tstyle={{ flexShrink: 0, display: 'inline-block', verticalAlign: 'text-bottom', ...style }}\n\t\t>\n\t\t\t<circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FFC800\" />\n\t\t\t<path\n\t\t\t\td=\"M6.13 8.57C5.73 8.57 5.38 8.47 5.07 8.26C4.77 8.05 4.55 7.77 4.42 7.42C4.28 7.07 4.25 6.7 4.33 6.3L5.12 2.24C5.14 2.1 5.21 1.98 5.32 1.87C5.43 1.77 5.57 1.71 5.74 1.71C5.87 1.71 5.99 1.75 6.09 1.83C6.2 1.9 6.27 2 6.32 2.12C6.36 2.24 6.37 2.36 6.34 2.5L6.07 3.91H6.39L6 4.09C6.07 3.98 6.16 3.88 6.27 3.79C6.39 3.7 6.51 3.64 6.65 3.59C6.79 3.55 6.94 3.53 7.09 3.53C7.41 3.53 7.69 3.64 7.94 3.85C8.19 4.07 8.37 4.36 8.48 4.72C8.59 5.08 8.6 5.45 8.51 5.84L8.3 6.86C8.23 7.2 8.09 7.5 7.88 7.76C7.67 8.02 7.42 8.22 7.12 8.36C6.82 8.5 6.49 8.57 6.13 8.57L6.13 8.57ZM6.21 7.43C6.36 7.43 6.49 7.4 6.61 7.33C6.73 7.26 6.83 7.17 6.92 7.05C7.01 6.93 7.07 6.79 7.1 6.63L7.29 5.64C7.32 5.46 7.32 5.29 7.27 5.15C7.22 5 7.14 4.88 7.03 4.79C6.92 4.7 6.79 4.66 6.64 4.66C6.5 4.66 6.37 4.69 6.25 4.76C6.13 4.83 6.03 4.93 5.94 5.05C5.85 5.17 5.8 5.31 5.77 5.46L5.58 6.45C5.54 6.63 5.55 6.79 5.59 6.95C5.63 7.1 5.71 7.21 5.82 7.3C5.93 7.39 6.06 7.43 6.22 7.43L6.21 7.43Z\"\n\t\t\t\tfill=\"#0F121D\"\n\t\t\t/>\n\t\t\t<path\n\t\t\t\td=\"M3.49 8.58C3.84 8.96 4.23 9.23 4.66 9.42C5.09 9.6 5.54 9.69 6 9.69C6.46 9.69 6.91 9.6 7.34 9.42C7.76 9.23 8.16 8.96 8.51 8.58C8.52 8.57 8.54 8.57 8.56 8.58C8.57 8.59 8.57 8.61 8.57 8.62C8.4 9.12 8.02 9.56 7.56 9.85C7.09 10.14 6.55 10.29 6 10.29C5.45 10.29 4.91 10.14 4.44 9.85C3.98 9.56 3.6 9.13 3.43 8.62C3.42 8.6 3.43 8.58 3.45 8.57C3.47 8.57 3.48 8.57 3.49 8.58H3.49Z\"\n\t\t\t\tfill=\"#0F121D\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n\nexport interface BetValueProps extends FormatBetOptions {\n\t/** The amount — a number, or a raw on-chain bigint (18-decimals). */\n\tvalue: number | bigint;\n\t/** Colour the number + coin in the brand primary (gold). */\n\tgold?: boolean;\n\t/** Coin size — a px number, or any CSS length. Defaults to `1em` so it scales with the surrounding text. */\n\tsize?: number | string;\n\t/** Show the BET coin (default true). */\n\ticon?: boolean;\n\t/** Coin side (default 'right'). */\n\ticonPosition?: 'left' | 'right';\n\t/** Optional text before the number. */\n\tprefix?: string;\n\t/** Tooltip side (default 'top'). */\n\ttooltipSide?: 'top' | 'bottom' | 'left' | 'right';\n\tclassName?: string;\n\tstyle?: CSSProperties;\n}\n\n/**\n * Canonical way to display a BET amount. Formats the value compactly and shows\n * the gold coin (sized to the surrounding text). Hovering reveals the exact,\n * un-abbreviated amount in a styled tooltip. Use this everywhere a BET amount\n * is rendered.\n *\n * <BetValue value={12_500} /> → 12.5K ● (coin matches text size)\n * <BetValue value={rewardsBigint} gold /> → 1.24K ● (gold)\n * <BetValue value={n} size={30} /> → fixed 30px coin\n */\nexport function BetValue({\n\tvalue,\n\tgold,\n\tsize = '1em',\n\ticon = true,\n\ticonPosition = 'right',\n\tprefix,\n\ttooltipSide = 'top',\n\tclassName,\n\tstyle,\n\t...opts\n}: BetValueProps) {\n\tconst text = formatBet(value, opts);\n\tconst coin = icon ? <BetCoin size={size} /> : null;\n\tconst exact = `${toBetNumber(value, opts.decimals).toLocaleString('en')} BET`;\n\treturn (\n\t\t<TooltipProvider delay={200}>\n\t\t\t<Tooltip>\n\t\t\t\t<TooltipTrigger\n\t\t\t\t\trender={\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName={cn('inline-flex cursor-default items-center gap-1', className)}\n\t\t\t\t\t\t\tstyle={{ color: gold ? 'var(--primary)' : undefined, fontVariantNumeric: 'tabular-nums', ...style }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{iconPosition === 'left' && coin}\n\t\t\t\t\t{prefix}\n\t\t\t\t\t{text}\n\t\t\t\t\t{iconPosition === 'right' && coin}\n\t\t\t\t</TooltipTrigger>\n\t\t\t\t<TooltipContent side={tooltipSide}>{exact}</TooltipContent>\n\t\t\t</Tooltip>\n\t\t</TooltipProvider>\n\t);\n}\n"],"mappings":";;;;;;;;;;;;;;;AAuBG,cAWD,YAXC;AAJI,SAAS,QAAQ,EAAE,OAAO,OAAO,WAAW,MAAM,GAA0E;AAClI,QAAM,SAAS,OAAO,WAAW,cAAc,OAAO,eAAe;AACrE,MAAI,QAAQ;AACX,WACC;AAAA,MAAC;AAAA;AAAA,QACA,KAAK;AAAA,QACL,KAAI;AAAA,QACJ,eAAW;AAAA,QACX,WAAW,GAAG,0DAA0D,SAAS;AAAA,QACjF,OAAO,EAAE,OAAO,MAAM,QAAQ,MAAM,GAAG,MAAM;AAAA;AAAA,IAC9C;AAAA,EAEF;AACA;AAAA;AAAA,IAEC;AAAA,MAAC;AAAA;AAAA,QACA,OAAM;AAAA,QACN,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,eAAW;AAAA,QACX;AAAA,QACA,OAAO,EAAE,YAAY,GAAG,SAAS,gBAAgB,eAAe,eAAe,GAAG,MAAM;AAAA,QAExF;AAAA,8BAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,KAAI,MAAK,WAAU;AAAA,UAC3C;AAAA,YAAC;AAAA;AAAA,cACA,GAAE;AAAA,cACF,MAAK;AAAA;AAAA,UACN;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACA,GAAE;AAAA,cACF,MAAK;AAAA;AAAA,UACN;AAAA;AAAA;AAAA,IACD;AAAA;AAEF;AA+BO,SAAS,SAAS;AAAA,EACxB;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,OAAO;AAAA,EACP,eAAe;AAAA,EACf;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,GAAG;AACJ,GAAkB;AACjB,QAAM,OAAO,UAAU,OAAO,IAAI;AAClC,QAAM,OAAO,OAAO,oBAAC,WAAQ,MAAY,IAAK;AAC9C,QAAM,QAAQ,GAAG,YAAY,OAAO,KAAK,QAAQ,EAAE,eAAe,IAAI,CAAC;AACvE,SACC,oBAAC,mBAAgB,OAAO,KACvB,+BAAC,WACA;AAAA;AAAA,MAAC;AAAA;AAAA,QACA,QACC;AAAA,UAAC;AAAA;AAAA,YACA,WAAW,GAAG,iDAAiD,SAAS;AAAA,YACxE,OAAO,EAAE,OAAO,OAAO,mBAAmB,QAAW,oBAAoB,gBAAgB,GAAG,MAAM;AAAA;AAAA,QACnG;AAAA,QAGA;AAAA,2BAAiB,UAAU;AAAA,UAC3B;AAAA,UACA;AAAA,UACA,iBAAiB,WAAW;AAAA;AAAA;AAAA,IAC9B;AAAA,IACA,oBAAC,kBAAe,MAAM,aAAc,iBAAM;AAAA,KAC3C,GACD;AAEF;","names":[]}
@@ -0,0 +1,37 @@
1
+ import {
2
+ cn
3
+ } from "./chunk-Y2TKUANL.js";
4
+
5
+ // src/components/toggle.tsx
6
+ import { Toggle as TogglePrimitive } from "@base-ui/react/toggle";
7
+ import { cva } from "class-variance-authority";
8
+ import { jsx } from "react/jsx-runtime";
9
+ var toggleVariants = cva(
10
+ "group/toggle inline-flex items-center justify-center gap-1 whitespace-nowrap rounded-lg font-medium text-sm outline-none transition-all hover:bg-muted hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-pressed:bg-muted aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[state=on]:bg-muted dark:aria-invalid:ring-destructive/40 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0",
11
+ {
12
+ variants: {
13
+ variant: {
14
+ default: "bg-transparent",
15
+ outline: "border border-input bg-transparent hover:bg-muted"
16
+ },
17
+ size: {
18
+ default: "h-8 min-w-8 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
19
+ sm: "h-7 min-w-7 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",
20
+ lg: "h-9 min-w-9 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2"
21
+ }
22
+ },
23
+ defaultVariants: {
24
+ variant: "default",
25
+ size: "default"
26
+ }
27
+ }
28
+ );
29
+ function Toggle({ className, variant = "default", size = "default", ...props }) {
30
+ return /* @__PURE__ */ jsx(TogglePrimitive, { "data-slot": "toggle", className: cn(toggleVariants({ variant, size, className })), ...props });
31
+ }
32
+
33
+ export {
34
+ toggleVariants,
35
+ Toggle
36
+ };
37
+ //# sourceMappingURL=chunk-JTVU6ANA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/toggle.tsx"],"sourcesContent":["'use client';\n\nimport { Toggle as TogglePrimitive } from '@base-ui/react/toggle';\nimport { cn } from '@betfin/ui/lib/utils';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nconst toggleVariants = cva(\n\t\"group/toggle inline-flex items-center justify-center gap-1 whitespace-nowrap rounded-lg font-medium text-sm outline-none transition-all hover:bg-muted hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-pressed:bg-muted aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[state=on]:bg-muted dark:aria-invalid:ring-destructive/40 [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n\t{\n\t\tvariants: {\n\t\t\tvariant: {\n\t\t\t\tdefault: 'bg-transparent',\n\t\t\t\toutline: 'border border-input bg-transparent hover:bg-muted',\n\t\t\t},\n\t\t\tsize: {\n\t\t\t\tdefault: 'h-8 min-w-8 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2',\n\t\t\t\tsm: \"h-7 min-w-7 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5\",\n\t\t\t\tlg: 'h-9 min-w-9 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2',\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tvariant: 'default',\n\t\t\tsize: 'default',\n\t\t},\n\t},\n);\n\nfunction Toggle({ className, variant = 'default', size = 'default', ...props }: TogglePrimitive.Props & VariantProps<typeof toggleVariants>) {\n\treturn <TogglePrimitive data-slot=\"toggle\" className={cn(toggleVariants({ variant, size, className }))} {...props} />;\n}\n\nexport { Toggle, toggleVariants };\n"],"mappings":";;;;;AAEA,SAAS,UAAU,uBAAuB;AAE1C,SAAS,WAA8B;AAwB/B;AAtBR,IAAM,iBAAiB;AAAA,EACtB;AAAA,EACA;AAAA,IACC,UAAU;AAAA,MACT,SAAS;AAAA,QACR,SAAS;AAAA,QACT,SAAS;AAAA,MACV;AAAA,MACA,MAAM;AAAA,QACL,SAAS;AAAA,QACT,IAAI;AAAA,QACJ,IAAI;AAAA,MACL;AAAA,IACD;AAAA,IACA,iBAAiB;AAAA,MAChB,SAAS;AAAA,MACT,MAAM;AAAA,IACP;AAAA,EACD;AACD;AAEA,SAAS,OAAO,EAAE,WAAW,UAAU,WAAW,OAAO,WAAW,GAAG,MAAM,GAAgE;AAC5I,SAAO,oBAAC,mBAAgB,aAAU,UAAS,WAAW,GAAG,eAAe,EAAE,SAAS,MAAM,UAAU,CAAC,CAAC,GAAI,GAAG,OAAO;AACpH;","names":[]}
@@ -0,0 +1,21 @@
1
+ // src/lib/format.ts
2
+ function toBetNumber(value, decimals = 18) {
3
+ return typeof value === "bigint" ? Number(value) / 10 ** decimals : value;
4
+ }
5
+ function formatBet(value, opts = {}) {
6
+ const { precision = 2, compact = true, decimals = 18 } = opts;
7
+ const n = toBetNumber(value, decimals);
8
+ if (!Number.isFinite(n)) return "0";
9
+ if (!compact) return n.toLocaleString("en", { maximumFractionDigits: precision });
10
+ const abs = Math.abs(n);
11
+ if (abs >= 1e9) return `${(n / 1e9).toFixed(precision)}B`;
12
+ if (abs >= 1e6) return `${(n / 1e6).toFixed(precision)}M`;
13
+ if (abs >= 1e3) return `${(n / 1e3).toFixed(precision)}K`;
14
+ return n.toLocaleString("en", { maximumFractionDigits: precision });
15
+ }
16
+
17
+ export {
18
+ toBetNumber,
19
+ formatBet
20
+ };
21
+ //# sourceMappingURL=chunk-K7JWN6NH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/format.ts"],"sourcesContent":["export interface FormatBetOptions {\n\t/** Decimal places in the compact form (default 2). */\n\tprecision?: number;\n\t/** Use compact K/M/B notation (default true). Set false for a grouped full number. */\n\tcompact?: boolean;\n\t/** Token decimals used to convert a bigint to a number (default 18). */\n\tdecimals?: number;\n}\n\n/** Convert a raw on-chain bigint (18-decimals by default) or a number to a plain number. */\nexport function toBetNumber(value: number | bigint, decimals = 18): number {\n\treturn typeof value === 'bigint' ? Number(value) / 10 ** decimals : value;\n}\n\n/**\n * Format a BET amount for display. Accepts a number or a raw on-chain bigint.\n * Compact by default: 12_500 → \"12.5K\", 4_200_000 → \"4.2M\", 2.2e10 → \"22.16B\".\n * Use this everywhere instead of re-writing K/M/B formatters.\n */\nexport function formatBet(value: number | bigint, opts: FormatBetOptions = {}): string {\n\tconst { precision = 2, compact = true, decimals = 18 } = opts;\n\tconst n = toBetNumber(value, decimals);\n\tif (!Number.isFinite(n)) return '0';\n\tif (!compact) return n.toLocaleString('en', { maximumFractionDigits: precision });\n\tconst abs = Math.abs(n);\n\tif (abs >= 1e9) return `${(n / 1e9).toFixed(precision)}B`;\n\tif (abs >= 1e6) return `${(n / 1e6).toFixed(precision)}M`;\n\tif (abs >= 1e3) return `${(n / 1e3).toFixed(precision)}K`;\n\treturn n.toLocaleString('en', { maximumFractionDigits: precision });\n}\n"],"mappings":";AAUO,SAAS,YAAY,OAAwB,WAAW,IAAY;AAC1E,SAAO,OAAO,UAAU,WAAW,OAAO,KAAK,IAAI,MAAM,WAAW;AACrE;AAOO,SAAS,UAAU,OAAwB,OAAyB,CAAC,GAAW;AACtF,QAAM,EAAE,YAAY,GAAG,UAAU,MAAM,WAAW,GAAG,IAAI;AACzD,QAAM,IAAI,YAAY,OAAO,QAAQ;AACrC,MAAI,CAAC,OAAO,SAAS,CAAC,EAAG,QAAO;AAChC,MAAI,CAAC,QAAS,QAAO,EAAE,eAAe,MAAM,EAAE,uBAAuB,UAAU,CAAC;AAChF,QAAM,MAAM,KAAK,IAAI,CAAC;AACtB,MAAI,OAAO,IAAK,QAAO,IAAI,IAAI,KAAK,QAAQ,SAAS,CAAC;AACtD,MAAI,OAAO,IAAK,QAAO,IAAI,IAAI,KAAK,QAAQ,SAAS,CAAC;AACtD,MAAI,OAAO,IAAK,QAAO,IAAI,IAAI,KAAK,QAAQ,SAAS,CAAC;AACtD,SAAO,EAAE,eAAe,MAAM,EAAE,uBAAuB,UAAU,CAAC;AACnE;","names":[]}