@medialane/ui 0.290.0 → 0.292.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 (102) hide show
  1. package/dist/components/account/input-otp.d.cts +2 -2
  2. package/dist/components/account/input-otp.d.ts +2 -2
  3. package/dist/components/action-button.cjs +3 -30
  4. package/dist/components/action-button.cjs.map +1 -1
  5. package/dist/components/action-button.d.cts +1 -2
  6. package/dist/components/action-button.d.ts +1 -2
  7. package/dist/components/action-button.js +1 -28
  8. package/dist/components/action-button.js.map +1 -1
  9. package/dist/components/badge.d.cts +1 -1
  10. package/dist/components/badge.d.ts +1 -1
  11. package/dist/components/button.d.cts +2 -2
  12. package/dist/components/button.d.ts +2 -2
  13. package/dist/components/drop/create/launch-dialog.cjs +10 -7
  14. package/dist/components/drop/create/launch-dialog.cjs.map +1 -1
  15. package/dist/components/drop/create/launch-dialog.js +10 -7
  16. package/dist/components/drop/create/launch-dialog.js.map +1 -1
  17. package/dist/components/drop/page/drop-manage.cjs +6 -3
  18. package/dist/components/drop/page/drop-manage.cjs.map +1 -1
  19. package/dist/components/drop/page/drop-manage.js +6 -3
  20. package/dist/components/drop/page/drop-manage.js.map +1 -1
  21. package/dist/components/drop/page/drop-mint-dialog.cjs +9 -6
  22. package/dist/components/drop/page/drop-mint-dialog.cjs.map +1 -1
  23. package/dist/components/drop/page/drop-mint-dialog.js +9 -6
  24. package/dist/components/drop/page/drop-mint-dialog.js.map +1 -1
  25. package/dist/components/fast-mint/fast-mint.cjs +6 -13
  26. package/dist/components/fast-mint/fast-mint.cjs.map +1 -1
  27. package/dist/components/fast-mint/fast-mint.d.cts +2 -2
  28. package/dist/components/fast-mint/fast-mint.d.ts +2 -2
  29. package/dist/components/fast-mint/fast-mint.js +7 -15
  30. package/dist/components/fast-mint/fast-mint.js.map +1 -1
  31. package/dist/components/gated-content.cjs +2 -1
  32. package/dist/components/gated-content.cjs.map +1 -1
  33. package/dist/components/gated-content.js +2 -1
  34. package/dist/components/gated-content.js.map +1 -1
  35. package/dist/components/listings-grid.cjs +147 -0
  36. package/dist/components/listings-grid.cjs.map +1 -0
  37. package/dist/components/listings-grid.d.cts +15 -0
  38. package/dist/components/listings-grid.d.ts +15 -0
  39. package/dist/components/listings-grid.js +113 -0
  40. package/dist/components/listings-grid.js.map +1 -0
  41. package/dist/components/media-wallet/action-button.cjs +0 -18
  42. package/dist/components/media-wallet/action-button.cjs.map +1 -1
  43. package/dist/components/media-wallet/action-button.d.cts +1 -3
  44. package/dist/components/media-wallet/action-button.d.ts +1 -3
  45. package/dist/components/media-wallet/action-button.js +0 -16
  46. package/dist/components/media-wallet/action-button.js.map +1 -1
  47. package/dist/components/media-wallet/activate-card.cjs +2 -2
  48. package/dist/components/media-wallet/activate-card.cjs.map +1 -1
  49. package/dist/components/media-wallet/activate-card.js +1 -1
  50. package/dist/components/media-wallet/activate-card.js.map +1 -1
  51. package/dist/components/media-wallet/media-wallet-activity.cjs +4 -6
  52. package/dist/components/media-wallet/media-wallet-activity.cjs.map +1 -1
  53. package/dist/components/media-wallet/media-wallet-activity.js +4 -6
  54. package/dist/components/media-wallet/media-wallet-activity.js.map +1 -1
  55. package/dist/components/media-wallet/media-wallet-home.cjs +2 -1
  56. package/dist/components/media-wallet/media-wallet-home.cjs.map +1 -1
  57. package/dist/components/media-wallet/media-wallet-home.js +2 -1
  58. package/dist/components/media-wallet/media-wallet-home.js.map +1 -1
  59. package/dist/components/media-wallet/quick-action.cjs +3 -3
  60. package/dist/components/media-wallet/quick-action.cjs.map +1 -1
  61. package/dist/components/media-wallet/quick-action.d.cts +1 -1
  62. package/dist/components/media-wallet/quick-action.d.ts +1 -1
  63. package/dist/components/media-wallet/quick-action.js +1 -1
  64. package/dist/components/media-wallet/quick-action.js.map +1 -1
  65. package/dist/components/media-wallet/success-dialog.cjs +2 -2
  66. package/dist/components/media-wallet/success-dialog.cjs.map +1 -1
  67. package/dist/components/media-wallet/success-dialog.js +1 -1
  68. package/dist/components/media-wallet/success-dialog.js.map +1 -1
  69. package/dist/components/media-wallet/wallet-activity-icon.cjs +5 -4
  70. package/dist/components/media-wallet/wallet-activity-icon.cjs.map +1 -1
  71. package/dist/components/media-wallet/wallet-activity-icon.js +5 -4
  72. package/dist/components/media-wallet/wallet-activity-icon.js.map +1 -1
  73. package/dist/components/medialane-collection-card.cjs +6 -6
  74. package/dist/components/medialane-collection-card.cjs.map +1 -1
  75. package/dist/components/medialane-collection-card.js +6 -6
  76. package/dist/components/medialane-collection-card.js.map +1 -1
  77. package/dist/components/sheet.d.cts +1 -1
  78. package/dist/components/sheet.d.ts +1 -1
  79. package/dist/components/wallet/self-fund-consent-dialog.cjs +6 -4
  80. package/dist/components/wallet/self-fund-consent-dialog.cjs.map +1 -1
  81. package/dist/components/wallet/self-fund-consent-dialog.js +6 -4
  82. package/dist/components/wallet/self-fund-consent-dialog.js.map +1 -1
  83. package/dist/data/brand.cjs +54 -2
  84. package/dist/data/brand.cjs.map +1 -1
  85. package/dist/data/brand.d.cts +16 -1
  86. package/dist/data/brand.d.ts +16 -1
  87. package/dist/data/brand.js +47 -1
  88. package/dist/data/brand.js.map +1 -1
  89. package/dist/index.cjs +11 -3
  90. package/dist/index.cjs.map +1 -1
  91. package/dist/index.d.cts +2 -2
  92. package/dist/index.d.ts +2 -2
  93. package/dist/index.js +7 -3
  94. package/dist/index.js.map +1 -1
  95. package/dist/medialane.css +14 -23
  96. package/package.json +1 -1
  97. package/dist/components/action-dialog.cjs +0 -70
  98. package/dist/components/action-dialog.cjs.map +0 -1
  99. package/dist/components/action-dialog.d.cts +0 -12
  100. package/dist/components/action-dialog.d.ts +0 -12
  101. package/dist/components/action-dialog.js +0 -46
  102. package/dist/components/action-dialog.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/media-wallet/media-wallet-activity.tsx"],"sourcesContent":["\"use client\";\n\nimport { describeError } from \"../../utils/describe-error.js\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport Image from \"../image.js\";\nimport type { ApiWalletActivity, ApiActivity } from \"@medialane/sdk\";\nimport { getTokenBySymbol } from \"@medialane/sdk\";\nimport { mergeActivityFeeds, type MergedActivityItem } from \"../../utils/media-wallet/activity-feed.js\";\nimport { walletActivityTitle, walletActivitySubtitle, walletActivityAmount } from \"../../utils/media-wallet/wallet-activity.js\";\nimport { short, when, explorerTxUrl, fmt } from \"../../utils/media-wallet/wallet-format.js\";\nimport { BackButton } from \"./back-button.js\";\nimport { WalletActivityIcon } from \"./wallet-activity-icon.js\";\nimport { ActionModal } from \"./action-modal.js\";\nimport { useMediaWalletApp, type MediaWalletView } from \"./types.js\";\nimport { useMedialaneApp } from \"../medialane-app.js\";\nimport { emptyMessages } from \"../../utils/empty-messages.js\";\n\nconst GRADS = [\n \"linear-gradient(135deg,#3b7bff,#8a5cf6)\",\n \"linear-gradient(135deg,#8a5cf6,#f6608f)\",\n \"linear-gradient(135deg,#f6608f,#fb8b46)\",\n \"linear-gradient(135deg,#5b4ce6,#3b7bff)\",\n];\nconst gradFor = (seed: string) => {\n let h = 0;\n for (let i = 0; i < seed.length; i++) h = (h * 31 + seed.charCodeAt(i)) | 0;\n return GRADS[Math.abs(h) % GRADS.length];\n};\n\nexport function MediaWalletActivity({ onNavigate }: { onNavigate: (view: MediaWalletView) => void }) {\n const { useWalletSession } = useMediaWalletApp();\n const { getClient } = useMedialaneApp();\n const { address } = useWalletSession();\n const [items, setItems] = useState<MergedActivityItem[] | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n const [selected, setSelected] = useState<ApiWalletActivity | null>(null);\n\n const load = useCallback(() => {\n if (!address) return;\n let live = true;\n setLoading(true);\n setError(null);\n (async () => {\n try {\n const client = getClient().api;\n const [walletRes, protocolRes] = await Promise.all([\n client.activity.wallet(address),\n client.activity.byAddress(address, { page: 1, limit: 50 }),\n ]);\n if (live) setItems(mergeActivityFeeds(walletRes.data, protocolRes.data));\n } catch (e) {\n if (live) setError(describeError(e).message);\n } finally {\n if (live) setLoading(false);\n }\n })();\n return () => { live = false; };\n }, [address, getClient]);\n\n useEffect(() => load(), [load]);\n\n return (\n <main className=\"flex flex-col gap-4 px-5 pb-8 pt-2\">\n <div className=\"flex items-center gap-3\">\n <BackButton onBack={() => onNavigate({ name: \"home\" })} />\n <h1 className=\"font-[family-name:var(--font-display)] text-2xl font-extrabold tracking-tight\">Activity</h1>\n </div>\n\n {!address && <div className=\"text-sm text-muted-foreground\">No wallet found on this device.</div>}\n {error && <ActivityLoadError onRetry={load} />}\n {loading && !items && !error && <ActivityLoading />}\n {items && items.length === 0 && (\n <div>\n <p className=\"text-sm font-medium\">{emptyMessages.walletActivity.title}</p>\n <p className=\"text-sm text-muted-foreground\">{emptyMessages.walletActivity.description}</p>\n </div>\n )}\n\n {items && items.length > 0 && (\n <div className=\"flex flex-col gap-2\">\n {items.map((item) =>\n item.source === \"wallet\" ? (\n <WalletActivityRow key={item.data.id} a={item.data} timestamp={item.timestamp} onOpen={setSelected} />\n ) : (\n <ProtocolActivityRow key={`${item.data.txHash}-${item.data.type}`} item={item.data} />\n ),\n )}\n </div>\n )}\n\n {selected && <ActivityDetailModal a={selected} onClose={() => setSelected(null)} />}\n </main>\n );\n}\n\nfunction WalletActivityRow({\n a,\n timestamp,\n onOpen,\n}: {\n a: ApiWalletActivity;\n timestamp: string;\n onOpen: (a: ApiWalletActivity) => void;\n}) {\n const subtitle = walletActivitySubtitle(a);\n const amount = walletActivityAmount(a);\n return (\n <button\n onClick={() => onOpen(a)}\n className=\"flex items-center gap-3 rounded-2xl bg-card/40 px-4 py-3 text-left backdrop-blur-sm transition-colors hover:bg-card/60\"\n >\n <WalletActivityIcon a={a} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold\">{walletActivityTitle(a)}</div>\n {subtitle && <div className=\"truncate text-xs text-muted-foreground\">{subtitle}</div>}\n </div>\n <div className=\"shrink-0 text-right\">\n {amount && <div className=\"text-sm font-semibold tabular-nums\">{amount}</div>}\n <div className=\"text-xs text-muted-foreground\">{when(timestamp)}</div>\n </div>\n </button>\n );\n}\n\nfunction ActivityDetailModal({ a, onClose }: { a: ApiWalletActivity; onClose: () => void }) {\n const { explorerUrl } = useMediaWalletApp();\n const [copied, setCopied] = useState(false);\n const subtitle = walletActivitySubtitle(a);\n const amount = walletActivityAmount(a);\n const fullDate = new Date(a.timestamp).toLocaleString(undefined, {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n });\n\n const copyHash = () => {\n navigator.clipboard?.writeText(a.txHash).catch(() => {});\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n\n return (\n <ActionModal title={walletActivityTitle(a)} onClose={onClose}>\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex flex-col items-center gap-2 py-2 text-center\">\n <WalletActivityIcon a={a} />\n {amount && <div className=\"text-2xl font-bold tabular-nums\">{amount}</div>}\n {subtitle && <div className=\"text-sm text-muted-foreground\">{subtitle}</div>}\n </div>\n\n <div className=\"flex flex-col divide-y divide-border/40 rounded-2xl bg-foreground/[0.05] px-4\">\n <div className=\"flex items-center justify-between py-3\">\n <span className=\"text-xs text-muted-foreground\">Date</span>\n <span className=\"text-sm font-medium\">{fullDate}</span>\n </div>\n <div className=\"flex items-center justify-between py-3\">\n <span className=\"text-xs text-muted-foreground\">Transaction</span>\n <button onClick={copyHash} className=\"font-mono text-sm font-medium transition-opacity active:opacity-60\">\n {copied ? \"Copied ✓\" : short(a.txHash)}\n </button>\n </div>\n </div>\n\n <a\n href={explorerTxUrl(explorerUrl, a.txHash)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-center text-xs font-medium text-muted-foreground underline underline-offset-2\"\n >\n View on Voyager ↗\n </a>\n </div>\n </ActionModal>\n );\n}\n\nfunction ProtocolActivityRow({ item }: { item: ApiActivity }) {\n const { resolveImage } = useMediaWalletApp();\n const img = resolveImage(item.token?.image ?? null);\n const seed = item.txHash ?? item.orderHash ?? item.type;\n return (\n <div className=\"flex items-center gap-3 rounded-2xl bg-card/40 px-4 py-3 backdrop-blur-sm\">\n <div className=\"relative h-11 w-11 shrink-0 overflow-hidden rounded-2xl\" style={img ? undefined : { background: gradFor(seed) }}>\n {img && (\n <Image src={img} alt=\"\" fill className=\"object-cover\" />\n )}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold capitalize\">{item.type}</div>\n {item.token?.name && <div className=\"truncate text-xs text-muted-foreground\">{item.token.name}</div>}\n </div>\n <div className=\"shrink-0 text-right\">\n {item.price?.raw && item.price.currency && (\n <div className=\"text-sm font-semibold tabular-nums\">\n {fmt(BigInt(item.price.raw), getTokenBySymbol(item.price.currency)?.decimals ?? 18)} <span className=\"text-xs text-muted-foreground\">{item.price.currency}</span>\n </div>\n )}\n <div className=\"text-xs text-muted-foreground\">{when(item.timestamp)}</div>\n </div>\n </div>\n );\n}\n\nfunction ActivityLoading() {\n return (\n <div className=\"flex min-h-[40vh] flex-col items-center justify-center gap-3\">\n <span className=\"h-6 w-6 animate-spin rounded-full border-2 border-border border-t-foreground\" />\n <div className=\"text-sm text-muted-foreground\">Loading your activity…</div>\n </div>\n );\n}\n\nfunction ActivityLoadError({ onRetry }: { onRetry: () => void }) {\n return (\n <div className=\"card-base flex flex-col items-center gap-3 px-6 py-8 text-center\">\n <div className=\"grid h-11 w-11 place-items-center rounded-2xl bg-destructive/10 text-destructive\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M10.3 3.9L2.3 18a2 2 0 001.7 3h16a2 2 0 001.7-3L13.7 3.9a2 2 0 00-3.4 0z\" />\n <path d=\"M12 9v4M12 17h.01\" />\n </svg>\n </div>\n <div>\n <div className=\"text-sm font-semibold\">Couldn&apos;t load your activity</div>\n <p className=\"mx-auto mt-1 max-w-[16rem] text-xs leading-relaxed text-muted-foreground\">\n There was a problem reaching the server. Check your connection and try again.\n </p>\n </div>\n <button\n onClick={onRetry}\n className=\"rounded-full border border-border px-4 py-2 text-xs font-semibold text-foreground transition-colors hover:bg-card\"\n >\n Try again\n </button>\n </div>\n );\n}\n"],"mappings":"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","names":["Image"]}
