kaleido-ui 0.1.2 → 0.1.3

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.
@@ -101,28 +101,30 @@ var buttonVariants = (0, import_class_variance_authority.cva)(
101
101
  {
102
102
  variants: {
103
103
  variant: {
104
- default: "bg-primary text-primary-foreground hover:bg-primary/90",
105
- destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
106
- outline: "border border-border bg-transparent hover:bg-accent hover:text-accent-foreground",
104
+ default: "bg-primary text-primary-foreground hover:brightness-115",
105
+ destructive: "bg-destructive text-destructive-foreground hover:brightness-115",
106
+ outline: "border border-primary/50 bg-transparent text-[#31ff8b] hover:bg-primary/5 hover:border-primary hover:brightness-115",
107
107
  secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
108
- ghost: "hover:bg-accent hover:text-foreground",
108
+ ghost: "text-[#31ff8b] hover:brightness-115 hover:bg-transparent hover:[&_span]:brightness-115",
109
109
  link: "text-primary underline-offset-4 hover:underline",
110
110
  glow: "bg-primary text-primary-foreground shadow-md",
111
- surface: "bg-card text-card-foreground border border-border hover:bg-accent",
112
- cta: "w-full bg-primary hover:bg-primary/90 text-primary-foreground font-bold rounded-2xl shadow-md disabled:opacity-50 disabled:cursor-not-allowed disabled:shadow-none",
111
+ surface: "bg-primary/15 text-[#31ff8b] hover:bg-primary/25",
112
+ cta: "w-full bg-primary text-primary-foreground font-bold rounded-2xl shadow-md hover:brightness-115 disabled:opacity-50 disabled:cursor-not-allowed disabled:shadow-none",
113
113
  "cta-gradient": "w-full bg-gradient-to-r from-primary to-primary/80 text-primary-foreground font-extrabold rounded-2xl shadow-lg hover:opacity-90 hover:-translate-y-0.5 active:translate-y-0 active:opacity-100 disabled:opacity-40 disabled:shadow-none disabled:cursor-not-allowed disabled:bg-accent disabled:text-muted-foreground",
114
- "danger-subtle": "w-full bg-red-500/10 border border-red-500/20 text-red-400 font-bold rounded-xl hover:bg-red-500/20"
114
+ "danger-subtle": "bg-red-500/10 border border-red-500/20 text-destructive font-bold rounded-xl hover:brightness-115",
115
+ hyperlink: "group text-muted-foreground underline underline-offset-2 hover:text-white hover:decoration-[#31ff8b] hover:[&_.icon]:text-[#31ff8b] bg-transparent font-normal"
115
116
  },
116
117
  size: {
117
118
  default: "h-11 px-5 py-2",
119
+ xs: "h-7 rounded-lg px-2 text-xs",
118
120
  sm: "h-9 rounded-lg px-3 text-xs",
119
121
  lg: "h-14 rounded-xl px-8 text-base font-bold",
120
122
  xl: "h-16 rounded-2xl px-10 text-lg font-bold",
121
123
  cta: "h-14 py-4 px-6 text-lg",
122
124
  "cta-lg": "h-[60px] py-5 px-6 text-lg",
123
- icon: "h-10 w-10 rounded-full",
124
- "icon-lg": "h-12 w-12 rounded-full",
125
- "icon-xl": "h-14 w-14 rounded-full"
125
+ icon: "h-6 w-6 rounded-full",
126
+ "icon-lg": "h-9 w-9 rounded-full",
127
+ "icon-xl": "h-12 w-12 rounded-full"
126
128
  }
127
129
  },
128
130
  defaultVariants: {
@@ -155,7 +157,7 @@ var Card = React2.forwardRef(
155
157
  {
156
158
  ref,
157
159
  className: cn(
158
- "rounded-2xl border border-border/50 bg-card text-card-foreground shadow-sm transition-colors",
160
+ "rounded-2xl bg-card text-card-foreground shadow-sm transition-colors",
159
161
  className
160
162
  ),
161
163
  ...props
@@ -201,7 +203,7 @@ var Input = React3.forwardRef(
201
203
  {
202
204
  type,
203
205
  className: cn(
204
- "flex h-12 w-full rounded-xl border border-border bg-card px-4 py-3 text-base ring-offset-background transition-all file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:border-ring disabled:cursor-not-allowed disabled:opacity-50",
206
+ "flex h-12 w-full rounded-xl bg-white/8 px-4 py-3 text-base transition-all border border-transparent file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:border-primary/50 disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-white/6",
205
207
  className
206
208
  ),
207
209
  ref,
@@ -335,13 +337,13 @@ var DialogContent = React4.forwardRef(({ className, children, ...props }, ref) =
335
337
  {
336
338
  ref,
337
339
  className: cn(
338
- "fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] rounded-lg",
340
+ "fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 bg-card p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] rounded-2xl",
339
341
  className
340
342
  ),
341
343
  ...props,
342
344
  children: [
343
345
  children,
344
- /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(DialogPrimitive.Close, { className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground", children: [
346
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(DialogPrimitive.Close, { className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground", children: [
345
347
  /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Icon, { name: "close", size: "sm" }),
346
348
  /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { className: "sr-only", children: "Close" })
347
349
  ] })
@@ -383,7 +385,7 @@ var TabsList = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__
383
385
  {
384
386
  ref,
385
387
  className: cn(
386
- "inline-flex h-12 items-center justify-center gap-2 rounded-xl bg-card p-1.5 text-muted-foreground border border-border/50",
388
+ "inline-flex h-12 items-center justify-center gap-2 rounded-xl bg-card p-1.5 text-muted-foreground",
387
389
  className
388
390
  ),
389
391
  ...props
@@ -396,8 +398,8 @@ var TabsTrigger = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE
396
398
  ref,
397
399
  className: cn(
398
400
  "inline-flex items-center justify-center whitespace-nowrap rounded-lg px-4 py-2 text-sm font-semibold ring-offset-background transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
399
- "hover:text-foreground hover:bg-accent",
400
- "data-[state=active]:bg-primary data-[state=active]:text-primary-foreground",
401
+ "text-white hover:text-primary hover:bg-transparent",
402
+ "data-[state=active]:bg-primary/15 data-[state=active]:text-[#31ff8b] data-[state=active]:hover:bg-primary/25",
401
403
  className
402
404
  ),
403
405
  ...props
@@ -454,12 +456,12 @@ var ToastViewport = React7.forwardRef(({ className, ...props }, ref) => /* @__PU
454
456
  ));
455
457
  ToastViewport.displayName = ToastPrimitives.Viewport.displayName;
456
458
  var toastVariants = (0, import_class_variance_authority3.cva)(
457
- "group pointer-events-auto relative flex w-full max-w-md items-center justify-between space-x-3 overflow-hidden rounded-xl border backdrop-blur-xl p-4 pr-10 shadow-[0_0_30px_rgba(0,0,0,0.3)] transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-bottom-full data-[state=open]:slide-in-from-bottom-full",
459
+ "group pointer-events-auto relative flex w-full max-w-md items-center justify-between space-x-3 overflow-hidden rounded-xl backdrop-blur-xl p-4 shadow-[0_0_30px_rgba(0,0,0,0.3)] transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-bottom-full data-[state=open]:slide-in-from-bottom-full",
458
460
  {
459
461
  variants: {
460
462
  variant: {
461
- default: "border-border bg-card/95 text-foreground",
462
- destructive: "border-red-500/20 bg-red-500/10 text-red-400"
463
+ default: "bg-card text-foreground brightness-125",
464
+ destructive: "bg-red-500/20 text-red-400"
463
465
  }
464
466
  },
465
467
  defaultVariants: {
@@ -483,7 +485,7 @@ var ToastAction = React7.forwardRef(({ className, ...props }, ref) => /* @__PURE
483
485
  {
484
486
  ref,
485
487
  className: cn(
486
- "inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors hover:bg-secondary focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-muted/40 group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground group-[.destructive]:focus:ring-destructive",
488
+ "inline-flex h-8 shrink-0 items-center justify-center rounded-lg border border-primary/50 bg-transparent px-3 text-xs font-semibold text-[#31ff8b] transition-all hover:bg-primary/5 hover:border-primary hover:brightness-115 focus:outline-none disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-red-500/30 group-[.destructive]:text-red-400 group-[.destructive]:hover:border-red-500 group-[.destructive]:hover:bg-red-500/10",
487
489
  className
488
490
  ),
489
491
  ...props
@@ -495,7 +497,7 @@ var ToastClose = React7.forwardRef(({ className, ...props }, ref) => /* @__PURE_
495
497
  {
496
498
  ref,
497
499
  className: cn(
498
- "absolute right-2 top-2 rounded-full p-1 text-muted-foreground opacity-100 transition-all hover:text-foreground hover:bg-accent focus:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring group-[.destructive]:text-red-300 group-[.destructive]:hover:text-red-50 group-[.destructive]:hover:bg-red-500/20 group-[.destructive]:focus:ring-red-400",
500
+ "p-1.5 text-muted-foreground opacity-100 transition-all hover:text-white focus:opacity-100 focus:outline-none group-[.destructive]:text-red-300 group-[.destructive]:hover:text-red-50",
499
501
  className
500
502
  ),
501
503
  "toast-close": "",
@@ -642,7 +644,7 @@ function ToastWithProgress({ id, title, description, action, duration = 4e3, var
642
644
  if (variant === "destructive") {
643
645
  return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(Icon, { name: "error", size: "md", className: "text-red-400" });
644
646
  }
645
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(Icon, { name: "check_circle", size: "md", className: "text-foreground" });
647
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(Icon, { name: "check_circle", size: "md", className: "text-primary" });
646
648
  };
647
649
  return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(Toast, { ...props, variant, children: [
648
650
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "flex items-start gap-3 flex-1", children: [
@@ -652,8 +654,10 @@ function ToastWithProgress({ id, title, description, action, duration = 4e3, var
652
654
  description && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(ToastDescription, { children: description })
653
655
  ] })
654
656
  ] }),
655
- action,
656
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(ToastClose, {}),
657
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)("div", { className: "flex items-center gap-2 shrink-0", children: [
658
+ action,
659
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(ToastClose, {})
660
+ ] }),
657
661
  /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { className: "absolute bottom-0 left-0 right-0 h-1 bg-white/10 overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
658
662
  "div",
659
663
  {
@@ -729,7 +733,7 @@ function StatusBadge({ status, className }) {
729
733
  "div",
730
734
  {
731
735
  className: cn(
732
- "inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full border font-medium text-xs",
736
+ "inline-flex items-center gap-1.5 pl-1 pr-2.5 py-1 rounded-full border font-medium text-xs",
733
737
  bg,
734
738
  border,
735
739
  color,
@@ -754,65 +758,65 @@ var networkConfig = {
754
758
  iconSuffix: "bitcoin/bitcoin-logo.svg"
755
759
  },
756
760
  LN: {
757
- color: "text-purple-400",
758
- bg: "bg-purple-500/10 backdrop-blur-md",
759
- border: "border-purple-500/20",
761
+ color: "text-network-lightning",
762
+ bg: "bg-network-lightning/10 backdrop-blur-md",
763
+ border: "border-network-lightning/20",
760
764
  label: "LN",
761
765
  iconSuffix: "lightning/lightning.svg"
762
766
  },
763
767
  RGB20: {
764
- color: "text-network-rgb",
765
- bg: "bg-network-rgb/10 backdrop-blur-md",
766
- border: "border-network-rgb/20",
768
+ color: "text-destructive",
769
+ bg: "bg-red-500/20 backdrop-blur-md",
770
+ border: "border-red-500/20",
767
771
  label: "RGB",
768
772
  iconSuffix: "rgb/rgb-logo.svg"
769
773
  },
770
774
  RGB21: {
771
- color: "text-network-rgb",
772
- bg: "bg-network-rgb/10 backdrop-blur-md",
773
- border: "border-network-rgb/20",
775
+ color: "text-destructive",
776
+ bg: "bg-red-500/20 backdrop-blur-md",
777
+ border: "border-red-500/20",
774
778
  label: "RGB21",
775
779
  iconSuffix: "rgb/rgb-logo.svg"
776
780
  },
777
781
  "RGB-L1": {
778
- color: "text-network-rgb",
779
- bg: "bg-network-rgb/10 backdrop-blur-md",
780
- border: "border-network-rgb/20",
782
+ color: "text-destructive",
783
+ bg: "bg-red-500/20 backdrop-blur-md",
784
+ border: "border-red-500/20",
781
785
  label: "RGB L1",
782
786
  iconSuffix: "rgb/rgb-logo.svg"
783
787
  },
784
788
  "RGB-LN": {
785
- color: "text-network-rgb",
786
- bg: "bg-network-rgb/10 backdrop-blur-md",
787
- border: "border-network-rgb/20",
789
+ color: "text-destructive",
790
+ bg: "bg-red-500/20 backdrop-blur-md",
791
+ border: "border-red-500/20",
788
792
  label: "RGB LN",
789
793
  iconSuffix: "rgb/rgb-logo.svg"
790
794
  },
791
795
  Spark: {
792
- color: "text-network-spark",
793
- bg: "bg-network-spark/10 backdrop-blur-md",
794
- border: "border-network-spark/20",
796
+ color: "text-black dark:text-white",
797
+ bg: "bg-black/10 dark:bg-white/10 backdrop-blur-md",
798
+ border: "border-black/20 dark:border-white/20",
795
799
  label: "Spark",
796
800
  iconSuffix: "spark/Asterisk/Spark Asterisk White.svg"
797
801
  },
798
802
  Arkade: {
799
- color: "text-network-arkade",
800
- bg: "bg-network-arkade/10 backdrop-blur-md",
801
- border: "border-network-arkade/20",
803
+ color: "text-violet-400",
804
+ bg: "bg-violet-500/15 backdrop-blur-md",
805
+ border: "border-violet-500/20",
802
806
  label: "Arkade",
803
807
  iconSuffix: "arkade/arkade-icon.svg"
804
808
  }
805
809
  };
806
- function NetworkBadge({ network, iconBasePath = "/icons", className }) {
807
- const { color, bg, border, label, iconSuffix } = networkConfig[network];
810
+ function NetworkBadge({ network, iconBasePath = "/icons", iconOnly = false, className }) {
811
+ const { color, bg, label, iconSuffix } = networkConfig[network];
808
812
  const icon = `${iconBasePath}/${iconSuffix}`;
809
813
  return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
810
814
  "span",
811
815
  {
812
816
  className: cn(
813
- "text-xxs px-2 py-0.5 rounded-full font-bold border shadow-inner flex items-center justify-center gap-1 w-max transition-all",
817
+ "text-xs rounded-full font-bold flex items-center justify-center w-max",
818
+ iconOnly ? "p-1.5" : "px-2.5 py-1 gap-1",
814
819
  bg,
815
- border,
816
820
  color,
817
821
  className
818
822
  ),
@@ -822,10 +826,10 @@ function NetworkBadge({ network, iconBasePath = "/icons", className }) {
822
826
  {
823
827
  src: icon,
824
828
  alt: network,
825
- className: cn("size-3 object-contain", network === "Spark" && "opacity-80")
829
+ className: cn(iconOnly ? "size-4" : "size-3.5", "object-contain", network === "Spark" && "brightness-0 dark:brightness-0 dark:invert")
826
830
  }
827
831
  ),
828
- label
832
+ !iconOnly && label
829
833
  ]
830
834
  }
831
835
  );
@@ -950,6 +954,7 @@ function AssetIcon({ ticker, logoUri, cdnBaseUrl, size = 40, className }) {
950
954
  }
951
955
 
952
956
  // src/web/components/asset-card.tsx
957
+ var import_react4 = require("react");
953
958
  var import_jsx_runtime13 = require("react/jsx-runtime");
954
959
  function AssetCard({
955
960
  ticker,
@@ -958,19 +963,26 @@ function AssetCard({
958
963
  networks = [],
959
964
  logoUri,
960
965
  balanceVisible = true,
966
+ accentColor,
961
967
  onClick,
962
968
  className
963
969
  }) {
964
970
  const shown = balanceVisible ? displayBalance : "\u2022\u2022\u2022\u2022\u2022\u2022";
971
+ const [hovered, setHovered] = (0, import_react4.useState)(false);
972
+ const gradientStyle = accentColor ? { background: `linear-gradient(135deg, var(--card) 30%, ${accentColor}${hovered ? "77" : "55"} 75%, ${accentColor}${hovered ? "dd" : "b3"} 100%)`, transition: "background 0.3s ease" } : void 0;
965
973
  return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
966
974
  "div",
967
975
  {
968
976
  className: cn(
969
- "p-4 rounded-card bg-background/40 backdrop-blur-xl border border-border transition-all shadow-sm relative overflow-hidden group",
970
- onClick && "cursor-pointer hover:border-primary/40 active:scale-[0.98]",
977
+ "p-4 rounded-card backdrop-blur-xl transition-all shadow-sm relative overflow-hidden group",
978
+ !accentColor && "bg-card",
979
+ onClick && "cursor-pointer hover:brightness-110 active:scale-[0.98]",
971
980
  className
972
981
  ),
982
+ style: gradientStyle,
973
983
  onClick,
984
+ onMouseEnter: () => setHovered(true),
985
+ onMouseLeave: () => setHovered(false),
974
986
  children: [
975
987
  /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "absolute inset-0 bg-gradient-to-br from-white/5 to-transparent opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none" }),
976
988
  /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "flex items-center justify-between relative z-10", children: [
@@ -990,7 +1002,7 @@ function AssetCard({
990
1002
  {
991
1003
  className: cn(
992
1004
  "font-bold text-base leading-tight tracking-wide text-foreground",
993
- onClick && "group-hover:text-primary transition-colors"
1005
+ onClick && "transition-colors"
994
1006
  ),
995
1007
  children: name
996
1008
  }
@@ -999,7 +1011,7 @@ function AssetCard({
999
1011
  ] })
1000
1012
  ] }),
1001
1013
  /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "text-right", children: [
1002
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "font-bold text-base tracking-tight text-foreground group-hover:opacity-90 transition-colors", children: shown }),
1014
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "font-bold text-lg tracking-tight text-foreground group-hover:opacity-90 transition-colors", children: shown }),
1003
1015
  /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "text-tiny text-muted-foreground font-medium tracking-wide uppercase mt-0.5", children: ticker })
1004
1016
  ] })
1005
1017
  ] })
@@ -1021,12 +1033,34 @@ function TransactionCard({
1021
1033
  }) {
1022
1034
  const isInbound = direction === "inbound";
1023
1035
  const formatDate = (ts) => new Date(ts * 1e3).toLocaleDateString();
1036
+ const statusStyle = {
1037
+ success: { base: "bg-primary/5", hover: "hover:bg-primary/10" },
1038
+ completed: { base: "bg-primary/5", hover: "hover:bg-primary/10" },
1039
+ pending: { base: "bg-yellow-500/10", hover: "hover:bg-yellow-500/15" },
1040
+ failed: { base: "bg-red-500/10", hover: "hover:bg-red-500/15" },
1041
+ error: { base: "bg-red-500/10", hover: "hover:bg-red-500/15" }
1042
+ }[status] ?? { base: "bg-background/40", hover: "hover:bg-white/5" };
1043
+ const iconStyle = {
1044
+ success: "bg-primary/20 text-primary",
1045
+ completed: "bg-primary/20 text-primary",
1046
+ pending: "bg-yellow-500/20 text-yellow-500",
1047
+ failed: "bg-red-500/20 text-red-500",
1048
+ error: "bg-red-500/20 text-red-500"
1049
+ }[status] ?? "bg-accent text-muted-foreground";
1050
+ const textColor = {
1051
+ success: "text-primary",
1052
+ completed: "text-primary",
1053
+ pending: "text-yellow-500",
1054
+ failed: "text-red-500",
1055
+ error: "text-red-500"
1056
+ }[status] ?? "text-foreground";
1024
1057
  return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
1025
1058
  "div",
1026
1059
  {
1027
1060
  className: cn(
1028
- "p-4 rounded-card bg-background/40 backdrop-blur-xl border border-border flex items-center justify-between transition-all shadow-sm relative overflow-hidden group",
1029
- onClick && "cursor-pointer hover:border-primary/40 active:scale-[0.98]",
1061
+ "p-4 rounded-card backdrop-blur-xl flex items-center justify-between transition-all shadow-sm relative overflow-hidden group",
1062
+ statusStyle.base,
1063
+ onClick && `cursor-pointer active:scale-[0.98] ${statusStyle.hover}`,
1030
1064
  className
1031
1065
  ),
1032
1066
  onClick,
@@ -1038,24 +1072,15 @@ function TransactionCard({
1038
1072
  {
1039
1073
  className: cn(
1040
1074
  "size-11 rounded-full flex items-center justify-center shadow-inner group-hover:scale-105 transition-transform",
1041
- isInbound ? "bg-primary/20 text-primary border border-primary/20" : "bg-accent text-muted-foreground border border-border"
1075
+ iconStyle
1042
1076
  ),
1043
1077
  children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "material-symbols-outlined text-[20px]", children: isInbound ? "arrow_downward" : "arrow_outward" })
1044
1078
  }
1045
1079
  ),
1046
1080
  /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "flex flex-col", children: [
1047
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1048
- "span",
1049
- {
1050
- className: cn(
1051
- "font-bold text-sm text-foreground tracking-wide",
1052
- onClick && "group-hover:text-primary transition-colors"
1053
- ),
1054
- children: isInbound ? "Received" : "Sent"
1055
- }
1056
- ),
1081
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "font-bold text-sm tracking-wide text-foreground", children: isInbound ? "Received" : "Sent" }),
1057
1082
  /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: "flex items-center gap-2 mt-1", children: [
1058
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(StatusBadge, { status, className: "text-xxs px-1.5 py-0.5" }),
1083
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(StatusBadge, { status }),
1059
1084
  /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "text-tiny text-muted-foreground font-medium tracking-wide", children: formatDate(timestamp) })
1060
1085
  ] })
1061
1086
  ] })
@@ -1065,8 +1090,8 @@ function TransactionCard({
1065
1090
  "p",
1066
1091
  {
1067
1092
  className: cn(
1068
- "font-bold text-base tracking-tight group-hover:opacity-90 transition-opacity",
1069
- isInbound ? "text-primary" : "text-foreground"
1093
+ "font-bold text-lg tracking-tight group-hover:opacity-90 transition-opacity",
1094
+ textColor
1070
1095
  ),
1071
1096
  children: [
1072
1097
  isInbound ? "+" : "-",
@@ -1109,15 +1134,15 @@ function SettingItem({
1109
1134
  onClick,
1110
1135
  showChevron = true,
1111
1136
  className,
1112
- iconColor = "text-primary"
1137
+ iconColor = "text-[#31ff8b]"
1113
1138
  }) {
1114
1139
  const isClickable = !!onClick;
1115
1140
  return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1116
1141
  "div",
1117
1142
  {
1118
1143
  className: cn(
1119
- "p-5 rounded-2xl bg-card border border-border transition-all duration-200",
1120
- isClickable && "cursor-pointer hover:bg-accent active:scale-[0.98]",
1144
+ "p-5 rounded-2xl bg-card transition-all duration-200 group",
1145
+ isClickable && "cursor-pointer active:scale-[0.98]",
1121
1146
  className
1122
1147
  ),
1123
1148
  onClick,
@@ -1127,7 +1152,7 @@ function SettingItem({
1127
1152
  "div",
1128
1153
  {
1129
1154
  className: cn(
1130
- "flex-shrink-0 size-10 rounded-xl flex items-center justify-center bg-muted border border-border",
1155
+ "flex-shrink-0 size-10 rounded-xl flex items-center justify-center bg-primary/15 group-hover:bg-primary/25 group-hover:scale-105 transition-all",
1131
1156
  iconColor
1132
1157
  ),
1133
1158
  children: iconSrc ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("img", { src: iconSrc, alt: iconAlt ?? title, className: "size-5 object-contain" }) : /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "material-symbols-outlined text-[20px]", children: icon })
@@ -1140,7 +1165,7 @@ function SettingItem({
1140
1165
  ] }),
1141
1166
  /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "flex items-center gap-2 flex-shrink-0", children: [
1142
1167
  value && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "text-xs text-muted-foreground font-mono", children: value }),
1143
- showChevron && isClickable && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "material-symbols-outlined text-[16px] text-muted-foreground", children: "chevron_right" })
1168
+ showChevron && isClickable && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "material-symbols-outlined text-[16px] text-muted-foreground group-hover:scale-110 group-hover:text-white transition-all", children: "chevron_right" })
1144
1169
  ] })
1145
1170
  ] })
1146
1171
  }
@@ -1162,39 +1187,23 @@ function SectionLabel({ children, className }) {
1162
1187
  // src/web/components/alert-banner.tsx
1163
1188
  var import_jsx_runtime18 = require("react/jsx-runtime");
1164
1189
  var variantStyles = {
1165
- error: {
1166
- container: "bg-red-500/10 border-red-500/20",
1167
- icon: "text-red-400",
1168
- iconName: "error"
1169
- },
1170
- warning: {
1171
- container: "bg-amber-500/10 border-amber-500/20",
1172
- icon: "text-amber-400",
1173
- iconName: "warning"
1174
- },
1175
- info: {
1176
- container: "bg-blue-500/10 border-blue-500/20",
1177
- icon: "text-blue-400",
1178
- iconName: "info"
1179
- },
1180
- success: {
1181
- container: "bg-primary/10 border-primary/20",
1182
- icon: "text-primary",
1183
- iconName: "check_circle"
1184
- }
1190
+ error: { container: "bg-red-900/40", icon: "text-red-500", iconName: "error" },
1191
+ warning: { container: "bg-yellow-900/40", icon: "text-yellow-400", iconName: "warning" },
1192
+ info: { container: "bg-blue-900/40", icon: "text-blue-300", iconName: "info" },
1193
+ success: { container: "bg-primary/8", icon: "text-primary/90", iconName: "check_circle" }
1185
1194
  };
1186
1195
  function AlertBanner({ variant = "info", icon, children, className }) {
1187
1196
  const styles = variantStyles[variant];
1188
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: cn("rounded-xl border p-3 flex items-start gap-2", styles.container, className), children: [
1189
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Icon, { name: icon ?? styles.iconName, size: "md", className: cn("shrink-0 mt-0.5", styles.icon) }),
1190
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "text-sm", children })
1197
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: cn("rounded-xl p-3 flex items-center gap-2", styles.container, className), children: [
1198
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Icon, { name: icon ?? styles.iconName, size: "md", className: cn("shrink-0", styles.icon) }),
1199
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: cn("text-sm", styles.icon), children })
1191
1200
  ] });
1192
1201
  }
1193
1202
 
1194
1203
  // src/web/components/error-boundary.tsx
1195
- var import_react4 = require("react");
1204
+ var import_react5 = require("react");
1196
1205
  var import_jsx_runtime19 = require("react/jsx-runtime");
1197
- var ErrorBoundary = class extends import_react4.Component {
1206
+ var ErrorBoundary = class extends import_react5.Component {
1198
1207
  constructor(props) {
1199
1208
  super(props);
1200
1209
  this.state = { hasError: false, error: null };
@@ -12,8 +12,8 @@ import * as ToastPrimitives from '@radix-ui/react-toast';
12
12
  declare function cn(...inputs: ClassValue[]): string;
13
13
 
14
14
  declare const buttonVariants: (props?: ({
15
- variant?: "default" | "destructive" | "outline" | "secondary" | "ghost" | "link" | "glow" | "surface" | "cta" | "cta-gradient" | "danger-subtle" | null | undefined;
16
- size?: "default" | "cta" | "sm" | "lg" | "xl" | "cta-lg" | "icon" | "icon-lg" | "icon-xl" | null | undefined;
15
+ variant?: "default" | "destructive" | "outline" | "secondary" | "ghost" | "link" | "glow" | "surface" | "cta" | "cta-gradient" | "danger-subtle" | "hyperlink" | null | undefined;
16
+ size?: "default" | "cta" | "xs" | "sm" | "lg" | "xl" | "cta-lg" | "icon" | "icon-lg" | "icon-xl" | null | undefined;
17
17
  } & class_variance_authority_types.ClassProp) | undefined) => string;
18
18
  interface ButtonProps extends React$1.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
19
19
  asChild?: boolean;
@@ -148,9 +148,11 @@ interface NetworkBadgeProps {
148
148
  network: NetworkType;
149
149
  /** Override the icon path (consumer provides asset path) */
150
150
  iconBasePath?: string;
151
+ /** Show only the icon, no label */
152
+ iconOnly?: boolean;
151
153
  className?: string;
152
154
  }
153
- declare function NetworkBadge({ network, iconBasePath, className }: NetworkBadgeProps): react_jsx_runtime.JSX.Element;
155
+ declare function NetworkBadge({ network, iconBasePath, iconOnly, className }: NetworkBadgeProps): react_jsx_runtime.JSX.Element;
154
156
 
155
157
  interface AssetIconProps {
156
158
  ticker: string;
@@ -179,10 +181,12 @@ interface AssetCardProps {
179
181
  logoUri?: string;
180
182
  /** Whether balance should be masked */
181
183
  balanceVisible?: boolean;
184
+ /** Accent color hex for the card gradient (e.g. "#F7931A") */
185
+ accentColor?: string;
182
186
  onClick?: () => void;
183
187
  className?: string;
184
188
  }
185
- declare function AssetCard({ ticker, name, displayBalance, networks, logoUri, balanceVisible, onClick, className, }: AssetCardProps): react_jsx_runtime.JSX.Element;
189
+ declare function AssetCard({ ticker, name, displayBalance, networks, logoUri, balanceVisible, accentColor, onClick, className, }: AssetCardProps): react_jsx_runtime.JSX.Element;
186
190
 
187
191
  interface TransactionCardProps {
188
192
  /** Direction of the transaction */
@@ -231,23 +235,23 @@ declare function SectionLabel({ children, className }: SectionLabelProps): react
231
235
 
232
236
  declare const variantStyles: {
233
237
  readonly error: {
234
- readonly container: "bg-red-500/10 border-red-500/20";
235
- readonly icon: "text-red-400";
238
+ readonly container: "bg-red-900/40";
239
+ readonly icon: "text-red-500";
236
240
  readonly iconName: "error";
237
241
  };
238
242
  readonly warning: {
239
- readonly container: "bg-amber-500/10 border-amber-500/20";
240
- readonly icon: "text-amber-400";
243
+ readonly container: "bg-yellow-900/40";
244
+ readonly icon: "text-yellow-400";
241
245
  readonly iconName: "warning";
242
246
  };
243
247
  readonly info: {
244
- readonly container: "bg-blue-500/10 border-blue-500/20";
245
- readonly icon: "text-blue-400";
248
+ readonly container: "bg-blue-900/40";
249
+ readonly icon: "text-blue-300";
246
250
  readonly iconName: "info";
247
251
  };
248
252
  readonly success: {
249
- readonly container: "bg-primary/10 border-primary/20";
250
- readonly icon: "text-primary";
253
+ readonly container: "bg-primary/8";
254
+ readonly icon: "text-primary/90";
251
255
  readonly iconName: "check_circle";
252
256
  };
253
257
  };
@@ -12,8 +12,8 @@ import * as ToastPrimitives from '@radix-ui/react-toast';
12
12
  declare function cn(...inputs: ClassValue[]): string;
13
13
 
14
14
  declare const buttonVariants: (props?: ({
15
- variant?: "default" | "destructive" | "outline" | "secondary" | "ghost" | "link" | "glow" | "surface" | "cta" | "cta-gradient" | "danger-subtle" | null | undefined;
16
- size?: "default" | "cta" | "sm" | "lg" | "xl" | "cta-lg" | "icon" | "icon-lg" | "icon-xl" | null | undefined;
15
+ variant?: "default" | "destructive" | "outline" | "secondary" | "ghost" | "link" | "glow" | "surface" | "cta" | "cta-gradient" | "danger-subtle" | "hyperlink" | null | undefined;
16
+ size?: "default" | "cta" | "xs" | "sm" | "lg" | "xl" | "cta-lg" | "icon" | "icon-lg" | "icon-xl" | null | undefined;
17
17
  } & class_variance_authority_types.ClassProp) | undefined) => string;
18
18
  interface ButtonProps extends React$1.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
19
19
  asChild?: boolean;
@@ -148,9 +148,11 @@ interface NetworkBadgeProps {
148
148
  network: NetworkType;
149
149
  /** Override the icon path (consumer provides asset path) */
150
150
  iconBasePath?: string;
151
+ /** Show only the icon, no label */
152
+ iconOnly?: boolean;
151
153
  className?: string;
152
154
  }
153
- declare function NetworkBadge({ network, iconBasePath, className }: NetworkBadgeProps): react_jsx_runtime.JSX.Element;
155
+ declare function NetworkBadge({ network, iconBasePath, iconOnly, className }: NetworkBadgeProps): react_jsx_runtime.JSX.Element;
154
156
 
155
157
  interface AssetIconProps {
156
158
  ticker: string;
@@ -179,10 +181,12 @@ interface AssetCardProps {
179
181
  logoUri?: string;
180
182
  /** Whether balance should be masked */
181
183
  balanceVisible?: boolean;
184
+ /** Accent color hex for the card gradient (e.g. "#F7931A") */
185
+ accentColor?: string;
182
186
  onClick?: () => void;
183
187
  className?: string;
184
188
  }
185
- declare function AssetCard({ ticker, name, displayBalance, networks, logoUri, balanceVisible, onClick, className, }: AssetCardProps): react_jsx_runtime.JSX.Element;
189
+ declare function AssetCard({ ticker, name, displayBalance, networks, logoUri, balanceVisible, accentColor, onClick, className, }: AssetCardProps): react_jsx_runtime.JSX.Element;
186
190
 
187
191
  interface TransactionCardProps {
188
192
  /** Direction of the transaction */
@@ -231,23 +235,23 @@ declare function SectionLabel({ children, className }: SectionLabelProps): react
231
235
 
232
236
  declare const variantStyles: {
233
237
  readonly error: {
234
- readonly container: "bg-red-500/10 border-red-500/20";
235
- readonly icon: "text-red-400";
238
+ readonly container: "bg-red-900/40";
239
+ readonly icon: "text-red-500";
236
240
  readonly iconName: "error";
237
241
  };
238
242
  readonly warning: {
239
- readonly container: "bg-amber-500/10 border-amber-500/20";
240
- readonly icon: "text-amber-400";
243
+ readonly container: "bg-yellow-900/40";
244
+ readonly icon: "text-yellow-400";
241
245
  readonly iconName: "warning";
242
246
  };
243
247
  readonly info: {
244
- readonly container: "bg-blue-500/10 border-blue-500/20";
245
- readonly icon: "text-blue-400";
248
+ readonly container: "bg-blue-900/40";
249
+ readonly icon: "text-blue-300";
246
250
  readonly iconName: "info";
247
251
  };
248
252
  readonly success: {
249
- readonly container: "bg-primary/10 border-primary/20";
250
- readonly icon: "text-primary";
253
+ readonly container: "bg-primary/8";
254
+ readonly icon: "text-primary/90";
251
255
  readonly iconName: "check_circle";
252
256
  };
253
257
  };