@medialane/ui 0.312.0 → 0.314.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/account-page.cjs +48 -46
- package/dist/components/account-page.cjs.map +1 -1
- package/dist/components/account-page.js +48 -46
- package/dist/components/account-page.js.map +1 -1
- package/dist/components/approve-mint-dialog.cjs +1 -1
- package/dist/components/approve-mint-dialog.cjs.map +1 -1
- package/dist/components/approve-mint-dialog.js +1 -1
- package/dist/components/approve-mint-dialog.js.map +1 -1
- package/dist/components/asset-marketplace-panel.cjs +1 -1
- package/dist/components/asset-marketplace-panel.cjs.map +1 -1
- package/dist/components/asset-marketplace-panel.js +1 -1
- package/dist/components/asset-marketplace-panel.js.map +1 -1
- package/dist/components/fast-mint/success-view.cjs +1 -1
- package/dist/components/fast-mint/success-view.cjs.map +1 -1
- package/dist/components/fast-mint/success-view.js +1 -1
- package/dist/components/fast-mint/success-view.js.map +1 -1
- package/dist/components/home-page.cjs +1 -1
- package/dist/components/home-page.cjs.map +1 -1
- package/dist/components/home-page.js +1 -1
- package/dist/components/home-page.js.map +1 -1
- package/dist/components/launchpad/tier-mint-presets.cjs +3 -3
- package/dist/components/launchpad/tier-mint-presets.cjs.map +1 -1
- package/dist/components/launchpad/tier-mint-presets.js +3 -3
- package/dist/components/launchpad/tier-mint-presets.js.map +1 -1
- package/dist/components/listings-grid.cjs +1 -1
- package/dist/components/listings-grid.cjs.map +1 -1
- package/dist/components/listings-grid.js +1 -1
- package/dist/components/listings-grid.js.map +1 -1
- package/dist/components/portfolio-header.cjs +4 -1
- package/dist/components/portfolio-header.cjs.map +1 -1
- package/dist/components/portfolio-header.d.cts +4 -1
- package/dist/components/portfolio-header.d.ts +4 -1
- package/dist/components/portfolio-header.js +4 -1
- package/dist/components/portfolio-header.js.map +1 -1
- package/dist/components/portfolio-orders.cjs +1 -1
- package/dist/components/portfolio-orders.cjs.map +1 -1
- package/dist/components/portfolio-orders.js +1 -1
- package/dist/components/portfolio-orders.js.map +1 -1
- package/dist/components/rewards/rewards-dashboard.cjs +2 -2
- package/dist/components/rewards/rewards-dashboard.cjs.map +1 -1
- package/dist/components/rewards/rewards-dashboard.js +2 -2
- package/dist/components/rewards/rewards-dashboard.js.map +1 -1
- package/dist/components/route-error.cjs +2 -6
- package/dist/components/route-error.cjs.map +1 -1
- package/dist/components/route-error.d.cts +1 -2
- package/dist/components/route-error.d.ts +1 -2
- package/dist/components/route-error.js +2 -6
- package/dist/components/route-error.js.map +1 -1
- package/dist/components/token-card.cjs +2 -2
- package/dist/components/token-card.cjs.map +1 -1
- package/dist/components/token-card.js +2 -2
- package/dist/components/token-card.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/rewards/rewards-dashboard.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"../link.js\";\nimport { Button } from \"../button.js\";\nimport { Skeleton } from \"../skeleton.js\";\nimport { useMedialaneApp } from \"../medialane-app.js\";\nimport { useRewards, useRewardsConfig, useRewardsEvents } from \"../../utils/use-rewards.js\";\nimport { LevelBadge } from \"./level-badge.js\";\nimport { LevelUpCelebration } from \"./level-up-celebration.js\";\nimport { BadgeUnlocked } from \"./badge-unlocked.js\";\nimport { useRewardsCelebrations } from \"./use-rewards-celebrations.js\";\nimport { LeaderboardPanel } from \"./leaderboard-panel.js\";\nimport type { ApiRewardsBadge } from \"@medialane/sdk\";\nimport {\n Gift,\n ExternalLink,\n Palette,\n Layers,\n Tag,\n Handshake,\n ShoppingBag,\n Rocket,\n GitBranch,\n UserRoundCheck,\n Ticket,\n MessageSquare,\n Users,\n type LucideIcon,\n Package,\n CheckCircle2,\n TrendingUp,\n Crown,\n Coins,\n Star,\n Gem,\n Award,\n HandCoins,\n Flame,\n Zap,\n} from \"lucide-react\";\n\nexport const REWARD_ACTION_LABELS: Record<string, string> = {\n complete_profile: \"Complete profile\",\n mint_asset: \"Mint assets\",\n create_collection: \"Create collections\",\n launch_launchpad: \"Launch drops / POPs\",\n create_remix: \"Create remixes\",\n list_asset: \"List assets\",\n buy_asset: \"Buy assets\",\n make_offer: \"Make offers\",\n counter_offer: \"Counter offers\",\n offer_accepted_seller: \"Offers accepted (sold)\",\n offer_accepted_buyer: \"Offers accepted (bought)\",\n claim_pop: \"POP claims\",\n claim_drop: \"Drop claims\",\n comment: \"On-chain comments\",\n create_ticket_collection: \"Ticketed events created\",\n buy_ticket: \"Tickets received\",\n create_club: \"Clubs started\",\n join_club: \"Clubs joined\",\n create_sponsorship_offer: \"Sponsorships opened\",\n place_sponsorship_bid: \"Sponsorship bids\",\n sponsorship_licensed_sponsor: \"Sponsorships secured (sponsor)\",\n sponsorship_licensed_author: \"Sponsorships secured (creator)\",\n launch_coin: \"Creator coins launched\",\n};\n\nconst BADGE_ICONS: Record<string, LucideIcon> = {\n Flame, Package, CheckCircle2, GitBranch, TrendingUp, Layers,\n Ticket, Crown, Coins, Star, Gem, Zap, Award, Users, MessageSquare, HandCoins,\n Handshake,\n};\n\nconst EARN_GROUPS: {\n title: string;\n textClass: string;\n tileClass: string;\n items: { label: string; href: string; Icon: LucideIcon }[];\n}[] = [\n {\n title: \"Create\",\n textClass: \"text-brand-purple\",\n tileClass: \"bg-brand-purple\",\n items: [\n { label: \"Create a collection\", href: \"/launchpad/single-editions/collection\", Icon: Layers },\n { label: \"Mint an asset\", href: \"/launchpad/single-editions\", Icon: Palette },\n { label: \"Launch a drop or POP\", href: \"/launchpad\", Icon: Rocket },\n { label: \"Launch a creator coin\", href: \"/launchpad/coin/create\", Icon: Coins },\n { label: \"Remix existing work\", href: \"/marketplace\", Icon: GitBranch },\n ],\n },\n {\n title: \"Collect\",\n textClass: \"text-brand-blue\",\n tileClass: \"bg-brand-blue\",\n items: [\n { label: \"Collect an asset\", href: \"/marketplace\", Icon: ShoppingBag },\n { label: \"Make an offer\", href: \"/marketplace\", Icon: Handshake },\n { label: \"List an asset for sale\", href: \"/portfolio/assets\", Icon: Tag },\n { label: \"Get an event ticket\", href: \"/launchpad\", Icon: Ticket },\n ],\n },\n {\n title: \"Connect\",\n textClass: \"text-brand-rose\",\n tileClass: \"bg-brand-rose\",\n items: [\n { label: \"Start or join a club\", href: \"/launchpad\", Icon: UserRoundCheck },\n { label: \"Open a sponsorship\", href: \"/launchpad\", Icon: Handshake },\n { label: \"Join the conversation\", href: \"/marketplace\", Icon: MessageSquare },\n { label: \"Complete your profile\", href: \"/settings\", Icon: UserRoundCheck },\n ],\n },\n];\n\nfunction Hero() {\n return (\n <section className=\"space-y-5\">\n <h1 className=\"text-5xl sm:text-6xl font-black tracking-tight leading-[1.02]\">\n Community <span className=\"bg-gradient-to-r from-brand-rose to-brand-orange bg-clip-text text-transparent\">Rewards</span>\n </h1>\n <p className=\"text-lg text-foreground/70 max-w-xl leading-relaxed font-medium\">\n Every action earns XP, and active members receive allocations from the\n Creator's Fund based on how much they participate. Scores and\n badges are recalculated weekly.{\" \"}\n <Link href=\"/journey\" className=\"text-foreground underline underline-offset-2 hover:text-brand-orange transition-colors\">\n See the full system\n </Link>\n .\n </p>\n </section>\n );\n}\n\nfunction SignInButton() {\n const { onRequireWallet, connectLabel } = useMedialaneApp();\n return (\n <Button size=\"lg\" className=\"w-full rounded-full px-7\" onClick={onRequireWallet}>\n {connectLabel ?? \"Sign in\"}\n </Button>\n );\n}\n\nfunction StatusPanel({ address }: { address: string | null | undefined }) {\n const { data: rewards, isLoading } = useRewards(address);\n const { data: config } = useRewardsConfig();\n\n if (!address) {\n return (\n <div className=\"shrink-0 rounded-3xl bg-gradient-to-br from-brand-rose/10 via-brand-orange/[0.06] to-transparent p-6 space-y-3 sm:max-w-xs\">\n <p className=\"text-sm text-foreground/70 font-medium\">Sign in to see your score.</p>\n <SignInButton />\n </div>\n );\n }\n\n if (isLoading || !rewards || !config) {\n return <Skeleton className=\"h-40 w-full sm:w-80 rounded-3xl shrink-0\" />;\n }\n\n const levelXp = config.levels.find((l) => l.level === rewards.currentLevel)?.xpRequired ?? 0;\n const nextLevelXp = rewards.nextLevel?.xpRequired ?? null;\n const hasXp = rewards.totalXp > 0;\n const pct = nextLevelXp ? Math.min(100, Math.round(((rewards.totalXp - levelXp) / (nextLevelXp - levelXp)) * 100)) : 100;\n\n return (\n <div className=\"shrink-0 rounded-3xl bg-gradient-to-br from-brand-rose/10 via-brand-orange/[0.06] to-transparent p-6 sm:min-w-[300px]\">\n <p className=\"text-6xl font-black tabular-nums leading-none tracking-tight\">\n {rewards.totalXp.toLocaleString()}\n </p>\n <p className=\"text-xs font-bold uppercase tracking-widest text-foreground/40 mt-1.5\">XP earned</p>\n\n <div className=\"mt-4 flex items-center gap-2\">\n <LevelBadge level={rewards.currentLevel} name={rewards.currentLevelName} badgeColor={rewards.badgeColor} size=\"md\" />\n </div>\n {!hasXp && (\n <p className=\"text-sm text-foreground/60 font-medium mt-2\">Mint, collect, or complete your profile to start.</p>\n )}\n {rewards.nextLevel && (\n <div className=\"mt-3 space-y-1.5\">\n <div className=\"h-2 w-full rounded-full bg-foreground/[0.08] overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-gradient-to-r from-brand-rose to-brand-orange transition-[width]\"\n style={{ width: `${pct}%` }}\n />\n </div>\n <p className=\"text-sm font-semibold text-foreground/60\">\n {(nextLevelXp! - rewards.totalXp).toLocaleString()} XP to {rewards.nextLevel.name}\n </p>\n </div>\n )}\n </div>\n );\n}\n\nfunction PersonalPanel({ address }: { address: string | null | undefined }) {\n const { data: rewards } = useRewards(address);\n const { data: events } = useRewardsEvents(address, 1, 6);\n const { data: config } = useRewardsConfig();\n\n const actionLabel = (type: string) =>\n config?.actions.find((a) => a.type === type)?.label ?? REWARD_ACTION_LABELS[type] ?? type;\n\n if (!address || !rewards || Object.keys(rewards.breakdown).length === 0) return null;\n\n return (\n <section className=\"space-y-5\">\n <SectionTitle>Your breakdown</SectionTitle>\n <div className=\"divide-y divide-foreground/[0.06]\">\n {Object.entries(rewards.breakdown)\n .sort(([, a], [, b]) => b - a)\n .map(([action, xp]) => (\n <div key={action} className=\"flex items-center justify-between py-3.5\">\n <span className=\"text-base font-medium text-foreground/70\">{actionLabel(action)}</span>\n <span className=\"text-lg font-black tabular-nums\">+{xp.toLocaleString()}</span>\n </div>\n ))}\n </div>\n {events && events.data.length > 0 && (\n <div className=\"divide-y divide-foreground/[0.06]\">\n {events.data.map((e) => (\n <div key={e.id} className=\"flex items-center justify-between py-3.5\">\n <span className=\"text-base font-medium text-foreground/70\">{actionLabel(e.actionType)}</span>\n <span className=\"text-lg font-black tabular-nums text-brand-rose\">+{e.finalXp}</span>\n </div>\n ))}\n </div>\n )}\n </section>\n );\n}\n\nfunction CommunityPanel({ address }: { address: string | null | undefined }) {\n return (\n <section className=\"space-y-5\">\n <div>\n <SectionTitle>Community</SectionTitle>\n <p className=\"text-base text-foreground/60 mt-1.5 font-medium\">Real members already earning XP.</p>\n </div>\n <LeaderboardPanel myAddress={address} showHeading={false} limit={12} />\n </section>\n );\n}\n\nfunction EarnMorePanel() {\n return (\n <section className=\"space-y-6\">\n <SectionTitle>Ways to earn</SectionTitle>\n {EARN_GROUPS.map((group) => (\n <div key={group.title} className=\"space-y-3\">\n <p className={`text-sm font-black uppercase tracking-wide ${group.textClass}`}>{group.title}</p>\n <div className=\"grid grid-cols-2 sm:grid-cols-3 gap-3\">\n {group.items.map(({ label, href, Icon }) => (\n <Link\n key={href + label}\n href={href}\n className=\"group flex flex-col gap-3 rounded-2xl bg-foreground/[0.04] hover:bg-foreground/[0.07] p-4 transition-colors\"\n >\n <span className={`flex h-10 w-10 items-center justify-center rounded-xl text-white shrink-0 ${group.tileClass}`}>\n <Icon className=\"h-5 w-5\" />\n </span>\n <span className=\"text-sm font-bold leading-snug text-foreground\">{label}</span>\n </Link>\n ))}\n </div>\n </div>\n ))}\n </section>\n );\n}\n\nfunction CreatorsFundCard() {\n return (\n <section className=\"relative overflow-hidden rounded-3xl bg-gradient-to-br from-brand-rose to-brand-orange p-8 text-white\">\n <div className=\"pointer-events-none absolute -top-16 -right-16 h-56 w-56 rounded-full bg-white/10 blur-3xl\" />\n <div className=\"pointer-events-none absolute -bottom-20 -left-10 h-56 w-56 rounded-full bg-black/10 blur-3xl\" />\n\n <div className=\"relative space-y-6\">\n <h2 className=\"text-3xl font-black tracking-tight leading-none\">\n Creator's Fund\n </h2>\n\n <p className=\"text-base font-medium text-white/90 leading-relaxed max-w-sm\">\n A share of what Medialane earns is set aside in one public wallet and airdropped back\n to the people creating and trading here, split by XP.\n </p>\n\n <div className=\"flex flex-wrap items-center gap-4 pt-2\">\n <Link\n href=\"/airdrop\"\n className=\"inline-flex items-center gap-2 rounded-full bg-white px-6 py-3 text-sm font-black text-brand-rose hover:bg-white/90 transition-colors\"\n >\n <Gift className=\"h-4 w-4\" />\n How the fund works\n </Link>\n <a\n href=\"https://medialane.org/creators-fund\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1.5 text-sm font-bold text-white/90 hover:text-white transition-colors\"\n >\n Watch the wallet\n <ExternalLink className=\"h-3.5 w-3.5\" />\n </a>\n </div>\n </div>\n </section>\n );\n}\n\nfunction BadgesPanel({ address }: { address: string | null | undefined }) {\n const { data: config, isLoading } = useRewardsConfig();\n const { data: rewards } = useRewards(address);\n\n if (isLoading) {\n return (\n <div className=\"grid grid-cols-3 gap-3\">\n {Array.from({ length: 6 }).map((_, i) => (\n <Skeleton key={i} className=\"h-16 rounded-2xl\" />\n ))}\n </div>\n );\n }\n\n if (!config) return null;\n\n const earnedKeys = new Set(rewards?.badges.map((b) => b.key) ?? []);\n\n return (\n <section className=\"space-y-4\">\n <SectionTitle>Badges to earn</SectionTitle>\n <div className=\"grid grid-cols-3 gap-3\">\n {config.badges.map((badge: ApiRewardsBadge) => {\n const isEarned = earnedKeys.has(badge.key);\n const Icon = BADGE_ICONS[badge.icon] ?? Award;\n return (\n <div\n key={badge.key}\n title={badge.description}\n className={`flex flex-col items-center gap-1.5 rounded-2xl p-3 text-center transition-colors ${\n isEarned ? \"bg-brand-blue text-white\" : \"bg-foreground/[0.04] text-foreground/40\"\n }`}\n >\n <Icon className=\"h-5 w-5\" />\n <span className=\"text-xs font-bold leading-tight\">{badge.name}</span>\n </div>\n );\n })}\n </div>\n </section>\n );\n}\n\nfunction SectionTitle({ children }: { children: React.ReactNode }) {\n return <h2 className=\"text-2xl font-black tracking-tight text-foreground\">{children}</h2>;\n}\n\nexport function RewardsDashboard() {\n const { walletAddress: address } = useMedialaneApp();\n const { data: rewards } = useRewards(address);\n const { leveledUpTo, newBadgeKeys, dismiss } = useRewardsCelebrations(address, rewards ?? null);\n\n const unlockedBadges = rewards\n ? newBadgeKeys.map((key) => rewards.badges.find((b) => b.key === key)).filter((b) => b !== undefined)\n : [];\n\n return (\n <div className=\"space-y-14\">\n {unlockedBadges.length > 0 && (\n <div className=\"space-y-3\">\n {unlockedBadges.map((badge) => (\n <BadgeUnlocked key={badge.key} badge={badge} />\n ))}\n </div>\n )}\n\n {leveledUpTo !== null && rewards && (\n <LevelUpCelebration\n level={leveledUpTo}\n name={rewards.currentLevelName}\n badgeColor={rewards.badgeColor}\n onDismiss={dismiss}\n />\n )}\n\n <div className=\"flex flex-col sm:flex-row sm:items-start sm:justify-between gap-8\">\n <Hero />\n <StatusPanel address={address} />\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-12 gap-14 items-start\">\n\n <div className=\"lg:col-span-7 space-y-14\">\n <CommunityPanel address={address} />\n <PersonalPanel address={address} />\n </div>\n\n <div className=\"lg:col-span-5 space-y-10\">\n <EarnMorePanel />\n <CreatorsFundCard />\n <BadgesPanel address={address} />\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/rewards/rewards-dashboard.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"../link.js\";\nimport { Button } from \"../button.js\";\nimport { Skeleton } from \"../skeleton.js\";\nimport { useMedialaneApp } from \"../medialane-app.js\";\nimport { useRewards, useRewardsConfig, useRewardsEvents } from \"../../utils/use-rewards.js\";\nimport { LevelBadge } from \"./level-badge.js\";\nimport { LevelUpCelebration } from \"./level-up-celebration.js\";\nimport { BadgeUnlocked } from \"./badge-unlocked.js\";\nimport { useRewardsCelebrations } from \"./use-rewards-celebrations.js\";\nimport { LeaderboardPanel } from \"./leaderboard-panel.js\";\nimport type { ApiRewardsBadge } from \"@medialane/sdk\";\nimport {\n Gift,\n ExternalLink,\n Palette,\n Layers,\n Tag,\n Handshake,\n ShoppingBag,\n Rocket,\n GitBranch,\n UserRoundCheck,\n Ticket,\n MessageSquare,\n Users,\n type LucideIcon,\n Package,\n CheckCircle2,\n TrendingUp,\n Crown,\n Coins,\n Star,\n Gem,\n Award,\n HandCoins,\n Flame,\n Zap,\n} from \"lucide-react\";\n\nexport const REWARD_ACTION_LABELS: Record<string, string> = {\n complete_profile: \"Complete profile\",\n mint_asset: \"Mint assets\",\n create_collection: \"Create collections\",\n launch_launchpad: \"Launch drops / POPs\",\n create_remix: \"Create remixes\",\n list_asset: \"Sell assets\",\n buy_asset: \"Buy assets\",\n make_offer: \"Make offers\",\n counter_offer: \"Counter offers\",\n offer_accepted_seller: \"Offers accepted (sold)\",\n offer_accepted_buyer: \"Offers accepted (bought)\",\n claim_pop: \"POP claims\",\n claim_drop: \"Drop claims\",\n comment: \"On-chain comments\",\n create_ticket_collection: \"Ticketed events created\",\n buy_ticket: \"Tickets received\",\n create_club: \"Clubs started\",\n join_club: \"Clubs joined\",\n create_sponsorship_offer: \"Sponsorships opened\",\n place_sponsorship_bid: \"Sponsorship bids\",\n sponsorship_licensed_sponsor: \"Sponsorships secured (sponsor)\",\n sponsorship_licensed_author: \"Sponsorships secured (creator)\",\n launch_coin: \"Creator coins launched\",\n};\n\nconst BADGE_ICONS: Record<string, LucideIcon> = {\n Flame, Package, CheckCircle2, GitBranch, TrendingUp, Layers,\n Ticket, Crown, Coins, Star, Gem, Zap, Award, Users, MessageSquare, HandCoins,\n Handshake,\n};\n\nconst EARN_GROUPS: {\n title: string;\n textClass: string;\n tileClass: string;\n items: { label: string; href: string; Icon: LucideIcon }[];\n}[] = [\n {\n title: \"Create\",\n textClass: \"text-brand-purple\",\n tileClass: \"bg-brand-purple\",\n items: [\n { label: \"Create a collection\", href: \"/launchpad/single-editions/collection\", Icon: Layers },\n { label: \"Mint an asset\", href: \"/launchpad/single-editions\", Icon: Palette },\n { label: \"Launch a drop or POP\", href: \"/launchpad\", Icon: Rocket },\n { label: \"Launch a creator coin\", href: \"/launchpad/coin/create\", Icon: Coins },\n { label: \"Remix existing work\", href: \"/marketplace\", Icon: GitBranch },\n ],\n },\n {\n title: \"Collect\",\n textClass: \"text-brand-blue\",\n tileClass: \"bg-brand-blue\",\n items: [\n { label: \"Collect an asset\", href: \"/marketplace\", Icon: ShoppingBag },\n { label: \"Make an offer\", href: \"/marketplace\", Icon: Handshake },\n { label: \"Sell an asset\", href: \"/portfolio/assets\", Icon: Tag },\n { label: \"Get an event ticket\", href: \"/launchpad\", Icon: Ticket },\n ],\n },\n {\n title: \"Connect\",\n textClass: \"text-brand-rose\",\n tileClass: \"bg-brand-rose\",\n items: [\n { label: \"Start or join a club\", href: \"/launchpad\", Icon: UserRoundCheck },\n { label: \"Open a sponsorship\", href: \"/launchpad\", Icon: Handshake },\n { label: \"Join the conversation\", href: \"/marketplace\", Icon: MessageSquare },\n { label: \"Complete your profile\", href: \"/settings\", Icon: UserRoundCheck },\n ],\n },\n];\n\nfunction Hero() {\n return (\n <section className=\"space-y-5\">\n <h1 className=\"text-5xl sm:text-6xl font-black tracking-tight leading-[1.02]\">\n Community <span className=\"bg-gradient-to-r from-brand-rose to-brand-orange bg-clip-text text-transparent\">Rewards</span>\n </h1>\n <p className=\"text-lg text-foreground/70 max-w-xl leading-relaxed font-medium\">\n Every action earns XP, and active members receive allocations from the\n Creator's Fund based on how much they participate. Scores and\n badges are recalculated weekly.{\" \"}\n <Link href=\"/journey\" className=\"text-foreground underline underline-offset-2 hover:text-brand-orange transition-colors\">\n See the full system\n </Link>\n .\n </p>\n </section>\n );\n}\n\nfunction SignInButton() {\n const { onRequireWallet, connectLabel } = useMedialaneApp();\n return (\n <Button size=\"lg\" className=\"w-full rounded-full px-7\" onClick={onRequireWallet}>\n {connectLabel ?? \"Sign in\"}\n </Button>\n );\n}\n\nfunction StatusPanel({ address }: { address: string | null | undefined }) {\n const { data: rewards, isLoading } = useRewards(address);\n const { data: config } = useRewardsConfig();\n\n if (!address) {\n return (\n <div className=\"shrink-0 rounded-3xl bg-gradient-to-br from-brand-rose/10 via-brand-orange/[0.06] to-transparent p-6 space-y-3 sm:max-w-xs\">\n <p className=\"text-sm text-foreground/70 font-medium\">Sign in to see your score.</p>\n <SignInButton />\n </div>\n );\n }\n\n if (isLoading || !rewards || !config) {\n return <Skeleton className=\"h-40 w-full sm:w-80 rounded-3xl shrink-0\" />;\n }\n\n const levelXp = config.levels.find((l) => l.level === rewards.currentLevel)?.xpRequired ?? 0;\n const nextLevelXp = rewards.nextLevel?.xpRequired ?? null;\n const hasXp = rewards.totalXp > 0;\n const pct = nextLevelXp ? Math.min(100, Math.round(((rewards.totalXp - levelXp) / (nextLevelXp - levelXp)) * 100)) : 100;\n\n return (\n <div className=\"shrink-0 rounded-3xl bg-gradient-to-br from-brand-rose/10 via-brand-orange/[0.06] to-transparent p-6 sm:min-w-[300px]\">\n <p className=\"text-6xl font-black tabular-nums leading-none tracking-tight\">\n {rewards.totalXp.toLocaleString()}\n </p>\n <p className=\"text-xs font-bold uppercase tracking-widest text-foreground/40 mt-1.5\">XP earned</p>\n\n <div className=\"mt-4 flex items-center gap-2\">\n <LevelBadge level={rewards.currentLevel} name={rewards.currentLevelName} badgeColor={rewards.badgeColor} size=\"md\" />\n </div>\n {!hasXp && (\n <p className=\"text-sm text-foreground/60 font-medium mt-2\">Mint, collect, or complete your profile to start.</p>\n )}\n {rewards.nextLevel && (\n <div className=\"mt-3 space-y-1.5\">\n <div className=\"h-2 w-full rounded-full bg-foreground/[0.08] overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-gradient-to-r from-brand-rose to-brand-orange transition-[width]\"\n style={{ width: `${pct}%` }}\n />\n </div>\n <p className=\"text-sm font-semibold text-foreground/60\">\n {(nextLevelXp! - rewards.totalXp).toLocaleString()} XP to {rewards.nextLevel.name}\n </p>\n </div>\n )}\n </div>\n );\n}\n\nfunction PersonalPanel({ address }: { address: string | null | undefined }) {\n const { data: rewards } = useRewards(address);\n const { data: events } = useRewardsEvents(address, 1, 6);\n const { data: config } = useRewardsConfig();\n\n const actionLabel = (type: string) =>\n config?.actions.find((a) => a.type === type)?.label ?? REWARD_ACTION_LABELS[type] ?? type;\n\n if (!address || !rewards || Object.keys(rewards.breakdown).length === 0) return null;\n\n return (\n <section className=\"space-y-5\">\n <SectionTitle>Your breakdown</SectionTitle>\n <div className=\"divide-y divide-foreground/[0.06]\">\n {Object.entries(rewards.breakdown)\n .sort(([, a], [, b]) => b - a)\n .map(([action, xp]) => (\n <div key={action} className=\"flex items-center justify-between py-3.5\">\n <span className=\"text-base font-medium text-foreground/70\">{actionLabel(action)}</span>\n <span className=\"text-lg font-black tabular-nums\">+{xp.toLocaleString()}</span>\n </div>\n ))}\n </div>\n {events && events.data.length > 0 && (\n <div className=\"divide-y divide-foreground/[0.06]\">\n {events.data.map((e) => (\n <div key={e.id} className=\"flex items-center justify-between py-3.5\">\n <span className=\"text-base font-medium text-foreground/70\">{actionLabel(e.actionType)}</span>\n <span className=\"text-lg font-black tabular-nums text-brand-rose\">+{e.finalXp}</span>\n </div>\n ))}\n </div>\n )}\n </section>\n );\n}\n\nfunction CommunityPanel({ address }: { address: string | null | undefined }) {\n return (\n <section className=\"space-y-5\">\n <div>\n <SectionTitle>Community</SectionTitle>\n <p className=\"text-base text-foreground/60 mt-1.5 font-medium\">Real members already earning XP.</p>\n </div>\n <LeaderboardPanel myAddress={address} showHeading={false} limit={12} />\n </section>\n );\n}\n\nfunction EarnMorePanel() {\n return (\n <section className=\"space-y-6\">\n <SectionTitle>Ways to earn</SectionTitle>\n {EARN_GROUPS.map((group) => (\n <div key={group.title} className=\"space-y-3\">\n <p className={`text-sm font-black uppercase tracking-wide ${group.textClass}`}>{group.title}</p>\n <div className=\"grid grid-cols-2 sm:grid-cols-3 gap-3\">\n {group.items.map(({ label, href, Icon }) => (\n <Link\n key={href + label}\n href={href}\n className=\"group flex flex-col gap-3 rounded-2xl bg-foreground/[0.04] hover:bg-foreground/[0.07] p-4 transition-colors\"\n >\n <span className={`flex h-10 w-10 items-center justify-center rounded-xl text-white shrink-0 ${group.tileClass}`}>\n <Icon className=\"h-5 w-5\" />\n </span>\n <span className=\"text-sm font-bold leading-snug text-foreground\">{label}</span>\n </Link>\n ))}\n </div>\n </div>\n ))}\n </section>\n );\n}\n\nfunction CreatorsFundCard() {\n return (\n <section className=\"relative overflow-hidden rounded-3xl bg-gradient-to-br from-brand-rose to-brand-orange p-8 text-white\">\n <div className=\"pointer-events-none absolute -top-16 -right-16 h-56 w-56 rounded-full bg-white/10 blur-3xl\" />\n <div className=\"pointer-events-none absolute -bottom-20 -left-10 h-56 w-56 rounded-full bg-black/10 blur-3xl\" />\n\n <div className=\"relative space-y-6\">\n <h2 className=\"text-3xl font-black tracking-tight leading-none\">\n Creator's Fund\n </h2>\n\n <p className=\"text-base font-medium text-white/90 leading-relaxed max-w-sm\">\n A share of what Medialane earns is set aside in one public wallet and airdropped back\n to the people creating and trading here, split by XP.\n </p>\n\n <div className=\"flex flex-wrap items-center gap-4 pt-2\">\n <Link\n href=\"/airdrop\"\n className=\"inline-flex items-center gap-2 rounded-full bg-white px-6 py-3 text-sm font-black text-brand-rose hover:bg-white/90 transition-colors\"\n >\n <Gift className=\"h-4 w-4\" />\n How the fund works\n </Link>\n <a\n href=\"https://medialane.org/creators-fund\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1.5 text-sm font-bold text-white/90 hover:text-white transition-colors\"\n >\n Watch the wallet\n <ExternalLink className=\"h-3.5 w-3.5\" />\n </a>\n </div>\n </div>\n </section>\n );\n}\n\nfunction BadgesPanel({ address }: { address: string | null | undefined }) {\n const { data: config, isLoading } = useRewardsConfig();\n const { data: rewards } = useRewards(address);\n\n if (isLoading) {\n return (\n <div className=\"grid grid-cols-3 gap-3\">\n {Array.from({ length: 6 }).map((_, i) => (\n <Skeleton key={i} className=\"h-16 rounded-2xl\" />\n ))}\n </div>\n );\n }\n\n if (!config) return null;\n\n const earnedKeys = new Set(rewards?.badges.map((b) => b.key) ?? []);\n\n return (\n <section className=\"space-y-4\">\n <SectionTitle>Badges to earn</SectionTitle>\n <div className=\"grid grid-cols-3 gap-3\">\n {config.badges.map((badge: ApiRewardsBadge) => {\n const isEarned = earnedKeys.has(badge.key);\n const Icon = BADGE_ICONS[badge.icon] ?? Award;\n return (\n <div\n key={badge.key}\n title={badge.description}\n className={`flex flex-col items-center gap-1.5 rounded-2xl p-3 text-center transition-colors ${\n isEarned ? \"bg-brand-blue text-white\" : \"bg-foreground/[0.04] text-foreground/40\"\n }`}\n >\n <Icon className=\"h-5 w-5\" />\n <span className=\"text-xs font-bold leading-tight\">{badge.name}</span>\n </div>\n );\n })}\n </div>\n </section>\n );\n}\n\nfunction SectionTitle({ children }: { children: React.ReactNode }) {\n return <h2 className=\"text-2xl font-black tracking-tight text-foreground\">{children}</h2>;\n}\n\nexport function RewardsDashboard() {\n const { walletAddress: address } = useMedialaneApp();\n const { data: rewards } = useRewards(address);\n const { leveledUpTo, newBadgeKeys, dismiss } = useRewardsCelebrations(address, rewards ?? null);\n\n const unlockedBadges = rewards\n ? newBadgeKeys.map((key) => rewards.badges.find((b) => b.key === key)).filter((b) => b !== undefined)\n : [];\n\n return (\n <div className=\"space-y-14\">\n {unlockedBadges.length > 0 && (\n <div className=\"space-y-3\">\n {unlockedBadges.map((badge) => (\n <BadgeUnlocked key={badge.key} badge={badge} />\n ))}\n </div>\n )}\n\n {leveledUpTo !== null && rewards && (\n <LevelUpCelebration\n level={leveledUpTo}\n name={rewards.currentLevelName}\n badgeColor={rewards.badgeColor}\n onDismiss={dismiss}\n />\n )}\n\n <div className=\"flex flex-col sm:flex-row sm:items-start sm:justify-between gap-8\">\n <Hero />\n <StatusPanel address={address} />\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-12 gap-14 items-start\">\n\n <div className=\"lg:col-span-7 space-y-14\">\n <CommunityPanel address={address} />\n <PersonalPanel address={address} />\n </div>\n\n <div className=\"lg:col-span-5 space-y-10\">\n <EarnMorePanel />\n <CreatorsFundCard />\n <BadgesPanel address={address} />\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -31,10 +31,7 @@ function isStaleChunkError(error) {
|
|
|
31
31
|
`${error.name} ${error.message}`
|
|
32
32
|
);
|
|
33
33
|
}
|
|
34
|
-
function RouteError({
|
|
35
|
-
error,
|
|
36
|
-
reset
|
|
37
|
-
}) {
|
|
34
|
+
function RouteError({ error }) {
|
|
38
35
|
(0, import_react.useEffect)(() => {
|
|
39
36
|
console.error(error);
|
|
40
37
|
if (isStaleChunkError(error) && !sessionStorage.getItem("ml_chunk_reload")) {
|
|
@@ -46,13 +43,12 @@ function RouteError({
|
|
|
46
43
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "h-14 w-14 rounded-2xl bg-destructive/10 flex items-center justify-center", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.AlertTriangle, { className: "h-7 w-7 text-destructive" }) }),
|
|
47
44
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-2", children: [
|
|
48
45
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h1", { className: "text-2xl font-bold", children: "Reload to continue" }),
|
|
49
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-muted-foreground text-sm max-w-xs", children: "This page is ready to reload." }),
|
|
50
46
|
error.digest && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { className: "text-2xs text-muted-foreground/60 tabular-nums", children: [
|
|
51
47
|
"Error ID: ",
|
|
52
48
|
error.digest
|
|
53
49
|
] })
|
|
54
50
|
] }),
|
|
55
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_button.Button, { onClick:
|
|
51
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_button.Button, { onClick: () => window.location.reload(), children: [
|
|
56
52
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.RefreshCw, { className: "h-4 w-4 mr-2" }),
|
|
57
53
|
"Reload"
|
|
58
54
|
] })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/route-error.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect } from \"react\";\nimport { Button } from \"./button.js\";\nimport { AlertTriangle, RefreshCw } from \"lucide-react\";\n\nfunction isStaleChunkError(error: Error): boolean {\n return /ChunkLoadError|Loading chunk .* failed|dynamically imported module|Importing a module script failed/i.test(\n `${error.name} ${error.message}`\n );\n}\n\nexport function RouteError({
|
|
1
|
+
{"version":3,"sources":["../../src/components/route-error.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect } from \"react\";\nimport { Button } from \"./button.js\";\nimport { AlertTriangle, RefreshCw } from \"lucide-react\";\n\nfunction isStaleChunkError(error: Error): boolean {\n return /ChunkLoadError|Loading chunk .* failed|dynamically imported module|Importing a module script failed/i.test(\n `${error.name} ${error.message}`\n );\n}\n\nexport function RouteError({ error }: { error: Error & { digest?: string } }) {\n useEffect(() => {\n console.error(error);\n\n if (isStaleChunkError(error) && !sessionStorage.getItem(\"ml_chunk_reload\")) {\n sessionStorage.setItem(\"ml_chunk_reload\", \"1\");\n window.location.reload();\n }\n }, [error]);\n\n return (\n <div className=\"flex flex-col items-center justify-center min-h-[60vh] px-4 text-center space-y-6\">\n <div className=\"h-14 w-14 rounded-2xl bg-destructive/10 flex items-center justify-center\">\n <AlertTriangle className=\"h-7 w-7 text-destructive\" />\n </div>\n <div className=\"space-y-2\">\n <h1 className=\"text-2xl font-bold\">Reload to continue</h1>\n {error.digest && (\n <p className=\"text-2xs text-muted-foreground/60 tabular-nums\">\n Error ID: {error.digest}\n </p>\n )}\n </div>\n <Button onClick={() => window.location.reload()}>\n <RefreshCw className=\"h-4 w-4 mr-2\" />\n Reload\n </Button>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBQ;AAvBR,mBAA0B;AAC1B,oBAAuB;AACvB,0BAAyC;AAEzC,SAAS,kBAAkB,OAAuB;AAChD,SAAO,uGAAuG;AAAA,IAC5G,GAAG,MAAM,IAAI,IAAI,MAAM,OAAO;AAAA,EAChC;AACF;AAEO,SAAS,WAAW,EAAE,MAAM,GAA2C;AAC5E,8BAAU,MAAM;AACd,YAAQ,MAAM,KAAK;AAEnB,QAAI,kBAAkB,KAAK,KAAK,CAAC,eAAe,QAAQ,iBAAiB,GAAG;AAC1E,qBAAe,QAAQ,mBAAmB,GAAG;AAC7C,aAAO,SAAS,OAAO;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,KAAK,CAAC;AAEV,SACE,6CAAC,SAAI,WAAU,qFACb;AAAA,gDAAC,SAAI,WAAU,4EACb,sDAAC,qCAAc,WAAU,4BAA2B,GACtD;AAAA,IACA,6CAAC,SAAI,WAAU,aACb;AAAA,kDAAC,QAAG,WAAU,sBAAqB,gCAAkB;AAAA,MACpD,MAAM,UACL,6CAAC,OAAE,WAAU,kDAAiD;AAAA;AAAA,QACjD,MAAM;AAAA,SACnB;AAAA,OAEJ;AAAA,IACA,6CAAC,wBAAO,SAAS,MAAM,OAAO,SAAS,OAAO,GAC5C;AAAA,kDAAC,iCAAU,WAAU,gBAAe;AAAA,MAAE;AAAA,OAExC;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
|
|
3
|
-
declare function RouteError({ error
|
|
3
|
+
declare function RouteError({ error }: {
|
|
4
4
|
error: Error & {
|
|
5
5
|
digest?: string;
|
|
6
6
|
};
|
|
7
|
-
reset: () => void;
|
|
8
7
|
}): react_jsx_runtime.JSX.Element;
|
|
9
8
|
|
|
10
9
|
export { RouteError };
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
|
|
3
|
-
declare function RouteError({ error
|
|
3
|
+
declare function RouteError({ error }: {
|
|
4
4
|
error: Error & {
|
|
5
5
|
digest?: string;
|
|
6
6
|
};
|
|
7
|
-
reset: () => void;
|
|
8
7
|
}): react_jsx_runtime.JSX.Element;
|
|
9
8
|
|
|
10
9
|
export { RouteError };
|
|
@@ -8,10 +8,7 @@ function isStaleChunkError(error) {
|
|
|
8
8
|
`${error.name} ${error.message}`
|
|
9
9
|
);
|
|
10
10
|
}
|
|
11
|
-
function RouteError({
|
|
12
|
-
error,
|
|
13
|
-
reset
|
|
14
|
-
}) {
|
|
11
|
+
function RouteError({ error }) {
|
|
15
12
|
useEffect(() => {
|
|
16
13
|
console.error(error);
|
|
17
14
|
if (isStaleChunkError(error) && !sessionStorage.getItem("ml_chunk_reload")) {
|
|
@@ -23,13 +20,12 @@ function RouteError({
|
|
|
23
20
|
/* @__PURE__ */ jsx("div", { className: "h-14 w-14 rounded-2xl bg-destructive/10 flex items-center justify-center", children: /* @__PURE__ */ jsx(AlertTriangle, { className: "h-7 w-7 text-destructive" }) }),
|
|
24
21
|
/* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
|
|
25
22
|
/* @__PURE__ */ jsx("h1", { className: "text-2xl font-bold", children: "Reload to continue" }),
|
|
26
|
-
/* @__PURE__ */ jsx("p", { className: "text-muted-foreground text-sm max-w-xs", children: "This page is ready to reload." }),
|
|
27
23
|
error.digest && /* @__PURE__ */ jsxs("p", { className: "text-2xs text-muted-foreground/60 tabular-nums", children: [
|
|
28
24
|
"Error ID: ",
|
|
29
25
|
error.digest
|
|
30
26
|
] })
|
|
31
27
|
] }),
|
|
32
|
-
/* @__PURE__ */ jsxs(Button, { onClick:
|
|
28
|
+
/* @__PURE__ */ jsxs(Button, { onClick: () => window.location.reload(), children: [
|
|
33
29
|
/* @__PURE__ */ jsx(RefreshCw, { className: "h-4 w-4 mr-2" }),
|
|
34
30
|
"Reload"
|
|
35
31
|
] })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/route-error.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect } from \"react\";\nimport { Button } from \"./button.js\";\nimport { AlertTriangle, RefreshCw } from \"lucide-react\";\n\nfunction isStaleChunkError(error: Error): boolean {\n return /ChunkLoadError|Loading chunk .* failed|dynamically imported module|Importing a module script failed/i.test(\n `${error.name} ${error.message}`\n );\n}\n\nexport function RouteError({
|
|
1
|
+
{"version":3,"sources":["../../src/components/route-error.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect } from \"react\";\nimport { Button } from \"./button.js\";\nimport { AlertTriangle, RefreshCw } from \"lucide-react\";\n\nfunction isStaleChunkError(error: Error): boolean {\n return /ChunkLoadError|Loading chunk .* failed|dynamically imported module|Importing a module script failed/i.test(\n `${error.name} ${error.message}`\n );\n}\n\nexport function RouteError({ error }: { error: Error & { digest?: string } }) {\n useEffect(() => {\n console.error(error);\n\n if (isStaleChunkError(error) && !sessionStorage.getItem(\"ml_chunk_reload\")) {\n sessionStorage.setItem(\"ml_chunk_reload\", \"1\");\n window.location.reload();\n }\n }, [error]);\n\n return (\n <div className=\"flex flex-col items-center justify-center min-h-[60vh] px-4 text-center space-y-6\">\n <div className=\"h-14 w-14 rounded-2xl bg-destructive/10 flex items-center justify-center\">\n <AlertTriangle className=\"h-7 w-7 text-destructive\" />\n </div>\n <div className=\"space-y-2\">\n <h1 className=\"text-2xl font-bold\">Reload to continue</h1>\n {error.digest && (\n <p className=\"text-2xs text-muted-foreground/60 tabular-nums\">\n Error ID: {error.digest}\n </p>\n )}\n </div>\n <Button onClick={() => window.location.reload()}>\n <RefreshCw className=\"h-4 w-4 mr-2\" />\n Reload\n </Button>\n </div>\n );\n}\n"],"mappings":";AAyBQ,cAKE,YALF;AAvBR,SAAS,iBAAiB;AAC1B,SAAS,cAAc;AACvB,SAAS,eAAe,iBAAiB;AAEzC,SAAS,kBAAkB,OAAuB;AAChD,SAAO,uGAAuG;AAAA,IAC5G,GAAG,MAAM,IAAI,IAAI,MAAM,OAAO;AAAA,EAChC;AACF;AAEO,SAAS,WAAW,EAAE,MAAM,GAA2C;AAC5E,YAAU,MAAM;AACd,YAAQ,MAAM,KAAK;AAEnB,QAAI,kBAAkB,KAAK,KAAK,CAAC,eAAe,QAAQ,iBAAiB,GAAG;AAC1E,qBAAe,QAAQ,mBAAmB,GAAG;AAC7C,aAAO,SAAS,OAAO;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,KAAK,CAAC;AAEV,SACE,qBAAC,SAAI,WAAU,qFACb;AAAA,wBAAC,SAAI,WAAU,4EACb,8BAAC,iBAAc,WAAU,4BAA2B,GACtD;AAAA,IACA,qBAAC,SAAI,WAAU,aACb;AAAA,0BAAC,QAAG,WAAU,sBAAqB,gCAAkB;AAAA,MACpD,MAAM,UACL,qBAAC,OAAE,WAAU,kDAAiD;AAAA;AAAA,QACjD,MAAM;AAAA,SACnB;AAAA,OAEJ;AAAA,IACA,qBAAC,UAAO,SAAS,MAAM,OAAO,SAAS,OAAO,GAC5C;AAAA,0BAAC,aAAU,WAAU,gBAAe;AAAA,MAAE;AAAA,OAExC;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -134,7 +134,7 @@ function TokenCard({
|
|
|
134
134
|
},
|
|
135
135
|
children: [
|
|
136
136
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Tag, { className: "h-3.5 w-3.5 mr-1.5" }),
|
|
137
|
-
"
|
|
137
|
+
"Sell"
|
|
138
138
|
]
|
|
139
139
|
}
|
|
140
140
|
) : null : listingOrder && onBuy ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "btn-border-animated p-[1.5px] rounded-[10px] flex-1 h-8", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
@@ -181,7 +181,7 @@ function TokenCard({
|
|
|
181
181
|
onClick: () => onList(token),
|
|
182
182
|
children: [
|
|
183
183
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Tag, { className: "h-3.5 w-3.5" }),
|
|
184
|
-
"
|
|
184
|
+
"Sell"
|
|
185
185
|
]
|
|
186
186
|
}
|
|
187
187
|
),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/token-card.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"./link.js\";\nimport {\n Loader2, ArrowUpRight, MoreHorizontal, Zap, HandCoins, Tag,\n Layers, GitBranch, Flag, UserCircle2, ArrowRightLeft, XCircle,\n} from \"lucide-react\";\nimport {\n DropdownMenu, DropdownMenuContent, DropdownMenuItem,\n DropdownMenuSeparator, DropdownMenuTrigger,\n} from \"./dropdown-menu.js\";\nimport { cn } from \"../utils/cn.js\";\nimport { formatDisplayPrice } from \"../utils/format.js\";\nimport { CurrencyIcon } from \"./currency-icon.js\";\nimport { PriceChipContent } from \"./dual-price.js\";\nimport { IpTypeBadge } from \"./ip-type-badge.js\";\nimport { AnimatedTokenMedia } from \"./animated-token-media.js\";\nimport { isLivingRenderCollection } from \"../data/living-render-collections.js\";\nimport { assetHref as buildAssetHref, collectionHref as buildCollectionHref } from \"@medialane/sdk\";\nimport type { ApiToken, Chain } from \"@medialane/sdk\";\nimport { tokenProfileLink } from \"../utils/token-profile-link.js\";\nimport { useImageUrl } from \"../utils/use-image-url.js\";\n\n\nconst BTN_BASE = \"h-8 rounded-[9px] flex items-center justify-center gap-1.5 text-xs font-semibold transition-all active:scale-[0.98] shadow-none border-0\";\nconst BTN_OUTLINE = cn(BTN_BASE, \"border border-border/60 text-foreground hover:bg-muted/60\");\n\nexport interface TokenCardProps {\n token: ApiToken;\n isOwner?: boolean;\n onList?: (token: ApiToken) => void;\n onTransfer?: (token: ApiToken) => void;\n onCancel?: (token: ApiToken) => void;\n onBuy?: (token: ApiToken) => void;\n onOffer?: (token: ApiToken) => void;\n onReport?: (token: ApiToken) => void;\n\n usdValue?: string | null;\n}\n\nexport function TokenCard({\n token,\n isOwner = false,\n onList,\n onTransfer,\n onCancel,\n onBuy,\n onOffer,\n onReport,\n usdValue,\n}: TokenCardProps) {\n const resolveImage = useImageUrl();\n const name = token.metadata?.name || `Token #${token.tokenId}`;\n const image = resolveImage(token.metadata?.image, { width: 480 });\n const animationUrl = token.metadata?.animationUrl ?? null;\n const ipType = token.metadata?.ipType;\n\n const listingOrder = token.activeOrders?.find(\n (o) => o.offer.itemType === \"ERC721\" || o.offer.itemType === \"ERC1155\"\n );\n\n const profileLink = tokenProfileLink(token);\n const hasPrimaryAction = isOwner ? !listingOrder : listingOrder ? !!onBuy : !!onOffer;\n\n const chain = token.chain.toUpperCase() as Chain;\n const live = isLivingRenderCollection(chain, token.contractAddress);\n const assetHref = buildAssetHref(chain, token.contractAddress, token.tokenId);\n const collectionHref = buildCollectionHref(chain, token.contractAddress);\n const remixHref = `/create/remix/${token.contractAddress}/${token.tokenId}`;\n\n const handleBuy = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n onBuy?.(token);\n };\n\n const handleOffer = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n onOffer?.(token);\n };\n\n return (\n <div className=\"card-base group relative overflow-hidden flex flex-col w-full\">\n {ipType && (\n <div className=\"absolute top-2 right-2 z-10\">\n <IpTypeBadge ipType={ipType as any} size=\"sm\" />\n </div>\n )}\n\n <Link href={assetHref} className=\"flex flex-col flex-1\">\n\n <div className=\"relative aspect-square bg-muted overflow-hidden shrink-0\">\n <AnimatedTokenMedia\n image={image}\n animationUrl={animationUrl}\n live={live}\n alt={name}\n mode=\"fill\"\n sizes=\"(max-width: 640px) 50vw, (max-width: 1024px) 33vw, 22vw\"\n className=\"object-cover\"\n fallback={\n <div className=\"absolute inset-0 bg-gradient-to-br from-brand-purple/15 to-brand-blue/15\" />\n }\n />\n\n {listingOrder && (\n <div className=\"absolute bottom-2 right-2 z-10\">\n <span className=\"inline-flex items-center gap-1.5 px-2.5 py-1.5 rounded-full text-sm font-bold bg-background/90 backdrop-blur-sm border border-border/40 shadow-sm tabular-nums\">\n <PriceChipContent\n amountFormatted={listingOrder.price.formatted}\n currency={listingOrder.price.currency}\n usdValue={usdValue}\n tone=\"card\"\n />\n </span>\n </div>\n )}\n\n {(token.metadataStatus === \"PENDING\" || token.metadataStatus === \"FETCHING\") && (\n <div className=\"absolute bottom-0 inset-x-0 flex items-center justify-center gap-1.5 bg-black/50 backdrop-blur-sm py-1.5\">\n <Loader2 className=\"h-3 w-3 animate-spin text-white/70\" />\n <span className=\"text-2xs text-white/70\">Indexing…</span>\n </div>\n )}\n </div>\n\n <div className=\"px-3 pt-2.5 pb-4 flex-1\">\n <p className=\"text-base font-bold line-clamp-2 leading-snug\">{name}</p>\n </div>\n </Link>\n\n <div className=\"px-3 pb-3 flex items-center gap-1.5\">\n\n <Link href={assetHref} className={cn(BTN_OUTLINE, \"px-2.5\", hasPrimaryAction ? \"shrink-0\" : \"flex-1\")}>\n <ArrowUpRight className=\"h-3.5 w-3.5\" />\n View\n </Link>\n\n {isOwner ? (\n !listingOrder ? (\n <button\n className={cn(BTN_OUTLINE, \"flex-1 text-brand-purple border-brand-purple/30 hover:bg-brand-purple/10 hover:text-brand-purple\")}\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onList?.(token); }}\n >\n <Tag className=\"h-3.5 w-3.5 mr-1.5\" />\n List\n </button>\n ) : null\n ) : listingOrder && onBuy ? (\n <div className=\"btn-border-animated p-[1.5px] rounded-[10px] flex-1 h-8\">\n <button\n className=\"w-full h-full rounded-[9px] bg-background flex items-center justify-center gap-1.5 text-xs font-semibold text-foreground hover:bg-muted/60 transition-all active:scale-[0.98]\"\n onClick={handleBuy}\n >\n <Zap className=\"h-3.5 w-3.5 shrink-0\" />\n Buy\n </button>\n </div>\n ) : !listingOrder && onOffer ? (\n <button\n className={cn(BTN_OUTLINE, \"flex-1 text-brand-orange border-brand-orange/30 hover:bg-brand-orange/10 hover:text-brand-orange\")}\n onClick={handleOffer}\n >\n <HandCoins className=\"h-3.5 w-3.5 mr-1.5\" />\n Offer\n </button>\n ) : null}\n\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n className={cn(BTN_OUTLINE, \"w-8 p-0 shrink-0\")}\n aria-label=\"More actions\"\n >\n <MoreHorizontal className=\"h-3.5 w-3.5\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-52\">\n\n <DropdownMenuItem asChild>\n <Link href={assetHref} className=\"flex items-center gap-2\">\n <ArrowUpRight className=\"h-3.5 w-3.5 text-muted-foreground\" />\n View asset\n </Link>\n </DropdownMenuItem>\n\n <DropdownMenuSeparator />\n\n {isOwner ? (\n <>\n {!listingOrder && onList && (\n <DropdownMenuItem\n className=\"flex items-center gap-2 text-brand-purple focus:text-brand-purple\"\n onClick={() => onList(token)}\n >\n <Tag className=\"h-3.5 w-3.5\" />\n List\n </DropdownMenuItem>\n )}\n {onTransfer && (\n <DropdownMenuItem\n className=\"flex items-center gap-2\"\n onClick={() => onTransfer(token)}\n >\n <ArrowRightLeft className=\"h-3.5 w-3.5 text-muted-foreground\" />\n Transfer\n </DropdownMenuItem>\n )}\n {listingOrder && onCancel && (\n <DropdownMenuItem\n className=\"flex items-center gap-2 text-brand-orange focus:text-brand-orange\"\n onClick={() => onCancel(token)}\n >\n <XCircle className=\"h-3.5 w-3.5\" />\n Cancel listing\n </DropdownMenuItem>\n )}\n </>\n ) : (\n <>\n {listingOrder && onBuy && (\n <DropdownMenuItem\n className=\"flex items-center gap-2 text-brand-blue focus:text-brand-blue\"\n onClick={handleBuy}\n >\n <Zap className=\"h-3.5 w-3.5\" />\n <span className=\"flex items-center gap-1\">\n Buy —\n <CurrencyIcon symbol={listingOrder.price.currency} size={12} />\n {formatDisplayPrice(listingOrder.price.formatted)}\n </span>\n </DropdownMenuItem>\n )}\n {onOffer && (\n <DropdownMenuItem\n className=\"flex items-center gap-2 text-brand-orange focus:text-brand-orange\"\n onClick={handleOffer}\n >\n <HandCoins className=\"h-3.5 w-3.5\" />\n Make offer\n </DropdownMenuItem>\n )}\n </>\n )}\n\n <DropdownMenuItem asChild>\n <Link href={remixHref} className=\"flex items-center gap-2 text-brand-purple focus:text-brand-purple\">\n <GitBranch className=\"h-3.5 w-3.5\" />\n Remix\n </Link>\n </DropdownMenuItem>\n\n <DropdownMenuSeparator />\n\n <DropdownMenuItem asChild>\n <Link href={collectionHref} className=\"flex items-center gap-2\">\n <Layers className=\"h-3.5 w-3.5 text-muted-foreground\" />\n View collection\n </Link>\n </DropdownMenuItem>\n\n {profileLink && (\n <DropdownMenuItem asChild>\n <Link href={profileLink.href} className=\"flex items-center gap-2\">\n <UserCircle2 className=\"h-3.5 w-3.5 text-muted-foreground\" />\n {profileLink.label}\n </Link>\n </DropdownMenuItem>\n )}\n\n {onReport && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n className=\"flex items-center gap-2 text-muted-foreground focus:text-muted-foreground\"\n onClick={() => onReport(token)}\n >\n <Flag className=\"h-3.5 w-3.5\" />\n Report\n </DropdownMenuItem>\n </>\n )}\n\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n );\n}\n\nexport function TokenCardSkeleton() {\n return (\n <div className=\"card-base overflow-hidden\">\n <div className=\"aspect-square w-full animate-pulse bg-muted\" />\n <div className=\"px-3 pt-2.5 pb-3 space-y-1.5\">\n <div className=\"h-4 w-3/4 rounded-md animate-pulse bg-muted\" />\n </div>\n <div className=\"px-3 pb-3 flex gap-1.5\">\n <div className=\"h-8 w-8 rounded-[9px] animate-pulse bg-muted shrink-0\" />\n <div className=\"h-8 flex-1 rounded-[9px] animate-pulse bg-muted\" />\n <div className=\"h-8 w-8 rounded-[9px] animate-pulse bg-muted shrink-0\" />\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["buildAssetHref","buildCollectionHref","Link"]}
|
|
1
|
+
{"version":3,"sources":["../../src/components/token-card.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"./link.js\";\nimport {\n Loader2, ArrowUpRight, MoreHorizontal, Zap, HandCoins, Tag,\n Layers, GitBranch, Flag, UserCircle2, ArrowRightLeft, XCircle,\n} from \"lucide-react\";\nimport {\n DropdownMenu, DropdownMenuContent, DropdownMenuItem,\n DropdownMenuSeparator, DropdownMenuTrigger,\n} from \"./dropdown-menu.js\";\nimport { cn } from \"../utils/cn.js\";\nimport { formatDisplayPrice } from \"../utils/format.js\";\nimport { CurrencyIcon } from \"./currency-icon.js\";\nimport { PriceChipContent } from \"./dual-price.js\";\nimport { IpTypeBadge } from \"./ip-type-badge.js\";\nimport { AnimatedTokenMedia } from \"./animated-token-media.js\";\nimport { isLivingRenderCollection } from \"../data/living-render-collections.js\";\nimport { assetHref as buildAssetHref, collectionHref as buildCollectionHref } from \"@medialane/sdk\";\nimport type { ApiToken, Chain } from \"@medialane/sdk\";\nimport { tokenProfileLink } from \"../utils/token-profile-link.js\";\nimport { useImageUrl } from \"../utils/use-image-url.js\";\n\n\nconst BTN_BASE = \"h-8 rounded-[9px] flex items-center justify-center gap-1.5 text-xs font-semibold transition-all active:scale-[0.98] shadow-none border-0\";\nconst BTN_OUTLINE = cn(BTN_BASE, \"border border-border/60 text-foreground hover:bg-muted/60\");\n\nexport interface TokenCardProps {\n token: ApiToken;\n isOwner?: boolean;\n onList?: (token: ApiToken) => void;\n onTransfer?: (token: ApiToken) => void;\n onCancel?: (token: ApiToken) => void;\n onBuy?: (token: ApiToken) => void;\n onOffer?: (token: ApiToken) => void;\n onReport?: (token: ApiToken) => void;\n\n usdValue?: string | null;\n}\n\nexport function TokenCard({\n token,\n isOwner = false,\n onList,\n onTransfer,\n onCancel,\n onBuy,\n onOffer,\n onReport,\n usdValue,\n}: TokenCardProps) {\n const resolveImage = useImageUrl();\n const name = token.metadata?.name || `Token #${token.tokenId}`;\n const image = resolveImage(token.metadata?.image, { width: 480 });\n const animationUrl = token.metadata?.animationUrl ?? null;\n const ipType = token.metadata?.ipType;\n\n const listingOrder = token.activeOrders?.find(\n (o) => o.offer.itemType === \"ERC721\" || o.offer.itemType === \"ERC1155\"\n );\n\n const profileLink = tokenProfileLink(token);\n const hasPrimaryAction = isOwner ? !listingOrder : listingOrder ? !!onBuy : !!onOffer;\n\n const chain = token.chain.toUpperCase() as Chain;\n const live = isLivingRenderCollection(chain, token.contractAddress);\n const assetHref = buildAssetHref(chain, token.contractAddress, token.tokenId);\n const collectionHref = buildCollectionHref(chain, token.contractAddress);\n const remixHref = `/create/remix/${token.contractAddress}/${token.tokenId}`;\n\n const handleBuy = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n onBuy?.(token);\n };\n\n const handleOffer = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n onOffer?.(token);\n };\n\n return (\n <div className=\"card-base group relative overflow-hidden flex flex-col w-full\">\n {ipType && (\n <div className=\"absolute top-2 right-2 z-10\">\n <IpTypeBadge ipType={ipType as any} size=\"sm\" />\n </div>\n )}\n\n <Link href={assetHref} className=\"flex flex-col flex-1\">\n\n <div className=\"relative aspect-square bg-muted overflow-hidden shrink-0\">\n <AnimatedTokenMedia\n image={image}\n animationUrl={animationUrl}\n live={live}\n alt={name}\n mode=\"fill\"\n sizes=\"(max-width: 640px) 50vw, (max-width: 1024px) 33vw, 22vw\"\n className=\"object-cover\"\n fallback={\n <div className=\"absolute inset-0 bg-gradient-to-br from-brand-purple/15 to-brand-blue/15\" />\n }\n />\n\n {listingOrder && (\n <div className=\"absolute bottom-2 right-2 z-10\">\n <span className=\"inline-flex items-center gap-1.5 px-2.5 py-1.5 rounded-full text-sm font-bold bg-background/90 backdrop-blur-sm border border-border/40 shadow-sm tabular-nums\">\n <PriceChipContent\n amountFormatted={listingOrder.price.formatted}\n currency={listingOrder.price.currency}\n usdValue={usdValue}\n tone=\"card\"\n />\n </span>\n </div>\n )}\n\n {(token.metadataStatus === \"PENDING\" || token.metadataStatus === \"FETCHING\") && (\n <div className=\"absolute bottom-0 inset-x-0 flex items-center justify-center gap-1.5 bg-black/50 backdrop-blur-sm py-1.5\">\n <Loader2 className=\"h-3 w-3 animate-spin text-white/70\" />\n <span className=\"text-2xs text-white/70\">Indexing…</span>\n </div>\n )}\n </div>\n\n <div className=\"px-3 pt-2.5 pb-4 flex-1\">\n <p className=\"text-base font-bold line-clamp-2 leading-snug\">{name}</p>\n </div>\n </Link>\n\n <div className=\"px-3 pb-3 flex items-center gap-1.5\">\n\n <Link href={assetHref} className={cn(BTN_OUTLINE, \"px-2.5\", hasPrimaryAction ? \"shrink-0\" : \"flex-1\")}>\n <ArrowUpRight className=\"h-3.5 w-3.5\" />\n View\n </Link>\n\n {isOwner ? (\n !listingOrder ? (\n <button\n className={cn(BTN_OUTLINE, \"flex-1 text-brand-purple border-brand-purple/30 hover:bg-brand-purple/10 hover:text-brand-purple\")}\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onList?.(token); }}\n >\n <Tag className=\"h-3.5 w-3.5 mr-1.5\" />\n Sell\n </button>\n ) : null\n ) : listingOrder && onBuy ? (\n <div className=\"btn-border-animated p-[1.5px] rounded-[10px] flex-1 h-8\">\n <button\n className=\"w-full h-full rounded-[9px] bg-background flex items-center justify-center gap-1.5 text-xs font-semibold text-foreground hover:bg-muted/60 transition-all active:scale-[0.98]\"\n onClick={handleBuy}\n >\n <Zap className=\"h-3.5 w-3.5 shrink-0\" />\n Buy\n </button>\n </div>\n ) : !listingOrder && onOffer ? (\n <button\n className={cn(BTN_OUTLINE, \"flex-1 text-brand-orange border-brand-orange/30 hover:bg-brand-orange/10 hover:text-brand-orange\")}\n onClick={handleOffer}\n >\n <HandCoins className=\"h-3.5 w-3.5 mr-1.5\" />\n Offer\n </button>\n ) : null}\n\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n className={cn(BTN_OUTLINE, \"w-8 p-0 shrink-0\")}\n aria-label=\"More actions\"\n >\n <MoreHorizontal className=\"h-3.5 w-3.5\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-52\">\n\n <DropdownMenuItem asChild>\n <Link href={assetHref} className=\"flex items-center gap-2\">\n <ArrowUpRight className=\"h-3.5 w-3.5 text-muted-foreground\" />\n View asset\n </Link>\n </DropdownMenuItem>\n\n <DropdownMenuSeparator />\n\n {isOwner ? (\n <>\n {!listingOrder && onList && (\n <DropdownMenuItem\n className=\"flex items-center gap-2 text-brand-purple focus:text-brand-purple\"\n onClick={() => onList(token)}\n >\n <Tag className=\"h-3.5 w-3.5\" />\n Sell\n </DropdownMenuItem>\n )}\n {onTransfer && (\n <DropdownMenuItem\n className=\"flex items-center gap-2\"\n onClick={() => onTransfer(token)}\n >\n <ArrowRightLeft className=\"h-3.5 w-3.5 text-muted-foreground\" />\n Transfer\n </DropdownMenuItem>\n )}\n {listingOrder && onCancel && (\n <DropdownMenuItem\n className=\"flex items-center gap-2 text-brand-orange focus:text-brand-orange\"\n onClick={() => onCancel(token)}\n >\n <XCircle className=\"h-3.5 w-3.5\" />\n Cancel listing\n </DropdownMenuItem>\n )}\n </>\n ) : (\n <>\n {listingOrder && onBuy && (\n <DropdownMenuItem\n className=\"flex items-center gap-2 text-brand-blue focus:text-brand-blue\"\n onClick={handleBuy}\n >\n <Zap className=\"h-3.5 w-3.5\" />\n <span className=\"flex items-center gap-1\">\n Buy —\n <CurrencyIcon symbol={listingOrder.price.currency} size={12} />\n {formatDisplayPrice(listingOrder.price.formatted)}\n </span>\n </DropdownMenuItem>\n )}\n {onOffer && (\n <DropdownMenuItem\n className=\"flex items-center gap-2 text-brand-orange focus:text-brand-orange\"\n onClick={handleOffer}\n >\n <HandCoins className=\"h-3.5 w-3.5\" />\n Make offer\n </DropdownMenuItem>\n )}\n </>\n )}\n\n <DropdownMenuItem asChild>\n <Link href={remixHref} className=\"flex items-center gap-2 text-brand-purple focus:text-brand-purple\">\n <GitBranch className=\"h-3.5 w-3.5\" />\n Remix\n </Link>\n </DropdownMenuItem>\n\n <DropdownMenuSeparator />\n\n <DropdownMenuItem asChild>\n <Link href={collectionHref} className=\"flex items-center gap-2\">\n <Layers className=\"h-3.5 w-3.5 text-muted-foreground\" />\n View collection\n </Link>\n </DropdownMenuItem>\n\n {profileLink && (\n <DropdownMenuItem asChild>\n <Link href={profileLink.href} className=\"flex items-center gap-2\">\n <UserCircle2 className=\"h-3.5 w-3.5 text-muted-foreground\" />\n {profileLink.label}\n </Link>\n </DropdownMenuItem>\n )}\n\n {onReport && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n className=\"flex items-center gap-2 text-muted-foreground focus:text-muted-foreground\"\n onClick={() => onReport(token)}\n >\n <Flag className=\"h-3.5 w-3.5\" />\n Report\n </DropdownMenuItem>\n </>\n )}\n\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n );\n}\n\nexport function TokenCardSkeleton() {\n return (\n <div className=\"card-base overflow-hidden\">\n <div className=\"aspect-square w-full animate-pulse bg-muted\" />\n <div className=\"px-3 pt-2.5 pb-3 space-y-1.5\">\n <div className=\"h-4 w-3/4 rounded-md animate-pulse bg-muted\" />\n </div>\n <div className=\"px-3 pb-3 flex gap-1.5\">\n <div className=\"h-8 w-8 rounded-[9px] animate-pulse bg-muted shrink-0\" />\n <div className=\"h-8 flex-1 rounded-[9px] animate-pulse bg-muted\" />\n <div className=\"h-8 w-8 rounded-[9px] animate-pulse bg-muted shrink-0\" />\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsFU;AApFV,kBAAiB;AACjB,0BAGO;AACP,2BAGO;AACP,gBAAmB;AACnB,oBAAmC;AACnC,2BAA6B;AAC7B,wBAAiC;AACjC,2BAA4B;AAC5B,kCAAmC;AACnC,uCAAyC;AACzC,iBAAmF;AAEnF,gCAAiC;AACjC,2BAA4B;AAG5B,MAAM,WAAW;AACjB,MAAM,kBAAc,cAAG,UAAU,2DAA2D;AAerF,SAAS,UAAU;AAAA,EACxB;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmB;AACjB,QAAM,mBAAe,kCAAY;AACjC,QAAM,OAAO,MAAM,UAAU,QAAQ,UAAU,MAAM,OAAO;AAC5D,QAAM,QAAQ,aAAa,MAAM,UAAU,OAAO,EAAE,OAAO,IAAI,CAAC;AAChE,QAAM,eAAe,MAAM,UAAU,gBAAgB;AACrD,QAAM,SAAS,MAAM,UAAU;AAE/B,QAAM,eAAe,MAAM,cAAc;AAAA,IACvC,CAAC,MAAM,EAAE,MAAM,aAAa,YAAY,EAAE,MAAM,aAAa;AAAA,EAC/D;AAEA,QAAM,kBAAc,4CAAiB,KAAK;AAC1C,QAAM,mBAAmB,UAAU,CAAC,eAAe,eAAe,CAAC,CAAC,QAAQ,CAAC,CAAC;AAE9E,QAAM,QAAQ,MAAM,MAAM,YAAY;AACtC,QAAM,WAAO,2DAAyB,OAAO,MAAM,eAAe;AAClE,QAAM,gBAAY,WAAAA,WAAe,OAAO,MAAM,iBAAiB,MAAM,OAAO;AAC5E,QAAM,qBAAiB,WAAAC,gBAAoB,OAAO,MAAM,eAAe;AACvE,QAAM,YAAY,iBAAiB,MAAM,eAAe,IAAI,MAAM,OAAO;AAEzE,QAAM,YAAY,CAAC,MAAwB;AACzC,MAAE,eAAe;AACjB,MAAE,gBAAgB;AAClB,YAAQ,KAAK;AAAA,EACf;AAEA,QAAM,cAAc,CAAC,MAAwB;AAC3C,MAAE,eAAe;AACjB,MAAE,gBAAgB;AAClB,cAAU,KAAK;AAAA,EACjB;AAEA,SACE,6CAAC,SAAI,WAAU,iEACZ;AAAA,cACC,4CAAC,SAAI,WAAU,+BACb,sDAAC,oCAAY,QAAuB,MAAK,MAAK,GAChD;AAAA,IAGF,6CAAC,YAAAC,SAAA,EAAK,MAAM,WAAW,WAAU,wBAE/B;AAAA,mDAAC,SAAI,WAAU,4DACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA,KAAK;AAAA,YACL,MAAK;AAAA,YACL,OAAM;AAAA,YACN,WAAU;AAAA,YACV,UACE,4CAAC,SAAI,WAAU,4EAA2E;AAAA;AAAA,QAE9F;AAAA,QAEC,gBACC,4CAAC,SAAI,WAAU,kCACb,sDAAC,UAAK,WAAU,kKACd;AAAA,UAAC;AAAA;AAAA,YACC,iBAAiB,aAAa,MAAM;AAAA,YACpC,UAAU,aAAa,MAAM;AAAA,YAC7B;AAAA,YACA,MAAK;AAAA;AAAA,QACP,GACF,GACF;AAAA,SAGA,MAAM,mBAAmB,aAAa,MAAM,mBAAmB,eAC/D,6CAAC,SAAI,WAAU,4GACb;AAAA,sDAAC,+BAAQ,WAAU,sCAAqC;AAAA,UACxD,4CAAC,UAAK,WAAU,0BAAyB,4BAAS;AAAA,WACpD;AAAA,SAEJ;AAAA,MAEA,4CAAC,SAAI,WAAU,2BACb,sDAAC,OAAE,WAAU,iDAAiD,gBAAK,GACrE;AAAA,OACF;AAAA,IAEA,6CAAC,SAAI,WAAU,uCAEb;AAAA,mDAAC,YAAAA,SAAA,EAAK,MAAM,WAAW,eAAW,cAAG,aAAa,UAAU,mBAAmB,aAAa,QAAQ,GAClG;AAAA,oDAAC,oCAAa,WAAU,eAAc;AAAA,QAAE;AAAA,SAE1C;AAAA,MAEC,UACC,CAAC,eACC;AAAA,QAAC;AAAA;AAAA,UACC,eAAW,cAAG,aAAa,kGAAkG;AAAA,UAC7H,SAAS,CAAC,MAAM;AAAE,cAAE,eAAe;AAAG,cAAE,gBAAgB;AAAG,qBAAS,KAAK;AAAA,UAAG;AAAA,UAE5E;AAAA,wDAAC,2BAAI,WAAU,sBAAqB;AAAA,YAAE;AAAA;AAAA;AAAA,MAExC,IACE,OACF,gBAAgB,QAClB,4CAAC,SAAI,WAAU,2DACb;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,SAAS;AAAA,UAET;AAAA,wDAAC,2BAAI,WAAU,wBAAuB;AAAA,YAAE;AAAA;AAAA;AAAA,MAE1C,GACF,IACE,CAAC,gBAAgB,UACnB;AAAA,QAAC;AAAA;AAAA,UACC,eAAW,cAAG,aAAa,kGAAkG;AAAA,UAC7H,SAAS;AAAA,UAET;AAAA,wDAAC,iCAAU,WAAU,sBAAqB;AAAA,YAAE;AAAA;AAAA;AAAA,MAE9C,IACE;AAAA,MAEJ,6CAAC,qCACC;AAAA,oDAAC,4CAAoB,SAAO,MAC1B;AAAA,UAAC;AAAA;AAAA,YACC,eAAW,cAAG,aAAa,kBAAkB;AAAA,YAC7C,cAAW;AAAA,YAEX,sDAAC,sCAAe,WAAU,eAAc;AAAA;AAAA,QAC1C,GACF;AAAA,QACA,6CAAC,4CAAoB,OAAM,OAAM,WAAU,QAEzC;AAAA,sDAAC,yCAAiB,SAAO,MACvB,uDAAC,YAAAA,SAAA,EAAK,MAAM,WAAW,WAAU,2BAC/B;AAAA,wDAAC,oCAAa,WAAU,qCAAoC;AAAA,YAAE;AAAA,aAEhE,GACF;AAAA,UAEA,4CAAC,8CAAsB;AAAA,UAEtB,UACC,4EACG;AAAA,aAAC,gBAAgB,UAChB;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,SAAS,MAAM,OAAO,KAAK;AAAA,gBAE3B;AAAA,8DAAC,2BAAI,WAAU,eAAc;AAAA,kBAAE;AAAA;AAAA;AAAA,YAEjC;AAAA,YAED,cACC;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,SAAS,MAAM,WAAW,KAAK;AAAA,gBAE/B;AAAA,8DAAC,sCAAe,WAAU,qCAAoC;AAAA,kBAAE;AAAA;AAAA;AAAA,YAElE;AAAA,YAED,gBAAgB,YACf;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,SAAS,MAAM,SAAS,KAAK;AAAA,gBAE7B;AAAA,8DAAC,+BAAQ,WAAU,eAAc;AAAA,kBAAE;AAAA;AAAA;AAAA,YAErC;AAAA,aAEJ,IAEA,4EACG;AAAA,4BAAgB,SACf;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,SAAS;AAAA,gBAET;AAAA,8DAAC,2BAAI,WAAU,eAAc;AAAA,kBAC7B,6CAAC,UAAK,WAAU,2BAA0B;AAAA;AAAA,oBAExC,4CAAC,qCAAa,QAAQ,aAAa,MAAM,UAAU,MAAM,IAAI;AAAA,wBAC5D,kCAAmB,aAAa,MAAM,SAAS;AAAA,qBAClD;AAAA;AAAA;AAAA,YACF;AAAA,YAED,WACC;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,SAAS;AAAA,gBAET;AAAA,8DAAC,iCAAU,WAAU,eAAc;AAAA,kBAAE;AAAA;AAAA;AAAA,YAEvC;AAAA,aAEJ;AAAA,UAGF,4CAAC,yCAAiB,SAAO,MACvB,uDAAC,YAAAA,SAAA,EAAK,MAAM,WAAW,WAAU,qEAC/B;AAAA,wDAAC,iCAAU,WAAU,eAAc;AAAA,YAAE;AAAA,aAEvC,GACF;AAAA,UAEA,4CAAC,8CAAsB;AAAA,UAEvB,4CAAC,yCAAiB,SAAO,MACvB,uDAAC,YAAAA,SAAA,EAAK,MAAM,gBAAgB,WAAU,2BACpC;AAAA,wDAAC,8BAAO,WAAU,qCAAoC;AAAA,YAAE;AAAA,aAE1D,GACF;AAAA,UAEC,eACC,4CAAC,yCAAiB,SAAO,MACvB,uDAAC,YAAAA,SAAA,EAAK,MAAM,YAAY,MAAM,WAAU,2BACtC;AAAA,wDAAC,mCAAY,WAAU,qCAAoC;AAAA,YAC1D,YAAY;AAAA,aACf,GACF;AAAA,UAGD,YACC,4EACE;AAAA,wDAAC,8CAAsB;AAAA,YACvB;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,SAAS,MAAM,SAAS,KAAK;AAAA,gBAE7B;AAAA,8DAAC,4BAAK,WAAU,eAAc;AAAA,kBAAE;AAAA;AAAA;AAAA,YAElC;AAAA,aACF;AAAA,WAGJ;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAEJ;AAEO,SAAS,oBAAoB;AAClC,SACE,6CAAC,SAAI,WAAU,6BACb;AAAA,gDAAC,SAAI,WAAU,+CAA8C;AAAA,IAC7D,4CAAC,SAAI,WAAU,gCACb,sDAAC,SAAI,WAAU,+CAA8C,GAC/D;AAAA,IACA,6CAAC,SAAI,WAAU,0BACb;AAAA,kDAAC,SAAI,WAAU,yDAAwD;AAAA,MACvE,4CAAC,SAAI,WAAU,mDAAkD;AAAA,MACjE,4CAAC,SAAI,WAAU,yDAAwD;AAAA,OACzE;AAAA,KACF;AAEJ;","names":["buildAssetHref","buildCollectionHref","Link"]}
|
|
@@ -119,7 +119,7 @@ function TokenCard({
|
|
|
119
119
|
},
|
|
120
120
|
children: [
|
|
121
121
|
/* @__PURE__ */ jsx(Tag, { className: "h-3.5 w-3.5 mr-1.5" }),
|
|
122
|
-
"
|
|
122
|
+
"Sell"
|
|
123
123
|
]
|
|
124
124
|
}
|
|
125
125
|
) : null : listingOrder && onBuy ? /* @__PURE__ */ jsx("div", { className: "btn-border-animated p-[1.5px] rounded-[10px] flex-1 h-8", children: /* @__PURE__ */ jsxs(
|
|
@@ -166,7 +166,7 @@ function TokenCard({
|
|
|
166
166
|
onClick: () => onList(token),
|
|
167
167
|
children: [
|
|
168
168
|
/* @__PURE__ */ jsx(Tag, { className: "h-3.5 w-3.5" }),
|
|
169
|
-
"
|
|
169
|
+
"Sell"
|
|
170
170
|
]
|
|
171
171
|
}
|
|
172
172
|
),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/token-card.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"./link.js\";\nimport {\n Loader2, ArrowUpRight, MoreHorizontal, Zap, HandCoins, Tag,\n Layers, GitBranch, Flag, UserCircle2, ArrowRightLeft, XCircle,\n} from \"lucide-react\";\nimport {\n DropdownMenu, DropdownMenuContent, DropdownMenuItem,\n DropdownMenuSeparator, DropdownMenuTrigger,\n} from \"./dropdown-menu.js\";\nimport { cn } from \"../utils/cn.js\";\nimport { formatDisplayPrice } from \"../utils/format.js\";\nimport { CurrencyIcon } from \"./currency-icon.js\";\nimport { PriceChipContent } from \"./dual-price.js\";\nimport { IpTypeBadge } from \"./ip-type-badge.js\";\nimport { AnimatedTokenMedia } from \"./animated-token-media.js\";\nimport { isLivingRenderCollection } from \"../data/living-render-collections.js\";\nimport { assetHref as buildAssetHref, collectionHref as buildCollectionHref } from \"@medialane/sdk\";\nimport type { ApiToken, Chain } from \"@medialane/sdk\";\nimport { tokenProfileLink } from \"../utils/token-profile-link.js\";\nimport { useImageUrl } from \"../utils/use-image-url.js\";\n\n\nconst BTN_BASE = \"h-8 rounded-[9px] flex items-center justify-center gap-1.5 text-xs font-semibold transition-all active:scale-[0.98] shadow-none border-0\";\nconst BTN_OUTLINE = cn(BTN_BASE, \"border border-border/60 text-foreground hover:bg-muted/60\");\n\nexport interface TokenCardProps {\n token: ApiToken;\n isOwner?: boolean;\n onList?: (token: ApiToken) => void;\n onTransfer?: (token: ApiToken) => void;\n onCancel?: (token: ApiToken) => void;\n onBuy?: (token: ApiToken) => void;\n onOffer?: (token: ApiToken) => void;\n onReport?: (token: ApiToken) => void;\n\n usdValue?: string | null;\n}\n\nexport function TokenCard({\n token,\n isOwner = false,\n onList,\n onTransfer,\n onCancel,\n onBuy,\n onOffer,\n onReport,\n usdValue,\n}: TokenCardProps) {\n const resolveImage = useImageUrl();\n const name = token.metadata?.name || `Token #${token.tokenId}`;\n const image = resolveImage(token.metadata?.image, { width: 480 });\n const animationUrl = token.metadata?.animationUrl ?? null;\n const ipType = token.metadata?.ipType;\n\n const listingOrder = token.activeOrders?.find(\n (o) => o.offer.itemType === \"ERC721\" || o.offer.itemType === \"ERC1155\"\n );\n\n const profileLink = tokenProfileLink(token);\n const hasPrimaryAction = isOwner ? !listingOrder : listingOrder ? !!onBuy : !!onOffer;\n\n const chain = token.chain.toUpperCase() as Chain;\n const live = isLivingRenderCollection(chain, token.contractAddress);\n const assetHref = buildAssetHref(chain, token.contractAddress, token.tokenId);\n const collectionHref = buildCollectionHref(chain, token.contractAddress);\n const remixHref = `/create/remix/${token.contractAddress}/${token.tokenId}`;\n\n const handleBuy = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n onBuy?.(token);\n };\n\n const handleOffer = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n onOffer?.(token);\n };\n\n return (\n <div className=\"card-base group relative overflow-hidden flex flex-col w-full\">\n {ipType && (\n <div className=\"absolute top-2 right-2 z-10\">\n <IpTypeBadge ipType={ipType as any} size=\"sm\" />\n </div>\n )}\n\n <Link href={assetHref} className=\"flex flex-col flex-1\">\n\n <div className=\"relative aspect-square bg-muted overflow-hidden shrink-0\">\n <AnimatedTokenMedia\n image={image}\n animationUrl={animationUrl}\n live={live}\n alt={name}\n mode=\"fill\"\n sizes=\"(max-width: 640px) 50vw, (max-width: 1024px) 33vw, 22vw\"\n className=\"object-cover\"\n fallback={\n <div className=\"absolute inset-0 bg-gradient-to-br from-brand-purple/15 to-brand-blue/15\" />\n }\n />\n\n {listingOrder && (\n <div className=\"absolute bottom-2 right-2 z-10\">\n <span className=\"inline-flex items-center gap-1.5 px-2.5 py-1.5 rounded-full text-sm font-bold bg-background/90 backdrop-blur-sm border border-border/40 shadow-sm tabular-nums\">\n <PriceChipContent\n amountFormatted={listingOrder.price.formatted}\n currency={listingOrder.price.currency}\n usdValue={usdValue}\n tone=\"card\"\n />\n </span>\n </div>\n )}\n\n {(token.metadataStatus === \"PENDING\" || token.metadataStatus === \"FETCHING\") && (\n <div className=\"absolute bottom-0 inset-x-0 flex items-center justify-center gap-1.5 bg-black/50 backdrop-blur-sm py-1.5\">\n <Loader2 className=\"h-3 w-3 animate-spin text-white/70\" />\n <span className=\"text-2xs text-white/70\">Indexing…</span>\n </div>\n )}\n </div>\n\n <div className=\"px-3 pt-2.5 pb-4 flex-1\">\n <p className=\"text-base font-bold line-clamp-2 leading-snug\">{name}</p>\n </div>\n </Link>\n\n <div className=\"px-3 pb-3 flex items-center gap-1.5\">\n\n <Link href={assetHref} className={cn(BTN_OUTLINE, \"px-2.5\", hasPrimaryAction ? \"shrink-0\" : \"flex-1\")}>\n <ArrowUpRight className=\"h-3.5 w-3.5\" />\n View\n </Link>\n\n {isOwner ? (\n !listingOrder ? (\n <button\n className={cn(BTN_OUTLINE, \"flex-1 text-brand-purple border-brand-purple/30 hover:bg-brand-purple/10 hover:text-brand-purple\")}\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onList?.(token); }}\n >\n <Tag className=\"h-3.5 w-3.5 mr-1.5\" />\n List\n </button>\n ) : null\n ) : listingOrder && onBuy ? (\n <div className=\"btn-border-animated p-[1.5px] rounded-[10px] flex-1 h-8\">\n <button\n className=\"w-full h-full rounded-[9px] bg-background flex items-center justify-center gap-1.5 text-xs font-semibold text-foreground hover:bg-muted/60 transition-all active:scale-[0.98]\"\n onClick={handleBuy}\n >\n <Zap className=\"h-3.5 w-3.5 shrink-0\" />\n Buy\n </button>\n </div>\n ) : !listingOrder && onOffer ? (\n <button\n className={cn(BTN_OUTLINE, \"flex-1 text-brand-orange border-brand-orange/30 hover:bg-brand-orange/10 hover:text-brand-orange\")}\n onClick={handleOffer}\n >\n <HandCoins className=\"h-3.5 w-3.5 mr-1.5\" />\n Offer\n </button>\n ) : null}\n\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n className={cn(BTN_OUTLINE, \"w-8 p-0 shrink-0\")}\n aria-label=\"More actions\"\n >\n <MoreHorizontal className=\"h-3.5 w-3.5\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-52\">\n\n <DropdownMenuItem asChild>\n <Link href={assetHref} className=\"flex items-center gap-2\">\n <ArrowUpRight className=\"h-3.5 w-3.5 text-muted-foreground\" />\n View asset\n </Link>\n </DropdownMenuItem>\n\n <DropdownMenuSeparator />\n\n {isOwner ? (\n <>\n {!listingOrder && onList && (\n <DropdownMenuItem\n className=\"flex items-center gap-2 text-brand-purple focus:text-brand-purple\"\n onClick={() => onList(token)}\n >\n <Tag className=\"h-3.5 w-3.5\" />\n List\n </DropdownMenuItem>\n )}\n {onTransfer && (\n <DropdownMenuItem\n className=\"flex items-center gap-2\"\n onClick={() => onTransfer(token)}\n >\n <ArrowRightLeft className=\"h-3.5 w-3.5 text-muted-foreground\" />\n Transfer\n </DropdownMenuItem>\n )}\n {listingOrder && onCancel && (\n <DropdownMenuItem\n className=\"flex items-center gap-2 text-brand-orange focus:text-brand-orange\"\n onClick={() => onCancel(token)}\n >\n <XCircle className=\"h-3.5 w-3.5\" />\n Cancel listing\n </DropdownMenuItem>\n )}\n </>\n ) : (\n <>\n {listingOrder && onBuy && (\n <DropdownMenuItem\n className=\"flex items-center gap-2 text-brand-blue focus:text-brand-blue\"\n onClick={handleBuy}\n >\n <Zap className=\"h-3.5 w-3.5\" />\n <span className=\"flex items-center gap-1\">\n Buy —\n <CurrencyIcon symbol={listingOrder.price.currency} size={12} />\n {formatDisplayPrice(listingOrder.price.formatted)}\n </span>\n </DropdownMenuItem>\n )}\n {onOffer && (\n <DropdownMenuItem\n className=\"flex items-center gap-2 text-brand-orange focus:text-brand-orange\"\n onClick={handleOffer}\n >\n <HandCoins className=\"h-3.5 w-3.5\" />\n Make offer\n </DropdownMenuItem>\n )}\n </>\n )}\n\n <DropdownMenuItem asChild>\n <Link href={remixHref} className=\"flex items-center gap-2 text-brand-purple focus:text-brand-purple\">\n <GitBranch className=\"h-3.5 w-3.5\" />\n Remix\n </Link>\n </DropdownMenuItem>\n\n <DropdownMenuSeparator />\n\n <DropdownMenuItem asChild>\n <Link href={collectionHref} className=\"flex items-center gap-2\">\n <Layers className=\"h-3.5 w-3.5 text-muted-foreground\" />\n View collection\n </Link>\n </DropdownMenuItem>\n\n {profileLink && (\n <DropdownMenuItem asChild>\n <Link href={profileLink.href} className=\"flex items-center gap-2\">\n <UserCircle2 className=\"h-3.5 w-3.5 text-muted-foreground\" />\n {profileLink.label}\n </Link>\n </DropdownMenuItem>\n )}\n\n {onReport && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n className=\"flex items-center gap-2 text-muted-foreground focus:text-muted-foreground\"\n onClick={() => onReport(token)}\n >\n <Flag className=\"h-3.5 w-3.5\" />\n Report\n </DropdownMenuItem>\n </>\n )}\n\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n );\n}\n\nexport function TokenCardSkeleton() {\n return (\n <div className=\"card-base overflow-hidden\">\n <div className=\"aspect-square w-full animate-pulse bg-muted\" />\n <div className=\"px-3 pt-2.5 pb-3 space-y-1.5\">\n <div className=\"h-4 w-3/4 rounded-md animate-pulse bg-muted\" />\n </div>\n <div className=\"px-3 pb-3 flex gap-1.5\">\n <div className=\"h-8 w-8 rounded-[9px] animate-pulse bg-muted shrink-0\" />\n <div className=\"h-8 flex-1 rounded-[9px] animate-pulse bg-muted\" />\n <div className=\"h-8 w-8 rounded-[9px] animate-pulse bg-muted shrink-0\" />\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/components/token-card.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"./link.js\";\nimport {\n Loader2, ArrowUpRight, MoreHorizontal, Zap, HandCoins, Tag,\n Layers, GitBranch, Flag, UserCircle2, ArrowRightLeft, XCircle,\n} from \"lucide-react\";\nimport {\n DropdownMenu, DropdownMenuContent, DropdownMenuItem,\n DropdownMenuSeparator, DropdownMenuTrigger,\n} from \"./dropdown-menu.js\";\nimport { cn } from \"../utils/cn.js\";\nimport { formatDisplayPrice } from \"../utils/format.js\";\nimport { CurrencyIcon } from \"./currency-icon.js\";\nimport { PriceChipContent } from \"./dual-price.js\";\nimport { IpTypeBadge } from \"./ip-type-badge.js\";\nimport { AnimatedTokenMedia } from \"./animated-token-media.js\";\nimport { isLivingRenderCollection } from \"../data/living-render-collections.js\";\nimport { assetHref as buildAssetHref, collectionHref as buildCollectionHref } from \"@medialane/sdk\";\nimport type { ApiToken, Chain } from \"@medialane/sdk\";\nimport { tokenProfileLink } from \"../utils/token-profile-link.js\";\nimport { useImageUrl } from \"../utils/use-image-url.js\";\n\n\nconst BTN_BASE = \"h-8 rounded-[9px] flex items-center justify-center gap-1.5 text-xs font-semibold transition-all active:scale-[0.98] shadow-none border-0\";\nconst BTN_OUTLINE = cn(BTN_BASE, \"border border-border/60 text-foreground hover:bg-muted/60\");\n\nexport interface TokenCardProps {\n token: ApiToken;\n isOwner?: boolean;\n onList?: (token: ApiToken) => void;\n onTransfer?: (token: ApiToken) => void;\n onCancel?: (token: ApiToken) => void;\n onBuy?: (token: ApiToken) => void;\n onOffer?: (token: ApiToken) => void;\n onReport?: (token: ApiToken) => void;\n\n usdValue?: string | null;\n}\n\nexport function TokenCard({\n token,\n isOwner = false,\n onList,\n onTransfer,\n onCancel,\n onBuy,\n onOffer,\n onReport,\n usdValue,\n}: TokenCardProps) {\n const resolveImage = useImageUrl();\n const name = token.metadata?.name || `Token #${token.tokenId}`;\n const image = resolveImage(token.metadata?.image, { width: 480 });\n const animationUrl = token.metadata?.animationUrl ?? null;\n const ipType = token.metadata?.ipType;\n\n const listingOrder = token.activeOrders?.find(\n (o) => o.offer.itemType === \"ERC721\" || o.offer.itemType === \"ERC1155\"\n );\n\n const profileLink = tokenProfileLink(token);\n const hasPrimaryAction = isOwner ? !listingOrder : listingOrder ? !!onBuy : !!onOffer;\n\n const chain = token.chain.toUpperCase() as Chain;\n const live = isLivingRenderCollection(chain, token.contractAddress);\n const assetHref = buildAssetHref(chain, token.contractAddress, token.tokenId);\n const collectionHref = buildCollectionHref(chain, token.contractAddress);\n const remixHref = `/create/remix/${token.contractAddress}/${token.tokenId}`;\n\n const handleBuy = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n onBuy?.(token);\n };\n\n const handleOffer = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n onOffer?.(token);\n };\n\n return (\n <div className=\"card-base group relative overflow-hidden flex flex-col w-full\">\n {ipType && (\n <div className=\"absolute top-2 right-2 z-10\">\n <IpTypeBadge ipType={ipType as any} size=\"sm\" />\n </div>\n )}\n\n <Link href={assetHref} className=\"flex flex-col flex-1\">\n\n <div className=\"relative aspect-square bg-muted overflow-hidden shrink-0\">\n <AnimatedTokenMedia\n image={image}\n animationUrl={animationUrl}\n live={live}\n alt={name}\n mode=\"fill\"\n sizes=\"(max-width: 640px) 50vw, (max-width: 1024px) 33vw, 22vw\"\n className=\"object-cover\"\n fallback={\n <div className=\"absolute inset-0 bg-gradient-to-br from-brand-purple/15 to-brand-blue/15\" />\n }\n />\n\n {listingOrder && (\n <div className=\"absolute bottom-2 right-2 z-10\">\n <span className=\"inline-flex items-center gap-1.5 px-2.5 py-1.5 rounded-full text-sm font-bold bg-background/90 backdrop-blur-sm border border-border/40 shadow-sm tabular-nums\">\n <PriceChipContent\n amountFormatted={listingOrder.price.formatted}\n currency={listingOrder.price.currency}\n usdValue={usdValue}\n tone=\"card\"\n />\n </span>\n </div>\n )}\n\n {(token.metadataStatus === \"PENDING\" || token.metadataStatus === \"FETCHING\") && (\n <div className=\"absolute bottom-0 inset-x-0 flex items-center justify-center gap-1.5 bg-black/50 backdrop-blur-sm py-1.5\">\n <Loader2 className=\"h-3 w-3 animate-spin text-white/70\" />\n <span className=\"text-2xs text-white/70\">Indexing…</span>\n </div>\n )}\n </div>\n\n <div className=\"px-3 pt-2.5 pb-4 flex-1\">\n <p className=\"text-base font-bold line-clamp-2 leading-snug\">{name}</p>\n </div>\n </Link>\n\n <div className=\"px-3 pb-3 flex items-center gap-1.5\">\n\n <Link href={assetHref} className={cn(BTN_OUTLINE, \"px-2.5\", hasPrimaryAction ? \"shrink-0\" : \"flex-1\")}>\n <ArrowUpRight className=\"h-3.5 w-3.5\" />\n View\n </Link>\n\n {isOwner ? (\n !listingOrder ? (\n <button\n className={cn(BTN_OUTLINE, \"flex-1 text-brand-purple border-brand-purple/30 hover:bg-brand-purple/10 hover:text-brand-purple\")}\n onClick={(e) => { e.preventDefault(); e.stopPropagation(); onList?.(token); }}\n >\n <Tag className=\"h-3.5 w-3.5 mr-1.5\" />\n Sell\n </button>\n ) : null\n ) : listingOrder && onBuy ? (\n <div className=\"btn-border-animated p-[1.5px] rounded-[10px] flex-1 h-8\">\n <button\n className=\"w-full h-full rounded-[9px] bg-background flex items-center justify-center gap-1.5 text-xs font-semibold text-foreground hover:bg-muted/60 transition-all active:scale-[0.98]\"\n onClick={handleBuy}\n >\n <Zap className=\"h-3.5 w-3.5 shrink-0\" />\n Buy\n </button>\n </div>\n ) : !listingOrder && onOffer ? (\n <button\n className={cn(BTN_OUTLINE, \"flex-1 text-brand-orange border-brand-orange/30 hover:bg-brand-orange/10 hover:text-brand-orange\")}\n onClick={handleOffer}\n >\n <HandCoins className=\"h-3.5 w-3.5 mr-1.5\" />\n Offer\n </button>\n ) : null}\n\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n className={cn(BTN_OUTLINE, \"w-8 p-0 shrink-0\")}\n aria-label=\"More actions\"\n >\n <MoreHorizontal className=\"h-3.5 w-3.5\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-52\">\n\n <DropdownMenuItem asChild>\n <Link href={assetHref} className=\"flex items-center gap-2\">\n <ArrowUpRight className=\"h-3.5 w-3.5 text-muted-foreground\" />\n View asset\n </Link>\n </DropdownMenuItem>\n\n <DropdownMenuSeparator />\n\n {isOwner ? (\n <>\n {!listingOrder && onList && (\n <DropdownMenuItem\n className=\"flex items-center gap-2 text-brand-purple focus:text-brand-purple\"\n onClick={() => onList(token)}\n >\n <Tag className=\"h-3.5 w-3.5\" />\n Sell\n </DropdownMenuItem>\n )}\n {onTransfer && (\n <DropdownMenuItem\n className=\"flex items-center gap-2\"\n onClick={() => onTransfer(token)}\n >\n <ArrowRightLeft className=\"h-3.5 w-3.5 text-muted-foreground\" />\n Transfer\n </DropdownMenuItem>\n )}\n {listingOrder && onCancel && (\n <DropdownMenuItem\n className=\"flex items-center gap-2 text-brand-orange focus:text-brand-orange\"\n onClick={() => onCancel(token)}\n >\n <XCircle className=\"h-3.5 w-3.5\" />\n Cancel listing\n </DropdownMenuItem>\n )}\n </>\n ) : (\n <>\n {listingOrder && onBuy && (\n <DropdownMenuItem\n className=\"flex items-center gap-2 text-brand-blue focus:text-brand-blue\"\n onClick={handleBuy}\n >\n <Zap className=\"h-3.5 w-3.5\" />\n <span className=\"flex items-center gap-1\">\n Buy —\n <CurrencyIcon symbol={listingOrder.price.currency} size={12} />\n {formatDisplayPrice(listingOrder.price.formatted)}\n </span>\n </DropdownMenuItem>\n )}\n {onOffer && (\n <DropdownMenuItem\n className=\"flex items-center gap-2 text-brand-orange focus:text-brand-orange\"\n onClick={handleOffer}\n >\n <HandCoins className=\"h-3.5 w-3.5\" />\n Make offer\n </DropdownMenuItem>\n )}\n </>\n )}\n\n <DropdownMenuItem asChild>\n <Link href={remixHref} className=\"flex items-center gap-2 text-brand-purple focus:text-brand-purple\">\n <GitBranch className=\"h-3.5 w-3.5\" />\n Remix\n </Link>\n </DropdownMenuItem>\n\n <DropdownMenuSeparator />\n\n <DropdownMenuItem asChild>\n <Link href={collectionHref} className=\"flex items-center gap-2\">\n <Layers className=\"h-3.5 w-3.5 text-muted-foreground\" />\n View collection\n </Link>\n </DropdownMenuItem>\n\n {profileLink && (\n <DropdownMenuItem asChild>\n <Link href={profileLink.href} className=\"flex items-center gap-2\">\n <UserCircle2 className=\"h-3.5 w-3.5 text-muted-foreground\" />\n {profileLink.label}\n </Link>\n </DropdownMenuItem>\n )}\n\n {onReport && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n className=\"flex items-center gap-2 text-muted-foreground focus:text-muted-foreground\"\n onClick={() => onReport(token)}\n >\n <Flag className=\"h-3.5 w-3.5\" />\n Report\n </DropdownMenuItem>\n </>\n )}\n\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n );\n}\n\nexport function TokenCardSkeleton() {\n return (\n <div className=\"card-base overflow-hidden\">\n <div className=\"aspect-square w-full animate-pulse bg-muted\" />\n <div className=\"px-3 pt-2.5 pb-3 space-y-1.5\">\n <div className=\"h-4 w-3/4 rounded-md animate-pulse bg-muted\" />\n </div>\n <div className=\"px-3 pb-3 flex gap-1.5\">\n <div className=\"h-8 w-8 rounded-[9px] animate-pulse bg-muted shrink-0\" />\n <div className=\"h-8 flex-1 rounded-[9px] animate-pulse bg-muted\" />\n <div className=\"h-8 w-8 rounded-[9px] animate-pulse bg-muted shrink-0\" />\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|