1
+ {"version":3,"sources":["../../../src/components/media-wallet/media-wallet-activity.tsx"],"sourcesContent":["\"use client\";\n\nimport { describeError } from \"../../utils/describe-error.js\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport Image from \"../image.js\";\nimport type { ApiWalletActivity, ApiActivity } from \"@medialane/sdk\";\nimport { getTokenBySymbol } from \"@medialane/sdk\";\nimport { mergeActivityFeeds, type MergedActivityItem } from \"../../utils/media-wallet/activity-feed.js\";\nimport { walletActivityTitle, walletActivitySubtitle, walletActivityAmount } from \"../../utils/media-wallet/wallet-activity.js\";\nimport { short, when, explorerTxUrl, fmt } from \"../../utils/media-wallet/wallet-format.js\";\nimport { BackButton } from \"./back-button.js\";\nimport { WalletActivityIcon } from \"./wallet-activity-icon.js\";\nimport { ActionModal } from \"./action-modal.js\";\nimport { useMediaWalletApp, type MediaWalletView } from \"./types.js\";\nimport { useMedialaneApp } from \"../medialane-app.js\";\nimport { BRAND_COLOR } from \"../../data/brand.js\";\nimport { emptyMessages } from \"../../utils/empty-messages.js\";\n\nconst GRADS = ([[\"blue\", \"purple\"], [\"purple\", \"rose\"], [\"rose\", \"orange\"], [\"purple\", \"blue\"]] as const).map(\n ([from, to]) => `linear-gradient(135deg, ${BRAND_COLOR[from]}, ${BRAND_COLOR[to]})`,\n);\nconst gradFor = (seed: string) => {\n let h = 0;\n for (let i = 0; i < seed.length; i++) h = (h * 31 + seed.charCodeAt(i)) | 0;\n return GRADS[Math.abs(h) % GRADS.length];\n};\n\nexport function MediaWalletActivity({ onNavigate }: { onNavigate: (view: MediaWalletView) => void }) {\n const { useWalletSession } = useMediaWalletApp();\n const { getClient } = useMedialaneApp();\n const { address } = useWalletSession();\n const [items, setItems] = useState<MergedActivityItem[] | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n const [selected, setSelected] = useState<ApiWalletActivity | null>(null);\n\n const load = useCallback(() => {\n if (!address) return;\n let live = true;\n setLoading(true);\n setError(null);\n (async () => {\n try {\n const client = getClient().api;\n const [walletRes, protocolRes] = await Promise.all([\n client.activity.wallet(address),\n client.activity.byAddress(address, { page: 1, limit: 50 }),\n ]);\n if (live) setItems(mergeActivityFeeds(walletRes.data, protocolRes.data));\n } catch (e) {\n if (live) setError(describeError(e).message);\n } finally {\n if (live) setLoading(false);\n }\n })();\n return () => { live = false; };\n }, [address, getClient]);\n\n useEffect(() => load(), [load]);\n\n return (\n <main className=\"flex flex-col gap-4 px-5 pb-8 pt-2\">\n <div className=\"flex items-center gap-3\">\n <BackButton onBack={() => onNavigate({ name: \"home\" })} />\n <h1 className=\"font-[family-name:var(--font-display)] text-2xl font-extrabold tracking-tight\">Activity</h1>\n </div>\n\n {!address && <div className=\"text-sm text-muted-foreground\">No wallet found on this device.</div>}\n {error && <ActivityLoadError onRetry={load} />}\n {loading && !items && !error && <ActivityLoading />}\n {items && items.length === 0 && (\n <div>\n <p className=\"text-sm font-medium\">{emptyMessages.walletActivity.title}</p>\n <p className=\"text-sm text-muted-foreground\">{emptyMessages.walletActivity.description}</p>\n </div>\n )}\n\n {items && items.length > 0 && (\n <div className=\"flex flex-col gap-2\">\n {items.map((item) =>\n item.source === \"wallet\" ? (\n <WalletActivityRow key={item.data.id} a={item.data} timestamp={item.timestamp} onOpen={setSelected} />\n ) : (\n <ProtocolActivityRow key={`${item.data.txHash}-${item.data.type}`} item={item.data} />\n ),\n )}\n </div>\n )}\n\n {selected && <ActivityDetailModal a={selected} onClose={() => setSelected(null)} />}\n </main>\n );\n}\n\nfunction WalletActivityRow({\n a,\n timestamp,\n onOpen,\n}: {\n a: ApiWalletActivity;\n timestamp: string;\n onOpen: (a: ApiWalletActivity) => void;\n}) {\n const subtitle = walletActivitySubtitle(a);\n const amount = walletActivityAmount(a);\n return (\n <button\n onClick={() => onOpen(a)}\n className=\"flex items-center gap-3 rounded-2xl bg-card/40 px-4 py-3 text-left backdrop-blur-sm transition-colors hover:bg-card/60\"\n >\n <WalletActivityIcon a={a} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold\">{walletActivityTitle(a)}</div>\n {subtitle && <div className=\"truncate text-xs text-muted-foreground\">{subtitle}</div>}\n </div>\n <div className=\"shrink-0 text-right\">\n {amount && <div className=\"text-sm font-semibold tabular-nums\">{amount}</div>}\n <div className=\"text-xs text-muted-foreground\">{when(timestamp)}</div>\n </div>\n </button>\n );\n}\n\nfunction ActivityDetailModal({ a, onClose }: { a: ApiWalletActivity; onClose: () => void }) {\n const { explorerUrl } = useMediaWalletApp();\n const [copied, setCopied] = useState(false);\n const subtitle = walletActivitySubtitle(a);\n const amount = walletActivityAmount(a);\n const fullDate = new Date(a.timestamp).toLocaleString(undefined, {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n });\n\n const copyHash = () => {\n navigator.clipboard?.writeText(a.txHash).catch(() => {});\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n\n return (\n <ActionModal title={walletActivityTitle(a)} onClose={onClose}>\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex flex-col items-center gap-2 py-2 text-center\">\n <WalletActivityIcon a={a} />\n {amount && <div className=\"text-2xl font-bold tabular-nums\">{amount}</div>}\n {subtitle && <div className=\"text-sm text-muted-foreground\">{subtitle}</div>}\n </div>\n\n <div className=\"flex flex-col divide-y divide-border/40 rounded-2xl bg-foreground/[0.05] px-4\">\n <div className=\"flex items-center justify-between py-3\">\n <span className=\"text-xs text-muted-foreground\">Date</span>\n <span className=\"text-sm font-medium\">{fullDate}</span>\n </div>\n <div className=\"flex items-center justify-between py-3\">\n <span className=\"text-xs text-muted-foreground\">Transaction</span>\n <button onClick={copyHash} className=\"font-mono text-sm font-medium transition-opacity active:opacity-60\">\n {copied ? \"Copied ✓\" : short(a.txHash)}\n </button>\n </div>\n </div>\n\n <a\n href={explorerTxUrl(explorerUrl, a.txHash)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-center text-xs font-medium text-muted-foreground underline underline-offset-2\"\n >\n View on Voyager ↗\n </a>\n </div>\n </ActionModal>\n );\n}\n\nfunction ProtocolActivityRow({ item }: { item: ApiActivity }) {\n const { resolveImage } = useMediaWalletApp();\n const img = resolveImage(item.token?.image ?? null);\n const seed = item.txHash ?? item.orderHash ?? item.type;\n return (\n <div className=\"flex items-center gap-3 rounded-2xl bg-card/40 px-4 py-3 backdrop-blur-sm\">\n <div className=\"relative h-11 w-11 shrink-0 overflow-hidden rounded-2xl\" style={img ? undefined : { background: gradFor(seed) }}>\n {img && (\n <Image src={img} alt=\"\" fill className=\"object-cover\" />\n )}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold capitalize\">{item.type}</div>\n {item.token?.name && <div className=\"truncate text-xs text-muted-foreground\">{item.token.name}</div>}\n </div>\n <div className=\"shrink-0 text-right\">\n {item.price?.raw && item.price.currency && (\n <div className=\"text-sm font-semibold tabular-nums\">\n {fmt(BigInt(item.price.raw), getTokenBySymbol(item.price.currency)?.decimals ?? 18)} <span className=\"text-xs text-muted-foreground\">{item.price.currency}</span>\n </div>\n )}\n <div className=\"text-xs text-muted-foreground\">{when(item.timestamp)}</div>\n </div>\n </div>\n );\n}\n\nfunction ActivityLoading() {\n return (\n <div className=\"flex min-h-[40vh] flex-col items-center justify-center gap-3\">\n <span className=\"h-6 w-6 animate-spin rounded-full border-2 border-border border-t-foreground\" />\n <div className=\"text-sm text-muted-foreground\">Loading your activity…</div>\n </div>\n );\n}\n\nfunction ActivityLoadError({ onRetry }: { onRetry: () => void }) {\n return (\n <div className=\"card-base flex flex-col items-center gap-3 px-6 py-8 text-center\">\n <div className=\"grid h-11 w-11 place-items-center rounded-2xl bg-destructive/10 text-destructive\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M10.3 3.9L2.3 18a2 2 0 001.7 3h16a2 2 0 001.7-3L13.7 3.9a2 2 0 00-3.4 0z\" />\n <path d=\"M12 9v4M12 17h.01\" />\n </svg>\n </div>\n <div>\n <div className=\"text-sm font-semibold\">Couldn&apos;t load your activity</div>\n <p className=\"mx-auto mt-1 max-w-[16rem] text-xs leading-relaxed text-muted-foreground\">\n There was a problem reaching the server. Check your connection and try again.\n </p>\n </div>\n <button\n onClick={onRetry}\n className=\"rounded-full border border-border px-4 py-2 text-xs font-semibold text-foreground transition-colors hover:bg-card\"\n >\n Try again\n </button>\n </div>\n );\n}\n"],"mappings":"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","names":["Image"]}
@@ -12,13 +12,11 @@ import { WalletActivityIcon } from "./wallet-activity-icon.js";
12
12
  import { ActionModal } from "./action-modal.js";
13
13
  import { useMediaWalletApp } from "./types.js";
14
14
  import { useMedialaneApp } from "../medialane-app.js";
15
+ import { BRAND_COLOR } from "../../data/brand.js";
15
16
  import { emptyMessages } from "../../utils/empty-messages.js";
