@hfunlabs/hypurr-connect 0.1.16 → 0.1.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hfunlabs/hypurr-connect",
3
- "version": "0.1.16",
3
+ "version": "0.1.19",
4
4
  "type": "module",
5
5
  "packageManager": "pnpm@10.10.0",
6
6
  "main": "./dist/index.js",
@@ -86,9 +86,9 @@ const tabClass = (selected: boolean) =>
86
86
  }`;
87
87
 
88
88
  const inputClass = (hasError?: boolean) =>
89
- `w-full bg-surface-btn/90 border ${
90
- hasError ? "border-trade-down/50" : "border-surface-bd"
91
- } rounded-lg px-3 py-2.5 text-white placeholder-gray-600 focus:outline-none font-mono text-base`;
89
+ `input ${
90
+ hasError ? "input-error" : ""
91
+ } w-full rounded-lg px-3 py-2.5 text-content placeholder-content-faint focus:outline-none font-mono text-base`;
92
92
 
93
93
  const formatAddress = (address: string) =>
94
94
  `${address.slice(0, 6)}...${address.slice(-4)}`;
@@ -359,28 +359,31 @@ export function AddWalletModal({
359
359
  <motion.div className="hypurr-connect" style={{ display: "contents" }}>
360
360
  <SpinKeyframes />
361
361
  <motion.div
362
- className="fixed inset-0 z-[100] bg-black/70 backdrop-blur-sm"
362
+ className="fixed inset-0 z-[100] bg-overlay/70 backdrop-blur-sm"
363
363
  initial={{ opacity: 0 }}
364
364
  animate={{ opacity: 1 }}
365
365
  exit={{ opacity: 0 }}
366
366
  transition={{ duration: 0.15 }}
367
367
  onClick={handleClose}
368
368
  />
369
- <div className="fixed inset-0 z-[101] flex items-center justify-center p-4">
369
+ <div
370
+ className="fixed inset-0 z-[101] flex items-center justify-center p-4"
371
+ onClick={handleClose}
372
+ >
370
373
  <motion.div
371
- className="relative w-full max-w-md overflow-hidden rounded-lg border border-surface-bd bg-surface-modal font-sans shadow-modal"
374
+ className="relative w-full max-w-md overflow-hidden rounded-lg border border-line bg-surface-modal font-sans shadow-modal"
372
375
  initial={{ opacity: 0, y: 8 }}
373
376
  animate={{ opacity: 1, y: 0 }}
374
377
  exit={{ opacity: 0, y: 8 }}
375
378
  transition={{ duration: 0.18, ease: "easeOut" }}
376
379
  onClick={(event) => event.stopPropagation()}
377
380
  >
378
- <div className="relative flex items-center justify-center border-b border-white/[0.06] px-6 pb-5 pt-6">
379
- <h3 className="text-lg font-semibold text-white">Add Wallet</h3>
381
+ <div className="relative flex items-center justify-center border-b border-line px-6 pb-5 pt-6">
382
+ <h3 className="text-lg font-medium text-content">Add Wallet</h3>
380
383
  <button
381
384
  onClick={handleClose}
382
385
  disabled={isProcessing}
383
- className="absolute right-6 text-gray-400 transition-colors hover:text-white disabled:cursor-not-allowed disabled:opacity-40"
386
+ className="absolute right-6 text-content-muted transition-colors hover:text-content disabled:cursor-not-allowed disabled:opacity-40"
384
387
  aria-label="Close"
385
388
  >
386
389
  <X size={16} />
@@ -422,7 +425,7 @@ export function AddWalletModal({
422
425
  <div className="px-6 pb-6 pt-5">
423
426
  {activeTab === "generate" && (
424
427
  <section className="space-y-4">
425
- <p className="text-base text-gray-400">
428
+ <p className="text-base text-content-muted">
426
429
  Create a new Hyperliquid wallet.
427
430
  </p>
428
431
  <WalletNameInput
@@ -457,7 +460,7 @@ export function AddWalletModal({
457
460
 
458
461
  {activeTab === "import" && (
459
462
  <section className="space-y-4">
460
- <p className="text-base text-gray-400">
463
+ <p className="text-base text-content-muted">
461
464
  Import a Hyperliquid wallet with its private key.
462
465
  </p>
463
466
  <WalletNameInput
@@ -468,7 +471,7 @@ export function AddWalletModal({
468
471
  placeholder="MyImportedWallet"
469
472
  />
470
473
  <div>
471
- <label className="mb-2 block text-base uppercase tracking-[0.1em] text-gray-400">
474
+ <label className="mb-2 block text-base uppercase tracking-[0.1em] text-content-muted">
472
475
  Private Key
473
476
  </label>
474
477
  <div className="relative">
@@ -491,7 +494,7 @@ export function AddWalletModal({
491
494
  onClick={() =>
492
495
  setShowImportPrivateKey((visible) => !visible)
493
496
  }
494
- className="absolute right-2 top-1/2 -translate-y-1/2 p-1.5 text-gray-500 transition-colors hover:text-gray-300"
497
+ className="absolute right-2 top-1/2 -translate-y-1/2 p-1.5 text-content-subtle transition-colors hover:text-content-tertiary"
495
498
  aria-label={
496
499
  showImportPrivateKey
497
500
  ? "Hide private key"
@@ -513,12 +516,12 @@ export function AddWalletModal({
513
516
  !isValidImportWalletName ||
514
517
  !isValidImportPrivateKey
515
518
  }
516
- className={`flex w-full items-center justify-center gap-2 rounded-lg border bg-transparent py-2 text-base font-medium transition-colors ${
519
+ className={`flex w-full items-center justify-center gap-2 rounded-lg py-2 text-base font-medium ${
517
520
  !isProcessing &&
518
521
  isValidImportWalletName &&
519
522
  isValidImportPrivateKey
520
- ? "border-purple-500 text-purple-400 hover:bg-purple-500/10"
521
- : "cursor-not-allowed border-gray-700 text-gray-600"
523
+ ? "btn-raised-accent"
524
+ : "btn-raised-disabled"
522
525
  }`}
523
526
  >
524
527
  {isProcessing ? (
@@ -537,7 +540,7 @@ export function AddWalletModal({
537
540
 
538
541
  {activeTab === "api" && (
539
542
  <section className="space-y-4">
540
- <p className="text-base text-gray-400">
543
+ <p className="text-base text-content-muted">
541
544
  Connect your wallet and sign to link it for trading.
542
545
  </p>
543
546
  {!isWalletConnected || !ownerAddress ? (
@@ -549,13 +552,15 @@ export function AddWalletModal({
549
552
  </button>
550
553
  ) : (
551
554
  <>
552
- <div className="flex items-center gap-3 rounded-lg border border-white/[0.06] bg-white/[0.03] px-3 py-2.5">
553
- <div className="flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-md border border-white/[0.08] bg-white/[0.06]">
554
- <Wallet size={14} className="text-gray-400" />
555
+ <div className="flex items-center gap-3 rounded-lg border border-line bg-surface-btn px-3 py-2.5">
556
+ <div className="flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-md border border-line-strong bg-surface-btn-hover">
557
+ <Wallet size={14} className="text-content-muted" />
555
558
  </div>
556
559
  <div className="min-w-0 flex-1">
557
- <p className="text-base text-gray-400">Connected</p>
558
- <p className="font-mono text-base text-white">
560
+ <p className="text-base text-content-muted">
561
+ Connected
562
+ </p>
563
+ <p className="font-mono text-base text-content">
559
564
  {formatAddress(ownerAddress)}
560
565
  </p>
561
566
  </div>
@@ -597,7 +602,7 @@ export function AddWalletModal({
597
602
  {onDisconnectWallet && (
598
603
  <button
599
604
  onClick={onDisconnectWallet}
600
- className="w-full py-1.5 text-base text-gray-400 transition-colors hover:text-gray-300"
605
+ className="w-full py-1.5 text-base text-content-muted transition-colors hover:text-content-tertiary"
601
606
  >
602
607
  Disconnect & use different wallet
603
608
  </button>
@@ -610,11 +615,11 @@ export function AddWalletModal({
610
615
 
611
616
  {activeTab === "readonly" && onAddReadOnlyWallet && (
612
617
  <section className="space-y-4">
613
- <p className="text-base text-gray-400">
618
+ <p className="text-base text-content-muted">
614
619
  View positions and balances without trading access.
615
620
  </p>
616
621
  <div>
617
- <label className="mb-2 block text-base uppercase tracking-[0.1em] text-gray-400">
622
+ <label className="mb-2 block text-base uppercase tracking-[0.1em] text-content-muted">
618
623
  Wallet Address
619
624
  </label>
620
625
  <input
@@ -673,7 +678,7 @@ function WalletNameInput({
673
678
  }) {
674
679
  return (
675
680
  <div>
676
- <label className="mb-2 block text-base uppercase tracking-[0.1em] text-gray-400">
681
+ <label className="mb-2 block text-base uppercase tracking-[0.1em] text-content-muted">
677
682
  Wallet Name
678
683
  </label>
679
684
  <input
@@ -689,7 +694,7 @@ function WalletNameInput({
689
694
  placeholder={placeholder}
690
695
  className={inputClass(!!value && !isValid)}
691
696
  />
692
- <p className="mt-1.5 text-base text-gray-600">
697
+ <p className="mt-1.5 text-base text-content-faint">
693
698
  Letters, numbers, and / only
694
699
  </p>
695
700
  </div>
@@ -709,7 +714,7 @@ function ApprovalDurationPicker({
709
714
  }) {
710
715
  return (
711
716
  <div>
712
- <label className="mb-2 block text-base uppercase tracking-[0.1em] text-gray-400">
717
+ <label className="mb-2 block text-base uppercase tracking-[0.1em] text-content-muted">
713
718
  Approval Duration
714
719
  </label>
715
720
  <div className="grid grid-cols-4 gap-1.5">
@@ -719,8 +724,10 @@ function ApprovalDurationPicker({
719
724
  type="button"
720
725
  onClick={() => onChange(option.durationMs)}
721
726
  disabled={disabled}
722
- className={`rounded py-1.5 text-base font-medium disabled:cursor-not-allowed disabled:opacity-50 ${
723
- value === option.durationMs ? "btn-raised-active" : "btn-raised"
727
+ className={`rounded border py-1.5 text-base font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50 ${
728
+ value === option.durationMs
729
+ ? "bg-surface-btn-active text-content border-surface-bd-active"
730
+ : "bg-surface-btn text-content-muted border-surface-bd hover:bg-surface-btn-hover hover:border-surface-bd-hover hover:text-content-tertiary"
724
731
  }`}
725
732
  >
726
733
  {option.label}
@@ -46,7 +46,7 @@ const panelStyle: CSSProperties = {
46
46
  };
47
47
  const headerStyle: CSSProperties = {
48
48
  ...modalHeaderStyle,
49
- borderBottom: "1px solid rgba(255,255,255,0.06)",
49
+ borderBottom: "1px solid rgb(var(--line))",
50
50
  };
51
51
 
52
52
  const bodyStyle: CSSProperties = {
@@ -68,8 +68,8 @@ const warningBoxStyle: CSSProperties = {
68
68
 
69
69
  const infoBoxStyle: CSSProperties = {
70
70
  padding: "10px 12px",
71
- background: "rgba(255,255,255,0.03)",
72
- border: "1px solid rgba(255,255,255,0.06)",
71
+ background: "rgb(var(--btn-bevel) / 0.03)",
72
+ border: "1px solid rgb(var(--line))",
73
73
  borderRadius: 8,
74
74
  };
75
75
 
@@ -83,18 +83,14 @@ const labelStyle: CSSProperties = {
83
83
 
84
84
  const inputStyle = (disabled: boolean): CSSProperties => ({
85
85
  width: "100%",
86
- background: "rgba(13,18,25,0.9)",
87
- border: `1px solid ${profileColors.surfaceBd}`,
88
86
  borderRadius: 8,
89
87
  padding: "10px 12px",
90
- color: profileColors.text,
91
88
  fontFamily: fontFamily.mono,
92
89
  fontSize: 12.5,
93
90
  lineHeight: "1rem",
94
91
  outline: "none",
95
92
  opacity: disabled ? 0.5 : 1,
96
93
  boxSizing: "border-box",
97
- transition: "border-color 150ms, background-color 150ms",
98
94
  });
99
95
 
100
96
  const footerStyle: CSSProperties = {
@@ -173,7 +169,7 @@ export function DeleteWalletModal({
173
169
  transition={{ duration: 0.15 }}
174
170
  onClick={handleClose}
175
171
  />
176
- <div style={wrapperStyle}>
172
+ <div style={wrapperStyle} onClick={handleClose}>
177
173
  <motion.div
178
174
  key="panel"
179
175
  style={panelStyle}
@@ -282,6 +278,7 @@ export function DeleteWalletModal({
282
278
  onChange={(e) => setConfirmName(e.target.value)}
283
279
  placeholder={walletName}
284
280
  disabled={isDeleting}
281
+ className="input text-content placeholder-content-faint"
285
282
  style={inputStyle(isDeleting)}
286
283
  />
287
284
  </div>
@@ -593,6 +593,7 @@ export function HypurrConnectProvider({
593
593
  telegramId: String(tgUser.telegramId),
594
594
  hfunScore: tgUser?.reputation?.hfunScore,
595
595
  reputationScore: tgUser?.reputation?.reputationScore,
596
+ addressBook: tgUser.addressBook,
596
597
  };
597
598
  }
598
599
  if (eoaAddress && authMethod === "eoa") {
@@ -4,13 +4,9 @@ import {
4
4
  useAnimationControls,
5
5
  type PanInfo,
6
6
  } from "framer-motion";
7
- import {
8
- useCallback,
9
- useSyncExternalStore,
10
- type CSSProperties,
11
- type ReactNode,
12
- } from "react";
7
+ import { useCallback, type CSSProperties, type ReactNode } from "react";
13
8
  import { useHypurrConnectInternal } from "./HypurrConnectProvider";
9
+ import { useIsMobile } from "./useIsMobile";
14
10
  import { MetaMaskColorIcon } from "./icons/MetaMaskColorIcon";
15
11
  import { TelegramColorIcon } from "./icons/TelegramColorIcon";
16
12
 
@@ -21,8 +17,6 @@ export interface LoginModalProps {
21
17
  backgroundColor?: string;
22
18
  }
23
19
 
24
- const MOBILE_BREAKPOINT = 640;
25
-
26
20
  const DEFAULT_BACKGROUND_COLOR = "rgba(20,20,20,0.95)";
27
21
 
28
22
  const btnStyle: CSSProperties = {
@@ -93,24 +87,6 @@ const dividerStyle: CSSProperties = {
93
87
 
94
88
  const iconSize: CSSProperties = { width: 26, height: 26 };
95
89
 
96
- const mobileQuery =
97
- typeof window !== "undefined"
98
- ? window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT}px)`)
99
- : null;
100
-
101
- function subscribeMobile(cb: () => void) {
102
- mobileQuery?.addEventListener("change", cb);
103
- return () => mobileQuery?.removeEventListener("change", cb);
104
- }
105
-
106
- function getSnapshotMobile() {
107
- return mobileQuery?.matches ?? false;
108
- }
109
-
110
- function useIsMobile() {
111
- return useSyncExternalStore(subscribeMobile, getSnapshotMobile, () => false);
112
- }
113
-
114
90
  function HoverButton({
115
91
  onClick,
116
92
  children,
@@ -22,7 +22,6 @@ import {
22
22
  modalPanelStyle,
23
23
  modalWrapperStyle,
24
24
  profileColors,
25
- raisedButtonStyle,
26
25
  titleStyle,
27
26
  upperLabelStyle,
28
27
  } from "./profileStyles";
@@ -48,7 +47,7 @@ const panelStyle: CSSProperties = {
48
47
  };
49
48
  const headerStyle: CSSProperties = {
50
49
  ...modalHeaderStyle,
51
- borderBottom: "1px solid rgba(255,255,255,0.06)",
50
+ borderBottom: "1px solid rgb(var(--line))",
52
51
  };
53
52
 
54
53
  const bodyStyle: CSSProperties = {
@@ -60,8 +59,8 @@ const bodyStyle: CSSProperties = {
60
59
 
61
60
  const infoBoxStyle: CSSProperties = {
62
61
  padding: "10px 12px",
63
- background: "rgba(255,255,255,0.03)",
64
- border: "1px solid rgba(255,255,255,0.06)",
62
+ background: "rgb(var(--btn-bevel) / 0.03)",
63
+ border: "1px solid rgb(var(--line))",
65
64
  borderRadius: 8,
66
65
  };
67
66
 
@@ -73,33 +72,23 @@ const labelStyle: CSSProperties = {
73
72
  marginBottom: 8,
74
73
  };
75
74
 
76
- const inputStyle = (hasError: boolean, disabled: boolean): CSSProperties => ({
75
+ const inputStyle = (disabled: boolean): CSSProperties => ({
77
76
  width: "100%",
78
- background: "rgba(13,18,25,0.9)",
79
- border: `1px solid ${
80
- hasError ? "rgba(248,113,113,0.5)" : profileColors.surfaceBd
81
- }`,
82
77
  borderRadius: 8,
83
78
  padding: "10px 12px",
84
- color: profileColors.text,
85
79
  fontFamily: fontFamily.mono,
86
80
  fontSize: 12.5,
87
81
  lineHeight: "1rem",
88
82
  outline: "none",
89
83
  opacity: disabled ? 0.5 : 1,
90
84
  boxSizing: "border-box",
91
- transition: "border-color 150ms, background-color 150ms",
92
85
  });
93
86
 
94
87
  const footerStyle: CSSProperties = {
95
88
  padding: "0 24px 24px",
96
89
  };
97
90
 
98
- const saveButtonStyle = (
99
- enabled: boolean,
100
- hovered: boolean,
101
- ): CSSProperties => ({
102
- ...raisedButtonStyle(enabled ? (hovered ? "hover" : "default") : "disabled"),
91
+ const saveButtonStyle: CSSProperties = {
103
92
  width: "100%",
104
93
  padding: "8px 0",
105
94
  borderRadius: 8,
@@ -110,7 +99,7 @@ const saveButtonStyle = (
110
99
  alignItems: "center",
111
100
  justifyContent: "center",
112
101
  gap: 8,
113
- });
102
+ };
114
103
 
115
104
  export function RenameWalletModal({
116
105
  isOpen,
@@ -122,7 +111,6 @@ export function RenameWalletModal({
122
111
  const [name, setName] = useState("");
123
112
  const [isRenaming, setIsRenaming] = useState(false);
124
113
  const [error, setError] = useState<string | null>(null);
125
- const [saveHovered, setSaveHovered] = useState(false);
126
114
 
127
115
  const currentName = wallet?.name || "Unnamed";
128
116
  const displayAddress = wallet?.ethereumAddress;
@@ -180,7 +168,7 @@ export function RenameWalletModal({
180
168
  transition={{ duration: 0.15 }}
181
169
  onClick={handleClose}
182
170
  />
183
- <div style={wrapperStyle}>
171
+ <div style={wrapperStyle} onClick={handleClose}>
184
172
  <motion.div
185
173
  key="panel"
186
174
  style={panelStyle}
@@ -252,8 +240,11 @@ export function RenameWalletModal({
252
240
  if (e.key === "Escape") handleClose();
253
241
  }}
254
242
  disabled={isRenaming}
255
- autoFocus
256
- style={inputStyle(!!error, isRenaming)}
243
+ placeholder="Wallet name"
244
+ className={`input text-content placeholder-content-faint ${
245
+ error ? "input-error" : ""
246
+ }`}
247
+ style={inputStyle(isRenaming)}
257
248
  />
258
249
  <p
259
250
  style={{
@@ -302,9 +293,8 @@ export function RenameWalletModal({
302
293
  <button
303
294
  onClick={handleRename}
304
295
  disabled={!canSubmit}
305
- onMouseEnter={() => setSaveHovered(true)}
306
- onMouseLeave={() => setSaveHovered(false)}
307
- style={saveButtonStyle(canSubmit, saveHovered)}
296
+ className={canSubmit ? "btn-raised" : "btn-raised-disabled"}
297
+ style={saveButtonStyle}
308
298
  >
309
299
  {isRenaming ? (
310
300
  <>
@@ -168,30 +168,33 @@ export function RenewAgentModal({
168
168
  <motion.div className="hypurr-connect" style={{ display: "contents" }}>
169
169
  <SpinKeyframes />
170
170
  <motion.div
171
- className="fixed inset-0 z-[110] bg-black/70 backdrop-blur-sm"
171
+ className="fixed inset-0 z-[110] bg-overlay/70 backdrop-blur-sm"
172
172
  initial={{ opacity: 0 }}
173
173
  animate={{ opacity: 1 }}
174
174
  exit={{ opacity: 0 }}
175
175
  transition={{ duration: 0.15 }}
176
176
  onClick={handleClose}
177
177
  />
178
- <div className="fixed inset-0 z-[111] flex items-center justify-center p-4">
178
+ <div
179
+ className="fixed inset-0 z-[111] flex items-center justify-center p-4"
180
+ onClick={handleClose}
181
+ >
179
182
  <motion.div
180
- className="relative w-full max-w-md overflow-hidden rounded-lg border border-surface-bd bg-surface-modal font-sans shadow-modal"
183
+ className="relative w-full max-w-md overflow-hidden rounded-lg border border-line bg-surface-modal font-sans shadow-modal"
181
184
  initial={{ opacity: 0, y: 8 }}
182
185
  animate={{ opacity: 1, y: 0 }}
183
186
  exit={{ opacity: 0, y: 8 }}
184
187
  transition={{ duration: 0.18, ease: "easeOut" }}
185
188
  onClick={(event) => event.stopPropagation()}
186
189
  >
187
- <div className="relative flex items-center justify-center border-b border-white/[0.06] px-6 pb-5 pt-6">
188
- <h3 className="text-lg font-semibold text-white">
190
+ <div className="relative flex items-center justify-center border-b border-line px-6 pb-5 pt-6">
191
+ <h3 className="text-lg font-medium text-content">
189
192
  Renew Agent Wallet
190
193
  </h3>
191
194
  <button
192
195
  onClick={handleClose}
193
196
  disabled={isRenewing}
194
- className="absolute right-6 text-gray-400 transition-colors hover:text-white disabled:cursor-not-allowed disabled:opacity-40"
197
+ className="absolute right-6 text-content-muted transition-colors hover:text-content disabled:cursor-not-allowed disabled:opacity-40"
195
198
  aria-label="Close"
196
199
  >
197
200
  <X size={16} />
@@ -214,16 +217,16 @@ export function RenewAgentModal({
214
217
  </p>
215
218
  </div>
216
219
 
217
- <div className="rounded-lg border border-white/[0.06] bg-white/[0.03] p-3">
218
- <p className="mb-1.5 text-base uppercase tracking-[0.1em] text-gray-400">
220
+ <div className="rounded-lg border border-line bg-surface-btn p-3">
221
+ <p className="mb-1.5 text-base uppercase tracking-[0.1em] text-content-muted">
219
222
  Agent address
220
223
  </p>
221
224
  <div className="flex items-center justify-between gap-3">
222
225
  <div className="min-w-0">
223
- <p className="truncate text-base font-medium text-white">
226
+ <p className="truncate text-base font-medium text-content">
224
227
  {wallet.name || "Unnamed Wallet"}
225
228
  </p>
226
- <p className="font-mono text-base text-gray-400">
229
+ <p className="font-mono text-base text-content-muted">
227
230
  {hasAgentAddress
228
231
  ? formatAddress(agentAddress)
229
232
  : "Missing agent address"}
@@ -237,15 +240,15 @@ export function RenewAgentModal({
237
240
  </div>
238
241
 
239
242
  {ownerReady ? (
240
- <div className="flex items-center gap-3 rounded-lg border border-white/[0.06] bg-white/[0.03] px-3 py-2.5">
241
- <div className="flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-md border border-white/[0.08] bg-white/[0.06]">
242
- <Wallet size={14} className="text-gray-400" />
243
+ <div className="flex items-center gap-3 rounded-lg border border-line bg-surface-btn px-3 py-2.5">
244
+ <div className="flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-md border border-line-strong bg-surface-btn-hover">
245
+ <Wallet size={14} className="text-content-muted" />
243
246
  </div>
244
247
  <div className="min-w-0 flex-1">
245
- <p className="text-base text-gray-400">
248
+ <p className="text-base text-content-muted">
246
249
  Owner wallet connected
247
250
  </p>
248
- <p className="font-mono text-base text-white">
251
+ <p className="font-mono text-base text-content">
249
252
  {formatAddress(ownerAddress)}
250
253
  </p>
251
254
  </div>
@@ -262,10 +265,10 @@ export function RenewAgentModal({
262
265
  <p className="text-base text-trade-down">
263
266
  Wrong owner wallet connected
264
267
  </p>
265
- <p className="mt-1 font-mono text-base text-gray-400">
268
+ <p className="mt-1 font-mono text-base text-content-muted">
266
269
  Connected {formatAddress(ownerAddress)}
267
270
  </p>
268
- <p className="font-mono text-base text-gray-400">
271
+ <p className="font-mono text-base text-content-muted">
269
272
  Required {formatAddress(expectedOwnerAddress)}
270
273
  </p>
271
274
  </div>
@@ -330,7 +333,7 @@ export function RenewAgentModal({
330
333
  <button
331
334
  onClick={onDisconnectWallet}
332
335
  disabled={isRenewing}
333
- className="w-full py-1.5 text-base text-gray-400 transition-colors hover:text-gray-300 disabled:cursor-not-allowed disabled:opacity-40"
336
+ className="w-full py-1.5 text-base text-content-muted transition-colors hover:text-content-tertiary disabled:cursor-not-allowed disabled:opacity-40"
334
337
  >
335
338
  Disconnect & use different owner
336
339
  </button>
@@ -357,7 +360,7 @@ function ApprovalDurationPicker({
357
360
  }) {
358
361
  return (
359
362
  <div>
360
- <label className="mb-2 block text-base uppercase tracking-[0.1em] text-gray-400">
363
+ <label className="mb-2 block text-base uppercase tracking-[0.1em] text-content-muted">
361
364
  Approval Duration
362
365
  </label>
363
366
  <div className="grid grid-cols-4 gap-1.5">
@@ -367,8 +370,10 @@ function ApprovalDurationPicker({
367
370
  type="button"
368
371
  onClick={() => onChange(option.durationMs)}
369
372
  disabled={disabled}
370
- className={`rounded py-1.5 text-base font-medium disabled:cursor-not-allowed disabled:opacity-50 ${
371
- value === option.durationMs ? "btn-raised-active" : "btn-raised"
373
+ className={`rounded border py-1.5 text-base font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50 ${
374
+ value === option.durationMs
375
+ ? "bg-surface-btn-active text-content border-surface-bd-active"
376
+ : "bg-surface-btn text-content-muted border-surface-bd hover:bg-surface-btn-hover hover:border-surface-bd-hover hover:text-content-tertiary"
372
377
  }`}
373
378
  >
374
379
  {option.label}