@medialane/ui 0.184.0 → 0.186.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/drop/create/drop-create.cjs +6 -4
- package/dist/components/drop/create/drop-create.cjs.map +1 -1
- package/dist/components/drop/create/drop-create.d.cts +4 -6
- package/dist/components/drop/create/drop-create.d.ts +4 -6
- package/dist/components/drop/create/drop-create.js +6 -4
- package/dist/components/drop/create/drop-create.js.map +1 -1
- package/dist/components/drop/create/launch-dialog.cjs +4 -1
- package/dist/components/drop/create/launch-dialog.cjs.map +1 -1
- package/dist/components/drop/create/launch-dialog.js +5 -2
- package/dist/components/drop/create/launch-dialog.js.map +1 -1
- package/dist/components/drop/create/sale-section.cjs +2 -2
- package/dist/components/drop/create/sale-section.cjs.map +1 -1
- package/dist/components/drop/create/sale-section.d.cts +3 -3
- package/dist/components/drop/create/sale-section.d.ts +3 -3
- package/dist/components/drop/create/sale-section.js +2 -2
- package/dist/components/drop/create/sale-section.js.map +1 -1
- package/dist/components/drop/drop-card.cjs +2 -2
- package/dist/components/drop/drop-card.cjs.map +1 -1
- package/dist/components/drop/drop-card.js +1 -1
- package/dist/components/drop/drop-card.js.map +1 -1
- package/dist/components/drop/drop-features.cjs +44 -0
- package/dist/components/drop/drop-features.cjs.map +1 -0
- package/dist/components/drop/drop-features.d.cts +5 -0
- package/dist/components/drop/drop-features.d.ts +5 -0
- package/dist/components/drop/drop-features.js +20 -0
- package/dist/components/drop/drop-features.js.map +1 -0
- package/dist/components/{drop-status-display.cjs → drop/drop-status.cjs} +5 -5
- package/dist/components/drop/drop-status.cjs.map +1 -0
- package/dist/components/{drop-status-display.d.ts → drop/drop-status.d.cts} +1 -2
- package/dist/components/{drop-status-display.d.cts → drop/drop-status.d.ts} +1 -2
- package/dist/components/{drop-status-display.js → drop/drop-status.js} +2 -2
- package/dist/components/drop/drop-status.js.map +1 -0
- package/dist/components/drop/page/drop-action-box.cjs +3 -3
- package/dist/components/drop/page/drop-action-box.cjs.map +1 -1
- package/dist/components/drop/page/drop-action-box.d.cts +0 -1
- package/dist/components/drop/page/drop-action-box.d.ts +0 -1
- package/dist/components/drop/page/drop-action-box.js +1 -1
- package/dist/components/drop/page/drop-action-box.js.map +1 -1
- package/dist/components/drop/page/drop-page.cjs +6 -4
- package/dist/components/drop/page/drop-page.cjs.map +1 -1
- package/dist/components/drop/page/drop-page.d.cts +1 -2
- package/dist/components/drop/page/drop-page.d.ts +1 -2
- package/dist/components/drop/page/drop-page.js +7 -5
- package/dist/components/drop/page/drop-page.js.map +1 -1
- package/dist/components/media-wallet/action-button.cjs +54 -0
- package/dist/components/media-wallet/action-button.cjs.map +1 -0
- package/dist/components/media-wallet/action-button.d.cts +10 -0
- package/dist/components/media-wallet/action-button.d.ts +10 -0
- package/dist/components/media-wallet/action-button.js +28 -0
- package/dist/components/media-wallet/action-button.js.map +1 -0
- package/dist/components/media-wallet/action-modal.cjs +84 -0
- package/dist/components/media-wallet/action-modal.cjs.map +1 -0
- package/dist/components/media-wallet/action-modal.d.cts +20 -0
- package/dist/components/media-wallet/action-modal.d.ts +20 -0
- package/dist/components/media-wallet/action-modal.js +56 -0
- package/dist/components/media-wallet/action-modal.js.map +1 -0
- package/dist/components/media-wallet/activate-card.cjs +72 -0
- package/dist/components/media-wallet/activate-card.cjs.map +1 -0
- package/dist/components/media-wallet/activate-card.d.cts +7 -0
- package/dist/components/media-wallet/activate-card.d.ts +7 -0
- package/dist/components/media-wallet/activate-card.js +48 -0
- package/dist/components/media-wallet/activate-card.js.map +1 -0
- package/dist/components/media-wallet/address-qr.cjs +64 -0
- package/dist/components/media-wallet/address-qr.cjs.map +1 -0
- package/dist/components/media-wallet/address-qr.d.cts +8 -0
- package/dist/components/media-wallet/address-qr.d.ts +8 -0
- package/dist/components/media-wallet/address-qr.js +30 -0
- package/dist/components/media-wallet/address-qr.js.map +1 -0
- package/dist/components/media-wallet/back-button.cjs +41 -0
- package/dist/components/media-wallet/back-button.cjs.map +1 -0
- package/dist/components/media-wallet/back-button.d.cts +7 -0
- package/dist/components/media-wallet/back-button.d.ts +7 -0
- package/dist/components/media-wallet/back-button.js +17 -0
- package/dist/components/media-wallet/back-button.js.map +1 -0
- package/dist/components/media-wallet/copy-icon.cjs +49 -0
- package/dist/components/media-wallet/copy-icon.cjs.map +1 -0
- package/dist/components/media-wallet/copy-icon.d.cts +7 -0
- package/dist/components/media-wallet/copy-icon.d.ts +7 -0
- package/dist/components/media-wallet/copy-icon.js +25 -0
- package/dist/components/media-wallet/copy-icon.js.map +1 -0
- package/dist/components/media-wallet/currency-sheet.cjs +54 -0
- package/dist/components/media-wallet/currency-sheet.cjs.map +1 -0
- package/dist/components/media-wallet/currency-sheet.d.cts +12 -0
- package/dist/components/media-wallet/currency-sheet.d.ts +12 -0
- package/dist/components/media-wallet/currency-sheet.js +30 -0
- package/dist/components/media-wallet/currency-sheet.js.map +1 -0
- package/dist/components/media-wallet/media-wallet-activity.cjs +223 -0
- package/dist/components/media-wallet/media-wallet-activity.cjs.map +1 -0
- package/dist/components/media-wallet/media-wallet-activity.d.cts +12 -0
- package/dist/components/media-wallet/media-wallet-activity.d.ts +12 -0
- package/dist/components/media-wallet/media-wallet-activity.js +189 -0
- package/dist/components/media-wallet/media-wallet-activity.js.map +1 -0
- package/dist/components/media-wallet/media-wallet-header.cjs +97 -0
- package/dist/components/media-wallet/media-wallet-header.cjs.map +1 -0
- package/dist/components/media-wallet/media-wallet-header.d.cts +8 -0
- package/dist/components/media-wallet/media-wallet-header.d.ts +8 -0
- package/dist/components/media-wallet/media-wallet-header.js +63 -0
- package/dist/components/media-wallet/media-wallet-header.js.map +1 -0
- package/dist/components/media-wallet/media-wallet-home.cjs +258 -0
- package/dist/components/media-wallet/media-wallet-home.cjs.map +1 -0
- package/dist/components/media-wallet/media-wallet-home.d.cts +14 -0
- package/dist/components/media-wallet/media-wallet-home.d.ts +14 -0
- package/dist/components/media-wallet/media-wallet-home.js +224 -0
- package/dist/components/media-wallet/media-wallet-home.js.map +1 -0
- package/dist/components/media-wallet/media-wallet-overlay.cjs +137 -0
- package/dist/components/media-wallet/media-wallet-overlay.cjs.map +1 -0
- package/dist/components/media-wallet/media-wallet-overlay.d.cts +14 -0
- package/dist/components/media-wallet/media-wallet-overlay.d.ts +14 -0
- package/dist/components/media-wallet/media-wallet-overlay.js +102 -0
- package/dist/components/media-wallet/media-wallet-overlay.js.map +1 -0
- package/dist/components/media-wallet/media-wallet-send.cjs +313 -0
- package/dist/components/media-wallet/media-wallet-send.cjs.map +1 -0
- package/dist/components/media-wallet/media-wallet-send.d.cts +14 -0
- package/dist/components/media-wallet/media-wallet-send.d.ts +14 -0
- package/dist/components/media-wallet/media-wallet-send.js +289 -0
- package/dist/components/media-wallet/media-wallet-send.js.map +1 -0
- package/dist/components/media-wallet/media-wallet-token-detail.cjs +164 -0
- package/dist/components/media-wallet/media-wallet-token-detail.cjs.map +1 -0
- package/dist/components/media-wallet/media-wallet-token-detail.d.cts +13 -0
- package/dist/components/media-wallet/media-wallet-token-detail.d.ts +13 -0
- package/dist/components/media-wallet/media-wallet-token-detail.js +140 -0
- package/dist/components/media-wallet/media-wallet-token-detail.js.map +1 -0
- package/dist/components/media-wallet/media-wallet.cjs +51 -0
- package/dist/components/media-wallet/media-wallet.cjs.map +1 -0
- package/dist/components/media-wallet/media-wallet.d.cts +13 -0
- package/dist/components/media-wallet/media-wallet.d.ts +13 -0
- package/dist/components/media-wallet/media-wallet.js +27 -0
- package/dist/components/media-wallet/media-wallet.js.map +1 -0
- package/dist/components/media-wallet/nft-strip.cjs +85 -0
- package/dist/components/media-wallet/nft-strip.cjs.map +1 -0
- package/dist/components/media-wallet/nft-strip.d.cts +12 -0
- package/dist/components/media-wallet/nft-strip.d.ts +12 -0
- package/dist/components/media-wallet/nft-strip.js +51 -0
- package/dist/components/media-wallet/nft-strip.js.map +1 -0
- package/dist/components/media-wallet/quick-action.cjs +59 -0
- package/dist/components/media-wallet/quick-action.cjs.map +1 -0
- package/dist/components/media-wallet/quick-action.d.cts +12 -0
- package/dist/components/media-wallet/quick-action.d.ts +12 -0
- package/dist/components/media-wallet/quick-action.js +35 -0
- package/dist/components/media-wallet/quick-action.js.map +1 -0
- package/dist/components/media-wallet/receive-card.cjs +86 -0
- package/dist/components/media-wallet/receive-card.cjs.map +1 -0
- package/dist/components/media-wallet/receive-card.d.cts +7 -0
- package/dist/components/media-wallet/receive-card.d.ts +7 -0
- package/dist/components/media-wallet/receive-card.js +52 -0
- package/dist/components/media-wallet/receive-card.js.map +1 -0
- package/dist/components/media-wallet/section-header.cjs +32 -0
- package/dist/components/media-wallet/section-header.cjs.map +1 -0
- package/dist/components/media-wallet/section-header.d.cts +7 -0
- package/dist/components/media-wallet/section-header.d.ts +7 -0
- package/dist/components/media-wallet/section-header.js +8 -0
- package/dist/components/media-wallet/section-header.js.map +1 -0
- package/dist/components/media-wallet/success-dialog.cjs +75 -0
- package/dist/components/media-wallet/success-dialog.cjs.map +1 -0
- package/dist/components/media-wallet/success-dialog.d.cts +11 -0
- package/dist/components/media-wallet/success-dialog.d.ts +11 -0
- package/dist/components/media-wallet/success-dialog.js +51 -0
- package/dist/components/media-wallet/success-dialog.js.map +1 -0
- package/dist/components/media-wallet/types.cjs +37 -0
- package/dist/components/media-wallet/types.cjs.map +1 -0
- package/dist/components/media-wallet/types.d.cts +66 -0
- package/dist/components/media-wallet/types.d.ts +66 -0
- package/dist/components/media-wallet/types.js +12 -0
- package/dist/components/media-wallet/types.js.map +1 -0
- package/dist/components/media-wallet/wallet-activity-icon.cjs +69 -0
- package/dist/components/media-wallet/wallet-activity-icon.cjs.map +1 -0
- package/dist/components/media-wallet/wallet-activity-icon.d.cts +8 -0
- package/dist/components/media-wallet/wallet-activity-icon.d.ts +8 -0
- package/dist/components/media-wallet/wallet-activity-icon.js +45 -0
- package/dist/components/media-wallet/wallet-activity-icon.js.map +1 -0
- package/dist/index.cjs +13 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -2
- package/dist/index.d.ts +6 -2
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/utils/drop/sale.cjs +3 -3
- package/dist/utils/drop/sale.cjs.map +1 -1
- package/dist/utils/drop/sale.d.cts +2 -2
- package/dist/utils/drop/sale.d.ts +2 -2
- package/dist/utils/drop/sale.js +4 -4
- package/dist/utils/drop/sale.js.map +1 -1
- package/dist/utils/drop/view.cjs +2 -2
- package/dist/utils/drop/view.cjs.map +1 -1
- package/dist/utils/drop/view.d.cts +2 -2
- package/dist/utils/drop/view.d.ts +2 -2
- package/dist/utils/drop/view.js +2 -2
- package/dist/utils/drop/view.js.map +1 -1
- package/dist/utils/media-wallet/activity-feed.cjs +35 -0
- package/dist/utils/media-wallet/activity-feed.cjs.map +1 -0
- package/dist/utils/media-wallet/activity-feed.d.cts +14 -0
- package/dist/utils/media-wallet/activity-feed.d.ts +14 -0
- package/dist/utils/media-wallet/activity-feed.js +11 -0
- package/dist/utils/media-wallet/activity-feed.js.map +1 -0
- package/dist/utils/media-wallet/confetti.cjs +51 -0
- package/dist/utils/media-wallet/confetti.cjs.map +1 -0
- package/dist/utils/media-wallet/confetti.d.cts +3 -0
- package/dist/utils/media-wallet/confetti.d.ts +3 -0
- package/dist/utils/media-wallet/confetti.js +17 -0
- package/dist/utils/media-wallet/confetti.js.map +1 -0
- package/dist/utils/media-wallet/nft-items.cjs +38 -0
- package/dist/utils/media-wallet/nft-items.cjs.map +1 -0
- package/dist/utils/media-wallet/nft-items.d.cts +13 -0
- package/dist/utils/media-wallet/nft-items.d.ts +13 -0
- package/dist/utils/media-wallet/nft-items.js +14 -0
- package/dist/utils/media-wallet/nft-items.js.map +1 -0
- package/dist/utils/media-wallet/run-intent-calls.cjs +32 -0
- package/dist/utils/media-wallet/run-intent-calls.cjs.map +1 -0
- package/dist/utils/media-wallet/run-intent-calls.d.cts +16 -0
- package/dist/utils/media-wallet/run-intent-calls.d.ts +16 -0
- package/dist/utils/media-wallet/run-intent-calls.js +8 -0
- package/dist/utils/media-wallet/run-intent-calls.js.map +1 -0
- package/dist/utils/media-wallet/use-erc20-balance.cjs +75 -0
- package/dist/utils/media-wallet/use-erc20-balance.cjs.map +1 -0
- package/dist/utils/media-wallet/use-erc20-balance.d.cts +15 -0
- package/dist/utils/media-wallet/use-erc20-balance.d.ts +15 -0
- package/dist/utils/media-wallet/use-erc20-balance.js +40 -0
- package/dist/utils/media-wallet/use-erc20-balance.js.map +1 -0
- package/dist/utils/media-wallet/use-tokens-by-owner.cjs +52 -0
- package/dist/utils/media-wallet/use-tokens-by-owner.cjs.map +1 -0
- package/dist/utils/media-wallet/use-tokens-by-owner.d.cts +10 -0
- package/dist/utils/media-wallet/use-tokens-by-owner.d.ts +10 -0
- package/dist/utils/media-wallet/use-tokens-by-owner.js +18 -0
- package/dist/utils/media-wallet/use-tokens-by-owner.js.map +1 -0
- package/dist/utils/media-wallet/wallet-activity.cjs +83 -0
- package/dist/utils/media-wallet/wallet-activity.cjs.map +1 -0
- package/dist/utils/media-wallet/wallet-activity.d.cts +7 -0
- package/dist/utils/media-wallet/wallet-activity.d.ts +7 -0
- package/dist/utils/media-wallet/wallet-activity.js +57 -0
- package/dist/utils/media-wallet/wallet-activity.js.map +1 -0
- package/dist/utils/media-wallet/wallet-format.cjs +59 -0
- package/dist/utils/media-wallet/wallet-format.cjs.map +1 -0
- package/dist/utils/media-wallet/wallet-format.d.cts +9 -0
- package/dist/utils/media-wallet/wallet-format.d.ts +9 -0
- package/dist/utils/media-wallet/wallet-format.js +29 -0
- package/dist/utils/media-wallet/wallet-format.js.map +1 -0
- package/dist/utils/media-wallet/wallet-tokens.cjs +39 -0
- package/dist/utils/media-wallet/wallet-tokens.cjs.map +1 -0
- package/dist/utils/media-wallet/wallet-tokens.d.cts +10 -0
- package/dist/utils/media-wallet/wallet-tokens.d.ts +10 -0
- package/dist/utils/media-wallet/wallet-tokens.js +15 -0
- package/dist/utils/media-wallet/wallet-tokens.js.map +1 -0
- package/dist/utils/use-drops.cjs +7 -0
- package/dist/utils/use-drops.cjs.map +1 -1
- package/dist/utils/use-drops.d.cts +3 -1
- package/dist/utils/use-drops.d.ts +3 -1
- package/dist/utils/use-drops.js +6 -0
- package/dist/utils/use-drops.js.map +1 -1
- package/package.json +11 -3
- package/dist/components/drop-status-display.cjs.map +0 -1
- package/dist/components/drop-status-display.js.map +0 -1
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { WalletToken } from '../../utils/media-wallet/wallet-tokens.js';
|
|
3
|
+
import { MediaWalletView } from './types.js';
|
|
4
|
+
import 'react';
|
|
5
|
+
import 'starknet';
|
|
6
|
+
import '@medialane/sdk/starknet';
|
|
7
|
+
|
|
8
|
+
declare function MediaWalletTokenDetail({ token, onNavigate, }: {
|
|
9
|
+
token: WalletToken;
|
|
10
|
+
onNavigate: (view: MediaWalletView) => void;
|
|
11
|
+
}): react_jsx_runtime.JSX.Element;
|
|
12
|
+
|
|
13
|
+
export { MediaWalletTokenDetail };
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useMemo, useState } from "react";
|
|
4
|
+
import { CurrencyIcon } from "../currency-icon.js";
|
|
5
|
+
import { normalizeAddress } from "@medialane/sdk";
|
|
6
|
+
import { useErc20Balance } from "../../utils/media-wallet/use-erc20-balance.js";
|
|
7
|
+
import { fmt, fmtUsd, rawToNumber, short, when, explorerTokenUrl } from "../../utils/media-wallet/wallet-format.js";
|
|
8
|
+
import { walletActivityTitle, walletActivitySubtitle, walletActivityAmount } from "../../utils/media-wallet/wallet-activity.js";
|
|
9
|
+
import { BackButton } from "./back-button.js";
|
|
10
|
+
import { QuickAction } from "./quick-action.js";
|
|
11
|
+
import { SectionHeader } from "./section-header.js";
|
|
12
|
+
import { WalletActivityIcon } from "./wallet-activity-icon.js";
|
|
13
|
+
import { useUsdPrices, usdPriceFor } from "../../utils/use-usd-prices.js";
|
|
14
|
+
import { useMediaWalletApp } from "./types.js";
|
|
15
|
+
function MediaWalletTokenDetail({
|
|
16
|
+
token,
|
|
17
|
+
onNavigate
|
|
18
|
+
}) {
|
|
19
|
+
const { useWalletSession, provider, explorerUrl } = useMediaWalletApp();
|
|
20
|
+
const { address: walletAddress } = useWalletSession();
|
|
21
|
+
const { rawBalance: bal } = useErc20Balance(provider, token.address, walletAddress);
|
|
22
|
+
const usdPrices = useUsdPrices();
|
|
23
|
+
const price = usdPriceFor(usdPrices, token.symbol) ?? null;
|
|
24
|
+
const voyager = useMemo(() => explorerTokenUrl(explorerUrl, token.address), [explorerUrl, token.address]);
|
|
25
|
+
const heldValue = bal != null && price != null ? rawToNumber(bal, token.decimals) * price : null;
|
|
26
|
+
return /* @__PURE__ */ jsxs("main", { className: "flex flex-col gap-6 px-5 pb-8 pt-2", children: [
|
|
27
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
28
|
+
/* @__PURE__ */ jsx(BackButton, { onBack: () => onNavigate({ name: "home" }) }),
|
|
29
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
30
|
+
/* @__PURE__ */ jsx("div", { className: "grid h-11 w-11 shrink-0 place-items-center overflow-hidden rounded-full bg-foreground/[0.06]", children: /* @__PURE__ */ jsx(CurrencyIcon, { symbol: token.symbol, size: 26 }) }),
|
|
31
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
32
|
+
/* @__PURE__ */ jsx("div", { className: "font-[family-name:var(--font-display)] text-lg font-bold leading-none", children: token.name }),
|
|
33
|
+
/* @__PURE__ */ jsx("div", { className: "mt-0.5 text-xs text-muted-foreground", children: token.symbol })
|
|
34
|
+
] })
|
|
35
|
+
] })
|
|
36
|
+
] }),
|
|
37
|
+
/* @__PURE__ */ jsxs("section", { className: "py-2 text-center", children: [
|
|
38
|
+
/* @__PURE__ */ jsx("div", { className: "font-[family-name:var(--font-display)] text-5xl font-extrabold tracking-tight tabular-nums", children: bal === void 0 ? "\u2026" : bal === null ? "\u2014" : fmt(bal, token.decimals, 6) }),
|
|
39
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-2 text-sm text-muted-foreground", children: [
|
|
40
|
+
token.symbol,
|
|
41
|
+
" \xB7 ",
|
|
42
|
+
heldValue != null ? fmtUsd(heldValue) : "\u2014"
|
|
43
|
+
] }),
|
|
44
|
+
price != null && /* @__PURE__ */ jsxs("div", { className: "mt-0.5 text-xs text-muted-foreground", children: [
|
|
45
|
+
fmtUsd(price),
|
|
46
|
+
" per ",
|
|
47
|
+
token.symbol
|
|
48
|
+
] })
|
|
49
|
+
] }),
|
|
50
|
+
/* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-2", children: [
|
|
51
|
+
/* @__PURE__ */ jsx(
|
|
52
|
+
QuickAction,
|
|
53
|
+
{
|
|
54
|
+
label: "Send",
|
|
55
|
+
action: "offer",
|
|
56
|
+
onClick: () => onNavigate({ name: "send", token }),
|
|
57
|
+
icon: /* @__PURE__ */ jsx("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.3", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("path", { d: "M12 19V5M5 12l7-7 7 7" }) })
|
|
58
|
+
}
|
|
59
|
+
),
|
|
60
|
+
/* @__PURE__ */ jsx(
|
|
61
|
+
QuickAction,
|
|
62
|
+
{
|
|
63
|
+
label: "Receive",
|
|
64
|
+
action: "buy",
|
|
65
|
+
onClick: () => onNavigate({ name: "home" }),
|
|
66
|
+
icon: /* @__PURE__ */ jsx("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.3", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("path", { d: "M12 5v14M19 12l-7 7-7-7" }) })
|
|
67
|
+
}
|
|
68
|
+
)
|
|
69
|
+
] }),
|
|
70
|
+
/* @__PURE__ */ jsx(TokenActivity, { tokenAddress: token.address, walletAddress }),
|
|
71
|
+
/* @__PURE__ */ jsxs("section", { children: [
|
|
72
|
+
/* @__PURE__ */ jsx(SectionHeader, { title: "Details" }),
|
|
73
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-2 flex flex-col divide-y divide-border/40 rounded-2xl bg-card/40 px-4 backdrop-blur-sm", children: [
|
|
74
|
+
/* @__PURE__ */ jsx(
|
|
75
|
+
InfoRow,
|
|
76
|
+
{
|
|
77
|
+
label: "Network",
|
|
78
|
+
value: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2", children: [
|
|
79
|
+
/* @__PURE__ */ jsx("span", { className: "grid h-6 w-6 shrink-0 place-items-center rounded-full bg-foreground/[0.06]", children: /* @__PURE__ */ jsx(CurrencyIcon, { symbol: "STRK", size: 14 }) }),
|
|
80
|
+
"Starknet"
|
|
81
|
+
] })
|
|
82
|
+
}
|
|
83
|
+
),
|
|
84
|
+
/* @__PURE__ */ jsx(InfoRow, { label: "Standard", value: "ERC-20" }),
|
|
85
|
+
/* @__PURE__ */ jsx(
|
|
86
|
+
InfoRow,
|
|
87
|
+
{
|
|
88
|
+
label: "Contract",
|
|
89
|
+
value: /* @__PURE__ */ jsxs("a", { href: voyager, target: "_blank", rel: "noopener noreferrer", className: "font-mono text-brand-blue hover:underline", children: [
|
|
90
|
+
short(token.address),
|
|
91
|
+
" \u2197"
|
|
92
|
+
] })
|
|
93
|
+
}
|
|
94
|
+
)
|
|
95
|
+
] })
|
|
96
|
+
] })
|
|
97
|
+
] });
|
|
98
|
+
}
|
|
99
|
+
function TokenActivity({ tokenAddress, walletAddress }) {
|
|
100
|
+
const { getClient } = useMediaWalletApp();
|
|
101
|
+
const [items, setItems] = useState(null);
|
|
102
|
+
const [error, setError] = useState(false);
|
|
103
|
+
useEffect(() => {
|
|
104
|
+
if (!walletAddress) return;
|
|
105
|
+
const normalizedToken = normalizeAddress("STARKNET", tokenAddress);
|
|
106
|
+
getClient().api.getWalletActivity(walletAddress).then((res) => {
|
|
107
|
+
const filtered = res.data.filter((a) => (a.type === "SEND" || a.type === "RECEIVE") && a.tokenAddress && normalizeAddress("STARKNET", a.tokenAddress) === normalizedToken).slice(0, 5);
|
|
108
|
+
setItems(filtered);
|
|
109
|
+
}).catch(() => setError(true));
|
|
110
|
+
}, [walletAddress, tokenAddress, getClient]);
|
|
111
|
+
if (error || items && items.length === 0) return null;
|
|
112
|
+
return /* @__PURE__ */ jsxs("section", { children: [
|
|
113
|
+
/* @__PURE__ */ jsx(SectionHeader, { title: "Activity" }),
|
|
114
|
+
/* @__PURE__ */ jsx("div", { className: "mt-2", children: items === null ? /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-2", children: [0, 1].map((i) => /* @__PURE__ */ jsx("div", { className: "h-16 animate-pulse rounded-2xl bg-foreground/[0.04]" }, i)) }) : /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-2", children: items.map((a) => {
|
|
115
|
+
const subtitle = walletActivitySubtitle(a);
|
|
116
|
+
const amount = walletActivityAmount(a);
|
|
117
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 rounded-2xl bg-card/40 px-4 py-3 backdrop-blur-sm", children: [
|
|
118
|
+
/* @__PURE__ */ jsx(WalletActivityIcon, { a }),
|
|
119
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
|
|
120
|
+
/* @__PURE__ */ jsx("div", { className: "text-sm font-semibold", children: walletActivityTitle(a) }),
|
|
121
|
+
subtitle && /* @__PURE__ */ jsx("div", { className: "truncate text-xs text-muted-foreground", children: subtitle })
|
|
122
|
+
] }),
|
|
123
|
+
/* @__PURE__ */ jsxs("div", { className: "shrink-0 text-right", children: [
|
|
124
|
+
amount && /* @__PURE__ */ jsx("div", { className: "text-sm font-semibold tabular-nums", children: amount }),
|
|
125
|
+
/* @__PURE__ */ jsx("div", { className: "text-xs text-muted-foreground", children: when(a.timestamp) })
|
|
126
|
+
] })
|
|
127
|
+
] }, a.id);
|
|
128
|
+
}) }) })
|
|
129
|
+
] });
|
|
130
|
+
}
|
|
131
|
+
function InfoRow({ label, value }) {
|
|
132
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between py-3 text-sm", children: [
|
|
133
|
+
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: label }),
|
|
134
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium", children: value })
|
|
135
|
+
] });
|
|
136
|
+
}
|
|
137
|
+
export {
|
|
138
|
+
MediaWalletTokenDetail
|
|
139
|
+
};
|
|
140
|
+
//# sourceMappingURL=media-wallet-token-detail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/media-wallet/media-wallet-token-detail.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useMemo, useState } from \"react\";\nimport type { ApiWalletActivity } from \"@medialane/sdk\";\nimport { CurrencyIcon } from \"../currency-icon.js\";\nimport { normalizeAddress } from \"@medialane/sdk\";\nimport { useErc20Balance } from \"../../utils/media-wallet/use-erc20-balance.js\";\nimport { fmt, fmtUsd, rawToNumber, short, when, explorerTokenUrl } from \"../../utils/media-wallet/wallet-format.js\";\nimport { walletActivityTitle, walletActivitySubtitle, walletActivityAmount } from \"../../utils/media-wallet/wallet-activity.js\";\nimport { BackButton } from \"./back-button.js\";\nimport { QuickAction } from \"./quick-action.js\";\nimport { SectionHeader } from \"./section-header.js\";\nimport { WalletActivityIcon } from \"./wallet-activity-icon.js\";\nimport { useUsdPrices, usdPriceFor } from \"../../utils/use-usd-prices.js\";\nimport type { WalletToken } from \"../../utils/media-wallet/wallet-tokens.js\";\nimport { useMediaWalletApp, type MediaWalletView } from \"./types.js\";\n\nexport function MediaWalletTokenDetail({\n token,\n onNavigate,\n}: {\n token: WalletToken;\n onNavigate: (view: MediaWalletView) => void;\n}) {\n const { useWalletSession, provider, explorerUrl } = useMediaWalletApp();\n const { address: walletAddress } = useWalletSession();\n const { rawBalance: bal } = useErc20Balance(provider, token.address, walletAddress);\n const usdPrices = useUsdPrices();\n const price = usdPriceFor(usdPrices, token.symbol) ?? null;\n\n const voyager = useMemo(() => explorerTokenUrl(explorerUrl, token.address), [explorerUrl, token.address]);\n const heldValue = bal != null && price != null ? rawToNumber(bal, token.decimals) * price : null;\n\n return (\n <main className=\"flex flex-col gap-6 px-5 pb-8 pt-2\">\n <div className=\"flex items-center gap-3\">\n <BackButton onBack={() => onNavigate({ name: \"home\" })} />\n <div className=\"flex items-center gap-3\">\n <div className=\"grid h-11 w-11 shrink-0 place-items-center overflow-hidden rounded-full bg-foreground/[0.06]\">\n <CurrencyIcon symbol={token.symbol} size={26} />\n </div>\n <div>\n <div className=\"font-[family-name:var(--font-display)] text-lg font-bold leading-none\">{token.name}</div>\n <div className=\"mt-0.5 text-xs text-muted-foreground\">{token.symbol}</div>\n </div>\n </div>\n </div>\n\n <section className=\"py-2 text-center\">\n <div className=\"font-[family-name:var(--font-display)] text-5xl font-extrabold tracking-tight tabular-nums\">\n {bal === undefined ? \"…\" : bal === null ? \"—\" : fmt(bal, token.decimals, 6)}\n </div>\n <div className=\"mt-2 text-sm text-muted-foreground\">\n {token.symbol}\n {\" · \"}\n {heldValue != null ? fmtUsd(heldValue) : \"—\"}\n </div>\n {price != null && <div className=\"mt-0.5 text-xs text-muted-foreground\">{fmtUsd(price)} per {token.symbol}</div>}\n </section>\n\n <div className=\"grid grid-cols-2 gap-2\">\n <QuickAction\n label=\"Send\"\n action=\"offer\"\n onClick={() => onNavigate({ name: \"send\", token })}\n icon={<svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.3\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M12 19V5M5 12l7-7 7 7\" /></svg>}\n />\n <QuickAction\n label=\"Receive\"\n action=\"buy\"\n onClick={() => onNavigate({ name: \"home\" })}\n icon={<svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.3\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M12 5v14M19 12l-7 7-7-7\" /></svg>}\n />\n </div>\n\n <TokenActivity tokenAddress={token.address} walletAddress={walletAddress} />\n\n <section>\n <SectionHeader title=\"Details\" />\n <div className=\"mt-2 flex flex-col divide-y divide-border/40 rounded-2xl bg-card/40 px-4 backdrop-blur-sm\">\n <InfoRow\n label=\"Network\"\n value={\n <span className=\"flex items-center gap-2\">\n <span className=\"grid h-6 w-6 shrink-0 place-items-center rounded-full bg-foreground/[0.06]\">\n <CurrencyIcon symbol=\"STRK\" size={14} />\n </span>\n Starknet\n </span>\n }\n />\n <InfoRow label=\"Standard\" value=\"ERC-20\" />\n <InfoRow\n label=\"Contract\"\n value={\n <a href={voyager} target=\"_blank\" rel=\"noopener noreferrer\" className=\"font-mono text-brand-blue hover:underline\">\n {short(token.address)} ↗\n </a>\n }\n />\n </div>\n </section>\n </main>\n );\n}\n\nfunction TokenActivity({ tokenAddress, walletAddress }: { tokenAddress: string; walletAddress: string | null }) {\n const { getClient } = useMediaWalletApp();\n const [items, setItems] = useState<ApiWalletActivity[] | null>(null);\n const [error, setError] = useState(false);\n\n useEffect(() => {\n if (!walletAddress) return;\n const normalizedToken = normalizeAddress(\"STARKNET\", tokenAddress);\n getClient()\n .api.getWalletActivity(walletAddress)\n .then((res) => {\n const filtered = res.data\n .filter((a) => (a.type === \"SEND\" || a.type === \"RECEIVE\") && a.tokenAddress && normalizeAddress(\"STARKNET\", a.tokenAddress) === normalizedToken)\n .slice(0, 5);\n setItems(filtered);\n })\n .catch(() => setError(true));\n }, [walletAddress, tokenAddress, getClient]);\n\n if (error || (items && items.length === 0)) return null;\n\n return (\n <section>\n <SectionHeader title=\"Activity\" />\n <div className=\"mt-2\">\n {items === null ? (\n <div className=\"flex flex-col gap-2\">\n {[0, 1].map((i) => (\n <div key={i} className=\"h-16 animate-pulse rounded-2xl bg-foreground/[0.04]\" />\n ))}\n </div>\n ) : (\n <div className=\"flex flex-col gap-2\">\n {items.map((a) => {\n const subtitle = walletActivitySubtitle(a);\n const amount = walletActivityAmount(a);\n return (\n <div key={a.id} className=\"flex items-center gap-3 rounded-2xl bg-card/40 px-4 py-3 backdrop-blur-sm\">\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(a.timestamp)}</div>\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n </section>\n );\n}\n\nfunction InfoRow({ label, value }: { label: string; value: React.ReactNode }) {\n return (\n <div className=\"flex items-center justify-between py-3 text-sm\">\n <span className=\"text-muted-foreground\">{label}</span>\n <span className=\"font-medium\">{value}</span>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
var media_wallet_exports = {};
|
|
21
|
+
__export(media_wallet_exports, {
|
|
22
|
+
MediaWallet: () => MediaWallet
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(media_wallet_exports);
|
|
25
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
26
|
+
var import_react = require("react");
|
|
27
|
+
var import_media_wallet_home = require("./media-wallet-home.js");
|
|
28
|
+
var import_media_wallet_send = require("./media-wallet-send.js");
|
|
29
|
+
var import_media_wallet_token_detail = require("./media-wallet-token-detail.js");
|
|
30
|
+
var import_media_wallet_activity = require("./media-wallet-activity.js");
|
|
31
|
+
function MediaWallet({
|
|
32
|
+
onClose,
|
|
33
|
+
initialView
|
|
34
|
+
}) {
|
|
35
|
+
const [view, setView] = (0, import_react.useState)(initialView ?? { name: "home" });
|
|
36
|
+
switch (view.name) {
|
|
37
|
+
case "home":
|
|
38
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_media_wallet_home.MediaWalletHome, { onNavigate: setView, onClose, autoOpenReceive: view.autoOpenReceive });
|
|
39
|
+
case "send":
|
|
40
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_media_wallet_send.MediaWalletSend, { initialToken: view.token, onNavigate: setView, onDone: () => setView({ name: "home" }) });
|
|
41
|
+
case "token":
|
|
42
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_media_wallet_token_detail.MediaWalletTokenDetail, { token: view.token, onNavigate: setView });
|
|
43
|
+
case "activity":
|
|
44
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_media_wallet_activity.MediaWalletActivity, { onNavigate: setView });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
48
|
+
0 && (module.exports = {
|
|
49
|
+
MediaWallet
|
|
50
|
+
});
|
|
51
|
+
//# sourceMappingURL=media-wallet.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/media-wallet/media-wallet.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport type { MediaWalletView } from \"./types.js\";\nimport { MediaWalletHome } from \"./media-wallet-home.js\";\nimport { MediaWalletSend } from \"./media-wallet-send.js\";\nimport { MediaWalletTokenDetail } from \"./media-wallet-token-detail.js\";\nimport { MediaWalletActivity } from \"./media-wallet-activity.js\";\n\nexport function MediaWallet({\n onClose,\n initialView,\n}: {\n onClose: () => void;\n initialView?: MediaWalletView;\n}) {\n const [view, setView] = useState<MediaWalletView>(initialView ?? { name: \"home\" });\n\n switch (view.name) {\n case \"home\":\n return <MediaWalletHome onNavigate={setView} onClose={onClose} autoOpenReceive={view.autoOpenReceive} />;\n case \"send\":\n return <MediaWalletSend initialToken={view.token} onNavigate={setView} onDone={() => setView({ name: \"home\" })} />;\n case \"token\":\n return <MediaWalletTokenDetail token={view.token} onNavigate={setView} />;\n case \"activity\":\n return <MediaWalletActivity onNavigate={setView} />;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBa;AAlBb,mBAAyB;AAEzB,+BAAgC;AAChC,+BAAgC;AAChC,uCAAuC;AACvC,mCAAoC;AAE7B,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AACF,GAGG;AACD,QAAM,CAAC,MAAM,OAAO,QAAI,uBAA0B,eAAe,EAAE,MAAM,OAAO,CAAC;AAEjF,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,4CAAC,4CAAgB,YAAY,SAAS,SAAkB,iBAAiB,KAAK,iBAAiB;AAAA,IACxG,KAAK;AACH,aAAO,4CAAC,4CAAgB,cAAc,KAAK,OAAO,YAAY,SAAS,QAAQ,MAAM,QAAQ,EAAE,MAAM,OAAO,CAAC,GAAG;AAAA,IAClH,KAAK;AACH,aAAO,4CAAC,2DAAuB,OAAO,KAAK,OAAO,YAAY,SAAS;AAAA,IACzE,KAAK;AACH,aAAO,4CAAC,oDAAoB,YAAY,SAAS;AAAA,EACrD;AACF;","names":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { MediaWalletView } from './types.cjs';
|
|
3
|
+
import 'react';
|
|
4
|
+
import 'starknet';
|
|
5
|
+
import '@medialane/sdk/starknet';
|
|
6
|
+
import '../../utils/media-wallet/wallet-tokens.cjs';
|
|
7
|
+
|
|
8
|
+
declare function MediaWallet({ onClose, initialView, }: {
|
|
9
|
+
onClose: () => void;
|
|
10
|
+
initialView?: MediaWalletView;
|
|
11
|
+
}): react_jsx_runtime.JSX.Element;
|
|
12
|
+
|
|
13
|
+
export { MediaWallet };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { MediaWalletView } from './types.js';
|
|
3
|
+
import 'react';
|
|
4
|
+
import 'starknet';
|
|
5
|
+
import '@medialane/sdk/starknet';
|
|
6
|
+
import '../../utils/media-wallet/wallet-tokens.js';
|
|
7
|
+
|
|
8
|
+
declare function MediaWallet({ onClose, initialView, }: {
|
|
9
|
+
onClose: () => void;
|
|
10
|
+
initialView?: MediaWalletView;
|
|
11
|
+
}): react_jsx_runtime.JSX.Element;
|
|
12
|
+
|
|
13
|
+
export { MediaWallet };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { MediaWalletHome } from "./media-wallet-home.js";
|
|
5
|
+
import { MediaWalletSend } from "./media-wallet-send.js";
|
|
6
|
+
import { MediaWalletTokenDetail } from "./media-wallet-token-detail.js";
|
|
7
|
+
import { MediaWalletActivity } from "./media-wallet-activity.js";
|
|
8
|
+
function MediaWallet({
|
|
9
|
+
onClose,
|
|
10
|
+
initialView
|
|
11
|
+
}) {
|
|
12
|
+
const [view, setView] = useState(initialView ?? { name: "home" });
|
|
13
|
+
switch (view.name) {
|
|
14
|
+
case "home":
|
|
15
|
+
return /* @__PURE__ */ jsx(MediaWalletHome, { onNavigate: setView, onClose, autoOpenReceive: view.autoOpenReceive });
|
|
16
|
+
case "send":
|
|
17
|
+
return /* @__PURE__ */ jsx(MediaWalletSend, { initialToken: view.token, onNavigate: setView, onDone: () => setView({ name: "home" }) });
|
|
18
|
+
case "token":
|
|
19
|
+
return /* @__PURE__ */ jsx(MediaWalletTokenDetail, { token: view.token, onNavigate: setView });
|
|
20
|
+
case "activity":
|
|
21
|
+
return /* @__PURE__ */ jsx(MediaWalletActivity, { onNavigate: setView });
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export {
|
|
25
|
+
MediaWallet
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=media-wallet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/media-wallet/media-wallet.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport type { MediaWalletView } from \"./types.js\";\nimport { MediaWalletHome } from \"./media-wallet-home.js\";\nimport { MediaWalletSend } from \"./media-wallet-send.js\";\nimport { MediaWalletTokenDetail } from \"./media-wallet-token-detail.js\";\nimport { MediaWalletActivity } from \"./media-wallet-activity.js\";\n\nexport function MediaWallet({\n onClose,\n initialView,\n}: {\n onClose: () => void;\n initialView?: MediaWalletView;\n}) {\n const [view, setView] = useState<MediaWalletView>(initialView ?? { name: \"home\" });\n\n switch (view.name) {\n case \"home\":\n return <MediaWalletHome onNavigate={setView} onClose={onClose} autoOpenReceive={view.autoOpenReceive} />;\n case \"send\":\n return <MediaWalletSend initialToken={view.token} onNavigate={setView} onDone={() => setView({ name: \"home\" })} />;\n case \"token\":\n return <MediaWalletTokenDetail token={view.token} onNavigate={setView} />;\n case \"activity\":\n return <MediaWalletActivity onNavigate={setView} />;\n }\n}\n"],"mappings":";AAoBa;AAlBb,SAAS,gBAAgB;AAEzB,SAAS,uBAAuB;AAChC,SAAS,uBAAuB;AAChC,SAAS,8BAA8B;AACvC,SAAS,2BAA2B;AAE7B,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AACF,GAGG;AACD,QAAM,CAAC,MAAM,OAAO,IAAI,SAA0B,eAAe,EAAE,MAAM,OAAO,CAAC;AAEjF,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,oBAAC,mBAAgB,YAAY,SAAS,SAAkB,iBAAiB,KAAK,iBAAiB;AAAA,IACxG,KAAK;AACH,aAAO,oBAAC,mBAAgB,cAAc,KAAK,OAAO,YAAY,SAAS,QAAQ,MAAM,QAAQ,EAAE,MAAM,OAAO,CAAC,GAAG;AAAA,IAClH,KAAK;AACH,aAAO,oBAAC,0BAAuB,OAAO,KAAK,OAAO,YAAY,SAAS;AAAA,IACzE,KAAK;AACH,aAAO,oBAAC,uBAAoB,YAAY,SAAS;AAAA,EACrD;AACF;","names":[]}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __create = Object.create;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __export = (target, all) => {
|
|
10
|
+
for (var name in all)
|
|
11
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
12
|
+
};
|
|
13
|
+
var __copyProps = (to, from, except, desc) => {
|
|
14
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
15
|
+
for (let key of __getOwnPropNames(from))
|
|
16
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
17
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
18
|
+
}
|
|
19
|
+
return to;
|
|
20
|
+
};
|
|
21
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
22
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
23
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
24
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
25
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
26
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
27
|
+
mod
|
|
28
|
+
));
|
|
29
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
30
|
+
var nft_strip_exports = {};
|
|
31
|
+
__export(nft_strip_exports, {
|
|
32
|
+
NftStrip: () => NftStrip
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(nft_strip_exports);
|
|
35
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
36
|
+
var import_link = __toESM(require("../link.js"), 1);
|
|
37
|
+
var import_image = __toESM(require("../image.js"), 1);
|
|
38
|
+
function NftStrip({
|
|
39
|
+
items,
|
|
40
|
+
isLoading,
|
|
41
|
+
onNavigate,
|
|
42
|
+
resolveImage
|
|
43
|
+
}) {
|
|
44
|
+
if (isLoading) {
|
|
45
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { "data-testid": "nft-strip-skeleton", className: "grid grid-cols-4 gap-2", children: Array.from({ length: 4 }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "aspect-square animate-pulse rounded-xl bg-foreground/[0.06]" }, i)) });
|
|
46
|
+
}
|
|
47
|
+
if (items.length === 0) {
|
|
48
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-muted-foreground", children: "No NFTs yet \u2014 mint or collect your first one to see it here." });
|
|
49
|
+
}
|
|
50
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "grid grid-cols-4 gap-2", children: items.map((item) => {
|
|
51
|
+
const resolved = resolveImage(item.image);
|
|
52
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
53
|
+
import_link.default,
|
|
54
|
+
{
|
|
55
|
+
href: item.href,
|
|
56
|
+
title: item.name,
|
|
57
|
+
onClick: onNavigate,
|
|
58
|
+
className: "group relative aspect-square overflow-hidden rounded-xl bg-foreground/[0.06] transition-opacity hover:opacity-90",
|
|
59
|
+
children: resolved ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
60
|
+
import_image.default,
|
|
61
|
+
{
|
|
62
|
+
src: resolved,
|
|
63
|
+
alt: item.name,
|
|
64
|
+
fill: true,
|
|
65
|
+
unoptimized: true,
|
|
66
|
+
className: "object-cover transition-transform duration-200 group-hover:scale-[1.03]"
|
|
67
|
+
}
|
|
68
|
+
) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "grid h-full w-full place-items-center", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AssetFallbackIcon, {}) })
|
|
69
|
+
},
|
|
70
|
+
item.key
|
|
71
|
+
);
|
|
72
|
+
}) });
|
|
73
|
+
}
|
|
74
|
+
function AssetFallbackIcon() {
|
|
75
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.8", className: "text-muted-foreground", strokeLinecap: "round", strokeLinejoin: "round", children: [
|
|
76
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", { x: "3", y: "3", width: "18", height: "18", rx: "3" }),
|
|
77
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", { cx: "9", cy: "9", r: "1.5", fill: "currentColor", stroke: "none" }),
|
|
78
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M21 15l-5-5-9 9" })
|
|
79
|
+
] });
|
|
80
|
+
}
|
|
81
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
82
|
+
0 && (module.exports = {
|
|
83
|
+
NftStrip
|
|
84
|
+
});
|
|
85
|
+
//# sourceMappingURL=nft-strip.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/media-wallet/nft-strip.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"../link.js\";\nimport Image from \"../image.js\";\nimport type { NftItem } from \"../../utils/media-wallet/nft-items.js\";\n\nexport function NftStrip({\n items,\n isLoading,\n onNavigate,\n resolveImage,\n}: {\n items: NftItem[];\n isLoading: boolean;\n onNavigate?: () => void;\n resolveImage: (uri: string | null | undefined) => string | null;\n}) {\n if (isLoading) {\n return (\n <div data-testid=\"nft-strip-skeleton\" className=\"grid grid-cols-4 gap-2\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div key={i} className=\"aspect-square animate-pulse rounded-xl bg-foreground/[0.06]\" />\n ))}\n </div>\n );\n }\n\n if (items.length === 0) {\n return (\n <p className=\"text-sm text-muted-foreground\">\n No NFTs yet — mint or collect your first one to see it here.\n </p>\n );\n }\n\n return (\n <div className=\"grid grid-cols-4 gap-2\">\n {items.map((item) => {\n const resolved = resolveImage(item.image);\n return (\n <Link\n key={item.key}\n href={item.href}\n title={item.name}\n onClick={onNavigate}\n className=\"group relative aspect-square overflow-hidden rounded-xl bg-foreground/[0.06] transition-opacity hover:opacity-90\"\n >\n {resolved ? (\n <Image\n src={resolved}\n alt={item.name}\n fill\n unoptimized\n className=\"object-cover transition-transform duration-200 group-hover:scale-[1.03]\"\n />\n ) : (\n <div className=\"grid h-full w-full place-items-center\">\n <AssetFallbackIcon />\n </div>\n )}\n </Link>\n );\n })}\n </div>\n );\n}\n\nfunction AssetFallbackIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" className=\"text-muted-foreground\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"3\" />\n <circle cx=\"9\" cy=\"9\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <path d=\"M21 15l-5-5-9 9\" />\n </svg>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBU;AAnBV,kBAAiB;AACjB,mBAAkB;AAGX,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,MAAI,WAAW;AACb,WACE,4CAAC,SAAI,eAAY,sBAAqB,WAAU,0BAC7C,gBAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,MACjC,4CAAC,SAAY,WAAU,iEAAb,CAA2E,CACtF,GACH;AAAA,EAEJ;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,WACE,4CAAC,OAAE,WAAU,iCAAgC,+EAE7C;AAAA,EAEJ;AAEA,SACE,4CAAC,SAAI,WAAU,0BACZ,gBAAM,IAAI,CAAC,SAAS;AACnB,UAAM,WAAW,aAAa,KAAK,KAAK;AACxC,WACE;AAAA,MAAC,YAAAA;AAAA,MAAA;AAAA,QAEC,MAAM,KAAK;AAAA,QACX,OAAO,KAAK;AAAA,QACZ,SAAS;AAAA,QACT,WAAU;AAAA,QAET,qBACC;AAAA,UAAC,aAAAC;AAAA,UAAA;AAAA,YACC,KAAK;AAAA,YACL,KAAK,KAAK;AAAA,YACV,MAAI;AAAA,YACJ,aAAW;AAAA,YACX,WAAU;AAAA;AAAA,QACZ,IAEA,4CAAC,SAAI,WAAU,yCACb,sDAAC,qBAAkB,GACrB;AAAA;AAAA,MAjBG,KAAK;AAAA,IAmBZ;AAAA,EAEJ,CAAC,GACH;AAEJ;AAEA,SAAS,oBAAoB;AAC3B,SACE,6CAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,OAAM,WAAU,yBAAwB,eAAc,SAAQ,gBAAe,SACzK;AAAA,gDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI;AAAA,IAChD,4CAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,OAAM,MAAK,gBAAe,QAAO,QAAO;AAAA,IAChE,4CAAC,UAAK,GAAE,mBAAkB;AAAA,KAC5B;AAEJ;","names":["Link","Image"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { NftItem } from '../../utils/media-wallet/nft-items.cjs';
|
|
3
|
+
import '@medialane/sdk';
|
|
4
|
+
|
|
5
|
+
declare function NftStrip({ items, isLoading, onNavigate, resolveImage, }: {
|
|
6
|
+
items: NftItem[];
|
|
7
|
+
isLoading: boolean;
|
|
8
|
+
onNavigate?: () => void;
|
|
9
|
+
resolveImage: (uri: string | null | undefined) => string | null;
|
|
10
|
+
}): react_jsx_runtime.JSX.Element;
|
|
11
|
+
|
|
12
|
+
export { NftStrip };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { NftItem } from '../../utils/media-wallet/nft-items.js';
|
|
3
|
+
import '@medialane/sdk';
|
|
4
|
+
|
|
5
|
+
declare function NftStrip({ items, isLoading, onNavigate, resolveImage, }: {
|
|
6
|
+
items: NftItem[];
|
|
7
|
+
isLoading: boolean;
|
|
8
|
+
onNavigate?: () => void;
|
|
9
|
+
resolveImage: (uri: string | null | undefined) => string | null;
|
|
10
|
+
}): react_jsx_runtime.JSX.Element;
|
|
11
|
+
|
|
12
|
+
export { NftStrip };
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import Link from "../link.js";
|
|
4
|
+
import Image from "../image.js";
|
|
5
|
+
function NftStrip({
|
|
6
|
+
items,
|
|
7
|
+
isLoading,
|
|
8
|
+
onNavigate,
|
|
9
|
+
resolveImage
|
|
10
|
+
}) {
|
|
11
|
+
if (isLoading) {
|
|
12
|
+
return /* @__PURE__ */ jsx("div", { "data-testid": "nft-strip-skeleton", className: "grid grid-cols-4 gap-2", children: Array.from({ length: 4 }).map((_, i) => /* @__PURE__ */ jsx("div", { className: "aspect-square animate-pulse rounded-xl bg-foreground/[0.06]" }, i)) });
|
|
13
|
+
}
|
|
14
|
+
if (items.length === 0) {
|
|
15
|
+
return /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: "No NFTs yet \u2014 mint or collect your first one to see it here." });
|
|
16
|
+
}
|
|
17
|
+
return /* @__PURE__ */ jsx("div", { className: "grid grid-cols-4 gap-2", children: items.map((item) => {
|
|
18
|
+
const resolved = resolveImage(item.image);
|
|
19
|
+
return /* @__PURE__ */ jsx(
|
|
20
|
+
Link,
|
|
21
|
+
{
|
|
22
|
+
href: item.href,
|
|
23
|
+
title: item.name,
|
|
24
|
+
onClick: onNavigate,
|
|
25
|
+
className: "group relative aspect-square overflow-hidden rounded-xl bg-foreground/[0.06] transition-opacity hover:opacity-90",
|
|
26
|
+
children: resolved ? /* @__PURE__ */ jsx(
|
|
27
|
+
Image,
|
|
28
|
+
{
|
|
29
|
+
src: resolved,
|
|
30
|
+
alt: item.name,
|
|
31
|
+
fill: true,
|
|
32
|
+
unoptimized: true,
|
|
33
|
+
className: "object-cover transition-transform duration-200 group-hover:scale-[1.03]"
|
|
34
|
+
}
|
|
35
|
+
) : /* @__PURE__ */ jsx("div", { className: "grid h-full w-full place-items-center", children: /* @__PURE__ */ jsx(AssetFallbackIcon, {}) })
|
|
36
|
+
},
|
|
37
|
+
item.key
|
|
38
|
+
);
|
|
39
|
+
}) });
|
|
40
|
+
}
|
|
41
|
+
function AssetFallbackIcon() {
|
|
42
|
+
return /* @__PURE__ */ jsxs("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.8", className: "text-muted-foreground", strokeLinecap: "round", strokeLinejoin: "round", children: [
|
|
43
|
+
/* @__PURE__ */ jsx("rect", { x: "3", y: "3", width: "18", height: "18", rx: "3" }),
|
|
44
|
+
/* @__PURE__ */ jsx("circle", { cx: "9", cy: "9", r: "1.5", fill: "currentColor", stroke: "none" }),
|
|
45
|
+
/* @__PURE__ */ jsx("path", { d: "M21 15l-5-5-9 9" })
|
|
46
|
+
] });
|
|
47
|
+
}
|
|
48
|
+
export {
|
|
49
|
+
NftStrip
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=nft-strip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/media-wallet/nft-strip.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"../link.js\";\nimport Image from \"../image.js\";\nimport type { NftItem } from \"../../utils/media-wallet/nft-items.js\";\n\nexport function NftStrip({\n items,\n isLoading,\n onNavigate,\n resolveImage,\n}: {\n items: NftItem[];\n isLoading: boolean;\n onNavigate?: () => void;\n resolveImage: (uri: string | null | undefined) => string | null;\n}) {\n if (isLoading) {\n return (\n <div data-testid=\"nft-strip-skeleton\" className=\"grid grid-cols-4 gap-2\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div key={i} className=\"aspect-square animate-pulse rounded-xl bg-foreground/[0.06]\" />\n ))}\n </div>\n );\n }\n\n if (items.length === 0) {\n return (\n <p className=\"text-sm text-muted-foreground\">\n No NFTs yet — mint or collect your first one to see it here.\n </p>\n );\n }\n\n return (\n <div className=\"grid grid-cols-4 gap-2\">\n {items.map((item) => {\n const resolved = resolveImage(item.image);\n return (\n <Link\n key={item.key}\n href={item.href}\n title={item.name}\n onClick={onNavigate}\n className=\"group relative aspect-square overflow-hidden rounded-xl bg-foreground/[0.06] transition-opacity hover:opacity-90\"\n >\n {resolved ? (\n <Image\n src={resolved}\n alt={item.name}\n fill\n unoptimized\n className=\"object-cover transition-transform duration-200 group-hover:scale-[1.03]\"\n />\n ) : (\n <div className=\"grid h-full w-full place-items-center\">\n <AssetFallbackIcon />\n </div>\n )}\n </Link>\n );\n })}\n </div>\n );\n}\n\nfunction AssetFallbackIcon() {\n return (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" className=\"text-muted-foreground\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"3\" />\n <circle cx=\"9\" cy=\"9\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <path d=\"M21 15l-5-5-9 9\" />\n </svg>\n );\n}\n"],"mappings":";AAqBU,cAgDN,YAhDM;AAnBV,OAAO,UAAU;AACjB,OAAO,WAAW;AAGX,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,MAAI,WAAW;AACb,WACE,oBAAC,SAAI,eAAY,sBAAqB,WAAU,0BAC7C,gBAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,MACjC,oBAAC,SAAY,WAAU,iEAAb,CAA2E,CACtF,GACH;AAAA,EAEJ;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,WACE,oBAAC,OAAE,WAAU,iCAAgC,+EAE7C;AAAA,EAEJ;AAEA,SACE,oBAAC,SAAI,WAAU,0BACZ,gBAAM,IAAI,CAAC,SAAS;AACnB,UAAM,WAAW,aAAa,KAAK,KAAK;AACxC,WACE;AAAA,MAAC;AAAA;AAAA,QAEC,MAAM,KAAK;AAAA,QACX,OAAO,KAAK;AAAA,QACZ,SAAS;AAAA,QACT,WAAU;AAAA,QAET,qBACC;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,KAAK,KAAK;AAAA,YACV,MAAI;AAAA,YACJ,aAAW;AAAA,YACX,WAAU;AAAA;AAAA,QACZ,IAEA,oBAAC,SAAI,WAAU,yCACb,8BAAC,qBAAkB,GACrB;AAAA;AAAA,MAjBG,KAAK;AAAA,IAmBZ;AAAA,EAEJ,CAAC,GACH;AAEJ;AAEA,SAAS,oBAAoB;AAC3B,SACE,qBAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,OAAM,WAAU,yBAAwB,eAAc,SAAQ,gBAAe,SACzK;AAAA,wBAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI;AAAA,IAChD,oBAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,OAAM,MAAK,gBAAe,QAAO,QAAO;AAAA,IAChE,oBAAC,UAAK,GAAE,mBAAkB;AAAA,KAC5B;AAEJ;","names":[]}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
"use client";
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
var quick_action_exports = {};
|
|
21
|
+
__export(quick_action_exports, {
|
|
22
|
+
QuickAction: () => QuickAction
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(quick_action_exports);
|
|
25
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
26
|
+
var import_action_button = require("./action-button.js");
|
|
27
|
+
function QuickAction({
|
|
28
|
+
label,
|
|
29
|
+
icon,
|
|
30
|
+
action,
|
|
31
|
+
onClick,
|
|
32
|
+
disabled
|
|
33
|
+
}) {
|
|
34
|
+
const grad = `linear-gradient(115deg, ${import_action_button.ACTION_GRADIENTS[action].join(",")})`;
|
|
35
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
36
|
+
"button",
|
|
37
|
+
{
|
|
38
|
+
onClick,
|
|
39
|
+
disabled,
|
|
40
|
+
className: `group flex flex-col items-center gap-1.5 ${disabled ? "pointer-events-none opacity-40" : ""}`,
|
|
41
|
+
children: [
|
|
42
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
43
|
+
"span",
|
|
44
|
+
{
|
|
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] },
|
|
47
|
+
children: icon
|
|
48
|
+
}
|
|
49
|
+
),
|
|
50
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "text-[11px] font-medium text-muted-foreground", children: label })
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
56
|
+
0 && (module.exports = {
|
|
57
|
+
QuickAction
|
|
58
|
+
});
|
|
59
|
+
//# sourceMappingURL=quick-action.cjs.map
|
|
@@ -0,0 +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-[11px] 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,iDAAiD,iBAAM;AAAA;AAAA;AAAA,EACzE;AAEJ;","names":[]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ACTION_GRADIENTS } from './action-button.cjs';
|
|
3
|
+
|
|
4
|
+
declare function QuickAction({ label, icon, action, onClick, disabled, }: {
|
|
5
|
+
label: string;
|
|
6
|
+
icon: React.ReactNode;
|
|
7
|
+
action: keyof typeof ACTION_GRADIENTS;
|
|
8
|
+
onClick?: () => void;
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
}): react_jsx_runtime.JSX.Element;
|
|
11
|
+
|
|
12
|
+
export { QuickAction };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ACTION_GRADIENTS } from './action-button.js';
|
|
3
|
+
|
|
4
|
+
declare function QuickAction({ label, icon, action, onClick, disabled, }: {
|
|
5
|
+
label: string;
|
|
6
|
+
icon: React.ReactNode;
|
|
7
|
+
action: keyof typeof ACTION_GRADIENTS;
|
|
8
|
+
onClick?: () => void;
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
}): react_jsx_runtime.JSX.Element;
|
|
11
|
+
|
|
12
|
+
export { QuickAction };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { ACTION_GRADIENTS, ACTION_FOREGROUNDS } from "./action-button.js";
|
|
4
|
+
function QuickAction({
|
|
5
|
+
label,
|
|
6
|
+
icon,
|
|
7
|
+
action,
|
|
8
|
+
onClick,
|
|
9
|
+
disabled
|
|
10
|
+
}) {
|
|
11
|
+
const grad = `linear-gradient(115deg, ${ACTION_GRADIENTS[action].join(",")})`;
|
|
12
|
+
return /* @__PURE__ */ jsxs(
|
|
13
|
+
"button",
|
|
14
|
+
{
|
|
15
|
+
onClick,
|
|
16
|
+
disabled,
|
|
17
|
+
className: `group flex flex-col items-center gap-1.5 ${disabled ? "pointer-events-none opacity-40" : ""}`,
|
|
18
|
+
children: [
|
|
19
|
+
/* @__PURE__ */ jsx(
|
|
20
|
+
"span",
|
|
21
|
+
{
|
|
22
|
+
className: "ml-gbtn relative grid h-12 w-12 place-items-center rounded-[15px] bg-transparent transition-transform group-active:scale-95",
|
|
23
|
+
style: { "--ml-grad": grad, color: ACTION_FOREGROUNDS[action] },
|
|
24
|
+
children: icon
|
|
25
|
+
}
|
|
26
|
+
),
|
|
27
|
+
/* @__PURE__ */ jsx("span", { className: "text-[11px] font-medium text-muted-foreground", children: label })
|
|
28
|
+
]
|
|
29
|
+
}
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
export {
|
|
33
|
+
QuickAction
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=quick-action.js.map
|
|
@@ -0,0 +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-[11px] 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,iDAAiD,iBAAM;AAAA;AAAA;AAAA,EACzE;AAEJ;","names":[]}
|