16
- const GRADS = [
17
- "linear-gradient(135deg,#3b7bff,#8a5cf6)",
18
- "linear-gradient(135deg,#8a5cf6,#f6608f)",
19
- "linear-gradient(135deg,#f6608f,#fb8b46)",
20
- "linear-gradient(135deg,#5b4ce6,#3b7bff)"
21
- ];
17
+ const GRADS = [["blue", "purple"], ["purple", "rose"], ["rose", "orange"], ["purple", "blue"]].map(
18
+ ([from, to]) => `linear-gradient(135deg, ${BRAND_COLOR[from]}, ${BRAND_COLOR[to]})`
19
+ );
22
20
  const gradFor = (seed) => {
23
21
  let h = 0;
24
22
  for (let i = 0; i < seed.length; i++) h = h * 31 + seed.charCodeAt(i) | 0;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/media-wallet/media-wallet-activity.tsx"],"sourcesContent":["\"use client\";\n\nimport { describeError } from \"../../utils/describe-error.js\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport Image from \"../image.js\";\nimport type { ApiWalletActivity, ApiActivity } from \"@medialane/sdk\";\nimport { getTokenBySymbol } from \"@medialane/sdk\";\nimport { mergeActivityFeeds, type MergedActivityItem } from \"../../utils/media-wallet/activity-feed.js\";\nimport { walletActivityTitle, walletActivitySubtitle, walletActivityAmount } from \"../../utils/media-wallet/wallet-activity.js\";\nimport { short, when, explorerTxUrl, fmt } from \"../../utils/media-wallet/wallet-format.js\";\nimport { BackButton } from \"./back-button.js\";\nimport { WalletActivityIcon } from \"./wallet-activity-icon.js\";\nimport { ActionModal } from \"./action-modal.js\";\nimport { useMediaWalletApp, type MediaWalletView } from \"./types.js\";\nimport { useMedialaneApp } from \"../medialane-app.js\";\nimport { emptyMessages } from \"../../utils/empty-messages.js\";\n\nconst GRADS = [\n \"linear-gradient(135deg,#3b7bff,#8a5cf6)\",\n \"linear-gradient(135deg,#8a5cf6,#f6608f)\",\n \"linear-gradient(135deg,#f6608f,#fb8b46)\",\n \"linear-gradient(135deg,#5b4ce6,#3b7bff)\",\n];\nconst gradFor = (seed: string) => {\n let h = 0;\n for (let i = 0; i < seed.length; i++) h = (h * 31 + seed.charCodeAt(i)) | 0;\n return GRADS[Math.abs(h) % GRADS.length];\n};\n\nexport function MediaWalletActivity({ onNavigate }: { onNavigate: (view: MediaWalletView) => void }) {\n const { useWalletSession } = useMediaWalletApp();\n const { getClient } = useMedialaneApp();\n const { address } = useWalletSession();\n const [items, setItems] = useState<MergedActivityItem[] | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n const [selected, setSelected] = useState<ApiWalletActivity | null>(null);\n\n const load = useCallback(() => {\n if (!address) return;\n let live = true;\n setLoading(true);\n setError(null);\n (async () => {\n try {\n const client = getClient().api;\n const [walletRes, protocolRes] = await Promise.all([\n client.activity.wallet(address),\n client.activity.byAddress(address, { page: 1, limit: 50 }),\n ]);\n if (live) setItems(mergeActivityFeeds(walletRes.data, protocolRes.data));\n } catch (e) {\n if (live) setError(describeError(e).message);\n } finally {\n if (live) setLoading(false);\n }\n })();\n return () => { live = false; };\n }, [address, getClient]);\n\n useEffect(() => load(), [load]);\n\n return (\n <main className=\"flex flex-col gap-4 px-5 pb-8 pt-2\">\n <div className=\"flex items-center gap-3\">\n <BackButton onBack={() => onNavigate({ name: \"home\" })} />\n <h1 className=\"font-[family-name:var(--font-display)] text-2xl font-extrabold tracking-tight\">Activity</h1>\n </div>\n\n {!address && <div className=\"text-sm text-muted-foreground\">No wallet found on this device.</div>}\n {error && <ActivityLoadError onRetry={load} />}\n {loading && !items && !error && <ActivityLoading />}\n {items && items.length === 0 && (\n <div>\n <p className=\"text-sm font-medium\">{emptyMessages.walletActivity.title}</p>\n <p className=\"text-sm text-muted-foreground\">{emptyMessages.walletActivity.description}</p>\n </div>\n )}\n\n {items && items.length > 0 && (\n <div className=\"flex flex-col gap-2\">\n {items.map((item) =>\n item.source === \"wallet\" ? (\n <WalletActivityRow key={item.data.id} a={item.data} timestamp={item.timestamp} onOpen={setSelected} />\n ) : (\n <ProtocolActivityRow key={`${item.data.txHash}-${item.data.type}`} item={item.data} />\n ),\n )}\n </div>\n )}\n\n {selected && <ActivityDetailModal a={selected} onClose={() => setSelected(null)} />}\n </main>\n );\n}\n\nfunction WalletActivityRow({\n a,\n timestamp,\n onOpen,\n}: {\n a: ApiWalletActivity;\n timestamp: string;\n onOpen: (a: ApiWalletActivity) => void;\n}) {\n const subtitle = walletActivitySubtitle(a);\n const amount = walletActivityAmount(a);\n return (\n <button\n onClick={() => onOpen(a)}\n className=\"flex items-center gap-3 rounded-2xl bg-card/40 px-4 py-3 text-left backdrop-blur-sm transition-colors hover:bg-card/60\"\n >\n <WalletActivityIcon a={a} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold\">{walletActivityTitle(a)}</div>\n {subtitle && <div className=\"truncate text-xs text-muted-foreground\">{subtitle}</div>}\n </div>\n <div className=\"shrink-0 text-right\">\n {amount && <div className=\"text-sm font-semibold tabular-nums\">{amount}</div>}\n <div className=\"text-xs text-muted-foreground\">{when(timestamp)}</div>\n </div>\n </button>\n );\n}\n\nfunction ActivityDetailModal({ a, onClose }: { a: ApiWalletActivity; onClose: () => void }) {\n const { explorerUrl } = useMediaWalletApp();\n const [copied, setCopied] = useState(false);\n const subtitle = walletActivitySubtitle(a);\n const amount = walletActivityAmount(a);\n const fullDate = new Date(a.timestamp).toLocaleString(undefined, {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n });\n\n const copyHash = () => {\n navigator.clipboard?.writeText(a.txHash).catch(() => {});\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n\n return (\n <ActionModal title={walletActivityTitle(a)} onClose={onClose}>\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex flex-col items-center gap-2 py-2 text-center\">\n <WalletActivityIcon a={a} />\n {amount && <div className=\"text-2xl font-bold tabular-nums\">{amount}</div>}\n {subtitle && <div className=\"text-sm text-muted-foreground\">{subtitle}</div>}\n </div>\n\n <div className=\"flex flex-col divide-y divide-border/40 rounded-2xl bg-foreground/[0.05] px-4\">\n <div className=\"flex items-center justify-between py-3\">\n <span className=\"text-xs text-muted-foreground\">Date</span>\n <span className=\"text-sm font-medium\">{fullDate}</span>\n </div>\n <div className=\"flex items-center justify-between py-3\">\n <span className=\"text-xs text-muted-foreground\">Transaction</span>\n <button onClick={copyHash} className=\"font-mono text-sm font-medium transition-opacity active:opacity-60\">\n {copied ? \"Copied ✓\" : short(a.txHash)}\n </button>\n </div>\n </div>\n\n <a\n href={explorerTxUrl(explorerUrl, a.txHash)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-center text-xs font-medium text-muted-foreground underline underline-offset-2\"\n >\n View on Voyager ↗\n </a>\n </div>\n </ActionModal>\n );\n}\n\nfunction ProtocolActivityRow({ item }: { item: ApiActivity }) {\n const { resolveImage } = useMediaWalletApp();\n const img = resolveImage(item.token?.image ?? null);\n const seed = item.txHash ?? item.orderHash ?? item.type;\n return (\n <div className=\"flex items-center gap-3 rounded-2xl bg-card/40 px-4 py-3 backdrop-blur-sm\">\n <div className=\"relative h-11 w-11 shrink-0 overflow-hidden rounded-2xl\" style={img ? undefined : { background: gradFor(seed) }}>\n {img && (\n <Image src={img} alt=\"\" fill className=\"object-cover\" />\n )}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold capitalize\">{item.type}</div>\n {item.token?.name && <div className=\"truncate text-xs text-muted-foreground\">{item.token.name}</div>}\n </div>\n <div className=\"shrink-0 text-right\">\n {item.price?.raw && item.price.currency && (\n <div className=\"text-sm font-semibold tabular-nums\">\n {fmt(BigInt(item.price.raw), getTokenBySymbol(item.price.currency)?.decimals ?? 18)} <span className=\"text-xs text-muted-foreground\">{item.price.currency}</span>\n </div>\n )}\n <div className=\"text-xs text-muted-foreground\">{when(item.timestamp)}</div>\n </div>\n </div>\n );\n}\n\nfunction ActivityLoading() {\n return (\n <div className=\"flex min-h-[40vh] flex-col items-center justify-center gap-3\">\n <span className=\"h-6 w-6 animate-spin rounded-full border-2 border-border border-t-foreground\" />\n <div className=\"text-sm text-muted-foreground\">Loading your activity…</div>\n </div>\n );\n}\n\nfunction ActivityLoadError({ onRetry }: { onRetry: () => void }) {\n return (\n <div className=\"card-base flex flex-col items-center gap-3 px-6 py-8 text-center\">\n <div className=\"grid h-11 w-11 place-items-center rounded-2xl bg-destructive/10 text-destructive\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M10.3 3.9L2.3 18a2 2 0 001.7 3h16a2 2 0 001.7-3L13.7 3.9a2 2 0 00-3.4 0z\" />\n <path d=\"M12 9v4M12 17h.01\" />\n </svg>\n </div>\n <div>\n <div className=\"text-sm font-semibold\">Couldn&apos;t load your activity</div>\n <p className=\"mx-auto mt-1 max-w-[16rem] text-xs leading-relaxed text-muted-foreground\">\n There was a problem reaching the server. Check your connection and try again.\n </p>\n </div>\n <button\n onClick={onRetry}\n className=\"rounded-full border border-border px-4 py-2 text-xs font-semibold text-foreground transition-colors hover:bg-card\"\n >\n Try again\n </button>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/components/media-wallet/media-wallet-activity.tsx"],"sourcesContent":["\"use client\";\n\nimport { describeError } from \"../../utils/describe-error.js\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport Image from \"../image.js\";\nimport type { ApiWalletActivity, ApiActivity } from \"@medialane/sdk\";\nimport { getTokenBySymbol } from \"@medialane/sdk\";\nimport { mergeActivityFeeds, type MergedActivityItem } from \"../../utils/media-wallet/activity-feed.js\";\nimport { walletActivityTitle, walletActivitySubtitle, walletActivityAmount } from \"../../utils/media-wallet/wallet-activity.js\";\nimport { short, when, explorerTxUrl, fmt } from \"../../utils/media-wallet/wallet-format.js\";\nimport { BackButton } from \"./back-button.js\";\nimport { WalletActivityIcon } from \"./wallet-activity-icon.js\";\nimport { ActionModal } from \"./action-modal.js\";\nimport { useMediaWalletApp, type MediaWalletView } from \"./types.js\";\nimport { useMedialaneApp } from \"../medialane-app.js\";\nimport { BRAND_COLOR } from \"../../data/brand.js\";\nimport { emptyMessages } from \"../../utils/empty-messages.js\";\n\nconst GRADS = ([[\"blue\", \"purple\"], [\"purple\", \"rose\"], [\"rose\", \"orange\"], [\"purple\", \"blue\"]] as const).map(\n ([from, to]) => `linear-gradient(135deg, ${BRAND_COLOR[from]}, ${BRAND_COLOR[to]})`,\n);\nconst gradFor = (seed: string) => {\n let h = 0;\n for (let i = 0; i < seed.length; i++) h = (h * 31 + seed.charCodeAt(i)) | 0;\n return GRADS[Math.abs(h) % GRADS.length];\n};\n\nexport function MediaWalletActivity({ onNavigate }: { onNavigate: (view: MediaWalletView) => void }) {\n const { useWalletSession } = useMediaWalletApp();\n const { getClient } = useMedialaneApp();\n const { address } = useWalletSession();\n const [items, setItems] = useState<MergedActivityItem[] | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n const [selected, setSelected] = useState<ApiWalletActivity | null>(null);\n\n const load = useCallback(() => {\n if (!address) return;\n let live = true;\n setLoading(true);\n setError(null);\n (async () => {\n try {\n const client = getClient().api;\n const [walletRes, protocolRes] = await Promise.all([\n client.activity.wallet(address),\n client.activity.byAddress(address, { page: 1, limit: 50 }),\n ]);\n if (live) setItems(mergeActivityFeeds(walletRes.data, protocolRes.data));\n } catch (e) {\n if (live) setError(describeError(e).message);\n } finally {\n if (live) setLoading(false);\n }\n })();\n return () => { live = false; };\n }, [address, getClient]);\n\n useEffect(() => load(), [load]);\n\n return (\n <main className=\"flex flex-col gap-4 px-5 pb-8 pt-2\">\n <div className=\"flex items-center gap-3\">\n <BackButton onBack={() => onNavigate({ name: \"home\" })} />\n <h1 className=\"font-[family-name:var(--font-display)] text-2xl font-extrabold tracking-tight\">Activity</h1>\n </div>\n\n {!address && <div className=\"text-sm text-muted-foreground\">No wallet found on this device.</div>}\n {error && <ActivityLoadError onRetry={load} />}\n {loading && !items && !error && <ActivityLoading />}\n {items && items.length === 0 && (\n <div>\n <p className=\"text-sm font-medium\">{emptyMessages.walletActivity.title}</p>\n <p className=\"text-sm text-muted-foreground\">{emptyMessages.walletActivity.description}</p>\n </div>\n )}\n\n {items && items.length > 0 && (\n <div className=\"flex flex-col gap-2\">\n {items.map((item) =>\n item.source === \"wallet\" ? (\n <WalletActivityRow key={item.data.id} a={item.data} timestamp={item.timestamp} onOpen={setSelected} />\n ) : (\n <ProtocolActivityRow key={`${item.data.txHash}-${item.data.type}`} item={item.data} />\n ),\n )}\n </div>\n )}\n\n {selected && <ActivityDetailModal a={selected} onClose={() => setSelected(null)} />}\n </main>\n );\n}\n\nfunction WalletActivityRow({\n a,\n timestamp,\n onOpen,\n}: {\n a: ApiWalletActivity;\n timestamp: string;\n onOpen: (a: ApiWalletActivity) => void;\n}) {\n const subtitle = walletActivitySubtitle(a);\n const amount = walletActivityAmount(a);\n return (\n <button\n onClick={() => onOpen(a)}\n className=\"flex items-center gap-3 rounded-2xl bg-card/40 px-4 py-3 text-left backdrop-blur-sm transition-colors hover:bg-card/60\"\n >\n <WalletActivityIcon a={a} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold\">{walletActivityTitle(a)}</div>\n {subtitle && <div className=\"truncate text-xs text-muted-foreground\">{subtitle}</div>}\n </div>\n <div className=\"shrink-0 text-right\">\n {amount && <div className=\"text-sm font-semibold tabular-nums\">{amount}</div>}\n <div className=\"text-xs text-muted-foreground\">{when(timestamp)}</div>\n </div>\n </button>\n );\n}\n\nfunction ActivityDetailModal({ a, onClose }: { a: ApiWalletActivity; onClose: () => void }) {\n const { explorerUrl } = useMediaWalletApp();\n const [copied, setCopied] = useState(false);\n const subtitle = walletActivitySubtitle(a);\n const amount = walletActivityAmount(a);\n const fullDate = new Date(a.timestamp).toLocaleString(undefined, {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n });\n\n const copyHash = () => {\n navigator.clipboard?.writeText(a.txHash).catch(() => {});\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n };\n\n return (\n <ActionModal title={walletActivityTitle(a)} onClose={onClose}>\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex flex-col items-center gap-2 py-2 text-center\">\n <WalletActivityIcon a={a} />\n {amount && <div className=\"text-2xl font-bold tabular-nums\">{amount}</div>}\n {subtitle && <div className=\"text-sm text-muted-foreground\">{subtitle}</div>}\n </div>\n\n <div className=\"flex flex-col divide-y divide-border/40 rounded-2xl bg-foreground/[0.05] px-4\">\n <div className=\"flex items-center justify-between py-3\">\n <span className=\"text-xs text-muted-foreground\">Date</span>\n <span className=\"text-sm font-medium\">{fullDate}</span>\n </div>\n <div className=\"flex items-center justify-between py-3\">\n <span className=\"text-xs text-muted-foreground\">Transaction</span>\n <button onClick={copyHash} className=\"font-mono text-sm font-medium transition-opacity active:opacity-60\">\n {copied ? \"Copied ✓\" : short(a.txHash)}\n </button>\n </div>\n </div>\n\n <a\n href={explorerTxUrl(explorerUrl, a.txHash)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-center text-xs font-medium text-muted-foreground underline underline-offset-2\"\n >\n View on Voyager ↗\n </a>\n </div>\n </ActionModal>\n );\n}\n\nfunction ProtocolActivityRow({ item }: { item: ApiActivity }) {\n const { resolveImage } = useMediaWalletApp();\n const img = resolveImage(item.token?.image ?? null);\n const seed = item.txHash ?? item.orderHash ?? item.type;\n return (\n <div className=\"flex items-center gap-3 rounded-2xl bg-card/40 px-4 py-3 backdrop-blur-sm\">\n <div className=\"relative h-11 w-11 shrink-0 overflow-hidden rounded-2xl\" style={img ? undefined : { background: gradFor(seed) }}>\n {img && (\n <Image src={img} alt=\"\" fill className=\"object-cover\" />\n )}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold capitalize\">{item.type}</div>\n {item.token?.name && <div className=\"truncate text-xs text-muted-foreground\">{item.token.name}</div>}\n </div>\n <div className=\"shrink-0 text-right\">\n {item.price?.raw && item.price.currency && (\n <div className=\"text-sm font-semibold tabular-nums\">\n {fmt(BigInt(item.price.raw), getTokenBySymbol(item.price.currency)?.decimals ?? 18)} <span className=\"text-xs text-muted-foreground\">{item.price.currency}</span>\n </div>\n )}\n <div className=\"text-xs text-muted-foreground\">{when(item.timestamp)}</div>\n </div>\n </div>\n );\n}\n\nfunction ActivityLoading() {\n return (\n <div className=\"flex min-h-[40vh] flex-col items-center justify-center gap-3\">\n <span className=\"h-6 w-6 animate-spin rounded-full border-2 border-border border-t-foreground\" />\n <div className=\"text-sm text-muted-foreground\">Loading your activity…</div>\n </div>\n );\n}\n\nfunction ActivityLoadError({ onRetry }: { onRetry: () => void }) {\n return (\n <div className=\"card-base flex flex-col items-center gap-3 px-6 py-8 text-center\">\n <div className=\"grid h-11 w-11 place-items-center rounded-2xl bg-destructive/10 text-destructive\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M10.3 3.9L2.3 18a2 2 0 001.7 3h16a2 2 0 001.7-3L13.7 3.9a2 2 0 00-3.4 0z\" />\n <path d=\"M12 9v4M12 17h.01\" />\n </svg>\n </div>\n <div>\n <div className=\"text-sm font-semibold\">Couldn&apos;t load your activity</div>\n <p className=\"mx-auto mt-1 max-w-[16rem] text-xs leading-relaxed text-muted-foreground\">\n There was a problem reaching the server. Check your connection and try again.\n </p>\n </div>\n <button\n onClick={onRetry}\n className=\"rounded-full border border-border px-4 py-2 text-xs font-semibold text-foreground transition-colors hover:bg-card\"\n >\n Try again\n </button>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
@@ -39,6 +39,7 @@ var import_router = require("../router.js");
39
39
  var import_currency_icon = require("../currency-icon.js");
40
40
  var import_use_erc20_balance = require("../../utils/media-wallet/use-erc20-balance.js");
41
41
  var import_use_tokens = require("../../utils/use-tokens.js");
42
+ var import_brand = require("../../data/brand.js");
42
43
  var import_activate_card = require("./activate-card.js");
43
44
  var import_quick_action = require("./quick-action.js");
44
45
  var import_receive_card = require("./receive-card.js");
@@ -143,7 +144,7 @@ function MediaWalletHome({
143
144
  {
144
145
  onClick: () => setPanel(panel === "receive" ? null : "receive"),
145
146
  className: "h-[48px] rounded-[13px] px-8 text-[15px] font-semibold text-white transition-transform active:scale-[0.99]",
146
- style: { background: "linear-gradient(115deg,#3b7bff,#5b4ce6)" },
147
+ style: { background: `linear-gradient(115deg, ${import_brand.BRAND_COLOR.blue}, ${import_brand.BRAND_COLOR.purple})` },
147
148
  children: "Fund your account"
148
149
  }
149
150
  )
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/media-wallet/media-wallet-home.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport Link from \"../link.js\";\nimport { useRouter } from \"../router.js\";\nimport { CurrencyIcon } from \"../currency-icon.js\";\nimport { useTokenBalance } from \"../../utils/media-wallet/use-erc20-balance.js\";\nimport { useTokensByOwner } from \"../../utils/use-tokens.js\";\nimport { ActivateCard } from \"./activate-card.js\";\nimport { QuickAction } from \"./quick-action.js\";\nimport { ReceiveCard } from \"./receive-card.js\";\nimport { ActionModal } from \"./action-modal.js\";\nimport { SectionHeader } from \"./section-header.js\";\nimport { SuccessDialog } from \"./success-dialog.js\";\nimport { MediaWalletHeader } from \"./media-wallet-header.js\";\nimport { WALLET_TOKENS, type WalletToken } from \"../../utils/media-wallet/wallet-tokens.js\";\nimport { pickNftItems } from \"../../utils/media-wallet/nft-items.js\";\nimport { NftStrip } from \"./nft-strip.js\";\nimport { useUsdPrices, usdPriceFor } from \"../../utils/use-usd-prices.js\";\nimport { fmt, fmtUsd, rawToNumber } from \"../../utils/media-wallet/wallet-format.js\";\nimport { successMessages } from \"../../utils/success-messages.js\";\nimport { useMediaWalletApp, type MediaWalletView } from \"./types.js\";\n\nexport function MediaWalletHome({\n onNavigate,\n onClose,\n autoOpenReceive,\n}: {\n onNavigate: (view: MediaWalletView) => void;\n onClose: () => void;\n autoOpenReceive?: boolean;\n}) {\n const { useWalletSession, useEmailStatus, resolveImage, emailBanner, externalWallet } = useMediaWalletApp();\n const { address, isDeployed } = useWalletSession();\n const emailStatus = useEmailStatus();\n const router = useRouter();\n const needsEmailVerification = !!emailStatus?.email && !emailStatus.emailVerified;\n\n const balances: Record<WalletToken[\"symbol\"], ReturnType<typeof useTokenBalance>> = {\n STRK: useTokenBalance(\"STRK\", address),\n ETH: useTokenBalance(\"ETH\", address),\n USDC: useTokenBalance(\"USDC\", address),\n WBTC: useTokenBalance(\"WBTC\", address),\n };\n\n const { tokens, isLoading: loadingNfts } = useTokensByOwner(address, 1, 6);\n const nftItems = pickNftItems(tokens, 6);\n\n const usdPrices = useUsdPrices();\n const [panel, setPanel] = useState<\"receive\" | null>(autoOpenReceive ? \"receive\" : null);\n const [hideBalances, setHideBalances] = useState(false);\n const [activated, setActivated] = useState(false);\n const [pull, setPull] = useState(0);\n const startY = useRef<number | null>(null);\n const mainRef = useRef<HTMLElement>(null);\n\n useEffect(() => {\n setHideBalances(localStorage.getItem(\"mediawallet.hideBalances\") === \"1\");\n }, []);\n\n const scrollParent = () => mainRef.current?.parentElement ?? null;\n const onTouchStart = (e: React.TouchEvent) => {\n const sc = scrollParent();\n startY.current = sc && sc.scrollTop <= 0 ? e.touches[0].clientY : null;\n };\n const onTouchMove = (e: React.TouchEvent) => {\n if (startY.current == null) return;\n const dy = e.touches[0].clientY - startY.current;\n if (dy > 0) setPull(Math.min(dy * 0.5, 90));\n };\n const onTouchEnd = () => {\n setPull(0);\n startY.current = null;\n };\n\n const usd = (symbol: WalletToken[\"symbol\"]) => {\n const { rawBalance, decimals } = balances[symbol];\n return rawToNumber(rawBalance, decimals) * (usdPriceFor(usdPrices, symbol) ?? 0);\n };\n const totalUsd = WALLET_TOKENS.reduce((sum, t) => sum + usd(t.symbol), 0);\n const heldTokens = WALLET_TOKENS.filter((t) => (balances[t.symbol].rawBalance ?? 0n) > 0n);\n\n const strkBalance = balances.STRK.rawBalance;\n const funded = strkBalance != null && strkBalance > 0n;\n const canSend = isDeployed === true && funded;\n\n const goLaunch = () => {\n onClose();\n router.push(\"/launchpad\");\n };\n\n return (\n <main\n ref={mainRef}\n onTouchStart={onTouchStart}\n onTouchMove={onTouchMove}\n onTouchEnd={onTouchEnd}\n className=\"relative flex min-h-full flex-col gap-6 px-5 pb-8 pt-2\"\n style={{ transform: pull ? `translateY(${pull}px)` : undefined, transition: pull ? \"none\" : \"transform 0.2s ease\" }}\n >\n {address && (\n <div className=\"flex flex-col items-center gap-4\">\n <MediaWalletHeader address={address} onNavigate={onClose} />\n {(funded || isDeployed === false) && (\n <span className=\"font-[family-name:var(--font-display)] text-5xl font-extrabold tracking-tight tabular-nums\">\n {hideBalances ? \"••••\" : usdPrices === null ? \"…\" : fmtUsd(totalUsd)}\n </span>\n )}\n </div>\n )}\n\n {funded ? (\n <div className=\"grid grid-cols-4 gap-2\">\n <QuickAction label=\"Send\" action=\"buy\" disabled={!canSend} onClick={() => onNavigate({ name: \"send\" })} icon={<ArrowUp />} />\n <QuickAction label=\"Receive\" action=\"offer\" onClick={() => setPanel(panel === \"receive\" ? null : \"receive\")} icon={<ArrowDown />} />\n <QuickAction label=\"Launch\" action=\"remix\" onClick={goLaunch} icon={<RocketIcon />} />\n <QuickAction label=\"Activity\" action=\"submit\" onClick={() => onNavigate({ name: \"activity\" })} icon={<ActivityIcon />} />\n </div>\n ) : isDeployed === null ? (\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-col items-center gap-3 py-2\">\n <div className=\"h-3 w-16 animate-pulse rounded bg-foreground/[0.06]\" />\n <div className=\"h-11 w-32 animate-pulse rounded bg-foreground/[0.06]\" />\n <div className=\"h-[48px] w-40 animate-pulse rounded-[13px] bg-foreground/[0.06]\" />\n </div>\n <div className=\"h-[148px] animate-pulse rounded-[20px] bg-foreground/[0.04]\" />\n </div>\n ) : (\n isDeployed === true && (\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-col items-center gap-3 py-2\">\n <span className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">Balance</span>\n <span className=\"font-[family-name:var(--font-display)] text-5xl font-extrabold tracking-tight tabular-nums\">\n {hideBalances ? \"••••\" : usdPrices === null ? \"…\" : fmtUsd(totalUsd)}\n </span>\n <button\n onClick={() => setPanel(panel === \"receive\" ? null : \"receive\")}\n className=\"h-[48px] rounded-[13px] px-8 text-[15px] font-semibold text-white transition-transform active:scale-[0.99]\"\n style={{ background: \"linear-gradient(115deg,#3b7bff,#5b4ce6)\" }}\n >\n Fund your account\n </button>\n </div>\n <button\n onClick={goLaunch}\n className=\"flex flex-col items-center gap-2 rounded-[20px] border-2 border-dashed border-border px-6 py-8 text-center transition-colors hover:border-primary/50 active:scale-[0.99]\"\n >\n <div className=\"grid h-11 w-11 place-items-center rounded-full bg-foreground/[0.06]\">\n <RocketIcon />\n </div>\n <span className=\"text-[15px] font-semibold text-foreground\">Creator Launchpad</span>\n <span className=\"text-xs text-muted-foreground\">Protect and monetize your work</span>\n </button>\n </div>\n )\n )}\n\n {isDeployed === false && <ActivateCard onActivated={() => setActivated(true)} />}\n\n {needsEmailVerification && (\n <Link\n href={emailBanner.href}\n onClick={onClose}\n className=\"flex items-center gap-3 rounded-2xl px-4 py-3 transition-opacity hover:opacity-90\"\n style={{ background: \"linear-gradient(115deg, hsl(var(--brand-orange) / 0.12), hsl(var(--brand-maeve, 327 64% 67%) / 0.12))\" }}\n >\n <div className=\"grid h-9 w-9 shrink-0 place-items-center rounded-full bg-brand-orange/15\">\n <MailIcon />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold\">Verify your email</div>\n <div className=\"text-xs text-muted-foreground\">{emailBanner.text(emailStatus?.deadline)}</div>\n </div>\n </Link>\n )}\n\n {panel === \"receive\" && address && (\n <ActionModal onClose={() => setPanel(null)}>\n <ReceiveCard address={address} />\n </ActionModal>\n )}\n\n {heldTokens.length > 0 && (\n <section>\n <SectionHeader title=\"Tokens\" />\n <div className=\"mt-2 flex flex-col gap-2\">\n {heldTokens.map((t) => {\n const { rawBalance, decimals } = balances[t.symbol];\n return (\n <button\n key={t.symbol}\n onClick={() => onNavigate({ name: \"token\", token: t })}\n className=\"flex items-center gap-3 rounded-2xl bg-card/40 px-4 py-3 text-left backdrop-blur-sm transition-colors hover:bg-card/60\"\n >\n <div className=\"grid h-11 w-11 shrink-0 place-items-center rounded-full bg-foreground/[0.06]\">\n <CurrencyIcon symbol={t.symbol} size={24} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold\">{t.symbol}</div>\n <div className=\"text-xs text-muted-foreground\">{t.name}</div>\n </div>\n <div className=\"text-right\">\n <div className=\"text-sm font-semibold tabular-nums\">{hideBalances ? \"••••\" : fmt(rawBalance, decimals)}</div>\n {!hideBalances && usdPrices !== null && (\n <div className=\"text-xs text-muted-foreground tabular-nums\">{fmtUsd(usd(t.symbol))}</div>\n )}\n </div>\n </button>\n );\n })}\n </div>\n </section>\n )}\n\n {(nftItems.length > 0 || loadingNfts) && (\n <section>\n <SectionHeader title=\"NFTs\" />\n <div className=\"mt-2\">\n <NftStrip items={nftItems} isLoading={loadingNfts} onNavigate={onClose} resolveImage={resolveImage} />\n </div>\n </section>\n )}\n\n {activated && (\n <SuccessDialog\n title={successMessages.walletActivated().title}\n message={successMessages.walletActivated().description}\n onClose={() => setActivated(false)}\n />\n )}\n\n <a\n href={externalWallet.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-auto text-center text-xs text-muted-foreground/60 transition-colors hover:text-muted-foreground\"\n >\n {externalWallet.label}\n </a>\n </main>\n );\n}\n\nfunction ArrowUp() {\n return (\n <svg width=\"19\" height=\"19\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 19V5M5 12l7-7 7 7\" />\n </svg>\n );\n}\nfunction ArrowDown() {\n return (\n <svg width=\"19\" height=\"19\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 5v14M19 12l-7 7-7-7\" />\n </svg>\n );\n}\nfunction ActivityIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.1\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M22 12h-4l-3 9L9 3l-3 9H2\" />\n </svg>\n );\n}\nfunction MailIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"text-brand-orange\">\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" />\n <path d=\"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\" />\n </svg>\n );\n}\nfunction RocketIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.1\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 00-2.91-.09z\" />\n <path d=\"M12 15l-3-3a22 22 0 012-3.95A12.88 12.88 0 0122 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 01-4 2z\" />\n <path d=\"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\" />\n </svg>\n );\n}\n"],"mappings":"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","names":["Link"]}
1
+ {"version":3,"sources":["../../../src/components/media-wallet/media-wallet-home.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport Link from \"../link.js\";\nimport { useRouter } from \"../router.js\";\nimport { CurrencyIcon } from \"../currency-icon.js\";\nimport { useTokenBalance } from \"../../utils/media-wallet/use-erc20-balance.js\";\nimport { useTokensByOwner } from \"../../utils/use-tokens.js\";\nimport { BRAND_COLOR } from \"../../data/brand.js\";\nimport { ActivateCard } from \"./activate-card.js\";\nimport { QuickAction } from \"./quick-action.js\";\nimport { ReceiveCard } from \"./receive-card.js\";\nimport { ActionModal } from \"./action-modal.js\";\nimport { SectionHeader } from \"./section-header.js\";\nimport { SuccessDialog } from \"./success-dialog.js\";\nimport { MediaWalletHeader } from \"./media-wallet-header.js\";\nimport { WALLET_TOKENS, type WalletToken } from \"../../utils/media-wallet/wallet-tokens.js\";\nimport { pickNftItems } from \"../../utils/media-wallet/nft-items.js\";\nimport { NftStrip } from \"./nft-strip.js\";\nimport { useUsdPrices, usdPriceFor } from \"../../utils/use-usd-prices.js\";\nimport { fmt, fmtUsd, rawToNumber } from \"../../utils/media-wallet/wallet-format.js\";\nimport { successMessages } from \"../../utils/success-messages.js\";\nimport { useMediaWalletApp, type MediaWalletView } from \"./types.js\";\n\nexport function MediaWalletHome({\n onNavigate,\n onClose,\n autoOpenReceive,\n}: {\n onNavigate: (view: MediaWalletView) => void;\n onClose: () => void;\n autoOpenReceive?: boolean;\n}) {\n const { useWalletSession, useEmailStatus, resolveImage, emailBanner, externalWallet } = useMediaWalletApp();\n const { address, isDeployed } = useWalletSession();\n const emailStatus = useEmailStatus();\n const router = useRouter();\n const needsEmailVerification = !!emailStatus?.email && !emailStatus.emailVerified;\n\n const balances: Record<WalletToken[\"symbol\"], ReturnType<typeof useTokenBalance>> = {\n STRK: useTokenBalance(\"STRK\", address),\n ETH: useTokenBalance(\"ETH\", address),\n USDC: useTokenBalance(\"USDC\", address),\n WBTC: useTokenBalance(\"WBTC\", address),\n };\n\n const { tokens, isLoading: loadingNfts } = useTokensByOwner(address, 1, 6);\n const nftItems = pickNftItems(tokens, 6);\n\n const usdPrices = useUsdPrices();\n const [panel, setPanel] = useState<\"receive\" | null>(autoOpenReceive ? \"receive\" : null);\n const [hideBalances, setHideBalances] = useState(false);\n const [activated, setActivated] = useState(false);\n const [pull, setPull] = useState(0);\n const startY = useRef<number | null>(null);\n const mainRef = useRef<HTMLElement>(null);\n\n useEffect(() => {\n setHideBalances(localStorage.getItem(\"mediawallet.hideBalances\") === \"1\");\n }, []);\n\n const scrollParent = () => mainRef.current?.parentElement ?? null;\n const onTouchStart = (e: React.TouchEvent) => {\n const sc = scrollParent();\n startY.current = sc && sc.scrollTop <= 0 ? e.touches[0].clientY : null;\n };\n const onTouchMove = (e: React.TouchEvent) => {\n if (startY.current == null) return;\n const dy = e.touches[0].clientY - startY.current;\n if (dy > 0) setPull(Math.min(dy * 0.5, 90));\n };\n const onTouchEnd = () => {\n setPull(0);\n startY.current = null;\n };\n\n const usd = (symbol: WalletToken[\"symbol\"]) => {\n const { rawBalance, decimals } = balances[symbol];\n return rawToNumber(rawBalance, decimals) * (usdPriceFor(usdPrices, symbol) ?? 0);\n };\n const totalUsd = WALLET_TOKENS.reduce((sum, t) => sum + usd(t.symbol), 0);\n const heldTokens = WALLET_TOKENS.filter((t) => (balances[t.symbol].rawBalance ?? 0n) > 0n);\n\n const strkBalance = balances.STRK.rawBalance;\n const funded = strkBalance != null && strkBalance > 0n;\n const canSend = isDeployed === true && funded;\n\n const goLaunch = () => {\n onClose();\n router.push(\"/launchpad\");\n };\n\n return (\n <main\n ref={mainRef}\n onTouchStart={onTouchStart}\n onTouchMove={onTouchMove}\n onTouchEnd={onTouchEnd}\n className=\"relative flex min-h-full flex-col gap-6 px-5 pb-8 pt-2\"\n style={{ transform: pull ? `translateY(${pull}px)` : undefined, transition: pull ? \"none\" : \"transform 0.2s ease\" }}\n >\n {address && (\n <div className=\"flex flex-col items-center gap-4\">\n <MediaWalletHeader address={address} onNavigate={onClose} />\n {(funded || isDeployed === false) && (\n <span className=\"font-[family-name:var(--font-display)] text-5xl font-extrabold tracking-tight tabular-nums\">\n {hideBalances ? \"••••\" : usdPrices === null ? \"…\" : fmtUsd(totalUsd)}\n </span>\n )}\n </div>\n )}\n\n {funded ? (\n <div className=\"grid grid-cols-4 gap-2\">\n <QuickAction label=\"Send\" action=\"buy\" disabled={!canSend} onClick={() => onNavigate({ name: \"send\" })} icon={<ArrowUp />} />\n <QuickAction label=\"Receive\" action=\"offer\" onClick={() => setPanel(panel === \"receive\" ? null : \"receive\")} icon={<ArrowDown />} />\n <QuickAction label=\"Launch\" action=\"remix\" onClick={goLaunch} icon={<RocketIcon />} />\n <QuickAction label=\"Activity\" action=\"submit\" onClick={() => onNavigate({ name: \"activity\" })} icon={<ActivityIcon />} />\n </div>\n ) : isDeployed === null ? (\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-col items-center gap-3 py-2\">\n <div className=\"h-3 w-16 animate-pulse rounded bg-foreground/[0.06]\" />\n <div className=\"h-11 w-32 animate-pulse rounded bg-foreground/[0.06]\" />\n <div className=\"h-[48px] w-40 animate-pulse rounded-[13px] bg-foreground/[0.06]\" />\n </div>\n <div className=\"h-[148px] animate-pulse rounded-[20px] bg-foreground/[0.04]\" />\n </div>\n ) : (\n isDeployed === true && (\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-col items-center gap-3 py-2\">\n <span className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">Balance</span>\n <span className=\"font-[family-name:var(--font-display)] text-5xl font-extrabold tracking-tight tabular-nums\">\n {hideBalances ? \"••••\" : usdPrices === null ? \"…\" : fmtUsd(totalUsd)}\n </span>\n <button\n onClick={() => setPanel(panel === \"receive\" ? null : \"receive\")}\n className=\"h-[48px] rounded-[13px] px-8 text-[15px] font-semibold text-white transition-transform active:scale-[0.99]\"\n style={{ background: `linear-gradient(115deg, ${BRAND_COLOR.blue}, ${BRAND_COLOR.purple})` }}\n >\n Fund your account\n </button>\n </div>\n <button\n onClick={goLaunch}\n className=\"flex flex-col items-center gap-2 rounded-[20px] border-2 border-dashed border-border px-6 py-8 text-center transition-colors hover:border-primary/50 active:scale-[0.99]\"\n >\n <div className=\"grid h-11 w-11 place-items-center rounded-full bg-foreground/[0.06]\">\n <RocketIcon />\n </div>\n <span className=\"text-[15px] font-semibold text-foreground\">Creator Launchpad</span>\n <span className=\"text-xs text-muted-foreground\">Protect and monetize your work</span>\n </button>\n </div>\n )\n )}\n\n {isDeployed === false && <ActivateCard onActivated={() => setActivated(true)} />}\n\n {needsEmailVerification && (\n <Link\n href={emailBanner.href}\n onClick={onClose}\n className=\"flex items-center gap-3 rounded-2xl px-4 py-3 transition-opacity hover:opacity-90\"\n style={{ background: \"linear-gradient(115deg, hsl(var(--brand-orange) / 0.12), hsl(var(--brand-maeve, 327 64% 67%) / 0.12))\" }}\n >\n <div className=\"grid h-9 w-9 shrink-0 place-items-center rounded-full bg-brand-orange/15\">\n <MailIcon />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold\">Verify your email</div>\n <div className=\"text-xs text-muted-foreground\">{emailBanner.text(emailStatus?.deadline)}</div>\n </div>\n </Link>\n )}\n\n {panel === \"receive\" && address && (\n <ActionModal onClose={() => setPanel(null)}>\n <ReceiveCard address={address} />\n </ActionModal>\n )}\n\n {heldTokens.length > 0 && (\n <section>\n <SectionHeader title=\"Tokens\" />\n <div className=\"mt-2 flex flex-col gap-2\">\n {heldTokens.map((t) => {\n const { rawBalance, decimals } = balances[t.symbol];\n return (\n <button\n key={t.symbol}\n onClick={() => onNavigate({ name: \"token\", token: t })}\n className=\"flex items-center gap-3 rounded-2xl bg-card/40 px-4 py-3 text-left backdrop-blur-sm transition-colors hover:bg-card/60\"\n >\n <div className=\"grid h-11 w-11 shrink-0 place-items-center rounded-full bg-foreground/[0.06]\">\n <CurrencyIcon symbol={t.symbol} size={24} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold\">{t.symbol}</div>\n <div className=\"text-xs text-muted-foreground\">{t.name}</div>\n </div>\n <div className=\"text-right\">\n <div className=\"text-sm font-semibold tabular-nums\">{hideBalances ? \"••••\" : fmt(rawBalance, decimals)}</div>\n {!hideBalances && usdPrices !== null && (\n <div className=\"text-xs text-muted-foreground tabular-nums\">{fmtUsd(usd(t.symbol))}</div>\n )}\n </div>\n </button>\n );\n })}\n </div>\n </section>\n )}\n\n {(nftItems.length > 0 || loadingNfts) && (\n <section>\n <SectionHeader title=\"NFTs\" />\n <div className=\"mt-2\">\n <NftStrip items={nftItems} isLoading={loadingNfts} onNavigate={onClose} resolveImage={resolveImage} />\n </div>\n </section>\n )}\n\n {activated && (\n <SuccessDialog\n title={successMessages.walletActivated().title}\n message={successMessages.walletActivated().description}\n onClose={() => setActivated(false)}\n />\n )}\n\n <a\n href={externalWallet.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-auto text-center text-xs text-muted-foreground/60 transition-colors hover:text-muted-foreground\"\n >\n {externalWallet.label}\n </a>\n </main>\n );\n}\n\nfunction ArrowUp() {\n return (\n <svg width=\"19\" height=\"19\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 19V5M5 12l7-7 7 7\" />\n </svg>\n );\n}\nfunction ArrowDown() {\n return (\n <svg width=\"19\" height=\"19\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 5v14M19 12l-7 7-7-7\" />\n </svg>\n );\n}\nfunction ActivityIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.1\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M22 12h-4l-3 9L9 3l-3 9H2\" />\n </svg>\n );\n}\nfunction MailIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"text-brand-orange\">\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" />\n <path d=\"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\" />\n </svg>\n );\n}\nfunction RocketIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.1\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 00-2.91-.09z\" />\n <path d=\"M12 15l-3-3a22 22 0 012-3.95A12.88 12.88 0 0122 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 01-4 2z\" />\n <path d=\"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\" />\n </svg>\n );\n}\n"],"mappings":"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","names":["Link"]}
@@ -6,6 +6,7 @@ import { useRouter } from "../router.js";
6
6
  import { CurrencyIcon } from "../currency-icon.js";
