@medialane/ui 0.331.0 → 0.333.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/dist/components/account/input-otp.d.cts +2 -2
  2. package/dist/components/account/input-otp.d.ts +2 -2
  3. package/dist/components/asset-page.cjs +24 -33
  4. package/dist/components/asset-page.cjs.map +1 -1
  5. package/dist/components/asset-page.d.cts +4 -2
  6. package/dist/components/asset-page.d.ts +4 -2
  7. package/dist/components/asset-page.js +24 -33
  8. package/dist/components/asset-page.js.map +1 -1
  9. package/dist/components/asset-top-sections.cjs +24 -28
  10. package/dist/components/asset-top-sections.cjs.map +1 -1
  11. package/dist/components/asset-top-sections.d.cts +2 -2
  12. package/dist/components/asset-top-sections.d.ts +2 -2
  13. package/dist/components/asset-top-sections.js +24 -28
  14. package/dist/components/asset-top-sections.js.map +1 -1
  15. package/dist/components/button.d.cts +2 -2
  16. package/dist/components/button.d.ts +2 -2
  17. package/dist/components/discover-community-section.cjs +79 -67
  18. package/dist/components/discover-community-section.cjs.map +1 -1
  19. package/dist/components/discover-community-section.js +79 -67
  20. package/dist/components/discover-community-section.js.map +1 -1
  21. package/dist/components/discover-features.cjs +4 -3
  22. package/dist/components/discover-features.cjs.map +1 -1
  23. package/dist/components/discover-features.js +5 -3
  24. package/dist/components/discover-features.js.map +1 -1
  25. package/dist/components/discover-page.cjs +1 -1
  26. package/dist/components/discover-page.cjs.map +1 -1
  27. package/dist/components/discover-page.js +1 -1
  28. package/dist/components/discover-page.js.map +1 -1
  29. package/dist/components/launchpad/edition-mint-schema.d.cts +2 -2
  30. package/dist/components/launchpad/edition-mint-schema.d.ts +2 -2
  31. package/dist/components/media-header.cjs +2 -0
  32. package/dist/components/media-header.cjs.map +1 -1
  33. package/dist/components/media-header.js +2 -0
  34. package/dist/components/media-header.js.map +1 -1
  35. package/dist/components/rewards/leaderboard-panel.cjs +2 -2
  36. package/dist/components/rewards/leaderboard-panel.cjs.map +1 -1
  37. package/dist/components/rewards/leaderboard-panel.js +2 -2
  38. package/dist/components/rewards/leaderboard-panel.js.map +1 -1
  39. package/dist/components/rewards/leaderboard-table.cjs +1 -1
  40. package/dist/components/rewards/leaderboard-table.cjs.map +1 -1
  41. package/dist/components/rewards/leaderboard-table.js +1 -1
  42. package/dist/components/rewards/leaderboard-table.js.map +1 -1
  43. package/dist/components/scroll-section.cjs.map +1 -1
  44. package/dist/components/scroll-section.d.cts +1 -1
  45. package/dist/components/scroll-section.d.ts +1 -1
  46. package/dist/components/scroll-section.js.map +1 -1
  47. package/dist/components/section-heading.cjs +1 -1
  48. package/dist/components/section-heading.cjs.map +1 -1
  49. package/dist/components/section-heading.d.cts +1 -1
  50. package/dist/components/section-heading.d.ts +1 -1
  51. package/dist/components/section-heading.js +1 -1
  52. package/dist/components/section-heading.js.map +1 -1
  53. package/dist/components/sheet.d.cts +1 -1
  54. package/dist/components/sheet.d.ts +1 -1
  55. package/dist/utils/use-collections.cjs +3 -3
  56. package/dist/utils/use-collections.cjs.map +1 -1
  57. package/dist/utils/use-collections.d.cts +2 -2
  58. package/dist/utils/use-collections.d.ts +2 -2
  59. package/dist/utils/use-collections.js +3 -3
  60. package/dist/utils/use-collections.js.map +1 -1
  61. package/dist/utils/use-tokens.cjs +4 -3
  62. package/dist/utils/use-tokens.cjs.map +1 -1
  63. package/dist/utils/use-tokens.d.cts +2 -1
  64. package/dist/utils/use-tokens.d.ts +2 -1
  65. package/dist/utils/use-tokens.js +4 -3
  66. package/dist/utils/use-tokens.js.map +1 -1
  67. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/asset-page.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState, type ComponentType, type ReactNode } from \"react\";\nimport { motion, useReducedMotion } from \"framer-motion\";\nimport { Award } from \"lucide-react\";\nimport { assetHref, collectionHref, getDerivativesTerm, getService, resolveRemixPolicy, type ApiActivity, type ApiCollection, type ApiOrder, type ApiToken, type Chain } from \"@medialane/sdk\";\nimport { useRouter } from \"./router.js\";\nimport { PageContainer } from \"./page-container.js\";\nimport { PageBackdrop } from \"./media-header.js\";\nimport { AssetHeaderBlock, AssetMediaColumn, AssetOwnerRow } from \"./asset-top-sections.js\";\nimport { AssetPublication } from \"./asset-publication.js\";\nimport { AssetRelatedList, AssetVideo, VIDEO_EMBED_TRAITS, videoEmbed } from \"./asset-video.js\";\nimport { AssetAudio, AUDIO_EMBED_TRAITS, audioEmbed } from \"./asset-audio.js\";\nimport { AssetUtilityIcons } from \"./asset-utility-icons.js\";\nimport { AssetMarketplacePanel } from \"./asset-marketplace-panel.js\";\nimport { AssetOwnersPanel } from \"./asset-owners-panel.js\";\nimport { AssetCollectionBar } from \"./asset-collection-bar.js\";\nimport { AssetOverviewContent } from \"./asset-overview-content.js\";\nimport { AssetMarketsTab } from \"./asset-markets-tab.js\";\nimport { AssetProvenanceTab } from \"./asset-provenance-tab.js\";\nimport { AssetUnavailable } from \"./asset-unavailable.js\";\nimport { HiddenContentBanner } from \"./hidden-content-banner.js\";\nimport { DropTokenLink } from \"./drop/drop-token-link.js\";\nimport { FloatingCommentsButton } from \"./floating-comments-button.js\";\nimport { AssetCommentsDialog } from \"./asset-comments-dialog.js\";\nimport { PopBurnButton } from \"./pop-burn-button.js\";\nimport { SoulboundCard } from \"./soulbound-card.js\";\nimport { MembershipPanel, TicketPanel, type AssetTypePanelProps } from \"./asset-type-panels.js\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"./tabs.js\";\nimport { Skeleton } from \"./skeleton.js\";\nimport { useMedialaneApp } from \"./medialane-app.js\";\nimport { ReportDialog } from \"./report-dialog.js\";\nimport { useToken, useTokenBalance, useTokenHistory } from \"../utils/use-tokens.js\";\nimport { useCollection, useNearbyCollectionTokens } from \"../utils/use-collections.js\";\nimport { useTokenListings } from \"../utils/use-orders.js\";\nimport { useTokenRemixes } from \"../utils/use-remix-offers.js\";\nimport { useComments } from \"../utils/use-comments.js\";\nimport { useFullTokenData } from \"../utils/use-full-token-data.js\";\nimport { useAssetMarketState } from \"../utils/asset-market-state.js\";\nimport { assetAttributes } from \"../utils/asset-attributes.js\";\nimport { externalLink } from \"../utils/external-link.js\";\nimport { ASSET_ACCENTS } from \"../utils/asset-accents.js\";\nimport { isLivingRenderCollection } from \"../data/living-render-collections.js\";\nimport { EXPLORER_URL } from \"../utils/explorer-url.js\";\nimport { profileHref } from \"@medialane/sdk\";\nimport { useImageUrl } from \"../utils/use-image-url.js\";\n\nexport type AssetKind = \"standard\" | \"edition\" | \"ticket\" | \"membership\" | \"pop\";\n\nexport interface AssetMarketContext {\n contract: string;\n tokenId: string;\n tokenName: string;\n tokenImage: string | null;\n tokenStandard: \"ERC721\" | \"ERC1155\" | \"UNKNOWN\";\n activeListings: ApiOrder[];\n quantityOwned?: string;\n mutateListings: () => void;\n}\n\nexport interface AssetMarketActions {\n isProcessing: boolean;\n buy: (order: ApiOrder) => void;\n list: () => void;\n offer: () => void;\n transfer: () => void;\n cancel: (order: ApiOrder) => void;\n acceptBid: (order: ApiOrder) => void;\n dialogs: ReactNode;\n}\n\ninterface KindConfig {\n namePrefix: string;\n accents: (typeof ASSET_ACCENTS)[keyof typeof ASSET_ACCENTS];\n market: boolean;\n remix: boolean;\n Panel?: ComponentType<AssetTypePanelProps>;\n}\n\nconst KINDS: Record<AssetKind, KindConfig> = {\n standard: { namePrefix: \"Token\", accents: ASSET_ACCENTS.standard, market: true, remix: true },\n edition: { namePrefix: \"Edition\", accents: ASSET_ACCENTS.edition, market: true, remix: false },\n ticket: { namePrefix: \"Ticket\", accents: ASSET_ACCENTS.ticket, market: true, remix: false, Panel: TicketPanel },\n membership: { namePrefix: \"Membership\", accents: ASSET_ACCENTS.membership, market: true, remix: false, Panel: MembershipPanel },\n pop: { namePrefix: \"POP\", accents: ASSET_ACCENTS.standard, market: false, remix: false },\n};\n\nconst PUBLICATION_TYPES = new Set([\"publications\", \"posts\"]);\n\ntype TraitList = { trait_type?: string | null; value?: string | number | boolean | null }[];\n\nfunction traitText(attributes: TraitList, trait: string): string | null {\n const value = attributes.find((a) => a.trait_type === trait)?.value;\n return typeof value === \"string\" && value.trim() !== \"\" ? value.trim() : null;\n}\n\nfunction publicationAuthor(attributes: TraitList, metadataAuthor?: string | null): string | null {\n return traitText(attributes, \"Author\") ?? metadataAuthor ?? traitText(attributes, \"Creator\");\n}\n\nconst VARIANT_KINDS: Partial<Record<string, AssetKind>> = { edition: \"edition\", ticket: \"ticket\", club: \"membership\", pop: \"pop\" };\n\nexport function detectAssetKind(service: string | null | undefined, standard: string | null | undefined): AssetKind {\n const variant = getService(service)?.uiVariant;\n if (variant) return VARIANT_KINDS[variant] ?? \"standard\";\n return standard === \"ERC1155\" ? \"edition\" : \"standard\";\n}\n\nexport function AssetPageSkeleton() {\n return (\n <PageContainer className=\"pt-20 pb-8\">\n <div className=\"grid grid-cols-1 lg:grid-cols-2 lg:gap-10 gap-6 items-start\">\n <Skeleton className=\"aspect-square w-full rounded-3xl\" />\n <div className=\"space-y-6\">\n <div className=\"space-y-3\">\n <Skeleton className=\"h-5 w-24 rounded-full\" />\n <Skeleton className=\"h-9 w-3/4\" />\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-2/3\" />\n </div>\n <Skeleton className=\"h-[54px] w-full rounded-2xl\" />\n <div className=\"flex gap-2\">\n {Array.from({ length: 3 }).map((_, i) => <Skeleton key={i} className=\"h-[46px] flex-1 rounded-[13px]\" />)}\n </div>\n <Skeleton className=\"h-16 w-full rounded-2xl\" />\n </div>\n </div>\n </PageContainer>\n );\n}\n\nexport interface AssetPageProps {\n contract: string;\n tokenId: string;\n useMarketActions: (context: AssetMarketContext) => AssetMarketActions;\n}\n\nexport function AssetPage({ contract, tokenId, useMarketActions }: AssetPageProps) {\n const { token, isLoading, isIndexing } = useToken(contract, tokenId);\n const { collection, isLoading: collectionLoading } = useCollection(contract);\n if (isLoading || collectionLoading) return <AssetPageSkeleton />;\n if (!token) return <AssetUnavailable isIndexing={isIndexing} />;\n const kind = detectAssetKind(collection?.service, collection?.standard ?? token.standard);\n return <AssetPageView contract={contract} tokenId={tokenId} token={token} collection={collection ?? null} kind={kind} useMarketActions={useMarketActions} />;\n}\n\nfunction AssetPageView({\n contract,\n tokenId,\n token,\n collection,\n kind,\n useMarketActions,\n}: {\n contract: string;\n tokenId: string;\n token: ApiToken & { isHidden?: boolean };\n collection: ApiCollection | null;\n kind: AssetKind;\n useMarketActions: AssetPageProps[\"useMarketActions\"];\n}) {\n const resolveImage = useImageUrl();\n const config = KINDS[kind];\n const router = useRouter();\n const shouldReduce = useReducedMotion();\n const { walletAddress } = useMedialaneApp();\n\n const { listings, mutate: mutateListings, isLoading: listingsLoading } = useTokenListings(contract, tokenId);\n const { history } = useTokenHistory(contract, tokenId);\n const { tokens: collectionTokens } = useNearbyCollectionTokens(contract, tokenId);\n const { total: commentTotal } = useComments(contract, tokenId);\n const { total: remixCount } = useTokenRemixes(contract, tokenId);\n const { data: fullTokenData } = useFullTokenData(contract, tokenId);\n const { amount: walletBalance } = useTokenBalance(contract, tokenId, walletAddress);\n const market = useAssetMarketState({ token, collection, listings, history: history as ApiActivity[], walletAddress, walletBalance });\n\n const [reportOpen, setReportOpen] = useState(false);\n const [commentOpen, setCommentOpen] = useState(false);\n const [imgError, setImgError] = useState(false);\n\n const name = token.metadata?.name || `${config.namePrefix} #${token.tokenId}`;\n const image = resolveImage(token.metadata?.image);\n const tokenStandard = kind === \"standard\" || kind === \"pop\"\n ? ((token.standard ?? collection?.standard ?? \"UNKNOWN\") as AssetMarketContext[\"tokenStandard\"])\n : \"ERC1155\";\n\n const actions = useMarketActions({\n contract,\n tokenId,\n tokenName: name,\n tokenImage: image,\n tokenStandard,\n activeListings: market.activeListings,\n quantityOwned: market.quantityOwned,\n mutateListings,\n });\n\n const autoActionRef = useRef(false);\n useEffect(() => {\n if (autoActionRef.current || !config.market || !market.isOwner) return;\n const action = new URLSearchParams(window.location.search).get(\"action\");\n if (action === \"list\") actions.list();\n else if (action === \"transfer\") actions.transfer();\n else return;\n autoActionRef.current = true;\n }, [config.market, market.isOwner, actions]);\n\n const { attributes, hasTemplateData, isDisplayAttr, parentContract, parentTokenId } = assetAttributes(token.metadata?.attributes);\n const remixPolicy = resolveRemixPolicy({\n parentNoDerivatives: getDerivativesTerm(token.metadata?.attributes) === \"Not Allowed\",\n viewerIsParentOwner: market.isOwner,\n dealAvailable: !!getService(collection?.service),\n });\n const holders = token.balances ?? [];\n const ownerAddress = !market.isERC1155 ? (holders[0]?.owner ?? token.owner ?? null) : null;\n const marketCount = market.activeListings.length + market.activeBids.length;\n const { Panel } = config;\n\n const postContent = traitText(attributes, \"Content\");\n const description = token.metadata?.description?.trim() || null;\n const video = (token.metadata?.ipType ?? \"\").toLowerCase() === \"video\" ? videoEmbed(attributes) : null;\n const audio = (token.metadata?.ipType ?? \"\").toLowerCase() === \"audio\" ? audioEmbed(attributes) : null;\n const isPublication = !!description && PUBLICATION_TYPES.has((token.metadata?.ipType ?? \"\").toLowerCase());\n const publisherName = collection?.name ?? contract.slice(0, 8) + \"…\";\n const overviewAttributes = postContent ? attributes.filter((a) => a.trait_type !== \"Content\") : attributes;\n const overview = video || audio\n ? assetAttributes(overviewAttributes.filter((a) => !VIDEO_EMBED_TRAITS.has(a.trait_type ?? \"\") && !AUDIO_EMBED_TRAITS.has(a.trait_type ?? \"\")))\n : { attributes: overviewAttributes, hasTemplateData, isDisplayAttr };\n const overviewLink = isPublication || video || audio ? null : externalLink(token.metadata?.externalUrl);\n\n const marketBlock = (\n <>\n {Panel ? <Panel contract={contract} tokenId={tokenId} quantityOwned={market.quantityOwned} /> : null}\n\n {config.market ? (\n <AssetMarketplacePanel\n asset={token}\n compact={isPublication || !!video || !!audio}\n cheapest={market.cheapest}\n usdValue={market.cheapestUsd}\n isOwner={market.isOwner}\n isProcessing={actions.isProcessing}\n isERC1155={market.isERC1155}\n canListMoreEditions={market.canListMoreEditions}\n isMarketLoading={listingsLoading}\n myListing={market.myListing}\n activeBids={market.activeBids}\n remixEnabled={config.remix && remixPolicy.canRemixDirect}\n showDealOption={config.remix && remixPolicy.showDealOption}\n onCancelClick={actions.cancel}\n onAcceptBid={actions.acceptBid}\n onOpenListing={actions.list}\n onOpenTransfer={actions.transfer}\n onOpenPurchase={actions.buy}\n onOpenOffer={actions.offer}\n onOpenRemix={() => router.push(`/create/remix/${contract}/${tokenId}`)}\n />\n ) : null}\n\n {kind === \"pop\" && market.isOwner ? <PopBurnButton collectionAddress={contract} tokenId={tokenId} /> : null}\n\n {market.isERC1155 && holders.length > 0 ? (\n <AssetOwnersPanel balances={holders} total={token.holderCount} editions={Number(token.supply ?? 0)} />\n ) : null}\n </>\n );\n\n const detailsBlock = (\n <div className=\"pt-5 space-y-5\">\n <AssetOwnerRow ownerAddress={ownerAddress} ownerHref={ownerAddress ? profileHref({ address: ownerAddress }) : undefined} ipType={token.metadata?.ipType} />\n {collection?.service === \"drop-collection\" ? <DropTokenLink contract={contract} name={collection.name ?? null} /> : null}\n {kind === \"pop\" ? (\n <SoulboundCard history={history as ApiActivity[]} ownerAddress={ownerAddress} />\n ) : null}\n <AssetCollectionBar\n collectionName={publisherName}\n collectionImage={resolveImage(collection?.image)}\n collectionHref={collectionHref(\"STARKNET\", contract)}\n currentTokenId={tokenId}\n siblingTokens={collectionTokens.map((t) => ({\n tokenId: t.tokenId,\n image: resolveImage(t.metadata?.image),\n }))}\n onNavigate={(id) => router.push(assetHref(\"STARKNET\", contract, id))}\n floorPriceRaw={collection?.floorPrice}\n />\n <div className=\"-ml-3\">\n <AssetUtilityIcons\n contractExplorerHref={`${EXPLORER_URL}/contract/${token.contractAddress}`}\n shareTitle={name}\n onReportClick={() => setReportOpen(true)}\n />\n </div>\n </div>\n );\n\n return (\n <div className=\"relative z-0 min-h-screen\">\n {token.isHidden ? <HiddenContentBanner /> : null}\n <PageBackdrop image={image} />\n\n <PageContainer className={isPublication ? \"pt-20 space-y-8 pb-8 lg:px-16 xl:px-24\" : \"pt-20 space-y-8 pb-8\"}>\n {video ? (\n <div className=\"grid grid-cols-1 lg:grid-cols-[minmax(0,2fr)_minmax(0,1fr)] lg:gap-12 gap-8 items-start\">\n <AssetVideo\n name={name}\n embedSrc={video.src}\n embedLabel={video.label}\n description={token.metadata?.description}\n collectionName={publisherName}\n collectionImage={resolveImage(collection?.image)}\n collectionHref={collectionHref(\"STARKNET\", contract)}\n utilities={\n <AssetUtilityIcons\n contractExplorerHref={`${EXPLORER_URL}/contract/${token.contractAddress}`}\n shareTitle={name}\n onReportClick={() => setReportOpen(true)}\n />\n }\n />\n <aside className=\"space-y-6 min-w-0\">\n {marketBlock}\n <AssetOwnerRow ownerAddress={ownerAddress} ownerHref={ownerAddress ? profileHref({ address: ownerAddress }) : undefined} ipType={token.metadata?.ipType ?? \"Video\"} />\n <AssetRelatedList\n title={publisherName}\n titleHref={collectionHref(\"STARKNET\", contract)}\n items={collectionTokens\n .filter((t) => String(t.tokenId) !== String(tokenId))\n .map((t) => ({\n tokenId: t.tokenId,\n name: t.metadata?.name || `${config.namePrefix} #${t.tokenId}`,\n image: resolveImage(t.metadata?.image),\n href: assetHref(\"STARKNET\", contract, t.tokenId),\n }))}\n />\n </aside>\n </div>\n ) : audio ? (\n <div className=\"grid grid-cols-1 lg:grid-cols-[minmax(0,2fr)_minmax(0,1fr)] lg:gap-12 gap-8 items-start\">\n <AssetAudio\n name={name}\n image={image}\n embedSrc={audio.src}\n embedLabel={audio.label}\n description={token.metadata?.description}\n collectionName={publisherName}\n collectionImage={resolveImage(collection?.image)}\n collectionHref={collectionHref(\"STARKNET\", contract)}\n utilities={\n <AssetUtilityIcons\n contractExplorerHref={`${EXPLORER_URL}/contract/${token.contractAddress}`}\n shareTitle={name}\n onReportClick={() => setReportOpen(true)}\n />\n }\n />\n <aside className=\"space-y-6 min-w-0\">\n {marketBlock}\n <AssetOwnerRow ownerAddress={ownerAddress} ownerHref={ownerAddress ? profileHref({ address: ownerAddress }) : undefined} ipType={token.metadata?.ipType ?? \"Audio\"} />\n <AssetRelatedList\n title={publisherName}\n titleHref={collectionHref(\"STARKNET\", contract)}\n shape=\"square\"\n items={collectionTokens\n .filter((t) => String(t.tokenId) !== String(tokenId))\n .map((t) => ({\n tokenId: t.tokenId,\n name: t.metadata?.name || `${config.namePrefix} #${t.tokenId}`,\n image: resolveImage(t.metadata?.image),\n href: assetHref(\"STARKNET\", contract, t.tokenId),\n }))}\n />\n </aside>\n </div>\n ) : isPublication ? (\n <div className=\"grid grid-cols-1 lg:grid-cols-[minmax(0,2fr)_minmax(0,1fr)] lg:gap-20 gap-8 items-start\">\n <AssetPublication\n name={name}\n text={description!}\n image={image}\n imgError={imgError}\n onImageError={() => setImgError(true)}\n author={publicationAuthor(attributes, token.metadata?.author)}\n externalUrl={token.metadata?.externalUrl}\n />\n <aside className=\"space-y-6 min-w-0 lg:sticky lg:top-16\">\n {marketBlock}\n {detailsBlock}\n </aside>\n </div>\n ) : (\n <div className=\"grid grid-cols-1 lg:grid-cols-2 lg:gap-10 gap-8 items-start\">\n <AssetMediaColumn\n shouldReduce={Boolean(shouldReduce)}\n image={image}\n imageAlt={name}\n imgError={imgError}\n onImageError={() => setImgError(true)}\n animationUrl={token.metadata?.animationUrl}\n live={isLivingRenderCollection(token.chain as Chain, token.contractAddress)}\n fallback={<div className=\"aspect-square bg-muted\" />}\n />\n\n <motion.div\n initial={shouldReduce ? false : { opacity: 0, y: 16 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.5, delay: 0.2 }}\n className=\"space-y-6\"\n >\n <AssetHeaderBlock\n name={name}\n description={token.metadata?.description}\n parentContract={parentContract}\n parentTokenId={parentTokenId}\n badges={kind === \"pop\" ? (\n <span className=\"inline-flex items-center gap-1 text-2xs font-semibold px-2.5 py-1 rounded-full bg-brand-purple/15 text-brand-purple dark:bg-brand-purple/25\">\n <Award className=\"h-3 w-3\" />\n POP\n </span>\n ) : null}\n />\n\n {marketBlock}\n\n {detailsBlock}\n </motion.div>\n </div>\n )}\n\n <Tabs defaultValue=\"overview\">\n <TabsList>\n <TabsTrigger value=\"overview\">Overview</TabsTrigger>\n {config.market ? <TabsTrigger value=\"markets\">Markets {marketCount > 0 && `(${marketCount})`}</TabsTrigger> : null}\n <TabsTrigger value=\"provenance\">Provenance {history.length > 0 && `(${history.length})`}</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"overview\">\n <AssetOverviewContent attributes={overview.attributes} hasTemplateData={overview.hasTemplateData} isDisplayAttr={overview.isDisplayAttr} content={postContent} link={overviewLink} />\n </TabsContent>\n\n {config.market ? (\n <TabsContent value=\"markets\">\n <AssetMarketsTab\n activeListings={market.activeListings}\n activeBids={market.activeBids}\n walletAddress={walletAddress ?? undefined}\n isOwner={market.isOwner}\n isProcessing={actions.isProcessing}\n onBuyClick={actions.buy}\n onCancelClick={actions.cancel}\n onAcceptClick={actions.acceptBid}\n />\n </TabsContent>\n ) : null}\n\n <TabsContent value=\"provenance\">\n <AssetProvenanceTab\n history={history as ApiActivity[]}\n contract={contract}\n tokenId={tokenId}\n remixCount={remixCount}\n originalCreator={fullTokenData?.originalCreator}\n registeredAt={fullTokenData?.registeredAt}\n />\n </TabsContent>\n </Tabs>\n </PageContainer>\n\n <FloatingCommentsButton onClick={() => setCommentOpen(true)} commentTotal={commentTotal} />\n <AssetCommentsDialog\n open={commentOpen}\n onOpenChange={setCommentOpen}\n contract={contract}\n tokenId={tokenId}\n name={name}\n imageUrl={image}\n commentTotal={commentTotal}\n {...config.accents}\n />\n <ReportDialog open={reportOpen} onOpenChange={setReportOpen} target={{ type: \"TOKEN\", contract: token.contractAddress, tokenId: token.tokenId, name }} />\n {actions.dialogs}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/components/asset-page.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useRef, useState, type ComponentType, type ReactNode } from \"react\";\nimport { Award } from \"lucide-react\";\nimport { assetHref, collectionHref, getDerivativesTerm, getService, resolveRemixPolicy, type ApiActivity, type ApiCollection, type ApiOrder, type ApiToken, type Chain } from \"@medialane/sdk\";\nimport { useRouter } from \"./router.js\";\nimport { PageContainer } from \"./page-container.js\";\nimport { PageBackdrop } from \"./media-header.js\";\nimport { AssetHeaderBlock, AssetMediaColumn, AssetOwnerRow } from \"./asset-top-sections.js\";\nimport { AssetPublication } from \"./asset-publication.js\";\nimport { AssetRelatedList, AssetVideo, VIDEO_EMBED_TRAITS, videoEmbed } from \"./asset-video.js\";\nimport { AssetAudio, AUDIO_EMBED_TRAITS, audioEmbed } from \"./asset-audio.js\";\nimport { AssetUtilityIcons } from \"./asset-utility-icons.js\";\nimport { AssetMarketplacePanel } from \"./asset-marketplace-panel.js\";\nimport { AssetOwnersPanel } from \"./asset-owners-panel.js\";\nimport { AssetCollectionBar } from \"./asset-collection-bar.js\";\nimport { AssetOverviewContent } from \"./asset-overview-content.js\";\nimport { AssetMarketsTab } from \"./asset-markets-tab.js\";\nimport { AssetProvenanceTab } from \"./asset-provenance-tab.js\";\nimport { AssetUnavailable } from \"./asset-unavailable.js\";\nimport { HiddenContentBanner } from \"./hidden-content-banner.js\";\nimport { DropTokenLink } from \"./drop/drop-token-link.js\";\nimport { FloatingCommentsButton } from \"./floating-comments-button.js\";\nimport { AssetCommentsDialog } from \"./asset-comments-dialog.js\";\nimport { PopBurnButton } from \"./pop-burn-button.js\";\nimport { SoulboundCard } from \"./soulbound-card.js\";\nimport { MembershipPanel, TicketPanel, type AssetTypePanelProps } from \"./asset-type-panels.js\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"./tabs.js\";\nimport { Skeleton } from \"./skeleton.js\";\nimport { useMedialaneApp } from \"./medialane-app.js\";\nimport { ReportDialog } from \"./report-dialog.js\";\nimport { useToken, useTokenBalance, useTokenHistory } from \"../utils/use-tokens.js\";\nimport { useCollection, useNearbyCollectionTokens } from \"../utils/use-collections.js\";\nimport { useTokenListings } from \"../utils/use-orders.js\";\nimport { useTokenRemixes } from \"../utils/use-remix-offers.js\";\nimport { useComments } from \"../utils/use-comments.js\";\nimport { useFullTokenData } from \"../utils/use-full-token-data.js\";\nimport { useAssetMarketState } from \"../utils/asset-market-state.js\";\nimport { assetAttributes } from \"../utils/asset-attributes.js\";\nimport { externalLink } from \"../utils/external-link.js\";\nimport { ASSET_ACCENTS } from \"../utils/asset-accents.js\";\nimport { isLivingRenderCollection } from \"../data/living-render-collections.js\";\nimport { EXPLORER_URL } from \"../utils/explorer-url.js\";\nimport { profileHref } from \"@medialane/sdk\";\nimport { useImageUrl } from \"../utils/use-image-url.js\";\n\nexport type AssetKind = \"standard\" | \"edition\" | \"ticket\" | \"membership\" | \"pop\";\n\nexport interface AssetMarketContext {\n contract: string;\n tokenId: string;\n tokenName: string;\n tokenImage: string | null;\n tokenStandard: \"ERC721\" | \"ERC1155\" | \"UNKNOWN\";\n activeListings: ApiOrder[];\n quantityOwned?: string;\n mutateListings: () => void;\n}\n\nexport interface AssetMarketActions {\n isProcessing: boolean;\n buy: (order: ApiOrder) => void;\n list: () => void;\n offer: () => void;\n transfer: () => void;\n cancel: (order: ApiOrder) => void;\n acceptBid: (order: ApiOrder) => void;\n dialogs: ReactNode;\n}\n\ninterface KindConfig {\n namePrefix: string;\n accents: (typeof ASSET_ACCENTS)[keyof typeof ASSET_ACCENTS];\n market: boolean;\n remix: boolean;\n Panel?: ComponentType<AssetTypePanelProps>;\n}\n\nconst KINDS: Record<AssetKind, KindConfig> = {\n standard: { namePrefix: \"Token\", accents: ASSET_ACCENTS.standard, market: true, remix: true },\n edition: { namePrefix: \"Edition\", accents: ASSET_ACCENTS.edition, market: true, remix: false },\n ticket: { namePrefix: \"Ticket\", accents: ASSET_ACCENTS.ticket, market: true, remix: false, Panel: TicketPanel },\n membership: { namePrefix: \"Membership\", accents: ASSET_ACCENTS.membership, market: true, remix: false, Panel: MembershipPanel },\n pop: { namePrefix: \"POP\", accents: ASSET_ACCENTS.standard, market: false, remix: false },\n};\n\nconst PUBLICATION_TYPES = new Set([\"publications\", \"posts\"]);\n\ntype TraitList = { trait_type?: string | null; value?: string | number | boolean | null }[];\n\nfunction traitText(attributes: TraitList, trait: string): string | null {\n const value = attributes.find((a) => a.trait_type === trait)?.value;\n return typeof value === \"string\" && value.trim() !== \"\" ? value.trim() : null;\n}\n\nfunction publicationAuthor(attributes: TraitList, metadataAuthor?: string | null): string | null {\n return traitText(attributes, \"Author\") ?? metadataAuthor ?? traitText(attributes, \"Creator\");\n}\n\nconst VARIANT_KINDS: Partial<Record<string, AssetKind>> = { edition: \"edition\", ticket: \"ticket\", club: \"membership\", pop: \"pop\" };\n\nexport function detectAssetKind(service: string | null | undefined, standard: string | null | undefined): AssetKind {\n const variant = getService(service)?.uiVariant;\n if (variant) return VARIANT_KINDS[variant] ?? \"standard\";\n return standard === \"ERC1155\" ? \"edition\" : \"standard\";\n}\n\nexport function AssetPageSkeleton() {\n return (\n <PageContainer className=\"pt-20 pb-8\">\n <div className=\"grid grid-cols-1 lg:grid-cols-2 lg:gap-10 gap-6 items-start\">\n <Skeleton className=\"aspect-square w-full rounded-3xl\" />\n <div className=\"space-y-6\">\n <div className=\"space-y-3\">\n <Skeleton className=\"h-5 w-24 rounded-full\" />\n <Skeleton className=\"h-9 w-3/4\" />\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-2/3\" />\n </div>\n <Skeleton className=\"h-[54px] w-full rounded-2xl\" />\n <div className=\"flex gap-2\">\n {Array.from({ length: 3 }).map((_, i) => <Skeleton key={i} className=\"h-[46px] flex-1 rounded-[13px]\" />)}\n </div>\n <Skeleton className=\"h-16 w-full rounded-2xl\" />\n </div>\n </div>\n </PageContainer>\n );\n}\n\nexport interface AssetPageProps {\n contract: string;\n tokenId: string;\n initialToken?: ApiToken | null;\n initialCollection?: ApiCollection | null;\n useMarketActions: (context: AssetMarketContext) => AssetMarketActions;\n}\n\nexport function AssetPage({ contract, tokenId, initialToken, initialCollection, useMarketActions }: AssetPageProps) {\n const { token, isLoading, isIndexing } = useToken(contract, tokenId, initialToken);\n const { collection, isLoading: collectionLoading } = useCollection(contract, initialCollection);\n if (isLoading || collectionLoading) return <AssetPageSkeleton />;\n if (!token) return <AssetUnavailable isIndexing={isIndexing} />;\n const kind = detectAssetKind(collection?.service, collection?.standard ?? token.standard);\n return <AssetPageView contract={contract} tokenId={tokenId} token={token} collection={collection ?? null} kind={kind} useMarketActions={useMarketActions} />;\n}\n\nfunction AssetPageView({\n contract,\n tokenId,\n token,\n collection,\n kind,\n useMarketActions,\n}: {\n contract: string;\n tokenId: string;\n token: ApiToken & { isHidden?: boolean };\n collection: ApiCollection | null;\n kind: AssetKind;\n useMarketActions: AssetPageProps[\"useMarketActions\"];\n}) {\n const resolveImage = useImageUrl();\n const config = KINDS[kind];\n const router = useRouter();\n const { walletAddress } = useMedialaneApp();\n\n const { listings, mutate: mutateListings, isLoading: listingsLoading } = useTokenListings(contract, tokenId);\n const { history } = useTokenHistory(contract, tokenId);\n const { tokens: collectionTokens } = useNearbyCollectionTokens(contract, tokenId);\n const { total: commentTotal } = useComments(contract, tokenId);\n const { total: remixCount } = useTokenRemixes(contract, tokenId);\n const { data: fullTokenData } = useFullTokenData(contract, tokenId);\n const { amount: walletBalance } = useTokenBalance(contract, tokenId, walletAddress);\n const market = useAssetMarketState({ token, collection, listings, history: history as ApiActivity[], walletAddress, walletBalance });\n\n const [reportOpen, setReportOpen] = useState(false);\n const [commentOpen, setCommentOpen] = useState(false);\n const [imgError, setImgError] = useState(false);\n const [mainImageLoaded, setMainImageLoaded] = useState(false);\n\n const name = token.metadata?.name || `${config.namePrefix} #${token.tokenId}`;\n const image = resolveImage(token.metadata?.image);\n const tokenStandard = kind === \"standard\" || kind === \"pop\"\n ? ((token.standard ?? collection?.standard ?? \"UNKNOWN\") as AssetMarketContext[\"tokenStandard\"])\n : \"ERC1155\";\n\n const actions = useMarketActions({\n contract,\n tokenId,\n tokenName: name,\n tokenImage: image,\n tokenStandard,\n activeListings: market.activeListings,\n quantityOwned: market.quantityOwned,\n mutateListings,\n });\n\n const autoActionRef = useRef(false);\n useEffect(() => {\n if (autoActionRef.current || !config.market || !market.isOwner) return;\n const action = new URLSearchParams(window.location.search).get(\"action\");\n if (action === \"list\") actions.list();\n else if (action === \"transfer\") actions.transfer();\n else return;\n autoActionRef.current = true;\n }, [config.market, market.isOwner, actions]);\n\n const { attributes, hasTemplateData, isDisplayAttr, parentContract, parentTokenId } = assetAttributes(token.metadata?.attributes);\n const remixPolicy = resolveRemixPolicy({\n parentNoDerivatives: getDerivativesTerm(token.metadata?.attributes) === \"Not Allowed\",\n viewerIsParentOwner: market.isOwner,\n dealAvailable: !!getService(collection?.service),\n });\n const holders = token.balances ?? [];\n const ownerAddress = !market.isERC1155 ? (holders[0]?.owner ?? token.owner ?? null) : null;\n const marketCount = market.activeListings.length + market.activeBids.length;\n const { Panel } = config;\n\n const postContent = traitText(attributes, \"Content\");\n const description = token.metadata?.description?.trim() || null;\n const video = (token.metadata?.ipType ?? \"\").toLowerCase() === \"video\" ? videoEmbed(attributes) : null;\n const audio = (token.metadata?.ipType ?? \"\").toLowerCase() === \"audio\" ? audioEmbed(attributes) : null;\n const isPublication = !!description && PUBLICATION_TYPES.has((token.metadata?.ipType ?? \"\").toLowerCase());\n const usesMediaColumn = !video && !audio && !isPublication;\n const publisherName = collection?.name ?? contract.slice(0, 8) + \"…\";\n const overviewAttributes = postContent ? attributes.filter((a) => a.trait_type !== \"Content\") : attributes;\n const overview = video || audio\n ? assetAttributes(overviewAttributes.filter((a) => !VIDEO_EMBED_TRAITS.has(a.trait_type ?? \"\") && !AUDIO_EMBED_TRAITS.has(a.trait_type ?? \"\")))\n : { attributes: overviewAttributes, hasTemplateData, isDisplayAttr };\n const overviewLink = isPublication || video || audio ? null : externalLink(token.metadata?.externalUrl);\n\n const marketBlock = (\n <>\n {Panel ? <Panel contract={contract} tokenId={tokenId} quantityOwned={market.quantityOwned} /> : null}\n\n {config.market ? (\n <AssetMarketplacePanel\n asset={token}\n compact={isPublication || !!video || !!audio}\n cheapest={market.cheapest}\n usdValue={market.cheapestUsd}\n isOwner={market.isOwner}\n isProcessing={actions.isProcessing}\n isERC1155={market.isERC1155}\n canListMoreEditions={market.canListMoreEditions}\n isMarketLoading={listingsLoading}\n myListing={market.myListing}\n activeBids={market.activeBids}\n remixEnabled={config.remix && remixPolicy.canRemixDirect}\n showDealOption={config.remix && remixPolicy.showDealOption}\n onCancelClick={actions.cancel}\n onAcceptBid={actions.acceptBid}\n onOpenListing={actions.list}\n onOpenTransfer={actions.transfer}\n onOpenPurchase={actions.buy}\n onOpenOffer={actions.offer}\n onOpenRemix={() => router.push(`/create/remix/${contract}/${tokenId}`)}\n />\n ) : null}\n\n {kind === \"pop\" && market.isOwner ? <PopBurnButton collectionAddress={contract} tokenId={tokenId} /> : null}\n\n {market.isERC1155 && holders.length > 0 ? (\n <AssetOwnersPanel balances={holders} total={token.holderCount} editions={Number(token.supply ?? 0)} />\n ) : null}\n </>\n );\n\n const detailsBlock = (\n <div className=\"pt-5 space-y-5\">\n <AssetOwnerRow ownerAddress={ownerAddress} ownerHref={ownerAddress ? profileHref({ address: ownerAddress }) : undefined} ipType={token.metadata?.ipType} />\n {collection?.service === \"drop-collection\" ? <DropTokenLink contract={contract} name={collection.name ?? null} /> : null}\n {kind === \"pop\" ? (\n <SoulboundCard history={history as ApiActivity[]} ownerAddress={ownerAddress} />\n ) : null}\n <AssetCollectionBar\n collectionName={publisherName}\n collectionImage={resolveImage(collection?.image)}\n collectionHref={collectionHref(\"STARKNET\", contract)}\n currentTokenId={tokenId}\n siblingTokens={collectionTokens.map((t) => ({\n tokenId: t.tokenId,\n image: resolveImage(t.metadata?.image),\n }))}\n onNavigate={(id) => router.push(assetHref(\"STARKNET\", contract, id))}\n floorPriceRaw={collection?.floorPrice}\n />\n <div className=\"-ml-3\">\n <AssetUtilityIcons\n contractExplorerHref={`${EXPLORER_URL}/contract/${token.contractAddress}`}\n shareTitle={name}\n onReportClick={() => setReportOpen(true)}\n />\n </div>\n </div>\n );\n\n return (\n <div className=\"relative z-0 min-h-screen\">\n {token.isHidden ? <HiddenContentBanner /> : null}\n <PageBackdrop image={usesMediaColumn && !mainImageLoaded ? null : image} />\n\n <PageContainer className={isPublication ? \"pt-20 space-y-8 pb-8 lg:px-16 xl:px-24\" : \"pt-20 space-y-8 pb-8\"}>\n {video ? (\n <div className=\"grid grid-cols-1 lg:grid-cols-[minmax(0,2fr)_minmax(0,1fr)] lg:gap-12 gap-8 items-start\">\n <AssetVideo\n name={name}\n embedSrc={video.src}\n embedLabel={video.label}\n description={token.metadata?.description}\n collectionName={publisherName}\n collectionImage={resolveImage(collection?.image)}\n collectionHref={collectionHref(\"STARKNET\", contract)}\n utilities={\n <AssetUtilityIcons\n contractExplorerHref={`${EXPLORER_URL}/contract/${token.contractAddress}`}\n shareTitle={name}\n onReportClick={() => setReportOpen(true)}\n />\n }\n />\n <aside className=\"space-y-6 min-w-0\">\n {marketBlock}\n <AssetOwnerRow ownerAddress={ownerAddress} ownerHref={ownerAddress ? profileHref({ address: ownerAddress }) : undefined} ipType={token.metadata?.ipType ?? \"Video\"} />\n <AssetRelatedList\n title={publisherName}\n titleHref={collectionHref(\"STARKNET\", contract)}\n items={collectionTokens\n .filter((t) => String(t.tokenId) !== String(tokenId))\n .map((t) => ({\n tokenId: t.tokenId,\n name: t.metadata?.name || `${config.namePrefix} #${t.tokenId}`,\n image: resolveImage(t.metadata?.image),\n href: assetHref(\"STARKNET\", contract, t.tokenId),\n }))}\n />\n </aside>\n </div>\n ) : audio ? (\n <div className=\"grid grid-cols-1 lg:grid-cols-[minmax(0,2fr)_minmax(0,1fr)] lg:gap-12 gap-8 items-start\">\n <AssetAudio\n name={name}\n image={image}\n embedSrc={audio.src}\n embedLabel={audio.label}\n description={token.metadata?.description}\n collectionName={publisherName}\n collectionImage={resolveImage(collection?.image)}\n collectionHref={collectionHref(\"STARKNET\", contract)}\n utilities={\n <AssetUtilityIcons\n contractExplorerHref={`${EXPLORER_URL}/contract/${token.contractAddress}`}\n shareTitle={name}\n onReportClick={() => setReportOpen(true)}\n />\n }\n />\n <aside className=\"space-y-6 min-w-0\">\n {marketBlock}\n <AssetOwnerRow ownerAddress={ownerAddress} ownerHref={ownerAddress ? profileHref({ address: ownerAddress }) : undefined} ipType={token.metadata?.ipType ?? \"Audio\"} />\n <AssetRelatedList\n title={publisherName}\n titleHref={collectionHref(\"STARKNET\", contract)}\n shape=\"square\"\n items={collectionTokens\n .filter((t) => String(t.tokenId) !== String(tokenId))\n .map((t) => ({\n tokenId: t.tokenId,\n name: t.metadata?.name || `${config.namePrefix} #${t.tokenId}`,\n image: resolveImage(t.metadata?.image),\n href: assetHref(\"STARKNET\", contract, t.tokenId),\n }))}\n />\n </aside>\n </div>\n ) : isPublication ? (\n <div className=\"grid grid-cols-1 lg:grid-cols-[minmax(0,2fr)_minmax(0,1fr)] lg:gap-20 gap-8 items-start\">\n <AssetPublication\n name={name}\n text={description!}\n image={image}\n imgError={imgError}\n onImageError={() => setImgError(true)}\n author={publicationAuthor(attributes, token.metadata?.author)}\n externalUrl={token.metadata?.externalUrl}\n />\n <aside className=\"space-y-6 min-w-0 lg:sticky lg:top-16\">\n {marketBlock}\n {detailsBlock}\n </aside>\n </div>\n ) : (\n <div className=\"grid grid-cols-1 lg:grid-cols-2 lg:gap-10 gap-8 items-start\">\n <AssetMediaColumn\n image={image}\n imageAlt={name}\n imgError={imgError}\n onImageError={() => setImgError(true)}\n onImageLoad={() => setMainImageLoaded(true)}\n animationUrl={token.metadata?.animationUrl}\n live={isLivingRenderCollection(token.chain as Chain, token.contractAddress)}\n fallback={<div className=\"aspect-square bg-muted\" />}\n />\n\n <div className=\"space-y-6\">\n <AssetHeaderBlock\n name={name}\n description={token.metadata?.description}\n parentContract={parentContract}\n parentTokenId={parentTokenId}\n badges={kind === \"pop\" ? (\n <span className=\"inline-flex items-center gap-1 text-2xs font-semibold px-2.5 py-1 rounded-full bg-brand-purple/15 text-brand-purple dark:bg-brand-purple/25\">\n <Award className=\"h-3 w-3\" />\n POP\n </span>\n ) : null}\n />\n\n {marketBlock}\n\n {detailsBlock}\n </div>\n </div>\n )}\n\n <Tabs defaultValue=\"overview\">\n <TabsList>\n <TabsTrigger value=\"overview\">Overview</TabsTrigger>\n {config.market ? <TabsTrigger value=\"markets\">Markets {marketCount > 0 && `(${marketCount})`}</TabsTrigger> : null}\n <TabsTrigger value=\"provenance\">Provenance {history.length > 0 && `(${history.length})`}</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"overview\">\n <AssetOverviewContent attributes={overview.attributes} hasTemplateData={overview.hasTemplateData} isDisplayAttr={overview.isDisplayAttr} content={postContent} link={overviewLink} />\n </TabsContent>\n\n {config.market ? (\n <TabsContent value=\"markets\">\n <AssetMarketsTab\n activeListings={market.activeListings}\n activeBids={market.activeBids}\n walletAddress={walletAddress ?? undefined}\n isOwner={market.isOwner}\n isProcessing={actions.isProcessing}\n onBuyClick={actions.buy}\n onCancelClick={actions.cancel}\n onAcceptClick={actions.acceptBid}\n />\n </TabsContent>\n ) : null}\n\n <TabsContent value=\"provenance\">\n <AssetProvenanceTab\n history={history as ApiActivity[]}\n contract={contract}\n tokenId={tokenId}\n remixCount={remixCount}\n originalCreator={fullTokenData?.originalCreator}\n registeredAt={fullTokenData?.registeredAt}\n />\n </TabsContent>\n </Tabs>\n </PageContainer>\n\n <FloatingCommentsButton onClick={() => setCommentOpen(true)} commentTotal={commentTotal} />\n <AssetCommentsDialog\n open={commentOpen}\n onOpenChange={setCommentOpen}\n contract={contract}\n tokenId={tokenId}\n name={name}\n imageUrl={image}\n commentTotal={commentTotal}\n {...config.accents}\n />\n <ReportDialog open={reportOpen} onOpenChange={setReportOpen} target={{ type: \"TOKEN\", contract: token.contractAddress, tokenId: token.tokenId, name }} />\n {actions.dialogs}\n </div>\n );\n}\n"],"mappings":";AA+GQ,SA0HJ,UA1HI,KAEE,YAFF;AA7GR,SAAS,WAAW,QAAQ,gBAAoD;AAChF,SAAS,aAAa;AACtB,SAAS,WAAW,gBAAgB,oBAAoB,YAAY,0BAA0G;AAC9K,SAAS,iBAAiB;AAC1B,SAAS,qBAAqB;AAC9B,SAAS,oBAAoB;AAC7B,SAAS,kBAAkB,kBAAkB,qBAAqB;AAClE,SAAS,wBAAwB;AACjC,SAAS,kBAAkB,YAAY,oBAAoB,kBAAkB;AAC7E,SAAS,YAAY,oBAAoB,kBAAkB;AAC3D,SAAS,yBAAyB;AAClC,SAAS,6BAA6B;AACtC,SAAS,wBAAwB;AACjC,SAAS,0BAA0B;AACnC,SAAS,4BAA4B;AACrC,SAAS,uBAAuB;AAChC,SAAS,0BAA0B;AACnC,SAAS,wBAAwB;AACjC,SAAS,2BAA2B;AACpC,SAAS,qBAAqB;AAC9B,SAAS,8BAA8B;AACvC,SAAS,2BAA2B;AACpC,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAC9B,SAAS,iBAAiB,mBAA6C;AACvE,SAAS,MAAM,aAAa,UAAU,mBAAmB;AACzD,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAChC,SAAS,oBAAoB;AAC7B,SAAS,UAAU,iBAAiB,uBAAuB;AAC3D,SAAS,eAAe,iCAAiC;AACzD,SAAS,wBAAwB;AACjC,SAAS,uBAAuB;AAChC,SAAS,mBAAmB;AAC5B,SAAS,wBAAwB;AACjC,SAAS,2BAA2B;AACpC,SAAS,uBAAuB;AAChC,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,gCAAgC;AACzC,SAAS,oBAAoB;AAC7B,SAAS,mBAAmB;AAC5B,SAAS,mBAAmB;AAkC5B,MAAM,QAAuC;AAAA,EAC3C,UAAU,EAAE,YAAY,SAAS,SAAS,cAAc,UAAU,QAAQ,MAAM,OAAO,KAAK;AAAA,EAC5F,SAAS,EAAE,YAAY,WAAW,SAAS,cAAc,SAAS,QAAQ,MAAM,OAAO,MAAM;AAAA,EAC7F,QAAQ,EAAE,YAAY,UAAU,SAAS,cAAc,QAAQ,QAAQ,MAAM,OAAO,OAAO,OAAO,YAAY;AAAA,EAC9G,YAAY,EAAE,YAAY,cAAc,SAAS,cAAc,YAAY,QAAQ,MAAM,OAAO,OAAO,OAAO,gBAAgB;AAAA,EAC9H,KAAK,EAAE,YAAY,OAAO,SAAS,cAAc,UAAU,QAAQ,OAAO,OAAO,MAAM;AACzF;AAEA,MAAM,oBAAoB,oBAAI,IAAI,CAAC,gBAAgB,OAAO,CAAC;AAI3D,SAAS,UAAU,YAAuB,OAA8B;AACtE,QAAM,QAAQ,WAAW,KAAK,CAAC,MAAM,EAAE,eAAe,KAAK,GAAG;AAC9D,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,IAAI;AAC3E;AAEA,SAAS,kBAAkB,YAAuB,gBAA+C;AAC/F,SAAO,UAAU,YAAY,QAAQ,KAAK,kBAAkB,UAAU,YAAY,SAAS;AAC7F;AAEA,MAAM,gBAAoD,EAAE,SAAS,WAAW,QAAQ,UAAU,MAAM,cAAc,KAAK,MAAM;AAE1H,SAAS,gBAAgB,SAAoC,UAAgD;AAClH,QAAM,UAAU,WAAW,OAAO,GAAG;AACrC,MAAI,QAAS,QAAO,cAAc,OAAO,KAAK;AAC9C,SAAO,aAAa,YAAY,YAAY;AAC9C;AAEO,SAAS,oBAAoB;AAClC,SACE,oBAAC,iBAAc,WAAU,cACvB,+BAAC,SAAI,WAAU,+DACb;AAAA,wBAAC,YAAS,WAAU,oCAAmC;AAAA,IACvD,qBAAC,SAAI,WAAU,aACb;AAAA,2BAAC,SAAI,WAAU,aACb;AAAA,4BAAC,YAAS,WAAU,yBAAwB;AAAA,QAC5C,oBAAC,YAAS,WAAU,aAAY;AAAA,QAChC,oBAAC,YAAS,WAAU,cAAa;AAAA,QACjC,oBAAC,YAAS,WAAU,aAAY;AAAA,SAClC;AAAA,MACA,oBAAC,YAAS,WAAU,+BAA8B;AAAA,MAClD,oBAAC,SAAI,WAAU,cACZ,gBAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,MAAM,oBAAC,YAAiB,WAAU,oCAAb,CAA8C,CAAE,GAC1G;AAAA,MACA,oBAAC,YAAS,WAAU,2BAA0B;AAAA,OAChD;AAAA,KACF,GACF;AAEJ;AAUO,SAAS,UAAU,EAAE,UAAU,SAAS,cAAc,mBAAmB,iBAAiB,GAAmB;AAClH,QAAM,EAAE,OAAO,WAAW,WAAW,IAAI,SAAS,UAAU,SAAS,YAAY;AACjF,QAAM,EAAE,YAAY,WAAW,kBAAkB,IAAI,cAAc,UAAU,iBAAiB;AAC9F,MAAI,aAAa,kBAAmB,QAAO,oBAAC,qBAAkB;AAC9D,MAAI,CAAC,MAAO,QAAO,oBAAC,oBAAiB,YAAwB;AAC7D,QAAM,OAAO,gBAAgB,YAAY,SAAS,YAAY,YAAY,MAAM,QAAQ;AACxF,SAAO,oBAAC,iBAAc,UAAoB,SAAkB,OAAc,YAAY,cAAc,MAAM,MAAY,kBAAoC;AAC5J;AAEA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOG;AACD,QAAM,eAAe,YAAY;AACjC,QAAM,SAAS,MAAM,IAAI;AACzB,QAAM,SAAS,UAAU;AACzB,QAAM,EAAE,cAAc,IAAI,gBAAgB;AAE1C,QAAM,EAAE,UAAU,QAAQ,gBAAgB,WAAW,gBAAgB,IAAI,iBAAiB,UAAU,OAAO;AAC3G,QAAM,EAAE,QAAQ,IAAI,gBAAgB,UAAU,OAAO;AACrD,QAAM,EAAE,QAAQ,iBAAiB,IAAI,0BAA0B,UAAU,OAAO;AAChF,QAAM,EAAE,OAAO,aAAa,IAAI,YAAY,UAAU,OAAO;AAC7D,QAAM,EAAE,OAAO,WAAW,IAAI,gBAAgB,UAAU,OAAO;AAC/D,QAAM,EAAE,MAAM,cAAc,IAAI,iBAAiB,UAAU,OAAO;AAClE,QAAM,EAAE,QAAQ,cAAc,IAAI,gBAAgB,UAAU,SAAS,aAAa;AAClF,QAAM,SAAS,oBAAoB,EAAE,OAAO,YAAY,UAAU,SAAmC,eAAe,cAAc,CAAC;AAEnI,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAClD,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,KAAK;AACpD,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAS,KAAK;AAE5D,QAAM,OAAO,MAAM,UAAU,QAAQ,GAAG,OAAO,UAAU,KAAK,MAAM,OAAO;AAC3E,QAAM,QAAQ,aAAa,MAAM,UAAU,KAAK;AAChD,QAAM,gBAAgB,SAAS,cAAc,SAAS,QAChD,MAAM,YAAY,YAAY,YAAY,YAC5C;AAEJ,QAAM,UAAU,iBAAiB;AAAA,IAC/B;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,YAAY;AAAA,IACZ;AAAA,IACA,gBAAgB,OAAO;AAAA,IACvB,eAAe,OAAO;AAAA,IACtB;AAAA,EACF,CAAC;AAED,QAAM,gBAAgB,OAAO,KAAK;AAClC,YAAU,MAAM;AACd,QAAI,cAAc,WAAW,CAAC,OAAO,UAAU,CAAC,OAAO,QAAS;AAChE,UAAM,SAAS,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAAE,IAAI,QAAQ;AACvE,QAAI,WAAW,OAAQ,SAAQ,KAAK;AAAA,aAC3B,WAAW,WAAY,SAAQ,SAAS;AAAA,QAC5C;AACL,kBAAc,UAAU;AAAA,EAC1B,GAAG,CAAC,OAAO,QAAQ,OAAO,SAAS,OAAO,CAAC;AAE3C,QAAM,EAAE,YAAY,iBAAiB,eAAe,gBAAgB,cAAc,IAAI,gBAAgB,MAAM,UAAU,UAAU;AAChI,QAAM,cAAc,mBAAmB;AAAA,IACrC,qBAAqB,mBAAmB,MAAM,UAAU,UAAU,MAAM;AAAA,IACxE,qBAAqB,OAAO;AAAA,IAC5B,eAAe,CAAC,CAAC,WAAW,YAAY,OAAO;AAAA,EACjD,CAAC;AACD,QAAM,UAAU,MAAM,YAAY,CAAC;AACnC,QAAM,eAAe,CAAC,OAAO,YAAa,QAAQ,CAAC,GAAG,SAAS,MAAM,SAAS,OAAQ;AACtF,QAAM,cAAc,OAAO,eAAe,SAAS,OAAO,WAAW;AACrE,QAAM,EAAE,MAAM,IAAI;AAElB,QAAM,cAAc,UAAU,YAAY,SAAS;AACnD,QAAM,cAAc,MAAM,UAAU,aAAa,KAAK,KAAK;AAC3D,QAAM,SAAS,MAAM,UAAU,UAAU,IAAI,YAAY,MAAM,UAAU,WAAW,UAAU,IAAI;AAClG,QAAM,SAAS,MAAM,UAAU,UAAU,IAAI,YAAY,MAAM,UAAU,WAAW,UAAU,IAAI;AAClG,QAAM,gBAAgB,CAAC,CAAC,eAAe,kBAAkB,KAAK,MAAM,UAAU,UAAU,IAAI,YAAY,CAAC;AACzG,QAAM,kBAAkB,CAAC,SAAS,CAAC,SAAS,CAAC;AAC7C,QAAM,gBAAgB,YAAY,QAAQ,SAAS,MAAM,GAAG,CAAC,IAAI;AACjE,QAAM,qBAAqB,cAAc,WAAW,OAAO,CAAC,MAAM,EAAE,eAAe,SAAS,IAAI;AAChG,QAAM,WAAW,SAAS,QACtB,gBAAgB,mBAAmB,OAAO,CAAC,MAAM,CAAC,mBAAmB,IAAI,EAAE,cAAc,EAAE,KAAK,CAAC,mBAAmB,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC,IAC5I,EAAE,YAAY,oBAAoB,iBAAiB,cAAc;AACrE,QAAM,eAAe,iBAAiB,SAAS,QAAQ,OAAO,aAAa,MAAM,UAAU,WAAW;AAEtG,QAAM,cACJ,iCACG;AAAA,YAAQ,oBAAC,SAAM,UAAoB,SAAkB,eAAe,OAAO,eAAe,IAAK;AAAA,IAE/F,OAAO,SACN;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP,SAAS,iBAAiB,CAAC,CAAC,SAAS,CAAC,CAAC;AAAA,QACvC,UAAU,OAAO;AAAA,QACjB,UAAU,OAAO;AAAA,QACjB,SAAS,OAAO;AAAA,QAChB,cAAc,QAAQ;AAAA,QACtB,WAAW,OAAO;AAAA,QAClB,qBAAqB,OAAO;AAAA,QAC5B,iBAAiB;AAAA,QACjB,WAAW,OAAO;AAAA,QAClB,YAAY,OAAO;AAAA,QACnB,cAAc,OAAO,SAAS,YAAY;AAAA,QAC1C,gBAAgB,OAAO,SAAS,YAAY;AAAA,QAC5C,eAAe,QAAQ;AAAA,QACvB,aAAa,QAAQ;AAAA,QACrB,eAAe,QAAQ;AAAA,QACvB,gBAAgB,QAAQ;AAAA,QACxB,gBAAgB,QAAQ;AAAA,QACxB,aAAa,QAAQ;AAAA,QACrB,aAAa,MAAM,OAAO,KAAK,iBAAiB,QAAQ,IAAI,OAAO,EAAE;AAAA;AAAA,IACvE,IACE;AAAA,IAEH,SAAS,SAAS,OAAO,UAAU,oBAAC,iBAAc,mBAAmB,UAAU,SAAkB,IAAK;AAAA,IAEtG,OAAO,aAAa,QAAQ,SAAS,IACpC,oBAAC,oBAAiB,UAAU,SAAS,OAAO,MAAM,aAAa,UAAU,OAAO,MAAM,UAAU,CAAC,GAAG,IAClG;AAAA,KACN;AAGF,QAAM,eACJ,qBAAC,SAAI,WAAU,kBACb;AAAA,wBAAC,iBAAc,cAA4B,WAAW,eAAe,YAAY,EAAE,SAAS,aAAa,CAAC,IAAI,QAAW,QAAQ,MAAM,UAAU,QAAQ;AAAA,IACxJ,YAAY,YAAY,oBAAoB,oBAAC,iBAAc,UAAoB,MAAM,WAAW,QAAQ,MAAM,IAAK;AAAA,IACnH,SAAS,QACR,oBAAC,iBAAc,SAAmC,cAA4B,IAC5E;AAAA,IACJ;AAAA,MAAC;AAAA;AAAA,QACC,gBAAgB;AAAA,QAChB,iBAAiB,aAAa,YAAY,KAAK;AAAA,QAC/C,gBAAgB,eAAe,YAAY,QAAQ;AAAA,QACnD,gBAAgB;AAAA,QAChB,eAAe,iBAAiB,IAAI,CAAC,OAAO;AAAA,UAC1C,SAAS,EAAE;AAAA,UACX,OAAO,aAAa,EAAE,UAAU,KAAK;AAAA,QACvC,EAAE;AAAA,QACF,YAAY,CAAC,OAAO,OAAO,KAAK,UAAU,YAAY,UAAU,EAAE,CAAC;AAAA,QACnE,eAAe,YAAY;AAAA;AAAA,IAC7B;AAAA,IACA,oBAAC,SAAI,WAAU,SACb;AAAA,MAAC;AAAA;AAAA,QACC,sBAAsB,GAAG,YAAY,aAAa,MAAM,eAAe;AAAA,QACvE,YAAY;AAAA,QACZ,eAAe,MAAM,cAAc,IAAI;AAAA;AAAA,IACzC,GACF;AAAA,KACF;AAGF,SACE,qBAAC,SAAI,WAAU,6BACZ;AAAA,UAAM,WAAW,oBAAC,uBAAoB,IAAK;AAAA,IAC5C,oBAAC,gBAAa,OAAO,mBAAmB,CAAC,kBAAkB,OAAO,OAAO;AAAA,IAEzE,qBAAC,iBAAc,WAAW,gBAAgB,2CAA2C,wBAClF;AAAA,cACD,qBAAC,SAAI,WAAU,2FACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,UAAU,MAAM;AAAA,YAChB,YAAY,MAAM;AAAA,YAClB,aAAa,MAAM,UAAU;AAAA,YAC7B,gBAAgB;AAAA,YAChB,iBAAiB,aAAa,YAAY,KAAK;AAAA,YAC/C,gBAAgB,eAAe,YAAY,QAAQ;AAAA,YACnD,WACE;AAAA,cAAC;AAAA;AAAA,gBACC,sBAAsB,GAAG,YAAY,aAAa,MAAM,eAAe;AAAA,gBACvE,YAAY;AAAA,gBACZ,eAAe,MAAM,cAAc,IAAI;AAAA;AAAA,YACzC;AAAA;AAAA,QAEJ;AAAA,QACA,qBAAC,WAAM,WAAU,qBACd;AAAA;AAAA,UACD,oBAAC,iBAAc,cAA4B,WAAW,eAAe,YAAY,EAAE,SAAS,aAAa,CAAC,IAAI,QAAW,QAAQ,MAAM,UAAU,UAAU,SAAS;AAAA,UACpK;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,cACP,WAAW,eAAe,YAAY,QAAQ;AAAA,cAC9C,OAAO,iBACJ,OAAO,CAAC,MAAM,OAAO,EAAE,OAAO,MAAM,OAAO,OAAO,CAAC,EACnD,IAAI,CAAC,OAAO;AAAA,gBACX,SAAS,EAAE;AAAA,gBACX,MAAM,EAAE,UAAU,QAAQ,GAAG,OAAO,UAAU,KAAK,EAAE,OAAO;AAAA,gBAC5D,OAAO,aAAa,EAAE,UAAU,KAAK;AAAA,gBACrC,MAAM,UAAU,YAAY,UAAU,EAAE,OAAO;AAAA,cACjD,EAAE;AAAA;AAAA,UACN;AAAA,WACF;AAAA,SACF,IACI,QACJ,qBAAC,SAAI,WAAU,2FACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA,UAAU,MAAM;AAAA,YAChB,YAAY,MAAM;AAAA,YAClB,aAAa,MAAM,UAAU;AAAA,YAC7B,gBAAgB;AAAA,YAChB,iBAAiB,aAAa,YAAY,KAAK;AAAA,YAC/C,gBAAgB,eAAe,YAAY,QAAQ;AAAA,YACnD,WACE;AAAA,cAAC;AAAA;AAAA,gBACC,sBAAsB,GAAG,YAAY,aAAa,MAAM,eAAe;AAAA,gBACvE,YAAY;AAAA,gBACZ,eAAe,MAAM,cAAc,IAAI;AAAA;AAAA,YACzC;AAAA;AAAA,QAEJ;AAAA,QACA,qBAAC,WAAM,WAAU,qBACd;AAAA;AAAA,UACD,oBAAC,iBAAc,cAA4B,WAAW,eAAe,YAAY,EAAE,SAAS,aAAa,CAAC,IAAI,QAAW,QAAQ,MAAM,UAAU,UAAU,SAAS;AAAA,UACpK;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,cACP,WAAW,eAAe,YAAY,QAAQ;AAAA,cAC9C,OAAM;AAAA,cACN,OAAO,iBACJ,OAAO,CAAC,MAAM,OAAO,EAAE,OAAO,MAAM,OAAO,OAAO,CAAC,EACnD,IAAI,CAAC,OAAO;AAAA,gBACX,SAAS,EAAE;AAAA,gBACX,MAAM,EAAE,UAAU,QAAQ,GAAG,OAAO,UAAU,KAAK,EAAE,OAAO;AAAA,gBAC5D,OAAO,aAAa,EAAE,UAAU,KAAK;AAAA,gBACrC,MAAM,UAAU,YAAY,UAAU,EAAE,OAAO;AAAA,cACjD,EAAE;AAAA;AAAA,UACN;AAAA,WACF;AAAA,SACF,IACI,gBACJ,qBAAC,SAAI,WAAU,2FACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,MAAM;AAAA,YACN;AAAA,YACA;AAAA,YACA,cAAc,MAAM,YAAY,IAAI;AAAA,YACpC,QAAQ,kBAAkB,YAAY,MAAM,UAAU,MAAM;AAAA,YAC5D,aAAa,MAAM,UAAU;AAAA;AAAA,QAC/B;AAAA,QACA,qBAAC,WAAM,WAAU,yCACd;AAAA;AAAA,UACA;AAAA,WACH;AAAA,SACF,IAEA,qBAAC,SAAI,WAAU,+DACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,UAAU;AAAA,YACV;AAAA,YACA,cAAc,MAAM,YAAY,IAAI;AAAA,YACpC,aAAa,MAAM,mBAAmB,IAAI;AAAA,YAC1C,cAAc,MAAM,UAAU;AAAA,YAC9B,MAAM,yBAAyB,MAAM,OAAgB,MAAM,eAAe;AAAA,YAC1E,UAAU,oBAAC,SAAI,WAAU,0BAAyB;AAAA;AAAA,QACpD;AAAA,QAEA,qBAAC,SAAI,WAAU,aACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,aAAa,MAAM,UAAU;AAAA,cAC7B;AAAA,cACA;AAAA,cACA,QAAQ,SAAS,QACf,qBAAC,UAAK,WAAU,+IACd;AAAA,oCAAC,SAAM,WAAU,WAAU;AAAA,gBAAE;AAAA,iBAE/B,IACE;AAAA;AAAA,UACN;AAAA,UAEC;AAAA,UAEA;AAAA,WACH;AAAA,SACF;AAAA,MAGA,qBAAC,QAAK,cAAa,YACjB;AAAA,6BAAC,YACC;AAAA,8BAAC,eAAY,OAAM,YAAW,sBAAQ;AAAA,UACrC,OAAO,SAAS,qBAAC,eAAY,OAAM,WAAU;AAAA;AAAA,YAAS,cAAc,KAAK,IAAI,WAAW;AAAA,aAAI,IAAiB;AAAA,UAC9G,qBAAC,eAAY,OAAM,cAAa;AAAA;AAAA,YAAY,QAAQ,SAAS,KAAK,IAAI,QAAQ,MAAM;AAAA,aAAI;AAAA,WAC1F;AAAA,QAEA,oBAAC,eAAY,OAAM,YACjB,8BAAC,wBAAqB,YAAY,SAAS,YAAY,iBAAiB,SAAS,iBAAiB,eAAe,SAAS,eAAe,SAAS,aAAa,MAAM,cAAc,GACrL;AAAA,QAEC,OAAO,SACN,oBAAC,eAAY,OAAM,WACjB;AAAA,UAAC;AAAA;AAAA,YACC,gBAAgB,OAAO;AAAA,YACvB,YAAY,OAAO;AAAA,YACnB,eAAe,iBAAiB;AAAA,YAChC,SAAS,OAAO;AAAA,YAChB,cAAc,QAAQ;AAAA,YACtB,YAAY,QAAQ;AAAA,YACpB,eAAe,QAAQ;AAAA,YACvB,eAAe,QAAQ;AAAA;AAAA,QACzB,GACF,IACE;AAAA,QAEJ,oBAAC,eAAY,OAAM,cACjB;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,iBAAiB,eAAe;AAAA,YAChC,cAAc,eAAe;AAAA;AAAA,QAC/B,GACF;AAAA,SACF;AAAA,OACF;AAAA,IAEA,oBAAC,0BAAuB,SAAS,MAAM,eAAe,IAAI,GAAG,cAA4B;AAAA,IACzF;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,cAAc;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV;AAAA,QACC,GAAG,OAAO;AAAA;AAAA,IACb;AAAA,IACA,oBAAC,gBAAa,MAAM,YAAY,cAAc,eAAe,QAAQ,EAAE,MAAM,SAAS,UAAU,MAAM,iBAAiB,SAAS,MAAM,SAAS,KAAK,GAAG;AAAA,IACtJ,QAAQ;AAAA,KACX;AAEJ;","names":[]}