7
7
  import { useTokenBalance } from "../../utils/media-wallet/use-erc20-balance.js";
8
8
  import { useTokensByOwner } from "../../utils/use-tokens.js";
9
+ import { BRAND_COLOR } from "../../data/brand.js";
9
10
  import { ActivateCard } from "./activate-card.js";
10
11
  import { QuickAction } from "./quick-action.js";
11
12
  import { ReceiveCard } from "./receive-card.js";
@@ -110,7 +111,7 @@ function MediaWalletHome({
110
111
  {
111
112
  onClick: () => setPanel(panel === "receive" ? null : "receive"),
112
113
  className: "h-[48px] rounded-[13px] px-8 text-[15px] font-semibold text-white transition-transform active:scale-[0.99]",
113
- style: { background: "linear-gradient(115deg,#3b7bff,#5b4ce6)" },
114
+ style: { background: `linear-gradient(115deg, ${BRAND_COLOR.blue}, ${BRAND_COLOR.purple})` },
114
115
  children: "Fund your account"
115
116
  }
116
117
  )
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/media-wallet/media-wallet-home.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport Link from \"../link.js\";\nimport { useRouter } from \"../router.js\";\nimport { CurrencyIcon } from \"../currency-icon.js\";\nimport { useTokenBalance } from \"../../utils/media-wallet/use-erc20-balance.js\";\nimport { useTokensByOwner } from \"../../utils/use-tokens.js\";\nimport { ActivateCard } from \"./activate-card.js\";\nimport { QuickAction } from \"./quick-action.js\";\nimport { ReceiveCard } from \"./receive-card.js\";\nimport { ActionModal } from \"./action-modal.js\";\nimport { SectionHeader } from \"./section-header.js\";\nimport { SuccessDialog } from \"./success-dialog.js\";\nimport { MediaWalletHeader } from \"./media-wallet-header.js\";\nimport { WALLET_TOKENS, type WalletToken } from \"../../utils/media-wallet/wallet-tokens.js\";\nimport { pickNftItems } from \"../../utils/media-wallet/nft-items.js\";\nimport { NftStrip } from \"./nft-strip.js\";\nimport { useUsdPrices, usdPriceFor } from \"../../utils/use-usd-prices.js\";\nimport { fmt, fmtUsd, rawToNumber } from \"../../utils/media-wallet/wallet-format.js\";\nimport { successMessages } from \"../../utils/success-messages.js\";\nimport { useMediaWalletApp, type MediaWalletView } from \"./types.js\";\n\nexport function MediaWalletHome({\n onNavigate,\n onClose,\n autoOpenReceive,\n}: {\n onNavigate: (view: MediaWalletView) => void;\n onClose: () => void;\n autoOpenReceive?: boolean;\n}) {\n const { useWalletSession, useEmailStatus, resolveImage, emailBanner, externalWallet } = useMediaWalletApp();\n const { address, isDeployed } = useWalletSession();\n const emailStatus = useEmailStatus();\n const router = useRouter();\n const needsEmailVerification = !!emailStatus?.email && !emailStatus.emailVerified;\n\n const balances: Record<WalletToken[\"symbol\"], ReturnType<typeof useTokenBalance>> = {\n STRK: useTokenBalance(\"STRK\", address),\n ETH: useTokenBalance(\"ETH\", address),\n USDC: useTokenBalance(\"USDC\", address),\n WBTC: useTokenBalance(\"WBTC\", address),\n };\n\n const { tokens, isLoading: loadingNfts } = useTokensByOwner(address, 1, 6);\n const nftItems = pickNftItems(tokens, 6);\n\n const usdPrices = useUsdPrices();\n const [panel, setPanel] = useState<\"receive\" | null>(autoOpenReceive ? \"receive\" : null);\n const [hideBalances, setHideBalances] = useState(false);\n const [activated, setActivated] = useState(false);\n const [pull, setPull] = useState(0);\n const startY = useRef<number | null>(null);\n const mainRef = useRef<HTMLElement>(null);\n\n useEffect(() => {\n setHideBalances(localStorage.getItem(\"mediawallet.hideBalances\") === \"1\");\n }, []);\n\n const scrollParent = () => mainRef.current?.parentElement ?? null;\n const onTouchStart = (e: React.TouchEvent) => {\n const sc = scrollParent();\n startY.current = sc && sc.scrollTop <= 0 ? e.touches[0].clientY : null;\n };\n const onTouchMove = (e: React.TouchEvent) => {\n if (startY.current == null) return;\n const dy = e.touches[0].clientY - startY.current;\n if (dy > 0) setPull(Math.min(dy * 0.5, 90));\n };\n const onTouchEnd = () => {\n setPull(0);\n startY.current = null;\n };\n\n const usd = (symbol: WalletToken[\"symbol\"]) => {\n const { rawBalance, decimals } = balances[symbol];\n return rawToNumber(rawBalance, decimals) * (usdPriceFor(usdPrices, symbol) ?? 0);\n };\n const totalUsd = WALLET_TOKENS.reduce((sum, t) => sum + usd(t.symbol), 0);\n const heldTokens = WALLET_TOKENS.filter((t) => (balances[t.symbol].rawBalance ?? 0n) > 0n);\n\n const strkBalance = balances.STRK.rawBalance;\n const funded = strkBalance != null && strkBalance > 0n;\n const canSend = isDeployed === true && funded;\n\n const goLaunch = () => {\n onClose();\n router.push(\"/launchpad\");\n };\n\n return (\n <main\n ref={mainRef}\n onTouchStart={onTouchStart}\n onTouchMove={onTouchMove}\n onTouchEnd={onTouchEnd}\n className=\"relative flex min-h-full flex-col gap-6 px-5 pb-8 pt-2\"\n style={{ transform: pull ? `translateY(${pull}px)` : undefined, transition: pull ? \"none\" : \"transform 0.2s ease\" }}\n >\n {address && (\n <div className=\"flex flex-col items-center gap-4\">\n <MediaWalletHeader address={address} onNavigate={onClose} />\n {(funded || isDeployed === false) && (\n <span className=\"font-[family-name:var(--font-display)] text-5xl font-extrabold tracking-tight tabular-nums\">\n {hideBalances ? \"••••\" : usdPrices === null ? \"…\" : fmtUsd(totalUsd)}\n </span>\n )}\n </div>\n )}\n\n {funded ? (\n <div className=\"grid grid-cols-4 gap-2\">\n <QuickAction label=\"Send\" action=\"buy\" disabled={!canSend} onClick={() => onNavigate({ name: \"send\" })} icon={<ArrowUp />} />\n <QuickAction label=\"Receive\" action=\"offer\" onClick={() => setPanel(panel === \"receive\" ? null : \"receive\")} icon={<ArrowDown />} />\n <QuickAction label=\"Launch\" action=\"remix\" onClick={goLaunch} icon={<RocketIcon />} />\n <QuickAction label=\"Activity\" action=\"submit\" onClick={() => onNavigate({ name: \"activity\" })} icon={<ActivityIcon />} />\n </div>\n ) : isDeployed === null ? (\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-col items-center gap-3 py-2\">\n <div className=\"h-3 w-16 animate-pulse rounded bg-foreground/[0.06]\" />\n <div className=\"h-11 w-32 animate-pulse rounded bg-foreground/[0.06]\" />\n <div className=\"h-[48px] w-40 animate-pulse rounded-[13px] bg-foreground/[0.06]\" />\n </div>\n <div className=\"h-[148px] animate-pulse rounded-[20px] bg-foreground/[0.04]\" />\n </div>\n ) : (\n isDeployed === true && (\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-col items-center gap-3 py-2\">\n <span className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">Balance</span>\n <span className=\"font-[family-name:var(--font-display)] text-5xl font-extrabold tracking-tight tabular-nums\">\n {hideBalances ? \"••••\" : usdPrices === null ? \"…\" : fmtUsd(totalUsd)}\n </span>\n <button\n onClick={() => setPanel(panel === \"receive\" ? null : \"receive\")}\n className=\"h-[48px] rounded-[13px] px-8 text-[15px] font-semibold text-white transition-transform active:scale-[0.99]\"\n style={{ background: \"linear-gradient(115deg,#3b7bff,#5b4ce6)\" }}\n >\n Fund your account\n </button>\n </div>\n <button\n onClick={goLaunch}\n className=\"flex flex-col items-center gap-2 rounded-[20px] border-2 border-dashed border-border px-6 py-8 text-center transition-colors hover:border-primary/50 active:scale-[0.99]\"\n >\n <div className=\"grid h-11 w-11 place-items-center rounded-full bg-foreground/[0.06]\">\n <RocketIcon />\n </div>\n <span className=\"text-[15px] font-semibold text-foreground\">Creator Launchpad</span>\n <span className=\"text-xs text-muted-foreground\">Protect and monetize your work</span>\n </button>\n </div>\n )\n )}\n\n {isDeployed === false && <ActivateCard onActivated={() => setActivated(true)} />}\n\n {needsEmailVerification && (\n <Link\n href={emailBanner.href}\n onClick={onClose}\n className=\"flex items-center gap-3 rounded-2xl px-4 py-3 transition-opacity hover:opacity-90\"\n style={{ background: \"linear-gradient(115deg, hsl(var(--brand-orange) / 0.12), hsl(var(--brand-maeve, 327 64% 67%) / 0.12))\" }}\n >\n <div className=\"grid h-9 w-9 shrink-0 place-items-center rounded-full bg-brand-orange/15\">\n <MailIcon />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold\">Verify your email</div>\n <div className=\"text-xs text-muted-foreground\">{emailBanner.text(emailStatus?.deadline)}</div>\n </div>\n </Link>\n )}\n\n {panel === \"receive\" && address && (\n <ActionModal onClose={() => setPanel(null)}>\n <ReceiveCard address={address} />\n </ActionModal>\n )}\n\n {heldTokens.length > 0 && (\n <section>\n <SectionHeader title=\"Tokens\" />\n <div className=\"mt-2 flex flex-col gap-2\">\n {heldTokens.map((t) => {\n const { rawBalance, decimals } = balances[t.symbol];\n return (\n <button\n key={t.symbol}\n onClick={() => onNavigate({ name: \"token\", token: t })}\n className=\"flex items-center gap-3 rounded-2xl bg-card/40 px-4 py-3 text-left backdrop-blur-sm transition-colors hover:bg-card/60\"\n >\n <div className=\"grid h-11 w-11 shrink-0 place-items-center rounded-full bg-foreground/[0.06]\">\n <CurrencyIcon symbol={t.symbol} size={24} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold\">{t.symbol}</div>\n <div className=\"text-xs text-muted-foreground\">{t.name}</div>\n </div>\n <div className=\"text-right\">\n <div className=\"text-sm font-semibold tabular-nums\">{hideBalances ? \"••••\" : fmt(rawBalance, decimals)}</div>\n {!hideBalances && usdPrices !== null && (\n <div className=\"text-xs text-muted-foreground tabular-nums\">{fmtUsd(usd(t.symbol))}</div>\n )}\n </div>\n </button>\n );\n })}\n </div>\n </section>\n )}\n\n {(nftItems.length > 0 || loadingNfts) && (\n <section>\n <SectionHeader title=\"NFTs\" />\n <div className=\"mt-2\">\n <NftStrip items={nftItems} isLoading={loadingNfts} onNavigate={onClose} resolveImage={resolveImage} />\n </div>\n </section>\n )}\n\n {activated && (\n <SuccessDialog\n title={successMessages.walletActivated().title}\n message={successMessages.walletActivated().description}\n onClose={() => setActivated(false)}\n />\n )}\n\n <a\n href={externalWallet.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-auto text-center text-xs text-muted-foreground/60 transition-colors hover:text-muted-foreground\"\n >\n {externalWallet.label}\n </a>\n </main>\n );\n}\n\nfunction ArrowUp() {\n return (\n <svg width=\"19\" height=\"19\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 19V5M5 12l7-7 7 7\" />\n </svg>\n );\n}\nfunction ArrowDown() {\n return (\n <svg width=\"19\" height=\"19\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 5v14M19 12l-7 7-7-7\" />\n </svg>\n );\n}\nfunction ActivityIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.1\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M22 12h-4l-3 9L9 3l-3 9H2\" />\n </svg>\n );\n}\nfunction MailIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"text-brand-orange\">\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" />\n <path d=\"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\" />\n </svg>\n );\n}\nfunction RocketIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.1\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 00-2.91-.09z\" />\n <path d=\"M12 15l-3-3a22 22 0 012-3.95A12.88 12.88 0 0122 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 01-4 2z\" />\n <path d=\"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\" />\n </svg>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/components/media-wallet/media-wallet-home.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport Link from \"../link.js\";\nimport { useRouter } from \"../router.js\";\nimport { CurrencyIcon } from \"../currency-icon.js\";\nimport { useTokenBalance } from \"../../utils/media-wallet/use-erc20-balance.js\";\nimport { useTokensByOwner } from \"../../utils/use-tokens.js\";\nimport { BRAND_COLOR } from \"../../data/brand.js\";\nimport { ActivateCard } from \"./activate-card.js\";\nimport { QuickAction } from \"./quick-action.js\";\nimport { ReceiveCard } from \"./receive-card.js\";\nimport { ActionModal } from \"./action-modal.js\";\nimport { SectionHeader } from \"./section-header.js\";\nimport { SuccessDialog } from \"./success-dialog.js\";\nimport { MediaWalletHeader } from \"./media-wallet-header.js\";\nimport { WALLET_TOKENS, type WalletToken } from \"../../utils/media-wallet/wallet-tokens.js\";\nimport { pickNftItems } from \"../../utils/media-wallet/nft-items.js\";\nimport { NftStrip } from \"./nft-strip.js\";\nimport { useUsdPrices, usdPriceFor } from \"../../utils/use-usd-prices.js\";\nimport { fmt, fmtUsd, rawToNumber } from \"../../utils/media-wallet/wallet-format.js\";\nimport { successMessages } from \"../../utils/success-messages.js\";\nimport { useMediaWalletApp, type MediaWalletView } from \"./types.js\";\n\nexport function MediaWalletHome({\n onNavigate,\n onClose,\n autoOpenReceive,\n}: {\n onNavigate: (view: MediaWalletView) => void;\n onClose: () => void;\n autoOpenReceive?: boolean;\n}) {\n const { useWalletSession, useEmailStatus, resolveImage, emailBanner, externalWallet } = useMediaWalletApp();\n const { address, isDeployed } = useWalletSession();\n const emailStatus = useEmailStatus();\n const router = useRouter();\n const needsEmailVerification = !!emailStatus?.email && !emailStatus.emailVerified;\n\n const balances: Record<WalletToken[\"symbol\"], ReturnType<typeof useTokenBalance>> = {\n STRK: useTokenBalance(\"STRK\", address),\n ETH: useTokenBalance(\"ETH\", address),\n USDC: useTokenBalance(\"USDC\", address),\n WBTC: useTokenBalance(\"WBTC\", address),\n };\n\n const { tokens, isLoading: loadingNfts } = useTokensByOwner(address, 1, 6);\n const nftItems = pickNftItems(tokens, 6);\n\n const usdPrices = useUsdPrices();\n const [panel, setPanel] = useState<\"receive\" | null>(autoOpenReceive ? \"receive\" : null);\n const [hideBalances, setHideBalances] = useState(false);\n const [activated, setActivated] = useState(false);\n const [pull, setPull] = useState(0);\n const startY = useRef<number | null>(null);\n const mainRef = useRef<HTMLElement>(null);\n\n useEffect(() => {\n setHideBalances(localStorage.getItem(\"mediawallet.hideBalances\") === \"1\");\n }, []);\n\n const scrollParent = () => mainRef.current?.parentElement ?? null;\n const onTouchStart = (e: React.TouchEvent) => {\n const sc = scrollParent();\n startY.current = sc && sc.scrollTop <= 0 ? e.touches[0].clientY : null;\n };\n const onTouchMove = (e: React.TouchEvent) => {\n if (startY.current == null) return;\n const dy = e.touches[0].clientY - startY.current;\n if (dy > 0) setPull(Math.min(dy * 0.5, 90));\n };\n const onTouchEnd = () => {\n setPull(0);\n startY.current = null;\n };\n\n const usd = (symbol: WalletToken[\"symbol\"]) => {\n const { rawBalance, decimals } = balances[symbol];\n return rawToNumber(rawBalance, decimals) * (usdPriceFor(usdPrices, symbol) ?? 0);\n };\n const totalUsd = WALLET_TOKENS.reduce((sum, t) => sum + usd(t.symbol), 0);\n const heldTokens = WALLET_TOKENS.filter((t) => (balances[t.symbol].rawBalance ?? 0n) > 0n);\n\n const strkBalance = balances.STRK.rawBalance;\n const funded = strkBalance != null && strkBalance > 0n;\n const canSend = isDeployed === true && funded;\n\n const goLaunch = () => {\n onClose();\n router.push(\"/launchpad\");\n };\n\n return (\n <main\n ref={mainRef}\n onTouchStart={onTouchStart}\n onTouchMove={onTouchMove}\n onTouchEnd={onTouchEnd}\n className=\"relative flex min-h-full flex-col gap-6 px-5 pb-8 pt-2\"\n style={{ transform: pull ? `translateY(${pull}px)` : undefined, transition: pull ? \"none\" : \"transform 0.2s ease\" }}\n >\n {address && (\n <div className=\"flex flex-col items-center gap-4\">\n <MediaWalletHeader address={address} onNavigate={onClose} />\n {(funded || isDeployed === false) && (\n <span className=\"font-[family-name:var(--font-display)] text-5xl font-extrabold tracking-tight tabular-nums\">\n {hideBalances ? \"••••\" : usdPrices === null ? \"…\" : fmtUsd(totalUsd)}\n </span>\n )}\n </div>\n )}\n\n {funded ? (\n <div className=\"grid grid-cols-4 gap-2\">\n <QuickAction label=\"Send\" action=\"buy\" disabled={!canSend} onClick={() => onNavigate({ name: \"send\" })} icon={<ArrowUp />} />\n <QuickAction label=\"Receive\" action=\"offer\" onClick={() => setPanel(panel === \"receive\" ? null : \"receive\")} icon={<ArrowDown />} />\n <QuickAction label=\"Launch\" action=\"remix\" onClick={goLaunch} icon={<RocketIcon />} />\n <QuickAction label=\"Activity\" action=\"submit\" onClick={() => onNavigate({ name: \"activity\" })} icon={<ActivityIcon />} />\n </div>\n ) : isDeployed === null ? (\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-col items-center gap-3 py-2\">\n <div className=\"h-3 w-16 animate-pulse rounded bg-foreground/[0.06]\" />\n <div className=\"h-11 w-32 animate-pulse rounded bg-foreground/[0.06]\" />\n <div className=\"h-[48px] w-40 animate-pulse rounded-[13px] bg-foreground/[0.06]\" />\n </div>\n <div className=\"h-[148px] animate-pulse rounded-[20px] bg-foreground/[0.04]\" />\n </div>\n ) : (\n isDeployed === true && (\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-col items-center gap-3 py-2\">\n <span className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">Balance</span>\n <span className=\"font-[family-name:var(--font-display)] text-5xl font-extrabold tracking-tight tabular-nums\">\n {hideBalances ? \"••••\" : usdPrices === null ? \"…\" : fmtUsd(totalUsd)}\n </span>\n <button\n onClick={() => setPanel(panel === \"receive\" ? null : \"receive\")}\n className=\"h-[48px] rounded-[13px] px-8 text-[15px] font-semibold text-white transition-transform active:scale-[0.99]\"\n style={{ background: `linear-gradient(115deg, ${BRAND_COLOR.blue}, ${BRAND_COLOR.purple})` }}\n >\n Fund your account\n </button>\n </div>\n <button\n onClick={goLaunch}\n className=\"flex flex-col items-center gap-2 rounded-[20px] border-2 border-dashed border-border px-6 py-8 text-center transition-colors hover:border-primary/50 active:scale-[0.99]\"\n >\n <div className=\"grid h-11 w-11 place-items-center rounded-full bg-foreground/[0.06]\">\n <RocketIcon />\n </div>\n <span className=\"text-[15px] font-semibold text-foreground\">Creator Launchpad</span>\n <span className=\"text-xs text-muted-foreground\">Protect and monetize your work</span>\n </button>\n </div>\n )\n )}\n\n {isDeployed === false && <ActivateCard onActivated={() => setActivated(true)} />}\n\n {needsEmailVerification && (\n <Link\n href={emailBanner.href}\n onClick={onClose}\n className=\"flex items-center gap-3 rounded-2xl px-4 py-3 transition-opacity hover:opacity-90\"\n style={{ background: \"linear-gradient(115deg, hsl(var(--brand-orange) / 0.12), hsl(var(--brand-maeve, 327 64% 67%) / 0.12))\" }}\n >\n <div className=\"grid h-9 w-9 shrink-0 place-items-center rounded-full bg-brand-orange/15\">\n <MailIcon />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold\">Verify your email</div>\n <div className=\"text-xs text-muted-foreground\">{emailBanner.text(emailStatus?.deadline)}</div>\n </div>\n </Link>\n )}\n\n {panel === \"receive\" && address && (\n <ActionModal onClose={() => setPanel(null)}>\n <ReceiveCard address={address} />\n </ActionModal>\n )}\n\n {heldTokens.length > 0 && (\n <section>\n <SectionHeader title=\"Tokens\" />\n <div className=\"mt-2 flex flex-col gap-2\">\n {heldTokens.map((t) => {\n const { rawBalance, decimals } = balances[t.symbol];\n return (\n <button\n key={t.symbol}\n onClick={() => onNavigate({ name: \"token\", token: t })}\n className=\"flex items-center gap-3 rounded-2xl bg-card/40 px-4 py-3 text-left backdrop-blur-sm transition-colors hover:bg-card/60\"\n >\n <div className=\"grid h-11 w-11 shrink-0 place-items-center rounded-full bg-foreground/[0.06]\">\n <CurrencyIcon symbol={t.symbol} size={24} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"text-sm font-semibold\">{t.symbol}</div>\n <div className=\"text-xs text-muted-foreground\">{t.name}</div>\n </div>\n <div className=\"text-right\">\n <div className=\"text-sm font-semibold tabular-nums\">{hideBalances ? \"••••\" : fmt(rawBalance, decimals)}</div>\n {!hideBalances && usdPrices !== null && (\n <div className=\"text-xs text-muted-foreground tabular-nums\">{fmtUsd(usd(t.symbol))}</div>\n )}\n </div>\n </button>\n );\n })}\n </div>\n </section>\n )}\n\n {(nftItems.length > 0 || loadingNfts) && (\n <section>\n <SectionHeader title=\"NFTs\" />\n <div className=\"mt-2\">\n <NftStrip items={nftItems} isLoading={loadingNfts} onNavigate={onClose} resolveImage={resolveImage} />\n </div>\n </section>\n )}\n\n {activated && (\n <SuccessDialog\n title={successMessages.walletActivated().title}\n message={successMessages.walletActivated().description}\n onClose={() => setActivated(false)}\n />\n )}\n\n <a\n href={externalWallet.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-auto text-center text-xs text-muted-foreground/60 transition-colors hover:text-muted-foreground\"\n >\n {externalWallet.label}\n </a>\n </main>\n );\n}\n\nfunction ArrowUp() {\n return (\n <svg width=\"19\" height=\"19\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 19V5M5 12l7-7 7 7\" />\n </svg>\n );\n}\nfunction ArrowDown() {\n return (\n <svg width=\"19\" height=\"19\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M12 5v14M19 12l-7 7-7-7\" />\n </svg>\n );\n}\nfunction ActivityIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.1\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M22 12h-4l-3 9L9 3l-3 9H2\" />\n </svg>\n );\n}\nfunction MailIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"text-brand-orange\">\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" />\n <path d=\"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\" />\n </svg>\n );\n}\nfunction RocketIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.1\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 00-2.91-.09z\" />\n <path d=\"M12 15l-3-3a22 22 0 012-3.95A12.88 12.88 0 0122 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 01-4 2z\" />\n <path d=\"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5\" />\n </svg>\n );\n}\n"],"mappings":"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","names":[]}
@@ -23,7 +23,7 @@ __export(quick_action_exports, {
23
23
  });
24
24
  module.exports = __toCommonJS(quick_action_exports);
25
25
  var import_jsx_runtime = require("react/jsx-runtime");
26
- var import_action_button = require("./action-button.js");
26
+ var import_brand = require("../../data/brand.js");
27
27
  function QuickAction({
28
28
  label,
29
29
  icon,
@@ -31,7 +31,7 @@ function QuickAction({
31
31
  onClick,
32
32
  disabled
33
33
  }) {
34
- const grad = `linear-gradient(115deg, ${import_action_button.ACTION_GRADIENTS[action].join(",")})`;
34
+ const grad = `linear-gradient(115deg, ${import_brand.ACTION_GRADIENTS[action].join(",")})`;
35
35
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
36
36
  "button",
37
37
  {
@@ -43,7 +43,7 @@ function QuickAction({
43
43
  "span",
44
44
  {
45
45
  className: "ml-gbtn relative grid h-12 w-12 place-items-center rounded-[15px] bg-transparent transition-transform group-active:scale-95",
46
- style: { "--ml-grad": grad, color: import_action_button.ACTION_FOREGROUNDS[action] },
46
+ style: { "--ml-grad": grad, color: import_brand.ACTION_FOREGROUNDS[action] },
47
47
  children: icon
48
48
  }
49
49
  ),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/media-wallet/quick-action.tsx"],"sourcesContent":["\"use client\";\n\nimport { ACTION_GRADIENTS, ACTION_FOREGROUNDS } from \"./action-button.js\";\n\nexport function QuickAction({\n label,\n icon,\n action,\n onClick,\n disabled,\n}: {\n label: string;\n icon: React.ReactNode;\n action: keyof typeof ACTION_GRADIENTS;\n onClick?: () => void;\n disabled?: boolean;\n}) {\n const grad = `linear-gradient(115deg, ${ACTION_GRADIENTS[action].join(\",\")})`;\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={`group flex flex-col items-center gap-1.5 ${disabled ? \"pointer-events-none opacity-40\" : \"\"}`}\n >\n <span\n className=\"ml-gbtn relative grid h-12 w-12 place-items-center rounded-[15px] bg-transparent transition-transform group-active:scale-95\"\n style={{ \"--ml-grad\": grad, color: ACTION_FOREGROUNDS[action] } as React.CSSProperties}\n >\n {icon}\n </span>\n <span className=\"text-2xs font-medium text-muted-foreground\">{label}</span>\n </button>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBI;AAjBJ,2BAAqD;AAE9C,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,QAAM,OAAO,2BAA2B,sCAAiB,MAAM,EAAE,KAAK,GAAG,CAAC;AAC1E,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,WAAW,4CAA4C,WAAW,mCAAmC,EAAE;AAAA,MAEvG;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,aAAa,MAAM,OAAO,wCAAmB,MAAM,EAAE;AAAA,YAE7D;AAAA;AAAA,QACH;AAAA,QACA,4CAAC,UAAK,WAAU,8CAA8C,iBAAM;AAAA;AAAA;AAAA,EACtE;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/media-wallet/quick-action.tsx"],"sourcesContent":["\"use client\";\n\nimport { ACTION_GRADIENTS, ACTION_FOREGROUNDS } from \"../../data/brand.js\";\n\nexport function QuickAction({\n label,\n icon,\n action,\n onClick,\n disabled,\n}: {\n label: string;\n icon: React.ReactNode;\n action: keyof typeof ACTION_GRADIENTS;\n onClick?: () => void;\n disabled?: boolean;\n}) {\n const grad = `linear-gradient(115deg, ${ACTION_GRADIENTS[action].join(\",\")})`;\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={`group flex flex-col items-center gap-1.5 ${disabled ? \"pointer-events-none opacity-40\" : \"\"}`}\n >\n <span\n className=\"ml-gbtn relative grid h-12 w-12 place-items-center rounded-[15px] bg-transparent transition-transform group-active:scale-95\"\n style={{ \"--ml-grad\": grad, color: ACTION_FOREGROUNDS[action] } as React.CSSProperties}\n >\n {icon}\n </span>\n <span className=\"text-2xs font-medium text-muted-foreground\">{label}</span>\n </button>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBI;AAjBJ,mBAAqD;AAE9C,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,QAAM,OAAO,2BAA2B,8BAAiB,MAAM,EAAE,KAAK,GAAG,CAAC;AAC1E,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,WAAW,4CAA4C,WAAW,mCAAmC,EAAE;AAAA,MAEvG;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,aAAa,MAAM,OAAO,gCAAmB,MAAM,EAAE;AAAA,YAE7D;AAAA;AAAA,QACH;AAAA,QACA,4CAAC,UAAK,WAAU,8CAA8C,iBAAM;AAAA;AAAA;AAAA,EACtE;AAEJ;","names":[]}
@@ -1,5 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { ACTION_GRADIENTS } from './action-button.cjs';
2
+ import { ACTION_GRADIENTS } from '../../data/brand.cjs';
3
3
 
4
4
  declare function QuickAction({ label, icon, action, onClick, disabled, }: {
5
5
  label: string;
@@ -1,5 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { ACTION_GRADIENTS } from './action-button.js';
2
+ import { ACTION_GRADIENTS } from '../../data/brand.js';
3
3
 
4
4
  declare function QuickAction({ label, icon, action, onClick, disabled, }: {
5
5
  label: string;
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
- import { ACTION_GRADIENTS, ACTION_FOREGROUNDS } from "./action-button.js";
3
+ import { ACTION_GRADIENTS, ACTION_FOREGROUNDS } from "../../data/brand.js";
4
4
  function QuickAction({
5
5
  label,
6
6
  icon,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/media-wallet/quick-action.tsx"],"sourcesContent":["\"use client\";\n\nimport { ACTION_GRADIENTS, ACTION_FOREGROUNDS } from \"./action-button.js\";\n\nexport function QuickAction({\n label,\n icon,\n action,\n onClick,\n disabled,\n}: {\n label: string;\n icon: React.ReactNode;\n action: keyof typeof ACTION_GRADIENTS;\n onClick?: () => void;\n disabled?: boolean;\n}) {\n const grad = `linear-gradient(115deg, ${ACTION_GRADIENTS[action].join(\",\")})`;\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={`group flex flex-col items-center gap-1.5 ${disabled ? \"pointer-events-none opacity-40\" : \"\"}`}\n >\n <span\n className=\"ml-gbtn relative grid h-12 w-12 place-items-center rounded-[15px] bg-transparent transition-transform group-active:scale-95\"\n style={{ \"--ml-grad\": grad, color: ACTION_FOREGROUNDS[action] } as React.CSSProperties}\n >\n {icon}\n </span>\n <span className=\"text-2xs font-medium text-muted-foreground\">{label}</span>\n </button>\n );\n}\n"],"mappings":";AAmBI,SAKE,KALF;AAjBJ,SAAS,kBAAkB,0BAA0B;AAE9C,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,QAAM,OAAO,2BAA2B,iBAAiB,MAAM,EAAE,KAAK,GAAG,CAAC;AAC1E,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,WAAW,4CAA4C,WAAW,mCAAmC,EAAE;AAAA,MAEvG;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,aAAa,MAAM,OAAO,mBAAmB,MAAM,EAAE;AAAA,YAE7D;AAAA;AAAA,QACH;AAAA,QACA,oBAAC,UAAK,WAAU,8CAA8C,iBAAM;AAAA;AAAA;AAAA,EACtE;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/media-wallet/quick-action.tsx"],"sourcesContent":["\"use client\";\n\nimport { ACTION_GRADIENTS, ACTION_FOREGROUNDS } from \"../../data/brand.js\";\n\nexport function QuickAction({\n label,\n icon,\n action,\n onClick,\n disabled,\n}: {\n label: string;\n icon: React.ReactNode;\n action: keyof typeof ACTION_GRADIENTS;\n onClick?: () => void;\n disabled?: boolean;\n}) {\n const grad = `linear-gradient(115deg, ${ACTION_GRADIENTS[action].join(\",\")})`;\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={`group flex flex-col items-center gap-1.5 ${disabled ? \"pointer-events-none opacity-40\" : \"\"}`}\n >\n <span\n className=\"ml-gbtn relative grid h-12 w-12 place-items-center rounded-[15px] bg-transparent transition-transform group-active:scale-95\"\n style={{ \"--ml-grad\": grad, color: ACTION_FOREGROUNDS[action] } as React.CSSProperties}\n >\n {icon}\n </span>\n <span className=\"text-2xs font-medium text-muted-foreground\">{label}</span>\n </button>\n );\n}\n"],"mappings":";AAmBI,SAKE,KALF;AAjBJ,SAAS,kBAAkB,0BAA0B;AAE9C,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,QAAM,OAAO,2BAA2B,iBAAiB,MAAM,EAAE,KAAK,GAAG,CAAC;AAC1E,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,WAAW,4CAA4C,WAAW,mCAAmC,EAAE;AAAA,MAEvG;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,EAAE,aAAa,MAAM,OAAO,mBAAmB,MAAM,EAAE;AAAA,YAE7D;AAAA;AAAA,QACH;AAAA,QACA,oBAAC,UAAK,WAAU,8CAA8C,iBAAM;AAAA;AAAA;AAAA,EACtE;AAEJ;","names":[]}
@@ -28,8 +28,8 @@ var import_action_button = require("../action-button.js");
28
28
  var import_action_modal = require("./action-modal.js");
29
29
  var import_confetti = require("../../utils/media-wallet/confetti.js");
30
30
  var import_wallet_format = require("../../utils/media-wallet/wallet-format.js");
31
+ var import_brand = require("../../data/brand.js");
31
32
  var import_types = require("./types.js");
32
- const BRAND_GRADIENT = "linear-gradient(115deg, #3b7bff, #8a5cf6, #f6608f, #fb8b46, #3b7bff)";
33
33
  function SuccessDialog({
34
34
  title,
35
35
  message,
@@ -58,7 +58,7 @@ function SuccessDialog({
58
58
  children: "View transaction \u2197"
59
59
  }
60
60
  ),
61
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_action_button.ActionButton, { big: true, onClick: onClose, className: "mt-5 w-full", style: { "--ml-grad": BRAND_GRADIENT }, children: actionLabel })
61
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_action_button.ActionButton, { big: true, onClick: onClose, className: "mt-5 w-full", style: { "--ml-grad": import_brand.BRAND_GRADIENT }, children: actionLabel })
62
62
  ] })
63
63
  ] }) });