@@ -37,7 +37,6 @@ module.exports = __toCommonJS(asset_top_sections_exports);
37
37
  var import_jsx_runtime = require("react/jsx-runtime");
38
38
  var import_link = __toESM(require("./link.js"), 1);
39
39
  var import_react = require("react");
40
- var import_framer_motion = require("framer-motion");
41
40
  var import_use_intersection_active = require("../utils/use-intersection-active.js");
42
41
  var import_cn = require("../utils/cn.js");
43
42
  var import_address_display = require("./address-display.js");
@@ -45,11 +44,11 @@ var import_parent_attribution_banner = require("./parent-attribution-banner.js")
45
44
  var import_ip_type_badge = require("./ip-type-badge.js");
46
45
  var import_expandable_text = require("./expandable-text.js");
47
46
  function AssetMediaColumn({
48
- shouldReduce,
49
47
  image,
50
48
  imageAlt,
51
49
  imgError,
52
50
  onImageError,
51
+ onImageLoad,
53
52
  fallback,
54
53
  animationUrl,
55
54
  live = false
@@ -58,10 +57,14 @@ function AssetMediaColumn({
58
57
  const [loaded, setLoaded] = (0, import_react.useState)(false);
59
58
  (0, import_react.useEffect)(() => setLoaded(false), [image]);
60
59
  const showLive = live && !!animationUrl && isVisible;
60
+ const markLoaded = () => {
61
+ setLoaded(true);
62
+ onImageLoad?.();
63
+ };
61
64
  const shimmer = !loaded && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
62
65
  "div",
63
66
  {
64
- className: "absolute inset-0 min-h-80 animate-[shimmer_1.6s_ease-in-out_infinite] bg-foreground/[0.06]",
67
+ className: "absolute inset-0 animate-[shimmer_1.6s_ease-in-out_infinite] bg-foreground/[0.06]",
65
68
  style: {
66
69
  backgroundImage: "linear-gradient(90deg, transparent, color-mix(in srgb, var(--foreground) 8%, transparent), transparent)",
67
70
  backgroundSize: "200% 100%"
@@ -77,31 +80,24 @@ function AssetMediaColumn({
77
80
  loading: "lazy",
78
81
  className: "w-full h-full border-0"
79
82
  }
80
- ) }) : !image || imgError ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "w-full overflow-hidden rounded-3xl", children: fallback }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
81
- import_framer_motion.motion.div,
82
- {
83
- initial: shouldReduce ? false : { opacity: 0, scale: 0.98 },
84
- animate: { opacity: 1, scale: 1 },
85
- transition: { duration: 0.5 },
86
- className: "relative block w-full overflow-hidden rounded-3xl",
87
- children: [
88
- shimmer,
89
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
90
- "img",
91
- {
92
- src: image,
93
- alt: imageAlt,
94
- onLoad: () => setLoaded(true),
95
- onError: onImageError,
96
- className: (0, import_cn.cn)(
97
- "w-full h-auto max-h-[80vh] object-contain transition-opacity duration-300",
98
- loaded ? "opacity-100" : "opacity-0"
99
- )
100
- }
101
- )
102
- ]
103
- }
104
- ) });
83
+ ) }) : !image || imgError ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "w-full overflow-hidden rounded-3xl", children: fallback }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: (0, import_cn.cn)("relative block w-full overflow-hidden rounded-3xl", !loaded && "aspect-square"), children: [
84
+ shimmer,
85
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
86
+ "img",
87
+ {
88
+ ref: (el) => {
89
+ if (!loaded && el?.complete && el.naturalWidth > 0) markLoaded();
90
+ },
91
+ src: image,
92
+ alt: imageAlt,
93
+ fetchPriority: "high",
94
+ decoding: "async",
95
+ onLoad: markLoaded,
96
+ onError: onImageError,
97
+ className: "relative w-full h-auto max-h-[80vh] object-contain"
98
+ }
99
+ )
100
+ ] }) });
105
101
  }