64
64
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/media-wallet/success-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect } from \"react\";\nimport { ActionButton } from \"../action-button.js\";\nimport { ActionBackdrop, CanvasPortal } from \"./action-modal.js\";\nimport { fireConfetti } from \"../../utils/media-wallet/confetti.js\";\nimport { explorerTxUrl } from \"../../utils/media-wallet/wallet-format.js\";\nimport { useMediaWalletApp } from \"./types.js\";\n\nconst BRAND_GRADIENT = \"linear-gradient(115deg, #3b7bff, #8a5cf6, #f6608f, #fb8b46, #3b7bff)\";\n\nexport function SuccessDialog({\n title,\n message,\n actionLabel = \"Done\",\n txHash,\n onClose,\n}: {\n title: string;\n message: string;\n actionLabel?: string;\n txHash?: string;\n onClose: () => void;\n}) {\n const { explorerUrl } = useMediaWalletApp();\n useEffect(() => {\n fireConfetti();\n }, []);\n return (\n <CanvasPortal>\n <div className=\"absolute inset-0 z-[70] grid place-items-center p-6\" onClick={onClose}>\n <ActionBackdrop />\n <div className=\"card-base relative z-10 w-full max-w-[320px] p-6 text-center\" onClick={(e) => e.stopPropagation()}>\n <div role=\"status\">\n <h2 className=\"font-[family-name:var(--font-display)] text-xl font-extrabold tracking-tight\">{title}</h2>\n <p className=\"mt-1.5 text-sm leading-relaxed text-muted-foreground\">{message}</p>\n </div>\n {txHash && (\n <a\n href={explorerTxUrl(explorerUrl, txHash)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-3 inline-block text-xs text-brand-blue hover:underline\"\n >\n View transaction ↗\n </a>\n )}\n <ActionButton big onClick={onClose} className=\"mt-5 w-full\" style={{ \"--ml-grad\": BRAND_GRADIENT } as React.CSSProperties}>\n {actionLabel}\n </ActionButton>\n </div>\n </div>\n </CanvasPortal>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA+BQ;AA7BR,mBAA0B;AAC1B,2BAA6B;AAC7B,0BAA6C;AAC7C,sBAA6B;AAC7B,2BAA8B;AAC9B,mBAAkC;AAElC,MAAM,iBAAiB;AAEhB,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AACF,GAMG;AACD,QAAM,EAAE,YAAY,QAAI,gCAAkB;AAC1C,8BAAU,MAAM;AACd,sCAAa;AAAA,EACf,GAAG,CAAC,CAAC;AACL,SACE,4CAAC,oCACC,uDAAC,SAAI,WAAU,uDAAsD,SAAS,SAC5E;AAAA,gDAAC,sCAAe;AAAA,IAChB,6CAAC,SAAI,WAAU,gEAA+D,SAAS,CAAC,MAAM,EAAE,gBAAgB,GAC9G;AAAA,mDAAC,SAAI,MAAK,UACR;AAAA,oDAAC,QAAG,WAAU,gFAAgF,iBAAM;AAAA,QACpG,4CAAC,OAAE,WAAU,wDAAwD,mBAAQ;AAAA,SAC/E;AAAA,MACC,UACC;AAAA,QAAC;AAAA;AAAA,UACC,UAAM,oCAAc,aAAa,MAAM;AAAA,UACvC,QAAO;AAAA,UACP,KAAI;AAAA,UACJ,WAAU;AAAA,UACX;AAAA;AAAA,MAED;AAAA,MAEF,4CAAC,qCAAa,KAAG,MAAC,SAAS,SAAS,WAAU,eAAc,OAAO,EAAE,aAAa,eAAe,GAC9F,uBACH;AAAA,OACF;AAAA,KACF,GACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/media-wallet/success-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect } from \"react\";\nimport { ActionButton } from \"../action-button.js\";\nimport { ActionBackdrop, CanvasPortal } from \"./action-modal.js\";\nimport { fireConfetti } from \"../../utils/media-wallet/confetti.js\";\nimport { explorerTxUrl } from \"../../utils/media-wallet/wallet-format.js\";\nimport { BRAND_GRADIENT } from \"../../data/brand.js\";\nimport { useMediaWalletApp } from \"./types.js\";\n\nexport function SuccessDialog({\n title,\n message,\n actionLabel = \"Done\",\n txHash,\n onClose,\n}: {\n title: string;\n message: string;\n actionLabel?: string;\n txHash?: string;\n onClose: () => void;\n}) {\n const { explorerUrl } = useMediaWalletApp();\n useEffect(() => {\n fireConfetti();\n }, []);\n return (\n <CanvasPortal>\n <div className=\"absolute inset-0 z-[70] grid place-items-center p-6\" onClick={onClose}>\n <ActionBackdrop />\n <div className=\"card-base relative z-10 w-full max-w-[320px] p-6 text-center\" onClick={(e) => e.stopPropagation()}>\n <div role=\"status\">\n <h2 className=\"font-[family-name:var(--font-display)] text-xl font-extrabold tracking-tight\">{title}</h2>\n <p className=\"mt-1.5 text-sm leading-relaxed text-muted-foreground\">{message}</p>\n </div>\n {txHash && (\n <a\n href={explorerTxUrl(explorerUrl, txHash)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-3 inline-block text-xs text-brand-blue hover:underline\"\n >\n View transaction ↗\n </a>\n )}\n <ActionButton big onClick={onClose} className=\"mt-5 w-full\" style={{ \"--ml-grad\": BRAND_GRADIENT } as React.CSSProperties}>\n {actionLabel}\n </ActionButton>\n </div>\n </div>\n </CanvasPortal>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA8BQ;AA5BR,mBAA0B;AAC1B,2BAA6B;AAC7B,0BAA6C;AAC7C,sBAA6B;AAC7B,2BAA8B;AAC9B,mBAA+B;AAC/B,mBAAkC;AAE3B,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AACF,GAMG;AACD,QAAM,EAAE,YAAY,QAAI,gCAAkB;AAC1C,8BAAU,MAAM;AACd,sCAAa;AAAA,EACf,GAAG,CAAC,CAAC;AACL,SACE,4CAAC,oCACC,uDAAC,SAAI,WAAU,uDAAsD,SAAS,SAC5E;AAAA,gDAAC,sCAAe;AAAA,IAChB,6CAAC,SAAI,WAAU,gEAA+D,SAAS,CAAC,MAAM,EAAE,gBAAgB,GAC9G;AAAA,mDAAC,SAAI,MAAK,UACR;AAAA,oDAAC,QAAG,WAAU,gFAAgF,iBAAM;AAAA,QACpG,4CAAC,OAAE,WAAU,wDAAwD,mBAAQ;AAAA,SAC/E;AAAA,MACC,UACC;AAAA,QAAC;AAAA;AAAA,UACC,UAAM,oCAAc,aAAa,MAAM;AAAA,UACvC,QAAO;AAAA,UACP,KAAI;AAAA,UACJ,WAAU;AAAA,UACX;AAAA;AAAA,MAED;AAAA,MAEF,4CAAC,qCAAa,KAAG,MAAC,SAAS,SAAS,WAAU,eAAc,OAAO,EAAE,aAAa,4BAAe,GAC9F,uBACH;AAAA,OACF;AAAA,KACF,GACF;AAEJ;","names":[]}
@@ -5,8 +5,8 @@ import { ActionButton } from "../action-button.js";
5
5
  import { ActionBackdrop, CanvasPortal } from "./action-modal.js";
6
6
  import { fireConfetti } from "../../utils/media-wallet/confetti.js";
7
7
  import { explorerTxUrl } from "../../utils/media-wallet/wallet-format.js";
8
+ import { BRAND_GRADIENT } from "../../data/brand.js";
8
9
  import { useMediaWalletApp } from "./types.js";
9
- const BRAND_GRADIENT = "linear-gradient(115deg, #3b7bff, #8a5cf6, #f6608f, #fb8b46, #3b7bff)";
10
10
  function SuccessDialog({
11
11
  title,
12
12
  message,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/media-wallet/success-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect } from \"react\";\nimport { ActionButton } from \"../action-button.js\";\nimport { ActionBackdrop, CanvasPortal } from \"./action-modal.js\";\nimport { fireConfetti } from \"../../utils/media-wallet/confetti.js\";\nimport { explorerTxUrl } from \"../../utils/media-wallet/wallet-format.js\";\nimport { useMediaWalletApp } from \"./types.js\";\n\nconst BRAND_GRADIENT = \"linear-gradient(115deg, #3b7bff, #8a5cf6, #f6608f, #fb8b46, #3b7bff)\";\n\nexport function SuccessDialog({\n title,\n message,\n actionLabel = \"Done\",\n txHash,\n onClose,\n}: {\n title: string;\n message: string;\n actionLabel?: string;\n txHash?: string;\n onClose: () => void;\n}) {\n const { explorerUrl } = useMediaWalletApp();\n useEffect(() => {\n fireConfetti();\n }, []);\n return (\n <CanvasPortal>\n <div className=\"absolute inset-0 z-[70] grid place-items-center p-6\" onClick={onClose}>\n <ActionBackdrop />\n <div className=\"card-base relative z-10 w-full max-w-[320px] p-6 text-center\" onClick={(e) => e.stopPropagation()}>\n <div role=\"status\">\n <h2 className=\"font-[family-name:var(--font-display)] text-xl font-extrabold tracking-tight\">{title}</h2>\n <p className=\"mt-1.5 text-sm leading-relaxed text-muted-foreground\">{message}</p>\n </div>\n {txHash && (\n <a\n href={explorerTxUrl(explorerUrl, txHash)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-3 inline-block text-xs text-brand-blue hover:underline\"\n >\n View transaction ↗\n </a>\n )}\n <ActionButton big onClick={onClose} className=\"mt-5 w-full\" style={{ \"--ml-grad\": BRAND_GRADIENT } as React.CSSProperties}>\n {actionLabel}\n </ActionButton>\n </div>\n </div>\n </CanvasPortal>\n );\n}\n"],"mappings":";AA+BQ,cAEE,YAFF;AA7BR,SAAS,iBAAiB;AAC1B,SAAS,oBAAoB;AAC7B,SAAS,gBAAgB,oBAAoB;AAC7C,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,yBAAyB;AAElC,MAAM,iBAAiB;AAEhB,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AACF,GAMG;AACD,QAAM,EAAE,YAAY,IAAI,kBAAkB;AAC1C,YAAU,MAAM;AACd,iBAAa;AAAA,EACf,GAAG,CAAC,CAAC;AACL,SACE,oBAAC,gBACC,+BAAC,SAAI,WAAU,uDAAsD,SAAS,SAC5E;AAAA,wBAAC,kBAAe;AAAA,IAChB,qBAAC,SAAI,WAAU,gEAA+D,SAAS,CAAC,MAAM,EAAE,gBAAgB,GAC9G;AAAA,2BAAC,SAAI,MAAK,UACR;AAAA,4BAAC,QAAG,WAAU,gFAAgF,iBAAM;AAAA,QACpG,oBAAC,OAAE,WAAU,wDAAwD,mBAAQ;AAAA,SAC/E;AAAA,MACC,UACC;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,cAAc,aAAa,MAAM;AAAA,UACvC,QAAO;AAAA,UACP,KAAI;AAAA,UACJ,WAAU;AAAA,UACX;AAAA;AAAA,MAED;AAAA,MAEF,oBAAC,gBAAa,KAAG,MAAC,SAAS,SAAS,WAAU,eAAc,OAAO,EAAE,aAAa,eAAe,GAC9F,uBACH;AAAA,OACF;AAAA,KACF,GACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/media-wallet/success-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect } from \"react\";\nimport { ActionButton } from \"../action-button.js\";\nimport { ActionBackdrop, CanvasPortal } from \"./action-modal.js\";\nimport { fireConfetti } from \"../../utils/media-wallet/confetti.js\";\nimport { explorerTxUrl } from \"../../utils/media-wallet/wallet-format.js\";\nimport { BRAND_GRADIENT } from \"../../data/brand.js\";\nimport { useMediaWalletApp } from \"./types.js\";\n\nexport function SuccessDialog({\n title,\n message,\n actionLabel = \"Done\",\n txHash,\n onClose,\n}: {\n title: string;\n message: string;\n actionLabel?: string;\n txHash?: string;\n onClose: () => void;\n}) {\n const { explorerUrl } = useMediaWalletApp();\n useEffect(() => {\n fireConfetti();\n }, []);\n return (\n <CanvasPortal>\n <div className=\"absolute inset-0 z-[70] grid place-items-center p-6\" onClick={onClose}>\n <ActionBackdrop />\n <div className=\"card-base relative z-10 w-full max-w-[320px] p-6 text-center\" onClick={(e) => e.stopPropagation()}>\n <div role=\"status\">\n <h2 className=\"font-[family-name:var(--font-display)] text-xl font-extrabold tracking-tight\">{title}</h2>\n <p className=\"mt-1.5 text-sm leading-relaxed text-muted-foreground\">{message}</p>\n </div>\n {txHash && (\n <a\n href={explorerTxUrl(explorerUrl, txHash)}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-3 inline-block text-xs text-brand-blue hover:underline\"\n >\n View transaction ↗\n </a>\n )}\n <ActionButton big onClick={onClose} className=\"mt-5 w-full\" style={{ \"--ml-grad\": BRAND_GRADIENT } as React.CSSProperties}>\n {actionLabel}\n </ActionButton>\n </div>\n </div>\n </CanvasPortal>\n );\n}\n"],"mappings":";AA8BQ,cAEE,YAFF;AA5BR,SAAS,iBAAiB;AAC1B,SAAS,oBAAoB;AAC7B,SAAS,gBAAgB,oBAAoB;AAC7C,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,sBAAsB;AAC/B,SAAS,yBAAyB;AAE3B,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AACF,GAMG;AACD,QAAM,EAAE,YAAY,IAAI,kBAAkB;AAC1C,YAAU,MAAM;AACd,iBAAa;AAAA,EACf,GAAG,CAAC,CAAC;AACL,SACE,oBAAC,gBACC,+BAAC,SAAI,WAAU,uDAAsD,SAAS,SAC5E;AAAA,wBAAC,kBAAe;AAAA,IAChB,qBAAC,SAAI,WAAU,gEAA+D,SAAS,CAAC,MAAM,EAAE,gBAAgB,GAC9G;AAAA,2BAAC,SAAI,MAAK,UACR;AAAA,4BAAC,QAAG,WAAU,gFAAgF,iBAAM;AAAA,QACpG,oBAAC,OAAE,WAAU,wDAAwD,mBAAQ;AAAA,SAC/E;AAAA,MACC,UACC;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,cAAc,aAAa,MAAM;AAAA,UACvC,QAAO;AAAA,UACP,KAAI;AAAA,UACJ,WAAU;AAAA,UACX;AAAA;AAAA,MAED;AAAA,MAEF,oBAAC,gBAAa,KAAG,MAAC,SAAS,SAAS,WAAU,eAAc,OAAO,EAAE,aAAa,eAAe,GAC9F,uBACH;AAAA,OACF;AAAA,KACF,GACF;AAEJ;","names":[]}