106
102
  function AssetHeaderBlock({
107
103
  name,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/asset-top-sections.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"./link.js\";\nimport { useEffect, useState } from \"react\";\nimport { motion } from \"framer-motion\";\nimport { useIntersectionActive } from \"../utils/use-intersection-active.js\";\nimport { cn } from \"../utils/cn.js\";\nimport { AddressDisplay } from \"./address-display.js\";\nimport { ParentAttributionBanner } from \"./parent-attribution-banner.js\";\nimport { IpTypeBadge } from \"./ip-type-badge.js\";\nimport { ExpandableText } from \"./expandable-text.js\";\n\ninterface AssetMediaColumnProps {\n shouldReduce: boolean;\n image: string | null;\n imageAlt: string;\n imgError: boolean;\n onImageError: () => void;\n fallback: React.ReactNode;\n\n\n animationUrl?: string | null;\n\n live?: boolean;\n}\n\nexport function AssetMediaColumn({\n shouldReduce,\n image,\n imageAlt,\n imgError,\n onImageError,\n fallback,\n animationUrl,\n live = false,\n}: AssetMediaColumnProps) {\n const [ref, isVisible] = useIntersectionActive<HTMLDivElement>();\n const [loaded, setLoaded] = useState(false);\n useEffect(() => setLoaded(false), [image]);\n const showLive = live && !!animationUrl && isVisible;\n\n const shimmer = !loaded && (\n <div\n className=\"absolute inset-0 min-h-80 animate-[shimmer_1.6s_ease-in-out_infinite] bg-foreground/[0.06]\"\n style={{\n backgroundImage:\n \"linear-gradient(90deg, transparent, color-mix(in srgb, var(--foreground) 8%, transparent), transparent)\",\n backgroundSize: \"200% 100%\",\n }}\n />\n );\n\n return (\n <div ref={ref} className=\"w-full lg:sticky lg:top-16\">\n {showLive ? (\n <div className=\"w-full overflow-hidden rounded-3xl aspect-square\">\n <iframe\n src={animationUrl!}\n title={imageAlt}\n sandbox=\"allow-scripts\"\n loading=\"lazy\"\n className=\"w-full h-full border-0\"\n />\n </div>\n ) : !image || imgError ? (\n <div className=\"w-full overflow-hidden rounded-3xl\">{fallback}</div>\n ) : (\n <motion.div\n initial={shouldReduce ? false : { opacity: 0, scale: 0.98 }}\n animate={{ opacity: 1, scale: 1 }}\n transition={{ duration: 0.5 }}\n className=\"relative block w-full overflow-hidden rounded-3xl\"\n >\n {shimmer}\n <img\n src={image}\n alt={imageAlt}\n onLoad={() => setLoaded(true)}\n onError={onImageError}\n className={cn(\n \"w-full h-auto max-h-[80vh] object-contain transition-opacity duration-300\",\n loaded ? \"opacity-100\" : \"opacity-0\"\n )}\n />\n </motion.div>\n )}\n\n </div>\n );\n}\n\ninterface AssetHeaderBlockProps {\n name: string;\n badges?: React.ReactNode;\n utilities?: React.ReactNode;\n description?: string | null;\n parentContract?: string | null;\n parentTokenId?: string | null;\n}\n\nexport function AssetHeaderBlock({\n name,\n badges,\n utilities,\n description,\n parentContract,\n parentTokenId,\n}: AssetHeaderBlockProps) {\n return (\n <div className=\"min-w-0 flex-1\">\n {badges || utilities ? (\n <div className=\"flex items-center justify-between gap-2 mb-2\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n {badges}\n </div>\n {utilities}\n </div>\n ) : null}\n {parentContract && parentTokenId ? (\n <div className=\"mb-3\">\n <ParentAttributionBanner\n parentContract={parentContract}\n parentTokenId={parentTokenId}\n parentName={`Token #${parentTokenId}`}\n />\n </div>\n ) : null}\n <h1 className=\"text-2xl lg:text-4xl font-bold break-words\">{name}</h1>\n {description ? <ExpandableText text={description} className=\"mt-1\" /> : null}\n </div>\n );\n}\n\nexport interface AssetOwnerRowProps {\n ownerAddress?: string | null;\n ownerHref?: string;\n ipType?: string | null;\n}\n\nexport function AssetOwnerRow({ ownerAddress, ownerHref, ipType }: AssetOwnerRowProps) {\n if (!ownerAddress && !ipType) return null;\n return (\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-1.5 text-xs text-muted-foreground\">\n {ipType ? <IpTypeBadge ipType={ipType} size=\"md\" showLabel /> : null}\n {ownerAddress && ownerHref ? (\n <div className=\"flex items-center gap-1.5\">\n <span>Owner</span>\n <Link href={ownerHref} className=\"hover:text-primary transition-colors font-medium\">\n <AddressDisplay address={ownerAddress} />\n </Link>\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":"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","names":["Link"]}
1
+ {"version":3,"sources":["../../src/components/asset-top-sections.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"./link.js\";\nimport { useEffect, useState } from \"react\";\nimport { useIntersectionActive } from \"../utils/use-intersection-active.js\";\nimport { cn } from \"../utils/cn.js\";\nimport { AddressDisplay } from \"./address-display.js\";\nimport { ParentAttributionBanner } from \"./parent-attribution-banner.js\";\nimport { IpTypeBadge } from \"./ip-type-badge.js\";\nimport { ExpandableText } from \"./expandable-text.js\";\n\ninterface AssetMediaColumnProps {\n image: string | null;\n imageAlt: string;\n imgError: boolean;\n onImageError: () => void;\n onImageLoad?: () => void;\n fallback: React.ReactNode;\n\n\n animationUrl?: string | null;\n\n live?: boolean;\n}\n\nexport function AssetMediaColumn({\n image,\n imageAlt,\n imgError,\n onImageError,\n onImageLoad,\n fallback,\n animationUrl,\n live = false,\n}: AssetMediaColumnProps) {\n const [ref, isVisible] = useIntersectionActive<HTMLDivElement>();\n const [loaded, setLoaded] = useState(false);\n useEffect(() => setLoaded(false), [image]);\n const showLive = live && !!animationUrl && isVisible;\n\n const markLoaded = () => {\n setLoaded(true);\n onImageLoad?.();\n };\n\n const shimmer = !loaded && (\n <div\n className=\"absolute inset-0 animate-[shimmer_1.6s_ease-in-out_infinite] bg-foreground/[0.06]\"\n style={{\n backgroundImage:\n \"linear-gradient(90deg, transparent, color-mix(in srgb, var(--foreground) 8%, transparent), transparent)\",\n backgroundSize: \"200% 100%\",\n }}\n />\n );\n\n return (\n <div ref={ref} className=\"w-full lg:sticky lg:top-16\">\n {showLive ? (\n <div className=\"w-full overflow-hidden rounded-3xl aspect-square\">\n <iframe\n src={animationUrl!}\n title={imageAlt}\n sandbox=\"allow-scripts\"\n loading=\"lazy\"\n className=\"w-full h-full border-0\"\n />\n </div>\n ) : !image || imgError ? (\n <div className=\"w-full overflow-hidden rounded-3xl\">{fallback}</div>\n ) : (\n <div className={cn(\"relative block w-full overflow-hidden rounded-3xl\", !loaded && \"aspect-square\")}>\n {shimmer}\n <img\n ref={(el) => {\n if (!loaded && el?.complete && el.naturalWidth > 0) markLoaded();\n }}\n src={image}\n alt={imageAlt}\n fetchPriority=\"high\"\n decoding=\"async\"\n onLoad={markLoaded}\n onError={onImageError}\n className=\"relative w-full h-auto max-h-[80vh] object-contain\"\n />\n </div>\n )}\n\n </div>\n );\n}\n\ninterface AssetHeaderBlockProps {\n name: string;\n badges?: React.ReactNode;\n utilities?: React.ReactNode;\n description?: string | null;\n parentContract?: string | null;\n parentTokenId?: string | null;\n}\n\nexport function AssetHeaderBlock({\n name,\n badges,\n utilities,\n description,\n parentContract,\n parentTokenId,\n}: AssetHeaderBlockProps) {\n return (\n <div className=\"min-w-0 flex-1\">\n {badges || utilities ? (\n <div className=\"flex items-center justify-between gap-2 mb-2\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n {badges}\n </div>\n {utilities}\n </div>\n ) : null}\n {parentContract && parentTokenId ? (\n <div className=\"mb-3\">\n <ParentAttributionBanner\n parentContract={parentContract}\n parentTokenId={parentTokenId}\n parentName={`Token #${parentTokenId}`}\n />\n </div>\n ) : null}\n <h1 className=\"text-2xl lg:text-4xl font-bold break-words\">{name}</h1>\n {description ? <ExpandableText text={description} className=\"mt-1\" /> : null}\n </div>\n );\n}\n\nexport interface AssetOwnerRowProps {\n ownerAddress?: string | null;\n ownerHref?: string;\n ipType?: string | null;\n}\n\nexport function AssetOwnerRow({ ownerAddress, ownerHref, ipType }: AssetOwnerRowProps) {\n if (!ownerAddress && !ipType) return null;\n return (\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-1.5 text-xs text-muted-foreground\">\n {ipType ? <IpTypeBadge ipType={ipType} size=\"md\" showLabel /> : null}\n {ownerAddress && ownerHref ? (\n <div className=\"flex items-center gap-1.5\">\n <span>Owner</span>\n <Link href={ownerHref} className=\"hover:text-primary transition-colors font-medium\">\n <AddressDisplay address={ownerAddress} />\n </Link>\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8CI;AA5CJ,kBAAiB;AACjB,mBAAoC;AACpC,qCAAsC;AACtC,gBAAmB;AACnB,6BAA+B;AAC/B,uCAAwC;AACxC,2BAA4B;AAC5B,6BAA+B;AAgBxB,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AACT,GAA0B;AACxB,QAAM,CAAC,KAAK,SAAS,QAAI,sDAAsC;AAC/D,QAAM,CAAC,QAAQ,SAAS,QAAI,uBAAS,KAAK;AAC1C,8BAAU,MAAM,UAAU,KAAK,GAAG,CAAC,KAAK,CAAC;AACzC,QAAM,WAAW,QAAQ,CAAC,CAAC,gBAAgB;AAE3C,QAAM,aAAa,MAAM;AACvB,cAAU,IAAI;AACd,kBAAc;AAAA,EAChB;AAEA,QAAM,UAAU,CAAC,UACf;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO;AAAA,QACL,iBACE;AAAA,QACF,gBAAgB;AAAA,MAClB;AAAA;AAAA,EACF;AAGF,SACE,4CAAC,SAAI,KAAU,WAAU,8BACtB,qBACC,4CAAC,SAAI,WAAU,oDACb;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,OAAO;AAAA,MACP,SAAQ;AAAA,MACR,SAAQ;AAAA,MACR,WAAU;AAAA;AAAA,EACZ,GACF,IACE,CAAC,SAAS,WACZ,4CAAC,SAAI,WAAU,sCAAsC,oBAAS,IAE9D,6CAAC,SAAI,eAAW,cAAG,qDAAqD,CAAC,UAAU,eAAe,GAC/F;AAAA;AAAA,IACD;AAAA,MAAC;AAAA;AAAA,QACC,KAAK,CAAC,OAAO;AACX,cAAI,CAAC,UAAU,IAAI,YAAY,GAAG,eAAe,EAAG,YAAW;AAAA,QACjE;AAAA,QACA,KAAK;AAAA,QACL,KAAK;AAAA,QACL,eAAc;AAAA,QACd,UAAS;AAAA,QACT,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAU;AAAA;AAAA,IACZ;AAAA,KACF,GAGJ;AAEJ;AAWO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AACxB,SACE,6CAAC,SAAI,WAAU,kBACZ;AAAA,cAAU,YACT,6CAAC,SAAI,WAAU,gDACb;AAAA,kDAAC,SAAI,WAAU,qCACZ,kBACH;AAAA,MACC;AAAA,OACH,IACE;AAAA,IACH,kBAAkB,gBACjB,4CAAC,SAAI,WAAU,QACb;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,YAAY,UAAU,aAAa;AAAA;AAAA,IACrC,GACF,IACE;AAAA,IACJ,4CAAC,QAAG,WAAU,8CAA8C,gBAAK;AAAA,IAChE,cAAc,4CAAC,yCAAe,MAAM,aAAa,WAAU,QAAO,IAAK;AAAA,KAC1E;AAEJ;AAQO,SAAS,cAAc,EAAE,cAAc,WAAW,OAAO,GAAuB;AACrF,MAAI,CAAC,gBAAgB,CAAC,OAAQ,QAAO;AACrC,SACE,6CAAC,SAAI,WAAU,+EACZ;AAAA,aAAS,4CAAC,oCAAY,QAAgB,MAAK,MAAK,WAAS,MAAC,IAAK;AAAA,IAC/D,gBAAgB,YACf,6CAAC,SAAI,WAAU,6BACb;AAAA,kDAAC,UAAK,mBAAK;AAAA,MACX,4CAAC,YAAAA,SAAA,EAAK,MAAM,WAAW,WAAU,oDAC/B,sDAAC,yCAAe,SAAS,cAAc,GACzC;AAAA,OACF,IACE;AAAA,KACN;AAEJ;","names":["Link"]}
@@ -1,16 +1,16 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
 
3
3
  interface AssetMediaColumnProps {
4
- shouldReduce: boolean;
5
4
  image: string | null;
6
5
  imageAlt: string;
7
6
  imgError: boolean;
8
7
  onImageError: () => void;
8
+ onImageLoad?: () => void;
9
9
  fallback: React.ReactNode;
10
10
  animationUrl?: string | null;
11
11
  live?: boolean;
12
12
  }
13
- declare function AssetMediaColumn({ shouldReduce, image, imageAlt, imgError, onImageError, fallback, animationUrl, live, }: AssetMediaColumnProps): react_jsx_runtime.JSX.Element;
13
+ declare function AssetMediaColumn({ image, imageAlt, imgError, onImageError, onImageLoad, fallback, animationUrl, live, }: AssetMediaColumnProps): react_jsx_runtime.JSX.Element;
14
14
  interface AssetHeaderBlockProps {
15
15
  name: string;
16
16
  badges?: React.ReactNode;
@@ -1,16 +1,16 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
 
3
3
  interface AssetMediaColumnProps {
4
- shouldReduce: boolean;
5
4
  image: string | null;
6
5
  imageAlt: string;
7
6
  imgError: boolean;
8
7
  onImageError: () => void;
8
+ onImageLoad?: () => void;
9
9
  fallback: React.ReactNode;
10
10
  animationUrl?: string | null;
11
11
  live?: boolean;
12
12
  }
13
- declare function AssetMediaColumn({ shouldReduce, image, imageAlt, imgError, onImageError, fallback, animationUrl, live, }: AssetMediaColumnProps): react_jsx_runtime.JSX.Element;
13
+ declare function AssetMediaColumn({ image, imageAlt, imgError, onImageError, onImageLoad, fallback, animationUrl, live, }: AssetMediaColumnProps): react_jsx_runtime.JSX.Element;
14
14
  interface AssetHeaderBlockProps {
15
15
  name: string;
16
16
  badges?: React.ReactNode;
@@ -2,7 +2,6 @@
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import Link from "./link.js";
4
4
  import { useEffect, useState } from "react";
5
- import { motion } from "framer-motion";
6
5
  import { useIntersectionActive } from "../utils/use-intersection-active.js";
7
6
  import { cn } from "../utils/cn.js";
8
7
  import { AddressDisplay } from "./address-display.js";
@@ -10,11 +9,11 @@ import { ParentAttributionBanner } from "./parent-attribution-banner.js";
10
9
  import { IpTypeBadge } from "./ip-type-badge.js";
11
10
  import { ExpandableText } from "./expandable-text.js";
12
11
  function AssetMediaColumn({
13
- shouldReduce,
14
12
  image,
15
13
  imageAlt,
16
14
  imgError,
17
15
  onImageError,
16
+ onImageLoad,
18
17
  fallback,
19
18
  animationUrl,
20
19
  live = false
@@ -23,10 +22,14 @@ function AssetMediaColumn({
23
22
  const [loaded, setLoaded] = useState(false);
24
23
  useEffect(() => setLoaded(false), [image]);
25
24
  const showLive = live && !!animationUrl && isVisible;
25
+ const markLoaded = () => {
26
+ setLoaded(true);
27
+ onImageLoad?.();
28
+ };
26
29
  const shimmer = !loaded && /* @__PURE__ */ jsx(
27
30
  "div",
28
31
  {
29
- className: "absolute inset-0 min-h-80 animate-[shimmer_1.6s_ease-in-out_infinite] bg-foreground/[0.06]",
32
+ className: "absolute inset-0 animate-[shimmer_1.6s_ease-in-out_infinite] bg-foreground/[0.06]",
30
33
  style: {
31
34
  backgroundImage: "linear-gradient(90deg, transparent, color-mix(in srgb, var(--foreground) 8%, transparent), transparent)",
32
35
  backgroundSize: "200% 100%"
@@ -42,31 +45,24 @@ function AssetMediaColumn({
42
45
  loading: "lazy",
43
46
  className: "w-full h-full border-0"
44
47
  }
45
- ) }) : !image || imgError ? /* @__PURE__ */ jsx("div", { className: "w-full overflow-hidden rounded-3xl", children: fallback }) : /* @__PURE__ */ jsxs(
46
- motion.div,
47
- {
48
- initial: shouldReduce ? false : { opacity: 0, scale: 0.98 },
49
- animate: { opacity: 1, scale: 1 },
50
- transition: { duration: 0.5 },
51
- className: "relative block w-full overflow-hidden rounded-3xl",
52
- children: [
53
- shimmer,
54
- /* @__PURE__ */ jsx(
55
- "img",
56
- {
57
- src: image,
58
- alt: imageAlt,
59
- onLoad: () => setLoaded(true),
60
- onError: onImageError,
61
- className: cn(
62
- "w-full h-auto max-h-[80vh] object-contain transition-opacity duration-300",
63
- loaded ? "opacity-100" : "opacity-0"
64
- )
65
- }
66
- )
67
- ]
68
- }
69
- ) });
48
+ ) }) : !image || imgError ? /* @__PURE__ */ jsx("div", { className: "w-full overflow-hidden rounded-3xl", children: fallback }) : /* @__PURE__ */ jsxs("div", { className: cn("relative block w-full overflow-hidden rounded-3xl", !loaded && "aspect-square"), children: [
49
+ shimmer,
50
+ /* @__PURE__ */ jsx(
51
+ "img",
52
+ {
53
+ ref: (el) => {
54
+ if (!loaded && el?.complete && el.naturalWidth > 0) markLoaded();
55
+ },
56
+ src: image,
57
+ alt: imageAlt,
58
+ fetchPriority: "high",
59
+ decoding: "async",
60
+ onLoad: markLoaded,
61
+ onError: onImageError,
62
+ className: "relative w-full h-auto max-h-[80vh] object-contain"
63
+ }
64
+ )
65
+ ] }) });
70
66
  }
71
67
  function AssetHeaderBlock({
72
68
  name,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/asset-top-sections.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"./link.js\";\nimport { useEffect, useState } from \"react\";\nimport { motion } from \"framer-motion\";\nimport { useIntersectionActive } from \"../utils/use-intersection-active.js\";\nimport { cn } from \"../utils/cn.js\";\nimport { AddressDisplay } from \"./address-display.js\";\nimport { ParentAttributionBanner } from \"./parent-attribution-banner.js\";\nimport { IpTypeBadge } from \"./ip-type-badge.js\";\nimport { ExpandableText } from \"./expandable-text.js\";\n\ninterface AssetMediaColumnProps {\n shouldReduce: boolean;\n image: string | null;\n imageAlt: string;\n imgError: boolean;\n onImageError: () => void;\n fallback: React.ReactNode;\n\n\n animationUrl?: string | null;\n\n live?: boolean;\n}\n\nexport function AssetMediaColumn({\n shouldReduce,\n image,\n imageAlt,\n imgError,\n onImageError,\n fallback,\n animationUrl,\n live = false,\n}: AssetMediaColumnProps) {\n const [ref, isVisible] = useIntersectionActive<HTMLDivElement>();\n const [loaded, setLoaded] = useState(false);\n useEffect(() => setLoaded(false), [image]);\n const showLive = live && !!animationUrl && isVisible;\n\n const shimmer = !loaded && (\n <div\n className=\"absolute inset-0 min-h-80 animate-[shimmer_1.6s_ease-in-out_infinite] bg-foreground/[0.06]\"\n style={{\n backgroundImage:\n \"linear-gradient(90deg, transparent, color-mix(in srgb, var(--foreground) 8%, transparent), transparent)\",\n backgroundSize: \"200% 100%\",\n }}\n />\n );\n\n return (\n <div ref={ref} className=\"w-full lg:sticky lg:top-16\">\n {showLive ? (\n <div className=\"w-full overflow-hidden rounded-3xl aspect-square\">\n <iframe\n src={animationUrl!}\n title={imageAlt}\n sandbox=\"allow-scripts\"\n loading=\"lazy\"\n className=\"w-full h-full border-0\"\n />\n </div>\n ) : !image || imgError ? (\n <div className=\"w-full overflow-hidden rounded-3xl\">{fallback}</div>\n ) : (\n <motion.div\n initial={shouldReduce ? false : { opacity: 0, scale: 0.98 }}\n animate={{ opacity: 1, scale: 1 }}\n transition={{ duration: 0.5 }}\n className=\"relative block w-full overflow-hidden rounded-3xl\"\n >\n {shimmer}\n <img\n src={image}\n alt={imageAlt}\n onLoad={() => setLoaded(true)}\n onError={onImageError}\n className={cn(\n \"w-full h-auto max-h-[80vh] object-contain transition-opacity duration-300\",\n loaded ? \"opacity-100\" : \"opacity-0\"\n )}\n />\n </motion.div>\n )}\n\n </div>\n );\n}\n\ninterface AssetHeaderBlockProps {\n name: string;\n badges?: React.ReactNode;\n utilities?: React.ReactNode;\n description?: string | null;\n parentContract?: string | null;\n parentTokenId?: string | null;\n}\n\nexport function AssetHeaderBlock({\n name,\n badges,\n utilities,\n description,\n parentContract,\n parentTokenId,\n}: AssetHeaderBlockProps) {\n return (\n <div className=\"min-w-0 flex-1\">\n {badges || utilities ? (\n <div className=\"flex items-center justify-between gap-2 mb-2\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n {badges}\n </div>\n {utilities}\n </div>\n ) : null}\n {parentContract && parentTokenId ? (\n <div className=\"mb-3\">\n <ParentAttributionBanner\n parentContract={parentContract}\n parentTokenId={parentTokenId}\n parentName={`Token #${parentTokenId}`}\n />\n </div>\n ) : null}\n <h1 className=\"text-2xl lg:text-4xl font-bold break-words\">{name}</h1>\n {description ? <ExpandableText text={description} className=\"mt-1\" /> : null}\n </div>\n );\n}\n\nexport interface AssetOwnerRowProps {\n ownerAddress?: string | null;\n ownerHref?: string;\n ipType?: string | null;\n}\n\nexport function AssetOwnerRow({ ownerAddress, ownerHref, ipType }: AssetOwnerRowProps) {\n if (!ownerAddress && !ipType) return null;\n return (\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-1.5 text-xs text-muted-foreground\">\n {ipType ? <IpTypeBadge ipType={ipType} size=\"md\" showLabel /> : null}\n {ownerAddress && ownerHref ? (\n <div className=\"flex items-center gap-1.5\">\n <span>Owner</span>\n <Link href={ownerHref} className=\"hover:text-primary transition-colors font-medium\">\n <AddressDisplay address={ownerAddress} />\n </Link>\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":";AA0CI,cAyBI,YAzBJ;AAxCJ,OAAO,UAAU;AACjB,SAAS,WAAW,gBAAgB;AACpC,SAAS,cAAc;AACvB,SAAS,6BAA6B;AACtC,SAAS,UAAU;AACnB,SAAS,sBAAsB;AAC/B,SAAS,+BAA+B;AACxC,SAAS,mBAAmB;AAC5B,SAAS,sBAAsB;AAgBxB,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AACT,GAA0B;AACxB,QAAM,CAAC,KAAK,SAAS,IAAI,sBAAsC;AAC/D,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,YAAU,MAAM,UAAU,KAAK,GAAG,CAAC,KAAK,CAAC;AACzC,QAAM,WAAW,QAAQ,CAAC,CAAC,gBAAgB;AAE3C,QAAM,UAAU,CAAC,UACf;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO;AAAA,QACL,iBACE;AAAA,QACF,gBAAgB;AAAA,MAClB;AAAA;AAAA,EACF;AAGF,SACE,oBAAC,SAAI,KAAU,WAAU,8BACtB,qBACC,oBAAC,SAAI,WAAU,oDACb;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,OAAO;AAAA,MACP,SAAQ;AAAA,MACR,SAAQ;AAAA,MACR,WAAU;AAAA;AAAA,EACZ,GACF,IACE,CAAC,SAAS,WACZ,oBAAC,SAAI,WAAU,sCAAsC,oBAAS,IAE9D;AAAA,IAAC,OAAO;AAAA,IAAP;AAAA,MACC,SAAS,eAAe,QAAQ,EAAE,SAAS,GAAG,OAAO,KAAK;AAAA,MAC1D,SAAS,EAAE,SAAS,GAAG,OAAO,EAAE;AAAA,MAChC,YAAY,EAAE,UAAU,IAAI;AAAA,MAC5B,WAAU;AAAA,MAET;AAAA;AAAA,QACD;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL,KAAK;AAAA,YACL,QAAQ,MAAM,UAAU,IAAI;AAAA,YAC5B,SAAS;AAAA,YACT,WAAW;AAAA,cACT;AAAA,cACA,SAAS,gBAAgB;AAAA,YAC3B;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF,GAGJ;AAEJ;AAWO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AACxB,SACE,qBAAC,SAAI,WAAU,kBACZ;AAAA,cAAU,YACT,qBAAC,SAAI,WAAU,gDACb;AAAA,0BAAC,SAAI,WAAU,qCACZ,kBACH;AAAA,MACC;AAAA,OACH,IACE;AAAA,IACH,kBAAkB,gBACjB,oBAAC,SAAI,WAAU,QACb;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,YAAY,UAAU,aAAa;AAAA;AAAA,IACrC,GACF,IACE;AAAA,IACJ,oBAAC,QAAG,WAAU,8CAA8C,gBAAK;AAAA,IAChE,cAAc,oBAAC,kBAAe,MAAM,aAAa,WAAU,QAAO,IAAK;AAAA,KAC1E;AAEJ;AAQO,SAAS,cAAc,EAAE,cAAc,WAAW,OAAO,GAAuB;AACrF,MAAI,CAAC,gBAAgB,CAAC,OAAQ,QAAO;AACrC,SACE,qBAAC,SAAI,WAAU,+EACZ;AAAA,aAAS,oBAAC,eAAY,QAAgB,MAAK,MAAK,WAAS,MAAC,IAAK;AAAA,IAC/D,gBAAgB,YACf,qBAAC,SAAI,WAAU,6BACb;AAAA,0BAAC,UAAK,mBAAK;AAAA,MACX,oBAAC,QAAK,MAAM,WAAW,WAAU,oDAC/B,8BAAC,kBAAe,SAAS,cAAc,GACzC;AAAA,OACF,IACE;AAAA,KACN;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/asset-top-sections.tsx"],"sourcesContent":["\"use client\";\n\nimport Link from \"./link.js\";\nimport { useEffect, useState } from \"react\";\nimport { useIntersectionActive } from \"../utils/use-intersection-active.js\";\nimport { cn } from \"../utils/cn.js\";\nimport { AddressDisplay } from \"./address-display.js\";\nimport { ParentAttributionBanner } from \"./parent-attribution-banner.js\";\nimport { IpTypeBadge } from \"./ip-type-badge.js\";\nimport { ExpandableText } from \"./expandable-text.js\";\n\ninterface AssetMediaColumnProps {\n image: string | null;\n imageAlt: string;\n imgError: boolean;\n onImageError: () => void;\n onImageLoad?: () => void;\n fallback: React.ReactNode;\n\n\n animationUrl?: string | null;\n\n live?: boolean;\n}\n\nexport function AssetMediaColumn({\n image,\n imageAlt,\n imgError,\n onImageError,\n onImageLoad,\n fallback,\n animationUrl,\n live = false,\n}: AssetMediaColumnProps) {\n const [ref, isVisible] = useIntersectionActive<HTMLDivElement>();\n const [loaded, setLoaded] = useState(false);\n useEffect(() => setLoaded(false), [image]);\n const showLive = live && !!animationUrl && isVisible;\n\n const markLoaded = () => {\n setLoaded(true);\n onImageLoad?.();\n };\n\n const shimmer = !loaded && (\n <div\n className=\"absolute inset-0 animate-[shimmer_1.6s_ease-in-out_infinite] bg-foreground/[0.06]\"\n style={{\n backgroundImage:\n \"linear-gradient(90deg, transparent, color-mix(in srgb, var(--foreground) 8%, transparent), transparent)\",\n backgroundSize: \"200% 100%\",\n }}\n />\n );\n\n return (\n <div ref={ref} className=\"w-full lg:sticky lg:top-16\">\n {showLive ? (\n <div className=\"w-full overflow-hidden rounded-3xl aspect-square\">\n <iframe\n src={animationUrl!}\n title={imageAlt}\n sandbox=\"allow-scripts\"\n loading=\"lazy\"\n className=\"w-full h-full border-0\"\n />\n </div>\n ) : !image || imgError ? (\n <div className=\"w-full overflow-hidden rounded-3xl\">{fallback}</div>\n ) : (\n <div className={cn(\"relative block w-full overflow-hidden rounded-3xl\", !loaded && \"aspect-square\")}>\n {shimmer}\n <img\n ref={(el) => {\n if (!loaded && el?.complete && el.naturalWidth > 0) markLoaded();\n }}\n src={image}\n alt={imageAlt}\n fetchPriority=\"high\"\n decoding=\"async\"\n onLoad={markLoaded}\n onError={onImageError}\n className=\"relative w-full h-auto max-h-[80vh] object-contain\"\n />\n </div>\n )}\n\n </div>\n );\n}\n\ninterface AssetHeaderBlockProps {\n name: string;\n badges?: React.ReactNode;\n utilities?: React.ReactNode;\n description?: string | null;\n parentContract?: string | null;\n parentTokenId?: string | null;\n}\n\nexport function AssetHeaderBlock({\n name,\n badges,\n utilities,\n description,\n parentContract,\n parentTokenId,\n}: AssetHeaderBlockProps) {\n return (\n <div className=\"min-w-0 flex-1\">\n {badges || utilities ? (\n <div className=\"flex items-center justify-between gap-2 mb-2\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n {badges}\n </div>\n {utilities}\n </div>\n ) : null}\n {parentContract && parentTokenId ? (\n <div className=\"mb-3\">\n <ParentAttributionBanner\n parentContract={parentContract}\n parentTokenId={parentTokenId}\n parentName={`Token #${parentTokenId}`}\n />\n </div>\n ) : null}\n <h1 className=\"text-2xl lg:text-4xl font-bold break-words\">{name}</h1>\n {description ? <ExpandableText text={description} className=\"mt-1\" /> : null}\n </div>\n );\n}\n\nexport interface AssetOwnerRowProps {\n ownerAddress?: string | null;\n ownerHref?: string;\n ipType?: string | null;\n}\n\nexport function AssetOwnerRow({ ownerAddress, ownerHref, ipType }: AssetOwnerRowProps) {\n if (!ownerAddress && !ipType) return null;\n return (\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-1.5 text-xs text-muted-foreground\">\n {ipType ? <IpTypeBadge ipType={ipType} size=\"md\" showLabel /> : null}\n {ownerAddress && ownerHref ? (\n <div className=\"flex items-center gap-1.5\">\n <span>Owner</span>\n <Link href={ownerHref} className=\"hover:text-primary transition-colors font-medium\">\n <AddressDisplay address={ownerAddress} />\n </Link>\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":";AA8CI,cAyBI,YAzBJ;AA5CJ,OAAO,UAAU;AACjB,SAAS,WAAW,gBAAgB;AACpC,SAAS,6BAA6B;AACtC,SAAS,UAAU;AACnB,SAAS,sBAAsB;AAC/B,SAAS,+BAA+B;AACxC,SAAS,mBAAmB;AAC5B,SAAS,sBAAsB;AAgBxB,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AACT,GAA0B;AACxB,QAAM,CAAC,KAAK,SAAS,IAAI,sBAAsC;AAC/D,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,YAAU,MAAM,UAAU,KAAK,GAAG,CAAC,KAAK,CAAC;AACzC,QAAM,WAAW,QAAQ,CAAC,CAAC,gBAAgB;AAE3C,QAAM,aAAa,MAAM;AACvB,cAAU,IAAI;AACd,kBAAc;AAAA,EAChB;AAEA,QAAM,UAAU,CAAC,UACf;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO;AAAA,QACL,iBACE;AAAA,QACF,gBAAgB;AAAA,MAClB;AAAA;AAAA,EACF;AAGF,SACE,oBAAC,SAAI,KAAU,WAAU,8BACtB,qBACC,oBAAC,SAAI,WAAU,oDACb;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,OAAO;AAAA,MACP,SAAQ;AAAA,MACR,SAAQ;AAAA,MACR,WAAU;AAAA;AAAA,EACZ,GACF,IACE,CAAC,SAAS,WACZ,oBAAC,SAAI,WAAU,sCAAsC,oBAAS,IAE9D,qBAAC,SAAI,WAAW,GAAG,qDAAqD,CAAC,UAAU,eAAe,GAC/F;AAAA;AAAA,IACD;AAAA,MAAC;AAAA;AAAA,QACC,KAAK,CAAC,OAAO;AACX,cAAI,CAAC,UAAU,IAAI,YAAY,GAAG,eAAe,EAAG,YAAW;AAAA,QACjE;AAAA,QACA,KAAK;AAAA,QACL,KAAK;AAAA,QACL,eAAc;AAAA,QACd,UAAS;AAAA,QACT,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,WAAU;AAAA;AAAA,IACZ;AAAA,KACF,GAGJ;AAEJ;AAWO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA0B;AACxB,SACE,qBAAC,SAAI,WAAU,kBACZ;AAAA,cAAU,YACT,qBAAC,SAAI,WAAU,gDACb;AAAA,0BAAC,SAAI,WAAU,qCACZ,kBACH;AAAA,MACC;AAAA,OACH,IACE;AAAA,IACH,kBAAkB,gBACjB,oBAAC,SAAI,WAAU,QACb;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,YAAY,UAAU,aAAa;AAAA;AAAA,IACrC,GACF,IACE;AAAA,IACJ,oBAAC,QAAG,WAAU,8CAA8C,gBAAK;AAAA,IAChE,cAAc,oBAAC,kBAAe,MAAM,aAAa,WAAU,QAAO,IAAK;AAAA,KAC1E;AAEJ;AAQO,SAAS,cAAc,EAAE,cAAc,WAAW,OAAO,GAAuB;AACrF,MAAI,CAAC,gBAAgB,CAAC,OAAQ,QAAO;AACrC,SACE,qBAAC,SAAI,WAAU,+EACZ;AAAA,aAAS,oBAAC,eAAY,QAAgB,MAAK,MAAK,WAAS,MAAC,IAAK;AAAA,IAC/D,gBAAgB,YACf,qBAAC,SAAI,WAAU,6BACb;AAAA,0BAAC,UAAK,mBAAK;AAAA,MACX,oBAAC,QAAK,MAAM,WAAW,WAAU,oDAC/B,8BAAC,kBAAe,SAAS,cAAc,GACzC;AAAA,OACF,IACE;AAAA,KACN;AAEJ;","names":[]}
@@ -3,8 +3,8 @@ import * as React from 'react';
3
3
  import { VariantProps } from 'class-variance-authority';
4
4
 
5
5
  declare const buttonVariants: (props?: ({
6
- variant?: "default" | "link" | "destructive" | "outline" | "secondary" | "ghost" | "premium" | "tonal" | "gradient-border" | "gradient-fill" | null | undefined;
7
- size?: "default" | "icon" | "sm" | "lg" | null | undefined;
6
+ variant?: "ghost" | "link" | "default" | "destructive" | "outline" | "secondary" | "premium" | "tonal" | "gradient-border" | "gradient-fill" | null | undefined;
7
+ size?: "icon" | "default" | "sm" | "lg" | null | undefined;
8
8
  } & class_variance_authority_types.ClassProp) | undefined) => string;
9
9
  interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
10
10
  asChild?: boolean;
@@ -3,8 +3,8 @@ import * as React from 'react';
3
3
  import { VariantProps } from 'class-variance-authority';
4
4
 
5
5
  declare const buttonVariants: (props?: ({
6
- variant?: "default" | "link" | "destructive" | "outline" | "secondary" | "ghost" | "premium" | "tonal" | "gradient-border" | "gradient-fill" | null | undefined;
7
- size?: "default" | "icon" | "sm" | "lg" | null | undefined;
6
+ variant?: "ghost" | "link" | "default" | "destructive" | "outline" | "secondary" | "premium" | "tonal" | "gradient-border" | "gradient-fill" | null | undefined;
7
+ size?: "icon" | "default" | "sm" | "lg" | null | undefined;
8
8
  } & class_variance_authority_types.ClassProp) | undefined) => string;
9
9
  interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
10
10
  asChild?: boolean;