@liberfi.io/ui-predict 0.1.121 → 0.1.122
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/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +15 -15
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/version.ts","../src/components/categories/categories.script.ts","../src/components/categories/categories.ui.tsx","../src/components/categories/categories.widget.tsx","../src/utils/predict-market-adapter.ts","../src/consts/index.ts","../src/providers/PredictWalletProvider.tsx","../src/components/trade-form/trade-form.script.ts","../src/components/kyc-modal/kyc-modal.ui.tsx","../src/components/trade-form/trade-form.ui.tsx","../src/components/trade-form/trade-form.widget.tsx","../src/components/trade-form/trade-form.modal.tsx","../src/components/events/events-filter.ui.tsx","../src/components/events/events-hero.ui.tsx","../src/components/events/events-toolbar.ui.tsx","../src/components/events/events.script.ts","../src/components/events/events.skeleton.tsx","../src/components/events/event-item.ui.tsx","../src/components/events/events.ui.tsx","../src/components/events/events.widget.tsx","../src/components/events/events.page.tsx","../src/components/event-detail/event-detail-activity.ui.tsx","../src/components/event-detail/event-detail-skeleton.tsx","../src/components/event-detail/event-market-depth-chart.ui.tsx","../src/components/event-detail/event-market-detail.widget.tsx","../src/components/event-detail/event-price-chart.ui.tsx","../src/components/event-detail/event-detail.ui.tsx","../src/components/event-detail/event-detail.widget.tsx","../src/components/matches/source-badge.ui.tsx","../src/components/event-detail/event-similar-events.ui.tsx","../src/components/event-detail/event-detail.page.tsx","../src/components/event-detail/event-detail.scripts.ts","../src/components/search/search-history.script.ts","../src/components/search/search-history.ui.tsx","../src/components/search/search-history.widget.tsx","../src/components/search/search-input.ui.tsx","../src/components/search/search-result-item.ui.tsx","../src/components/search/search-result-list.script.ts","../src/components/search/search-result-list.widget.tsx","../src/components/search/search.script.ts","../src/components/search/search.widget.tsx","../src/components/search/search.modal.tsx","../src/components/search/search-events-button.tsx","../src/components/matches/matches-filter-bar.ui.tsx","../src/components/matches/matches-hero.ui.tsx","../src/components/matches/match-market-card.ui.tsx","../src/components/matches/matches.widget.tsx","../src/components/matches/matches.page.tsx","../src/components/matches/match-group-card.ui.tsx","../src/components/matches/matches-stats-bar.ui.tsx","../src/components/matches/spread-indicator.ui.tsx","../src/components/profile/profile-history.ui.tsx","../src/components/profile/profile-orders.ui.tsx","../src/components/profile/profile-positions.ui.tsx","../src/components/profile/profile-stats.ui.tsx","../src/components/profile/profile.page.tsx","../src/components/setup-modal/setup-modal.ui.tsx"],"names":["version_default","RAW_TAGS_BY_CATEGORIES","CATEGORY_ORDER","STATIC_CATEGORIES","orderIndex","cat","idx","label","rawTags","t","a","b","CategoriesUI","categories","selectedCategory","selectedTag","activeTags","onCategorySelect","onTagSelect","trailing","pulsingTab","className","useTranslation","handleSelectAll","useCallback","trendingLabel","jsxs","cn","jsx","Tab","TabSeparator","Chip","tag","isSelected","onPress","badge","showPulse","icon","CategoriesSkeleton","count","_","i","Skeleton","toUICategories","items","c","toUITags","CategoriesWidget","onSelect","selectedCategorySlug","setSelectedCategorySlug","useState","selectedTagSlug","setSelectedTagSlug","handleCategorySelect","categoryLabel","handleTagSelect","tagLabel","uiCategories","activeCat","predictEventToStandard","event","predictMarketToStandard","market","yes","no","DEFAULT_PAGE_SIZE","MAX_PRICE_HISTORY_MARKETS","CandlestickPeriod","ChartRange","DEFAULT_CHART_RANGE","CHART_RANGE_PERIOD","CHART_RANGE_SAMPLE_INTERVAL","CHART_RANGE_DURATION","ORDER_MIN_QUANTITY","ORDER_MIN_USDC","ORDER_PRICE_STEP","ORDER_MIN_PRICE","ORDER_MAX_PRICE","PriceHistoryInterval","DEFAULT_PRICE_HISTORY_INTERVAL","PRICE_HISTORY_SAMPLE_INTERVAL","PredictWalletContext","createContext","usePredictWallet","ctx","useContext","DEFAULT_POLLING_INTERVAL","PredictWalletProvider","pollingInterval","enabled","children","wallets","useWallets","solanaAddress","useMemo","w","ChainNamespace","evmAddress","kalshiBalanceData","kalshiBalanceLoading","kalshiBalanceFetching","kalshiBalanceError","useBalance","kalshiKycData","kalshiKycLoading","useDFlowKYC","polySetupData","polySetupLoading","usePolymarketSetup","polymarketSafeAddress","polymarketSetupVerified","polymarketBalanceData","polymarketBalanceLoading","polymarketBalanceFetching","polymarketBalanceError","value","DURATION_UNIT_SECONDS","resolveExpiration","preset","customDuration","customDurationUnit","now","end","fireCelebration","defaults","confetti","useTradeForm","initialOutcome","initialSide","authStatus","useAuth","switchChain","useSwitchChain","predictClient","usePredictClient","polymarketCtx","PolymarketContext","queryClient","useQueryClient","source","supportsLimitOrder","solanaWallet","evmWallet","isAuthenticated","userPublicKey","clobTokenId","raw","tickSizeData","useTickSize","tickSize","outcome","setOutcomeRaw","side","setSideRaw","orderType","setOrderTypeRaw","quantity","setQuantityRaw","limitPrice","setLimitPriceRaw","isSubmitting","setIsSubmitting","pendingSignature","setPendingSignature","pendingSellCashConvert","setPendingSellCashConvert","kycRequired","setKycRequired","expirationEnabled","setExpirationEnabled","expirationPreset","setExpirationPreset","setCustomDuration","setCustomDurationUnit","contextBalance","contextKycVerified","contextKycUrl","contextSafeAddress","pricePerShare","o","setOrderType","type","setOutcome","useEffect","shares","amountStr","yesMint","noMint","usdcMint","SOLANA_TOKENS","collateralMint","marketOutcomeMint","positionUser","positionsData","positionsLoading","usePositions","positionMarketMeta","p","effectiveOutcomeMint","effectiveCollateral","inputMint","outputMint","quoteEnabled","refetchQuote","useDFlowQuote","usdcBalance","sum","isBalanceLoading","yesTokenBalance","noTokenBalance","effectivePrice","estimatedCost","bidPrice","potentialPayout","potentialProfit","setSide","s","setQuantity","v","clamped","rounded","setLimitPrice","resetForm","validation","errors","holdingBalance","submitDFlow","useDFlowSubmit","orderStatus","useOrder","convertCashToUsdc","cashAmount","collateral","cashTx","txBytes","signedTxBytes","status","toast","submitDFlowOrder","quoteRecord","transaction","outAmount","result","submitPolymarketOrder","previousChain","needsSwitch","Chain","provider","usesSafe","signer","domain","types","primaryType","domainFields","fullTypes","creds","tokenIdx","tokenId","rawClobTokenIds","negRisk","price","polyOrderType","sizeInShares","input","buildCtfExchangeDomain","orderMessage","buildOrderMessage","signature","CTF_ORDER_TYPES","signedOrder","buildSignedOrder","clobPayload","buildClobPayload","body","headers","buildPolymarketL2Headers","submit","err","detail","KycModal","isOpen","onClose","kycUrl","StyledModal","open","ModalContent","key","USDC_LOGO","EXPIRATION_PRESETS","EXPIRATION_PRESET_I18N","DURATION_UNITS","DURATION_UNIT_I18N","TradeFormUI","variant","isValid","validationErrors","onOutcomeChange","onSideChange","onOrderTypeChange","onQuantityChange","onLimitPriceChange","onExpirationEnabledChange","onExpirationPresetChange","onCustomDurationChange","onCustomDurationUnitChange","onSubmit","showOdds","setShowOdds","kycModal","useDisclosure","quantityText","setQuantityText","quantityFocusedRef","useRef","prevSideRef","handleQuantityInput","val","setShowErrors","parsed","currentPriceCents","hasAmount","submitLabel","sideLabel","outcomeLabel","winAmount","submitColor","handleHalf","handleMax","showErrors","handleSubmitPress","Fragment","e","Tabs","StyledNumberInput","StyledInput","pct","StyledSwitch","Select","keys","SelectItem","u","ChevronDownIcon","Button","Spinner","TradeFormWidget","chain","authenticatedSubmit","useAuthCallback","adaptedEvent","adaptedMarket","PREDICT_TRADE_MODAL_ID","PredictTradeModal","id","AsyncModal","modalProps","PredictTradeModalContent","params","onOpenChange","isMobile","useScreen","DEFAULT_FILTER_STATE","countActiveFilters","state","EventsFilterUI","onChange","draft","setDraft","handleOpenChange","handleReset","handleApply","updateDraft","prev","activeCount","platformOptions","timeRemainingOptions","volumeOptions","liquidityOptions","CloseButton","FilterSection","FilterChipGroup","onClick","options","selected","allowDeselect","opt","isActive","formatCompact","STAT_CARDS","EventsHero","stats","line","card","SORT_PRESETS","SORT_LABEL_KEYS","SORT_ORDER","btnBase","dropdownBase","EventsToolbarUI","sortPreset","onSortChange","sortAsc","onSortAscChange","onFilterPress","filterCount","setIsOpen","dropdownRef","handleClickOutside","onEscape","ActiveIcon","SORT_ICONS","SortIcon","ChevronDown","Icon","FilterBarIcon","CalendarIcon","ChartLineIcon","DropletIcon","TimerIcon","useEventsInfinite","baseParams","resolveEventsParams","infiniteData","isLoading","isFetching","isFetchingMore","isError","error","hasMore","fetchNextPage","refetch","usePredictInfiniteEvents","data","page","item","fetchMore","refetchAll","SHIMMER_CSS","shimmer","shimmerDelay","delay","EventsSkeleton","SkeletonCard","index","titleWidth","j","HeroSkeleton","CategoriesToolbarSkeleton","EventsPageSkeleton","MAX_DISPLAYED_OUTCOMES","SOURCE_GLOW","GLOW_FALLBACK","C_PRIMARY","C_SECONDARY","C_RED","TEAM_PALETTE","hashString","hash","getOutcomeColors","labels","l","label0","label1","idx0","idx1","getYesAsk","getYesPercent","formatPercent","getYesCents","getNoCents","yesPrice","formatCountdown","isoDate","diff","d","h","m","parts","injectedCSS","EventItem","href","LinkComponent","onSelectOutcome","onHover","expandedSlug","setExpandedSlug","rawMarkets","openMarkets","singleMarket","displayedMarkets","moreCount","formattedVolume","expandedMarket","isExpanded","handleCardClick","handleHeaderClick","handleShowMore","footerContent","SingleMarketFooter","ExpandedMarketFooter","MarketListFooter","el","glowColor","CardHeader","SingleMarketBody","ExpandedMarketBody","MarketListBody","CardFooter","countdown","Linkable","Avatar","EventIndicators","getEventBadges","badges","isCrypto","isLive","remaining","fiveMin","fifteenMin","cryptoColor","LiveBadge","CryptoCountdownBadge","ClosedBadge","color","onMarketClick","YesNoPill","onShowMore","ChevronRightIcon","SourceIcon","ElevatedButton","bgColor","textColor","shadowColor","OutcomeButtons","dynamicColors","labelFormat","c0","c1","effectiveFormat","yesLabel","noLabel","onCollapse","ChevronUpIcon","ChevronLeftIcon","PolymarketIcon","KalshiIcon","GLOW_INSET","EventsUI","events","onFetchMore","getEventHref","sentinelRef","observer","entries","handleScrollToTop","showEndOfList","EndOfListRow","onScrollToTop","EventsWidget","tagSlugSelection","limit","sort_by","sort_asc","with_markets","timeRemaining","minVolume","minLiquidity","EventsPage","bgImageSrc","setTagSlugSelection","filterState","setFilterState","useEventStats","isFilterOpen","openFilter","closeFilter","openTradeModal","useAsyncModal","handleSelectOutcome","selection","handleSortChange","handleSortAscChange","asc","handleFilterChange","sortBy","toolbar","ROW_HEIGHT","HEADER_HEIGHT","CONTENT_HEIGHT","LIST_HEIGHT","UserActivitySection","walletAddress","onCancelOrder","activeTab","setActiveTab","marketSlugs","positionsCount","tabs","tab","PositionsTab","OrdersTab","TradesTab","positions","TabSkeleton","EmptyState","List","PositionVirtualRow","style","closeLabel","position","pnl","pnlPercent","avgPrice","currentPrice","pnlColor","pnlSign","marketLabel","payoutIfRight","settlementStr","formatSettlementTime","formatPrice","hasNextPage","useInfiniteOrders","cancelMutation","useCancelOrder","orders","allItems","openStatuses","filtered","handleCancel","order","itemCount","rowCount","isRowLoaded","loadMoreRows","onRowsRendered","useInfiniteLoader","OrderVirtualRow","onCancel","isCancelling","cancelLabel","isBuy","OrderStatusBadge","useInfiniteTrades","trades","TradeVirtualRow","trade","timeStr","formatTimestamp","usdSize","message","cents","unixSeconds","date","month","day","hours","mins","isoString","EventDetailSkeleton","marketCount","showBack","TradeFormSkeleton","BID_COLOR","ASK_COLOR","formatKMB","n","abs","heightPow","cumulative","maxCumulative","buildDepthData","bids","asks","rawBidQty","rawAskQty","bid","slot","ask","cumBid","cumBidCost","bidTotal","bidCumCostArr","cumAsk","cumAskCost","askTotal","askCumCostArr","isBid","isAsk","hasOrder","DepthTooltipPanel","info","left","right","DepthColumn","memo","onEnter","onLeave","barRef","isVisible","X_TICKS","DepthXAxis","tick","EventMarketDepthChartUI","midPrice","bestBid","bestAsk","hasData","tooltip","setTooltip","activeBarRef","handleColumnEnter","barEl","handleColumnLeave","formatPriceCents","OrderbookSkeleton","EventMarketDetailWidget","onTradeAction","viewMode","setViewMode","isNo","orderbook","isOrderbookLoading","useOrderbook","spread","OrderbookTableIcon","OrderbookDepthIcon","EventOrderbookTableUI","MAX_ROWS_PER_SIDE","sortedAsks","sortedBids","maxQty","all","r","OrderbookRow","depthPct","bgClass","priceClass","formattedContracts","dollarValue","formattedTotal","ChartErrorBoundary","Component","MAX_SELECTED","CHART_COLORS","ms","range","formatTooltipTimestamp","INTERVAL_OPTIONS","IntervalSwitcher","useCursorOverlay","wrapperRef","overlayRef","onMouseMove","wrapper","overlay","rect","xPct","onMouseLeave","CustomTooltip","active","payload","labelMap","allSeries","payloadMap","MarketSelector","markets","selectedSlugs","colorMap","onToggle","setOpen","rootRef","handleClick","atMax","triggerContent","slug","mk","isDisabled","isOnlyOne","yesOutcome","LegendBar","series","displayValues","medianOfSorted","sorted","mid","downsampleSeries","maxPoints","step","start","bucket","buildChartData","maxPointsPerSeries","sampledSeries","allTimestamps","lookups","lastValues","ts","row","map","last","EventPriceChart","props","EventPriceChartInner","externalLoading","volume","allMarkets","seen","sortedMarkets","priceOf","setSelectedSlugs","chartRange","setChartRange","selectedMarkets","hookSeries","hookLoading","useMarketHistory","dayMs","chartData","yDomain","min","max","pad","currentValues","tooltipSeries","chartWrapperRef","overlayDivRef","handleWrapperMouseMove","handleWrapperMouseLeave","handleToggle","hoveredValues","setHoveredValues","hoveredValuesRef","lastPayloadKeyRef","rafIdRef","showChart","ResponsiveContainer","LineChart","CartesianGrid","XAxis","YAxis","Tooltip","Line","lastRow","yVal","ReferenceDot","dx","dy","formatCents","getMarketLabel","getPlatformLabel","formatISOTimestamp","iso","year","minutes","useCountdown","targetIso","setNow","target","days","secs","formatCountdownDate","offset","sign","tzHours","EventDetailUI","collapseRef","isCollapsed","useScrollCollapse","rest","isEnded","startCountdown","endCountdown","startDateFormatted","endDateFormatted","EventMarketsUI","EventRulesUI","DEFAULT_VISIBLE_COUNT","showAll","setShowAll","firstOpenSlug","activeKey","setActiveKey","visibleMarkets","toggleExpand","handleTradeAction","noPrice","MarketRow","activeYes","activeNo","onToggleExpand","volumeFormatted","showFullRules","setShowFullRules","showTimeline","setShowTimeline","selectedIdx","setSelectedIdx","marketsWithContent","selectedMarket","rulesText","truncatedRules","Dropdown","DropdownTrigger","DropdownMenu","DropdownItem","arr","EventDetailWidget","eventSlug","isEventLoading","eventError","useEvent","SOURCE_META","DEFAULT_META","getSourceMeta","SourceBadge","meta","REST_BORDER","HOVER_BORDER","formatVolume","vol","SimilarEventsSection","onEventClick","onEventHover","similarEvents","useSimilarEvents","ev","SimilarEventCard","sourceMeta","firstTag","EventDetailPage","onSimilarEventClick","onSimilarEventHover","onBack","tradeSelection","setTradeSelection","hasBack","tradeFormKey","listCandlesticksParamsForRange","useEventDetail","candlestickMarketSlugs","client","candlestickParams","marketsToQuery","dedupedMarkets","candlestickQueries","useQueries","candlesticksQueryKey","isCandlesticksLoading","q","candlestickErrors","candlesticks","MAX_HISTORY_SIZE","searchHistoriesAtom","atomWithStorage","usePredictSearchHistory","histories","setHistories","useAtom","addHistory","keyword","trimmed","clearHistories","SearchHistoryUI","onClear","TrashIcon","SearchHistoryWidget","SearchInputUI","onValueChange","SearchIcon","XCloseIcon","Kbd","SearchResultItemUI","useSearchResultListScript","isFetchingNextPage","useSearchEvents","SearchResultListWidget","scriptParams","ref","height","useResizeObserver","isItemLoaded","loadMoreItems","onRowsLoaded","LoadingState","SearchResultRow","EmptyIcon","useSearchScript","onKeywordChange","text","setText","setKeyword","onKeywordChangeStable","useCallbackRef","addHistoryStable","debouncedSearch","debounce","setText_","setKeyword_","clearKeyword","SearchWidget","onSelectEvent","PREDICT_SEARCH_MODAL_ID","PredictSearchModal","PredictSearchModalContent","onResult","handleSelectEvent","handleEscape","ModalHeader","ModalBody","SearchEventsButton","modalParams","isDesktop","onOpen","onSelectEventStable","handleOpen","handleClose","handleKeyDown","activeElement","isInEditableElement","SORT_OPTIONS","VOLUME_PRESETS","getVolumeLabel","MatchesFilterBar","onMinVolumeChange","onRefresh","sortOpen","setSortOpen","volumeOpen","setVolumeOpen","tooltipVisible","setTooltipVisible","spinning","setSpinning","sortRef","volumeRef","currentSort","handleRefresh","SortOptionIcon","FilterIcon","InfoIcon","shared","onMouseEnter","MatchesHero","getYesPrice","getOutcomeName","getSpreadTier","spreadPercent","SPREAD_THEME","SPREAD_GLOW","CONFIDENCE_THEME","getConfidenceTierKey","tier","score","SpreadGauge","theme","filled","PLATFORM_COLORS","DEFAULT_PLATFORM","getPlatformColor","FOCUS_CSS","MatchMarketCard","match","getMarketHref","priceA","priceB","cheaperSource","title","confKey","confTheme","ctaAccent","glow","PlatformRow","isCheaper","platColor","outcomeName","content","MatchesWidget","forwardRef","onStatsChange","isPlaceholderData","useInfiniteMatchMarkets","keepPreviousData","animKey","setAnimKey","prevIsPlaceholder","setPrevIsPlaceholder","k","useImperativeHandle","allMatches","total","maxSpread","totalVolume","highSpreadCount","MatchesSkeletonList","itemIndex","MatchesEndOfList","SORT_TITLE_KEY","StatusClock","time","setTime","fmt","MatchesStatusBar","MatchesPage","setSortBy","setSortAsc","setMinVolume","heroStats","setHeroStats","widgetRef","sort","handleStatsChange","startTransition","DEFAULT_PLATFORM_COLORS","getPlatformColors","getBestMarketPair","group","best","bestSpread","extractPlatformData","pair","entryA","entryB","getOutcome","oA","oB","MatchGroupCard","onSelectEntry","bestPair","platA","platB","isHighSpread","cheapest","cheapestMeta","PlatformBlock","colors","MatchesStatsBar","matches","sources","entry","StatItem","Separator","valueClassName","getSpreadColor","SpreadIndicator","arbProfit","hasArb","PAGE_SIZE","PAGINATION_HEIGHT","ProfileHistory","listHeight","currentPage","setCurrentPage","kalshiData","kalshiLoading","fetchNextKalshi","hasMoreKalshi","isFetchingKalshi","polyData","polyLoading","fetchNextPoly","hasMorePoly","isFetchingPoly","allTrades","totalPages","pageStart","pageTrades","handlePrev","handleNext","canGoPrev","canGoNext","contentHeight","HistoryRowStatic","HistoryCard","statusLabel","mapTradeStatus","isDeposit","depositSign","depositColor","eventTitle","eventImage","txUrl","getTxUrl","pnlValue","extractPnl","feeValue","extractFee","ExternalLinkIcon","fee","tz","tzSign","ProfileOrders","pageOrders","OrderRowStatic","Pagination","OrderCard","cost","onPrev","onNext","onPage","compact","ProfilePositions","onClosePosition","handleCloseAll","pos","pagePositions","PositionRowStatic","PositionCard","outcomeSide","MobileStat","ProfileStats","realizedPnl","positionsValue","wins","settled","tr","winRateStr","StatCard","ProfilePage","hasWallet","kalshiPositions","kalshiPosLoading","polyPositions","polyPosLoading","allPositions","kalshiTrades","kalshiTradesLoading","polyTrades","polyTradesLoading","statsLoading","SetupModal","safeDeployed","tokenApproved","onDeployAndApprove","setupRunning","setSetupRunning","setupError","setSetupError","optimisticDone","setOptimisticDone","effectiveSafeDeployed","effectiveTokenApproved","step1Status","step2Status","allDone","handleSetup","steps","handleAction","actionLabel","StepIndicator"],"mappings":"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","file":"index.js","sourcesContent":["declare global {\n interface Window {\n __LIBERFI_VERSION__?: {\n [key: string]: string;\n };\n }\n}\nif (typeof window !== \"undefined\") {\n window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};\n window.__LIBERFI_VERSION__[\"@liberfi.io/ui-predict\"] = \"0.1.121\";\n}\n\nexport default \"0.1.121\";\n","// =============================================================================\n// Categories — static navigation data\n//\n// Static data source. Tags are hardcoded from:\n// GET https://dev-prediction-markets-api.dflow.net/api/v1/tags_by_categories\n//\n// Slug logic mirrors mapTag() in prediction-server/internal/strategy/dflow/mapper.go:\n// slug = label (the original label string is used as the slug verbatim)\n// =============================================================================\n\n// -----------------------------------------------------------------------------\n// Static data — sourced from DFlow API (2025-03-22)\n// -----------------------------------------------------------------------------\n\n/**\n * Raw API shape from GET /api/v1/tags_by_categories.\n * Category keys map to tag arrays (null when the category has no sub-tags).\n */\nconst RAW_TAGS_BY_CATEGORIES: Record<string, string[] | null> = {\n Weather: [\n \"Daily temperature\",\n \"Snow and rain\",\n \"Climate change\",\n \"Natural disasters\",\n \"Hurricanes\",\n ],\n Companies: [\n \"IPOs\",\n \"Product launches\",\n \"KPIs\",\n \"Elon Musk\",\n \"CEOs\",\n \"Layoffs\",\n ],\n Crypto: [\n \"BTC\",\n \"15 min\",\n \"Hourly\",\n \"ETH\",\n \"SOL\",\n \"DOGE\",\n \"Pre-Market\",\n \"XRP\",\n \"BNB\",\n \"HYPE\",\n ],\n Economics: [\n \"Growth\",\n \"Fed\",\n \"Inflation\",\n \"Oil and energy\",\n \"Employment\",\n \"Housing\",\n \"Jobs & Economy\",\n \"Bankruptcy & Defaults\",\n \"GDP\",\n \"Global Central Banks\",\n ],\n Elections: [\"Primaries\", \"International elections\"],\n Entertainment: [\n \"Music\",\n \"Movies\",\n \"Music charts\",\n \"Television\",\n \"Awards\",\n \"Video games\",\n \"Oscars\",\n \"Rotten Tomatoes\",\n ],\n Financials: [\n \"S&P\",\n \"Nasdaq\",\n \"Daily\",\n \"Metals\",\n \"Treasuries\",\n \"Oil\",\n \"EUR/USD\",\n \"USD/JPY\",\n \"WTI\",\n ],\n Mentions: [\"Politicians\", \"Earnings\", \"Entertainment\"],\n Politics: [\n \"Trump\",\n \"Congress\",\n \"International\",\n \"SCOTUS & courts\",\n \"Local\",\n \"Recurring\",\n \"Iran\",\n \"House\",\n ],\n Science: [\"AI\", \"Energy\", \"Space\"],\n Social: null,\n Sports: [\n \"Soccer\",\n \"Basketball\",\n \"Baseball\",\n \"Football\",\n \"Hockey\",\n \"Golf\",\n \"Tennis\",\n \"Motorsport\",\n \"Esports\",\n \"Boxing\",\n \"MMA\",\n \"Rugby\",\n \"Lacrosse\",\n \"Mentions\",\n \"Chess\",\n \"Cricket\",\n \"Aussie Rules\",\n \"Darts\",\n ],\n World: null,\n};\n\n// -----------------------------------------------------------------------------\n// Preferred display order (matches the DFlow category taxonomy)\n// -----------------------------------------------------------------------------\n\nconst CATEGORY_ORDER: string[] = [\n \"Politics\",\n \"Sports\",\n \"Crypto\",\n \"Economics\",\n \"Financials\",\n \"Elections\",\n \"Entertainment\",\n \"Companies\",\n \"Science and Technology\",\n \"Climate and Weather\",\n \"Mentions\",\n \"Social\",\n \"World\",\n];\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\n/**\n * A single category entry in the static navigation model.\n *\n * Slug logic: slug === label (verbatim), matching mapTag() in the prediction\n * server's DFlow strategy. Pass the slug directly to DFlow API filters.\n */\nexport interface CategoryListItem {\n /** Category slug — equals the label; use directly as DFlow `category` filter */\n slug: string;\n /** Display label */\n label: string;\n /** Tag entries for this category (empty array when the category has no sub-tags) */\n tags: CategoryTagItem[];\n}\n\n/** A single tag entry in the static navigation model */\nexport interface CategoryTagItem {\n /** Tag slug — equals the label; use directly as DFlow `tags` filter */\n slug: string;\n /** Display label */\n label: string;\n /** Optional Phosphor icon class name (e.g. \"ph--basketball-bold\") */\n icon?: string;\n}\n\n// -----------------------------------------------------------------------------\n// Derived static data\n// -----------------------------------------------------------------------------\n\n/**\n * Sorted category list derived from the static DFlow API snapshot.\n * Memoised at module level — computed once, never re-created.\n */\nexport const STATIC_CATEGORIES: CategoryListItem[] = (() => {\n const orderIndex = (cat: string): number => {\n const idx = CATEGORY_ORDER.indexOf(cat);\n return idx === -1 ? CATEGORY_ORDER.length : idx;\n };\n\n return Object.entries(RAW_TAGS_BY_CATEGORIES)\n .map(\n ([label, rawTags]): CategoryListItem => ({\n slug: label, // mapTag: slug = label\n label,\n tags: (rawTags ?? []).map(\n (t): CategoryTagItem => ({ slug: t, label: t }),\n ),\n }),\n )\n .sort((a, b) => orderIndex(a.slug) - orderIndex(b.slug));\n})();\n\n// -----------------------------------------------------------------------------\n// Selection type\n// -----------------------------------------------------------------------------\n\n/**\n * Selection emitted by CategoriesWidget.\n *\n * - `categorySlug = null, tagSlug = null` → \"Trending\" (no filter)\n * - `categorySlug = \"Politics\", tagSlug = null` → category selected, all its tags\n * - `categorySlug = \"Politics\", tagSlug = \"Trump\"` → specific tag selected\n */\nexport interface TagSlugSelection {\n /** Selected category slug (null = Trending / no filter) */\n categorySlug: string | null;\n /** Selected tag slug within the category (null = all tags in the category) */\n tagSlug: string | null;\n}\n","import { useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { cn, Skeleton } from \"@liberfi.io/ui\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\nexport interface CategoryItem {\n category: string;\n tags: string[];\n /** Optional badge text displayed above the tab (e.g. \"New\", \"Hot\") */\n badge?: string;\n}\n\nexport interface TagItem {\n label: string;\n /** Optional Phosphor icon class name (e.g. \"ph--basketball-bold\") */\n icon?: string;\n}\n\nexport interface CategoriesUIProps {\n /** List of categories to display */\n categories: CategoryItem[];\n /** Currently selected category name (null = \"Trending\") */\n selectedCategory: string | null;\n /** Currently selected tag within the category (null = all tags) */\n selectedTag: string | null;\n /** Tags of the currently selected category */\n activeTags: TagItem[];\n /** Callback when a category is selected (null = \"Trending\") */\n onCategorySelect: (category: string | null) => void;\n /** Callback when a tag is selected (null = deselect) */\n onTagSelect: (tag: string | null) => void;\n /** Content rendered at the end of the primary chip row (e.g. sort/filter controls) */\n trailing?: React.ReactNode;\n /** Name of the tab that shows a pulsing dot (default: \"Trending\") */\n pulsingTab?: string;\n /** Optional class name for the root element */\n className?: string;\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function CategoriesUI({\n categories,\n selectedCategory,\n selectedTag,\n activeTags,\n onCategorySelect,\n onTagSelect,\n trailing,\n pulsingTab = \"Trending\",\n className,\n}: CategoriesUIProps) {\n const { t } = useTranslation();\n\n const handleSelectAll = useCallback(() => {\n onCategorySelect(null);\n }, [onCategorySelect]);\n\n const trendingLabel = t(\"predict.categories.trending\");\n\n return (\n <div\n className={cn(\n \"sticky top-0 z-30 flex w-full flex-col justify-between gap-2 px-4 py-2.5 lg:px-4 lg:py-2\",\n className,\n )}\n >\n {/* Primary row: category tabs + trailing controls */}\n <div className=\"flex w-full items-center gap-2\">\n <div className=\"hideScrollbar min-w-0 flex-1 overflow-x-auto overflow-y-hidden\">\n <div className=\"flex min-h-9 items-stretch gap-x-3 lg:min-h-10\">\n {/* Trending tab */}\n <Tab\n label={trendingLabel}\n isSelected={selectedCategory === null}\n onPress={handleSelectAll}\n showPulse={trendingLabel === pulsingTab}\n />\n\n {/* Separator between Trending and categories */}\n <TabSeparator />\n\n {/* Category tabs */}\n {categories.map((cat) => (\n <Tab\n key={cat.category}\n label={cat.category}\n isSelected={selectedCategory === cat.category}\n onPress={() => onCategorySelect(cat.category)}\n badge={cat.badge}\n showPulse={cat.category === pulsingTab}\n />\n ))}\n </div>\n </div>\n {trailing && <div className=\"flex-shrink-0\">{trailing}</div>}\n </div>\n\n {/* Secondary: tag chips (visible when a category is selected) */}\n {selectedCategory && activeTags.length > 0 && (\n <div className=\"hideScrollbar overflow-x-auto overflow-y-hidden flex items-center\">\n <div className=\"flex gap-x-1.5 pl-1 lg:w-full lg:gap-x-2\">\n <Chip\n label={t(\"predict.categories.allMarkets\")}\n isSelected={selectedTag === null}\n onPress={() => onTagSelect(null)}\n />\n {activeTags.map((tag) => (\n <Chip\n key={tag.label}\n label={tag.label}\n icon={tag.icon}\n isSelected={selectedTag === tag.label}\n onPress={() => onTagSelect(tag.label)}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Tab — primary category navigation item\n// -----------------------------------------------------------------------------\n\ninterface TabProps {\n label: string;\n isSelected: boolean;\n onPress: () => void;\n badge?: string;\n showPulse?: boolean;\n}\n\nfunction Tab({ label, isSelected, onPress, badge, showPulse }: TabProps) {\n return (\n <button\n type=\"button\"\n onClick={onPress}\n className={cn(\n \"relative shrink-0 cursor-pointer whitespace-nowrap border-b px-2.5 py-1.5 text-sm font-medium capitalize transition-colors\",\n isSelected\n ? \"border-primary/50 text-primary\"\n : \"border-transparent text-neutral-500 hover:text-neutral-300\",\n )}\n >\n {showPulse ? (\n <span className=\"flex items-center gap-x-1.5\">\n <span className=\"h-2 w-2 animate-pulse rounded-full bg-[rgb(240,68,56)]\" />\n <span>{label}</span>\n </span>\n ) : (\n label\n )}\n\n {badge && (\n <span className=\"absolute -right-1 top-0 rounded bg-primary px-0.5 py-px text-[0.625rem] font-semibold leading-none text-neutral-950\">\n {badge}\n </span>\n )}\n </button>\n );\n}\n\n// -----------------------------------------------------------------------------\n// TabSeparator — vertical divider between tab groups\n// -----------------------------------------------------------------------------\n\nfunction TabSeparator() {\n return (\n <span className=\"flex items-center text-neutral-600\" aria-hidden=\"true\">\n |\n </span>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Chip — secondary tag chip (pixel-perfect Jupiter clone)\n// -----------------------------------------------------------------------------\n\ninterface ChipProps {\n label: string;\n icon?: string;\n isSelected: boolean;\n onPress: () => void;\n}\n\nfunction Chip({ label, icon, isSelected, onPress }: ChipProps) {\n return (\n <button\n type=\"button\"\n onClick={onPress}\n className={cn(\n \"flex shrink-0 items-center justify-center gap-x-1 min-w-14 rounded-2xl border px-3 py-1.5 text-sm font-medium uppercase transition-colors cursor-pointer\",\n isSelected\n ? \"border-primary/40 bg-primary/15 text-primary\"\n : \"border-border/80 text-neutral-500 hover:bg-primary/10 hover:text-primary\",\n )}\n >\n {icon && <span className={cn(\"iconify size-4\", icon)} />}\n {label}\n </button>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Skeleton\n// -----------------------------------------------------------------------------\n\nexport function CategoriesSkeleton({ count = 6 }: { count?: number }) {\n return (\n <div className=\"flex w-full flex-col gap-2 px-4 py-2.5 lg:px-4 lg:py-2\">\n <div className=\"flex min-h-9 items-center gap-x-3 lg:min-h-10\">\n {Array.from({ length: count }).map((_, i) => (\n <Skeleton key={i} className=\"h-6 w-16 shrink-0 rounded\" />\n ))}\n </div>\n </div>\n );\n}\n","// =============================================================================\n// CategoriesWidget\n//\n// Category / tag navigation backed by a static hardcoded snapshot (categories.script.ts).\n// Callbacks emit `TagSlugSelection` (categorySlug / tagSlug). Slug values follow the\n// DFlow mapTag() convention: slug === label verbatim.\n//\n// UI layer is shared with CategoriesUI / CategoriesSkeleton where available.\n// =============================================================================\nimport { useState, useCallback } from \"react\";\nimport {\n STATIC_CATEGORIES,\n type CategoryListItem,\n type TagSlugSelection,\n} from \"./categories.script\";\nimport { CategoriesUI, type CategoryItem, type TagItem } from \"./categories.ui\";\n\n// Re-export types so consumers can import from this single entry point.\nexport type { TagSlugSelection } from \"./categories.script\";\n\n// -----------------------------------------------------------------------------\n// Props\n// -----------------------------------------------------------------------------\n\nexport interface CategoriesWidgetProps {\n /**\n * Callback fired when the category / tag selection changes.\n *\n * Slug values follow the DFlow `mapTag()` convention (slug === label):\n * - `{ categorySlug: null, tagSlug: null }` → \"Trending\" (no filter)\n * - `{ categorySlug: \"Crypto\", tagSlug: null }` → category selected\n * - `{ categorySlug: \"Crypto\", tagSlug: \"BTC\" }` → specific tag selected\n */\n onSelect?: (selection: TagSlugSelection) => void;\n /** Content rendered at the end of the primary chip row (e.g. sort/filter controls) */\n trailing?: React.ReactNode;\n /** Optional class name applied to the root element */\n className?: string;\n}\n\n// -----------------------------------------------------------------------------\n// Adapter helpers\n// -----------------------------------------------------------------------------\n\n/** Convert CategoryListItem[] to the shape expected by CategoriesUI */\nfunction toUICategories(items: CategoryListItem[]): CategoryItem[] {\n return items.map((c) => ({\n category: c.label,\n tags: c.tags.map((t) => t.label),\n }));\n}\n\nfunction toUITags(cat: CategoryListItem | undefined): TagItem[] {\n if (!cat) return [];\n return cat.tags.map((t) => ({\n label: t.label,\n icon: t.icon,\n }));\n}\n\n// -----------------------------------------------------------------------------\n// Widget\n// -----------------------------------------------------------------------------\n\nexport function CategoriesWidget({\n onSelect,\n trailing,\n className,\n}: CategoriesWidgetProps) {\n const [selectedCategorySlug, setSelectedCategorySlug] = useState<\n string | null\n >(null);\n const [selectedTagSlug, setSelectedTagSlug] = useState<string | null>(null);\n\n // --- handlers ---\n\n const handleCategorySelect = useCallback(\n (categoryLabel: string | null) => {\n setSelectedCategorySlug(categoryLabel); // slug === label\n setSelectedTagSlug(null);\n\n onSelect?.({\n categorySlug: categoryLabel, // null → \"Trending\"\n tagSlug: null,\n });\n },\n [onSelect],\n );\n\n const handleTagSelect = useCallback(\n (tagLabel: string | null) => {\n setSelectedTagSlug(tagLabel); // slug === label\n\n onSelect?.({\n categorySlug: selectedCategorySlug,\n tagSlug: tagLabel,\n });\n },\n [selectedCategorySlug, onSelect],\n );\n\n // --- derive UI data ---\n\n const uiCategories = toUICategories(STATIC_CATEGORIES);\n\n const activeCat = STATIC_CATEGORIES.find(\n (c) => c.slug === selectedCategorySlug,\n );\n const activeTags = toUITags(activeCat);\n\n return (\n <CategoriesUI\n categories={uiCategories}\n selectedCategory={selectedCategorySlug}\n selectedTag={selectedTagSlug}\n activeTags={activeTags}\n onCategorySelect={handleCategorySelect}\n onTagSelect={handleTagSelect}\n trailing={trailing}\n className={className}\n />\n );\n}\n","import type { PredictEvent, PredictMarket } from \"@liberfi.io/react-predict\";\nimport type { StandardEvent, StandardMarket } from \"../types\";\n\nexport function predictEventToStandard(event: PredictEvent): StandardEvent {\n return {\n title: event.title,\n imageUrl: event.image_url,\n };\n}\n\nexport function predictMarketToStandard(market: PredictMarket): StandardMarket {\n const yes = market.outcomes[0];\n const no = market.outcomes[1];\n return {\n question: market.question,\n yesAsk: yes?.best_ask ?? yes?.price,\n noAsk: no?.best_ask ?? no?.price,\n yesBid: yes?.best_bid,\n noBid: no?.best_bid,\n yesSubTitle: yes?.label ?? \"Yes\",\n noSubTitle: no?.label ?? \"No\",\n };\n}\n","/** Default page size for list queries */\nexport const DEFAULT_PAGE_SIZE = 48;\n\n/** Maximum number of markets to display in price history chart */\nexport const MAX_PRICE_HISTORY_MARKETS = 4;\n\n/**\n * Candlestick period intervals in minutes (granularity for API queries)\n */\nexport const CandlestickPeriod = {\n /** 1 minute */\n ONE_MINUTE: 1,\n /** 1 hour (60 minutes) */\n ONE_HOUR: 60,\n /** 1 day (1440 minutes) */\n ONE_DAY: 1440,\n} as const;\n\nexport type CandlestickPeriodType =\n (typeof CandlestickPeriod)[keyof typeof CandlestickPeriod];\n\n/**\n * Chart range options (the user-facing time range selector)\n */\nexport const ChartRange = {\n /** 1 day */\n ONE_DAY: \"1d\",\n /** 1 week */\n ONE_WEEK: \"1w\",\n /** 1 month */\n ONE_MONTH: \"1m\",\n /** All time */\n ALL: \"all\",\n} as const;\n\nexport type ChartRangeType = (typeof ChartRange)[keyof typeof ChartRange];\n\n/** Default chart range */\nexport const DEFAULT_CHART_RANGE = ChartRange.ALL;\n\n/** Candlestick granularity derived from chart range (1D → minute, 1W/1M → hourly, ALL → daily) */\nexport const CHART_RANGE_PERIOD: Record<ChartRangeType, CandlestickPeriodType> =\n {\n [ChartRange.ONE_DAY]: CandlestickPeriod.ONE_MINUTE,\n [ChartRange.ONE_WEEK]: CandlestickPeriod.ONE_HOUR,\n [ChartRange.ONE_MONTH]: CandlestickPeriod.ONE_HOUR,\n [ChartRange.ALL]: CandlestickPeriod.ONE_DAY,\n };\n\n/** Chart sampling interval in seconds (used to downsample candlestick data for display) */\nexport const CHART_RANGE_SAMPLE_INTERVAL: Record<ChartRangeType, number> = {\n [ChartRange.ONE_DAY]: 5 * 60, // 5 minutes\n [ChartRange.ONE_WEEK]: 60 * 60, // 1 hour\n [ChartRange.ONE_MONTH]: 3 * 60 * 60, // 3 hours\n [ChartRange.ALL]: 24 * 60 * 60, // 1 day\n};\n\n/** Duration in seconds for each chart range (null = all time) */\nexport const CHART_RANGE_DURATION: Record<ChartRangeType, number | null> = {\n [ChartRange.ONE_DAY]: 24 * 60 * 60,\n [ChartRange.ONE_WEEK]: 7 * 24 * 60 * 60,\n [ChartRange.ONE_MONTH]: 30 * 24 * 60 * 60,\n [ChartRange.ALL]: null,\n};\n\n// -- Order-related constants -------------------------------------------------\n\n/** Minimum order quantity (contracts / shares for sell) */\nexport const ORDER_MIN_QUANTITY = 1;\n\n/** Minimum marketable BUY order in USDC (applies to Polymarket & Kalshi) */\nexport const ORDER_MIN_USDC = 1;\n\n/** Price step size in cents */\nexport const ORDER_PRICE_STEP = 1;\n\n/** Minimum price in cents */\nexport const ORDER_MIN_PRICE = 1;\n\n/** Maximum price in cents */\nexport const ORDER_MAX_PRICE = 99;\n\n// -- Legacy aliases for backward compatibility -------------------------------\n\n/** @deprecated Use ChartRange instead */\nexport const PriceHistoryInterval = {\n ONE_HOUR: \"1h\",\n SIX_HOURS: \"6h\",\n ONE_DAY: \"1d\",\n ONE_WEEK: \"1w\",\n MAX: \"max\",\n} as const;\n\n/** @deprecated Use ChartRangeType instead */\nexport type PriceHistoryIntervalType =\n (typeof PriceHistoryInterval)[keyof typeof PriceHistoryInterval];\n\n/** @deprecated Use DEFAULT_CHART_RANGE instead */\nexport const DEFAULT_PRICE_HISTORY_INTERVAL = PriceHistoryInterval.ONE_WEEK;\n\n/** @deprecated */\nexport const PRICE_HISTORY_SAMPLE_INTERVAL: Record<\n PriceHistoryIntervalType,\n number\n> = {\n [PriceHistoryInterval.ONE_HOUR]: 60,\n [PriceHistoryInterval.SIX_HOURS]: 60,\n [PriceHistoryInterval.ONE_DAY]: 300,\n [PriceHistoryInterval.ONE_WEEK]: 1800,\n [PriceHistoryInterval.MAX]: 1800,\n};\n","import {\n createContext,\n useContext,\n type PropsWithChildren,\n useMemo,\n} from \"react\";\nimport {\n useBalance,\n useDFlowKYC,\n usePolymarketSetup,\n} from \"@liberfi.io/react-predict\";\nimport { ChainNamespace } from \"@liberfi.io/types\";\nimport { useWallets } from \"@liberfi.io/wallet-connector\";\n\nexport interface PredictWalletContextValue {\n /** Connected Solana wallet address (for Kalshi). */\n solanaAddress: string | undefined;\n /** Connected EVM wallet address (for Polymarket). */\n evmAddress: string | undefined;\n /** Polymarket Safe (proxy) wallet address, derived from EOA via CREATE2. */\n polymarketSafeAddress: string | undefined;\n /** `null` when no wallet is connected or data has not loaded yet. */\n kalshiUsdcBalance: number | null;\n /** `null` when wallet not connected or setup not complete. */\n polymarketUsdcBalance: number | null;\n /** Whether the Solana wallet has completed Kalshi/DFlow KYC verification. */\n kalshiKycVerified: boolean;\n /** URL to redirect for KYC onboarding, or `null` if unavailable. */\n kalshiKycUrl: string | null;\n /** `true` while the KYC status query is loading for the first time. */\n kalshiKycLoading: boolean;\n /** Whether Polymarket wallet setup is fully complete (Safe deployed + USDC.e approved). */\n polymarketSetupVerified: boolean;\n /** Whether the Safe wallet has been deployed on Polygon. */\n polymarketSafeDeployed: boolean;\n /** Whether USDC.e is approved for the CTF Exchange. */\n polymarketTokenApproved: boolean;\n /** `true` while the Polymarket setup status is loading. */\n polymarketSetupLoading: boolean;\n /** `true` only on initial load when there is no cached data yet. */\n isLoading: boolean;\n /** `true` whenever a request is in-flight (including background refetches). */\n isFetching: boolean;\n error: Error | null;\n}\n\nconst PredictWalletContext = createContext<PredictWalletContextValue | null>(\n null,\n);\n\nexport function usePredictWallet() {\n const ctx = useContext(PredictWalletContext);\n if (!ctx) {\n throw new Error(\n \"usePredictWallet must be used within a PredictWalletProvider\",\n );\n }\n return ctx;\n}\n\nconst DEFAULT_POLLING_INTERVAL = 10_000;\n\nexport type PredictWalletProviderProps = PropsWithChildren<{\n pollingInterval?: number;\n enabled?: boolean;\n}>;\n\nexport function PredictWalletProvider({\n pollingInterval = DEFAULT_POLLING_INTERVAL,\n enabled = true,\n children,\n}: PredictWalletProviderProps) {\n // ---------------------------------------------------------------------------\n // Derive wallet addresses from wallet-connector\n // ---------------------------------------------------------------------------\n const wallets = useWallets();\n\n const solanaAddress = useMemo(\n () =>\n wallets.find(\n (w) => w.chainNamespace === ChainNamespace.SOLANA && w.isConnected,\n )?.address,\n [wallets],\n );\n\n const evmAddress = useMemo(\n () =>\n wallets.find(\n (w) => w.chainNamespace === ChainNamespace.EVM && w.isConnected,\n )?.address,\n [wallets],\n );\n\n // ---------------------------------------------------------------------------\n // DFlow (Solana) USDC balance polling\n // ---------------------------------------------------------------------------\n const {\n data: kalshiBalanceData,\n isLoading: kalshiBalanceLoading,\n isFetching: kalshiBalanceFetching,\n error: kalshiBalanceError,\n } = useBalance(\n { source: \"kalshi\", user: solanaAddress ?? \"\" },\n {\n enabled: enabled && !!solanaAddress,\n refetchInterval: pollingInterval,\n },\n );\n\n // ---------------------------------------------------------------------------\n // Kalshi / DFlow KYC status polling\n // ---------------------------------------------------------------------------\n const { data: kalshiKycData, isLoading: kalshiKycLoading } = useDFlowKYC(\n solanaAddress,\n {\n enabled: enabled && !!solanaAddress,\n refetchInterval: 30_000,\n },\n );\n\n // ---------------------------------------------------------------------------\n // Polymarket wallet setup status polling\n // ---------------------------------------------------------------------------\n const { data: polySetupData, isLoading: polySetupLoading } =\n usePolymarketSetup(evmAddress, {\n enabled: enabled && !!evmAddress,\n refetchInterval: 30_000,\n });\n\n // ---------------------------------------------------------------------------\n // Polymarket (Polygon) USDC.e balance polling\n // The backend derives the Safe address from the EOA via CREATE2, so we\n // always pass the EOA here — consistent with positions and trades queries.\n // ---------------------------------------------------------------------------\n const polymarketSafeAddress = polySetupData?.safe_address;\n const polymarketSetupVerified = polySetupData?.verified ?? false;\n\n const {\n data: polymarketBalanceData,\n isLoading: polymarketBalanceLoading,\n isFetching: polymarketBalanceFetching,\n error: polymarketBalanceError,\n } = useBalance(\n { source: \"polymarket\", user: evmAddress ?? \"\" },\n {\n enabled: enabled && polymarketSetupVerified && !!evmAddress,\n refetchInterval: pollingInterval,\n },\n );\n\n // ---------------------------------------------------------------------------\n // Context value\n // ---------------------------------------------------------------------------\n const value = useMemo(\n () => ({\n solanaAddress,\n evmAddress,\n polymarketSafeAddress,\n kalshiUsdcBalance: kalshiBalanceData\n ? Number(kalshiBalanceData.balance)\n : null,\n polymarketUsdcBalance:\n polymarketSetupVerified && polymarketBalanceData\n ? Number(polymarketBalanceData.balance)\n : null,\n kalshiKycVerified: kalshiKycData?.verified ?? false,\n kalshiKycUrl: kalshiKycData?.kyc_url ?? null,\n kalshiKycLoading,\n polymarketSetupVerified,\n polymarketSafeDeployed: polySetupData?.safe_deployed ?? false,\n polymarketTokenApproved: polySetupData?.token_approved ?? false,\n polymarketSetupLoading: polySetupLoading,\n isLoading: kalshiBalanceLoading || polymarketBalanceLoading,\n isFetching: kalshiBalanceFetching || polymarketBalanceFetching,\n error: kalshiBalanceError ?? polymarketBalanceError ?? null,\n }),\n [\n solanaAddress,\n evmAddress,\n polymarketSafeAddress,\n kalshiBalanceData,\n polymarketBalanceData,\n polymarketSetupVerified,\n kalshiKycData,\n kalshiKycLoading,\n polySetupData,\n polySetupLoading,\n kalshiBalanceLoading,\n polymarketBalanceLoading,\n kalshiBalanceFetching,\n polymarketBalanceFetching,\n kalshiBalanceError,\n polymarketBalanceError,\n ],\n );\n\n return (\n <PredictWalletContext.Provider value={value}>\n {children}\n </PredictWalletContext.Provider>\n );\n}\n","import { useState, useContext, useMemo, useCallback, useEffect } from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport confetti from \"canvas-confetti\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type {\n PredictMarket,\n ProviderSource,\n CreateOrderInput,\n PolymarketSigner,\n} from \"@liberfi.io/react-predict\";\nimport {\n useDFlowQuote,\n useDFlowSubmit,\n useOrder,\n usePositions,\n usePredictClient,\n useTickSize,\n PolymarketContext,\n buildPolymarketL2Headers,\n buildCtfExchangeDomain,\n CTF_ORDER_TYPES,\n buildOrderMessage,\n buildSignedOrder,\n buildClobPayload,\n} from \"@liberfi.io/react-predict\";\nimport { Chain, ChainNamespace } from \"@liberfi.io/types\";\nimport { toast } from \"@liberfi.io/ui\";\nimport { SOLANA_TOKENS } from \"@liberfi.io/utils\";\nimport {\n useAuth,\n useWallets,\n useSwitchChain,\n type EvmWalletAdapter,\n} from \"@liberfi.io/wallet-connector\";\nimport { ORDER_MIN_QUANTITY, ORDER_MIN_USDC } from \"../../consts\";\nimport { usePredictWallet } from \"../../providers/PredictWalletProvider\";\n\n// ---------------------------------------------------------------------------\n// Shared form types\n// ---------------------------------------------------------------------------\n\nexport type TradeOutcome = \"yes\" | \"no\";\nexport type TradeSide = \"buy\" | \"sell\";\nexport type OrderType = \"market\" | \"limit\";\nexport type ExpirationPreset = \"5m\" | \"1h\" | \"12h\" | \"24h\" | \"eod\" | \"custom\";\nexport type DurationUnit = \"minutes\" | \"hours\" | \"days\";\n\nexport interface TradeFormValidation {\n isValid: boolean;\n errors: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseTradeFormParams {\n market: PredictMarket;\n chain?: string;\n initialOutcome?: TradeOutcome;\n initialSide?: TradeSide;\n}\n\nexport interface UseTradeFormResult {\n outcome: TradeOutcome;\n side: TradeSide;\n orderType: OrderType;\n quantity: number;\n limitPrice: number;\n shares: number;\n estimatedCost: number;\n potentialPayout: number;\n potentialProfit: number;\n usdcBalance: number | null;\n yesTokenBalance: number | null;\n noTokenBalance: number | null;\n isBalanceLoading: boolean;\n isSubmitting: boolean;\n validation: TradeFormValidation;\n supportsLimitOrder: boolean;\n kycRequired: boolean;\n kycUrl: string | null;\n setOutcome: (outcome: TradeOutcome) => void;\n setSide: (side: TradeSide) => void;\n setOrderType: (type: OrderType) => void;\n expirationEnabled: boolean;\n expirationPreset: ExpirationPreset;\n customDuration: number;\n customDurationUnit: DurationUnit;\n setQuantity: (quantity: number) => void;\n setLimitPrice: (price: number) => void;\n setExpirationEnabled: (enabled: boolean) => void;\n setExpirationPreset: (preset: ExpirationPreset) => void;\n setCustomDuration: (v: number) => void;\n setCustomDurationUnit: (u: DurationUnit) => void;\n submit: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst DURATION_UNIT_SECONDS: Record<DurationUnit, number> = {\n minutes: 60,\n hours: 3600,\n days: 86400,\n};\n\nfunction resolveExpiration(\n preset: ExpirationPreset,\n customDuration: number,\n customDurationUnit: DurationUnit,\n): number {\n const now = Math.floor(Date.now() / 1000);\n switch (preset) {\n case \"5m\":\n return now + 5 * 60;\n case \"1h\":\n return now + 60 * 60;\n case \"12h\":\n return now + 12 * 60 * 60;\n case \"24h\":\n return now + 24 * 60 * 60;\n case \"eod\": {\n const end = new Date();\n end.setUTCHours(23, 59, 59, 0);\n return Math.floor(end.getTime() / 1000);\n }\n case \"custom\":\n return now + customDuration * DURATION_UNIT_SECONDS[customDurationUnit];\n }\n}\n\nfunction fireCelebration() {\n const defaults = { startVelocity: 30, spread: 360, ticks: 60, zIndex: 9999 };\n confetti({ ...defaults, particleCount: 80, origin: { x: 0.5, y: 0.4 } });\n setTimeout(() => {\n confetti({ ...defaults, particleCount: 40, origin: { x: 0.3, y: 0.6 } });\n }, 150);\n setTimeout(() => {\n confetti({ ...defaults, particleCount: 40, origin: { x: 0.7, y: 0.6 } });\n }, 300);\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useTradeForm({\n market,\n initialOutcome = \"yes\",\n initialSide = \"buy\",\n}: UseTradeFormParams): UseTradeFormResult {\n const { t } = useTranslation();\n const { status: authStatus } = useAuth();\n const wallets = useWallets();\n const switchChain = useSwitchChain();\n const predictClient = usePredictClient();\n const polymarketCtx = useContext(PolymarketContext);\n const queryClient = useQueryClient();\n const source: ProviderSource = market.source;\n const supportsLimitOrder = source === \"polymarket\";\n\n const solanaWallet = wallets.find(\n (w) => w.chainNamespace === ChainNamespace.SOLANA && w.isConnected,\n );\n const evmWallet = wallets.find(\n (w): w is EvmWalletAdapter =>\n w.chainNamespace === ChainNamespace.EVM &&\n w.isConnected &&\n \"switchChain\" in w,\n );\n\n const isAuthenticated = authStatus === \"authenticated\";\n const userPublicKey = solanaWallet?.address;\n const evmAddress = evmWallet?.address;\n\n // ---------------------------------------------------------------------------\n // Polymarket tick size — query the actual tick size for this market's token\n // ---------------------------------------------------------------------------\n const clobTokenId = useMemo(() => {\n if (source !== \"polymarket\") return undefined;\n const raw = market.provider_meta?.[\"polymarket.clobTokenIds\"] as\n | string\n | string[]\n | undefined;\n if (!raw) return undefined;\n const ids = typeof raw === \"string\" ? (JSON.parse(raw) as string[]) : raw;\n return ids[0];\n }, [source, market.provider_meta]);\n\n const { data: tickSizeData } = useTickSize(clobTokenId);\n const tickSize = (\n tickSizeData?.minimum_tick_size\n ? String(tickSizeData.minimum_tick_size)\n : \"0.01\"\n ) as \"0.1\" | \"0.01\" | \"0.001\" | \"0.0001\";\n\n // ---------------------------------------------------------------------------\n // Local state\n // ---------------------------------------------------------------------------\n const [outcome, setOutcomeRaw] = useState<TradeOutcome>(initialOutcome);\n const [side, setSideRaw] = useState<TradeSide>(initialSide);\n const [orderType, setOrderTypeRaw] = useState<OrderType>(\"market\");\n const [quantity, setQuantityRaw] = useState<number>(NaN);\n const [limitPrice, setLimitPriceRaw] = useState<number>(NaN);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [pendingSignature, setPendingSignature] = useState<string | null>(null);\n const [pendingSellCashConvert, setPendingSellCashConvert] = useState<{\n cashAmount: string;\n collateral: string;\n } | null>(null);\n const [kycRequired, setKycRequired] = useState(false);\n const [expirationEnabled, setExpirationEnabled] = useState(false);\n const [expirationPreset, setExpirationPreset] =\n useState<ExpirationPreset>(\"1h\");\n const [customDuration, setCustomDuration] = useState(30);\n const [customDurationUnit, setCustomDurationUnit] =\n useState<DurationUnit>(\"minutes\");\n\n // ---------------------------------------------------------------------------\n // USDC balances from context\n // ---------------------------------------------------------------------------\n let contextBalance: {\n kalshiUsdcBalance: number | null;\n polymarketUsdcBalance: number | null;\n isLoading: boolean;\n } | null = null;\n let contextKycVerified = false;\n let contextKycUrl: string | null = null;\n let contextSafeAddress: string | undefined;\n try {\n const ctx = usePredictWallet();\n contextBalance = {\n kalshiUsdcBalance: ctx.kalshiUsdcBalance,\n polymarketUsdcBalance: ctx.polymarketUsdcBalance,\n isLoading: ctx.isLoading,\n };\n contextKycVerified = ctx.kalshiKycVerified;\n contextKycUrl = ctx.kalshiKycUrl;\n contextSafeAddress = ctx.polymarketSafeAddress;\n } catch {\n // Provider not mounted — fall back to local position query\n }\n\n // ---------------------------------------------------------------------------\n // Price per share from market outcomes\n // ---------------------------------------------------------------------------\n const pricePerShare = useMemo(() => {\n const idx = outcome === \"yes\" ? 0 : 1;\n const o = market.outcomes[idx];\n return side === \"buy\"\n ? (o?.best_ask ?? o?.price ?? 0.5)\n : (o?.best_bid ?? o?.price ?? 0.5);\n }, [market.outcomes, outcome, side]);\n\n const setOrderType = useCallback((type: OrderType) => {\n setOrderTypeRaw(type);\n }, []);\n\n const setOutcome = useCallback((o: TradeOutcome) => {\n setOutcomeRaw(o);\n setLimitPriceRaw(NaN);\n }, []);\n\n useEffect(() => {\n if (orderType === \"limit\" && isNaN(limitPrice)) {\n setLimitPriceRaw(Math.round(pricePerShare * 100) / 100);\n }\n }, [orderType, limitPrice, pricePerShare]);\n\n const shares = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return 0;\n return side === \"buy\"\n ? pricePerShare > 0\n ? quantity / pricePerShare\n : 0\n : quantity;\n }, [side, quantity, pricePerShare]);\n\n const amountStr = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return \"0\";\n return String(Math.round(quantity * 1_000_000));\n }, [quantity]);\n\n // ---------------------------------------------------------------------------\n // DFlow mints (only used when source === \"kalshi\")\n // ---------------------------------------------------------------------------\n const yesMint = (market.provider_meta?.[\"dflow.yesMint\"] as string) ?? \"\";\n const noMint = (market.provider_meta?.[\"dflow.noMint\"] as string) ?? \"\";\n const usdcMint = SOLANA_TOKENS.stablecoins.USDC.address;\n const collateralMint =\n (market.provider_meta?.[\"dflow.collateralMint\"] as string) || \"\";\n const marketOutcomeMint = outcome === \"yes\" ? yesMint : noMint;\n\n // ---------------------------------------------------------------------------\n // Positions for share balances (fallback when context not available)\n // ---------------------------------------------------------------------------\n const positionUser =\n source === \"kalshi\" ? (userPublicKey ?? \"\") : (evmAddress ?? \"\");\n\n const { data: positionsData, isLoading: positionsLoading } = usePositions(\n { source, user: positionUser },\n { enabled: Boolean(positionUser) },\n );\n\n // ---------------------------------------------------------------------------\n // DFlow sell mint resolution — use position's actual on-chain outcome mint\n // stored in market.provider_meta by the positions API enrichment.\n // A market may have multiple collateral pools with different outcome mints;\n // dflow.outcomeMint carries the one the user actually holds.\n // ---------------------------------------------------------------------------\n const matchingPosition = useMemo(() => {\n if (!positionsData || side !== \"sell\") return null;\n return (\n positionsData.positions.find(\n (p) =>\n p.side?.toLowerCase() === outcome && p.market?.slug === market.slug,\n ) ?? null\n );\n }, [positionsData, market.slug, outcome, side]);\n\n const positionMarketMeta = matchingPosition?.market?.provider_meta;\n const effectiveOutcomeMint =\n (side === \"sell\" &&\n (positionMarketMeta?.[\"dflow.outcomeMint\"] as string)) ||\n marketOutcomeMint;\n const effectiveCollateral =\n (side === \"sell\" &&\n (positionMarketMeta?.[\"dflow.collateralMint\"] as string)) ||\n collateralMint;\n\n // Buy: USDC → outcome\n // Sell: outcome → collateral (USDC or CASH depending on collateral pool)\n const inputMint = side === \"buy\" ? usdcMint : effectiveOutcomeMint;\n const outputMint =\n side === \"buy\" ? marketOutcomeMint : effectiveCollateral || usdcMint;\n\n // ---------------------------------------------------------------------------\n // DFlow quote (only enabled for dflow source)\n // ---------------------------------------------------------------------------\n const quoteEnabled =\n source === \"kalshi\" &&\n Boolean(inputMint) &&\n Boolean(outputMint) &&\n Boolean(userPublicKey) &&\n amountStr !== \"0\";\n\n const { refetch: refetchQuote } = useDFlowQuote(\n {\n inputMint,\n outputMint,\n amount: amountStr,\n userPublicKey: userPublicKey ?? \"\",\n slippageBps: 100,\n },\n { enabled: quoteEnabled },\n );\n\n // ---------------------------------------------------------------------------\n // Resolved balances\n // ---------------------------------------------------------------------------\n const usdcBalance = useMemo(() => {\n if (contextBalance) {\n return source === \"kalshi\"\n ? contextBalance.kalshiUsdcBalance\n : contextBalance.polymarketUsdcBalance;\n }\n if (!positionsData) return null;\n const total = positionsData.positions.reduce((sum, p) => {\n if (p.side === \"USDC\" || p.side === \"collateral\")\n return sum + (p.current_value ?? 0);\n return sum;\n }, 0);\n return total || null;\n }, [contextBalance, positionsData, source]);\n\n const isBalanceLoading = contextBalance\n ? contextBalance.isLoading\n : positionsLoading;\n\n const yesTokenBalance = useMemo(() => {\n if (!positionsData) return null;\n const pos = positionsData.positions.find(\n (p) => p.side?.toLowerCase() === \"yes\" && p.market?.slug === market.slug,\n );\n return pos?.size ?? 0;\n }, [positionsData, market.slug]);\n\n const noTokenBalance = useMemo(() => {\n if (!positionsData) return null;\n const pos = positionsData.positions.find(\n (p) => p.side?.toLowerCase() === \"no\" && p.market?.slug === market.slug,\n );\n return pos?.size ?? 0;\n }, [positionsData, market.slug]);\n\n // ---------------------------------------------------------------------------\n // Cost / payout\n // ---------------------------------------------------------------------------\n const effectivePrice = useMemo(() => {\n if (orderType === \"limit\" && supportsLimitOrder && !isNaN(limitPrice)) {\n return limitPrice;\n }\n return pricePerShare;\n }, [orderType, supportsLimitOrder, limitPrice, pricePerShare]);\n\n const estimatedCost = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return 0;\n if (side === \"buy\") return quantity;\n const bidPrice =\n outcome === \"yes\"\n ? (market.outcomes[0]?.best_bid ?? 0)\n : (market.outcomes[1]?.best_bid ?? 0);\n return quantity * bidPrice;\n }, [side, outcome, quantity, market.outcomes]);\n\n const potentialPayout = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return 0;\n if (side === \"buy\") {\n return effectivePrice > 0 ? (quantity / effectivePrice) * 1 : 0;\n }\n return estimatedCost;\n }, [side, quantity, effectivePrice, estimatedCost]);\n\n const potentialProfit = potentialPayout - estimatedCost;\n\n // ---------------------------------------------------------------------------\n // Setters\n // ---------------------------------------------------------------------------\n const setSide = useCallback((s: TradeSide) => {\n setSideRaw(s);\n setQuantityRaw(NaN);\n }, []);\n\n const setQuantity = useCallback(\n (v: number) => {\n if (isNaN(v)) {\n setQuantityRaw(NaN);\n return;\n }\n const clamped = Math.max(0, v);\n const rounded =\n side === \"buy\" ? Math.round(clamped * 100) / 100 : Math.round(clamped);\n setQuantityRaw(rounded);\n },\n [side],\n );\n\n const setLimitPrice = useCallback((v: number) => {\n if (isNaN(v)) {\n setLimitPriceRaw(NaN);\n return;\n }\n const clamped = Math.max(0.01, Math.min(0.99, v));\n setLimitPriceRaw(Math.round(clamped * 100) / 100);\n }, []);\n\n const resetForm = useCallback(() => {\n setQuantityRaw(NaN);\n setLimitPriceRaw(NaN);\n setOrderTypeRaw(\"market\");\n setExpirationEnabled(false);\n setExpirationPreset(\"1h\");\n setCustomDuration(30);\n setCustomDurationUnit(\"minutes\");\n }, []);\n\n // ---------------------------------------------------------------------------\n // Validation\n // ---------------------------------------------------------------------------\n const validation = useMemo<TradeFormValidation>(() => {\n const errors: string[] = [];\n if (isNaN(quantity) || quantity <= 0) {\n if (side === \"buy\") {\n errors.push(\n t(\"predict.trade.minAmountUsd\", { amount: ORDER_MIN_USDC }),\n );\n } else {\n errors.push(\n t(\"predict.trade.minQuantity\", { amount: ORDER_MIN_QUANTITY }),\n );\n }\n } else if (side === \"buy\" && quantity < ORDER_MIN_USDC) {\n errors.push(t(\"predict.trade.minAmountUsd\", { amount: ORDER_MIN_USDC }));\n } else if (side === \"sell\" && quantity < ORDER_MIN_QUANTITY) {\n errors.push(\n t(\"predict.trade.minQuantity\", { amount: ORDER_MIN_QUANTITY }),\n );\n }\n if (market.status !== \"open\") {\n errors.push(t(\"predict.trade.marketNotActive\"));\n }\n if (\n side === \"buy\" &&\n usdcBalance != null &&\n !isNaN(quantity) &&\n quantity > 0 &&\n quantity > usdcBalance\n ) {\n errors.push(t(\"predict.trade.insufficientBalance\"));\n }\n const holdingBalance = outcome === \"yes\" ? yesTokenBalance : noTokenBalance;\n if (\n side === \"sell\" &&\n holdingBalance != null &&\n !isNaN(quantity) &&\n quantity > 0 &&\n quantity > holdingBalance\n ) {\n errors.push(t(\"predict.trade.insufficientShares\"));\n }\n if (\n orderType === \"limit\" &&\n supportsLimitOrder &&\n (isNaN(limitPrice) || limitPrice < 0.01 || limitPrice > 0.99)\n ) {\n errors.push(t(\"predict.trade.limitPriceRange\"));\n }\n if (\n orderType === \"limit\" &&\n supportsLimitOrder &&\n expirationEnabled &&\n expirationPreset === \"custom\" &&\n (isNaN(customDuration) || customDuration <= 0)\n ) {\n errors.push(t(\"predict.trade.expiration.invalidDate\"));\n }\n return { isValid: errors.length === 0, errors };\n }, [\n quantity,\n market.status,\n side,\n source,\n usdcBalance,\n yesTokenBalance,\n noTokenBalance,\n outcome,\n orderType,\n supportsLimitOrder,\n limitPrice,\n expirationEnabled,\n expirationPreset,\n customDuration,\n t,\n ]);\n\n // ---------------------------------------------------------------------------\n // DFlow submit mutation\n // ---------------------------------------------------------------------------\n const { mutateAsync: submitDFlow } = useDFlowSubmit();\n\n // ---------------------------------------------------------------------------\n // Polymarket: context is optional (null when PolymarketProvider is absent)\n // ---------------------------------------------------------------------------\n\n // ---------------------------------------------------------------------------\n // Poll order status for pending DFlow signature\n // ---------------------------------------------------------------------------\n const { data: orderStatus } = useOrder(\n { id: pendingSignature ?? \"\", source },\n { enabled: Boolean(pendingSignature) },\n );\n\n const convertCashToUsdc = useCallback(async () => {\n if (!pendingSellCashConvert || !userPublicKey || !solanaWallet) return;\n const { cashAmount, collateral } = pendingSellCashConvert;\n setPendingSellCashConvert(null);\n\n try {\n const cashQuote = await predictClient.createDFlowQuote({\n inputMint: collateral,\n outputMint: usdcMint,\n amount: cashAmount,\n userPublicKey,\n slippageBps: 100,\n });\n const cashTx = (cashQuote as Record<string, unknown>)?.transaction as\n | string\n | undefined;\n if (!cashTx) return;\n\n const txBytes = Uint8Array.from(atob(cashTx), (c) => c.charCodeAt(0));\n const signedTxBytes = await solanaWallet.signTransaction(txBytes);\n await submitDFlow({\n signedTransaction: btoa(String.fromCharCode(...signedTxBytes)),\n orderContext: {\n user_public_key: userPublicKey,\n input_mint: collateral,\n output_mint: usdcMint,\n amount: cashAmount,\n price: \"1\",\n side: \"SELL\",\n outcome: \"\",\n market_slug: \"\",\n slippage_bps: 100,\n },\n });\n } catch (err) {\n console.error(\"[TradeForm] CASH→USDC conversion failed:\", err);\n }\n }, [\n pendingSellCashConvert,\n userPublicKey,\n solanaWallet,\n predictClient,\n submitDFlow,\n usdcMint,\n ]);\n\n useEffect(() => {\n if (!orderStatus || !pendingSignature) return;\n const { status } = orderStatus;\n if (status === \"closed\") {\n setPendingSignature(null);\n if (pendingSellCashConvert) {\n // Sell confirmed — auto-convert CASH → USDC before showing success\n convertCashToUsdc().finally(() => {\n setIsSubmitting(false);\n toast.success(t(\"predict.trade.submitSuccess\"));\n fireCelebration();\n resetForm();\n });\n } else {\n setIsSubmitting(false);\n toast.success(t(\"predict.trade.submitSuccess\"));\n fireCelebration();\n resetForm();\n }\n } else if (status === \"failed\" || status === \"expired\") {\n setIsSubmitting(false);\n setPendingSignature(null);\n setPendingSellCashConvert(null);\n toast.error(t(\"predict.trade.submitError\"));\n }\n }, [\n orderStatus,\n pendingSignature,\n pendingSellCashConvert,\n convertCashToUsdc,\n resetForm,\n t,\n ]);\n\n // ---------------------------------------------------------------------------\n // Submit — routes to DFlow or Polymarket based on source\n // ---------------------------------------------------------------------------\n const submitDFlowOrder = useCallback(async () => {\n if (!userPublicKey || !solanaWallet) return;\n\n if (!inputMint || !outputMint) {\n toast.error(\"Missing token mint addresses\");\n setIsSubmitting(false);\n return;\n }\n\n if (!contextKycVerified) {\n setKycRequired(true);\n setIsSubmitting(false);\n return;\n }\n\n const quoteResult = await refetchQuote();\n const quote = quoteResult.data;\n const quoteRecord = quote as Record<string, unknown> | undefined;\n const transaction = quoteRecord?.transaction as string | undefined;\n\n if (!transaction) {\n toast.error(t(\"predict.trade.submitError\"));\n setIsSubmitting(false);\n return;\n }\n\n // For sells to non-USDC collateral (e.g. CASH), track the outAmount\n // so we can auto-convert collateral→USDC after the sell completes.\n if (\n side === \"sell\" &&\n effectiveCollateral &&\n effectiveCollateral !== usdcMint\n ) {\n const outAmount = String(quoteRecord?.outAmount ?? \"\");\n if (outAmount && outAmount !== \"0\") {\n setPendingSellCashConvert({\n cashAmount: outAmount,\n collateral: effectiveCollateral,\n });\n }\n }\n\n const txBytes = Uint8Array.from(atob(transaction), (c) => c.charCodeAt(0));\n const signedTxBytes = await solanaWallet.signTransaction(txBytes);\n\n const result = await submitDFlow({\n signedTransaction: btoa(String.fromCharCode(...signedTxBytes)),\n orderContext: {\n user_public_key: userPublicKey,\n input_mint: inputMint,\n output_mint: outputMint,\n amount: amountStr,\n price: String(pricePerShare),\n side: side === \"buy\" ? \"BUY\" : \"SELL\",\n outcome: outcome === \"yes\" ? \"YES\" : \"NO\",\n market_slug: market.slug,\n slippage_bps: 100,\n },\n });\n\n setPendingSignature(result.signature);\n }, [\n userPublicKey,\n solanaWallet,\n predictClient,\n refetchQuote,\n submitDFlow,\n inputMint,\n outputMint,\n amountStr,\n pricePerShare,\n side,\n outcome,\n market.slug,\n effectiveCollateral,\n usdcMint,\n t,\n ]);\n\n const submitPolymarketOrder = useCallback(async () => {\n if (!evmWallet || !polymarketCtx) return;\n\n // Switch to Polygon before submitting; restore original chain afterwards\n const previousChain = evmWallet.chain;\n const needsSwitch = previousChain !== Chain.POLYGON;\n if (needsSwitch) {\n await switchChain(Chain.POLYGON);\n }\n\n try {\n const provider = await evmWallet.getEip1193Provider();\n if (!provider) {\n toast.error(t(\"predict.trade.submitError\"));\n setIsSubmitting(false);\n return;\n }\n\n const usesSafe = !!contextSafeAddress;\n const signer: PolymarketSigner = {\n address: evmWallet.address,\n signatureType: usesSafe ? 2 : 0,\n signTypedData: async (domain, types, primaryType, value) => {\n const domainFields: { name: string; type: string }[] = [];\n if (\"name\" in domain)\n domainFields.push({ name: \"name\", type: \"string\" });\n if (\"version\" in domain)\n domainFields.push({ name: \"version\", type: \"string\" });\n if (\"chainId\" in domain)\n domainFields.push({ name: \"chainId\", type: \"uint256\" });\n if (\"verifyingContract\" in domain)\n domainFields.push({ name: \"verifyingContract\", type: \"address\" });\n if (\"salt\" in domain)\n domainFields.push({ name: \"salt\", type: \"bytes32\" });\n\n const fullTypes = { EIP712Domain: domainFields, ...types };\n\n return (await provider.request({\n method: \"eth_signTypedData_v4\",\n params: [\n evmWallet.address,\n JSON.stringify({\n domain,\n types: fullTypes,\n primaryType,\n message: value,\n }),\n ],\n })) as string;\n },\n };\n\n const creds =\n polymarketCtx.credentials ?? (await polymarketCtx.authenticate(signer));\n\n const tokenIdx = outcome === \"yes\" ? 0 : 1;\n let tokenId = \"\";\n const rawClobTokenIds = market.provider_meta?.[\n \"polymarket.clobTokenIds\"\n ] as string | string[] | undefined;\n if (rawClobTokenIds) {\n const ids =\n typeof rawClobTokenIds === \"string\"\n ? (JSON.parse(rawClobTokenIds) as string[])\n : rawClobTokenIds;\n tokenId = ids[tokenIdx] ?? \"\";\n }\n\n const negRisk =\n (market.provider_meta?.[\"polymarket.negRisk\"] as boolean) ?? false;\n\n const price =\n orderType === \"limit\" && !isNaN(limitPrice)\n ? limitPrice\n : pricePerShare;\n\n const polyOrderType =\n orderType === \"limit\" ? (expirationEnabled ? \"GTD\" : \"GTC\") : \"FOK\";\n\n const sizeInShares =\n side === \"buy\" && price > 0 ? quantity / price : quantity;\n\n const input: CreateOrderInput = {\n tokenId,\n price,\n size: sizeInShares,\n side: side === \"buy\" ? \"BUY\" : \"SELL\",\n orderType: polyOrderType,\n tickSize,\n negRisk,\n ...(contextSafeAddress && { funderAddress: contextSafeAddress }),\n ...(orderType === \"limit\" &&\n expirationEnabled && {\n expiration: resolveExpiration(\n expirationPreset,\n customDuration,\n customDurationUnit,\n ),\n }),\n };\n\n const domain = buildCtfExchangeDomain(negRisk);\n const orderMessage = buildOrderMessage({\n ...input,\n signerAddress: signer.address,\n signatureType: signer.signatureType,\n });\n const signature = await signer.signTypedData(\n domain,\n CTF_ORDER_TYPES as unknown as Record<string, unknown[]>,\n \"Order\",\n orderMessage as unknown as Record<string, unknown>,\n );\n const signedOrder = buildSignedOrder(\n orderMessage,\n signature,\n input.orderType,\n );\n\n // Convert to CLOB payload format (numeric salt, string side, deferExec).\n const clobPayload = buildClobPayload(signedOrder, creds.apiKey);\n\n const body = JSON.stringify(clobPayload);\n const headers = await buildPolymarketL2Headers(creds.address, {\n apiKey: creds.apiKey,\n secret: creds.secret,\n passphrase: creds.passphrase,\n method: \"POST\",\n requestPath: \"/order\",\n body,\n });\n\n await predictClient.createPolymarketOrder(\n clobPayload as unknown as CreateOrderInput,\n headers as unknown as Record<string, string>,\n );\n\n queryClient.invalidateQueries({ queryKey: [\"predict\", \"orders\"] });\n queryClient.invalidateQueries({ queryKey: [\"predict\", \"positions\"] });\n\n toast.success(t(\"predict.trade.submitSuccess\"));\n fireCelebration();\n resetForm();\n setIsSubmitting(false);\n } finally {\n if (needsSwitch && previousChain) {\n switchChain(previousChain).catch(() => {});\n }\n }\n }, [\n evmWallet,\n polymarketCtx,\n switchChain,\n outcome,\n market.provider_meta,\n orderType,\n limitPrice,\n pricePerShare,\n quantity,\n side,\n predictClient,\n queryClient,\n expirationEnabled,\n expirationPreset,\n customDuration,\n customDurationUnit,\n resetForm,\n t,\n ]);\n\n const submit = useCallback(async () => {\n if (!validation.isValid || !isAuthenticated) return;\n\n setIsSubmitting(true);\n setPendingSignature(null);\n setKycRequired(false);\n\n try {\n if (source === \"kalshi\") {\n await submitDFlowOrder();\n } else {\n await submitPolymarketOrder();\n }\n } catch (err) {\n console.error(\"[TradeForm] submit failed:\", err);\n const detail = err instanceof Error ? err.message : undefined;\n toast.error(detail || t(\"predict.trade.submitError\"));\n setIsSubmitting(false);\n }\n }, [\n validation.isValid,\n isAuthenticated,\n source,\n submitDFlowOrder,\n submitPolymarketOrder,\n t,\n ]);\n\n return {\n outcome,\n side,\n orderType,\n quantity,\n limitPrice,\n shares,\n estimatedCost,\n potentialPayout,\n potentialProfit,\n usdcBalance,\n yesTokenBalance,\n noTokenBalance,\n isBalanceLoading,\n isSubmitting,\n validation,\n supportsLimitOrder,\n kycRequired,\n kycUrl: contextKycUrl,\n expirationEnabled,\n expirationPreset,\n customDuration,\n customDurationUnit,\n setOutcome,\n setSide,\n setOrderType,\n setQuantity,\n setLimitPrice,\n setExpirationEnabled,\n setExpirationPreset,\n setCustomDuration,\n setCustomDurationUnit,\n submit,\n };\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { StyledModal, ModalContent } from \"@liberfi.io/ui\";\n\nexport interface KycModalProps {\n isOpen: boolean;\n onClose: () => void;\n kycUrl: string | null;\n}\n\nexport function KycModal({ isOpen, onClose, kycUrl }: KycModalProps) {\n const { t } = useTranslation();\n\n return (\n <StyledModal\n isOpen={isOpen}\n onOpenChange={(open) => {\n if (!open) onClose();\n }}\n size=\"md\"\n classNames={{\n base: \"!bg-[#18181b] !rounded-[14px] !border !border-[rgba(39,39,42,1)] !shadow-[0_25px_50px_-12px_rgba(0,0,0,0.5)]\",\n body: \"!p-0\",\n }}\n >\n <ModalContent>\n <div>\n {/* Header */}\n <div className=\"flex items-center justify-between px-5 pt-5 pb-4\">\n <h3 className=\"text-base font-semibold text-white\">\n {t(\"predict.trade.kycModalTitle\")}\n </h3>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"p-1 rounded-[10px] hover:bg-[rgba(39,39,42,0.5)] text-zinc-400 hover:text-white transition-colors cursor-pointer focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n >\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n\n {/* Body */}\n <div className=\"px-5 pb-5\">\n <p className=\"text-[13px] text-zinc-400 mb-4 text-left\">\n {t(\"predict.trade.kycModalDescription\")}\n </p>\n\n {/* Checklist */}\n <div className=\"flex flex-col gap-2 mb-4\">\n {(\n [\n \"predict.trade.kycModalBullet1\",\n \"predict.trade.kycModalBullet2\",\n \"predict.trade.kycModalBullet3\",\n ] as const\n ).map((key) => (\n <div\n key={key}\n className=\"flex items-center gap-2.5 text-[13px] text-zinc-300\"\n >\n <svg\n width={14}\n height={14}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"text-[#c7ff2e] shrink-0\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n <span>{t(key)}</span>\n </div>\n ))}\n </div>\n\n {/* KYC link */}\n {kycUrl && (\n <a\n href={kycUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1 text-[13px] text-[#c7ff2e]/70 hover:text-[#c7ff2e] transition-colors mb-3\"\n >\n {t(\"predict.trade.goToKYC\")} →\n </a>\n )}\n\n <p className=\"text-[11px] text-zinc-500 mb-5\">\n {t(\"predict.trade.kycModalNote\")}\n </p>\n\n {/* OK button */}\n <button\n type=\"button\"\n onClick={onClose}\n className=\"w-full py-2.5 rounded-[10px] bg-[#c7ff2e] text-zinc-900 text-sm font-semibold hover:bg-[#c7ff2e]/90 transition-colors cursor-pointer focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n >\n {t(\"common.ok\")}\n </button>\n </div>\n </div>\n </ModalContent>\n </StyledModal>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n ChevronDownIcon,\n Tabs,\n Tab,\n StyledInput,\n StyledNumberInput,\n Spinner,\n Select,\n SelectItem,\n StyledSwitch,\n useDisclosure,\n cn,\n} from \"@liberfi.io/ui\";\nimport { SOLANA_TOKENS } from \"@liberfi.io/utils\";\nimport type { StandardEvent, StandardMarket } from \"../../types\";\nimport { KycModal } from \"../kyc-modal\";\nimport type {\n TradeSide,\n TradeOutcome,\n OrderType,\n ExpirationPreset,\n DurationUnit,\n} from \"./trade-form.script\";\n\nconst USDC_LOGO = `https://s1.chainstream.io/chains/sol/tokens/${SOLANA_TOKENS.stablecoins.USDC.address}/image.png`;\n\nconst EXPIRATION_PRESETS: ExpirationPreset[] = [\n \"5m\",\n \"1h\",\n \"12h\",\n \"24h\",\n \"eod\",\n \"custom\",\n];\n\nconst EXPIRATION_PRESET_I18N = {\n \"5m\": \"predict.trade.expiration.5m\",\n \"1h\": \"predict.trade.expiration.1h\",\n \"12h\": \"predict.trade.expiration.12h\",\n \"24h\": \"predict.trade.expiration.24h\",\n eod: \"predict.trade.expiration.eod\",\n custom: \"predict.trade.expiration.custom\",\n} as const;\n\nconst DURATION_UNITS: DurationUnit[] = [\"minutes\", \"hours\", \"days\"];\n\nconst DURATION_UNIT_I18N = {\n minutes: \"predict.trade.expiration.minutes\",\n hours: \"predict.trade.expiration.hours\",\n days: \"predict.trade.expiration.days\",\n} as const;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface TradeFormUIProps {\n event?: StandardEvent;\n market: StandardMarket;\n /** \"bordered\" (default) renders with border + rounded container; \"flat\" omits border (e.g. inside a modal). */\n variant?: \"bordered\" | \"flat\";\n outcome: TradeOutcome;\n side: TradeSide;\n orderType: OrderType;\n quantity: number;\n limitPrice: number;\n shares: number;\n estimatedCost: number;\n potentialPayout: number;\n potentialProfit: number;\n isSubmitting: boolean;\n usdcBalance: number | null;\n yesTokenBalance: number | null;\n noTokenBalance: number | null;\n isBalanceLoading: boolean;\n isValid: boolean;\n validationErrors: string[];\n supportsLimitOrder: boolean;\n kycRequired: boolean;\n kycUrl: string | null;\n expirationEnabled: boolean;\n expirationPreset: ExpirationPreset;\n customDuration: number;\n customDurationUnit: DurationUnit;\n onOutcomeChange: (outcome: TradeOutcome) => void;\n onSideChange: (side: TradeSide) => void;\n onOrderTypeChange: (type: OrderType) => void;\n onQuantityChange: (quantity: number) => void;\n onLimitPriceChange: (price: number) => void;\n onExpirationEnabledChange: (enabled: boolean) => void;\n onExpirationPresetChange: (preset: ExpirationPreset) => void;\n onCustomDurationChange: (v: number) => void;\n onCustomDurationUnitChange: (u: DurationUnit) => void;\n onSubmit: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function TradeFormUI({\n event,\n market,\n variant = \"bordered\",\n outcome,\n side,\n orderType,\n quantity,\n limitPrice,\n shares,\n potentialProfit,\n potentialPayout,\n estimatedCost,\n usdcBalance,\n yesTokenBalance,\n noTokenBalance,\n isBalanceLoading,\n isSubmitting,\n isValid,\n validationErrors,\n supportsLimitOrder,\n kycRequired,\n kycUrl,\n expirationEnabled,\n expirationPreset,\n customDuration,\n customDurationUnit,\n onOutcomeChange,\n onSideChange,\n onOrderTypeChange,\n onQuantityChange,\n onLimitPriceChange,\n onExpirationEnabledChange,\n onExpirationPresetChange,\n onCustomDurationChange,\n onCustomDurationUnitChange,\n onSubmit,\n}: TradeFormUIProps) {\n const { t } = useTranslation();\n const [showOdds, setShowOdds] = useState(false);\n const kycModal = useDisclosure();\n\n // ---------------------------------------------------------------------------\n // Local string state for the quantity input.\n // HeroUI NumberInput's onValueChange only fires on commit (blur/Enter),\n // so external re-renders (e.g. WebSocket price updates) would reset the\n // display back to the stale controlled value while the user is typing.\n // Using a plain text input with local string state avoids this entirely.\n // ---------------------------------------------------------------------------\n const [quantityText, setQuantityText] = useState(\"\");\n const quantityFocusedRef = useRef(false);\n const prevSideRef = useRef(side);\n\n // Sync display text from parent value when not focused\n // (handles Half / Max / Reset / external changes)\n useEffect(() => {\n if (!quantityFocusedRef.current) {\n setQuantityText(isNaN(quantity) ? \"\" : String(quantity));\n }\n }, [quantity]);\n\n // Reset local text on side switch\n useEffect(() => {\n if (side !== prevSideRef.current) {\n prevSideRef.current = side;\n setQuantityText(\"\");\n }\n }, [side]);\n\n const handleQuantityInput = useCallback(\n (val: string) => {\n const pattern = side === \"buy\" ? /^\\d*\\.?\\d{0,2}$/ : /^\\d*$/;\n if (val !== \"\" && !pattern.test(val)) return;\n setQuantityText(val);\n setShowErrors(false);\n\n if (val === \"\" || val === \".\") {\n onQuantityChange(NaN);\n return;\n }\n const parsed = parseFloat(val);\n if (!isNaN(parsed)) {\n onQuantityChange(parsed);\n }\n },\n [side, onQuantityChange],\n );\n\n useEffect(() => {\n if (kycRequired && !kycModal.isOpen) {\n kycModal.onOpen();\n }\n }, [kycRequired]);\n\n const currentPriceCents = useMemo(() => {\n const price =\n side === \"buy\"\n ? outcome === \"yes\"\n ? market.yesAsk\n : market.noAsk\n : outcome === \"yes\"\n ? market.yesBid\n : market.noBid;\n return price != null ? parseFloat((Number(price) * 100).toFixed(2)) : null;\n }, [side, outcome, market]);\n\n const hasAmount = !isNaN(quantity) && quantity > 0;\n\n const submitLabel = useMemo(() => {\n if (isBalanceLoading) return t(\"predict.trade.loadingBalance\");\n if (isSubmitting) return t(\"predict.trade.submitting\");\n if (kycRequired) return t(\"predict.trade.kycRequired\");\n if (!hasAmount) return t(\"predict.trade.enterAmount\");\n const sideLabel =\n side === \"buy\" ? t(\"predict.trade.buy\") : t(\"predict.trade.sell\");\n const outcomeLabel =\n outcome === \"yes\" ? t(\"predict.trade.yes\") : t(\"predict.trade.no\");\n const winAmount =\n side === \"buy\" && potentialProfit > 0\n ? ` → Win $${potentialProfit.toFixed(2)}`\n : \"\";\n return `${sideLabel} ${outcomeLabel}${winAmount}`;\n }, [\n isBalanceLoading,\n isSubmitting,\n kycRequired,\n hasAmount,\n side,\n outcome,\n potentialProfit,\n t,\n ]);\n\n const submitColor = useMemo(() => {\n return outcome === \"yes\" ? \"primary\" : \"secondary\";\n }, [outcome]);\n\n const handleHalf = () => {\n const bal = usdcBalance ?? 0;\n onQuantityChange(Math.floor((bal / 2) * 100) / 100);\n };\n const handleMax = () => {\n onQuantityChange(usdcBalance ?? 0);\n };\n\n const [showErrors, setShowErrors] = useState(false);\n\n const handleSubmitPress = () => {\n if (kycRequired) {\n kycModal.onOpen();\n return;\n }\n if (!isValid) {\n setShowErrors(true);\n return;\n }\n setShowErrors(false);\n onSubmit();\n };\n\n return (\n <>\n <div\n className=\"flex w-full flex-col gap-y-4 p-4\"\n style={\n variant === \"bordered\"\n ? {\n borderRadius: 14,\n border: \"1px solid rgba(39,39,42,0.6)\",\n background: \"rgba(24,24,27,0.4)\",\n transition: \"border-color 0.2s\",\n }\n : undefined\n }\n onMouseEnter={(e) => {\n if (variant === \"bordered\") {\n e.currentTarget.style.borderColor = \"rgba(113,113,122,0.7)\";\n }\n }}\n onMouseLeave={(e) => {\n if (variant === \"bordered\") {\n e.currentTarget.style.borderColor = \"rgba(39,39,42,0.6)\";\n }\n }}\n >\n {/* Event title bar */}\n {event && (\n <div className=\"flex items-center gap-x-3\">\n {event.imageUrl && (\n <img\n src={event.imageUrl}\n alt={event.title}\n className=\"h-10 w-10 shrink-0 rounded-lg object-cover\"\n />\n )}\n <div className=\"flex min-w-0 flex-col gap-y-0.5\">\n <span className=\"text-sm text-neutral-500 leading-tight line-clamp-1\">\n {event.title}\n </span>\n <span className=\"text-base font-semibold leading-tight line-clamp-1\">\n <span\n className={\n outcome === \"yes\" ? \"text-bullish\" : \"text-bearish\"\n }\n >\n {side === \"buy\"\n ? t(\"predict.trade.buy\")\n : t(\"predict.trade.sell\")}{\" \"}\n {outcome === \"yes\"\n ? t(\"predict.trade.yes\")\n : t(\"predict.trade.no\")}\n </span>\n <span className=\"text-foreground\">\n {\" · \"}\n {market.yesSubTitle}\n </span>\n </span>\n </div>\n </div>\n )}\n\n {/* Market/Limit order-type tabs + current price */}\n <div className=\"flex items-center justify-between\">\n {supportsLimitOrder ? (\n <Tabs\n variant=\"underlined\"\n selectedKey={orderType}\n onSelectionChange={(key) => onOrderTypeChange(key as OrderType)}\n classNames={{\n tabList: \"gap-x-4\",\n tab: \"px-0\",\n }}\n >\n <Tab key=\"market\" title={t(\"predict.trade.market\")} />\n <Tab key=\"limit\" title={t(\"predict.trade.limit\")} />\n </Tabs>\n ) : (\n <span className=\"text-sm font-medium text-foreground\">\n {t(\"predict.trade.market\")}\n </span>\n )}\n {orderType === \"limit\" && supportsLimitOrder ? (\n <StyledNumberInput\n aria-label=\"Limit price\"\n placeholder=\"50\"\n size=\"sm\"\n radius=\"none\"\n value={\n isNaN(limitPrice)\n ? undefined\n : parseFloat((limitPrice * 100).toFixed(2))\n }\n onValueChange={(v) => onLimitPriceChange(v / 100)}\n minValue={1}\n maxValue={99}\n step={1}\n formatOptions={{ maximumFractionDigits: 2 }}\n endContent={\n <span className=\"text-xl font-bold tabular-nums text-foreground\">\n ¢\n </span>\n }\n classNames={{\n base: \"w-28\",\n inputWrapper:\n \"bg-content2 data-[hover=true]:bg-content2 group-data-[focus=true]:bg-content2 rounded-lg px-2 h-9 min-h-9\",\n input: \"text-xl font-bold tabular-nums text-right\",\n }}\n />\n ) : (\n currentPriceCents != null && (\n <span className=\"text-xl font-bold tabular-nums\">\n {currentPriceCents} ¢\n </span>\n )\n )}\n </div>\n\n {/* TODO: unhide when sell flow is ready */}\n {/* <Tabs\n variant=\"underlined\"\n selectedKey={side}\n onSelectionChange={(key) => onSideChange(key as TradeSide)}\n classNames={{\n tabList: \"gap-x-4\",\n tab: \"px-0\",\n }}\n >\n <Tab key=\"buy\" title={t(\"predict.trade.buy\")} />\n <Tab key=\"sell\" title={t(\"predict.trade.sell\")} />\n </Tabs> */}\n\n {/* Outcome: Yes / No */}\n <div className=\"flex gap-x-2\">\n {([\"yes\", \"no\"] as TradeOutcome[]).map((o) => {\n const holdingBalance =\n o === \"yes\" ? yesTokenBalance : noTokenBalance;\n return (\n <div key={o} className=\"flex flex-1 flex-col gap-y-1\">\n <button\n type=\"button\"\n onClick={() => onOutcomeChange(o)}\n className={`w-full rounded-lg border py-2 text-sm font-medium transition-colors cursor-pointer ${\n outcome === o\n ? o === \"yes\"\n ? \"border-primary bg-primary-50 text-primary\"\n : \"border-secondary bg-secondary-50 text-secondary\"\n : \"border-default-400 text-foreground hover:border-default-500\"\n }`}\n >\n <span>\n {o === \"yes\"\n ? t(\"predict.trade.yes\")\n : t(\"predict.trade.no\")}\n </span>\n {(() => {\n const price =\n side === \"buy\"\n ? o === \"yes\"\n ? market.yesAsk\n : market.noAsk\n : o === \"yes\"\n ? market.yesBid\n : market.noBid;\n return price != null ? (\n <span className=\"ml-1 opacity-70\">\n {parseFloat((Number(price) * 100).toFixed(2))}¢\n </span>\n ) : null;\n })()}\n </button>\n {side === \"sell\" && outcome === o && (\n <span className=\"text-center text-xs text-foreground\">\n {isBalanceLoading ? \"–\" : `${holdingBalance ?? 0} shares`}\n </span>\n )}\n </div>\n );\n })}\n </div>\n\n {/* Amount / Shares input */}\n <div className=\"flex flex-col gap-y-1.5\">\n <div className=\"flex items-center justify-between text-xs text-neutral-500\">\n <span className=\"text-sm font-medium text-foreground\">\n {side === \"buy\"\n ? t(\"predict.trade.youArePaying\")\n : t(\"predict.trade.contracts\")}\n </span>\n {side === \"buy\" && (\n <div className=\"flex items-center gap-x-2\">\n <img\n src={USDC_LOGO}\n alt=\"USDC\"\n className=\"h-3.5 w-3.5 rounded-full object-cover\"\n />\n <span className=\"font-medium text-foreground tabular-nums\">\n {usdcBalance != null ? `${usdcBalance.toFixed(2)} USDC` : \"–\"}\n </span>\n <button\n type=\"button\"\n onClick={handleHalf}\n className=\"rounded px-1.5 py-0.5 bg-content2 hover:bg-content3 transition-colors cursor-pointer text-foreground font-medium\"\n >\n {t(\"predict.trade.half\")}\n </button>\n <button\n type=\"button\"\n onClick={handleMax}\n className=\"rounded px-1.5 py-0.5 bg-content2 hover:bg-content3 transition-colors cursor-pointer text-foreground font-medium\"\n >\n {t(\"predict.trade.max\")}\n </button>\n </div>\n )}\n </div>\n <StyledInput\n aria-label=\"Trade amount\"\n fullWidth\n placeholder=\"0\"\n radius=\"lg\"\n size=\"lg\"\n inputMode={side === \"buy\" ? \"decimal\" : \"numeric\"}\n value={quantityText}\n onChange={(e) => handleQuantityInput(e.target.value)}\n onFocus={() => {\n quantityFocusedRef.current = true;\n }}\n onBlur={() => {\n quantityFocusedRef.current = false;\n setQuantityText(isNaN(quantity) ? \"\" : String(quantity));\n }}\n startContent={\n side === \"buy\" ? (\n <span className=\"text-default-600 text-xl\">$</span>\n ) : undefined\n }\n classNames={{\n inputWrapper:\n \"bg-content2 data-[hover=true]:bg-content2 group-data-[focus=true]:bg-content2 h-14 min-h-14\",\n input: \"text-lg\",\n }}\n />\n\n {/* Sell side quick percentage buttons */}\n {side === \"sell\" && (\n <div className=\"flex gap-x-2 justify-end\">\n {[25, 50].map((pct) => (\n <button\n key={pct}\n type=\"button\"\n onClick={() => {\n const bal =\n outcome === \"yes\"\n ? (yesTokenBalance ?? 0)\n : (noTokenBalance ?? 0);\n onQuantityChange(Math.floor((bal * pct) / 100));\n }}\n className=\"rounded-md bg-content2 px-2.5 py-1 text-xs font-medium text-default-600 transition-colors hover:bg-content3 cursor-pointer\"\n >\n {pct}%\n </button>\n ))}\n <button\n type=\"button\"\n onClick={() => {\n const bal =\n outcome === \"yes\"\n ? (yesTokenBalance ?? 0)\n : (noTokenBalance ?? 0);\n onQuantityChange(bal);\n }}\n className=\"rounded-md bg-content2 px-2.5 py-1 text-xs font-medium text-default-600 transition-colors hover:bg-content3 cursor-pointer\"\n >\n {t(\"common.all\")}\n </button>\n </div>\n )}\n\n {showErrors && validationErrors.length > 0 && (\n <div className=\"flex flex-col gap-y-0.5\">\n {validationErrors.map((err) => (\n <span key={err} className=\"text-xs text-danger\">\n {err}\n </span>\n ))}\n </div>\n )}\n </div>\n\n {/* Limit order expiration (GTD) — only for Polymarket limit orders */}\n {orderType === \"limit\" && supportsLimitOrder && (\n <div className=\"flex flex-col gap-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium text-primary\">\n {t(\"predict.trade.setExpiration\")}\n </span>\n <StyledSwitch\n size=\"sm\"\n color=\"primary\"\n isSelected={expirationEnabled}\n onValueChange={onExpirationEnabledChange}\n aria-label={t(\"predict.trade.setExpiration\")}\n />\n </div>\n {expirationEnabled && (\n <>\n <Select\n aria-label={t(\"predict.trade.setExpiration\")}\n selectedKeys={[expirationPreset]}\n onSelectionChange={(keys) => {\n const val = Array.from(keys)[0] as\n | ExpirationPreset\n | undefined;\n if (val) onExpirationPresetChange(val);\n }}\n size=\"sm\"\n radius=\"lg\"\n classNames={{\n trigger:\n \"bg-content2 data-[hover=true]:bg-content2 min-h-10\",\n value: \"text-sm\",\n }}\n >\n {EXPIRATION_PRESETS.map((preset) => (\n <SelectItem key={preset}>\n {t(EXPIRATION_PRESET_I18N[preset])}\n </SelectItem>\n ))}\n </Select>\n {expirationPreset === \"custom\" && (\n <div className=\"flex gap-x-2\">\n <StyledNumberInput\n aria-label=\"Duration amount\"\n size=\"sm\"\n radius=\"lg\"\n value={isNaN(customDuration) ? undefined : customDuration}\n onValueChange={onCustomDurationChange}\n minValue={1}\n step={1}\n formatOptions={{ maximumFractionDigits: 0 }}\n classNames={{\n base: \"flex-1\",\n inputWrapper:\n \"bg-content2 data-[hover=true]:bg-content2 group-data-[focus=true]:bg-content2 min-h-10\",\n input: \"text-sm\",\n }}\n />\n <Select\n aria-label=\"Duration unit\"\n selectedKeys={[customDurationUnit]}\n onSelectionChange={(keys) => {\n const val = Array.from(keys)[0] as\n | DurationUnit\n | undefined;\n if (val) onCustomDurationUnitChange(val);\n }}\n size=\"sm\"\n radius=\"lg\"\n classNames={{\n base: \"w-32\",\n trigger:\n \"bg-content2 data-[hover=true]:bg-content2 min-h-10\",\n value: \"text-sm\",\n }}\n >\n {DURATION_UNITS.map((u) => (\n <SelectItem key={u}>\n {t(DURATION_UNIT_I18N[u])}\n </SelectItem>\n ))}\n </Select>\n </div>\n )}\n </>\n )}\n </div>\n )}\n\n {/* Odds collapsible row */}\n <div className=\"flex flex-col gap-y-2\">\n <div className=\"flex items-center justify-between text-sm\">\n <button\n type=\"button\"\n onClick={() => setShowOdds((v) => !v)}\n className=\"flex items-center gap-x-1 text-neutral-500 hover:text-foreground cursor-pointer transition-colors\"\n >\n <span>{t(\"predict.trade.odds\")}</span>\n <ChevronDownIcon\n className={cn(\n \"h-3.5 w-3.5 transition-transform\",\n showOdds && \"rotate-180\",\n )}\n />\n </button>\n {currentPriceCents != null && (\n <span className=\"text-foreground font-medium tabular-nums\">\n {currentPriceCents}% chance\n </span>\n )}\n </div>\n {showOdds && (\n <div className=\"flex flex-col gap-y-1.5 border-l-2 border-default-300 pl-3 text-sm text-neutral-500\">\n <div className=\"flex items-center justify-between\">\n <span>Total Size</span>\n <span className=\"tabular-nums text-foreground\">\n {!isNaN(quantity) && quantity > 0\n ? `$${estimatedCost.toFixed(2)}`\n : \"–\"}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span>No. of Contracts</span>\n <span className=\"tabular-nums text-foreground\">\n {!isNaN(shares) && shares > 0\n ? parseFloat(shares.toFixed(2))\n : \"–\"}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span>Payout</span>\n <span className=\"tabular-nums text-foreground\">\n {!isNaN(quantity) && quantity > 0\n ? `$${potentialPayout.toFixed(2)}`\n : \"–\"}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span>Est. Profit</span>\n <span className=\"tabular-nums text-bullish\">\n {!isNaN(quantity) && quantity > 0 && potentialProfit > 0\n ? `+$${potentialProfit.toFixed(2)}`\n : \"–\"}\n </span>\n </div>\n </div>\n )}\n </div>\n\n {/* Submit button */}\n <Button\n color={submitColor as \"primary\" | \"secondary\" | \"default\"}\n fullWidth\n radius=\"lg\"\n size=\"lg\"\n isDisabled={isBalanceLoading || !hasAmount || isSubmitting}\n isLoading={isSubmitting || isBalanceLoading}\n spinner={<Spinner size=\"sm\" color=\"current\" />}\n onPress={handleSubmitPress}\n >\n {submitLabel}\n </Button>\n </div>\n\n <KycModal\n isOpen={kycModal.isOpen}\n onClose={kycModal.onClose}\n kycUrl={kycUrl}\n />\n </>\n );\n}\n","import { useMemo } from \"react\";\nimport type { PredictEvent, PredictMarket } from \"@liberfi.io/react-predict\";\nimport { useAuthCallback } from \"@liberfi.io/wallet-connector\";\nimport {\n predictEventToStandard,\n predictMarketToStandard,\n} from \"../../utils/predict-market-adapter\";\nimport {\n useTradeForm,\n type TradeOutcome,\n type TradeSide,\n type ExpirationPreset,\n} from \"./trade-form.script\";\nimport { TradeFormUI } from \"./trade-form.ui\";\n\nexport interface TradeFormWidgetProps {\n event?: PredictEvent;\n market: PredictMarket;\n variant?: \"bordered\" | \"flat\";\n initialSide?: TradeSide;\n initialOutcome?: TradeOutcome;\n chain?: string;\n}\n\nexport function TradeFormWidget({\n event,\n market,\n variant,\n initialSide,\n initialOutcome,\n chain,\n}: TradeFormWidgetProps) {\n const {\n outcome,\n side,\n orderType,\n quantity,\n limitPrice,\n shares,\n estimatedCost,\n potentialPayout,\n potentialProfit,\n usdcBalance,\n yesTokenBalance,\n noTokenBalance,\n isBalanceLoading,\n isSubmitting,\n validation,\n supportsLimitOrder,\n kycRequired,\n kycUrl,\n expirationEnabled,\n expirationPreset,\n customDuration,\n customDurationUnit,\n setOutcome,\n setSide,\n setOrderType,\n setQuantity,\n setLimitPrice,\n setExpirationEnabled,\n setExpirationPreset,\n setCustomDuration,\n setCustomDurationUnit,\n submit,\n } = useTradeForm({\n market,\n initialSide,\n initialOutcome,\n chain,\n });\n\n const authenticatedSubmit = useAuthCallback(submit);\n\n const adaptedEvent = useMemo(\n () => (event ? predictEventToStandard(event) : undefined),\n [event],\n );\n const adaptedMarket = useMemo(\n () => predictMarketToStandard(market),\n [market],\n );\n\n return (\n <TradeFormUI\n event={adaptedEvent}\n market={adaptedMarket}\n variant={variant}\n outcome={outcome}\n side={side}\n orderType={orderType}\n quantity={quantity}\n limitPrice={limitPrice}\n shares={shares}\n estimatedCost={estimatedCost}\n potentialPayout={potentialPayout}\n potentialProfit={potentialProfit}\n usdcBalance={usdcBalance}\n yesTokenBalance={yesTokenBalance}\n noTokenBalance={noTokenBalance}\n isBalanceLoading={isBalanceLoading}\n isSubmitting={isSubmitting}\n isValid={validation.isValid}\n validationErrors={validation.errors}\n supportsLimitOrder={supportsLimitOrder}\n kycRequired={kycRequired}\n kycUrl={kycUrl}\n expirationEnabled={expirationEnabled}\n expirationPreset={expirationPreset}\n customDuration={customDuration}\n customDurationUnit={customDurationUnit}\n onOutcomeChange={setOutcome}\n onSideChange={setSide}\n onOrderTypeChange={setOrderType}\n onQuantityChange={setQuantity}\n onLimitPriceChange={setLimitPrice}\n onExpirationEnabledChange={setExpirationEnabled}\n onExpirationPresetChange={setExpirationPreset}\n onCustomDurationChange={setCustomDuration}\n onCustomDurationUnitChange={setCustomDurationUnit}\n onSubmit={authenticatedSubmit}\n />\n );\n}\n","\"use client\";\n\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent, PredictMarket } from \"@liberfi.io/react-predict\";\nimport { ModalContent, StyledModal, useScreen } from \"@liberfi.io/ui\";\nimport {\n AsyncModal,\n type RenderAsyncModalProps,\n} from \"@liberfi.io/ui-scaffold\";\nimport type { TradeOutcome, TradeSide } from \"./trade-form.script\";\nimport { TradeFormWidget } from \"./trade-form.widget\";\n\nexport type PredictTradeModalParams = {\n event: PredictEvent;\n market: PredictMarket;\n initialOutcome?: TradeOutcome;\n initialSide?: TradeSide;\n chain?: string;\n};\n\nexport type PredictTradeModalResult = void;\n\nexport const PREDICT_TRADE_MODAL_ID = \"predict-trade\";\n\nexport function PredictTradeModal({\n id = PREDICT_TRADE_MODAL_ID,\n}: {\n id?: string;\n}) {\n return (\n <AsyncModal<PredictTradeModalParams, PredictTradeModalResult> id={id}>\n {(modalProps) => <PredictTradeModalContent {...modalProps} />}\n </AsyncModal>\n );\n}\n\nfunction PredictTradeModalContent({\n params,\n isOpen,\n onOpenChange,\n}: RenderAsyncModalProps<PredictTradeModalParams, PredictTradeModalResult>) {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n\n if (!params) return null;\n\n return (\n <StyledModal\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n size={isMobile ? \"lg\" : \"md\"}\n backdrop=\"blur\"\n hideCloseButton\n classNames={{\n base: \"!bg-[#18181b] !rounded-[14px] !border !border-[rgba(39,39,42,1)] !shadow-[0_25px_50px_-12px_rgba(0,0,0,0.5)]\",\n body: \"!p-0\",\n }}\n >\n <ModalContent>\n <div className={isMobile ? \"\" : \"p-2\"}>\n <TradeFormWidget\n event={params.event}\n market={params.market}\n initialOutcome={params.initialOutcome}\n initialSide={params.initialSide ?? \"buy\"}\n chain={params.chain}\n variant=\"flat\"\n />\n <div className=\"px-4 pb-4\">\n <button\n type=\"button\"\n onClick={() => onOpenChange(false)}\n className=\"w-full h-12 rounded-xl text-sm font-medium text-zinc-400 hover:text-white hover:bg-[rgba(39,39,42,0.5)] transition-colors cursor-pointer focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n >\n {t(\"common.cancel\")}\n </button>\n </div>\n </div>\n </ModalContent>\n </StyledModal>\n );\n}\n","// =============================================================================\n// EventsFilterUI\n//\n// Filter modal for the events list. Contains chip-based filter sections:\n// - Platform (source provider)\n// - Time Remaining\n// - Min Volume\n// - Min Liquidity\n//\n// Visual style aligned with the matches page dark zinc theme.\n// Pure presentational component — state is managed by the parent page via\n// a draft-and-apply pattern: the modal works on a draft copy of the filter\n// state, and only commits changes when \"Show Results\" is pressed.\n// =============================================================================\nimport { useState, useCallback, useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { ProviderSource } from \"@liberfi.io/react-predict\";\nimport { StyledModal, ModalContent } from \"@liberfi.io/ui\";\nimport type { SortPreset } from \"./events-toolbar.ui\";\n\n// -----------------------------------------------------------------------------\n// Filter state type\n// -----------------------------------------------------------------------------\n\nexport interface EventsFilterState {\n sortPreset: SortPreset;\n sortAsc: boolean;\n source?: ProviderSource;\n timeRemaining?: string;\n minVolume?: string;\n minLiquidity?: string;\n}\n\nexport const DEFAULT_FILTER_STATE: EventsFilterState = {\n sortPreset: \"volume\",\n sortAsc: false,\n source: undefined,\n timeRemaining: undefined,\n minVolume: undefined,\n minLiquidity: undefined,\n};\n\n/** Count how many non-default filters are active (excluding sortPreset) */\nexport function countActiveFilters(state: EventsFilterState): number {\n let count = 0;\n if (state.source) count++;\n if (state.timeRemaining) count++;\n if (state.minVolume) count++;\n if (state.minLiquidity) count++;\n return count;\n}\n\n// -----------------------------------------------------------------------------\n// Props\n// -----------------------------------------------------------------------------\n\nexport interface EventsFilterUIProps {\n /** Whether the modal is open */\n isOpen: boolean;\n /** Callback to close the modal */\n onClose: () => void;\n /** Current committed filter state */\n value: EventsFilterState;\n /** Callback when \"Show Results\" is pressed with the new filter state */\n onChange: (state: EventsFilterState) => void;\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function EventsFilterUI({\n isOpen,\n onClose,\n value,\n onChange,\n}: EventsFilterUIProps) {\n const { t } = useTranslation();\n\n const [draft, setDraft] = useState<EventsFilterState>(value);\n\n const handleOpenChange = useCallback(\n (open: boolean) => {\n if (open) {\n setDraft(value);\n } else {\n onClose();\n }\n },\n [value, onClose],\n );\n\n const handleReset = useCallback(() => {\n setDraft(DEFAULT_FILTER_STATE);\n }, []);\n\n const handleApply = useCallback(() => {\n onChange(draft);\n onClose();\n }, [draft, onChange, onClose]);\n\n const updateDraft = useCallback(\n <K extends keyof EventsFilterState>(key: K, val: EventsFilterState[K]) => {\n setDraft((prev) => ({ ...prev, [key]: val }));\n },\n [],\n );\n\n const activeCount = useMemo(() => countActiveFilters(draft), [draft]);\n\n const platformOptions = useMemo(\n () => [\n { value: undefined, label: t(\"predict.filter.all\") },\n { value: \"polymarket\" as const, label: t(\"predict.platform.polymarket\") },\n { value: \"kalshi\" as const, label: t(\"predict.platform.kalshi\") },\n ],\n [t],\n );\n\n const timeRemainingOptions = useMemo(\n () => [\n { value: undefined, label: t(\"predict.filter.all\") },\n { value: \"1d\", label: t(\"predict.filter.lessThanDay\") },\n { value: \"7d\", label: t(\"predict.filter.lessThanWeek\") },\n { value: \"30d\", label: t(\"predict.filter.lessThanMonth\") },\n ],\n [t],\n );\n\n const volumeOptions = useMemo(\n () => [\n { value: undefined, label: t(\"predict.filter.all\") },\n { value: \"1000\", label: \">$1K\" },\n { value: \"10000\", label: \">$10K\" },\n { value: \"100000\", label: \">$100K\" },\n { value: \"1000000\", label: \">$1M\" },\n ],\n [t],\n );\n\n const liquidityOptions = useMemo(\n () => [\n { value: undefined, label: t(\"predict.filter.all\") },\n { value: \"1000\", label: \">$1K\" },\n { value: \"10000\", label: \">$10K\" },\n { value: \"100000\", label: \">$100K\" },\n { value: \"1000000\", label: \">$1M\" },\n ],\n [t],\n );\n\n return (\n <StyledModal\n isOpen={isOpen}\n onOpenChange={handleOpenChange}\n size=\"md\"\n backdrop=\"blur\"\n scrollBehavior=\"inside\"\n classNames={{\n base: \"!bg-[#18181b] !rounded-[14px] !border !border-[rgba(39,39,42,1)] !shadow-[0_25px_50px_-12px_rgba(0,0,0,0.5)]\",\n body: \"!p-0\",\n }}\n >\n <ModalContent>\n <div>\n {/* Header */}\n <div className=\"flex items-center justify-between px-5 pt-5 pb-4\">\n <h3 className=\"text-base font-semibold text-white\">\n {t(\"predict.filter.title\")}\n </h3>\n <CloseButton onClick={() => handleOpenChange(false)} />\n </div>\n\n {/* Body */}\n <div\n style={{\n padding: \"0 20px 16px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 20,\n }}\n >\n <FilterSection label={t(\"predict.filter.platform\")}>\n <FilterChipGroup\n options={platformOptions}\n selected={draft.source}\n onSelect={(v) =>\n updateDraft(\"source\", v as ProviderSource | undefined)\n }\n />\n </FilterSection>\n\n <FilterSection label={t(\"predict.filter.timeRemaining\")}>\n <FilterChipGroup\n options={timeRemainingOptions}\n selected={draft.timeRemaining}\n onSelect={(v) => updateDraft(\"timeRemaining\", v)}\n />\n </FilterSection>\n\n <FilterSection label={t(\"predict.filter.minVolume\")}>\n <FilterChipGroup\n options={volumeOptions}\n selected={draft.minVolume}\n onSelect={(v) => updateDraft(\"minVolume\", v)}\n />\n </FilterSection>\n\n <FilterSection label={t(\"predict.filter.minLiquidity\")}>\n <FilterChipGroup\n options={liquidityOptions}\n selected={draft.minLiquidity}\n onSelect={(v) => updateDraft(\"minLiquidity\", v)}\n />\n </FilterSection>\n </div>\n\n {/* Footer */}\n <div\n className=\"flex items-center gap-3 px-5 py-4\"\n style={{ borderTop: \"1px solid rgba(39,39,42,0.5)\" }}\n >\n <button\n type=\"button\"\n className=\"inline-flex items-center justify-center py-2.5 px-5 rounded-[10px] text-zinc-400 text-sm font-medium hover:text-white transition-colors cursor-pointer\"\n onClick={handleReset}\n >\n {t(\"predict.filter.reset\")}\n </button>\n <button\n type=\"button\"\n className=\"flex-1 inline-flex items-center justify-center gap-2 py-2.5 rounded-[10px] bg-[#c7ff2e] text-zinc-900 text-sm font-semibold hover:bg-[#c7ff2e]/90 transition-colors cursor-pointer\"\n onClick={handleApply}\n >\n {t(\"predict.filter.showResults\")}\n {activeCount > 0 && (\n <span style={{ opacity: 0.7 }}>({activeCount})</span>\n )}\n </button>\n </div>\n </div>\n </ModalContent>\n </StyledModal>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Filter section wrapper\n// -----------------------------------------------------------------------------\n\nfunction FilterSection({\n label,\n children,\n}: {\n label: string;\n children: React.ReactNode;\n}) {\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 10 }}>\n <span\n style={{\n fontSize: 11,\n fontWeight: 500,\n color: \"#71717a\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n }}\n >\n {label}\n </span>\n {children}\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// FilterChipGroup — reusable chip selection row\n// -----------------------------------------------------------------------------\n\ninterface ChipOption {\n value: string | undefined;\n label: string;\n}\n\ninterface FilterChipGroupProps {\n options: ChipOption[];\n selected: string | undefined;\n onSelect: (value: string | undefined) => void;\n allowDeselect?: boolean;\n}\n\n// -----------------------------------------------------------------------------\n// Close button (matches KYC modal style)\n// -----------------------------------------------------------------------------\n\nfunction CloseButton({ onClick }: { onClick: () => void }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"p-1 rounded-[10px] hover:bg-[rgba(39,39,42,0.5)] text-zinc-400 hover:text-white transition-colors cursor-pointer focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n >\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n );\n}\n\n// -----------------------------------------------------------------------------\n// FilterChipGroup — reusable chip selection row\n// -----------------------------------------------------------------------------\n\nfunction FilterChipGroup({\n options,\n selected,\n onSelect,\n allowDeselect = true,\n}: FilterChipGroupProps) {\n return (\n <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\n {options.map((opt) => {\n const isActive = selected === opt.value;\n return (\n <button\n key={opt.value ?? \"__all\"}\n type=\"button\"\n onClick={() => {\n if (isActive && allowDeselect) {\n onSelect(undefined);\n } else {\n onSelect(opt.value);\n }\n }}\n style={{\n flexShrink: 0,\n borderRadius: 10,\n padding: \"6px 14px\",\n fontSize: 13,\n fontWeight: 500,\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n border: isActive\n ? \"1px solid rgba(199,255,46,0.3)\"\n : \"1px solid rgba(63,63,70,0.5)\",\n background: isActive\n ? \"rgba(199,255,46,0.08)\"\n : \"rgba(39,39,42,0.4)\",\n color: isActive ? \"#c7ff2e\" : \"#a1a1aa\",\n }}\n onMouseEnter={(e) => {\n if (!isActive) {\n e.currentTarget.style.background = \"rgba(39,39,42,0.8)\";\n e.currentTarget.style.color = \"#fff\";\n }\n }}\n onMouseLeave={(e) => {\n if (!isActive) {\n e.currentTarget.style.background = \"rgba(39,39,42,0.4)\";\n e.currentTarget.style.color = \"#a1a1aa\";\n }\n }}\n >\n {opt.label}\n </button>\n );\n })}\n </div>\n );\n}\n","// =============================================================================\n// EventsHero\n//\n// Brand-focused hero: slogan + feature description (left) and 2x2 stats grid\n// (right). No individual event cards — the hero communicates the platform value\n// proposition and shows aggregate market stats.\n// =============================================================================\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { EventStats } from \"@liberfi.io/react-predict\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\nexport interface EventsHeroProps {\n stats?: EventStats;\n}\n\n// -----------------------------------------------------------------------------\n// Helpers\n// -----------------------------------------------------------------------------\n\nfunction formatCompact(val: number): string {\n if (val >= 1_000_000_000) return `$${(val / 1_000_000_000).toFixed(1)}B`;\n if (val >= 1_000_000) return `$${(val / 1_000_000).toFixed(1)}M`;\n if (val >= 1_000) return `$${(val / 1_000).toFixed(1)}K`;\n return `$${val.toFixed(0)}`;\n}\n\n// -----------------------------------------------------------------------------\n// Stat card config — matches the Matches hero color palette (theme colors)\n// -----------------------------------------------------------------------------\n\nconst STAT_CARDS: {\n key: keyof EventStats;\n labelKey: string;\n format: (v: number) => string;\n valueColor: string;\n gradientFrom: string;\n gradientTo: string;\n}[] = [\n {\n key: \"total_events\",\n labelKey: \"predict.events.stats.totalEvents\",\n format: (v) => v.toLocaleString(),\n valueColor: \"#c7ff2e\",\n gradientFrom: \"rgba(199,255,46,0.18)\",\n gradientTo: \"rgba(199,255,46,0.04)\",\n },\n {\n key: \"total_volume_24h\",\n labelKey: \"predict.events.stats.volume24h\",\n format: formatCompact,\n valueColor: \"#f76816\",\n gradientFrom: \"rgba(247,104,22,0.18)\",\n gradientTo: \"rgba(247,104,22,0.04)\",\n },\n {\n key: \"avg_liquidity\",\n labelKey: \"predict.events.stats.avgLiquidity\",\n format: formatCompact,\n valueColor: \"#17c964\",\n gradientFrom: \"rgba(23,201,100,0.18)\",\n gradientTo: \"rgba(23,201,100,0.04)\",\n },\n {\n key: \"active_sources\",\n labelKey: \"predict.events.stats.activeSources\",\n format: (v) => v.toLocaleString(),\n valueColor: \"#f5a524\",\n gradientFrom: \"rgba(245,165,36,0.18)\",\n gradientTo: \"rgba(245,165,36,0.04)\",\n },\n];\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function EventsHero({ stats }: EventsHeroProps) {\n const { t } = useTranslation();\n\n return (\n <>\n <style>{`\n@keyframes evt-live-ping{75%,100%{transform:scale(2.2);opacity:0}}\n@keyframes evt-live-breathe{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.55;transform:scale(.85)}}\n@keyframes evtHeroTitleEnter{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}\n@keyframes evtStatsEnter{from{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}\n@keyframes evtStatCardEnter{from{opacity:0;transform:translateY(8px) scale(0.97)}to{opacity:1;transform:translateY(0) scale(1)}}\n\n.evt-hero-outer{display:flex;flex-direction:column;align-items:center;text-align:center;gap:28px}\n@media(min-width:640px){.evt-hero-outer{flex-direction:row;align-items:center;text-align:left;gap:40px}}\n@media(min-width:1024px){.evt-hero-outer{gap:56px}}\n\n.evt-hero-left{display:flex;flex-direction:column;align-items:center}\n@media(min-width:640px){.evt-hero-left{align-items:flex-start}}\n\n.evt-hero-live{display:flex;justify-content:center}\n@media(min-width:640px){.evt-hero-live{justify-content:flex-start}}\n\n.evt-hero-subtitle-text{text-align:center;margin:0 auto}\n@media(min-width:640px){.evt-hero-subtitle-text{text-align:left;margin:0}}\n\n.evt-hero-title{font-size:32px!important;line-height:1.2!important}\n@media(min-width:640px){.evt-hero-title{font-size:38px!important}}\n@media(min-width:1024px){.evt-hero-title{font-size:46px!important}}\n\n.evt-hero-subtitle{font-size:14px}\n@media(min-width:640px){.evt-hero-subtitle{font-size:15px}}\n\n.evt-stat-grid{display:grid;grid-template-columns:repeat(2,1fr);width:100%;max-width:360px;border-radius:16px;border:1px solid rgba(39,39,42,0.5);overflow:hidden;flex-shrink:0;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}\n@media(min-width:640px){.evt-stat-grid{width:340px;max-width:none}}\n@media(min-width:1024px){.evt-stat-grid{width:380px}}\n\n.evt-stat-val{font-size:18px;line-height:24px;min-height:24px}\n@media(min-width:640px){.evt-stat-val{font-size:20px;line-height:28px;min-height:28px}}\n@media(min-width:1024px){.evt-stat-val{font-size:22px;line-height:30px;min-height:30px}}\n\n.evt-stat-label{font-size:11px;line-height:16px;min-height:16px;white-space:nowrap}\n@media(min-width:640px){.evt-stat-label{font-size:12px;line-height:18px;min-height:18px}}\n`}</style>\n\n <div className=\"evt-hero-outer\">\n {/* Left: title group */}\n <div\n className=\"evt-hero-left\"\n style={{\n minWidth: 0,\n flex: 1,\n animation:\n \"evtHeroTitleEnter 0.5s cubic-bezier(0.34,1.56,0.64,1) both\",\n }}\n >\n {/* Live badge */}\n <div className=\"evt-hero-live\" style={{ marginBottom: 16 }}>\n <div\n className=\"inline-flex items-center\"\n style={{\n gap: 8,\n borderRadius: 9999,\n border: \"1px solid rgba(63,63,70,0.5)\",\n background: \"rgba(39,39,42,0.6)\",\n padding: \"6px 12px\",\n backdropFilter: \"blur(8px)\",\n WebkitBackdropFilter: \"blur(8px)\",\n }}\n >\n <span\n style={{\n position: \"relative\",\n display: \"flex\",\n width: 8,\n height: 8,\n }}\n >\n <span\n style={{\n position: \"absolute\",\n display: \"inline-flex\",\n width: \"100%\",\n height: \"100%\",\n borderRadius: 9999,\n background: \"#00d492\",\n opacity: 0.75,\n animation:\n \"evt-live-ping 1.2s cubic-bezier(0,0,0.2,1) infinite\",\n }}\n />\n <span\n style={{\n position: \"relative\",\n display: \"inline-flex\",\n width: 8,\n height: 8,\n borderRadius: 9999,\n background: \"#00bc7d\",\n animation: \"evt-live-breathe 2.4s ease-in-out infinite\",\n }}\n />\n </span>\n <span\n style={{\n fontSize: 12,\n fontWeight: 500,\n color: \"#d4d4d8\",\n letterSpacing: \"0.025em\",\n }}\n >\n {t(\"predict.events.liveBadge\" as never)}\n </span>\n </div>\n </div>\n\n {/* Title */}\n <h1\n className=\"evt-hero-title\"\n style={{\n fontFamily: \"var(--font-dm-sans, 'DM Sans', sans-serif)\",\n fontWeight: 700,\n letterSpacing: \"-1.2px\",\n lineHeight: 1.2,\n color: \"#fff\",\n margin: \"0 0 14px\",\n }}\n >\n <span style={{ color: \"#fff\" }}>\n {t(\"predict.events.titlePrefix\" as never)}{\" \"}\n </span>\n <span\n style={{\n backgroundImage:\n \"linear-gradient(to right, #c7ff2e, #a0e515, #17c964)\",\n WebkitBackgroundClip: \"text\",\n WebkitTextFillColor: \"transparent\",\n backgroundClip: \"text\",\n }}\n >\n {t(\"predict.events.titleHighlight\" as never)}\n </span>\n </h1>\n\n {/* Subtitle */}\n <p\n className=\"evt-hero-subtitle evt-hero-subtitle-text\"\n style={{ lineHeight: 1.6, color: \"#71717a\", maxWidth: 460 }}\n >\n {String(t(\"predict.events.heroSubtitle\" as never))\n .split(\"\\n\")\n .map((line: string, i: number) => (\n <span key={i}>\n {i > 0 && <br className=\"hidden sm:block\" />}\n {line}\n {i === 0 ? \" \" : \"\"}\n </span>\n ))}\n </p>\n </div>\n\n {/* Right: 2x2 stats grid */}\n <div\n className=\"evt-stat-grid\"\n style={\n stats\n ? {\n animation:\n \"evtStatsEnter 0.5s cubic-bezier(0.34,1.56,0.64,1) both\",\n animationDelay: \"0.1s\",\n }\n : {}\n }\n >\n {STAT_CARDS.map((card, idx) => (\n <div\n key={card.key}\n style={{\n padding: \"14px 16px\",\n background: stats\n ? `linear-gradient(to bottom, ${card.gradientFrom}, ${card.gradientTo})`\n : \"rgba(255,255,255,0.02)\",\n borderRight:\n idx % 2 === 0 ? \"1px solid rgba(39,39,42,0.4)\" : \"none\",\n borderBottom: idx < 2 ? \"1px solid rgba(39,39,42,0.4)\" : \"none\",\n ...(stats\n ? {\n animation:\n \"evtStatCardEnter 0.45s cubic-bezier(0.34,1.56,0.64,1) both\",\n animationDelay: `${150 + idx * 60}ms`,\n }\n : {}),\n }}\n >\n <div\n className=\"evt-stat-val\"\n style={{\n fontWeight: 700,\n fontVariantNumeric: \"tabular-nums\",\n color: stats ? card.valueColor : \"transparent\",\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n {stats ? (\n card.format(stats[card.key])\n ) : (\n <div\n style={{\n height: 16,\n width: 56,\n borderRadius: 4,\n background: \"rgba(255,255,255,0.06)\",\n animation: \"evtStatCardEnter 0.6s ease-out both\",\n animationDelay: `${idx * 80}ms`,\n }}\n />\n )}\n </div>\n <div\n className=\"evt-stat-label\"\n style={{\n fontWeight: 500,\n color: stats ? \"#71717a\" : \"transparent\",\n marginTop: 2,\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n {stats ? (\n t(card.labelKey as never)\n ) : (\n <div\n style={{\n height: 10,\n width: 64,\n borderRadius: 4,\n background: \"rgba(255,255,255,0.04)\",\n animation: \"evtStatCardEnter 0.6s ease-out both\",\n animationDelay: `${50 + idx * 80}ms`,\n }}\n />\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n </>\n );\n}\n","// =============================================================================\n// EventsToolbarUI\n//\n// Toolbar bar between categories and the events grid. Contains:\n// - Sort pill: sort-field dropdown + ascending/descending toggle\n// - Filter button with active-filter badge\n//\n// Visual style aligned with the matches filter bar (dark zinc theme).\n// Pure presentational component — state is managed by the parent page.\n// =============================================================================\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { EventSortField } from \"@liberfi.io/react-predict\";\nimport {\n CalendarIcon,\n ChartLineIcon,\n DropletIcon,\n TimerIcon,\n} from \"@liberfi.io/ui\";\n\n// -----------------------------------------------------------------------------\n// Sort presets\n// -----------------------------------------------------------------------------\n\nexport type SortPreset = \"start_time\" | \"volume\" | \"liquidity\" | \"ending_soon\";\n\nexport const SORT_PRESETS: Record<SortPreset, { sort_by: EventSortField }> = {\n start_time: { sort_by: \"created_at\" },\n volume: { sort_by: \"volume\" },\n liquidity: { sort_by: \"liquidity\" },\n ending_soon: { sort_by: \"end_at\" },\n};\n\nconst SORT_LABEL_KEYS = {\n start_time: \"predict.sort.startTime\",\n volume: \"predict.sort.volume\",\n liquidity: \"predict.sort.liquidity\",\n ending_soon: \"predict.sort.endingSoon\",\n} as const;\n\nconst SORT_ORDER: SortPreset[] = [\n \"start_time\",\n \"volume\",\n \"liquidity\",\n \"ending_soon\",\n];\n\n// -----------------------------------------------------------------------------\n// Shared inline styles (matches filter bar theme)\n// -----------------------------------------------------------------------------\n\nconst btnBase: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n borderRadius: 10,\n border: \"1px solid rgba(63,63,70,0.5)\",\n background: \"rgba(39,39,42,0.6)\",\n padding: \"8px 12px\",\n fontSize: 14,\n color: \"#d4d4d8\",\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n};\n\nconst dropdownBase: React.CSSProperties = {\n position: \"absolute\",\n left: 0,\n top: \"100%\",\n zIndex: 20,\n marginTop: 8,\n borderRadius: 14,\n border: \"1px solid rgba(39,39,42,1)\",\n background: \"rgba(24,24,27,1)\",\n boxShadow: \"0 25px 50px -12px rgba(0,0,0,0.5)\",\n overflow: \"hidden\",\n};\n\n// -----------------------------------------------------------------------------\n// Props\n// -----------------------------------------------------------------------------\n\nexport interface EventsToolbarUIProps {\n /** Currently active sort preset */\n sortPreset: SortPreset;\n /** Callback when the user picks a different sort preset */\n onSortChange: (preset: SortPreset) => void;\n /** Current sort direction: true = ascending, false = descending */\n sortAsc: boolean;\n /** Callback when the user toggles the sort direction */\n onSortAscChange: (asc: boolean) => void;\n /** Callback when the filter button is pressed */\n onFilterPress: () => void;\n /** Number of currently active filters (shown as badge count) */\n filterCount?: number;\n /** Optional class name for the root element */\n className?: string;\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function EventsToolbarUI({\n sortPreset,\n onSortChange,\n sortAsc,\n onSortAscChange,\n onFilterPress,\n filterCount = 0,\n className,\n}: EventsToolbarUIProps) {\n const { t } = useTranslation();\n const [isOpen, setIsOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n const handleClickOutside = useCallback((e: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(e.target as Node)\n ) {\n setIsOpen(false);\n }\n }, []);\n\n useEffect(() => {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [handleClickOutside]);\n\n useEffect(() => {\n if (!isOpen) return;\n const onEscape = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setIsOpen(false);\n };\n document.addEventListener(\"keydown\", onEscape);\n return () => document.removeEventListener(\"keydown\", onEscape);\n }, [isOpen]);\n\n const ActiveIcon = SORT_ICONS[sortPreset];\n\n return (\n <div\n className={className}\n style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}\n >\n {/* Sort dropdown */}\n <div ref={dropdownRef} style={{ position: \"relative\" }}>\n <button\n type=\"button\"\n style={btnBase}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,1)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,0.6)\";\n }}\n onClick={() => setIsOpen((v) => !v)}\n >\n <SortIcon />\n <ActiveIcon\n className=\"size-4 shrink-0\"\n style={{ color: \"#a1a1aa\" }}\n />\n <span className=\"hidden sm:block\" style={{ color: \"#d4d4d8\" }}>\n {t(SORT_LABEL_KEYS[sortPreset])}\n </span>\n <ChevronDown open={isOpen} />\n </button>\n\n {isOpen && (\n <div style={{ ...dropdownBase, width: 224, padding: 4 }}>\n {SORT_ORDER.map((key) => {\n const Icon = SORT_ICONS[key];\n const isActive = sortPreset === key;\n return (\n <button\n key={key}\n type=\"button\"\n style={{\n display: \"flex\",\n width: \"100%\",\n alignItems: \"center\",\n gap: 12,\n padding: \"10px 12px\",\n textAlign: \"left\",\n fontSize: 14,\n border: \"none\",\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n background: isActive\n ? \"rgba(199,255,46,0.08)\"\n : \"transparent\",\n color: isActive ? \"#c7ff2e\" : \"#a1a1aa\",\n borderRadius: 10,\n }}\n onMouseEnter={(e) => {\n if (!isActive) {\n e.currentTarget.style.background = \"rgba(39,39,42,0.5)\";\n e.currentTarget.style.color = \"#fff\";\n }\n }}\n onMouseLeave={(e) => {\n if (!isActive) {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"#a1a1aa\";\n }\n }}\n onClick={() => {\n if (sortPreset === key) {\n onSortAscChange(!sortAsc);\n } else {\n onSortChange(key);\n }\n setIsOpen(false);\n }}\n >\n <Icon\n className=\"size-4 shrink-0\"\n style={{ color: isActive ? \"#c7ff2e\" : \"#71717a\" }}\n />\n <span style={{ flex: 1, fontWeight: 500 }}>\n {t(SORT_LABEL_KEYS[key])}\n </span>\n {isActive && (\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 16,\n height: 16,\n color: \"#c7ff2e\",\n flexShrink: 0,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n )}\n </button>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Sort direction toggle */}\n <button\n type=\"button\"\n style={{\n borderRadius: 10,\n border: \"1px solid rgba(63,63,70,0.5)\",\n background: \"rgba(39,39,42,0.6)\",\n width: 36,\n height: 36,\n color: \"#a1a1aa\",\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: 14,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,1)\";\n e.currentTarget.style.color = \"#fff\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,0.6)\";\n e.currentTarget.style.color = \"#a1a1aa\";\n }}\n onClick={() => onSortAscChange(!sortAsc)}\n >\n {sortAsc ? \"↑\" : \"↓\"}\n </button>\n\n {/* Filter button */}\n <div style={{ position: \"relative\", display: \"inline-flex\" }}>\n <button\n type=\"button\"\n style={btnBase}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,1)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,0.6)\";\n }}\n onClick={onFilterPress}\n >\n <FilterBarIcon />\n <span className=\"hidden sm:block\" style={{ color: \"#d4d4d8\" }}>\n {t(\"predict.filter.title\")}\n </span>\n </button>\n {filterCount > 0 && (\n <span\n style={{\n position: \"absolute\",\n top: -4,\n right: -4,\n minWidth: 16,\n height: 16,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: 8,\n background: \"#c7ff2e\",\n color: \"#000\",\n fontSize: 10,\n fontWeight: 600,\n padding: \"0 4px\",\n }}\n >\n {filterCount}\n </span>\n )}\n </div>\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Sort option icon map\n// -----------------------------------------------------------------------------\n\nconst SORT_ICONS: Record<\n SortPreset,\n React.FC<{ className?: string; style?: React.CSSProperties }>\n> = {\n start_time: CalendarIcon,\n volume: ChartLineIcon,\n liquidity: DropletIcon,\n ending_soon: TimerIcon,\n};\n\n// -----------------------------------------------------------------------------\n// Inline SVG icons\n// -----------------------------------------------------------------------------\n\nfunction SortIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 14, height: 14, color: \"#a1a1aa\" }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m21 16-4 4-4-4\" />\n <path d=\"M17 20V4\" />\n <path d=\"m3 8 4-4 4 4\" />\n <path d=\"M7 4v16\" />\n </svg>\n );\n}\n\nfunction FilterBarIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 14, height: 14, color: \"#a1a1aa\" }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z\" />\n </svg>\n );\n}\n\nfunction ChevronDown({ open }: { open: boolean }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 14,\n height: 14,\n color: \"#71717a\",\n transition: \"transform 0.15s\",\n transform: open ? \"rotate(180deg)\" : undefined,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n );\n}\n","// =============================================================================\n// Events list script\n//\n// Composes resolveEventsParams() and useInfiniteEvents() from @liberfi.io/react-predict.\n// Owns flattened page data and fetchMore / hasMore helpers for the events grid UI.\n// =============================================================================\nimport { useMemo, useCallback } from \"react\";\nimport type {\n PredictEvent,\n ListEventsParams,\n ResolveEventsParamsInput,\n} from \"@liberfi.io/react-predict\";\nimport {\n resolveEventsParams,\n useInfiniteEvents as usePredictInfiniteEvents,\n} from \"@liberfi.io/react-predict\";\n\nexport type {\n PredictEvent,\n ListEventsParams,\n PredictPage,\n EventSortField,\n EventStatus,\n ProviderSource,\n ResolveEventsParamsInput,\n} from \"@liberfi.io/react-predict\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\n/** Parameters for useEventsInfinite */\nexport type UseEventsInfiniteParams = ResolveEventsParamsInput;\n\n/** Return value of useEventsInfinite */\nexport interface UseEventsInfiniteResult {\n data: PredictEvent[];\n isLoading: boolean;\n isFetching: boolean;\n isFetchingMore: boolean;\n isError: boolean;\n error: Error | null;\n hasMore: boolean;\n fetchMore: () => void;\n refetch: () => void;\n}\n\n// -----------------------------------------------------------------------------\n// Hook\n// -----------------------------------------------------------------------------\n\n/**\n * Infinite events list hook with flattened pages for virtualized grids.\n *\n * Wraps {@link useInfiniteEvents} from `@liberfi.io/react-predict` and exposes\n * a single `data` array plus loading helpers matching legacy list-hook ergonomics.\n */\nexport function useEventsInfinite(\n params: UseEventsInfiniteParams = {},\n): UseEventsInfiniteResult {\n const baseParams = useMemo<ListEventsParams>(\n () => resolveEventsParams(params),\n [\n params.tagSlugSelection,\n params.limit,\n params.status,\n params.sort_by,\n params.sort_asc,\n params.source,\n params.with_markets,\n params.minVolume,\n params.minLiquidity,\n params.timeRemaining,\n ],\n );\n\n const {\n data: infiniteData,\n isLoading,\n isFetching,\n isFetchingNextPage: isFetchingMore,\n isError,\n error,\n hasNextPage: hasMore,\n fetchNextPage,\n refetch,\n } = usePredictInfiniteEvents(baseParams);\n\n const data = useMemo(\n () =>\n infiniteData?.pages\n .flatMap((page) => page.items)\n .filter((item): item is PredictEvent => item != null) ?? [],\n [infiniteData],\n );\n\n const fetchMore = useCallback(() => {\n void fetchNextPage();\n }, [fetchNextPage]);\n\n const refetchAll = useCallback(() => {\n void refetch();\n }, [refetch]);\n\n return {\n data,\n isLoading,\n isFetching: isFetching && !isFetchingMore,\n isFetchingMore,\n isError,\n error: error ?? null,\n hasMore: hasMore ?? false,\n fetchMore,\n refetch: refetchAll,\n };\n}\n","import { DEFAULT_PAGE_SIZE } from \"../../consts\";\n\n// ---------------------------------------------------------------------------\n// Shimmer animation keyframes (injected once per mount)\n// ---------------------------------------------------------------------------\n\nconst SHIMMER_CSS = `\n@keyframes evtShimmer{0%{background-position:200% 0}100%{background-position:-200% 0}}\n@media(max-width:1279px){.evt-skel-grid{grid-template-columns:repeat(3,1fr)!important}}\n@media(max-width:1023px){.evt-skel-grid{grid-template-columns:repeat(2,1fr)!important}.evt-skel-card{min-height:200px!important}}\n@media(max-width:767px){.evt-skel-grid{grid-template-columns:1fr!important}}\n.evt-skel-hero-outer{display:flex;flex-direction:column;align-items:center;gap:28px}\n@media(min-width:640px){.evt-skel-hero-outer{flex-direction:row;align-items:center;gap:40px}}\n@media(min-width:1024px){.evt-skel-hero-outer{gap:56px}}\n.evt-skel-hero-left{display:flex;flex-direction:column;align-items:center}\n@media(min-width:640px){.evt-skel-hero-left{align-items:flex-start}}\n.evt-skel-stat-grid{display:grid;grid-template-columns:repeat(2,1fr);width:100%;max-width:360px;border-radius:16px;border:1px solid rgba(39,39,42,0.5);overflow:hidden;flex-shrink:0}\n@media(min-width:640px){.evt-skel-stat-grid{width:340px;max-width:none}}\n@media(min-width:1024px){.evt-skel-stat-grid{width:380px}}\n.evt-skel-hero-wrap{padding:40px 16px 32px}\n@media(min-width:640px){.evt-skel-hero-wrap{padding:48px 24px 40px}}\n@media(min-width:1024px){.evt-skel-hero-wrap{padding:52px 32px 44px}}\n`;\n\nconst shimmer: React.CSSProperties = {\n background:\n \"linear-gradient(90deg, rgba(255,255,255,0.03) 25%, rgba(255,255,255,0.06) 50%, rgba(255,255,255,0.03) 75%)\",\n backgroundSize: \"200% 100%\",\n animation: \"evtShimmer 1.8s ease-in-out infinite\",\n borderRadius: 6,\n};\n\nfunction shimmerDelay(delay: number): React.CSSProperties {\n return {\n ...shimmer,\n animationDelay: `${delay}ms`,\n };\n}\n\n// ---------------------------------------------------------------------------\n// EventsSkeleton — card grid skeleton matching EventItem layout\n// ---------------------------------------------------------------------------\n\nexport interface EventsSkeletonProps {\n count?: number;\n}\n\nexport function EventsSkeleton({ count = 6 }: EventsSkeletonProps) {\n return (\n <>\n <style>{SHIMMER_CSS}</style>\n <div\n className=\"evt-skel-grid\"\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(4, 1fr)\",\n width: \"100%\",\n }}\n >\n {Array.from({ length: count }).map((_, i) => (\n <SkeletonCard key={i} index={i} />\n ))}\n </div>\n </>\n );\n}\n\n// ---------------------------------------------------------------------------\n// SkeletonCard — mirrors EventItem: header + 3 outcome rows + footer\n// ---------------------------------------------------------------------------\n\nfunction SkeletonCard({ index }: { index: number }) {\n const delay = index * 120;\n const s: React.CSSProperties = {\n ...shimmer,\n animationDelay: `${delay}ms`,\n };\n\n const titleWidth = index % 3 === 0 ? \"85%\" : index % 3 === 1 ? \"70%\" : \"60%\";\n\n return (\n <div style={{ padding: 8 }}>\n <div\n className=\"evt-skel-card\"\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n minHeight: 248,\n borderRadius: 14,\n border: \"1px solid rgba(39,39,42,0.6)\",\n background: \"rgba(24,24,27,0.4)\",\n overflow: \"hidden\",\n }}\n >\n {/* Header: avatar + title */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n padding: \"14px 14px 8px\",\n }}\n >\n <div\n style={{\n ...s,\n width: 36,\n height: 36,\n borderRadius: 10,\n flexShrink: 0,\n }}\n />\n <div\n style={{\n flex: 1,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 6,\n }}\n >\n <div style={{ ...s, height: 12, width: titleWidth }} />\n <div style={{ ...s, height: 10, width: \"40%\" }} />\n </div>\n </div>\n\n {/* Body: 3 outcome rows */}\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 6,\n padding: \"4px 14px 14px\",\n flex: 1,\n }}\n >\n {[0, 1, 2].map((j) => (\n <div\n key={j}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 8,\n }}\n >\n <div\n style={{\n ...s,\n height: 11,\n width: j === 0 ? \"55%\" : j === 1 ? \"45%\" : \"35%\",\n }}\n />\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\n <div style={{ ...s, height: 11, width: 32 }} />\n <div\n style={{\n ...s,\n height: 28,\n width: 80,\n borderRadius: 8,\n }}\n />\n </div>\n </div>\n ))}\n </div>\n\n {/* Footer */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n borderTop: \"1px solid rgba(39,39,42,0.5)\",\n background: \"rgba(39,39,42,0.15)\",\n padding: \"8px 14px\",\n }}\n >\n <div style={{ ...s, height: 10, width: 56 }} />\n <div style={{ ...s, height: 10, width: 72 }} />\n </div>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// HeroSkeleton — left-right layout: slogan left, 2x2 stats grid right\n// ---------------------------------------------------------------------------\n\nfunction HeroSkeleton() {\n return (\n <div\n style={{\n position: \"relative\",\n overflow: \"hidden\",\n borderBottom: \"1px solid rgba(39,39,42,0.5)\",\n width: \"100vw\",\n marginLeft: \"calc(-50vw + 50%)\",\n }}\n >\n {/* Background dots */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n opacity: 0.025,\n backgroundImage:\n \"radial-gradient(circle at 1px 1px, rgb(255 255 255) 1px, transparent 0)\",\n backgroundSize: \"20px 20px\",\n pointerEvents: \"none\",\n }}\n />\n <div\n className=\"evt-skel-hero-wrap\"\n style={{\n position: \"relative\",\n zIndex: 1,\n maxWidth: 1152,\n margin: \"0 auto\",\n }}\n >\n <div className=\"evt-skel-hero-outer\">\n {/* Left: badge + title + subtitle */}\n <div\n className=\"evt-skel-hero-left\"\n style={{ minWidth: 0, flex: 1, gap: 16 }}\n >\n {/* Badge */}\n <div\n style={{\n ...shimmerDelay(0),\n width: 120,\n height: 28,\n borderRadius: 9999,\n }}\n />\n {/* Title lines */}\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n }}\n >\n <div\n style={{\n ...shimmerDelay(50),\n width: 280,\n height: 28,\n borderRadius: 8,\n }}\n />\n <div\n style={{\n ...shimmerDelay(80),\n width: 200,\n height: 28,\n borderRadius: 8,\n }}\n />\n </div>\n {/* Subtitle lines */}\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 6,\n }}\n >\n <div\n style={{\n ...shimmerDelay(120),\n height: 14,\n width: 360,\n maxWidth: \"100%\",\n }}\n />\n <div\n style={{\n ...shimmerDelay(150),\n height: 14,\n width: 300,\n maxWidth: \"100%\",\n }}\n />\n </div>\n </div>\n\n {/* Right: 2x2 stats grid */}\n <div className=\"evt-skel-stat-grid\">\n {[0, 1, 2, 3].map((idx) => (\n <div\n key={idx}\n style={{\n padding: \"14px 16px\",\n background: \"rgba(255,255,255,0.02)\",\n borderRight:\n idx % 2 === 0 ? \"1px solid rgba(39,39,42,0.4)\" : \"none\",\n borderBottom:\n idx < 2 ? \"1px solid rgba(39,39,42,0.4)\" : \"none\",\n }}\n >\n <div\n style={{\n ...shimmerDelay(200 + idx * 60),\n height: 22,\n width: 56,\n borderRadius: 4,\n }}\n />\n <div\n style={{\n ...shimmerDelay(230 + idx * 60),\n height: 14,\n width: 64,\n borderRadius: 4,\n marginTop: 4,\n }}\n />\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// CategoriesToolbarSkeleton — matches CategoriesUI container styles\n// ---------------------------------------------------------------------------\n\nfunction CategoriesToolbarSkeleton() {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"10px 16px\",\n borderBottom: \"1px solid rgba(39,39,42,0.3)\",\n background: \"rgba(10,10,11,0.8)\",\n }}\n >\n {/* Category tabs */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n minHeight: 40,\n flex: 1,\n }}\n >\n {[48, 64, 48, 56, 72, 56].map((w, i) => (\n <div\n key={i}\n style={{\n ...shimmerDelay(i * 50),\n height: 28,\n width: w,\n borderRadius: 6,\n }}\n />\n ))}\n </div>\n\n {/* Toolbar buttons */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n flexShrink: 0,\n }}\n >\n <div\n style={{\n ...shimmerDelay(0),\n height: 36,\n width: 120,\n borderRadius: 10,\n }}\n />\n <div\n style={{\n ...shimmerDelay(50),\n height: 36,\n width: 36,\n borderRadius: 10,\n }}\n />\n <div\n style={{\n ...shimmerDelay(100),\n height: 36,\n width: 80,\n borderRadius: 10,\n }}\n />\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// EventsPageSkeleton — full page: hero + categories + toolbar + card grid\n// ---------------------------------------------------------------------------\n\nexport interface EventsPageSkeletonProps extends EventsSkeletonProps {}\n\nexport function EventsPageSkeleton({\n count = DEFAULT_PAGE_SIZE,\n}: EventsPageSkeletonProps) {\n return (\n <div\n style={{\n minHeight: \"100vh\",\n position: \"relative\",\n width: \"100%\",\n maxWidth: 1680,\n margin: \"0 auto\",\n }}\n >\n <style>{SHIMMER_CSS}</style>\n\n {/* Hero skeleton */}\n <HeroSkeleton />\n\n {/* Categories + toolbar skeleton */}\n <CategoriesToolbarSkeleton />\n\n {/* Card grid skeleton */}\n <div style={{ padding: \"12px 8px 80px\" }}>\n <EventsSkeleton count={count} />\n </div>\n </div>\n );\n}\n","// =============================================================================\n// EventItem\n//\n// Event card with three modes:\n// 1. **List view** — header + up to 3 outcome rows with a compact Yes/No\n// pill + footer (Show More / volume).\n// 2. **Single view** — header + single market with large Yes/No buy\n// buttons + View Event link.\n// 3. **Expanded view** — header + single market with large Yes/No buy\n// buttons + Back link.\n//\n// Pixel-perfect clone of the Jupiter Prediction Market card design.\n// =============================================================================\nimport { useMemo, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type {\n PredictEvent,\n PredictMarket,\n ProviderSource,\n} from \"@liberfi.io/react-predict\";\nimport {\n Avatar,\n ChevronUpIcon,\n cn,\n KalshiIcon,\n Linkable,\n PolymarketIcon,\n TimerIcon,\n} from \"@liberfi.io/ui\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\nexport type EventItemProps = {\n event: PredictEvent;\n /** URL for the detail page. When set, header / Show More render as links. */\n href?: string;\n /** Custom link component (e.g. next/link). Passed to Linkable. */\n LinkComponent?: LinkComponentType;\n onSelect?: (event: PredictEvent) => void;\n onSelectOutcome?: (\n event: PredictEvent,\n market: PredictMarket,\n side: \"yes\" | \"no\",\n ) => void;\n /** Called when the card is hovered (for data prefetching). */\n onHover?: (event: PredictEvent) => void;\n};\n\n// -----------------------------------------------------------------------------\n// Constants\n// -----------------------------------------------------------------------------\n\nconst MAX_DISPLAYED_OUTCOMES = 3;\n\n// -----------------------------------------------------------------------------\n// Platform-specific hover glow colors\n// -----------------------------------------------------------------------------\n\ntype GlowColor = { border: string; shadow: string };\n\nconst SOURCE_GLOW: Record<string, GlowColor> = {\n polymarket: {\n border: \"rgba(80,162,255,0.4)\",\n shadow: \"0 2px 18px rgba(80,162,255,0.45)\",\n },\n kalshi: {\n border: \"rgba(0,212,146,0.4)\",\n shadow: \"0 2px 18px rgba(0,212,146,0.45)\",\n },\n};\n\nconst GLOW_FALLBACK: GlowColor = {\n border: \"hsl(var(--heroui-primary) / 0.4)\",\n shadow: \"0 2px 18px hsl(var(--heroui-primary) / 0.45)\",\n};\n\n// -----------------------------------------------------------------------------\n// Outcome color scheme — 8-color palette with deterministic hash selection\n// -----------------------------------------------------------------------------\n\ntype OutcomeColor = { bg: string; text: string; shadow: string };\n\nconst C_PRIMARY: OutcomeColor = {\n bg: \"hsl(var(--heroui-primary) / 0.14)\",\n text: \"hsl(var(--heroui-primary))\",\n shadow: \"hsl(var(--heroui-primary) / 0.18)\",\n};\n\nconst C_SECONDARY: OutcomeColor = {\n bg: \"hsl(var(--heroui-secondary) / 0.14)\",\n text: \"hsl(var(--heroui-secondary))\",\n shadow: \"hsl(var(--heroui-secondary) / 0.18)\",\n};\n\nconst C_RED: OutcomeColor = {\n bg: \"rgba(239, 68, 68, 0.14)\",\n text: \"rgb(239, 68, 68)\",\n shadow: \"rgba(239, 68, 68, 0.18)\",\n};\n\nconst TEAM_PALETTE: OutcomeColor[] = [\n {\n bg: \"rgba(139,92,246,0.14)\",\n text: \"rgb(139,92,246)\",\n shadow: \"rgba(139,92,246,0.18)\",\n },\n {\n bg: \"rgba(34,197,94,0.14)\",\n text: \"rgb(34,197,94)\",\n shadow: \"rgba(34,197,94,0.18)\",\n },\n {\n bg: \"rgba(0,166,212,0.14)\",\n text: \"rgb(0,166,212)\",\n shadow: \"rgba(0,166,212,0.18)\",\n },\n {\n bg: \"rgba(194,120,32,0.14)\",\n text: \"rgb(194,120,32)\",\n shadow: \"rgba(194,120,32,0.18)\",\n },\n {\n bg: \"rgba(202,138,4,0.14)\",\n text: \"rgb(202,138,4)\",\n shadow: \"rgba(202,138,4,0.18)\",\n },\n {\n bg: \"rgba(236,72,153,0.14)\",\n text: \"rgb(236,72,153)\",\n shadow: \"rgba(236,72,153,0.18)\",\n },\n {\n bg: \"rgba(99,102,241,0.14)\",\n text: \"rgb(99,102,241)\",\n shadow: \"rgba(99,102,241,0.18)\",\n },\n {\n bg: \"rgba(244,114,82,0.14)\",\n text: \"rgb(244,114,82)\",\n shadow: \"rgba(244,114,82,0.18)\",\n },\n];\n\nfunction hashString(s: string): number {\n let hash = 0;\n for (let i = 0; i < s.length; i++) {\n hash = ((hash << 5) - hash + s.charCodeAt(i)) | 0;\n }\n return Math.abs(hash);\n}\n\nfunction getOutcomeColors(market: PredictMarket): [OutcomeColor, OutcomeColor] {\n const labels =\n market.outcomes?.map((o) => o.label?.toLowerCase().trim() ?? \"\") ?? [];\n\n if (labels.some((l) => l === \"up\") && labels.some((l) => l === \"down\")) {\n return [C_PRIMARY, C_RED];\n }\n\n if (labels.some((l) => l === \"yes\") && labels.some((l) => l === \"no\")) {\n return [C_PRIMARY, C_SECONDARY];\n }\n\n const label0 = labels[0] ?? \"\";\n const label1 = labels[1] ?? \"\";\n const idx0 = hashString(label0) % TEAM_PALETTE.length;\n let idx1 = hashString(label1) % TEAM_PALETTE.length;\n if (idx1 === idx0) idx1 = (idx1 + 1) % TEAM_PALETTE.length;\n\n return [TEAM_PALETTE[idx0], TEAM_PALETTE[idx1]];\n}\n\n// -----------------------------------------------------------------------------\n// Price helpers\n// -----------------------------------------------------------------------------\n\nfunction getYesAsk(market: PredictMarket): number | null {\n const yes = market.outcomes?.[0];\n if (!yes) return null;\n return yes.best_ask ?? yes.price ?? null;\n}\n\nfunction getYesPercent(market: PredictMarket): number {\n const price = getYesAsk(market);\n return price != null ? parseFloat((price * 100).toFixed(2)) : 0;\n}\n\nfunction formatPercent(value: number): string {\n if (value <= 1 && value > 0) return \"< 1%\";\n if (value >= 99 && value < 100) return \"> 99%\";\n return `${value}%`;\n}\n\nfunction getYesCents(market: PredictMarket): string {\n const yes = market.outcomes?.[0];\n const price = yes?.best_ask ?? yes?.price ?? 0;\n return parseFloat((price * 100).toFixed(2)).toString();\n}\n\nfunction getNoCents(market: PredictMarket): string {\n const no = market.outcomes?.[1];\n if (no) {\n const price = no.best_ask ?? no.price ?? 0;\n return parseFloat((price * 100).toFixed(2)).toString();\n }\n const yes = market.outcomes?.[0];\n const yesPrice = yes?.best_ask ?? yes?.price ?? 0;\n return parseFloat(((1 - yesPrice) * 100).toFixed(2)).toString();\n}\n\n// -----------------------------------------------------------------------------\n// Countdown helpers\n// -----------------------------------------------------------------------------\n\nfunction formatCountdown(isoDate: string): string | null {\n const diff = new Date(isoDate).getTime() - Date.now();\n if (diff <= 0) return null;\n\n const d = Math.floor(diff / 86_400_000);\n const h = Math.floor((diff % 86_400_000) / 3_600_000);\n const m = Math.floor((diff % 3_600_000) / 60_000);\n\n const parts: string[] = [];\n if (d > 0) parts.push(`${d}d`);\n if (h > 0) parts.push(`${h}h`);\n parts.push(`${m}m`);\n\n return parts.join(\" \");\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nconst injectedCSS = `\n.badge-shine { position: relative; overflow: hidden; }\n.badge-shine::after {\n content: \"\";\n position: absolute;\n inset: 0;\n background: linear-gradient(120deg,\n transparent 0%, transparent 30%,\n rgba(255,255,255,0.15) 45%, rgba(255,255,255,0.25) 50%,\n rgba(255,255,255,0.15) 55%, transparent 70%, transparent 100%);\n transform: translate(-200%);\n animation: badge-shine-sweep 6s ease-in-out infinite;\n}\n@keyframes badge-shine-sweep {\n 0% { transform: translate(-200%); }\n 60% { transform: translate(200%); }\n 100% { transform: translate(200%); }\n}\n.evt-card button:focus-visible,\n.evt-card a:focus-visible,\n.evt-card [role=\"button\"]:focus-visible {\n outline: 2px solid hsl(var(--heroui-primary) / 0.4);\n outline-offset: 2px;\n}\n`;\n\nexport function EventItem({\n event,\n href,\n LinkComponent,\n onSelect,\n onSelectOutcome,\n onHover,\n}: EventItemProps) {\n const [expandedSlug, setExpandedSlug] = useState<string | null>(null);\n\n const rawMarkets = event.markets ?? [];\n const markets = useMemo(\n () =>\n rawMarkets.length > 2\n ? [...rawMarkets].sort(\n (a, b) =>\n (b.outcomes?.[0]?.price ?? 0) - (a.outcomes?.[0]?.price ?? 0),\n )\n : rawMarkets,\n [rawMarkets],\n );\n\n const openMarkets = markets.filter((m) => m.status === \"open\");\n const singleMarket = openMarkets.length === 1;\n const displayedMarkets = openMarkets.slice(0, MAX_DISPLAYED_OUTCOMES);\n const moreCount = openMarkets.length - MAX_DISPLAYED_OUTCOMES;\n\n const formattedVolume = useMemo(() => {\n const vol = Math.round(event.volume ?? 0);\n return `$${vol.toLocaleString(\"en-US\")}`;\n }, [event.volume]);\n\n const expandedMarket = expandedSlug\n ? (openMarkets.find((m) => m.slug === expandedSlug) ?? null)\n : null;\n\n const isExpanded = !!expandedMarket || singleMarket;\n\n // -- handlers --\n\n const handleCardClick = () => {\n if (!isExpanded) {\n onSelect?.(event);\n }\n };\n\n const handleHeaderClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (expandedMarket) {\n e.preventDefault();\n setExpandedSlug(null);\n }\n };\n\n const handleShowMore = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!href) {\n e.preventDefault();\n onSelect?.(event);\n }\n };\n\n const footerContent = singleMarket ? (\n <SingleMarketFooter\n event={event}\n formattedVolume={formattedVolume}\n href={href}\n LinkComponent={LinkComponent}\n onSelect={onSelect}\n />\n ) : expandedMarket ? (\n <ExpandedMarketFooter onCollapse={() => setExpandedSlug(null)} />\n ) : (\n <MarketListFooter\n moreCount={moreCount}\n formattedVolume={formattedVolume}\n source={event.source}\n href={href}\n LinkComponent={LinkComponent}\n onShowMore={handleShowMore}\n />\n );\n\n return (\n <div\n className=\"group evt-card\"\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n width: \"100%\",\n borderRadius: 14,\n border: \"1px solid rgba(39,39,42,0.6)\",\n background: \"rgba(24,24,27,0.4)\",\n overflow: \"hidden\",\n transition: \"all 0.2s\",\n cursor: !isExpanded ? \"pointer\" : undefined,\n }}\n onMouseEnter={(e) => {\n const el = e.currentTarget as HTMLDivElement;\n const glowColor = SOURCE_GLOW[event.source] ?? GLOW_FALLBACK;\n el.style.borderColor = glowColor.border;\n el.style.boxShadow = glowColor.shadow;\n onHover?.(event);\n }}\n onMouseLeave={(e) => {\n const el = e.currentTarget as HTMLDivElement;\n el.style.borderColor = \"rgba(39,39,42,0.6)\";\n el.style.boxShadow = \"none\";\n }}\n onClick={handleCardClick}\n >\n <style>{injectedCSS}</style>\n\n {/* ---- Header + Body (padded) ---- */}\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n flex: 1,\n padding: \"14px 14px 12px\",\n gap: 8,\n }}\n >\n <CardHeader\n event={event}\n href={href}\n LinkComponent={LinkComponent}\n onClick={handleHeaderClick}\n isExpanded={isExpanded}\n />\n\n <div style={{ display: \"flex\", flexDirection: \"column\", flex: 1 }}>\n {singleMarket ? (\n <SingleMarketBody\n market={openMarkets[0]}\n event={event}\n onSelectOutcome={onSelectOutcome}\n />\n ) : expandedMarket ? (\n <ExpandedMarketBody\n market={expandedMarket}\n event={event}\n onCollapse={() => setExpandedSlug(null)}\n onSelectOutcome={onSelectOutcome}\n />\n ) : (\n <MarketListBody\n displayedMarkets={displayedMarkets}\n onMarketClick={(m) => setExpandedSlug(m.slug)}\n />\n )}\n </div>\n </div>\n\n {/* ---- Footer (edge-to-edge, outside padding) ---- */}\n <CardFooter>{footerContent}</CardFooter>\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Card header (avatar + title + badges)\n// -----------------------------------------------------------------------------\n\nfunction CardHeader({\n event,\n href,\n LinkComponent,\n onClick,\n isExpanded,\n}: {\n event: PredictEvent;\n href?: string;\n LinkComponent?: LinkComponentType;\n onClick: React.MouseEventHandler;\n isExpanded: boolean;\n}) {\n const countdown = event.start_at ? formatCountdown(event.start_at) : null;\n\n const cls =\n \"group/header flex items-center gap-x-2 lg:gap-x-4 w-full text-left cursor-pointer\";\n\n return (\n <Linkable\n href={href}\n LinkComponent={LinkComponent}\n as=\"button\"\n className={cls}\n onClick={onClick}\n >\n <Avatar\n src={event.image_url || undefined}\n name={event.title || \"Event\"}\n radius=\"lg\"\n className=\"h-8 w-8 flex-shrink-0 transition-transform duration-300 group-hover/header:scale-110 lg:h-12 lg:w-12\"\n classNames={{ base: \"bg-transparent\" }}\n />\n <div className=\"flex min-w-0 flex-1 flex-col justify-center gap-y-0.5\">\n <p\n className={cn(\n \"min-w-0 text-sm font-semibold leading-snug text-slate-200 line-clamp-2 lg:text-base\",\n isExpanded && \"group-hover/header:text-neutral-400\",\n )}\n >\n {event.title}\n </p>\n {countdown && (\n <span className=\"text-[10px] leading-4 text-neutral-500\">\n Live in {countdown}\n </span>\n )}\n </div>\n <EventIndicators event={event} />\n </Linkable>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Event indicator badges (Live / Crypto Countdown / Closed)\n// -----------------------------------------------------------------------------\n\ntype BadgeType =\n | { kind: \"live\" }\n | { kind: \"crypto-short\"; label: string; color: string }\n | { kind: \"closed\" };\n\nfunction getEventBadges(event: PredictEvent): BadgeType[] {\n const badges: BadgeType[] = [];\n\n if (event.status === \"closed\") {\n badges.push({ kind: \"closed\" });\n return badges.slice(0, 2);\n }\n\n const isCrypto = event.tags?.some((t) => t.label?.toLowerCase() === \"crypto\");\n const isLive = event.tags?.some((t) => t.label?.toLowerCase() === \"live\");\n\n if (isCrypto && event.end_at) {\n const remaining = new Date(event.end_at).getTime() - Date.now();\n const fiveMin = 5 * 60 * 1000;\n const fifteenMin = 15 * 60 * 1000;\n\n if (remaining > 0 && remaining <= fifteenMin) {\n const cryptoColor = remaining <= fiveMin ? \"#ef4444\" : \"#f59e0b\";\n badges.push({\n kind: \"crypto-short\",\n label: remaining <= fiveMin ? \"5m\" : \"15m\",\n color: cryptoColor,\n });\n }\n }\n\n if (isLive) {\n badges.push({ kind: \"live\" });\n }\n\n return badges.slice(0, 2);\n}\n\nfunction EventIndicators({ event }: { event: PredictEvent }) {\n const badges = useMemo(() => getEventBadges(event), [event]);\n\n if (badges.length === 0) return null;\n\n return (\n <div className=\"flex flex-shrink-0 flex-col items-end gap-1\">\n {badges.map((badge, i) => {\n switch (badge.kind) {\n case \"live\":\n return <LiveBadge key={i} />;\n case \"crypto-short\":\n return (\n <CryptoCountdownBadge\n key={i}\n label={badge.label}\n color={badge.color}\n />\n );\n case \"closed\":\n return <ClosedBadge key={i} />;\n }\n })}\n </div>\n );\n}\n\nfunction LiveBadge() {\n const { t } = useTranslation();\n return (\n <span className=\"badge-shine relative inline-flex items-center gap-1 overflow-hidden rounded-md bg-[rgb(240,68,56)]/10 px-1.5 py-0.5 text-xs font-semibold text-[rgb(240,68,56)]\">\n <span className=\"h-2 w-2 animate-pulse rounded-full bg-current\" />\n {t(\"predict.event.status.live\")}\n </span>\n );\n}\n\nfunction CryptoCountdownBadge({\n label,\n color,\n}: {\n label: string;\n color: string;\n}) {\n return (\n <span\n className=\"badge-shine relative inline-flex items-center gap-1 overflow-hidden rounded-md px-1.5 py-0.5 text-xs font-semibold\"\n style={{\n backgroundColor: `${color}26`,\n color,\n }}\n >\n <TimerIcon className=\"size-3 shrink-0\" />\n {label}\n </span>\n );\n}\n\nfunction ClosedBadge() {\n const { t } = useTranslation();\n return (\n <span className=\"inline-flex items-center rounded-md bg-neutral-800/80 px-1.5 py-0.5 text-xs font-semibold text-neutral-400\">\n {t(\"predict.event.status.closed\")}\n </span>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Market list — body (outcome rows only)\n// -----------------------------------------------------------------------------\n\nfunction MarketListBody({\n displayedMarkets,\n onMarketClick,\n}: {\n displayedMarkets: PredictMarket[];\n onMarketClick: (market: PredictMarket) => void;\n}) {\n return displayedMarkets.length > 0 ? (\n <div className=\"flex w-full flex-1 flex-col gap-y-0.5 lg:gap-y-2\">\n {displayedMarkets.map((market) => {\n const pct = getYesPercent(market);\n return (\n <button\n type=\"button\"\n key={market.id ?? `${market.source}-${market.slug}`}\n className=\"flex h-9 w-full items-center justify-between gap-x-2 transition-opacity hover:cursor-pointer hover:opacity-80\"\n onClick={(e) => {\n e.stopPropagation();\n onMarketClick(market);\n }}\n >\n <span className=\"min-w-0 flex-1 text-left text-xs text-slate-200 line-clamp-1 lg:text-sm\">\n {market.outcomes?.[0]?.label ?? market.question}\n </span>\n <div className=\"flex items-center gap-x-2\">\n <span className=\"text-sm font-semibold text-slate-200 lg:text-lg\">\n {formatPercent(pct)}\n </span>\n <YesNoPill />\n </div>\n </button>\n );\n })}\n </div>\n ) : null;\n}\n\n// -----------------------------------------------------------------------------\n// Market list — footer\n// -----------------------------------------------------------------------------\n\nfunction MarketListFooter({\n moreCount,\n formattedVolume,\n source,\n href,\n LinkComponent,\n onShowMore,\n}: {\n moreCount: number;\n formattedVolume: string;\n source: ProviderSource;\n href?: string;\n LinkComponent?: LinkComponentType;\n onShowMore: React.MouseEventHandler;\n}) {\n const { t } = useTranslation();\n\n return (\n <>\n {moreCount > 0 ? (\n <Linkable\n href={href}\n LinkComponent={LinkComponent}\n as=\"button\"\n className=\"flex items-center gap-1 text-[10px] font-normal text-zinc-500 transition-colors hover:text-slate-200 cursor-pointer lg:text-xs\"\n onClick={onShowMore}\n >\n {t(\"predict.event.showMore\")}\n <ChevronRightIcon className=\"h-3 w-3\" />\n </Linkable>\n ) : (\n <div />\n )}\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n fontSize: 10,\n color: \"#71717a\",\n }}\n >\n {formattedVolume} {t(\"predict.event.volume\")}\n <SourceIcon source={source} />\n </span>\n </>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Card footer (separated bar matching matches card style)\n// -----------------------------------------------------------------------------\n\nfunction CardFooter({ children }: { children: React.ReactNode }) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n borderTop: \"1px solid rgba(39,39,42,0.5)\",\n background: \"rgba(39,39,42,0.15)\",\n padding: \"8px 14px\",\n marginTop: \"auto\",\n }}\n >\n {children}\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Elevated button (matches Jupiter design exactly)\n// -----------------------------------------------------------------------------\n\nfunction ElevatedButton({\n bgColor,\n textColor,\n shadowColor,\n onClick,\n children,\n}: {\n bgColor: string;\n textColor: string;\n shadowColor: string;\n onClick: React.MouseEventHandler;\n children: React.ReactNode;\n}) {\n const handleEnter = (e: React.MouseEvent<HTMLButtonElement>) => {\n const el = e.currentTarget;\n el.style.setProperty(\"--shadow-offset\", \"2px\");\n el.style.transform = \"translateY(2px)\";\n };\n\n const handleLeave = (e: React.MouseEvent<HTMLButtonElement>) => {\n const el = e.currentTarget;\n el.style.setProperty(\"--shadow-offset\", \"4px\");\n el.style.transform = \"translateY(0px)\";\n };\n\n return (\n <button\n type=\"button\"\n className=\"flex h-12 flex-1 w-full items-center justify-center gap-x-1 overflow-hidden rounded-lg p-3 text-base font-normal hover:cursor-pointer will-change-transform [-webkit-tap-highlight-color:transparent]\"\n style={\n {\n backgroundColor: bgColor,\n color: textColor,\n \"--shadow-color\": shadowColor,\n \"--shadow-offset\": \"4px\",\n boxShadow:\n \"inset 0 -1px 0 rgba(255,255,255,0.08), 0 var(--shadow-offset, 4px) 0 var(--shadow-color, rgba(0,0,0,0.22))\",\n transition: \"transform .12s, box-shadow .12s, opacity .14s\",\n } as React.CSSProperties\n }\n onMouseEnter={handleEnter}\n onMouseLeave={handleLeave}\n onClick={onClick}\n >\n {children}\n </button>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Outcome buy buttons (shared by SingleMarketView & ExpandedMarketView)\n// -----------------------------------------------------------------------------\n\nfunction OutcomeButtons({\n market,\n event,\n onSelectOutcome,\n dynamicColors = false,\n labelFormat = \"action\",\n}: {\n market: PredictMarket;\n event: PredictEvent;\n onSelectOutcome?: (\n event: PredictEvent,\n market: PredictMarket,\n side: \"yes\" | \"no\",\n ) => void;\n dynamicColors?: boolean;\n /** \"action\" → \"Yes XX.X¢\" / \"No XX¢\", \"label\" → \"Label XX¢\" */\n labelFormat?: \"action\" | \"label\";\n}) {\n const { t } = useTranslation();\n const [c0, c1] = dynamicColors\n ? getOutcomeColors(market)\n : [C_PRIMARY, C_SECONDARY];\n\n const label0 = market.outcomes?.[0]?.label?.toLowerCase().trim() ?? \"\";\n const label1 = market.outcomes?.[1]?.label?.toLowerCase().trim() ?? \"\";\n const effectiveFormat =\n labelFormat === \"label\" && label0 === label1 ? \"action\" : labelFormat;\n\n const yesLabel =\n effectiveFormat === \"label\"\n ? `${market.outcomes?.[0]?.label ?? \"Yes\"} ${getYesCents(market)}¢`\n : t(\"predict.market.action.yes\", { price: getYesCents(market) });\n\n const noLabel =\n effectiveFormat === \"label\"\n ? `${market.outcomes?.[1]?.label ?? \"No\"} ${getNoCents(market)}¢`\n : t(\"predict.market.action.no\", { price: getNoCents(market) });\n\n return (\n <div className=\"flex gap-2\">\n <ElevatedButton\n bgColor={c0.bg}\n textColor={c0.text}\n shadowColor={c0.shadow}\n onClick={(e) => {\n e.stopPropagation();\n onSelectOutcome?.(event, market, \"yes\");\n }}\n >\n {yesLabel}\n </ElevatedButton>\n <ElevatedButton\n bgColor={c1.bg}\n textColor={c1.text}\n shadowColor={c1.shadow}\n onClick={(e) => {\n e.stopPropagation();\n onSelectOutcome?.(event, market, \"no\");\n }}\n >\n {noLabel}\n </ElevatedButton>\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Yes / No pill (compact, used in list rows)\n// -----------------------------------------------------------------------------\n\nfunction YesNoPill() {\n const { t } = useTranslation();\n\n return (\n <span className=\"inline-flex h-7 w-[85px] items-center justify-center gap-x-3 rounded-lg p-1.5 text-xs font-semibold flex-shrink-0 bg-gradient-to-r from-primary/15 to-secondary/15 lg:h-9 lg:w-24 lg:gap-x-4 lg:p-2 lg:text-sm\">\n <span className=\"text-primary\">{t(\"predict.market.yes\")}</span>\n <span className=\"text-neutral-400\">/</span>\n <span className=\"text-secondary\">{t(\"predict.market.no\")}</span>\n </span>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Single market — body (buy buttons only)\n// -----------------------------------------------------------------------------\n\nfunction SingleMarketBody({\n market,\n event,\n onSelectOutcome,\n}: {\n market: PredictMarket;\n event: PredictEvent;\n onSelectOutcome?: (\n event: PredictEvent,\n market: PredictMarket,\n side: \"yes\" | \"no\",\n ) => void;\n}) {\n return (\n <div style={{ flex: 1 }}>\n <OutcomeButtons\n market={market}\n event={event}\n onSelectOutcome={onSelectOutcome}\n dynamicColors\n labelFormat=\"label\"\n />\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Single market — footer\n// -----------------------------------------------------------------------------\n\nfunction SingleMarketFooter({\n event,\n formattedVolume,\n href,\n LinkComponent,\n onSelect,\n}: {\n event: PredictEvent;\n formattedVolume: string;\n href?: string;\n LinkComponent?: LinkComponentType;\n onSelect?: (event: PredictEvent) => void;\n}) {\n const { t } = useTranslation();\n\n const handleViewEvent = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!href) {\n e.preventDefault();\n onSelect?.(event);\n }\n };\n\n return (\n <>\n <Linkable\n href={href}\n LinkComponent={LinkComponent}\n as=\"button\"\n className=\"flex items-center gap-1 text-[10px] font-normal text-zinc-500 transition-colors hover:text-slate-200 cursor-pointer lg:text-xs\"\n onClick={handleViewEvent}\n >\n {t(\"predict.event.viewEvent\")}\n <ChevronRightIcon className=\"h-3 w-3\" />\n </Linkable>\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n fontSize: 10,\n color: \"#71717a\",\n }}\n >\n {formattedVolume} {t(\"predict.event.volume\")}\n <SourceIcon source={event.source} />\n </span>\n </>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Expanded market — body (collapse toggle + buy buttons)\n// -----------------------------------------------------------------------------\n\nfunction ExpandedMarketBody({\n market,\n event,\n onCollapse,\n onSelectOutcome,\n}: {\n market: PredictMarket;\n event: PredictEvent;\n onCollapse: () => void;\n onSelectOutcome?: (\n event: PredictEvent,\n market: PredictMarket,\n side: \"yes\" | \"no\",\n ) => void;\n}) {\n const pct = getYesPercent(market);\n\n return (\n <div style={{ flex: 1 }}>\n <button\n type=\"button\"\n className=\"flex h-9 w-full items-center justify-between cursor-pointer\"\n onClick={(e) => {\n e.stopPropagation();\n onCollapse();\n }}\n >\n <span className=\"min-w-0 flex-1 text-left text-xs text-slate-200 lg:text-sm\">\n {market.outcomes?.[0]?.label ?? market.question}\n </span>\n <div className=\"flex items-center gap-x-1 flex-shrink-0\">\n <span className=\"text-sm font-semibold text-slate-200 lg:text-lg\">\n {formatPercent(pct)}\n </span>\n <ChevronUpIcon className=\"h-4 w-4 text-neutral-400\" />\n </div>\n </button>\n <div style={{ marginTop: 12 }}>\n <OutcomeButtons\n market={market}\n event={event}\n onSelectOutcome={onSelectOutcome}\n labelFormat=\"action\"\n />\n </div>\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Expanded market — footer\n// -----------------------------------------------------------------------------\n\nfunction ExpandedMarketFooter({ onCollapse }: { onCollapse: () => void }) {\n const { t } = useTranslation();\n\n return (\n <>\n <button\n type=\"button\"\n className=\"flex items-center gap-x-1 text-[10px] font-normal transition-colors hover:text-slate-200 cursor-pointer lg:text-xs\"\n style={{ color: \"#71717a\" }}\n onClick={(e) => {\n e.stopPropagation();\n onCollapse();\n }}\n >\n <ChevronLeftIcon className=\"h-3 w-3\" />\n {t(\"predict.event.back\")}\n </button>\n <div />\n </>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Inline icons\n// -----------------------------------------------------------------------------\n\nfunction ChevronRightIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M4.5 2.5L8 6l-3.5 3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction ChevronLeftIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M7.5 2.5L4 6l3.5 3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Source (platform) icons\n// -----------------------------------------------------------------------------\n\nfunction SourceIcon({ source }: { source: ProviderSource }) {\n const title = source === \"polymarket\" ? \"Polymarket\" : \"Kalshi\";\n return (\n <span\n className=\"inline-flex items-center gap-x-1 text-neutral-400\"\n title={title}\n >\n <span className=\"text-neutral-600\">·</span>\n {source === \"polymarket\" ? (\n <PolymarketIcon className=\"h-5 w-auto shrink-0\" />\n ) : (\n <KalshiIcon className=\"h-3 w-auto shrink-0\" />\n )}\n </span>\n );\n}\n","// =============================================================================\n// EventsUI\n//\n// Events grid: PredictEvent[] with EventItem cards.\n// Layout: responsive 1-4 column CSS grid with IntersectionObserver infinite\n// scroll sentinel.\n// =============================================================================\nimport { useCallback, useEffect, useRef } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent, PredictMarket } from \"@liberfi.io/react-predict\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { EventItem } from \"./event-item.ui\";\n\nconst GLOW_INSET = 8;\n\n// -----------------------------------------------------------------------------\n// EventsUI\n// -----------------------------------------------------------------------------\n\nexport type EventsUIProps = {\n events: PredictEvent[];\n hasMore?: boolean;\n isFetchingMore?: boolean;\n onFetchMore?: () => void;\n onSelect?: (event: PredictEvent) => void;\n onSelectOutcome?: (\n event: PredictEvent,\n market: PredictMarket,\n side: \"yes\" | \"no\",\n ) => void;\n getEventHref?: (event: PredictEvent) => string;\n LinkComponent?: LinkComponentType;\n onHover?: (event: PredictEvent) => void;\n};\n\nexport function EventsUI({\n events,\n hasMore = false,\n isFetchingMore = false,\n onFetchMore,\n onSelect,\n onSelectOutcome,\n getEventHref,\n LinkComponent,\n onHover,\n}: EventsUIProps) {\n const { t } = useTranslation();\n const sentinelRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const el = sentinelRef.current;\n if (!el) return;\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries[0]?.isIntersecting && hasMore && !isFetchingMore) {\n onFetchMore?.();\n }\n },\n { rootMargin: \"300px\" },\n );\n observer.observe(el);\n return () => observer.disconnect();\n }, [hasMore, isFetchingMore, onFetchMore]);\n\n const handleScrollToTop = useCallback(() => {\n window.scrollTo({ top: 0, behavior: \"smooth\" });\n }, []);\n\n const showEndOfList = !hasMore && events.length > 0;\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\" }}>\n <style>{`\n@keyframes eventCardEnter{from{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}\n@keyframes evt-load-spin{to{transform:rotate(360deg)}}\n@media(max-width:767px){.evt-card-grid{grid-template-columns:1fr!important}}\n@media(min-width:768px) and (max-width:1023px){.evt-card-grid{grid-template-columns:repeat(2,1fr)!important}}\n@media(min-width:1024px) and (max-width:1279px){.evt-card-grid{grid-template-columns:repeat(3,1fr)!important}}\n`}</style>\n <div\n className=\"evt-card-grid\"\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(4, 1fr)\",\n }}\n >\n {events.map((event, i) =>\n event == null ? null : (\n <div\n key={`${event.source}-${event.slug}`}\n style={{\n padding: GLOW_INSET,\n animation: `eventCardEnter 0.45s cubic-bezier(0.34,1.56,0.64,1) ${(i % 4) * 35}ms both`,\n }}\n >\n <EventItem\n event={event}\n href={getEventHref?.(event)}\n LinkComponent={LinkComponent}\n onSelect={onSelect}\n onSelectOutcome={onSelectOutcome}\n onHover={onHover}\n />\n </div>\n ),\n )}\n </div>\n\n {/* Infinite scroll sentinel */}\n <div\n ref={sentinelRef}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 8,\n padding: \"16px 0\",\n minHeight: 1,\n }}\n >\n {isFetchingMore && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n color: \"#71717a\",\n fontSize: 13,\n }}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ animation: \"evt-load-spin 1s linear infinite\" }}\n >\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n {t(\"predict.events.loadMore\" as never)}\n </div>\n )}\n </div>\n\n {showEndOfList && <EndOfListRow onScrollToTop={handleScrollToTop} />}\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// End of list + Back to top\n// -----------------------------------------------------------------------------\n\nfunction EndOfListRow({ onScrollToTop }: { onScrollToTop?: () => void }) {\n const { t } = useTranslation();\n\n return (\n <div className=\"flex w-full flex-col items-center justify-center gap-y-4 py-6\">\n <div className=\"flex w-full items-center justify-center gap-x-4\">\n <div className=\"h-px w-16 bg-neutral-700\" />\n <span className=\"text-xs font-medium text-neutral-500\">\n {t(\"predict.event.endOfList\")}\n </span>\n <div className=\"h-px w-16 bg-neutral-700\" />\n </div>\n\n <button\n type=\"button\"\n className=\"flex cursor-pointer items-center gap-x-1 text-xs font-medium text-neutral-400\"\n onClick={onScrollToTop}\n >\n <span className=\"iconify size-4 ph--arrow-up-bold\" />\n <span>{t(\"predict.event.backToTop\")}</span>\n </button>\n </div>\n );\n}\n","// =============================================================================\n// EventsWidget\n//\n// Container widget that wires useEventsInfinite (data) to EventsUI (presentation).\n// Accepts `tagSlugSelection` from the categories widget for slug-based filtering.\n// =============================================================================\nimport type {\n PredictEvent,\n PredictMarket,\n EventStatus,\n EventSortField,\n ProviderSource,\n TagSlugSelection,\n} from \"@liberfi.io/react-predict\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { DEFAULT_PAGE_SIZE } from \"../../consts\";\nimport { useEventsInfinite } from \"./events.script\";\nimport { EventsSkeleton } from \"./events.skeleton\";\nimport { EventsUI } from \"./events.ui\";\n\nexport type { TagSlugSelection } from \"../categories/categories.widget\";\n\n// -----------------------------------------------------------------------------\n// Props\n// -----------------------------------------------------------------------------\n\nexport interface EventsWidgetProps {\n /** Category / tag selection from the categories widget. */\n tagSlugSelection?: TagSlugSelection | null;\n /** Page size (default: DEFAULT_PAGE_SIZE) */\n limit?: number;\n /** Event lifecycle status filter (default: \"open\") */\n status?: EventStatus;\n /** Sort field */\n sort_by?: EventSortField;\n /** Ascending sort order (default: false → descending) */\n sort_asc?: boolean;\n /** Filter by upstream provider (undefined = all providers) */\n source?: ProviderSource;\n /** Include nested markets in the response (default: true) */\n with_markets?: boolean;\n /**\n * Client-side time-remaining filter. Keeps only events whose `end_at` is\n * within the given window: \"1d\" = < 24 h, \"7d\" = < 7 days, \"30d\" = < 30 days.\n */\n timeRemaining?: string;\n /** Client-side minimum volume filter (USD string, e.g. \"1000\"). */\n minVolume?: string;\n /** Client-side minimum liquidity filter (USD string, e.g. \"10000\"). */\n minLiquidity?: string;\n /** Callback when an event card is selected */\n onSelect?: (event: PredictEvent) => void;\n /** Callback when an outcome button (yes/no) is pressed */\n onSelectOutcome?: (\n event: PredictEvent,\n market: PredictMarket,\n side: \"yes\" | \"no\",\n ) => void;\n /** Generate href for each event card. When set, cards render as links. */\n getEventHref?: (event: PredictEvent) => string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n /** Called when a card is hovered (for data prefetching). */\n onHover?: (event: PredictEvent) => void;\n}\n\n// -----------------------------------------------------------------------------\n// Widget\n// -----------------------------------------------------------------------------\n\nexport function EventsWidget({\n tagSlugSelection,\n limit = DEFAULT_PAGE_SIZE,\n status,\n sort_by,\n sort_asc,\n source,\n with_markets,\n timeRemaining,\n minVolume,\n minLiquidity,\n onSelect,\n onSelectOutcome,\n getEventHref,\n LinkComponent,\n onHover,\n}: EventsWidgetProps) {\n const {\n data: events,\n hasMore,\n fetchMore,\n isFetching,\n isFetchingMore,\n } = useEventsInfinite({\n tagSlugSelection,\n limit,\n status,\n sort_by,\n sort_asc,\n source,\n with_markets,\n timeRemaining,\n minVolume,\n minLiquidity,\n });\n\n if (isFetching) {\n return <EventsSkeleton count={DEFAULT_PAGE_SIZE} />;\n }\n\n return (\n <EventsUI\n events={events}\n hasMore={hasMore}\n isFetchingMore={isFetchingMore}\n onFetchMore={fetchMore}\n onSelect={onSelect}\n onSelectOutcome={onSelectOutcome}\n getEventHref={getEventHref}\n LinkComponent={LinkComponent}\n onHover={onHover}\n />\n );\n}\n","// =============================================================================\n// EventsPage\n//\n// Full-page scroll layout:\n// 1. EventsHero — brand slogan + 2x2 stats grid\n// 2. Sticky categories + toolbar\n// 3. Content area — events grid with IntersectionObserver infinite scroll\n//\n// Owns the sort/filter state and converts it to API params for the widget.\n// =============================================================================\nimport { useState, useCallback, useMemo } from \"react\";\nimport type { PredictEvent, PredictMarket } from \"@liberfi.io/react-predict\";\nimport { useEventStats } from \"@liberfi.io/react-predict\";\nimport { useDisclosure } from \"@liberfi.io/ui\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { useAsyncModal } from \"@liberfi.io/ui-scaffold\";\nimport {\n CategoriesWidget,\n type TagSlugSelection,\n} from \"../categories/categories.widget\";\nimport {\n PredictTradeModal,\n PREDICT_TRADE_MODAL_ID,\n type PredictTradeModalParams,\n} from \"../trade-form/trade-form.modal\";\nimport {\n EventsFilterUI,\n countActiveFilters,\n DEFAULT_FILTER_STATE,\n type EventsFilterState,\n} from \"./events-filter.ui\";\nimport { EventsHero } from \"./events-hero.ui\";\nimport {\n EventsToolbarUI,\n SORT_PRESETS,\n type SortPreset,\n} from \"./events-toolbar.ui\";\nimport { EventsWidget } from \"./events.widget\";\n\nexport type { TagSlugSelection } from \"../categories/categories.widget\";\nexport type { SortPreset } from \"./events-toolbar.ui\";\nexport type { EventsFilterState } from \"./events-filter.ui\";\n\n// -----------------------------------------------------------------------------\n// Props\n// -----------------------------------------------------------------------------\n\nexport interface EventsPageProps {\n /** Callback when an event card is selected */\n onSelect?: (event: PredictEvent) => void;\n /** Callback when an outcome button (yes / no) is pressed */\n onSelectOutcome?: (\n event: PredictEvent,\n market: PredictMarket,\n side: \"yes\" | \"no\",\n ) => void;\n /** Generate href for each event card. When set, cards render as links. */\n getEventHref?: (event: PredictEvent) => string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n /** Called when a card is hovered (for data prefetching). */\n onHover?: (event: PredictEvent) => void;\n /** Optional background image for the Hero area. */\n bgImageSrc?: string;\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function EventsPage({\n onSelect,\n onSelectOutcome,\n getEventHref,\n LinkComponent,\n onHover,\n bgImageSrc,\n}: EventsPageProps) {\n const [tagSlugSelection, setTagSlugSelection] = useState<TagSlugSelection>({\n categorySlug: null,\n tagSlug: null,\n });\n\n const [filterState, setFilterState] =\n useState<EventsFilterState>(DEFAULT_FILTER_STATE);\n\n const { data: stats } = useEventStats();\n\n const {\n isOpen: isFilterOpen,\n onOpen: openFilter,\n onClose: closeFilter,\n } = useDisclosure();\n\n const { onOpen: openTradeModal } = useAsyncModal<PredictTradeModalParams>(\n PREDICT_TRADE_MODAL_ID,\n );\n\n const handleSelectOutcome = useCallback(\n (event: PredictEvent, market: PredictMarket, side: \"yes\" | \"no\") => {\n onSelectOutcome?.(event, market, side);\n openTradeModal({\n params: { event, market, initialOutcome: side },\n });\n },\n [onSelectOutcome, openTradeModal],\n );\n\n const handleCategorySelect = useCallback((selection: TagSlugSelection) => {\n setTagSlugSelection(selection);\n }, []);\n\n const handleSortChange = useCallback((preset: SortPreset) => {\n setFilterState((prev) => ({ ...prev, sortPreset: preset }));\n }, []);\n\n const handleSortAscChange = useCallback((asc: boolean) => {\n setFilterState((prev) => ({ ...prev, sortAsc: asc }));\n }, []);\n\n const handleFilterChange = useCallback((state: EventsFilterState) => {\n setFilterState(state);\n }, []);\n\n const sortBy = useMemo(\n () => SORT_PRESETS[filterState.sortPreset].sort_by,\n [filterState.sortPreset],\n );\n\n const filterCount = useMemo(\n () => countActiveFilters(filterState),\n [filterState],\n );\n\n const toolbar = useMemo(\n () => (\n <EventsToolbarUI\n sortPreset={filterState.sortPreset}\n onSortChange={handleSortChange}\n sortAsc={filterState.sortAsc}\n onSortAscChange={handleSortAscChange}\n onFilterPress={openFilter}\n filterCount={filterCount}\n />\n ),\n [\n filterState.sortPreset,\n filterState.sortAsc,\n filterCount,\n handleSortChange,\n handleSortAscChange,\n openFilter,\n ],\n );\n\n return (\n <div\n style={{\n minHeight: \"100vh\",\n position: \"relative\",\n width: \"100%\",\n maxWidth: 1680,\n margin: \"0 auto\",\n }}\n >\n {/* Hero section — break out of maxWidth container to span full viewport */}\n <div\n style={{\n position: \"relative\",\n overflow: \"hidden\",\n borderBottom: \"1px solid rgba(39,39,42,0.5)\",\n width: \"100vw\",\n marginLeft: \"calc(-50vw + 50%)\",\n }}\n >\n {/* Background layers */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n pointerEvents: \"none\",\n zIndex: 0,\n overflow: \"hidden\",\n }}\n >\n {bgImageSrc && (\n <img\n src={bgImageSrc}\n alt=\"\"\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n inset: 0,\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n objectPosition: \"center center\",\n opacity: 0.3,\n mixBlendMode: \"lighten\" as const,\n maskImage:\n \"linear-gradient(to bottom, black 50%, transparent 100%)\",\n WebkitMaskImage:\n \"linear-gradient(to bottom, black 50%, transparent 100%)\",\n }}\n />\n )}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n opacity: 0.025,\n backgroundImage:\n \"radial-gradient(circle at 1px 1px, rgb(255 255 255) 1px, transparent 0)\",\n backgroundSize: \"20px 20px\",\n }}\n />\n </div>\n <style>{`.evt-hero-wrap{padding:40px 16px 32px}@media(min-width:640px){.evt-hero-wrap{padding:48px 24px 40px}}@media(min-width:1024px){.evt-hero-wrap{padding:52px 32px 44px}}`}</style>\n <div\n className=\"evt-hero-wrap\"\n style={{\n position: \"relative\",\n zIndex: 2,\n maxWidth: 1152,\n margin: \"0 auto\",\n }}\n >\n <EventsHero stats={stats} />\n </div>\n </div>\n\n {/* Sticky categories + toolbar */}\n <div\n style={{\n position: \"sticky\",\n top: 0,\n zIndex: 40,\n background: \"rgba(10,10,11,0.8)\",\n backdropFilter: \"blur(24px)\",\n WebkitBackdropFilter: \"blur(24px)\",\n borderBottom: \"1px solid rgba(39,39,42,0.5)\",\n }}\n >\n <CategoriesWidget onSelect={handleCategorySelect} trailing={toolbar} />\n </div>\n\n {/* Content area */}\n <div style={{ padding: \"12px 8px 80px\" }}>\n <EventsFilterUI\n isOpen={isFilterOpen}\n onClose={closeFilter}\n value={filterState}\n onChange={handleFilterChange}\n />\n\n <EventsWidget\n tagSlugSelection={tagSlugSelection}\n sort_by={sortBy}\n sort_asc={filterState.sortAsc}\n source={filterState.source}\n timeRemaining={filterState.timeRemaining}\n minVolume={filterState.minVolume}\n minLiquidity={filterState.minLiquidity}\n onSelect={onSelect}\n onSelectOutcome={handleSelectOutcome}\n getEventHref={getEventHref}\n LinkComponent={LinkComponent}\n onHover={onHover}\n />\n </div>\n\n <PredictTradeModal />\n </div>\n );\n}\n","import { useState, useMemo, useCallback } from \"react\";\nimport { List, type RowComponentProps } from \"react-window\";\nimport { useInfiniteLoader } from \"react-window-infinite-loader\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n type OrderStatus,\n type PredictEvent,\n type PredictOrder,\n type PredictPosition,\n type PredictTrade,\n type ProviderSource,\n useCancelOrder,\n useInfiniteOrders,\n useInfiniteTrades,\n usePositions,\n} from \"@liberfi.io/react-predict\";\nimport { cn, Skeleton, Spinner } from \"@liberfi.io/ui\";\n\nconst ROW_HEIGHT = 40;\nconst HEADER_HEIGHT = 36;\nconst CONTENT_HEIGHT = 480;\nconst LIST_HEIGHT = CONTENT_HEIGHT - HEADER_HEIGHT;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UserActivitySectionProps {\n event: PredictEvent;\n /** Connected wallet address. When empty the section shows a connect prompt. */\n walletAddress?: string;\n /** Callback to cancel an open order. */\n onCancelOrder?: (orderId: string) => void;\n}\n\ntype ActivityTab = \"positions\" | \"orders\" | \"trades\";\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function UserActivitySection({\n event,\n walletAddress,\n onCancelOrder,\n}: UserActivitySectionProps) {\n const { t } = useTranslation();\n const [activeTab, setActiveTab] = useState<ActivityTab>(\"positions\");\n\n const marketSlugs = useMemo(\n () => event.markets?.map((m) => m.slug) ?? [],\n [event.markets],\n );\n\n const { data: positionsData } = usePositions({\n source: event.source,\n user: walletAddress ?? \"\",\n });\n const positionsCount = useMemo(() => {\n if (!positionsData?.positions || !walletAddress) return 0;\n if (marketSlugs.length === 0) return positionsData.positions.length;\n return positionsData.positions.filter(\n (p) => p.market && marketSlugs.includes(p.market.slug),\n ).length;\n }, [positionsData?.positions, marketSlugs, walletAddress]);\n\n const positionsLabel =\n positionsCount > 0\n ? `${t(\"predict.positions.title\")} (${positionsCount})`\n : t(\"predict.positions.title\");\n\n const tabs: { key: ActivityTab; label: string }[] = [\n { key: \"positions\", label: positionsLabel },\n { key: \"orders\", label: t(\"predict.openOrders.title\") },\n { key: \"trades\", label: t(\"predict.tradeHistory.title\") },\n ];\n\n return (\n <div className=\"flex flex-col gap-y-2 mt-6 px-1 lg:px-4\">\n {/* Tab bar */}\n <div className=\"flex items-center gap-x-1 border-b border-border\">\n {tabs.map((tab) => (\n <button\n key={tab.key}\n type=\"button\"\n onClick={() => setActiveTab(tab.key)}\n className={cn(\n \"px-3 py-2 text-sm font-medium transition-colors cursor-pointer\",\n activeTab === tab.key\n ? \"text-foreground border-b-2 border-primary\"\n : \"text-neutral hover:text-foreground\",\n )}\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* Tab content */}\n {!walletAddress ? (\n <div\n className=\"flex items-center justify-center text-sm text-neutral\"\n style={{ height: CONTENT_HEIGHT }}\n >\n {t(\"predict.trade.connectWallet\")}\n </div>\n ) : (\n <div style={{ height: CONTENT_HEIGHT }}>\n {activeTab === \"positions\" && (\n <PositionsTab\n source={event.source}\n walletAddress={walletAddress}\n marketSlugs={marketSlugs}\n />\n )}\n {activeTab === \"orders\" && (\n <OrdersTab\n source={event.source}\n walletAddress={walletAddress}\n marketSlugs={marketSlugs}\n onCancelOrder={onCancelOrder}\n />\n )}\n {activeTab === \"trades\" && (\n <TradesTab source={event.source} walletAddress={walletAddress} />\n )}\n </div>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Positions Tab — virtual list (no infinite loading)\n// ---------------------------------------------------------------------------\n\nfunction PositionsTab({\n source,\n walletAddress,\n marketSlugs,\n}: {\n source: ProviderSource;\n walletAddress: string;\n marketSlugs: string[];\n}) {\n const { t } = useTranslation();\n const { data, isLoading } = usePositions({\n source,\n user: walletAddress,\n });\n\n const positions = useMemo(() => {\n if (!data?.positions) return [];\n if (marketSlugs.length === 0) return data.positions;\n return data.positions.filter(\n (p) => p.market && marketSlugs.includes(p.market.slug),\n );\n }, [data?.positions, marketSlugs]);\n\n if (isLoading) return <TabSkeleton />;\n\n if (positions.length === 0) {\n return <EmptyState message={t(\"predict.positions.empty\")} />;\n }\n\n return (\n <div className=\"flex flex-col h-full\">\n <div\n className=\"flex items-center text-neutral text-xs lg:text-sm font-normal shrink-0\"\n style={{ height: HEADER_HEIGHT }}\n >\n <div className=\"flex-[3] min-w-0 pr-2 whitespace-nowrap\">\n {t(\"predict.positions.event\")}\n </div>\n <div className=\"flex-1 pr-2 text-right whitespace-nowrap\">\n {t(\"predict.positions.totalSize\")}\n </div>\n <div className=\"flex-1 pr-2 text-right whitespace-nowrap\">\n {t(\"predict.positions.value\")}\n </div>\n <div className=\"flex-1 pr-2 text-right whitespace-nowrap\">\n {t(\"predict.positions.avgPrice\")}\n </div>\n <div className=\"flex-1 pr-2 text-right whitespace-nowrap\">\n {t(\"predict.positions.markPrice\")}\n </div>\n <div className=\"flex-[1.5] pr-2 text-right whitespace-nowrap\">\n {t(\"predict.positions.pnl\")}\n </div>\n <div className=\"flex-1 pr-2 text-right whitespace-nowrap\">\n {t(\"predict.positions.payoutIfRight\")}\n </div>\n <div className=\"flex-[1.5] pr-2 text-right whitespace-nowrap\">\n {t(\"predict.positions.estSettlement\")}\n </div>\n <div className=\"w-16 shrink-0\" />\n </div>\n\n <List\n style={{ height: LIST_HEIGHT }}\n rowComponent={PositionVirtualRow}\n rowCount={positions.length}\n rowHeight={ROW_HEIGHT}\n rowProps={{\n positions,\n closeLabel: t(\"predict.positions.close\"),\n }}\n />\n </div>\n );\n}\n\ntype PositionRowData = {\n positions: PredictPosition[];\n closeLabel: string;\n};\n\nfunction PositionVirtualRow({\n index,\n style,\n positions,\n closeLabel,\n}: RowComponentProps<PositionRowData>) {\n const position = positions[index];\n if (!position) return null;\n\n const pnl = position.pnl ?? 0;\n const pnlPercent = position.pnl_percent ?? 0;\n const avgPrice = position.avg_price ?? 0;\n const currentPrice = position.current_price ?? 0;\n\n const pnlColor =\n pnl > 0 ? \"text-success\" : pnl < 0 ? \"text-danger\" : \"text-foreground\";\n const pnlSign = pnl > 0 ? \"+\" : \"\";\n\n const marketLabel =\n position.market?.outcomes?.[0]?.label ?? position.market?.question ?? \"—\";\n const sideLabel = position.side;\n const payoutIfRight = position.size;\n const value = position.size * currentPrice;\n const settlementStr = position.market?.end_at\n ? formatSettlementTime(position.market.end_at)\n : \"—\";\n\n return (\n <div\n style={style}\n className=\"flex items-center border-b border-border/50 hover:bg-content2/40 transition-colors text-xs lg:text-sm\"\n >\n <div className=\"flex-[3] min-w-0 pr-2\">\n <div className=\"flex flex-col gap-y-0.5\">\n <span className=\"text-foreground truncate font-medium\">\n {marketLabel}\n </span>\n <span\n className={cn(\n \"text-[10px] font-medium\",\n sideLabel.toLowerCase() === \"yes\"\n ? \"text-primary\"\n : \"text-secondary\",\n )}\n >\n {sideLabel}\n </span>\n </div>\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground whitespace-nowrap\">\n {position.size}\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground whitespace-nowrap\">\n ${value.toFixed(2)}\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground whitespace-nowrap\">\n {formatPrice(avgPrice)}\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground whitespace-nowrap\">\n {formatPrice(currentPrice)}\n </div>\n <div\n className={cn(\n \"flex-[1.5] pr-2 text-right font-mono whitespace-nowrap\",\n pnlColor,\n )}\n >\n {pnlSign}${Math.abs(pnl).toFixed(2)}\n <span className=\"text-[10px] ml-0.5 opacity-70\">\n ({pnlSign}\n {pnlPercent.toFixed(1)}%)\n </span>\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground whitespace-nowrap\">\n ${payoutIfRight.toFixed(2)}\n </div>\n <div className=\"flex-[1.5] pr-2 text-right text-neutral whitespace-nowrap\">\n {settlementStr}\n </div>\n <div className=\"w-16 shrink-0 text-right\">\n <button\n type=\"button\"\n className=\"text-xs text-neutral hover:text-foreground cursor-pointer transition-colors rounded px-2 py-0.5 border border-border hover:border-foreground/40\"\n >\n {closeLabel}\n </button>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Orders Tab — virtual list + infinite loading\n// ---------------------------------------------------------------------------\n\nfunction OrdersTab({\n source,\n walletAddress,\n marketSlugs,\n onCancelOrder,\n}: {\n source: ProviderSource;\n walletAddress: string;\n marketSlugs: string[];\n onCancelOrder?: (orderId: string) => void;\n}) {\n const { t } = useTranslation();\n const { data, isLoading, fetchNextPage, hasNextPage } = useInfiniteOrders({\n source,\n wallet_address: walletAddress,\n });\n\n const cancelMutation = useCancelOrder();\n\n const orders = useMemo(() => {\n const allItems = data?.pages?.flatMap((p) => p.items) ?? [];\n const openStatuses = new Set([\"live\", \"open\", \"submitted\", \"pending\"]);\n let filtered = allItems.filter((o) => openStatuses.has(o.status));\n if (marketSlugs.length > 0) {\n filtered = filtered.filter(\n (o) => o.market_id && marketSlugs.includes(o.market_id),\n );\n }\n return filtered;\n }, [data?.pages, marketSlugs]);\n\n const handleCancel = useCallback(\n (order: PredictOrder) => {\n if (onCancelOrder) {\n onCancelOrder(order.id);\n } else {\n cancelMutation.mutate({ source: order.source, id: order.id });\n }\n },\n [onCancelOrder, cancelMutation],\n );\n\n const itemCount = orders.length;\n const rowCount = itemCount + (hasNextPage ? 1 : 0);\n\n const isRowLoaded = useCallback(\n (index: number) => index < itemCount,\n [itemCount],\n );\n\n const loadMoreRows = useCallback(async () => {\n await fetchNextPage();\n }, [fetchNextPage]);\n\n const onRowsRendered = useInfiniteLoader({\n isRowLoaded,\n loadMoreRows,\n rowCount,\n threshold: 5,\n });\n\n if (isLoading) return <TabSkeleton />;\n\n if (orders.length === 0 && !hasNextPage) {\n return <EmptyState message={t(\"predict.openOrders.empty\")} />;\n }\n\n return (\n <div className=\"flex flex-col h-full\">\n <div\n className=\"flex items-center text-neutral text-xs lg:text-sm font-normal shrink-0\"\n style={{ height: HEADER_HEIGHT }}\n >\n <div className=\"w-16 shrink-0 pr-2\">{t(\"predict.openOrders.side\")}</div>\n <div className=\"flex-1 pr-2\">{t(\"predict.openOrders.outcome\")}</div>\n <div className=\"flex-1 pr-2\">{t(\"predict.openOrders.type\")}</div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.openOrders.price\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.openOrders.filled\")}\n </div>\n <div className=\"w-20 shrink-0 pr-2\">\n {t(\"predict.openOrders.status\")}\n </div>\n <div className=\"w-16 shrink-0\" />\n </div>\n\n <List\n style={{ height: LIST_HEIGHT }}\n onRowsRendered={onRowsRendered}\n rowComponent={OrderVirtualRow}\n rowCount={rowCount}\n rowHeight={ROW_HEIGHT}\n rowProps={{\n orders,\n itemCount,\n onCancel: handleCancel,\n isCancelling: cancelMutation.isPending,\n cancelLabel: t(\"predict.openOrders.cancel\"),\n }}\n />\n </div>\n );\n}\n\ntype OrderRowData = {\n orders: PredictOrder[];\n itemCount: number;\n onCancel: (order: PredictOrder) => void;\n isCancelling: boolean;\n cancelLabel: string;\n};\n\nfunction OrderVirtualRow({\n index,\n style,\n orders,\n itemCount,\n onCancel,\n isCancelling,\n cancelLabel,\n}: RowComponentProps<OrderRowData>) {\n if (index >= itemCount) {\n return (\n <div style={style} className=\"flex justify-center items-center\">\n <Spinner size=\"sm\" />\n </div>\n );\n }\n\n const order = orders[index];\n if (!order) return null;\n\n const isBuy = order.side === \"BUY\";\n\n return (\n <div\n style={style}\n className=\"flex items-center border-b border-border/50 text-xs lg:text-sm\"\n >\n <div className=\"w-16 shrink-0 pr-2\">\n <span\n className={cn(\n \"inline-block rounded px-1.5 py-0.5 text-[10px] font-medium\",\n isBuy ? \"bg-primary/10 text-primary\" : \"bg-danger/10 text-danger\",\n )}\n >\n {order.side}\n </span>\n </div>\n <div className=\"flex-1 pr-2 text-foreground capitalize\">\n {order.outcome ?? \"—\"}\n </div>\n <div className=\"flex-1 pr-2 text-neutral capitalize\">\n {order.order_type ?? \"limit\"}\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {order.price ? formatPrice(parseFloat(order.price)) : \"—\"}\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {order.size_matched ?? \"0\"}/{order.original_size ?? \"—\"}\n </div>\n <div className=\"w-20 shrink-0 pr-2\">\n <OrderStatusBadge status={order.status} />\n </div>\n <div className=\"w-16 shrink-0 text-right\">\n <button\n type=\"button\"\n onClick={() => onCancel(order)}\n disabled={isCancelling}\n className=\"text-[10px] text-danger hover:text-danger/80 cursor-pointer disabled:opacity-50 transition-colors\"\n >\n {isCancelling ? <Spinner size=\"sm\" /> : cancelLabel}\n </button>\n </div>\n </div>\n );\n}\n\nfunction OrderStatusBadge({ status }: { status: OrderStatus }) {\n const colorMap: Record<string, string> = {\n live: \"bg-success/10 text-success\",\n open: \"bg-success/10 text-success\",\n submitted: \"bg-warning/10 text-warning\",\n pending: \"bg-warning/10 text-warning\",\n matched: \"bg-primary/10 text-primary\",\n cancelled: \"bg-neutral/10 text-neutral\",\n failed: \"bg-danger/10 text-danger\",\n expired: \"bg-neutral/10 text-neutral\",\n };\n\n return (\n <span\n className={cn(\n \"inline-block rounded px-1.5 py-0.5 text-[10px] font-medium capitalize\",\n colorMap[status] ?? \"bg-neutral/10 text-neutral\",\n )}\n >\n {status}\n </span>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Trades Tab — virtual list + infinite loading\n// ---------------------------------------------------------------------------\n\nfunction TradesTab({\n source,\n walletAddress,\n}: {\n source: ProviderSource;\n walletAddress: string;\n}) {\n const { t } = useTranslation();\n const { data, isLoading, fetchNextPage, hasNextPage } = useInfiniteTrades({\n source,\n wallet: walletAddress,\n limit: 50,\n });\n\n const trades = useMemo(\n () => data?.pages?.flatMap((p) => p.items) ?? [],\n [data?.pages],\n );\n\n const itemCount = trades.length;\n const rowCount = itemCount + (hasNextPage ? 1 : 0);\n\n const isRowLoaded = useCallback(\n (index: number) => index < itemCount,\n [itemCount],\n );\n\n const loadMoreRows = useCallback(async () => {\n await fetchNextPage();\n }, [fetchNextPage]);\n\n const onRowsRendered = useInfiniteLoader({\n isRowLoaded,\n loadMoreRows,\n rowCount,\n threshold: 5,\n });\n\n if (isLoading) return <TabSkeleton />;\n\n if (trades.length === 0 && !hasNextPage) {\n return <EmptyState message={t(\"predict.tradeHistory.empty\")} />;\n }\n\n return (\n <div className=\"flex flex-col h-full\">\n <div\n className=\"flex items-center text-neutral text-xs lg:text-sm font-normal shrink-0\"\n style={{ height: HEADER_HEIGHT }}\n >\n <div className=\"w-16 shrink-0 pr-2\">\n {t(\"predict.tradeHistory.side\")}\n </div>\n <div className=\"flex-1 pr-2\">{t(\"predict.tradeHistory.outcome\")}</div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.tradeHistory.price\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.tradeHistory.qty\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.tradeHistory.total\")}\n </div>\n <div className=\"flex-[1.5] pr-2 text-right\">\n {t(\"predict.tradeHistory.time\")}\n </div>\n </div>\n\n <List\n style={{ height: LIST_HEIGHT }}\n onRowsRendered={onRowsRendered}\n rowComponent={TradeVirtualRow}\n rowCount={rowCount}\n rowHeight={ROW_HEIGHT}\n rowProps={{ trades, itemCount }}\n />\n </div>\n );\n}\n\ntype TradeRowData = {\n trades: PredictTrade[];\n itemCount: number;\n};\n\nfunction TradeVirtualRow({\n index,\n style,\n trades,\n itemCount,\n}: RowComponentProps<TradeRowData>) {\n if (index >= itemCount) {\n return (\n <div style={style} className=\"flex justify-center items-center\">\n <Spinner size=\"sm\" />\n </div>\n );\n }\n\n const trade = trades[index];\n if (!trade) return null;\n\n const isBuy = trade.side?.toUpperCase() === \"BUY\";\n const timeStr = formatTimestamp(trade.timestamp);\n const price = trade.price ?? 0;\n const usdSize = trade.usd_size ?? 0;\n\n return (\n <div\n style={style}\n className=\"flex items-center border-b border-border/50 text-xs lg:text-sm\"\n >\n <div className=\"w-16 shrink-0 pr-2\">\n <span\n className={cn(\n \"inline-block rounded px-1.5 py-0.5 text-[10px] font-medium\",\n isBuy ? \"bg-primary/10 text-primary\" : \"bg-danger/10 text-danger\",\n )}\n >\n {trade.side}\n </span>\n </div>\n <div className=\"flex-1 pr-2 text-foreground capitalize\">\n {trade.outcome ?? \"—\"}\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {formatPrice(price)}\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {trade.size}\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n ${usdSize.toFixed(2)}\n </div>\n <div className=\"flex-[1.5] pr-2 text-right text-neutral whitespace-nowrap\">\n {timeStr}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Shared helpers\n// ---------------------------------------------------------------------------\n\nfunction EmptyState({ message }: { message: string }) {\n return (\n <div\n className=\"flex items-center justify-center text-sm text-neutral\"\n style={{ height: CONTENT_HEIGHT }}\n >\n {message}\n </div>\n );\n}\n\nfunction TabSkeleton() {\n return (\n <div\n className=\"flex flex-col gap-y-2 py-3 animate-pulse\"\n style={{ height: CONTENT_HEIGHT }}\n >\n {Array.from({ length: 6 }).map((_, i) => (\n <Skeleton key={i} className=\"h-8 w-full rounded-md\" />\n ))}\n </div>\n );\n}\n\nfunction formatPrice(price: number): string {\n const cents = price * 100;\n if (cents < 1 && cents > 0) return \"< 1¢\";\n return `${cents.toFixed(1)}¢`;\n}\n\nfunction formatTimestamp(unixSeconds: number): string {\n const date = new Date(unixSeconds * 1000);\n const month = (date.getMonth() + 1).toString().padStart(2, \"0\");\n const day = date.getDate().toString().padStart(2, \"0\");\n const hours = date.getHours().toString().padStart(2, \"0\");\n const mins = date.getMinutes().toString().padStart(2, \"0\");\n return `${month}/${day} ${hours}:${mins}`;\n}\n\nfunction formatSettlementTime(isoString: string): string {\n try {\n const date = new Date(isoString);\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n } catch {\n return \"—\";\n }\n}\n","// ---------------------------------------------------------------------------\n// Shimmer animation — same visual language as events.skeleton / matches\n// ---------------------------------------------------------------------------\n\nconst SHIMMER_CSS = `\n@keyframes detailShimmer{0%{background-position:200% 0}100%{background-position:-200% 0}}\n`;\n\nconst shimmer: React.CSSProperties = {\n background:\n \"linear-gradient(90deg, rgba(255,255,255,0.03) 25%, rgba(255,255,255,0.06) 50%, rgba(255,255,255,0.03) 75%)\",\n backgroundSize: \"200% 100%\",\n animation: \"detailShimmer 1.8s ease-in-out infinite\",\n borderRadius: 6,\n};\n\nfunction shimmerDelay(delay: number): React.CSSProperties {\n return { ...shimmer, animationDelay: `${delay}ms` };\n}\n\n// ---------------------------------------------------------------------------\n// EventDetailSkeleton\n// ---------------------------------------------------------------------------\n\nexport interface EventDetailSkeletonProps {\n marketCount?: number;\n showBack?: boolean;\n}\n\nexport function EventDetailSkeleton({\n marketCount = 4,\n showBack,\n}: EventDetailSkeletonProps) {\n return (\n <>\n <style>{SHIMMER_CSS}</style>\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n width: \"100%\",\n gap: 20,\n }}\n >\n {/* Back button placeholder */}\n {showBack && <div style={{ height: 20 }} />}\n\n {/* Header — avatar + tags + title */}\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 12 }}>\n <div\n style={{\n ...shimmer,\n width: 64,\n height: 64,\n borderRadius: 10,\n flexShrink: 0,\n }}\n />\n <div\n style={{\n flex: 1,\n minWidth: 0,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\n <div style={{ ...shimmerDelay(0), height: 14, width: 48 }} />\n <div style={{ ...shimmerDelay(30), height: 14, width: 40 }} />\n <div style={{ ...shimmerDelay(60), height: 14, width: 40 }} />\n </div>\n <div\n style={{\n ...shimmerDelay(80),\n height: 20,\n width: \"80%\",\n maxWidth: 384,\n borderRadius: 4,\n }}\n />\n </div>\n </div>\n\n {/* Countdown */}\n <div style={{ ...shimmerDelay(100), height: 16, width: 192 }} />\n\n {/* Chart area — legend + chart + bottom bar */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 12 }}>\n {/* Legend bar */}\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 16 }}>\n <div style={{ ...shimmerDelay(120), height: 16, width: 96 }} />\n <div style={{ ...shimmerDelay(140), height: 16, width: 80 }} />\n </div>\n {/* Chart body */}\n <div\n style={{\n ...shimmerDelay(160),\n height: 300,\n width: \"100%\",\n borderRadius: 12,\n }}\n />\n {/* Bottom bar — volume + interval switcher */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n }}\n >\n <div style={{ ...shimmerDelay(180), height: 16, width: 80 }} />\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <div\n style={{\n ...shimmerDelay(200),\n height: 28,\n width: 200,\n borderRadius: 8,\n }}\n />\n <div\n style={{\n ...shimmerDelay(220),\n height: 28,\n width: 112,\n borderRadius: 8,\n }}\n />\n </div>\n </div>\n </div>\n\n {/* Markets table */}\n <div style={{ display: \"flex\", flexDirection: \"column\" }}>\n {/* Table header */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"8px 0\",\n }}\n >\n <div style={{ ...shimmerDelay(240), height: 14, width: 56 }} />\n </div>\n {/* Market rows */}\n {Array.from({ length: marketCount }).map((_, i) => (\n <div\n key={i}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n padding: \"10px 0\",\n borderBottom: \"1px solid rgba(39,39,42,0.5)\",\n }}\n >\n <div\n style={{\n ...shimmerDelay(260 + i * 40),\n width: 28,\n height: 28,\n borderRadius: 8,\n flexShrink: 0,\n }}\n />\n <div\n style={{\n flex: 1,\n minWidth: 0,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n }}\n >\n <div\n style={{\n ...shimmerDelay(280 + i * 40),\n height: 14,\n width: i % 2 === 0 ? 192 : 160,\n }}\n />\n <div\n style={{\n ...shimmerDelay(300 + i * 40),\n height: 10,\n width: 64,\n }}\n />\n </div>\n <div\n style={{ ...shimmerDelay(320 + i * 40), height: 16, width: 40 }}\n />\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <div\n style={{\n ...shimmerDelay(340 + i * 40),\n height: 32,\n width: 80,\n borderRadius: 8,\n }}\n />\n <div\n style={{\n ...shimmerDelay(360 + i * 40),\n height: 32,\n width: 80,\n borderRadius: 8,\n }}\n />\n </div>\n </div>\n ))}\n </div>\n\n {/* Rules */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>\n <div style={{ ...shimmerDelay(400), height: 16, width: 64 }} />\n <div style={{ ...shimmerDelay(420), height: 14, width: \"100%\" }} />\n <div style={{ ...shimmerDelay(440), height: 14, width: \"80%\" }} />\n <div style={{ ...shimmerDelay(460), height: 14, width: \"60%\" }} />\n </div>\n </div>\n </>\n );\n}\n\n// ---------------------------------------------------------------------------\n// TradeFormSkeleton — zinc glass card matching event/match card style\n// ---------------------------------------------------------------------------\n\nexport function TradeFormSkeleton() {\n return (\n <>\n <style>{SHIMMER_CSS}</style>\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 12,\n borderRadius: 14,\n border: \"1px solid rgba(39,39,42,0.6)\",\n background: \"rgba(24,24,27,0.4)\",\n padding: 16,\n }}\n >\n {/* Outcome tabs */}\n <div\n style={{\n ...shimmerDelay(0),\n height: 40,\n width: \"100%\",\n borderRadius: 8,\n }}\n />\n {/* Amount input area */}\n <div\n style={{\n ...shimmerDelay(60),\n height: 96,\n width: \"100%\",\n borderRadius: 8,\n }}\n />\n {/* Submit button */}\n <div\n style={{\n ...shimmerDelay(120),\n height: 40,\n width: \"100%\",\n borderRadius: 8,\n }}\n />\n </div>\n </>\n );\n}\n","// =============================================================================\n// EventMarketDepthChartUI — CSS div implementation (no Recharts)\n//\n// Reverse-engineered from Jupiter's production code (chunk-1824.js).\n//\n// Why CSS divs instead of Recharts SVG?\n// Hover performance: brightness filter applied via imperative DOM mutation —\n// zero React re-renders on hover. Recharts requires a setState → full chart\n// re-render (101 shape functions) on every mousemove.\n//\n// Visual encoding:\n// BAR HEIGHT = (cumulative / maxCumulative) ^ 0.3 (Jupiter's z-function)\n// BAR OPACITY = 1.0 (order exists at this price) | 0.5 (cumulative only)\n// HOVER = filter: brightness(1.5) applied imperatively to the bar div\n//\n// Coloring: bearish (bid/buy-Yes) | bullish (ask/sell-Yes).\n// =============================================================================\nimport { useState, useMemo, useRef, useCallback, memo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface DepthLevel {\n price: number;\n quantity: number;\n}\n\nexport interface EventMarketDepthChartUIProps {\n bids: DepthLevel[];\n asks: DepthLevel[];\n}\n\n// ---------------------------------------------------------------------------\n// Color tokens\n// ---------------------------------------------------------------------------\n\n/** Bid bars: bullish (lime-green), buying YES. */\nconst BID_COLOR = \"var(--color-bullish)\";\n/** Ask bars: bearish (orange-red), selling YES. */\nconst ASK_COLOR = \"var(--color-bearish)\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Format a number using K / M / B notation (thousands-based).\n * 1500 → \"1.5K\" | 2300000 → \"2.3M\" | 1200000000 → \"1.2B\" | 999 → \"999\"\n */\nexport function formatKMB(n: number): string {\n const abs = Math.abs(n);\n if (abs >= 1_000_000_000) {\n return `${parseFloat((n / 1_000_000_000).toFixed(2))}B`;\n }\n if (abs >= 1_000_000) {\n return `${parseFloat((n / 1_000_000).toFixed(2))}M`;\n }\n if (abs >= 1_000) {\n return `${parseFloat((n / 1_000).toFixed(2))}K`;\n }\n return n.toLocaleString();\n}\n\n// ---------------------------------------------------------------------------\n// Data model\n// ---------------------------------------------------------------------------\n\nexport interface DepthSlot {\n priceCents: number;\n // (cumulative / maxCumulative)^0.3, range [0, 1]\n displayHeight: number;\n // 1.0 = actual order here; 0.5 = only cumulative depth passes through\n opacity: number;\n isBid: boolean;\n isAsk: boolean;\n bidCumTotal: number;\n askCumTotal: number;\n bidCumCost: number;\n askCumCost: number;\n}\n\n/**\n * Jupiter height formula (z function):\n * z(e, t) = e<=0 || t<=0 ? 0 : 100 * Math.pow(e/t, 0.3)\n * Returns normalized height in [0, 1].\n */\nfunction heightPow(cumulative: number, maxCumulative: number): number {\n if (cumulative <= 0 || maxCumulative <= 0) return 0;\n return Math.pow(cumulative / maxCumulative, 0.3);\n}\n\nfunction buildDepthData(bids: DepthLevel[], asks: DepthLevel[]): DepthSlot[] {\n const rawBidQty = new Float64Array(101);\n const rawAskQty = new Float64Array(101);\n\n for (const bid of bids) {\n const slot = Math.round(bid.price * 100);\n if (slot >= 0 && slot <= 100) rawBidQty[slot] += bid.quantity;\n }\n for (const ask of asks) {\n const slot = Math.round(ask.price * 100);\n if (slot >= 0 && slot <= 100) rawAskQty[slot] += ask.quantity;\n }\n\n // Bid cumulative: spread → 0¢\n let cumBid = 0;\n let cumBidCost = 0;\n const bidTotal = new Float64Array(101);\n const bidCumCostArr = new Float64Array(101);\n for (let i = 100; i >= 0; i--) {\n cumBid += rawBidQty[i];\n cumBidCost += (rawBidQty[i] * i) / 100;\n bidTotal[i] = cumBid;\n bidCumCostArr[i] = cumBidCost;\n }\n\n // Ask cumulative: spread → 100¢\n let cumAsk = 0;\n let cumAskCost = 0;\n const askTotal = new Float64Array(101);\n const askCumCostArr = new Float64Array(101);\n for (let i = 0; i <= 100; i++) {\n cumAsk += rawAskQty[i];\n cumAskCost += (rawAskQty[i] * i) / 100;\n askTotal[i] = cumAsk;\n askCumCostArr[i] = cumAskCost;\n }\n\n const maxCumulative = Math.max(bidTotal[0] ?? 0, askTotal[100] ?? 0);\n\n return Array.from({ length: 101 }, (_, i) => {\n const isBid = bidTotal[i] > 0;\n const isAsk = askTotal[i] > 0;\n const cumulative = bidTotal[i] || askTotal[i];\n const hasOrder = rawBidQty[i] > 0 || rawAskQty[i] > 0;\n\n return {\n priceCents: i,\n displayHeight: heightPow(cumulative, maxCumulative),\n opacity: cumulative > 0 ? (hasOrder ? 1 : 0.5) : 0,\n isBid,\n isAsk,\n bidCumTotal: bidTotal[i],\n askCumTotal: askTotal[i],\n bidCumCost: bidCumCostArr[i],\n askCumCost: askCumCostArr[i],\n };\n });\n}\n\n// ---------------------------------------------------------------------------\n// Tooltip\n// ---------------------------------------------------------------------------\n\ninterface TooltipInfo {\n priceCents: number;\n isBid: boolean;\n cumTotal: number;\n cumCost: number;\n leftPct: number;\n}\n\nfunction DepthTooltipPanel({ info }: { info: TooltipInfo }) {\n const { t } = useTranslation();\n const color = info.isBid ? BID_COLOR : ASK_COLOR;\n const left = info.leftPct > 65 ? undefined : `${info.leftPct}%`;\n const right = info.leftPct > 65 ? `${100 - info.leftPct}%` : undefined;\n\n return (\n <div\n style={{\n position: \"absolute\",\n top: 8,\n left,\n right,\n zIndex: 10,\n background: \"rgba(17,24,39,0.95)\",\n border: \"1px solid rgba(255,255,255,0.08)\",\n borderRadius: 8,\n padding: \"8px 12px\",\n fontSize: 12,\n color: \"#f9fafb\",\n minWidth: 140,\n pointerEvents: \"none\",\n }}\n >\n <div style={{ marginBottom: 4, fontWeight: 600 }}>\n {t(\"predict.orderBook.depthToPrice\", { price: info.priceCents })}\n </div>\n <div style={{ color }}>\n {t(\"predict.orderBook.depthContracts\", {\n amount: formatKMB(Math.round(info.cumTotal)),\n })}\n </div>\n <div style={{ color }}>${formatKMB(Math.round(info.cumCost))}</div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Single column — memo-ized so only the hovered column re-renders\n// ---------------------------------------------------------------------------\n\ninterface DepthColumnProps {\n slot: DepthSlot;\n onEnter: (slot: DepthSlot, barEl: HTMLDivElement | null) => void;\n onLeave: () => void;\n}\n\nconst DepthColumn = memo(function DepthColumn({\n slot,\n onEnter,\n onLeave,\n}: DepthColumnProps) {\n const barRef = useRef<HTMLDivElement>(null);\n const isVisible = slot.isBid || slot.isAsk;\n const bgColor = slot.isBid ? BID_COLOR : slot.isAsk ? ASK_COLOR : undefined;\n\n return (\n <div\n style={{\n position: \"absolute\",\n left: `${slot.priceCents}%`,\n // 1px transparent right border creates the same subtle column\n // separation as Jupiter's borderRightWidth: \"0.0625rem\"\n width: \"1%\",\n height: \"100%\",\n boxSizing: \"border-box\",\n borderRight: slot.priceCents < 100 ? \"1px solid transparent\" : \"none\",\n cursor: isVisible ? \"crosshair\" : \"default\",\n }}\n onMouseEnter={() => onEnter(slot, barRef.current)}\n onMouseLeave={onLeave}\n >\n {isVisible && (\n <div\n ref={barRef}\n style={{\n position: \"absolute\",\n bottom: 0,\n left: 0,\n width: \"100%\",\n height: `${slot.displayHeight * 100}%`,\n backgroundColor: bgColor,\n opacity: slot.opacity,\n }}\n />\n )}\n </div>\n );\n});\n\n// ---------------------------------------------------------------------------\n// X-axis\n// ---------------------------------------------------------------------------\n\nconst X_TICKS = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100];\n\nfunction DepthXAxis() {\n return (\n // Mirrors Jupiter: h-6 flex items-center with top+bottom border and dim bg\n <div\n className=\"relative flex h-6 items-center border-b border-t border-border px-1\"\n style={{ background: \"rgba(0,0,0,0.15)\" }}\n >\n {X_TICKS.map((tick) => (\n <span\n key={tick}\n className=\"absolute text-neutral font-normal\"\n style={{\n fontSize: 10,\n left: `${tick}%`,\n // 0 → no offset; 100 → pull fully left; others → center\n transform:\n tick === 0\n ? \"translateX(0px)\"\n : tick === 100\n ? \"translateX(-100%)\"\n : \"translateX(-50%)\",\n }}\n >\n {tick}\n </span>\n ))}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EventMarketDepthChartUI({\n bids,\n asks,\n}: EventMarketDepthChartUIProps) {\n const { t } = useTranslation();\n const data = useMemo(() => buildDepthData(bids, asks), [bids, asks]);\n\n const midPrice = useMemo(() => {\n const bestBid = bids.length > 0 ? Math.max(...bids.map((b) => b.price)) : 0;\n const bestAsk = asks.length > 0 ? Math.min(...asks.map((a) => a.price)) : 1;\n return Math.round(((bestBid + bestAsk) / 2) * 100);\n }, [bids, asks]);\n\n const hasData = useMemo(() => data.some((d) => d.isBid || d.isAsk), [data]);\n\n // Tooltip state — only this re-renders on hover, not the bar columns\n const [tooltip, setTooltip] = useState<TooltipInfo | null>(null);\n\n // Active bar element ref — we mutate DOM directly for brightness filter\n const activeBarRef = useRef<HTMLDivElement | null>(null);\n\n const handleColumnEnter = useCallback(\n (slot: DepthSlot, barEl: HTMLDivElement | null) => {\n // Remove brightness from the previously hovered bar\n if (activeBarRef.current) {\n activeBarRef.current.style.filter = \"\";\n }\n // Apply brightness to the newly hovered bar\n if (barEl) {\n barEl.style.filter = \"brightness(1.5)\";\n activeBarRef.current = barEl;\n } else {\n activeBarRef.current = null;\n }\n\n // Update tooltip (only re-renders the tooltip panel)\n if (slot.isBid || slot.isAsk) {\n setTooltip({\n priceCents: slot.priceCents,\n isBid: slot.isBid,\n cumTotal: slot.isBid ? slot.bidCumTotal : slot.askCumTotal,\n cumCost: slot.isBid ? slot.bidCumCost : slot.askCumCost,\n leftPct: slot.priceCents,\n });\n } else {\n setTooltip(null);\n }\n },\n [],\n );\n\n const handleColumnLeave = useCallback(() => {\n if (activeBarRef.current) {\n activeBarRef.current.style.filter = \"\";\n activeBarRef.current = null;\n }\n setTooltip(null);\n }, []);\n\n if (!hasData) {\n return (\n <div\n style={{\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"#6b7280\",\n fontSize: 13,\n }}\n >\n {t(\"predict.orderBook.noData\")}\n </div>\n );\n }\n\n return (\n // Fill the parent container (flex-1 in the widget).\n // flex-col: bar area flex-grows, x-axis stays h-6.\n // overflow: hidden prevents the priceCents=100 column (left:100%+width:1%)\n // from creating a horizontal scrollbar on any ancestor.\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n width: \"100%\",\n height: \"100%\",\n userSelect: \"none\",\n overflow: \"hidden\",\n }}\n >\n {/* Chart area — fills available height above the X-axis */}\n <div\n style={{\n flex: 1,\n position: \"relative\",\n width: \"100%\",\n overflow: \"hidden\",\n }}\n >\n {/* Mid-price dashed reference line */}\n {midPrice > 0 && (\n <div\n style={{\n position: \"absolute\",\n left: `${midPrice}%`,\n top: 0,\n bottom: 0,\n width: 1,\n backgroundImage:\n \"repeating-linear-gradient(to bottom, #6b7280 0, #6b7280 4px, transparent 4px, transparent 8px)\",\n zIndex: 1,\n pointerEvents: \"none\",\n }}\n />\n )}\n\n {/* Tooltip */}\n {tooltip && <DepthTooltipPanel info={tooltip} />}\n\n {/* Bar columns — each memo-ized, only the hovered one re-renders */}\n {data.map((slot) => (\n <DepthColumn\n key={slot.priceCents}\n slot={slot}\n onEnter={handleColumnEnter}\n onLeave={handleColumnLeave}\n />\n ))}\n </div>\n\n {/* X-axis */}\n <DepthXAxis />\n </div>\n );\n}\n","import { useState, useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictMarket } from \"@liberfi.io/react-predict\";\nimport { useOrderbook } from \"@liberfi.io/react-predict\";\nimport {\n Spinner,\n cn,\n OrderbookDepthIcon,\n OrderbookTableIcon,\n} from \"@liberfi.io/ui\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport {\n EventMarketDepthChartUI,\n formatKMB,\n type DepthLevel,\n} from \"./event-market-depth-chart.ui\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Format a price (0–1) as cents with up to 1 decimal place.\n * Whole numbers: \"8¢\" Fractional: \"8.1¢\"\n * Matches Jupiter's display format.\n */\nfunction formatPriceCents(price: number): string {\n const cents = price * 100;\n const rounded = Math.round(cents * 10) / 10; // round to 1 decimal\n return Number.isInteger(rounded) ? `${rounded}¢` : `${rounded.toFixed(1)}¢`;\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype ViewMode = \"depth\" | \"table\";\n\nexport interface EventMarketDetailWidgetProps {\n market: PredictMarket;\n /** Which outcome's orderbook to display; defaults to \"yes\". */\n outcome?: TradeOutcome;\n onTradeAction?: (\n market: PredictMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Loading skeleton shared by depth and table views\n// ---------------------------------------------------------------------------\n\nfunction OrderbookSkeleton() {\n const { t } = useTranslation();\n return (\n <div className=\"flex items-center justify-center gap-x-2 h-full text-neutral text-xs\">\n <Spinner size=\"sm\" />\n <span>{t(\"predict.orderBook.loading\")}</span>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EventMarketDetailWidget({\n market,\n outcome = \"yes\",\n onTradeAction,\n}: EventMarketDetailWidgetProps) {\n const { t } = useTranslation();\n const [viewMode, setViewMode] = useState<ViewMode>(\"depth\");\n const isNo = outcome === \"no\";\n\n const source = market.source;\n\n const { data: orderbook, isLoading: isOrderbookLoading } = useOrderbook({\n slug: market.slug,\n source,\n });\n\n const bids = useMemo(() => {\n const raw = isNo ? orderbook?.asks : orderbook?.bids;\n return (raw ?? []).map((o) => ({\n price: isNo ? 1 - o.price : o.price,\n quantity: o.size,\n }));\n }, [orderbook?.bids, orderbook?.asks, isNo]);\n\n const asks = useMemo(() => {\n const raw = isNo ? orderbook?.bids : orderbook?.asks;\n return (raw ?? []).map((o) => ({\n price: isNo ? 1 - o.price : o.price,\n quantity: o.size,\n }));\n }, [orderbook?.bids, orderbook?.asks, isNo]);\n\n const bestBid = useMemo(\n () => (bids.length > 0 ? Math.max(...bids.map((b) => b.price)) : null),\n [bids],\n );\n const bestAsk = useMemo(\n () => (asks.length > 0 ? Math.min(...asks.map((a) => a.price)) : null),\n [asks],\n );\n const spread = useMemo(() => {\n if (bestBid == null || bestAsk == null) return null;\n const raw = (bestAsk - bestBid) * 100;\n const rounded = Math.round(raw * 10) / 10;\n return rounded;\n }, [bestBid, bestAsk]);\n\n // Fixed total height matches Jupiter (header + content = 262px).\n return (\n <div className=\"flex flex-col h-[262px]\">\n {/*\n * Header — mirrors Jupiter's exact layout:\n * [flex-1] Spread [flex-1 center] Bid | Ask [flex-1 end] icon buttons\n * Each section is flex-1 (equal thirds), no absolute positioning.\n * Button active state is text-only (no bg highlight), matching Jupiter.\n */}\n <div className=\"flex h-9 items-center border-b border-border px-1 text-xs\">\n {/* LEFT: Spread — flex-1, plain neutral text */}\n <span className=\"flex-1 text-left text-neutral\">\n {spread != null\n ? `${t(\"predict.orderBook.spread\")}: ${Number.isInteger(spread) ? `${spread}¢` : `${spread.toFixed(1)}¢`}`\n : null}\n </span>\n\n {/* CENTER: Bid | Ask — flex-1, centered */}\n <span className=\"flex flex-1 items-center justify-center gap-x-1 whitespace-nowrap\">\n {bestBid != null && (\n <span style={{ color: \"var(--color-bullish)\" }}>\n {t(\"predict.trade.bestBid\")}: {formatPriceCents(bestBid)}\n </span>\n )}\n {bestBid != null && bestAsk != null && (\n <span className=\"text-neutral\">|</span>\n )}\n {bestAsk != null && (\n <span style={{ color: \"var(--color-bearish)\" }}>\n {t(\"predict.trade.bestAsk\")}: {formatPriceCents(bestAsk)}\n </span>\n )}\n </span>\n\n {/* RIGHT: View mode toggle icons — flex-1, end-aligned, color-only active state */}\n <div className=\"flex flex-1 justify-end\">\n <button\n type=\"button\"\n title={viewMode === \"depth\" ? \"Orderbook\" : \"Depth chart\"}\n onClick={() =>\n setViewMode((prev) => (prev === \"depth\" ? \"table\" : \"depth\"))\n }\n className=\"flex items-center text-neutral transition-colors cursor-pointer hover:text-foreground\"\n >\n {viewMode === \"depth\" ? (\n <OrderbookTableIcon className=\"h-4 w-4\" />\n ) : (\n <OrderbookDepthIcon className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n </div>\n\n {/* Content area — fills the remaining height so total stays at 262px */}\n <div className=\"flex-1 min-h-0 overflow-hidden\">\n {viewMode === \"depth\" && (\n <>\n {isOrderbookLoading ? (\n <OrderbookSkeleton />\n ) : (\n <EventMarketDepthChartUI bids={bids} asks={asks} />\n )}\n </>\n )}\n\n {viewMode === \"table\" && (\n <>\n {isOrderbookLoading ? (\n <OrderbookSkeleton />\n ) : (\n <EventOrderbookTableUI\n bids={bids}\n asks={asks}\n bestBid={bestBid ?? undefined}\n bestAsk={bestAsk ?? undefined}\n spread={spread ?? undefined}\n />\n )}\n </>\n )}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// EventOrderbookTableUI — Jupiter-style traditional orderbook table\n// ---------------------------------------------------------------------------\n\nconst MAX_ROWS_PER_SIDE = 8;\n\ninterface EventOrderbookTableUIProps {\n bids: DepthLevel[];\n asks: DepthLevel[];\n bestBid?: number;\n bestAsk?: number;\n spread?: number;\n}\n\nfunction EventOrderbookTableUI({\n bids,\n asks,\n spread,\n}: EventOrderbookTableUIProps) {\n const { t } = useTranslation();\n\n // Asks: closest-to-spread first (ascending), take N, reverse for display (highest at top)\n const sortedAsks = useMemo(\n () =>\n [...asks]\n .sort((a, b) => a.price - b.price)\n .slice(0, MAX_ROWS_PER_SIDE)\n .reverse(),\n [asks],\n );\n\n // Bids: highest first (closest to spread at top), take N\n const sortedBids = useMemo(\n () =>\n [...bids].sort((a, b) => b.price - a.price).slice(0, MAX_ROWS_PER_SIDE),\n [bids],\n );\n\n // Max quantity across all visible rows — used for background depth bar width\n const maxQty = useMemo(() => {\n const all = [...sortedAsks, ...sortedBids].map((r) => r.quantity);\n return Math.max(...all, 1);\n }, [sortedAsks, sortedBids]);\n\n const isEmpty = sortedAsks.length === 0 && sortedBids.length === 0;\n\n if (isEmpty) {\n return (\n <div className=\"flex items-center justify-center h-full text-xs text-neutral\">\n {t(\"predict.orderBook.empty\")}\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col h-full overflow-y-auto text-xs font-mono select-none\">\n {/* Ask rows (sell Yes / buy No) */}\n {sortedAsks.map((ask) => (\n <OrderbookRow\n key={`ask-${ask.price}`}\n price={ask.price}\n quantity={ask.quantity}\n side=\"ask\"\n maxQty={maxQty}\n />\n ))}\n\n {/* Spread separator */}\n <div className=\"flex items-center justify-center gap-x-2 py-1 border-y border-border text-neutral text-[10px]\">\n {spread != null && (\n <span>\n {t(\"predict.orderBook.spread\")}:{\" \"}\n {Number.isInteger(spread) ? `${spread}¢` : `${spread.toFixed(1)}¢`}\n </span>\n )}\n </div>\n\n {/* Bid rows (buy Yes) */}\n {sortedBids.map((bid) => (\n <OrderbookRow\n key={`bid-${bid.price}`}\n price={bid.price}\n quantity={bid.quantity}\n side=\"bid\"\n maxQty={maxQty}\n />\n ))}\n\n {/* Column headers at the bottom, matching Jupiter's layout */}\n <div className=\"grid grid-cols-3 px-2 pt-2 pb-0.5 text-[10px] text-neutral border-t border-border\">\n <span>{t(\"predict.orderBook.price\")}</span>\n <span className=\"text-center\">{t(\"predict.orderBook.contracts\")}</span>\n <span className=\"text-right\">{t(\"predict.orderBook.total\")}</span>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Single orderbook row with background depth bar\n// ---------------------------------------------------------------------------\n\ninterface OrderbookRowProps {\n price: number;\n quantity: number;\n side: \"bid\" | \"ask\";\n maxQty: number;\n}\n\nfunction OrderbookRow({ price, quantity, side, maxQty }: OrderbookRowProps) {\n const isAsk = side === \"ask\";\n const depthPct = Math.min((quantity / maxQty) * 100, 100);\n const bgClass = isAsk ? \"bg-bearish/10\" : \"bg-bullish/10\";\n const priceClass = isAsk ? \"text-bearish\" : \"text-bullish\";\n\n const formattedContracts = formatKMB(Math.round(quantity));\n const dollarValue = Math.round(quantity * price);\n const formattedTotal = `$${formatKMB(dollarValue)}`;\n\n return (\n <div className=\"relative grid grid-cols-3 px-2 py-1 hover:bg-content2 transition-colors cursor-default\">\n {/* Background depth bar */}\n <div\n className={`absolute inset-y-0 left-0 ${bgClass} transition-[width] duration-200`}\n style={{ width: `${depthPct}%` }}\n />\n {/* Price */}\n <span className={`relative z-10 ${priceClass}`}>\n {formatPriceCents(price)}\n </span>\n {/* Contracts */}\n <span className=\"relative z-10 text-foreground text-center\">\n {formattedContracts}\n </span>\n {/* Total */}\n <span className=\"relative z-10 text-foreground text-right\">\n {formattedTotal}\n </span>\n </div>\n );\n}\n","// =============================================================================\n// EventPriceChart\n//\n// Pixel-accurate clone of the Jupiter Prediction Market price chart.\n// Uses Recharts LineChart with 7 visual effects:\n// 1. Top legend (dot + label + live %)\n// 2. Real-time tooltip on hover\n// 3. Active cursor dot on each line\n// 4. Breathing pulsing dot at the last data point\n// 5. Left/right opacity overlay that follows the cursor\n// 6. Custom X/Y axis styling\n// 7. Horizontal dashed grid lines\n//\n// Accepts a PredictEvent and selects up to 4 markets to display via a chip selector.\n// =============================================================================\nimport {\n Component,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ErrorInfo,\n type ReactNode,\n} from \"react\";\nimport {\n CartesianGrid,\n Line,\n LineChart,\n ReferenceDot,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from \"recharts\";\nimport type { PredictEvent, PredictMarket } from \"@liberfi.io/react-predict\";\nimport {\n ChartRange,\n type ChartRangeType,\n useMarketHistory,\n type MarketHistorySeries,\n} from \"@liberfi.io/react-predict\";\nimport { DEFAULT_CHART_RANGE } from \"../../consts\";\n\n// ---------------------------------------------------------------------------\n// Error boundary — prevents chart crashes from taking down the page\n// ---------------------------------------------------------------------------\n\ninterface ChartErrorBoundaryState {\n error: Error | null;\n}\n\nclass ChartErrorBoundary extends Component<\n { children: ReactNode; fallbackHeight?: number },\n ChartErrorBoundaryState\n> {\n state: ChartErrorBoundaryState = { error: null };\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n componentDidCatch(error: Error, info: ErrorInfo) {\n console.error(\"[EventPriceChart] render error:\", error, info);\n }\n\n render() {\n if (this.state.error) {\n return (\n <div\n style={{\n height: this.props.fallbackHeight ?? 320,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n color: \"#6b7280\",\n fontSize: 13,\n }}\n >\n <span>Chart unavailable</span>\n <span style={{ fontSize: 11, opacity: 0.7 }}>\n {this.state.error.message}\n </span>\n </div>\n );\n }\n return this.props.children;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst MAX_SELECTED = 4;\n\n/** Jupiter-aligned chart colors */\nconst CHART_COLORS = [\n \"#22d3ee\", // cyan\n \"#a3e635\", // lime\n \"#f97316\", // orange\n \"#f472b6\", // pink\n \"#a78bfa\", // violet\n];\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction formatTimestamp(ms: number, range?: ChartRangeType): string {\n const d = new Date(ms);\n if (range === ChartRange.ONE_DAY) {\n // e.g. \"14:30\"\n return d.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n }\n // e.g. \"Mar 18\"\n return d.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" });\n}\n\nfunction formatTooltipTimestamp(ms: number, range?: ChartRangeType): string {\n const d = new Date(ms);\n if (range === ChartRange.ONE_DAY) {\n return d.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n }\n if (range === ChartRange.ONE_WEEK) {\n return d.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n }\n return d.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" });\n}\n\nfunction formatPercent(value: number): string {\n return `${(value * 100).toFixed(2)}%`;\n}\n\n// ---------------------------------------------------------------------------\n// Interval labels\n// ---------------------------------------------------------------------------\n\nconst INTERVAL_OPTIONS: { range: ChartRangeType; label: string }[] = [\n { range: ChartRange.ONE_DAY, label: \"1D\" },\n { range: ChartRange.ONE_WEEK, label: \"1W\" },\n { range: ChartRange.ONE_MONTH, label: \"1M\" },\n { range: ChartRange.ALL, label: \"ALL\" },\n];\n\n// ---------------------------------------------------------------------------\n// IntervalSwitcher — plain text buttons, Jupiter-style\n// ---------------------------------------------------------------------------\n\ninterface IntervalSwitcherProps {\n value: ChartRangeType;\n onChange: (range: ChartRangeType) => void;\n}\n\nfunction IntervalSwitcher({ value, onChange }: IntervalSwitcherProps) {\n return (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 2 }}>\n {INTERVAL_OPTIONS.map(({ range, label }) => {\n const isActive = range === value;\n return (\n <button\n key={range}\n onClick={() => onChange(range)}\n style={{\n padding: \"2px 8px\",\n border: \"none\",\n background: \"transparent\",\n color: isActive ? \"#f9fafb\" : \"#6b7280\",\n fontWeight: isActive ? 700 : 400,\n fontSize: 12,\n cursor: \"pointer\",\n borderRadius: 4,\n letterSpacing: \"0.02em\",\n transition: \"color 0.15s\",\n userSelect: \"none\",\n }}\n >\n {label}\n </button>\n );\n })}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// useCursorOverlay\n//\n// Returns refs for the chart wrapper div and the overlay div.\n// Mouse position tracking is done at the div level (not via Recharts internals)\n// so the approach works regardless of Recharts version or SVG structure.\n// DOM style is updated imperatively — zero React re-renders on mousemove.\n// ---------------------------------------------------------------------------\n\nfunction useCursorOverlay() {\n const wrapperRef = useRef<HTMLDivElement | null>(null);\n const overlayRef = useRef<HTMLDivElement | null>(null);\n\n const onMouseMove = useCallback((e: React.MouseEvent<HTMLDivElement>) => {\n const wrapper = wrapperRef.current;\n const overlay = overlayRef.current;\n if (!wrapper || !overlay) return;\n\n const rect = wrapper.getBoundingClientRect();\n // Cursor offset as percentage of the wrapper — this is exactly where the\n // cursor is visually, so the gradient cutoff aligns perfectly with it.\n const xPct = ((e.clientX - rect.left) / rect.width) * 100;\n\n // Left of cursor: transparent (lines at full brightness).\n // Right of cursor: ~38% dark overlay, matching Jupiter's visual where\n // lines to the right appear ~30% dimmer than lines to the left.\n overlay.style.background = `linear-gradient(to right, transparent ${xPct}%, rgba(0,0,0,0.55) ${xPct}%)`;\n overlay.style.opacity = \"1\";\n }, []);\n\n const onMouseLeave = useCallback(() => {\n if (overlayRef.current) overlayRef.current.style.opacity = \"0\";\n }, []);\n\n return { wrapperRef, overlayRef, onMouseMove, onMouseLeave };\n}\n\n// ---------------------------------------------------------------------------\n// CustomTooltip\n// ---------------------------------------------------------------------------\n\ninterface CustomTooltipPayloadItem {\n dataKey: string;\n value: number | undefined;\n stroke: string;\n color: string;\n}\n\ninterface CustomTooltipProps {\n active?: boolean;\n payload?: CustomTooltipPayloadItem[];\n label?: number | string;\n labelMap: Map<string, string>;\n /** All series slugs + colors so missing entries can be shown as \"--\" */\n allSeries?: Array<{ slug: string; color: string }>;\n range?: ChartRangeType;\n}\n\nfunction CustomTooltip({\n active,\n payload,\n label,\n labelMap,\n allSeries,\n range,\n}: CustomTooltipProps) {\n if (!active || !allSeries?.length) return null;\n\n const payloadMap = new Map<string, CustomTooltipPayloadItem>();\n payload?.forEach((p) => payloadMap.set(p.dataKey, p));\n\n const items: CustomTooltipPayloadItem[] = allSeries.map((s) => {\n const existing = payloadMap.get(s.slug);\n return (\n existing ?? {\n dataKey: s.slug,\n value: undefined,\n stroke: s.color,\n color: s.color,\n }\n );\n });\n\n return (\n <div\n style={{\n background: \"rgba(10,10,10,0.92)\",\n border: \"1px solid rgba(255,255,255,0.1)\",\n borderRadius: 8,\n padding: \"8px 12px\",\n minWidth: 180,\n backdropFilter: \"blur(8px)\",\n fontSize: 12,\n }}\n >\n <div style={{ color: \"#9ca3af\", marginBottom: 6, fontWeight: 500 }}>\n {typeof label === \"number\"\n ? formatTooltipTimestamp(label, range)\n : label}\n </div>\n {items.map((p) => (\n <div\n key={p.dataKey}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n marginBottom: 3,\n }}\n >\n <span\n style={{\n display: \"inline-block\",\n width: 3,\n height: 14,\n borderRadius: 2,\n background: p.stroke ?? p.color,\n flexShrink: 0,\n }}\n />\n <span\n style={{\n color: \"#9ca3af\",\n flex: 1,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n maxWidth: 120,\n }}\n >\n {labelMap.get(p.dataKey) ?? p.dataKey}\n </span>\n <span\n style={{\n color: \"#f9fafb\",\n fontWeight: 700,\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n {p.value != null ? formatPercent(p.value) : \"--\"}\n </span>\n </div>\n ))}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// MarketSelector — dropdown multi-select, max MAX_SELECTED markets\n// ---------------------------------------------------------------------------\n\ninterface MarketSelectorProps {\n markets: PredictMarket[];\n selectedSlugs: string[];\n colorMap: Map<string, string>;\n onToggle: (slug: string) => void;\n}\n\nfunction MarketSelector({\n markets,\n selectedSlugs,\n colorMap,\n onToggle,\n}: MarketSelectorProps) {\n const [open, setOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n\n // Close on outside click\n useEffect(() => {\n if (!open) return;\n function handleClick(e: MouseEvent) {\n if (rootRef.current && !rootRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n }\n document.addEventListener(\"mousedown\", handleClick);\n return () => document.removeEventListener(\"mousedown\", handleClick);\n }, [open]);\n\n const atMax = selectedSlugs.length >= MAX_SELECTED;\n\n // Trigger label: show colored dots + count summary\n const triggerContent = (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n flex: 1,\n minWidth: 0,\n }}\n >\n {/* Color dots for selected markets */}\n <div style={{ display: \"flex\", gap: 3, flexShrink: 0 }}>\n {selectedSlugs.map((slug) => (\n <span\n key={slug}\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: colorMap.get(slug) ?? \"#6b7280\",\n display: \"inline-block\",\n }}\n />\n ))}\n </div>\n {/* Label */}\n <span\n style={{\n color: \"#e5e7eb\",\n fontSize: 12,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {selectedSlugs.length === 1\n ? (() => {\n const m = markets.find((mk) => mk.slug === selectedSlugs[0]);\n return m?.outcomes?.[0]?.label ?? m?.question ?? \"1 market\";\n })()\n : `${selectedSlugs.length} / ${markets.length} markets`}\n </span>\n </div>\n );\n\n return (\n <div\n ref={rootRef}\n style={{ position: \"relative\", display: \"inline-block\", width: 200 }}\n >\n {/* Trigger button */}\n <button\n onClick={() => setOpen((v) => !v)}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"5px 10px\",\n borderRadius: 8,\n border: \"1px solid rgba(255,255,255,0.12)\",\n background: \"rgba(255,255,255,0.05)\",\n cursor: \"pointer\",\n width: \"100%\",\n userSelect: \"none\",\n }}\n >\n {triggerContent}\n {/* Chevron */}\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n style={{\n flexShrink: 0,\n transform: open ? \"rotate(180deg)\" : \"rotate(0deg)\",\n transition: \"transform 0.15s\",\n color: \"#6b7280\",\n }}\n >\n <path\n d=\"M2 4l4 4 4-4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n\n {/* Dropdown panel */}\n {open && (\n <div\n style={{\n position: \"absolute\",\n top: \"calc(100% + 4px)\",\n left: 0,\n zIndex: 50,\n background: \"#111827\",\n border: \"1px solid rgba(255,255,255,0.1)\",\n borderRadius: 10,\n boxShadow: \"0 8px 24px rgba(0,0,0,0.5)\",\n minWidth: 260,\n maxWidth: 360,\n maxHeight: 320,\n overflowY: \"auto\",\n padding: \"6px 0\",\n }}\n >\n {/* Header hint */}\n <div\n style={{\n padding: \"4px 12px 8px\",\n fontSize: 11,\n color: \"#6b7280\",\n borderBottom: \"1px solid rgba(255,255,255,0.06)\",\n marginBottom: 4,\n }}\n >\n Select up to {MAX_SELECTED} markets\n </div>\n\n {markets.map((market, idx) => {\n const isSelected = selectedSlugs.includes(market.slug);\n const isDisabled = !isSelected && atMax;\n const isOnlyOne = isSelected && selectedSlugs.length === 1;\n const color = colorMap.get(market.slug) ?? \"#6b7280\";\n const yesOutcome =\n market.outcomes.find((o) => o.label.toLowerCase() === \"yes\") ??\n market.outcomes[0];\n const pct =\n yesOutcome?.price != null\n ? `${Math.round(yesOutcome.price * 100)}%`\n : null;\n\n return (\n <button\n key={market.id ?? `${idx}-${market.slug}`}\n onClick={() => {\n if (isOnlyOne || isDisabled) return;\n onToggle(market.slug);\n }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n width: \"100%\",\n padding: \"7px 12px\",\n border: \"none\",\n background: isSelected\n ? \"rgba(255,255,255,0.05)\"\n : \"transparent\",\n cursor: isDisabled || isOnlyOne ? \"not-allowed\" : \"pointer\",\n opacity: isDisabled ? 0.35 : 1,\n textAlign: \"left\",\n transition: \"background 0.1s\",\n }}\n onMouseEnter={(e) => {\n if (!isDisabled && !isOnlyOne)\n (e.currentTarget as HTMLButtonElement).style.background =\n \"rgba(255,255,255,0.07)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLButtonElement).style.background =\n isSelected ? \"rgba(255,255,255,0.05)\" : \"transparent\";\n }}\n >\n {/* Checkbox */}\n <span\n style={{\n width: 16,\n height: 16,\n borderRadius: 4,\n border: isSelected\n ? `2px solid ${color}`\n : \"2px solid rgba(255,255,255,0.2)\",\n background: isSelected ? `${color}30` : \"transparent\",\n flexShrink: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {isSelected && (\n <svg width=\"9\" height=\"7\" viewBox=\"0 0 9 7\" fill=\"none\">\n <path\n d=\"M1 3.5L3.5 6L8 1\"\n stroke={color}\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </span>\n\n {/* Color dot */}\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: color,\n flexShrink: 0,\n }}\n />\n\n {/* Question text */}\n <span\n style={{\n color: isSelected ? \"#f9fafb\" : \"#9ca3af\",\n fontSize: 12,\n flex: 1,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {market.outcomes?.[0]?.label ?? market.question}\n </span>\n\n {/* Odds */}\n {pct && (\n <span\n style={{\n color,\n fontWeight: 700,\n fontSize: 12,\n flexShrink: 0,\n }}\n >\n {pct}\n </span>\n )}\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Legend\n// ---------------------------------------------------------------------------\n\ninterface LegendBarProps {\n series: MarketHistorySeries[];\n colorMap: Map<string, string>;\n /** Values to display — hovered values when scrubbing, else latest values */\n displayValues: Map<string, number>;\n}\n\nfunction LegendBar({ series, colorMap, displayValues }: LegendBarProps) {\n return (\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"6px 24px\",\n padding: \"0 2px\",\n }}\n >\n {series.map((s) => {\n const color = colorMap.get(s.marketSlug) ?? \"#6b7280\";\n const value = displayValues.get(s.marketSlug);\n return (\n <div\n key={s.marketSlug}\n style={{\n display: \"inline-flex\",\n alignItems: \"flex-start\",\n gap: 6,\n }}\n >\n {/* Dot — aligned to the name row */}\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: color,\n flexShrink: 0,\n marginTop: 3,\n }}\n />\n {/* Name + percentage stacked vertically */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 1 }}>\n <span\n style={{\n color: \"#9ca3af\",\n fontSize: 12,\n lineHeight: \"17px\",\n whiteSpace: \"nowrap\",\n }}\n >\n {s.label}\n </span>\n <span\n style={{\n color: \"#f9fafb\",\n fontSize: 14,\n fontWeight: 700,\n lineHeight: \"20px\",\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n {value != null ? formatPercent(value) : \"--\"}\n </span>\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Chart data transformation (timestamp union + forward fill)\n// ---------------------------------------------------------------------------\n\ntype ChartRow = Record<string, number>;\n\n/**\n * Compute the median of a sorted numeric array.\n * The array must be sorted ascending before calling this function.\n */\nfunction medianOfSorted(sorted: number[]): number {\n const mid = Math.floor(sorted.length / 2);\n return sorted.length % 2 === 1\n ? sorted[mid]\n : (sorted[mid - 1] + sorted[mid]) / 2;\n}\n\n/**\n * Reduce a price series to at most `maxPoints` data points using bucket\n * median. Within each bucket the median price is taken (more robust to\n * short-lived outlier spikes than the mean), and the last timestamp of\n * the bucket is kept to preserve the breathing-dot position at the end.\n */\nfunction downsampleSeries(\n data: MarketHistorySeries[\"data\"],\n maxPoints: number,\n): MarketHistorySeries[\"data\"] {\n if (data.length <= maxPoints) return data;\n\n const result: MarketHistorySeries[\"data\"] = [];\n const step = data.length / maxPoints;\n\n for (let i = 0; i < maxPoints; i++) {\n const start = Math.floor(i * step);\n const end = Math.min(Math.floor((i + 1) * step), data.length);\n const bucket = data.slice(start, end);\n const sorted = bucket.map((p) => p.price).sort((a, b) => a - b);\n result.push({\n timestamp: bucket[bucket.length - 1].timestamp,\n price: medianOfSorted(sorted),\n });\n }\n\n return result;\n}\n\nfunction buildChartData(\n series: MarketHistorySeries[],\n maxPointsPerSeries = 200,\n): ChartRow[] {\n if (series.length === 0) return [];\n\n // Downsample each series before merging to reduce visual noise\n const sampledSeries = series.map((s) => ({\n ...s,\n data: downsampleSeries(s.data, maxPointsPerSeries),\n }));\n\n const allTimestamps = new Set<number>();\n sampledSeries.forEach((s) =>\n s.data.forEach((p) => allTimestamps.add(p.timestamp)),\n );\n\n const sorted = Array.from(allTimestamps).sort((a, b) => a - b);\n\n // Build per-series lookup map\n const lookups = sampledSeries.map((s) => {\n const m = new Map<number, number>();\n s.data.forEach((p) => m.set(p.timestamp, p.price));\n return { slug: s.marketSlug, map: m };\n });\n\n const lastValues = new Map<string, number>();\n\n return sorted.map((ts) => {\n const row: ChartRow = { timestamp: ts };\n lookups.forEach(({ slug, map }) => {\n const val = map.get(ts);\n if (val !== undefined) {\n lastValues.set(slug, val);\n row[slug] = val;\n } else {\n const last = lastValues.get(slug);\n if (last !== undefined) row[slug] = last;\n }\n });\n return row;\n });\n}\n\n// ---------------------------------------------------------------------------\n// EventPriceChart\n// ---------------------------------------------------------------------------\n\nexport interface EventPriceChartProps {\n event: PredictEvent;\n isLoading?: boolean;\n /** Optional CSS class for the outer container */\n className?: string;\n /** Event total volume (shown in chart footer bar alongside interval switcher) */\n volume?: number;\n}\n\nexport function EventPriceChart(props: EventPriceChartProps) {\n return (\n <ChartErrorBoundary>\n <EventPriceChartInner {...props} />\n </ChartErrorBoundary>\n );\n}\n\nfunction EventPriceChartInner({\n event,\n isLoading: externalLoading,\n className,\n volume,\n}: EventPriceChartProps) {\n const allMarkets = useMemo(() => {\n const seen = new Set<string>();\n return (event.markets ?? []).filter((m) => {\n if (m.status !== \"open\" || seen.has(m.slug)) return false;\n seen.add(m.slug);\n return true;\n });\n }, [event.markets]);\n\n // Sort markets by YES outcome price descending so the highest-probability\n // candidates appear first in both the default selection and the dropdown.\n const sortedMarkets = useMemo(\n () =>\n [...allMarkets].sort((a, b) => {\n const priceOf = (m: PredictMarket) =>\n (\n m.outcomes.find((o) => o.label.toLowerCase() === \"yes\") ??\n m.outcomes[0]\n )?.price ?? 0;\n return priceOf(b) - priceOf(a);\n }),\n [allMarkets],\n );\n\n // Default: first MAX_SELECTED markets by price (highest first)\n const [selectedSlugs, setSelectedSlugs] = useState<string[]>(() =>\n sortedMarkets.slice(0, MAX_SELECTED).map((m) => m.slug),\n );\n\n // Chart time range (interval selector)\n const [chartRange, setChartRange] =\n useState<ChartRangeType>(DEFAULT_CHART_RANGE);\n\n // Color mapping: only selected markets get chart colors.\n // Colors are assigned by selection order so they stay stable\n // as long as the selection doesn't change.\n const colorMap = useMemo(() => {\n const map = new Map<string, string>();\n selectedSlugs.forEach((slug, idx) => {\n map.set(slug, CHART_COLORS[idx % CHART_COLORS.length]);\n });\n return map;\n }, [selectedSlugs]);\n\n const selectedMarkets = useMemo(\n () => allMarkets.filter((m) => selectedSlugs.includes(m.slug)),\n [allMarkets, selectedSlugs],\n );\n\n const { series: hookSeries, isLoading: hookLoading } = useMarketHistory(\n selectedMarkets,\n chartRange,\n );\n const isLoading = externalLoading || hookLoading;\n\n // Belt-and-suspenders: if hook returns no renderable data, generate\n // synthetic flat lines from current outcome prices so the chart is never empty.\n const series = useMemo<MarketHistorySeries[]>(() => {\n if (hookSeries.length > 0 && hookSeries.some((s) => s.data.length > 0)) {\n return hookSeries;\n }\n const now = Date.now();\n const dayMs = 86_400_000;\n return selectedMarkets.map((market) => {\n const yesOutcome =\n market.outcomes?.find((o) => o.label.toLowerCase() === \"yes\") ??\n market.outcomes?.[0];\n const price = yesOutcome?.price ?? 0.5;\n return {\n marketSlug: market.slug,\n label: market.outcomes?.[0]?.label ?? market.question,\n data: [\n { timestamp: now - 7 * dayMs, price },\n { timestamp: now, price },\n ],\n };\n });\n }, [hookSeries, selectedMarkets]);\n\n // Fewer points for short ranges (data is already sparse); more for ALL so\n // the long history still has enough resolution without being noisy.\n const maxPointsPerSeries = useMemo(() => {\n if (chartRange === ChartRange.ONE_DAY) return 96; // ~15-min buckets\n if (chartRange === ChartRange.ONE_WEEK) return 168; // ~1-hour buckets\n if (chartRange === ChartRange.ONE_MONTH) return 180; // ~4-hour buckets\n return 300; // ALL — daily-ish buckets\n }, [chartRange]);\n\n const chartData = useMemo(\n () => buildChartData(series, maxPointsPerSeries),\n [series, maxPointsPerSeries],\n );\n\n // Y-axis domain: padded range of all values\n const yDomain = useMemo((): [number, number] => {\n if (chartData.length === 0) return [0, 1];\n let min = Infinity;\n let max = -Infinity;\n selectedSlugs.forEach((slug) => {\n chartData.forEach((row) => {\n const v = row[slug];\n if (v != null) {\n if (v < min) min = v;\n if (v > max) max = v;\n }\n });\n });\n if (!isFinite(min)) return [0, 1];\n const pad = Math.max((max - min) * 0.15, 0.05);\n return [Math.max(0, min - pad), Math.min(1, max + pad)];\n }, [chartData, selectedSlugs]);\n\n // Current values for legend (latest point)\n const currentValues = useMemo(() => {\n const map = new Map<string, number>();\n series.forEach((s) => {\n if (s.data.length > 0) {\n map.set(s.marketSlug, s.data[s.data.length - 1].price);\n }\n });\n return map;\n }, [series]);\n\n // Tooltip label map\n const labelMap = useMemo(() => {\n const map = new Map<string, string>();\n series.forEach((s) => map.set(s.marketSlug, s.label));\n return map;\n }, [series]);\n\n // All series slugs + colors for tooltip (so missing entries show \"--\")\n const tooltipSeries = useMemo(\n () =>\n series.map((s) => ({\n slug: s.marketSlug,\n color: colorMap.get(s.marketSlug) ?? \"#6b7280\",\n })),\n [series, colorMap],\n );\n\n // Effect 5: cursor overlay (left transparent / right dimmed)\n const {\n wrapperRef: chartWrapperRef,\n overlayRef: overlayDivRef,\n onMouseMove: handleWrapperMouseMove,\n onMouseLeave: handleWrapperMouseLeave,\n } = useCursorOverlay();\n\n // Market selector toggle handler\n const handleToggle = useCallback((slug: string) => {\n setSelectedSlugs((prev) => {\n if (prev.includes(slug)) {\n if (prev.length <= 1) return prev;\n return prev.filter((s) => s !== slug);\n }\n if (prev.length >= MAX_SELECTED) return prev;\n return [...prev, slug];\n });\n }, []);\n\n // Hovered values for legend.\n // Tooltip writes to refs during render (safe, no state update).\n // Wrapper onMouseMove schedules a rAF to flush ref → state after Recharts\n // has finished rendering the tooltip, so the ref is up-to-date.\n const [hoveredValues, setHoveredValues] = useState<Map<\n string,\n number\n > | null>(null);\n const hoveredValuesRef = useRef<Map<string, number> | null>(null);\n const lastPayloadKeyRef = useRef(\"\");\n const rafIdRef = useRef(0);\n\n const showChart = !isLoading && chartData.length > 0;\n\n return (\n <div\n className={className}\n style={{ display: \"flex\", flexDirection: \"column\", gap: 12 }}\n >\n {/* Legend — values update dynamically when scrubbing the chart */}\n <LegendBar\n series={series}\n colorMap={colorMap}\n displayValues={hoveredValues ?? currentValues}\n />\n\n {/* Chart */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 0 }}>\n <div\n ref={chartWrapperRef}\n style={{\n height: 300,\n width: \"100%\",\n userSelect: \"none\",\n position: \"relative\",\n }}\n onMouseMove={\n showChart\n ? (e) => {\n handleWrapperMouseMove(e);\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = requestAnimationFrame(() => {\n setHoveredValues(hoveredValuesRef.current);\n });\n }\n : undefined\n }\n onMouseLeave={\n showChart\n ? () => {\n handleWrapperMouseLeave();\n cancelAnimationFrame(rafIdRef.current);\n lastPayloadKeyRef.current = \"\";\n hoveredValuesRef.current = null;\n setHoveredValues(null);\n }\n : undefined\n }\n >\n {isLoading ? (\n <div\n style={{\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <div\n style={{\n width: 28,\n height: 28,\n borderRadius: \"50%\",\n border: \"2.5px solid #22d3ee\",\n borderTopColor: \"transparent\",\n animation: \"spin 0.7s linear infinite\",\n }}\n />\n </div>\n ) : chartData.length === 0 ? (\n <div\n style={{\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"#6b7280\",\n fontSize: 13,\n }}\n >\n No price history data\n </div>\n ) : (\n <>\n {/* Effect 5: left transparent / right dimmed overlay div */}\n <div\n ref={overlayDivRef}\n style={{\n position: \"absolute\",\n inset: 0,\n opacity: 0,\n pointerEvents: \"none\",\n zIndex: 1,\n }}\n />\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <LineChart\n data={chartData}\n margin={{ top: 8, right: 16, left: 0, bottom: 0 }}\n >\n {/* Effect 7: horizontal dashed grid */}\n <CartesianGrid\n horizontal\n vertical={false}\n strokeDasharray=\"3 3\"\n stroke=\"#374151\"\n opacity={0.5}\n />\n\n {/* Effect 6: X axis */}\n <XAxis\n dataKey=\"timestamp\"\n type=\"number\"\n scale=\"time\"\n domain={[\"dataMin\", \"dataMax\"]}\n tickFormatter={(ms: number) =>\n formatTimestamp(ms, chartRange)\n }\n axisLine={false}\n tickLine={false}\n tick={{ fill: \"#6b7280\", fontSize: 11 }}\n minTickGap={70}\n />\n\n {/* Effect 6: Y axis */}\n <YAxis\n domain={yDomain}\n tickFormatter={(v: number) => `${Math.round(v * 100)}%`}\n axisLine={false}\n tickLine={false}\n tick={{ fill: \"#6b7280\", fontSize: 11 }}\n width={40}\n tickCount={6}\n />\n\n {/* Effect 2: real-time tooltip */}\n <Tooltip\n content={(props) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const p = props as any;\n if (p.active && p.payload?.length) {\n const key = p.payload\n .map(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (item: any) => `${item.dataKey}:${item.value}`,\n )\n .join(\",\");\n if (key !== lastPayloadKeyRef.current) {\n lastPayloadKeyRef.current = key;\n const map = new Map<string, number>();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n p.payload.forEach((item: any) => {\n if (item.value != null)\n map.set(item.dataKey, item.value);\n });\n hoveredValuesRef.current = map;\n }\n }\n return (\n <CustomTooltip\n {...p}\n labelMap={labelMap}\n allSeries={tooltipSeries}\n range={chartRange}\n />\n );\n }}\n cursor={{\n stroke: \"#4b5563\",\n strokeWidth: 1,\n strokeDasharray: \"4 4\",\n }}\n wrapperStyle={{ zIndex: 2 }}\n isAnimationActive={false}\n />\n\n {/* Lines — dot={false} to skip per-point React calls.\n * type=\"linear\" (straight segments) avoids the cubic-spline\n * overshoot that \"monotone\" produces at sharp price jumps on\n * low-liquidity forward-filled data. strokeLinejoin=\"round\"\n * softens the angle at each vertex. */}\n {series.map((s) => {\n const color = colorMap.get(s.marketSlug) ?? \"#6b7280\";\n return (\n <Line\n key={s.marketSlug}\n type=\"linear\"\n dataKey={s.marketSlug}\n stroke={color}\n strokeWidth={2}\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n dot={false}\n activeDot={{\n r: 4.5,\n strokeWidth: 2,\n stroke: \"rgba(10,10,10,0.8)\",\n fill: color,\n }}\n connectNulls\n isAnimationActive={false}\n />\n );\n })}\n\n {/* Breathing dots at each series' last data point */}\n {hoveredValues == null &&\n chartData.length > 0 &&\n series.map((s) => {\n const lastRow = chartData[chartData.length - 1];\n const yVal = lastRow[s.marketSlug];\n if (yVal == null) return null;\n const color = colorMap.get(s.marketSlug) ?? \"#6b7280\";\n return (\n <ReferenceDot\n key={`pulse-${s.marketSlug}`}\n x={lastRow.timestamp}\n y={yVal as number}\n ifOverflow=\"extendDomain\"\n shape={(props: { cx?: number; cy?: number }) => {\n const { cx: dx, cy: dy } = props;\n if (dx == null || dy == null) return <g />;\n return (\n <g>\n <circle\n cx={dx}\n cy={dy}\n r={6}\n fill={color}\n opacity={0.3}\n >\n <animate\n attributeName=\"r\"\n values=\"4;9;4\"\n dur=\"2s\"\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"opacity\"\n values=\"0.4;0.05;0.4\"\n dur=\"2s\"\n repeatCount=\"indefinite\"\n />\n </circle>\n <circle cx={dx} cy={dy} r={3.5} fill={color} />\n </g>\n );\n }}\n />\n );\n })}\n </LineChart>\n </ResponsiveContainer>\n </>\n )}\n </div>\n\n {/* Bottom bar: [volume] [IntervalSwitcher] on row 1, [MarketSelector] on row 2 (mobile) */}\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n alignItems: \"center\",\n gap: \"6px 8px\",\n marginTop: 6,\n }}\n >\n {volume != null && volume > 0 && (\n <span\n style={{\n color: \"#6b7280\",\n fontSize: 12,\n }}\n >\n ${Math.round(volume).toLocaleString()} vol\n </span>\n )}\n <div style={{ flex: 1, minWidth: 0 }} />\n <IntervalSwitcher value={chartRange} onChange={setChartRange} />\n {sortedMarkets.length > 1 && (\n <div\n style={{\n width: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n <MarketSelector\n markets={sortedMarkets}\n selectedSlugs={selectedSlugs}\n colorMap={colorMap}\n onToggle={handleToggle}\n />\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","import { Fragment, useState, useMemo, useEffect, type Key } from \"react\";\nimport { useScrollCollapse } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent, PredictMarket } from \"@liberfi.io/react-predict\";\nimport {\n Avatar,\n Button,\n ChevronDownIcon,\n cn,\n Dropdown,\n DropdownItem,\n DropdownMenu,\n DropdownTrigger,\n KalshiIcon,\n PolymarketIcon,\n useScreen,\n} from \"@liberfi.io/ui\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport { EventMarketDetailWidget } from \"./event-market-detail.widget\";\nimport { EventPriceChart } from \"./event-price-chart.ui\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getYesAsk(market: PredictMarket): number {\n return market.outcomes[0]?.best_ask ?? market.outcomes[0]?.price ?? 0;\n}\n\nfunction formatPercent(value: number): string {\n return `${parseFloat((value * 100).toFixed(2))}%`;\n}\n\nfunction formatCents(value: number): string {\n const cents = value * 100;\n if (cents < 1 && cents > 0) return `< 1`;\n return parseFloat(cents.toFixed(2)).toString();\n}\n\n/** Display label for a market row — prefer first outcome label, fall back to question. */\nfunction getMarketLabel(market: PredictMarket): string {\n return market.outcomes?.[0]?.label ?? market.question;\n}\n\nfunction getPlatformLabel(source: string): string {\n switch (source) {\n case \"polymarket\":\n return \"Polymarket\";\n case \"kalshi\":\n return \"Kalshi\";\n default:\n return source;\n }\n}\n\nfunction formatISOTimestamp(iso: string | undefined): string {\n if (!iso) return \"—\";\n const date = new Date(iso);\n if (isNaN(date.getTime())) return \"—\";\n const month = date.toLocaleString(\"default\", { month: \"short\" });\n const day = date.getDate();\n const year = date.getFullYear();\n const hours = date.getHours().toString().padStart(2, \"0\");\n const minutes = date.getMinutes().toString().padStart(2, \"0\");\n return `${month} ${day}, ${year} ${hours}:${minutes}`;\n}\n\n// ---------------------------------------------------------------------------\n// Countdown hook\n// ---------------------------------------------------------------------------\n\nfunction useCountdown(targetIso: string | undefined): string | null {\n const [now, setNow] = useState(0);\n\n useEffect(() => {\n if (!targetIso) return;\n setNow(Date.now());\n const id = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(id);\n }, [targetIso]);\n\n if (!targetIso || now === 0) return null;\n const target = new Date(targetIso).getTime();\n if (isNaN(target)) return null;\n\n const diff = target - now;\n if (diff <= 0) return null;\n\n const days = Math.floor(diff / 86400000);\n const hours = Math.floor((diff % 86400000) / 3600000);\n const mins = Math.floor((diff % 3600000) / 60000);\n const secs = Math.floor((diff % 60000) / 1000);\n\n const parts: string[] = [];\n if (days > 0) parts.push(`${days}d`);\n parts.push(`${String(hours).padStart(2, \"0\")}h`);\n parts.push(`${String(mins).padStart(2, \"0\")}m`);\n parts.push(`${String(secs).padStart(2, \"0\")}s`);\n return parts.join(\" \");\n}\n\nfunction formatCountdownDate(iso: string | undefined): string | null {\n if (!iso) return null;\n const d = new Date(iso);\n if (isNaN(d.getTime())) return null;\n const hours = d.getHours().toString().padStart(2, \"0\");\n const mins = d.getMinutes().toString().padStart(2, \"0\");\n const month = (d.getMonth() + 1).toString().padStart(2, \"0\");\n const day = d.getDate().toString().padStart(2, \"0\");\n const year = d.getFullYear();\n const offset = -d.getTimezoneOffset();\n const sign = offset >= 0 ? \"+\" : \"-\";\n const tzHours = String(Math.abs(Math.floor(offset / 60))).padStart(2, \"0\");\n return `${hours}:${mins} ${month}/${day}/${year} (${sign}${tzHours})`;\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface EventDetailUIProps {\n event: PredictEvent;\n /** Callback when a trade action is triggered */\n onTradeAction?: (\n market: PredictMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EventDetailUI({ event, onTradeAction }: EventDetailUIProps) {\n const { t } = useTranslation();\n const { ref: collapseRef, isCollapsed } = useScrollCollapse();\n\n const markets = useMemo(() => {\n const all = [...(event.markets || [])];\n const open = all\n .filter((m) => m.status === \"open\")\n .sort((a, b) => getYesAsk(b) - getYesAsk(a));\n const rest = all\n .filter((m) => m.status !== \"open\")\n .sort((a, b) => getYesAsk(b) - getYesAsk(a));\n return [...open, ...rest];\n }, [event.markets]);\n\n const isEnded = event.status === \"closed\" || event.status === \"voided\";\n const startCountdown = useCountdown(isEnded ? undefined : event.start_at);\n const endCountdown = useCountdown(isEnded ? undefined : event.end_at);\n const startDateFormatted = formatCountdownDate(event.start_at);\n const endDateFormatted = formatCountdownDate(event.end_at);\n\n return (\n <div className=\"w-full flex flex-col gap-y-4 lg:gap-y-6\">\n {/* Header – sticky with compact transition */}\n <div\n ref={collapseRef}\n className={`sticky top-0 z-30 flex items-center backdrop-blur-md transition-all duration-300 ${\n isCollapsed\n ? \"h-14 lg:h-16 gap-x-2 py-2 px-1 lg:px-4 -mx-1 lg:-mx-4 shadow-sm\"\n : \"h-16 lg:h-20 gap-x-2 lg:gap-x-4\"\n }`}\n >\n <Avatar\n src={event.image_url || undefined}\n name={event.title || \"Event\"}\n radius=\"lg\"\n classNames={{ base: \"bg-transparent\" }}\n className={`flex-shrink-0 transition-all duration-300 ${\n isCollapsed\n ? \"!h-10 !w-10 lg:!h-12 lg:!w-12\"\n : \"!h-16 !w-16 lg:!h-20 lg:!w-20\"\n }`}\n />\n <div className=\"flex flex-col gap-0.5 min-w-0 flex-1\">\n {!isCollapsed && (\n <div className=\"flex items-center gap-1.5\">\n {event.tags?.slice(0, 3).map((tag, i) => (\n <Fragment key={tag.slug}>\n {i > 0 && <span className=\"text-sm text-neutral/50\">·</span>}\n <span className=\"text-sm text-neutral truncate\">\n {tag.label}\n </span>\n </Fragment>\n ))}\n <SourceIcon source={event.source} />\n </div>\n )}\n <span\n className={`font-semibold truncate transition-all duration-300 ${\n isCollapsed ? \"text-sm lg:text-base\" : \"text-lg lg:text-xl\"\n }`}\n >\n {event.title}\n </span>\n </div>\n </div>\n\n {/* Countdown / ended timestamp */}\n {(startCountdown || endCountdown || isEnded) && (\n <div className=\"flex items-center gap-x-2 text-xs lg:text-sm font-mono\">\n {isEnded ? (\n endDateFormatted && (\n <span className=\"text-neutral\">\n {t(\"predict.event.endedAt\", { time: endDateFormatted })}\n </span>\n )\n ) : startCountdown ? (\n <>\n <span className=\"text-foreground\">\n {t(\"predict.event.beginsIn\", { time: startCountdown })}\n </span>\n {startDateFormatted && (\n <>\n <span className=\"text-neutral/50\">·</span>\n <span className=\"text-neutral\">{startDateFormatted}</span>\n </>\n )}\n </>\n ) : endCountdown ? (\n <>\n <span className=\"text-foreground\">\n {t(\"predict.event.endsIn\", { time: endCountdown })}\n </span>\n {endDateFormatted && (\n <>\n <span className=\"text-neutral/50\">·</span>\n <span className=\"text-neutral\">{endDateFormatted}</span>\n </>\n )}\n </>\n ) : null}\n </div>\n )}\n\n {/* Chart section — volume displayed in chart footer bar */}\n <EventPriceChart event={event} volume={event.volume ?? undefined} />\n\n {/* Markets list */}\n <EventMarketsUI markets={markets} onTradeAction={onTradeAction} />\n\n {/* Rules section */}\n <EventRulesUI markets={markets} event={event} />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Markets list (Jupiter-style table layout)\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_VISIBLE_COUNT = 5;\n\ninterface EventMarketsUIProps {\n markets: PredictMarket[];\n onTradeAction?: (\n market: PredictMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\nfunction EventMarketsUI({\n markets: rawMarkets,\n onTradeAction,\n}: EventMarketsUIProps) {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n const [showAll, setShowAll] = useState(false);\n const [expandedSlug, setExpandedSlug] = useState<string | null>(null);\n\n const markets = useMemo(() => {\n const seen = new Set<string>();\n return rawMarkets.filter((m) => {\n if (seen.has(m.slug)) return false;\n seen.add(m.slug);\n return true;\n });\n }, [rawMarkets]);\n\n const firstOpenSlug = markets.find((m) => m.status === \"open\")?.slug;\n const [activeKey, setActiveKey] = useState<string | null>(\n firstOpenSlug ? `${firstOpenSlug}:yes` : null,\n );\n\n if (markets.length === 0) return null;\n\n const hasMore = markets.length > DEFAULT_VISIBLE_COUNT;\n const visibleMarkets = showAll\n ? markets\n : markets.slice(0, DEFAULT_VISIBLE_COUNT);\n\n const toggleExpand = (slug: string) => {\n setExpandedSlug((prev) => (prev === slug ? null : slug));\n };\n\n const handleTradeAction = (\n market: PredictMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => {\n setActiveKey(`${market.slug}:${outcome}`);\n if (!isMobile) {\n setExpandedSlug(market.slug);\n }\n onTradeAction?.(market, outcome, side);\n };\n\n return (\n <div className=\"flex flex-col\">\n {/* Table */}\n <table className=\"w-full border-collapse\">\n {/* Column header */}\n <thead>\n <tr>\n <th />\n <th className=\"py-2 text-left text-xs text-neutral font-normal lg:text-center lg:text-sm\">\n {t(\"predict.market.table.chance\")}\n </th>\n <th />\n </tr>\n </thead>\n <tbody>\n {visibleMarkets.map((market, idx) => {\n const yesPrice = getYesAsk(market);\n const noPrice =\n market.outcomes[1]?.best_ask ?? market.outcomes[1]?.price;\n const isExpanded = expandedSlug === market.slug;\n\n return (\n <MarketRow\n key={market.id ?? `${idx}-${market.slug}`}\n market={market}\n yesPrice={yesPrice}\n noPrice={noPrice ?? undefined}\n activeYes={activeKey === `${market.slug}:yes`}\n activeNo={activeKey === `${market.slug}:no`}\n isExpanded={isExpanded}\n onToggleExpand={() => toggleExpand(market.slug)}\n onTradeAction={handleTradeAction}\n />\n );\n })}\n </tbody>\n </table>\n\n {/* More Markets button */}\n {hasMore && (\n <button\n type=\"button\"\n onClick={() => setShowAll((prev) => !prev)}\n className=\"flex w-full items-center justify-start gap-x-2 py-2 pl-1 text-xs text-neutral lg:pl-2 lg:text-sm cursor-pointer hover:text-foreground transition-colors\"\n >\n <span>\n {showAll\n ? t(\"predict.event.rules.collapse\")\n : t(\"predict.event.moreMarketsLabel\")}\n </span>\n <ChevronDownIcon\n className={cn(\n \"h-4 w-4 transition-transform\",\n showAll && \"rotate-180\",\n )}\n />\n </button>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Market Row (Jupiter-style <tr>)\n// ---------------------------------------------------------------------------\n\ninterface MarketRowProps {\n market: PredictMarket;\n yesPrice: number;\n noPrice?: number;\n activeYes: boolean;\n activeNo: boolean;\n isExpanded: boolean;\n onToggleExpand: () => void;\n onTradeAction?: (\n market: PredictMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\nfunction MarketRow({\n market,\n yesPrice,\n noPrice,\n activeYes,\n activeNo,\n isExpanded,\n onToggleExpand,\n onTradeAction,\n}: MarketRowProps) {\n const { t } = useTranslation();\n const isOpen = market.status === \"open\";\n const volumeFormatted = market.volume\n ? `$${Math.round(market.volume).toLocaleString(\"en-US\")} vol`\n : undefined;\n\n return (\n <>\n <tr\n className=\"cursor-pointer border-b border-border text-xs hover:bg-content2 lg:text-base\"\n onClick={onToggleExpand}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onToggleExpand();\n }\n }}\n >\n {/* TD1: Avatar + Name + Volume */}\n <td className=\"py-2 pl-1 lg:pl-2\">\n <div className=\"flex items-center gap-x-1 lg:gap-x-2\">\n {market.image_url && (\n <Avatar\n src={market.image_url}\n name={getMarketLabel(market)?.[0] || \"?\"}\n radius=\"lg\"\n className=\"size-5 shrink-0 lg:size-8\"\n imgProps={{ className: \"object-cover\" }}\n />\n )}\n <div className=\"flex flex-col\">\n <span className=\"text-foreground truncate max-w-[200px] lg:max-w-[300px]\">\n {getMarketLabel(market)}\n </span>\n {volumeFormatted && (\n <span className=\"text-[8px] text-neutral lg:text-xxs\">\n {volumeFormatted}\n </span>\n )}\n </div>\n </div>\n </td>\n\n {/* TD2: Chance % */}\n <td className=\"py-2 text-left text-foreground lg:text-center\">\n {formatPercent(yesPrice)}\n </td>\n\n {/* TD3: Yes / No buttons or status badge */}\n <td className=\"py-2 pr-1 lg:pr-2\">\n {isOpen ? (\n <div className=\"flex items-center justify-end gap-x-2\">\n <button\n type=\"button\"\n className={cn(\n \"flex min-w-16 items-center justify-center whitespace-nowrap rounded-lg p-2 lg:min-w-24 cursor-pointer hover:opacity-80 transition-all focus-visible:outline-2 focus-visible:outline-primary/40 focus-visible:outline-offset-2\",\n activeYes\n ? \"bg-primary text-primary-foreground\"\n : \"bg-primary/10 text-primary\",\n )}\n onClick={(e) => {\n e.stopPropagation();\n onTradeAction?.(market, \"yes\", \"buy\");\n }}\n >\n {t(\"predict.market.action.yes\", {\n price: formatCents(yesPrice),\n })}\n </button>\n <button\n type=\"button\"\n className={cn(\n \"flex min-w-16 items-center justify-center whitespace-nowrap rounded-lg p-2 lg:min-w-24 cursor-pointer hover:opacity-80 transition-all focus-visible:outline-2 focus-visible:outline-primary/40 focus-visible:outline-offset-2\",\n activeNo\n ? \"bg-secondary text-secondary-foreground\"\n : \"bg-secondary/10 text-secondary\",\n )}\n onClick={(e) => {\n e.stopPropagation();\n onTradeAction?.(market, \"no\", \"buy\");\n }}\n >\n {noPrice != null\n ? t(\"predict.market.action.no\", {\n price: formatCents(noPrice),\n })\n : t(\"predict.market.no\")}\n </button>\n </div>\n ) : (\n <div className=\"flex items-center justify-end\">\n <span\n className={cn(\n \"inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium\",\n market.status === \"closed\"\n ? \"bg-neutral/10 text-neutral\"\n : market.status === \"voided\"\n ? \"bg-warning/10 text-warning\"\n : \"bg-primary/10 text-primary\",\n )}\n >\n {market.status === \"closed\"\n ? t(\"predict.event.status.closed\")\n : market.status === \"voided\"\n ? t(\"predict.event.status.voided\")\n : t(\"predict.event.status.pending\")}\n </span>\n </div>\n )}\n </td>\n </tr>\n\n {/* Expanded detail row */}\n {isExpanded && (\n <tr>\n <td colSpan={3} className=\"pb-3\">\n <div className=\"max-h-100 overflow-y-auto\">\n <EventMarketDetailWidget\n market={market}\n outcome={activeNo ? \"no\" : \"yes\"}\n onTradeAction={onTradeAction}\n />\n </div>\n </td>\n </tr>\n )}\n </>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Rules\n// ---------------------------------------------------------------------------\n\ninterface EventRulesUIProps {\n markets: PredictMarket[];\n event: PredictEvent;\n}\n\nfunction EventRulesUI({ markets, event }: EventRulesUIProps) {\n const { t } = useTranslation();\n const [showFullRules, setShowFullRules] = useState(false);\n const [showTimeline, setShowTimeline] = useState(false);\n const [selectedIdx, setSelectedIdx] = useState(0);\n\n const marketsWithContent = markets.filter(\n (m) => (m.rules && m.rules.length > 0) || m.description,\n );\n if (marketsWithContent.length === 0) return null;\n\n const selectedMarket =\n marketsWithContent[selectedIdx] ?? marketsWithContent[0];\n const rulesText =\n selectedMarket.rules && selectedMarket.rules.length > 0\n ? selectedMarket.rules.join(\"\\n\\n\")\n : (selectedMarket.description ?? \"\");\n if (!rulesText) return null;\n const truncatedRules =\n rulesText.length > 200 && !showFullRules\n ? rulesText.slice(0, 200) + \"...\"\n : rulesText;\n\n return (\n <div className=\"flex flex-col gap-y-3\">\n {/* Header: title + market selector */}\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-semibold text-foreground lg:text-base\">\n {t(\"predict.event.rules\")}\n </span>\n\n {marketsWithContent.length > 1 && (\n <Dropdown\n placement=\"bottom-end\"\n classNames={{\n content: \"min-w-36 bg-content1 border border-border\",\n }}\n >\n <DropdownTrigger>\n <Button\n size=\"sm\"\n variant=\"bordered\"\n radius=\"lg\"\n endContent={<ChevronDownIcon className=\"h-3.5 w-3.5\" />}\n className=\"text-xs text-foreground\"\n >\n {getMarketLabel(selectedMarket)}\n </Button>\n </DropdownTrigger>\n <DropdownMenu\n aria-label=\"Select market rules\"\n selectionMode=\"single\"\n selectedKeys={[String(selectedIdx)]}\n onAction={(key: Key) => {\n setSelectedIdx(Number(key));\n setShowFullRules(false);\n }}\n classNames={{ list: \"gap-1\" }}\n itemClasses={{ base: \"rounded-md px-3 h-8\" }}\n >\n {marketsWithContent.map((m, idx) => (\n <DropdownItem\n key={String(idx)}\n className={cn(\n idx === selectedIdx\n ? \"bg-content2 text-foreground\"\n : \"text-neutral\",\n \"data-[hover=true]:bg-content2 data-[hover=true]:text-foreground\",\n )}\n >\n {getMarketLabel(m)}\n </DropdownItem>\n ))}\n </DropdownMenu>\n </Dropdown>\n )}\n </div>\n\n {/* Rules text */}\n <div className=\"text-xs text-foreground/80 lg:text-sm whitespace-pre-wrap\">\n {truncatedRules}\n </div>\n\n {rulesText.length > 200 && (\n <button\n type=\"button\"\n onClick={() => setShowFullRules((v) => !v)}\n className=\"text-xs text-neutral hover:text-foreground cursor-pointer transition-colors self-start\"\n >\n {showFullRules\n ? t(\"predict.event.rules.collapse\")\n : t(\"predict.event.showMore\")}\n </button>\n )}\n\n {/* Timeline and payout — collapsible */}\n <button\n type=\"button\"\n onClick={() => setShowTimeline((v) => !v)}\n className=\"flex items-center justify-between w-full mt-2 text-xs font-medium text-neutral lg:text-sm cursor-pointer hover:text-foreground transition-colors\"\n >\n <span>{t(\"predict.event.timelineAndPayout\")}</span>\n <ChevronDownIcon\n className={cn(\n \"h-4 w-4 transition-transform\",\n showTimeline && \"rotate-180\",\n )}\n />\n </button>\n\n {showTimeline && (\n <>\n <div className=\"flex flex-col\">\n {(() => {\n const status = selectedMarket.status;\n const items: {\n label: string;\n value: string | null;\n isActive: boolean;\n }[] = [];\n\n if (selectedMarket.created_at) {\n items.push({\n label: t(\"predict.event.timeline.created\"),\n value: formatISOTimestamp(selectedMarket.created_at),\n isActive: true,\n });\n }\n\n items.push({\n label: t(\"predict.event.timeline.open\"),\n value: formatISOTimestamp(selectedMarket.start_at),\n isActive: status !== \"pending\",\n });\n\n if (status === \"voided\") {\n items.push({\n label: t(\"predict.event.timeline.voided\"),\n value: formatISOTimestamp(\n selectedMarket.closed_at ?? selectedMarket.end_at,\n ),\n isActive: true,\n });\n } else if (status === \"closed\") {\n items.push({\n label: t(\"predict.event.timeline.closed\"),\n value: formatISOTimestamp(\n selectedMarket.closed_at ?? selectedMarket.end_at,\n ),\n isActive: true,\n });\n } else {\n items.push({\n label: t(\"predict.event.timeline.close\"),\n value: formatISOTimestamp(selectedMarket.end_at),\n isActive: false,\n });\n }\n\n return items;\n })().map((item, index, arr) => (\n <div key={item.label} className=\"flex items-stretch gap-x-3\">\n <div className=\"flex flex-col items-center w-3\">\n <div\n className={`h-3 w-3 shrink-0 rounded-full border-2 mt-0.5 ${\n item.isActive\n ? \"border-primary bg-primary\"\n : \"border-border bg-transparent\"\n }`}\n />\n {index < arr.length - 1 && (\n <div className=\"w-px flex-1 bg-border\" />\n )}\n </div>\n <div\n className={`flex flex-col ${index < arr.length - 1 ? \"pb-4\" : \"\"}`}\n >\n <span className=\"text-xs font-medium text-foreground lg:text-sm\">\n {item.label}\n </span>\n <span className=\"text-xs text-neutral lg:text-sm\">\n {item.value}\n </span>\n </div>\n </div>\n ))}\n </div>\n\n {/* Identifiers */}\n <div className=\"flex flex-wrap items-center gap-x-3 text-xxs text-neutral mt-2 lg:text-xs\">\n <span>\n <span className=\"text-neutral\">\n {t(\"predict.event.id.event\")}:\n </span>{\" \"}\n <span className=\"text-foreground\">{event.slug}</span>\n </span>\n <span>\n <span className=\"text-neutral\">\n {t(\"predict.event.id.market\")}:\n </span>{\" \"}\n <span className=\"text-foreground\">{selectedMarket.slug}</span>\n </span>\n <span>\n <span className=\"text-neutral\">\n {t(\"predict.event.id.source\")}:\n </span>{\" \"}\n <span className=\"text-foreground\">\n {getPlatformLabel(selectedMarket.source)}\n </span>\n </span>\n </div>\n </>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Source (platform) icon\n// ---------------------------------------------------------------------------\n\nfunction SourceIcon({ source }: { source: string }) {\n const title = source === \"polymarket\" ? \"Polymarket\" : \"Kalshi\";\n return (\n <span\n className=\"inline-flex items-center gap-x-1 text-neutral-400\"\n title={title}\n >\n <span className=\"text-neutral-600\">·</span>\n {source === \"polymarket\" ? (\n <PolymarketIcon className=\"h-5 w-auto shrink-0\" />\n ) : (\n <KalshiIcon className=\"h-3 w-auto shrink-0\" />\n )}\n </span>\n );\n}\n","import type { PredictMarket, ProviderSource } from \"@liberfi.io/react-predict\";\nimport { useEvent } from \"@liberfi.io/react-predict\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport { EventDetailSkeleton } from \"./event-detail-skeleton\";\nimport { EventDetailUI } from \"./event-detail.ui\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface EventDetailWidgetProps {\n /** Event slug (canonical business key). */\n eventSlug: string;\n /** Upstream provider (`\"kalshi\"` or `\"polymarket\"`). Required by prediction-server. */\n source?: ProviderSource;\n /** Callback when a trade action is triggered (market button / orderbook click). */\n onTradeAction?: (\n market: PredictMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EventDetailWidget({\n eventSlug,\n source,\n onTradeAction,\n}: EventDetailWidgetProps) {\n const {\n data: event,\n isLoading: isEventLoading,\n error: eventError,\n } = useEvent({ slug: eventSlug, source });\n\n if (isEventLoading) {\n return <EventDetailSkeleton />;\n }\n\n if (eventError || !event) {\n return (\n <div className=\"flex w-full items-center justify-center py-20 text-danger\">\n {eventError?.message || \"Event not found\"}\n </div>\n );\n }\n\n return <EventDetailUI event={event} onTradeAction={onTradeAction} />;\n}\n","import type { ReactNode } from \"react\";\nimport type { ProviderSource } from \"@liberfi.io/react-predict\";\nimport { KalshiIcon, PolymarketIcon, cn } from \"@liberfi.io/ui\";\n\ninterface SourceMeta {\n label: string;\n color: string;\n bgColor: string;\n icon: ReactNode;\n}\n\nconst SOURCE_META: Record<string, SourceMeta> = {\n kalshi: {\n label: \"KALSHI\",\n color: \"#00d492\",\n bgColor: \"rgba(0, 212, 146, 0.12)\",\n icon: <KalshiIcon className=\"w-3.5 h-3.5 shrink-0\" />,\n },\n polymarket: {\n label: \"POLYMARKET\",\n color: \"#50a2ff\",\n bgColor: \"rgba(43, 127, 255, 0.12)\",\n icon: <PolymarketIcon className=\"w-3.5 h-3.5 shrink-0\" />,\n },\n dflow: {\n label: \"DFLOW\",\n color: \"rgb(16, 185, 129)\",\n bgColor: \"rgba(16, 185, 129, 0.12)\",\n icon: null,\n },\n};\n\nconst DEFAULT_META: SourceMeta = {\n label: \"Unknown\",\n color: \"rgb(156, 163, 175)\",\n bgColor: \"rgba(156, 163, 175, 0.12)\",\n icon: null,\n};\n\nexport function getSourceMeta(source: ProviderSource | string): SourceMeta {\n return SOURCE_META[source] ?? DEFAULT_META;\n}\n\nexport interface SourceBadgeProps {\n source: ProviderSource | string;\n className?: string;\n}\n\nexport function SourceBadge({ source, className }: SourceBadgeProps) {\n const meta = getSourceMeta(source);\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-x-1 rounded-md px-1.5 py-0.5 text-xs font-medium\",\n className,\n )}\n style={{ backgroundColor: meta.bgColor, color: meta.color }}\n >\n {meta.icon}\n {meta.label}\n </span>\n );\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent, ProviderSource } from \"@liberfi.io/react-predict\";\nimport { useSimilarEvents } from \"@liberfi.io/react-predict\";\nimport { Avatar, ChevronRightIcon } from \"@liberfi.io/ui\";\nimport { getSourceMeta } from \"../matches/source-badge.ui\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst REST_BORDER = \"rgba(39,39,42,0.6)\";\nconst HOVER_BORDER = \"rgba(113,113,122,0.7)\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction formatVolume(vol: number | null | undefined): string {\n if (vol == null) return \"-\";\n if (vol >= 1_000_000) return `$${(vol / 1_000_000).toFixed(1)}M`;\n if (vol >= 1_000) return `$${Math.round(vol / 1_000)}K`;\n return `$${vol.toFixed(0)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface SimilarEventsSectionProps {\n eventSlug: string;\n source: ProviderSource;\n /** Number of similar events to fetch (default: 4). */\n limit?: number;\n onEventClick?: (event: PredictEvent) => void;\n /** Called when a card is hovered (for data prefetching). */\n onEventHover?: (event: PredictEvent) => void;\n}\n\nexport interface SimilarEventCardProps {\n event: PredictEvent;\n onClick?: (event: PredictEvent) => void;\n /** Called when the card is hovered (for data prefetching). */\n onHover?: (event: PredictEvent) => void;\n}\n\n// ---------------------------------------------------------------------------\n// SimilarEventsSection\n// ---------------------------------------------------------------------------\n\nexport function SimilarEventsSection({\n eventSlug,\n source,\n limit = 4,\n onEventClick,\n onEventHover,\n}: SimilarEventsSectionProps) {\n const { t } = useTranslation();\n const { data: similarEvents, isLoading } = useSimilarEvents({\n slug: eventSlug,\n source,\n limit,\n });\n\n if (isLoading || !similarEvents || similarEvents.length === 0) return null;\n\n return (\n <div className=\"flex flex-col gap-y-3 mt-6 px-1 lg:px-0\">\n <span style={{ color: \"#f4f4f5\", fontSize: 14, fontWeight: 600 }}>\n {t(\"predict.similar.title\")}\n </span>\n <div className=\"grid grid-cols-1 gap-2\">\n {similarEvents.map((ev) => (\n <SimilarEventCard\n key={`${ev.source}-${ev.slug}`}\n event={ev}\n onClick={onEventClick}\n onHover={onEventHover}\n />\n ))}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// SimilarEventCard — border-highlight hover, layout mirrors search results\n// ---------------------------------------------------------------------------\n\nexport function SimilarEventCard({\n event,\n onClick,\n onHover,\n}: SimilarEventCardProps) {\n const { t } = useTranslation();\n const sourceMeta = getSourceMeta(event.source);\n const formattedVolume = useMemo(\n () => formatVolume(event.volume),\n [event.volume],\n );\n const firstTag = event.tags?.[0];\n\n return (\n <button\n type=\"button\"\n onClick={() => onClick?.(event)}\n onMouseEnter={(e) => {\n e.currentTarget.style.borderColor = HOVER_BORDER;\n onHover?.(event);\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.borderColor = REST_BORDER;\n }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n padding: \"10px 12px\",\n borderRadius: 14,\n border: `1px solid ${REST_BORDER}`,\n background: \"rgba(24,24,27,0.4)\",\n cursor: \"pointer\",\n textAlign: \"left\",\n width: \"100%\",\n transition: \"border-color 0.2s\",\n }}\n className=\"group\"\n >\n {/* Avatar */}\n <Avatar\n src={event.image_url || undefined}\n name={event.title?.[0] || \"?\"}\n radius=\"full\"\n className=\"size-9 shrink-0 bg-transparent\"\n imgProps={{ className: \"object-cover\" }}\n />\n\n {/* Title + meta row */}\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n minWidth: 0,\n flex: 1,\n gap: 2,\n }}\n >\n <span\n style={{\n fontSize: 13,\n fontWeight: 500,\n color: \"#f4f4f5\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {event.title}\n </span>\n\n {/* Meta: source + volume + tag */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n fontSize: 10,\n color: \"#71717a\",\n }}\n >\n {/* Source icon + label */}\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 3,\n color: sourceMeta.color,\n flexShrink: 0,\n }}\n >\n {sourceMeta.icon}\n <span\n style={{\n fontSize: 10,\n fontWeight: 600,\n letterSpacing: \"0.04em\",\n textTransform: \"uppercase\" as const,\n }}\n >\n {sourceMeta.label}\n </span>\n </span>\n\n <span style={{ color: \"#52525b\" }}>·</span>\n\n {/* Volume */}\n <span style={{ color: \"#a1a1aa\" }}>\n {formattedVolume} {t(\"predict.event.volume\")}\n </span>\n\n {/* Tag */}\n {firstTag && (\n <>\n <span style={{ color: \"#52525b\" }}>·</span>\n <span style={{ color: \"#71717a\" }}>{firstTag.label}</span>\n </>\n )}\n </div>\n </div>\n\n {/* Hover arrow */}\n <ChevronRightIcon\n width={14}\n height={14}\n className=\"shrink-0 opacity-0 group-hover:opacity-100 transition-opacity\"\n style={{ color: \"#71717a\" }}\n />\n </button>\n );\n}\n","import { useMemo, useState, useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type {\n PredictEvent,\n PredictMarket,\n ProviderSource,\n} from \"@liberfi.io/react-predict\";\nimport { useEvent } from \"@liberfi.io/react-predict\";\nimport { Button, ChevronLeftIcon, useScreen } from \"@liberfi.io/ui\";\nimport { useAsyncModal } from \"@liberfi.io/ui-scaffold\";\nimport {\n PredictTradeModal,\n PREDICT_TRADE_MODAL_ID,\n type PredictTradeModalParams,\n} from \"../trade-form/trade-form.modal\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport { TradeFormWidget } from \"../trade-form/trade-form.widget\";\nimport { UserActivitySection } from \"./event-detail-activity.ui\";\nimport {\n EventDetailSkeleton,\n TradeFormSkeleton,\n} from \"./event-detail-skeleton\";\nimport { EventDetailWidget } from \"./event-detail.widget\";\nimport { SimilarEventsSection } from \"./event-similar-events.ui\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getYesAsk(m: PredictMarket): number {\n return m.outcomes[0]?.best_ask ?? m.outcomes[0]?.price ?? 0;\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface EventDetailPageProps {\n /** Event slug (canonical business key). */\n eventSlug: string;\n /** Upstream provider (`\"kalshi\"` or `\"polymarket\"`). Required by prediction-server. */\n source?: ProviderSource;\n /** Chain network for trading (default: 'solana'). */\n chain?: string;\n /** Connected wallet address for user activity (positions/orders/trades). */\n walletAddress?: string;\n /** Callback when a similar event card is clicked. Receives the clicked event. */\n onSimilarEventClick?: (event: PredictEvent) => void;\n /** Called when a similar event card is hovered (for data prefetching). */\n onSimilarEventHover?: (event: PredictEvent) => void;\n /** Navigation callback — if provided, a \"Back\" button is shown at the top. */\n onBack?: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EventDetailPage({\n eventSlug,\n source,\n chain,\n walletAddress,\n onSimilarEventClick,\n onSimilarEventHover,\n onBack,\n}: EventDetailPageProps) {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n\n const { onOpen: openTradeModal } = useAsyncModal<PredictTradeModalParams>(\n PREDICT_TRADE_MODAL_ID,\n );\n\n const { data: event, isLoading: isEventLoading } = useEvent({\n slug: eventSlug,\n source,\n });\n\n const markets = useMemo(\n () =>\n [...(event?.markets || [])].sort((a, b) => getYesAsk(b) - getYesAsk(a)),\n [event?.markets],\n );\n\n const [tradeSelection, setTradeSelection] = useState<{\n market: PredictMarket;\n outcome: TradeOutcome;\n side: TradeSide;\n version: number;\n } | null>(null);\n\n const handleTradeAction = useCallback(\n (market: PredictMarket, outcome: TradeOutcome, side: TradeSide) => {\n setTradeSelection((prev) => ({\n market,\n outcome,\n side,\n version: (prev?.version ?? 0) + 1,\n }));\n if (isMobile && event) {\n openTradeModal({\n params: { event, market, initialOutcome: outcome, chain },\n });\n }\n },\n [isMobile, event, chain, openTradeModal],\n );\n\n const selectedMarket = tradeSelection?.market ?? markets[0];\n\n // -----------------------------------------------------------------------\n // Loading skeleton\n // -----------------------------------------------------------------------\n if (isEventLoading) {\n const hasBack = !!onBack;\n if (isMobile) {\n return <EventDetailSkeleton showBack={hasBack} />;\n }\n return (\n <div className=\"flex w-full max-w-6xl mx-auto gap-x-4 lg:gap-x-6\">\n <div className=\"min-w-0 flex-1 max-w-3xl\">\n <EventDetailSkeleton showBack={hasBack} />\n </div>\n <aside className=\"hidden lg:block w-[340px] xl:w-[380px] shrink-0\">\n <div className=\"sticky top-4 max-h-[calc(100dvh-2rem)] overflow-y-auto scrollbar-thin\">\n <TradeFormSkeleton />\n </div>\n </aside>\n </div>\n );\n }\n\n const tradeFormKey = tradeSelection\n ? `${tradeSelection.market.slug}-${tradeSelection.version}`\n : (selectedMarket?.slug ?? \"default\");\n\n return (\n <div className=\"flex w-full flex-col gap-y-4 pb-12 lg:max-w-7xl lg:gap-y-8 lg:pb-16 mx-auto\">\n <div className=\"flex w-full justify-center gap-4 pt-4 lg:gap-6\">\n <div className=\"flex-auto min-w-0 flex flex-col gap-y-4 px-4 lg:gap-y-6 lg:px-0\">\n {/* back button */}\n {onBack && (\n <div className=\"flex items-center justify-between\">\n <Button\n as=\"a\"\n onPress={onBack}\n startContent={<ChevronLeftIcon className=\"h-4 w-4\" />}\n className=\"text-neutral bg-transparent h-5 min-h-5 gap-x-2 p-0 text-base w-auto min-w-auto\"\n >\n {t(\"common.back\")}\n </Button>\n </div>\n )}\n <EventDetailWidget\n eventSlug={eventSlug}\n source={source}\n onTradeAction={handleTradeAction}\n />\n </div>\n <div className=\"hidden flex-none w-md flex-col gap-y-4 lg:sticky lg:top-4 lg:flex lg:self-start\">\n {selectedMarket && (\n <TradeFormWidget\n key={tradeFormKey}\n event={event}\n market={selectedMarket}\n initialSide={tradeSelection?.side}\n initialOutcome={tradeSelection?.outcome}\n chain={chain}\n />\n )}\n\n {event && (\n <SimilarEventsSection\n eventSlug={eventSlug}\n source={event.source}\n onEventClick={onSimilarEventClick}\n onEventHover={onSimilarEventHover}\n />\n )}\n </div>\n </div>\n {event && (\n <div className=\"flex w-full flex-col\">\n <UserActivitySection event={event} walletAddress={walletAddress} />\n </div>\n )}\n\n <PredictTradeModal />\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport {\n candlesticksQueryKey,\n ChartRange,\n type Candlestick,\n type ChartRangeType,\n type ListCandlesticksParams,\n type PredictEvent,\n type PredictMarket,\n type ProviderSource,\n useEvent,\n usePredictClient,\n} from \"@liberfi.io/react-predict\";\nimport { DEFAULT_CHART_RANGE, MAX_PRICE_HISTORY_MARKETS } from \"../../consts\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getYesAsk(m: PredictMarket): number {\n return m.outcomes[0]?.best_ask ?? m.outcomes[0]?.price ?? 0;\n}\n\nfunction listCandlesticksParamsForRange(\n chartRange: ChartRangeType,\n): ListCandlesticksParams {\n switch (chartRange) {\n case ChartRange.ONE_DAY:\n return { interval: \"15m\", limit: 96 };\n case ChartRange.ONE_WEEK:\n return { interval: \"1h\", limit: 168 };\n case ChartRange.ONE_MONTH:\n return { interval: \"4h\", limit: 180 };\n case ChartRange.ALL:\n return { interval: \"1d\", limit: 300 };\n default:\n return { interval: \"1h\", limit: 100 };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport interface UseEventDetailParams {\n /** Event slug (canonical business key). */\n eventSlug: string;\n /** Upstream provider (`\"kalshi\"` or `\"polymarket\"`). Required by prediction-server. */\n source?: ProviderSource;\n /** Market slugs to query candlesticks for. Default: top 4 by yesAsk. */\n candlestickMarketSlugs?: string[];\n /** Chart time range (1d / 1w / 1m / all). */\n chartRange?: ChartRangeType;\n}\n\nexport const useEventDetail = (params: UseEventDetailParams) => {\n const {\n candlestickMarketSlugs,\n chartRange = DEFAULT_CHART_RANGE,\n source,\n } = params;\n\n const client = usePredictClient();\n const candlestickParams = useMemo(\n () => listCandlesticksParamsForRange(chartRange),\n [chartRange],\n );\n\n const {\n data: event,\n isLoading: isEventLoading,\n error: eventError,\n } = useEvent({ slug: params.eventSlug, source });\n\n const marketsToQuery = useMemo(() => {\n if (!event?.markets) return [];\n\n // Deduplicate markets by slug (backend may return duplicates)\n const seen = new Set<string>();\n const dedupedMarkets = event.markets.filter((m) => {\n if (seen.has(m.slug)) return false;\n seen.add(m.slug);\n return true;\n });\n\n const markets =\n candlestickMarketSlugs && candlestickMarketSlugs.length > 0\n ? candlestickMarketSlugs\n .slice(0, MAX_PRICE_HISTORY_MARKETS)\n .map((slug) =>\n dedupedMarkets.find((m: PredictMarket) => m.slug === slug),\n )\n .filter((m): m is PredictMarket => m !== undefined)\n : [...dedupedMarkets]\n .sort((a, b) => getYesAsk(b) - getYesAsk(a))\n .slice(0, MAX_PRICE_HISTORY_MARKETS);\n\n return markets.map((m) => m.slug);\n }, [candlestickMarketSlugs, event?.markets]);\n\n const candlestickQueries = useQueries({\n queries: marketsToQuery.map((slug) => ({\n queryKey: candlesticksQueryKey(slug, candlestickParams),\n queryFn: () => client.listCandlesticks(slug, candlestickParams),\n enabled: marketsToQuery.length > 0,\n })),\n });\n\n const isCandlesticksLoading = candlestickQueries.some((q) => q.isLoading);\n\n const candlestickErrors = useMemo(() => {\n const errors = new Map<string, Error>();\n marketsToQuery.forEach((slug, index) => {\n const error = candlestickQueries[index]?.error;\n if (error) errors.set(slug, error);\n });\n return errors;\n }, [marketsToQuery, candlestickQueries]);\n\n const candlesticks = useMemo(() => {\n const map = new Map<string, Candlestick[]>();\n marketsToQuery.forEach((slug, index) => {\n const data = candlestickQueries[index]?.data;\n if (data) map.set(slug, data);\n });\n return map;\n }, [marketsToQuery, candlestickQueries]);\n\n return {\n event,\n isEventLoading,\n eventError,\n candlestickParams,\n candlesticks,\n isCandlesticksLoading,\n candlestickErrors,\n };\n};\n\nexport type { PredictEvent, PredictMarket };\n","\"use client\";\n\nimport { useCallback } from \"react\";\nimport { useAtom } from \"jotai\";\nimport { atomWithStorage } from \"jotai/utils\";\n\nconst MAX_HISTORY_SIZE = 10;\n\nconst searchHistoriesAtom = atomWithStorage<string[]>(\n \"liberfi:predict_search_histories\",\n [],\n undefined,\n { getOnInit: true },\n);\n\nexport function usePredictSearchHistory() {\n const [histories, setHistories] = useAtom(searchHistoriesAtom);\n\n const addHistory = useCallback(\n (keyword: string) => {\n const trimmed = keyword.trim();\n if (!trimmed) return;\n\n setHistories((prev) => {\n const filtered = prev.filter((h) => h !== trimmed);\n return [trimmed, ...filtered].slice(0, MAX_HISTORY_SIZE);\n });\n },\n [setHistories],\n );\n\n const clearHistories = useCallback(() => {\n setHistories([]);\n }, [setHistories]);\n\n return { histories, addHistory, clearHistories };\n}\n","\"use client\";\n\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { cn, Chip, TrashIcon, Button } from \"@liberfi.io/ui\";\n\nexport type SearchHistoryUIProps = {\n histories: string[];\n onSelect?: (keyword: string) => void;\n onClear?: () => void;\n className?: string;\n};\n\nexport function SearchHistoryUI({\n histories,\n onSelect,\n onClear,\n className,\n}: SearchHistoryUIProps) {\n const { t } = useTranslation();\n\n if (histories.length === 0) return null;\n\n return (\n <div className={cn(\"px-4 pb-4\", className)}>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">\n {t(\"predict.search.history\")}\n </span>\n <Button\n isIconOnly\n size=\"sm\"\n className=\"bg-transparent min-w-6 w-6 h-6 text-neutral\"\n onPress={onClear}\n >\n <TrashIcon width={20} height={20} />\n </Button>\n </div>\n <div className=\"flex flex-wrap gap-2 mt-2\">\n {histories.map((keyword) => (\n <Chip\n key={keyword}\n size=\"sm\"\n variant=\"bordered\"\n className={cn(\n \"text-neutral\",\n \"border-border border-1\",\n \"cursor-pointer\",\n \"hover:opacity-hover\",\n )}\n onClick={() => onSelect?.(keyword)}\n >\n {keyword}\n </Chip>\n ))}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { cn } from \"@liberfi.io/ui\";\nimport { usePredictSearchHistory } from \"./search-history.script\";\nimport { SearchHistoryUI } from \"./search-history.ui\";\n\nexport type SearchHistoryWidgetProps = {\n /** Callback when a history keyword is selected */\n onSelect?: (keyword: string) => void;\n className?: string;\n};\n\nexport function SearchHistoryWidget({\n onSelect,\n className,\n}: SearchHistoryWidgetProps) {\n const { histories, clearHistories } = usePredictSearchHistory();\n\n return (\n <SearchHistoryUI\n className={cn(className)}\n histories={histories}\n onSelect={onSelect}\n onClear={clearHistories}\n />\n );\n}\n","\"use client\";\n\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n Kbd,\n SearchIcon,\n StyledInput,\n XCloseIcon,\n} from \"@liberfi.io/ui\";\n\nexport type SearchInputUIProps = {\n /** Controlled input value */\n value: string;\n /** Called on every keystroke */\n onValueChange: (value: string) => void;\n /** Called when clear button is pressed */\n onClear?: () => void;\n /** Called when Esc button is pressed */\n onEscape?: () => void;\n className?: string;\n};\n\nexport function SearchInputUI({\n value,\n onValueChange,\n onClear,\n onEscape,\n className,\n}: SearchInputUIProps) {\n const { t } = useTranslation();\n\n return (\n <div className={className}>\n <StyledInput\n autoFocus\n variant=\"bordered\"\n radius=\"lg\"\n value={value}\n onValueChange={onValueChange}\n placeholder={t(\"predict.search.placeholder\")}\n classNames={{\n inputWrapper: [\n \"!bg-[rgba(39,39,42,0.6)]\",\n \"!border-[rgba(63,63,70,0.5)]\",\n \"data-[hover=true]:!bg-[rgba(39,39,42,1)]\",\n \"group-data-[focus=true]:!bg-[rgba(39,39,42,1)]\",\n \"group-data-[focus=true]:!border-[rgba(63,63,70,0.8)]\",\n ].join(\" \"),\n }}\n startContent={\n <SearchIcon width={20} height={20} className=\"text-neutral\" />\n }\n endContent={\n value ? (\n <Button\n isIconOnly\n className=\"bg-transparent min-w-6 w-6 h-6 text-neutral\"\n onPress={onClear}\n >\n <XCloseIcon width={20} height={20} />\n </Button>\n ) : (\n <Kbd\n className=\"min-w-8 justify-center text-xs text-neutral bg-transparent border border-[rgba(63,63,70,0.5)] rounded-lg cursor-pointer select-none\"\n onMouseDown={(e: React.MouseEvent) => {\n e.preventDefault();\n onEscape?.();\n }}\n >\n Esc\n </Kbd>\n )\n }\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent } from \"@liberfi.io/react-predict\";\nimport { Avatar, cn, ChevronRightIcon, Linkable } from \"@liberfi.io/ui\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { getSourceMeta } from \"../matches/source-badge.ui\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type SearchResultItemUIProps = {\n event: PredictEvent;\n /** URL for the detail page. When set, the row renders as a link via Linkable. */\n href?: string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n onSelect?: (event: PredictEvent) => void;\n /** Called when the row is hovered (for data prefetching). */\n onHover?: (event: PredictEvent) => void;\n className?: string;\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction formatVolume(vol: number | null | undefined): string {\n if (vol == null) return \"-\";\n if (vol >= 1_000_000) return `$${(vol / 1_000_000).toFixed(1)}M`;\n if (vol >= 1_000) return `$${Math.round(vol / 1_000)}K`;\n return `$${vol.toFixed(0)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function SearchResultItemUI({\n event,\n href,\n LinkComponent,\n onSelect,\n onHover,\n className,\n}: SearchResultItemUIProps) {\n const { t } = useTranslation();\n const firstTag = event.tags?.[0];\n const sourceMeta = getSourceMeta(event.source);\n\n const formattedVolume = useMemo(\n () => formatVolume(event.volume),\n [event.volume],\n );\n\n return (\n <Linkable\n href={href}\n LinkComponent={LinkComponent}\n className={cn(\n \"group w-full h-full px-3 flex items-center gap-3\",\n \"hover:cursor-pointer hover:bg-content2 rounded-lg\",\n \"transition-colors duration-150\",\n className,\n )}\n onClick={(e) => {\n if (href && onSelect) e.preventDefault();\n onSelect?.(event);\n }}\n onMouseEnter={() => onHover?.(event)}\n >\n {/* Avatar */}\n <Avatar\n src={event.image_url || undefined}\n name={event.title || \"Event\"}\n radius=\"full\"\n className=\"h-10 w-10 flex-shrink-0\"\n />\n\n {/* Title + meta */}\n <div className=\"flex-1 min-w-0 flex flex-col justify-center gap-y-0.5\">\n <span className=\"min-w-0 text-sm font-medium line-clamp-2 group-hover:text-primary transition-colors\">\n {event.title}\n </span>\n\n <div className=\"flex items-center gap-x-2 text-[10px] font-normal text-neutral-500 lg:text-xs\">\n {/* Source icon + label */}\n <span\n className=\"inline-flex items-center gap-x-1 shrink-0\"\n style={{ color: sourceMeta.color }}\n >\n {sourceMeta.icon}\n <span\n style={{\n fontSize: 10,\n fontWeight: 600,\n letterSpacing: \"0.04em\",\n textTransform: \"uppercase\",\n }}\n >\n {sourceMeta.label}\n </span>\n </span>\n\n <span className=\"text-neutral-600\">·</span>\n\n {/* Volume */}\n <span className=\"text-neutral-400\">\n {formattedVolume} {t(\"predict.event.volume\")}\n </span>\n\n {/* Tag */}\n {firstTag && (\n <>\n <span className=\"text-neutral-600\">·</span>\n <span className=\"text-neutral-500\">{firstTag.label}</span>\n </>\n )}\n </div>\n </div>\n\n {/* Hover arrow */}\n <ChevronRightIcon\n width={16}\n height={16}\n className=\"shrink-0 text-neutral-500 opacity-0 group-hover:opacity-100 transition-opacity\"\n />\n </Linkable>\n );\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport {\n useSearchEvents,\n type PredictEvent,\n type PredictPage,\n type ProviderSource,\n} from \"@liberfi.io/react-predict\";\n\nexport interface UseSearchResultListScriptParams {\n keyword?: string;\n limit?: number;\n /** Filter by upstream provider. When set, only events from that provider are returned. */\n source?: ProviderSource;\n}\n\nexport function useSearchResultListScript({\n keyword = \"\",\n limit,\n source,\n}: UseSearchResultListScriptParams) {\n const { data, isLoading, isFetchingNextPage, hasNextPage, fetchNextPage } =\n useSearchEvents(\n {\n keyword,\n limit,\n source,\n sort_by: keyword ? undefined : \"volume\",\n sort_asc: keyword ? undefined : false,\n },\n { enabled: true },\n );\n\n const events = useMemo<PredictEvent[]>(\n () =>\n data?.pages\n .flatMap((p: PredictPage<PredictEvent>) => p.items)\n .filter((item): item is PredictEvent => item != null) ?? [],\n [data],\n );\n\n return {\n events,\n isLoading,\n isFetchingNextPage,\n hasNextPage: hasNextPage ?? false,\n fetchNextPage,\n };\n}\n","\"use client\";\n\nimport { ReactElement, useCallback, useMemo, useRef } from \"react\";\nimport { List, type RowComponentProps } from \"react-window\";\nimport { useInfiniteLoader } from \"react-window-infinite-loader\";\nimport { useResizeObserver } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent } from \"@liberfi.io/react-predict\";\nimport { cn, EmptyIcon, Spinner } from \"@liberfi.io/ui\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { SearchResultItemUI } from \"./search-result-item.ui\";\nimport {\n useSearchResultListScript,\n type UseSearchResultListScriptParams,\n} from \"./search-result-list.script\";\n\nconst ROW_HEIGHT = 64;\n\nexport type SearchResultListWidgetProps = {\n onSelect?: (event: PredictEvent) => void;\n /** Generate href for each event row. When set, rows render as links. */\n getEventHref?: (event: PredictEvent) => string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n /** Called when a row is hovered (for data prefetching). */\n onHover?: (event: PredictEvent) => void;\n className?: string;\n} & UseSearchResultListScriptParams;\n\nexport function SearchResultListWidget({\n onSelect,\n getEventHref,\n LinkComponent,\n onHover,\n className,\n ...scriptParams\n}: SearchResultListWidgetProps) {\n const { events, isLoading, isFetchingNextPage, hasNextPage, fetchNextPage } =\n useSearchResultListScript(scriptParams);\n\n const ref = useRef<HTMLDivElement>(null);\n const { height } = useResizeObserver<HTMLDivElement>({ ref });\n\n const isItemLoaded = useCallback(\n (index: number) => index < events.length,\n [events],\n );\n\n const loadMoreItems = useCallback(async () => {\n if (hasNextPage && !isFetchingNextPage) {\n await fetchNextPage();\n }\n }, [hasNextPage, isFetchingNextPage, fetchNextPage]);\n\n const itemCount = useMemo(\n () => (hasNextPage ? events.length + 1 : events.length),\n [events, hasNextPage],\n );\n\n const onRowsLoaded = useInfiniteLoader({\n isRowLoaded: isItemLoaded,\n loadMoreRows: loadMoreItems,\n rowCount: itemCount,\n threshold: 5,\n });\n\n if (isLoading) {\n return <LoadingState className={className} />;\n }\n\n if (events.length === 0) {\n return <EmptyState className={className} />;\n }\n\n return (\n <div className={cn(\"w-full h-full flex flex-col\", className)}>\n <div className=\"flex-auto min-h-0\" ref={ref}>\n <List\n className=\"no-scrollbar\"\n style={{ height }}\n onRowsRendered={onRowsLoaded}\n rowComponent={SearchResultRow}\n rowCount={itemCount}\n rowHeight={ROW_HEIGHT}\n rowProps={{ events, onSelect, getEventHref, LinkComponent, onHover }}\n overscanCount={5}\n />\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Row renderer\n// ---------------------------------------------------------------------------\n\ninterface SearchResultRowData {\n events: PredictEvent[];\n onSelect?: (event: PredictEvent) => void;\n getEventHref?: (event: PredictEvent) => string;\n LinkComponent?: LinkComponentType;\n onHover?: (event: PredictEvent) => void;\n}\n\nfunction SearchResultRow({\n index,\n style,\n events,\n onSelect,\n getEventHref,\n LinkComponent,\n onHover,\n}: RowComponentProps<SearchResultRowData>): ReactElement {\n const event = events[index];\n\n if (!event) {\n return (\n <div style={style} className=\"flex items-center justify-center\">\n <Spinner size=\"sm\" />\n </div>\n );\n }\n\n return (\n <div style={style}>\n <SearchResultItemUI\n event={event}\n href={getEventHref?.(event)}\n LinkComponent={LinkComponent}\n onSelect={onSelect}\n onHover={onHover}\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// States\n// ---------------------------------------------------------------------------\n\nfunction LoadingState({ className }: { className?: string }) {\n const { t } = useTranslation();\n\n return (\n <div\n className={cn(\"flex items-center justify-center gap-2 py-16\", className)}\n >\n <Spinner size=\"sm\" />\n <span className=\"text-sm text-neutral\">\n {t(\"predict.search.loading\")}\n </span>\n </div>\n );\n}\n\nfunction EmptyState({ className }: { className?: string }) {\n const { t } = useTranslation();\n\n return (\n <div\n className={cn(\n \"flex flex-col items-center justify-center py-16\",\n className,\n )}\n >\n <EmptyIcon width={28} height={28} className=\"text-neutral\" />\n <p className=\"mt-2 text-sm text-neutral\">\n {t(\"predict.search.noResults\")}\n </p>\n </div>\n );\n}\n","\"use client\";\n\nimport { useCallback, useMemo, useState } from \"react\";\nimport { useCallbackRef } from \"@liberfi.io/hooks\";\nimport { debounce } from \"@liberfi.io/utils\";\nimport { usePredictSearchHistory } from \"./search-history.script\";\n\nexport interface UseSearchScriptParams {\n /** Callback when the debounced keyword changes */\n onKeywordChange?: (keyword: string) => void;\n}\n\nexport function useSearchScript({ onKeywordChange }: UseSearchScriptParams) {\n const [text, setText] = useState(\"\");\n const [keyword, setKeyword] = useState(\"\");\n const { addHistory } = usePredictSearchHistory();\n\n const onKeywordChangeStable = useCallbackRef(onKeywordChange);\n const addHistoryStable = useCallbackRef(addHistory);\n\n const debouncedSearch = useMemo(\n () =>\n debounce((v: string) => {\n setKeyword(v);\n onKeywordChangeStable(v);\n if (v) addHistoryStable(v);\n }, 500),\n [onKeywordChangeStable, addHistoryStable],\n );\n\n const setText_ = useCallback(\n (v: string) => {\n setText(v);\n debouncedSearch(v);\n },\n [debouncedSearch],\n );\n\n const setKeyword_ = useCallback(\n (value: string) => {\n debouncedSearch.cancel();\n setText(value);\n setKeyword(value);\n onKeywordChangeStable(value);\n if (value) addHistoryStable(value);\n },\n [debouncedSearch, onKeywordChangeStable, addHistoryStable],\n );\n\n const clearKeyword = useCallback(() => setKeyword_(\"\"), [setKeyword_]);\n\n return {\n text,\n keyword,\n setText: setText_,\n setKeyword: setKeyword_,\n clearKeyword,\n };\n}\n","\"use client\";\n\nimport type { PredictEvent, ProviderSource } from \"@liberfi.io/react-predict\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { SearchHistoryWidget } from \"./search-history.widget\";\nimport { SearchInputUI } from \"./search-input.ui\";\nimport { SearchResultListWidget } from \"./search-result-list.widget\";\nimport { useSearchScript } from \"./search.script\";\n\nexport type SearchWidgetProps = {\n /** Callback when the debounced keyword changes */\n onKeywordChange?: (keyword: string) => void;\n /** Callback when an event is selected */\n onSelectEvent?: (event: PredictEvent) => void;\n /** Generate href for each event row. When set, rows render as links. */\n getEventHref?: (event: PredictEvent) => string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n /** Called when a row is hovered (for data prefetching). */\n onHover?: (event: PredictEvent) => void;\n /** Called when the Esc button / key is pressed. */\n onEscape?: () => void;\n /** Filter by upstream provider. When set, only events from that provider are returned. */\n source?: ProviderSource;\n};\n\nexport function SearchWidget({\n onKeywordChange,\n onSelectEvent,\n getEventHref,\n LinkComponent,\n onHover,\n onEscape,\n source,\n}: SearchWidgetProps) {\n const { text, keyword, setText, setKeyword, clearKeyword } = useSearchScript({\n onKeywordChange,\n });\n\n return (\n <div className=\"w-full h-full flex flex-col gap-3\">\n <SearchInputUI\n value={text}\n onValueChange={setText}\n onClear={clearKeyword}\n onEscape={onEscape}\n />\n {!keyword && <SearchHistoryWidget onSelect={setKeyword} />}\n <SearchResultListWidget\n className=\"flex-auto min-h-0\"\n keyword={keyword}\n onSelect={onSelectEvent}\n getEventHref={getEventHref}\n LinkComponent={LinkComponent}\n onHover={onHover}\n source={source}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent, ProviderSource } from \"@liberfi.io/react-predict\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport {\n Button,\n ModalBody,\n ModalContent,\n ModalHeader,\n StyledModal,\n useScreen,\n XCloseIcon,\n} from \"@liberfi.io/ui\";\nimport {\n AsyncModal,\n type RenderAsyncModalProps,\n} from \"@liberfi.io/ui-scaffold\";\nimport { SearchWidget } from \"./search.widget\";\n\nexport type PredictSearchModalParams = {\n /** Generate href for each event row. When set, rows render as links. */\n getEventHref?: (event: PredictEvent) => string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n /** Called when a row is hovered (for data prefetching). */\n onHover?: (event: PredictEvent) => void;\n /** Filter by upstream provider. When set, only events from that provider are returned. */\n source?: ProviderSource;\n};\n\nexport type PredictSearchModalResult = PredictEvent;\n\nexport const PREDICT_SEARCH_MODAL_ID = \"predict-search\";\n\nexport function PredictSearchModal({\n id = PREDICT_SEARCH_MODAL_ID,\n}: {\n id?: string;\n}) {\n return (\n <AsyncModal<PredictSearchModalParams, PredictSearchModalResult> id={id}>\n {(modalProps) => <PredictSearchModalContent {...modalProps} />}\n </AsyncModal>\n );\n}\n\nfunction PredictSearchModalContent({\n params,\n isOpen,\n onOpenChange,\n onResult,\n}: RenderAsyncModalProps<PredictSearchModalParams, PredictSearchModalResult>) {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n\n const handleSelectEvent = useCallback(\n (event: PredictEvent) => {\n onResult(event);\n },\n [onResult],\n );\n\n const handleEscape = useCallback(() => {\n onOpenChange(false);\n }, [onOpenChange]);\n\n return (\n <StyledModal\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n size={isMobile ? \"full\" : \"lg\"}\n hideCloseButton\n backdrop=\"blur\"\n radius=\"lg\"\n >\n <ModalContent\n className=\"w-full h-full\"\n style={{\n borderRadius: isMobile ? undefined : 14,\n border: isMobile ? undefined : \"1px solid rgba(39,39,42,1)\",\n background: \"rgba(24,24,27,1)\",\n boxShadow: isMobile ? undefined : \"0 25px 50px -12px rgba(0,0,0,0.5)\",\n overflow: \"hidden\",\n }}\n >\n <ModalHeader className=\"sm:hidden flex items-center justify-between pt-4 pb-2\">\n <span className=\"text-base font-semibold\">\n {t(\"predict.search.title\")}\n </span>\n <Button\n isIconOnly\n onPress={() => onOpenChange(false)}\n size=\"sm\"\n className=\"bg-transparent min-w-6 w-6 h-6\"\n >\n <XCloseIcon width={20} height={20} />\n </Button>\n </ModalHeader>\n <ModalBody className=\"p-4\">\n <SearchWidget\n getEventHref={params?.getEventHref}\n LinkComponent={params?.LinkComponent}\n onHover={params?.onHover}\n source={params?.source}\n onSelectEvent={handleSelectEvent}\n onEscape={handleEscape}\n />\n </ModalBody>\n </ModalContent>\n </StyledModal>\n );\n}\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport { useCallbackRef } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent } from \"@liberfi.io/react-predict\";\nimport { Button, cn, Kbd, SearchIcon, useScreen } from \"@liberfi.io/ui\";\nimport { useAsyncModal } from \"@liberfi.io/ui-scaffold\";\nimport {\n PREDICT_SEARCH_MODAL_ID,\n type PredictSearchModalParams,\n type PredictSearchModalResult,\n} from \"./search.modal\";\n\nexport type SearchEventsButtonProps = {\n /** Callback when an event is selected from the search modal */\n onSelectEvent?: (event: PredictEvent) => void;\n /** Params forwarded to the search modal (getEventHref, LinkComponent, onHover) */\n modalParams?: Omit<PredictSearchModalParams, never>;\n className?: string;\n};\n\nexport function SearchEventsButton({\n onSelectEvent,\n modalParams,\n className,\n}: SearchEventsButtonProps) {\n const { t } = useTranslation();\n const { isDesktop, isMobile } = useScreen();\n\n const { onOpen, onClose } = useAsyncModal<\n PredictSearchModalParams,\n PredictSearchModalResult\n >(PREDICT_SEARCH_MODAL_ID);\n\n const onSelectEventStable = useCallbackRef(onSelectEvent);\n\n const handleOpen = useCallbackRef(async () => {\n const result = await onOpen({ params: modalParams });\n if (result) {\n onSelectEventStable(result);\n }\n });\n\n const handleClose = useCallbackRef(() => {\n onClose();\n });\n\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n const activeElement = document.activeElement as HTMLElement | null;\n\n const isInEditableElement =\n !!activeElement &&\n (activeElement.tagName === \"INPUT\" ||\n activeElement.tagName === \"TEXTAREA\" ||\n activeElement.getAttribute(\"contenteditable\") === \"true\");\n\n if (event.key === \"/\" && !isInEditableElement) {\n event.preventDefault();\n handleOpen();\n }\n\n if (event.key === \"Escape\") {\n event.preventDefault();\n handleClose();\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n window.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [handleOpen, handleClose]);\n\n return (\n <Button\n size=\"sm\"\n radius=\"full\"\n isIconOnly={!isDesktop}\n onPress={handleOpen}\n variant={isMobile ? \"flat\" : \"bordered\"}\n startContent={\n isDesktop ? <SearchIcon className=\"text-neutral\" /> : undefined\n }\n endContent={\n isDesktop ? (\n <Kbd className=\"ml-auto min-w-6 justify-center text-xs bg-transparent border border-border rounded-full\">\n /\n </Kbd>\n ) : undefined\n }\n className={cn(\n isDesktop && \"min-w-56 justify-start pl-3 pr-1.5 text-neutral\",\n className,\n )}\n >\n {isDesktop ? (\n t(\"predict.search.placeholder\")\n ) : (\n <SearchIcon className=\"text-neutral\" />\n )}\n </Button>\n );\n}\n","import { useState, useRef, useEffect, useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { MatchSortField } from \"@liberfi.io/react-predict\";\n\nexport interface MatchesFilterBarProps {\n sortBy: MatchSortField;\n onSortChange: (sort: MatchSortField) => void;\n sortAsc: boolean;\n onSortAscChange: (asc: boolean) => void;\n minVolume?: number;\n onMinVolumeChange?: (vol: number | undefined) => void;\n onRefresh?: () => void;\n}\n\nconst SORT_OPTIONS: {\n value: MatchSortField;\n labelKey: string;\n descKey: string;\n icon: \"trending-up\" | \"chart-column\" | \"flame\";\n}[] = [\n {\n value: \"spread\",\n labelKey: \"predict.matches.sort.spread\",\n descKey: \"predict.matches.sort.spreadDesc\",\n icon: \"trending-up\",\n },\n {\n value: \"volume\",\n labelKey: \"predict.matches.sort.volume\",\n descKey: \"predict.matches.sort.volumeDesc\",\n icon: \"chart-column\",\n },\n {\n value: \"confidence\",\n labelKey: \"predict.matches.sort.confidence\",\n descKey: \"predict.matches.sort.confidenceDesc\",\n icon: \"flame\",\n },\n];\n\nconst VOLUME_PRESETS = [\n { labelKey: \"predict.matches.filter.noMinimum\", label: \"$0\", value: 0 },\n { labelKey: null, label: \"$100+\", value: 100 },\n { labelKey: null, label: \"$500+\", value: 500 },\n { labelKey: null, label: \"$1K+\", value: 1_000 },\n { labelKey: null, label: \"$5K+\", value: 5_000 },\n { labelKey: null, label: \"$10K+\", value: 10_000 },\n { labelKey: null, label: \"$50K+\", value: 50_000 },\n { labelKey: null, label: \"$100K+\", value: 100_000 },\n];\n\nconst btnBase: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n borderRadius: 10,\n border: \"1px solid rgba(63,63,70,0.5)\",\n background: \"rgba(39,39,42,0.6)\",\n padding: \"8px 12px\",\n fontSize: 14,\n color: \"#d4d4d8\",\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n};\n\nconst dropdownBase: React.CSSProperties = {\n position: \"absolute\",\n right: 0,\n top: \"100%\",\n zIndex: 20,\n marginTop: 8,\n borderRadius: 14,\n border: \"1px solid rgba(39,39,42,1)\",\n background: \"rgba(24,24,27,1)\",\n boxShadow: \"0 25px 50px -12px rgba(0,0,0,0.5)\",\n overflow: \"hidden\",\n};\n\nfunction getVolumeLabel(\n vol: number | undefined,\n t: (key: string) => string,\n): string {\n if (!vol) return \"$5K+\";\n const preset = VOLUME_PRESETS.find((p) => p.value === vol);\n if (!preset) return `$${vol}`;\n return preset.labelKey ? t(preset.labelKey) : preset.label;\n}\n\nexport function MatchesFilterBar({\n sortBy,\n onSortChange,\n sortAsc,\n onSortAscChange,\n minVolume,\n onMinVolumeChange,\n onRefresh,\n}: MatchesFilterBarProps) {\n const { t } = useTranslation();\n const [sortOpen, setSortOpen] = useState(false);\n const [volumeOpen, setVolumeOpen] = useState(false);\n const [tooltipVisible, setTooltipVisible] = useState(false);\n const [spinning, setSpinning] = useState(false);\n const sortRef = useRef<HTMLDivElement>(null);\n const volumeRef = useRef<HTMLDivElement>(null);\n\n const currentSort =\n SORT_OPTIONS.find((o) => o.value === sortBy) ?? SORT_OPTIONS[0];\n\n const handleClickOutside = useCallback((e: MouseEvent) => {\n if (sortRef.current && !sortRef.current.contains(e.target as Node)) {\n setSortOpen(false);\n }\n if (volumeRef.current && !volumeRef.current.contains(e.target as Node)) {\n setVolumeOpen(false);\n }\n }, []);\n\n useEffect(() => {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [handleClickOutside]);\n\n const handleRefresh = useCallback(() => {\n onRefresh?.();\n setSpinning(true);\n setTimeout(() => setSpinning(false), 700);\n }, [onRefresh]);\n\n return (\n <>\n <style>{`\n @keyframes matchRefreshSpin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}\n .match-refresh-spin{animation:matchRefreshSpin .6s ease-in-out}\n .match-btn:focus-visible{outline:2px solid #c7ff2e;outline-offset:2px;z-index:10}\n `}</style>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n {/* Sort dropdown */}\n <div ref={sortRef} style={{ position: \"relative\" }}>\n <button\n type=\"button\"\n className=\"match-btn\"\n style={btnBase}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,1)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,0.6)\";\n }}\n onClick={() => {\n setSortOpen((v) => !v);\n setVolumeOpen(false);\n }}\n >\n <SortIcon />\n <span className=\"hidden sm:block\" style={{ color: \"#d4d4d8\" }}>\n {t(currentSort.labelKey as never)}\n </span>\n <ChevronDown open={sortOpen} />\n </button>\n\n {sortOpen && (\n <div style={{ ...dropdownBase, width: 224, padding: 4 }}>\n {SORT_OPTIONS.map((opt) => {\n const isActive = sortBy === opt.value;\n return (\n <button\n key={opt.value}\n type=\"button\"\n style={{\n display: \"flex\",\n width: \"100%\",\n alignItems: \"center\",\n gap: 12,\n padding: \"10px 12px\",\n textAlign: \"left\",\n fontSize: 14,\n border: \"none\",\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n background: isActive\n ? \"rgba(199,255,46,0.08)\"\n : \"transparent\",\n color: isActive ? \"#c7ff2e\" : \"#a1a1aa\",\n borderRadius: 10,\n }}\n onMouseEnter={(e) => {\n if (!isActive) {\n e.currentTarget.style.background = \"rgba(39,39,42,0.5)\";\n e.currentTarget.style.color = \"#fff\";\n }\n }}\n onMouseLeave={(e) => {\n if (!isActive) {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"#a1a1aa\";\n }\n }}\n onClick={() => {\n if (sortBy === opt.value) {\n onSortAscChange(!sortAsc);\n } else {\n onSortChange(opt.value);\n }\n setSortOpen(false);\n }}\n >\n <div\n style={{\n color: isActive ? \"#c7ff2e\" : \"#71717a\",\n }}\n >\n <SortOptionIcon type={opt.icon} />\n </div>\n <div style={{ flex: 1, textAlign: \"left\" as const }}>\n <div style={{ fontWeight: 500 }}>\n {t(opt.labelKey as never)}\n </div>\n <div\n style={{\n fontSize: 11,\n color: \"#71717a\",\n marginTop: 1,\n }}\n >\n {t(opt.descKey as never)}\n </div>\n </div>\n {isActive && (\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 16,\n height: 16,\n color: \"#c7ff2e\",\n flexShrink: 0,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n )}\n </button>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Volume filter */}\n {onMinVolumeChange && (\n <div ref={volumeRef} style={{ position: \"relative\" }}>\n <div style={{ position: \"relative\", display: \"inline-flex\" }}>\n <button\n type=\"button\"\n className=\"match-btn\"\n style={btnBase}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,1)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,0.6)\";\n }}\n onClick={() => {\n setVolumeOpen((v) => !v);\n setSortOpen(false);\n }}\n >\n <FilterIcon />\n <span className=\"hidden sm:block\" style={{ color: \"#d4d4d8\" }}>\n {getVolumeLabel(minVolume, t as (key: string) => string)}\n </span>\n <InfoIcon\n onMouseEnter={() => setTooltipVisible(true)}\n onMouseLeave={() => setTooltipVisible(false)}\n />\n <ChevronDown open={volumeOpen} />\n </button>\n\n {/* Tooltip */}\n {tooltipVisible && (\n <div\n style={{\n position: \"absolute\",\n zIndex: 100,\n top: \"100%\",\n marginTop: 8,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n width: 256,\n padding: 12,\n borderRadius: 14,\n background: \"rgba(24,24,27,1)\",\n border: \"1px solid rgba(63,63,70,0.5)\",\n boxShadow: \"0 25px 50px -12px rgba(0,0,0,0.5)\",\n pointerEvents: \"none\",\n }}\n >\n {/* Arrow */}\n <div\n style={{\n position: \"absolute\",\n top: -6,\n left: \"50%\",\n transform: \"translateX(-50%) rotate(45deg)\",\n width: 12,\n height: 12,\n background: \"rgba(24,24,27,1)\",\n borderLeft: \"1px solid rgba(63,63,70,0.5)\",\n borderTop: \"1px solid rgba(63,63,70,0.5)\",\n }}\n />\n <div\n style={{\n position: \"relative\",\n fontSize: 12,\n color: \"#d4d4d8\",\n lineHeight: 1.625,\n }}\n >\n <div\n style={{\n fontWeight: 600,\n color: \"#fff\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n marginBottom: 8,\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 14,\n height: 14,\n color: \"#c7ff2e\",\n flexShrink: 0,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z\" />\n </svg>\n {t(\"predict.matches.filter.liquidityFilter\" as never)}\n </div>\n <p style={{ color: \"#a1a1aa\", margin: \"0 0 4px\" }}>\n {t(\"predict.matches.filter.tooltipDesc\" as never)}\n </p>\n <p style={{ color: \"#71717a\", fontSize: 11, margin: 0 }}>\n {t(\"predict.matches.filter.tooltipNote\" as never)}\n </p>\n </div>\n </div>\n )}\n </div>\n\n {/* Volume dropdown */}\n {volumeOpen && (\n <div style={{ ...dropdownBase, right: 0, width: 176 }}>\n <div\n style={{\n padding: \"8px 12px\",\n borderBottom: \"1px solid rgba(39,39,42,1)\",\n }}\n >\n <span\n style={{\n fontSize: 11,\n fontWeight: 500,\n color: \"#71717a\",\n textTransform: \"uppercase\" as const,\n letterSpacing: \"0.05em\",\n }}\n >\n {t(\"predict.matches.filter.minVolumeEach\" as never)}\n </span>\n </div>\n <div style={{ padding: 4 }}>\n {VOLUME_PRESETS.map((p) => {\n const isActive =\n p.value === 0 ? !minVolume : minVolume === p.value;\n return (\n <button\n key={p.value}\n type=\"button\"\n style={{\n display: \"flex\",\n width: \"100%\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"8px 12px\",\n textAlign: \"left\",\n fontSize: 14,\n border: \"none\",\n cursor: \"pointer\",\n background: isActive\n ? \"rgba(199,255,46,0.08)\"\n : \"transparent\",\n color: isActive ? \"#c7ff2e\" : \"#a1a1aa\",\n borderRadius: 10,\n transition: \"all 0.15s\",\n }}\n onMouseEnter={(e) => {\n if (!isActive) {\n e.currentTarget.style.background =\n \"rgba(39,39,42,0.5)\";\n e.currentTarget.style.color = \"#fff\";\n }\n }}\n onMouseLeave={(e) => {\n if (!isActive) {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"#a1a1aa\";\n }\n }}\n onClick={() => {\n onMinVolumeChange?.(\n p.value === 0 ? undefined : p.value,\n );\n setVolumeOpen(false);\n }}\n >\n <span>\n {p.labelKey ? t(p.labelKey as never) : p.label}\n </span>\n {isActive && (\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 16,\n height: 16,\n color: \"#c7ff2e\",\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n )}\n </button>\n );\n })}\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* Refresh button */}\n {onRefresh && (\n <button\n type=\"button\"\n className=\"match-btn\"\n style={{\n borderRadius: 10,\n border: \"1px solid rgba(63,63,70,0.5)\",\n background: \"rgba(39,39,42,0.6)\",\n width: 36,\n height: 36,\n color: \"#a1a1aa\",\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,1)\";\n e.currentTarget.style.color = \"#fff\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,0.6)\";\n e.currentTarget.style.color = \"#a1a1aa\";\n }}\n onClick={handleRefresh}\n >\n <svg\n className={spinning ? \"match-refresh-spin\" : undefined}\n viewBox=\"0 0 24 24\"\n style={{ width: 16, height: 16 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\" />\n <path d=\"M21 3v5h-5\" />\n <path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\" />\n <path d=\"M8 16H3v5\" />\n </svg>\n </button>\n )}\n </div>\n </>\n );\n}\n\nfunction SortIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 14, height: 14, color: \"#a1a1aa\" }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m21 16-4 4-4-4\" />\n <path d=\"M17 20V4\" />\n <path d=\"m3 8 4-4 4 4\" />\n <path d=\"M7 4v16\" />\n </svg>\n );\n}\n\nfunction SortOptionIcon({\n type,\n}: {\n type: \"trending-up\" | \"chart-column\" | \"flame\";\n}) {\n const style: React.CSSProperties = { width: 16, height: 16 };\n const shared = {\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\" as const,\n strokeLinejoin: \"round\" as const,\n };\n\n if (type === \"trending-up\") {\n return (\n <svg {...shared} style={style}>\n <path d=\"M16 7h6v6\" />\n <path d=\"m22 7-8.5 8.5-5-5L2 17\" />\n </svg>\n );\n }\n if (type === \"chart-column\") {\n return (\n <svg {...shared} style={style}>\n <path d=\"M3 3v16a2 2 0 0 0 2 2h16\" />\n <path d=\"M18 17V9\" />\n <path d=\"M13 17V5\" />\n <path d=\"M8 17v-3\" />\n </svg>\n );\n }\n return (\n <svg {...shared} style={style}>\n <path d=\"M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z\" />\n </svg>\n );\n}\n\nfunction FilterIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 14, height: 14, color: \"#a1a1aa\" }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z\" />\n </svg>\n );\n}\n\nfunction InfoIcon({\n onMouseEnter,\n onMouseLeave,\n}: {\n onMouseEnter?: () => void;\n onMouseLeave?: () => void;\n}) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n className=\"hidden sm:block\"\n style={{ width: 12, height: 12, color: \"#52525b\", flexShrink: 0 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 16v-4\" />\n <path d=\"M12 8h.01\" />\n </svg>\n );\n}\n\nfunction ChevronDown({ open }: { open: boolean }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 14,\n height: 14,\n color: \"#71717a\",\n transition: \"transform 0.15s\",\n transform: open ? \"rotate(180deg)\" : undefined,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n );\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\n\nexport interface MatchesHeroStats {\n activePairs: number;\n maxSpread: number;\n highSpreadCount: number;\n totalVolume: number;\n}\n\nexport interface MatchesHeroProps {\n stats?: MatchesHeroStats;\n}\n\nfunction formatVolume(vol: number): string {\n if (vol >= 1_000_000) return `$${(vol / 1_000_000).toFixed(1)}M`;\n if (vol >= 1_000) return `$${(vol / 1_000).toFixed(0)}K`;\n return `$${vol.toFixed(0)}`;\n}\n\nconst STAT_CARDS: {\n key: keyof MatchesHeroStats;\n labelKey: string;\n format: (v: number) => string;\n valueColor: string;\n gradientFrom: string;\n gradientTo: string;\n borderColor: string;\n}[] = [\n {\n key: \"activePairs\",\n labelKey: \"predict.matches.stats.activePairs\",\n format: (v) => v.toLocaleString(),\n valueColor: \"#c7ff2e\",\n gradientFrom: \"rgba(199,255,46,0.18)\",\n gradientTo: \"rgba(199,255,46,0.04)\",\n borderColor: \"rgba(199,255,46,0.18)\",\n },\n {\n key: \"maxSpread\",\n labelKey: \"predict.matches.stats.maxSpread\",\n format: (v) => `${(v * 100).toFixed(1)}%`,\n valueColor: \"#f76816\",\n gradientFrom: \"rgba(247,104,22,0.18)\",\n gradientTo: \"rgba(247,104,22,0.04)\",\n borderColor: \"rgba(247,104,22,0.18)\",\n },\n {\n key: \"highSpreadCount\",\n labelKey: \"predict.matches.stats.highSpreadCount\",\n format: (v) => v.toLocaleString(),\n valueColor: \"#17c964\",\n gradientFrom: \"rgba(23,201,100,0.18)\",\n gradientTo: \"rgba(23,201,100,0.04)\",\n borderColor: \"rgba(23,201,100,0.18)\",\n },\n {\n key: \"totalVolume\",\n labelKey: \"predict.matches.stats.totalVolume\",\n format: formatVolume,\n valueColor: \"#f5a524\",\n gradientFrom: \"rgba(245,165,36,0.18)\",\n gradientTo: \"rgba(245,165,36,0.04)\",\n borderColor: \"rgba(245,165,36,0.18)\",\n },\n];\n\nexport function MatchesHero({ stats }: MatchesHeroProps) {\n const { t } = useTranslation();\n\n return (\n <>\n <style>{`\n @keyframes match-live-ping{75%,100%{transform:scale(2.2);opacity:0}}\n @keyframes match-live-breathe{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.55;transform:scale(.85)}}\n @keyframes matchStatsEnter{from{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}\n @keyframes matchStatCardEnter{from{opacity:0;transform:translateY(8px) scale(0.97)}to{opacity:1;transform:translateY(0) scale(1)}}\n @keyframes matchHeroTitleEnter{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}\n\n .matches-hero-title{font-size:32px!important;line-height:1.2!important}\n @media(min-width:640px){.matches-hero-title{font-size:38px!important}}\n @media(min-width:1024px){.matches-hero-title{font-size:46px!important}}\n\n .matches-hero-subtitle{font-size:14px}\n @media(min-width:640px){.matches-hero-subtitle{font-size:15px}}\n\n .matches-hero-outer{flex-direction:column;align-items:center;text-align:center;gap:28px}\n @media(min-width:640px){.matches-hero-outer{flex-direction:row;align-items:center;text-align:left;gap:40px}}\n @media(min-width:1024px){.matches-hero-outer{gap:56px}}\n\n .matches-hero-left{align-items:center}\n @media(min-width:640px){.matches-hero-left{align-items:flex-start}}\n\n .matches-hero-live{justify-content:center}\n @media(min-width:640px){.matches-hero-live{justify-content:flex-start}}\n\n .matches-hero-subtitle-text{text-align:center;margin:0 auto}\n @media(min-width:640px){.matches-hero-subtitle-text{text-align:left;margin:0}}\n\n .matches-stat-grid{grid-template-columns:repeat(2,1fr);width:100%;max-width:360px}\n @media(min-width:640px){.matches-stat-grid{width:340px;max-width:none}}\n @media(min-width:1024px){.matches-stat-grid{width:380px}}\n\n .matches-stat-val{font-size:20px;line-height:28px;min-height:28px}\n @media(min-width:640px){.matches-stat-val{font-size:22px;line-height:30px;min-height:30px}}\n @media(min-width:1024px){.matches-stat-val{font-size:24px;line-height:32px;min-height:32px}}\n\n .matches-stat-label{font-size:11px;line-height:16px;min-height:16px}\n @media(min-width:640px){.matches-stat-label{font-size:12px;line-height:18px;min-height:18px}}\n `}</style>\n\n <div\n className=\"matches-hero-outer\"\n style={{\n display: \"flex\",\n marginBottom: 0,\n }}\n >\n {/* Left: title group */}\n <div\n className=\"matches-hero-left\"\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n minWidth: 0,\n flex: 1,\n animation:\n \"matchHeroTitleEnter 0.5s cubic-bezier(0.34,1.56,0.64,1) both\",\n }}\n >\n {/* Live badge */}\n <div\n className=\"matches-hero-live\"\n style={{ display: \"flex\", marginBottom: 16 }}\n >\n <div\n className=\"inline-flex items-center\"\n style={{\n gap: 8,\n borderRadius: 9999,\n border: \"1px solid rgba(63,63,70,0.5)\",\n background: \"rgba(39,39,42,0.6)\",\n padding: \"6px 12px\",\n backdropFilter: \"blur(8px)\",\n WebkitBackdropFilter: \"blur(8px)\",\n }}\n >\n <span\n style={{\n position: \"relative\",\n display: \"flex\",\n width: 8,\n height: 8,\n }}\n >\n <span\n style={{\n position: \"absolute\",\n display: \"inline-flex\",\n width: \"100%\",\n height: \"100%\",\n borderRadius: 9999,\n background: \"#00d492\",\n opacity: 0.75,\n animation:\n \"match-live-ping 1.2s cubic-bezier(0,0,0.2,1) infinite\",\n }}\n />\n <span\n style={{\n position: \"relative\",\n display: \"inline-flex\",\n width: 8,\n height: 8,\n borderRadius: 9999,\n background: \"#00bc7d\",\n animation: \"match-live-breathe 2.4s ease-in-out infinite\",\n }}\n />\n </span>\n <span\n style={{\n fontSize: 12,\n fontWeight: 500,\n color: \"#d4d4d8\",\n letterSpacing: \"0.025em\",\n }}\n >\n {t(\"predict.matches.liveBadge\" as const)}\n </span>\n <span\n style={{\n borderRadius: 4,\n background: \"rgba(199,255,46,0.12)\",\n padding: \"2px 6px\",\n fontSize: 10,\n fontWeight: 600,\n color: \"#c7ff2e\",\n textTransform: \"uppercase\" as const,\n border: \"1px solid rgba(199,255,46,0.22)\",\n }}\n >\n {t(\"predict.matches.betaTag\" as const)}\n </span>\n </div>\n </div>\n\n {/* Title */}\n <h1\n className=\"matches-hero-title\"\n style={{\n fontFamily: \"var(--font-dm-sans, 'DM Sans', sans-serif)\",\n fontSize: 46,\n fontWeight: 700,\n letterSpacing: \"-1.2px\",\n lineHeight: 1.2,\n color: \"#fff\",\n margin: \"0 0 14px\",\n }}\n >\n <span style={{ color: \"#fff\" }}>\n {t(\"predict.matches.titlePrefix\" as never)}{\" \"}\n </span>\n <span\n style={{\n backgroundImage:\n \"linear-gradient(to right, #c7ff2e, #a0e515, #17c964)\",\n WebkitBackgroundClip: \"text\",\n WebkitTextFillColor: \"transparent\",\n backgroundClip: \"text\",\n }}\n >\n {t(\"predict.matches.titleHighlight\" as never)}\n </span>\n </h1>\n\n {/* Subtitle */}\n <p\n className=\"matches-hero-subtitle matches-hero-subtitle-text\"\n style={{\n lineHeight: 1.6,\n color: \"#71717a\",\n maxWidth: 460,\n }}\n >\n {String(t(\"predict.matches.heroSubtitle\" as never))\n .split(\"\\n\")\n .map((line: string, i: number) => (\n <span key={i}>\n {i > 0 && <br className=\"hidden sm:block\" />}\n {line}\n {i === 0 ? \" \" : \"\"}\n </span>\n ))}\n </p>\n </div>\n\n {/* Right: 2x2 stat grid */}\n <div\n className=\"matches-stat-grid\"\n style={{\n display: \"grid\",\n borderRadius: 16,\n border: \"1px solid rgba(39,39,42,0.5)\",\n overflow: \"hidden\",\n flexShrink: 0,\n backdropFilter: \"blur(8px)\",\n WebkitBackdropFilter: \"blur(8px)\",\n ...(stats\n ? {\n animation:\n \"matchStatsEnter 0.5s cubic-bezier(0.34,1.56,0.64,1) both\",\n animationDelay: \"0.1s\",\n }\n : {}),\n }}\n >\n {STAT_CARDS.map((card, idx) => (\n <div\n key={card.key}\n style={{\n padding: \"16px 20px\",\n background: stats\n ? `linear-gradient(to bottom, ${card.gradientFrom}, ${card.gradientTo})`\n : \"rgba(255,255,255,0.02)\",\n borderRight:\n idx % 2 === 0 ? \"1px solid rgba(39,39,42,0.4)\" : \"none\",\n borderBottom: idx < 2 ? \"1px solid rgba(39,39,42,0.4)\" : \"none\",\n ...(stats\n ? {\n animation:\n \"matchStatCardEnter 0.45s cubic-bezier(0.34,1.56,0.64,1) both\",\n animationDelay: `${150 + idx * 60}ms`,\n }\n : {}),\n }}\n >\n <div\n className=\"matches-stat-val\"\n style={{\n fontWeight: 700,\n fontVariantNumeric: \"tabular-nums\",\n color: stats ? card.valueColor : \"transparent\",\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n {stats ? (\n card.format(stats[card.key])\n ) : (\n <div\n style={{\n height: 16,\n width: 56,\n borderRadius: 4,\n background: \"rgba(255,255,255,0.06)\",\n animation: \"matchStatCardEnter 0.6s ease-out both\",\n animationDelay: `${idx * 80}ms`,\n }}\n />\n )}\n </div>\n <div\n className=\"matches-stat-label\"\n style={{\n fontWeight: 500,\n color: stats ? \"#71717a\" : \"transparent\",\n marginTop: 2,\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n {stats ? (\n t(card.labelKey as never)\n ) : (\n <div\n style={{\n height: 10,\n width: 64,\n borderRadius: 4,\n background: \"rgba(255,255,255,0.04)\",\n animation: \"matchStatCardEnter 0.6s ease-out both\",\n animationDelay: `${50 + idx * 80}ms`,\n }}\n />\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n </>\n );\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport type {\n MatchConfidenceTier,\n MatchMarketFlat,\n PredictMarket,\n ProviderSource,\n} from \"@liberfi.io/react-predict\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { getSourceMeta } from \"./source-badge.ui\";\n\nexport interface MatchMarketCardProps {\n match: MatchMarketFlat;\n onSelect?: (match: MatchMarketFlat, source: ProviderSource) => void;\n onHover?: (match: MatchMarketFlat) => void;\n getMarketHref?: (\n match: MatchMarketFlat,\n source: ProviderSource,\n ) => string | undefined;\n LinkComponent?: LinkComponentType;\n}\n\nfunction formatVolume(vol: number | null | undefined): string {\n if (vol == null) return \"-\";\n if (vol >= 1_000_000) return `$${(vol / 1_000_000).toFixed(1)}M`;\n if (vol >= 1_000) return `$${Math.round(vol / 1_000)}K`;\n return `$${vol.toFixed(0)}`;\n}\n\nfunction getYesPrice(market: PredictMarket): number | null {\n const yes = market.outcomes?.[0];\n return yes?.best_ask ?? yes?.price ?? null;\n}\n\nfunction getOutcomeName(market: PredictMarket): string | null {\n return market.outcomes?.[0]?.label || null;\n}\n\ntype SpreadTier = \"high\" | \"medium\" | \"low\";\n\nfunction getSpreadTier(spreadPercent: number | null): SpreadTier {\n if (spreadPercent == null) return \"low\";\n if (spreadPercent >= 3) return \"high\";\n if (spreadPercent >= 2) return \"medium\";\n return \"low\";\n}\n\nconst SPREAD_THEME: Record<\n SpreadTier,\n {\n color: string;\n bandFrom: string;\n bandTo: string;\n gaugeActive: string;\n gaugeInactive: string;\n }\n> = {\n high: {\n color: \"#f76816\",\n bandFrom: \"rgba(247,104,22,0.14)\",\n bandTo: \"rgba(247,104,22,0.03)\",\n gaugeActive: \"#f76816\",\n gaugeInactive: \"rgba(247,104,22,0.15)\",\n },\n medium: {\n color: \"#c7ff2e\",\n bandFrom: \"rgba(199,255,46,0.12)\",\n bandTo: \"rgba(199,255,46,0.02)\",\n gaugeActive: \"#c7ff2e\",\n gaugeInactive: \"rgba(199,255,46,0.15)\",\n },\n low: {\n color: \"#71717a\",\n bandFrom: \"rgba(113,113,122,0.08)\",\n bandTo: \"transparent\",\n gaugeActive: \"#71717a\",\n gaugeInactive: \"rgba(113,113,122,0.12)\",\n },\n};\n\nconst SPREAD_GLOW: Record<SpreadTier, { border: string; shadow: string }> = {\n high: {\n border: \"rgba(247,104,22,0.4)\",\n shadow: \"0 2px 18px rgba(247,104,22,0.35)\",\n },\n medium: {\n border: \"rgba(199,255,46,0.5)\",\n shadow: \"0 2px 20px rgba(199,255,46,0.45)\",\n },\n low: {\n border: \"rgba(113,113,122,0.5)\",\n shadow: \"0 2px 20px rgba(113,113,122,0.35)\",\n },\n};\n\nconst CONFIDENCE_THEME: Record<string, { dot: string; label: string }> = {\n high: { dot: \"#17c964\", label: \"predict.matches.confidenceHigh\" },\n medium: { dot: \"#f5a524\", label: \"predict.matches.confidenceMed\" },\n low: { dot: \"#71717a\", label: \"predict.matches.confidenceLow\" },\n};\n\nfunction getConfidenceTierKey(\n tier: MatchConfidenceTier | undefined,\n score: number | undefined,\n): string {\n if (tier) return tier;\n if (score == null) return \"low\";\n if (score >= 0.9) return \"high\";\n if (score >= 0.7) return \"medium\";\n return \"low\";\n}\n\nfunction SpreadGauge({ tier }: { tier: SpreadTier }) {\n const theme = SPREAD_THEME[tier];\n const filled = tier === \"high\" ? 5 : tier === \"medium\" ? 3 : 1;\n return (\n <div style={{ display: \"flex\", gap: 2, alignItems: \"center\" }}>\n {Array.from({ length: 5 }, (_, i) => (\n <div\n key={i}\n style={{\n width: 6,\n height: 10,\n borderRadius: 1.5,\n background: i < filled ? theme.gaugeActive : theme.gaugeInactive,\n transition: \"background 0.2s\",\n }}\n />\n ))}\n </div>\n );\n}\n\nconst PLATFORM_COLORS: Record<string, { text: string; icon: string }> = {\n polymarket: { text: \"#50a2ff\", icon: \"#50a2ff\" },\n kalshi: { text: \"#00d492\", icon: \"#00d492\" },\n};\n\nconst DEFAULT_PLATFORM = { text: \"#9ca3af\", icon: \"#9ca3af\" };\n\nfunction getPlatformColor(source: string) {\n return PLATFORM_COLORS[source] ?? DEFAULT_PLATFORM;\n}\n\nconst FOCUS_CSS = `\n.match-card button:focus-visible,\n.match-card a:focus-visible,\n.match-card [role=\"button\"]:focus-visible {\n outline: 2px solid hsl(var(--heroui-primary) / 0.4);\n outline-offset: 2px;\n}\n`;\n\nexport function MatchMarketCard({\n match,\n onSelect,\n onHover,\n getMarketHref,\n LinkComponent,\n}: MatchMarketCardProps) {\n const { t } = useTranslation();\n\n const priceA = getYesPrice(match.market_a);\n const priceB = getYesPrice(match.market_b);\n const spreadPercent =\n match.spread_percent != null\n ? match.spread_percent\n : match.spread != null\n ? match.spread * 100\n : null;\n\n const tier = getSpreadTier(spreadPercent);\n const theme = SPREAD_THEME[tier];\n\n const cheaperSource: ProviderSource | null =\n priceA != null && priceB != null\n ? priceA <= priceB\n ? match.source_a\n : match.source_b\n : null;\n\n const title = match.event_a_title || match.event_b_title;\n\n const confKey = getConfidenceTierKey(\n match.confidence_tier,\n match.similarity_score,\n );\n const confTheme = CONFIDENCE_THEME[confKey] ?? CONFIDENCE_THEME.low;\n\n const ctaAccent = tier === \"high\" ? \"orange\" : \"lime\";\n\n return (\n <div\n className=\"group match-card\"\n style={{\n borderRadius: 14,\n border: \"1px solid rgba(39,39,42,0.6)\",\n background: \"rgba(24,24,27,0.4)\",\n overflow: \"hidden\",\n transition: \"all 0.2s\",\n }}\n onMouseEnter={(e) => {\n const el = e.currentTarget as HTMLDivElement;\n const glow = SPREAD_GLOW[tier];\n el.style.borderColor = glow.border;\n el.style.boxShadow = glow.shadow;\n onHover?.(match);\n }}\n onMouseLeave={(e) => {\n const el = e.currentTarget as HTMLDivElement;\n el.style.borderColor = \"rgba(39,39,42,0.6)\";\n el.style.boxShadow = \"none\";\n }}\n >\n <style>{FOCUS_CSS}</style>\n {/* Spread hero band */}\n {spreadPercent != null && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"8px 14px\",\n background: `linear-gradient(90deg, ${theme.bandFrom}, ${theme.bandTo})`,\n borderBottom: \"1px solid rgba(39,39,42,0.3)\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 14,\n height: 14,\n flexShrink: 0,\n color: theme.color,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\" />\n </svg>\n <span\n style={{\n fontSize: 15,\n fontWeight: 700,\n fontVariantNumeric: \"tabular-nums\",\n color: theme.color,\n }}\n >\n {spreadPercent.toFixed(1)}%\n </span>\n <span\n style={{\n fontSize: 10,\n fontWeight: 500,\n color: \"rgba(161,161,170,0.7)\",\n textTransform: \"uppercase\" as const,\n letterSpacing: \"0.06em\",\n }}\n >\n SPREAD\n </span>\n </div>\n <SpreadGauge tier={tier} />\n </div>\n )}\n\n <div style={{ padding: \"14px 14px 12px\" }}>\n {/* Title */}\n <h3\n style={{\n fontSize: 13,\n fontWeight: 600,\n lineHeight: 1.4,\n letterSpacing: \"-0.2px\",\n color: \"#f4f4f5\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n display: \"-webkit-box\",\n WebkitLineClamp: 2,\n WebkitBoxOrient: \"vertical\" as const,\n margin: \"0 0 12px\",\n }}\n >\n {title}\n </h3>\n\n {/* Platform comparison rows */}\n <div\n style={{\n borderRadius: 10,\n border: \"1px solid rgba(39,39,42,0.4)\",\n overflow: \"hidden\",\n }}\n >\n <PlatformRow\n source={match.source_a}\n market={match.market_a}\n isCheaper={cheaperSource === match.source_a}\n onClick={() => onSelect?.(match, match.source_a)}\n href={getMarketHref?.(match, match.source_a)}\n LinkComponent={LinkComponent}\n />\n <div style={{ height: 1, background: \"rgba(39,39,42,0.3)\" }} />\n <PlatformRow\n source={match.source_b}\n market={match.market_b}\n isCheaper={cheaperSource === match.source_b}\n onClick={() => onSelect?.(match, match.source_b)}\n href={getMarketHref?.(match, match.source_b)}\n LinkComponent={LinkComponent}\n />\n </div>\n\n {/* CTA button */}\n {cheaperSource && spreadPercent != null && (\n <div\n style={{\n display: \"flex\",\n justifyContent: \"flex-end\",\n marginTop: 10,\n }}\n >\n <button\n type=\"button\"\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"5px 12px\",\n borderRadius: 8,\n border: `1px solid ${ctaAccent === \"orange\" ? \"rgba(247,104,22,0.2)\" : \"rgba(199,255,46,0.15)\"}`,\n background:\n ctaAccent === \"orange\"\n ? \"rgba(247,104,22,0.08)\"\n : \"rgba(199,255,46,0.06)\",\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n fontSize: 11,\n fontWeight: 500,\n color:\n ctaAccent === \"orange\"\n ? \"rgba(247,104,22,0.9)\"\n : \"rgba(199,255,46,0.85)\",\n }}\n onMouseEnter={(e) => {\n const el = e.currentTarget;\n el.style.background =\n ctaAccent === \"orange\"\n ? \"rgba(247,104,22,0.14)\"\n : \"rgba(199,255,46,0.10)\";\n }}\n onMouseLeave={(e) => {\n const el = e.currentTarget;\n el.style.background =\n ctaAccent === \"orange\"\n ? \"rgba(247,104,22,0.08)\"\n : \"rgba(199,255,46,0.06)\";\n }}\n onClick={() => onSelect?.(match, cheaperSource)}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 12,\n height: 12,\n flexShrink: 0,\n color: ctaAccent === \"orange\" ? \"#f76816\" : \"#c7ff2e\",\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\" />\n </svg>\n {t(\"predict.matches.buyEdge\" as never, {\n platform:\n cheaperSource.charAt(0).toUpperCase() +\n cheaperSource.slice(1),\n spread: spreadPercent.toFixed(1),\n })}\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 10,\n height: 10,\n color:\n ctaAccent === \"orange\"\n ? \"rgba(247,104,22,0.5)\"\n : \"rgba(199,255,46,0.4)\",\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M5 12h14\" />\n <path d=\"m12 5 7 7-7 7\" />\n </svg>\n </button>\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n borderTop: \"1px solid rgba(39,39,42,0.5)\",\n background: \"rgba(39,39,42,0.15)\",\n padding: \"8px 14px\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n fontSize: 10,\n color: \"#71717a\",\n }}\n >\n <span style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 11, height: 11 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 3v16a2 2 0 0 0 2 2h16\" />\n <path d=\"M18 17V9\" />\n <path d=\"M13 17V5\" />\n <path d=\"M8 17v-3\" />\n </svg>\n {formatVolume(match.combined_volume)}\n </span>\n {match.combined_volume_24h != null &&\n match.combined_volume_24h > 0 && (\n <span style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 11, height: 11 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z\" />\n </svg>\n {formatVolume(match.combined_volume_24h)}{\" \"}\n {t(\"predict.matches.vol24h\" as never)}\n </span>\n )}\n </div>\n {/* Confidence tier badge */}\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 4,\n fontSize: 10,\n color: \"#52525b\",\n }}\n >\n <span\n style={{\n width: 6,\n height: 6,\n borderRadius: \"50%\",\n background: confTheme.dot,\n flexShrink: 0,\n }}\n />\n {t(confTheme.label as never)}\n </span>\n </div>\n </div>\n );\n}\n\nfunction PlatformRow({\n source,\n market,\n isCheaper,\n onClick,\n href,\n LinkComponent,\n}: {\n source: ProviderSource | string;\n market: PredictMarket;\n isCheaper: boolean;\n onClick?: () => void;\n href?: string;\n LinkComponent?: LinkComponentType;\n}) {\n const { t } = useTranslation();\n const meta = getSourceMeta(source);\n const platColor = getPlatformColor(source);\n const yesPrice = getYesPrice(market);\n const outcomeName = getOutcomeName(market);\n const volume = market.volume;\n\n const content = (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"10px 12px\",\n cursor: href || onClick ? \"pointer\" : undefined,\n transition: \"background 0.15s\",\n background: isCheaper ? \"rgba(199,255,46,0.03)\" : \"transparent\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLDivElement).style.background = isCheaper\n ? \"rgba(199,255,46,0.06)\"\n : \"rgba(255,255,255,0.02)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLDivElement).style.background = isCheaper\n ? \"rgba(199,255,46,0.03)\"\n : \"transparent\";\n }}\n onClick={onClick}\n >\n {/* Cheaper indicator */}\n {isCheaper ? (\n <span style={{ fontSize: 10, color: \"#c7ff2e\", flexShrink: 0 }}>★</span>\n ) : (\n <span style={{ width: 10, flexShrink: 0 }} />\n )}\n\n {/* Platform icon + name */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 5,\n width: 90,\n flexShrink: 0,\n }}\n >\n {meta.icon}\n <span\n style={{\n fontSize: 10,\n fontWeight: 600,\n letterSpacing: \"0.04em\",\n color: platColor.text,\n textTransform: \"uppercase\" as const,\n }}\n >\n {meta.label}\n </span>\n </div>\n\n {/* Outcome name + volume */}\n <div\n style={{\n flex: 1,\n minWidth: 0,\n display: \"flex\",\n flexDirection: \"column\" as const,\n gap: 1,\n }}\n >\n {outcomeName && (\n <span\n style={{\n fontSize: 10,\n color: \"#71717a\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\" as const,\n }}\n >\n {outcomeName}\n </span>\n )}\n <span style={{ fontSize: 9, color: \"#52525b\" }}>\n {formatVolume(volume)} {t(\"predict.matches.volume\" as never)}\n </span>\n </div>\n\n {/* Price */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"baseline\",\n gap: 3,\n flexShrink: 0,\n }}\n >\n <span\n style={{\n fontSize: 18,\n fontWeight: 700,\n fontVariantNumeric: \"tabular-nums\",\n color: isCheaper ? \"#c7ff2e\" : \"#f4f4f5\",\n }}\n >\n {yesPrice != null ? (yesPrice * 100).toFixed(1) : \"-\"}\n </span>\n <span style={{ fontSize: 9, color: \"#71717a\" }}>\n {t(\"predict.matches.centsYes\" as never)}\n </span>\n </div>\n\n {/* External link icon */}\n <svg\n viewBox=\"0 0 24 24\"\n className=\"opacity-0 group-hover:opacity-100 transition-opacity\"\n style={{\n width: 10,\n height: 10,\n color: \"#52525b\",\n flexShrink: 0,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M7 7h10v10\" />\n <path d=\"M7 17 17 7\" />\n </svg>\n </div>\n );\n\n if (href && LinkComponent) {\n return (\n <LinkComponent href={href} className=\"block\">\n {content}\n </LinkComponent>\n );\n }\n\n return content;\n}\n","import {\n useState,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n forwardRef,\n} from \"react\";\nimport { keepPreviousData } from \"@tanstack/react-query\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type {\n MatchSortField,\n MatchMarketFlat,\n ProviderSource,\n} from \"@liberfi.io/react-predict\";\nimport { useInfiniteMatchMarkets } from \"@liberfi.io/react-predict\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { MatchMarketCard } from \"./match-market-card.ui\";\nimport type { MatchesHeroStats } from \"./matches-hero.ui\";\n\nexport interface MatchesWidgetRef {\n refetch: () => void;\n}\n\nexport interface MatchesWidgetProps {\n sortBy: MatchSortField;\n sortAsc: boolean;\n minVolume?: number;\n onSelect?: (match: MatchMarketFlat, source: ProviderSource) => void;\n onHover?: (match: MatchMarketFlat) => void;\n getMarketHref?: (\n match: MatchMarketFlat,\n source: ProviderSource,\n ) => string | undefined;\n LinkComponent?: LinkComponentType;\n onStatsChange?: (stats: MatchesHeroStats) => void;\n /** @deprecated Use onSelect instead */\n onSelectEntry?: (event: never) => void;\n /** @deprecated Use getMarketHref instead */\n getEventHref?: (event: never) => string;\n}\n\nexport const MatchesWidget = forwardRef<MatchesWidgetRef, MatchesWidgetProps>(\n function MatchesWidget(\n {\n sortBy,\n sortAsc,\n minVolume,\n onSelect,\n onHover,\n getMarketHref,\n LinkComponent,\n onStatsChange,\n },\n ref,\n ) {\n const { t } = useTranslation();\n\n const {\n data,\n hasNextPage,\n fetchNextPage,\n isFetchingNextPage,\n isLoading,\n isPlaceholderData,\n refetch,\n } = useInfiniteMatchMarkets(\n {\n sort_by: sortBy,\n sort_asc: sortAsc,\n min_volume: minVolume,\n status: \"active\",\n limit: 20,\n },\n { placeholderData: keepPreviousData },\n );\n\n const [animKey, setAnimKey] = useState(0);\n const [prevIsPlaceholder, setPrevIsPlaceholder] = useState(false);\n\n if (prevIsPlaceholder && !isPlaceholderData) {\n setPrevIsPlaceholder(false);\n setAnimKey((k) => k + 1);\n } else if (isPlaceholderData && !prevIsPlaceholder) {\n setPrevIsPlaceholder(true);\n }\n\n // staggerBase removed: rendering iterates pages directly so each card's\n // animation delay is stable across page loads (no mass DOM reflow).\n\n useImperativeHandle(\n ref,\n () => ({\n refetch: () => {\n refetch();\n },\n }),\n [refetch],\n );\n\n const allMatches = useMemo(\n () => data?.pages.flatMap((p) => p.items ?? []) ?? [],\n [data],\n );\n\n const total = data?.pages[0]?.total;\n\n const stats = useMemo<MatchesHeroStats>(() => {\n let maxSpread = 0;\n let totalVolume = 0;\n let highSpreadCount = 0;\n\n for (const m of allMatches) {\n const spread = m.spread ?? 0;\n if (spread > maxSpread) maxSpread = spread;\n if (spread >= 0.03) highSpreadCount++;\n if (m.combined_volume != null) {\n totalVolume += m.combined_volume;\n }\n }\n\n return {\n activePairs: total ?? allMatches.length,\n maxSpread,\n highSpreadCount,\n totalVolume,\n };\n }, [allMatches, total]);\n\n useEffect(() => {\n if (stats.activePairs > 0) {\n onStatsChange?.(stats);\n }\n }, [stats, onStatsChange]);\n\n const sentinelRef = useRef<HTMLDivElement>(null);\n\n const handleScrollToTop = useCallback(() => {\n window.scrollTo({ top: 0, behavior: \"smooth\" });\n }, []);\n\n useEffect(() => {\n const el = sentinelRef.current;\n if (!el) return;\n const observer = new IntersectionObserver(\n (entries) => {\n if (\n entries[0]?.isIntersecting &&\n hasNextPage &&\n !isFetchingNextPage\n ) {\n fetchNextPage();\n }\n },\n { rootMargin: \"200px\" },\n );\n observer.observe(el);\n return () => observer.disconnect();\n }, [hasNextPage, isFetchingNextPage, fetchNextPage]);\n\n useEffect(() => {\n if (!hasNextPage) return;\n document.documentElement.style.overscrollBehaviorY = \"none\";\n return () => {\n document.documentElement.style.overscrollBehaviorY = \"\";\n };\n }, [hasNextPage]);\n\n if (isLoading) {\n return <MatchesSkeletonList />;\n }\n\n if (allMatches.length === 0) {\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"80px 0\",\n color: \"rgba(255,255,255,0.35)\",\n }}\n >\n <p style={{ fontSize: 18 }}>{t(\"predict.matches.empty\")}</p>\n </div>\n );\n }\n\n const showEndOfList = !hasNextPage && allMatches.length > 0;\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 16 }}>\n <style>{`\n@media(max-width:1023px){.matches-card-grid{grid-template-columns:1fr!important}}\n@keyframes matchCardEnter{from{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}\n`}</style>\n <div\n className=\"matches-card-grid\"\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(2, 1fr)\",\n gap: 16,\n }}\n >\n {data?.pages.map((page) =>\n page.items?.map((match, itemIndex) => (\n <div\n key={`${animKey}-${match.match_id}-${match.source_a}-${match.market_a?.slug ?? itemIndex}`}\n style={{\n animation: `matchCardEnter 0.45s cubic-bezier(0.34,1.56,0.64,1) ${itemIndex * 35}ms both`,\n }}\n >\n <MatchMarketCard\n match={match}\n onSelect={onSelect}\n onHover={onHover}\n getMarketHref={getMarketHref}\n LinkComponent={LinkComponent}\n />\n </div>\n )),\n )}\n </div>\n\n {/* Infinite scroll sentinel */}\n <div\n ref={sentinelRef}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 8,\n padding: \"16px 0\",\n minHeight: 1,\n }}\n >\n <style>{`@keyframes match-load-spin{to{transform:rotate(360deg)}}`}</style>\n {isFetchingNextPage && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n color: \"#71717a\",\n fontSize: 13,\n }}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ animation: \"match-load-spin 1s linear infinite\" }}\n >\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n {t(\"predict.matches.loadMore\")}\n </div>\n )}\n </div>\n\n {showEndOfList && (\n <MatchesEndOfList onScrollToTop={handleScrollToTop} />\n )}\n </div>\n );\n },\n);\n\nfunction MatchesEndOfList({ onScrollToTop }: { onScrollToTop?: () => void }) {\n const { t } = useTranslation();\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 16,\n padding: \"24px 0\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 16,\n width: \"100%\",\n }}\n >\n <div\n style={{ height: 1, width: 64, background: \"rgba(82,82,91,0.5)\" }}\n />\n <span style={{ fontSize: 12, fontWeight: 500, color: \"#71717a\" }}>\n {t(\"predict.matches.endOfList\" as never)}\n </span>\n <div\n style={{ height: 1, width: 64, background: \"rgba(82,82,91,0.5)\" }}\n />\n </div>\n <button\n type=\"button\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n fontSize: 12,\n fontWeight: 500,\n color: \"#a1a1aa\",\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: 0,\n }}\n onClick={onScrollToTop}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 19V5\" />\n <path d=\"m5 12 7-7 7 7\" />\n </svg>\n <span>{t(\"predict.matches.backToTop\" as never)}</span>\n </button>\n </div>\n );\n}\n\nfunction MatchesSkeletonList() {\n return (\n <>\n <style>{`@keyframes shimmer{0%{background-position:200% 0}100%{background-position:-200% 0}}@media(max-width:1023px){.matches-skeleton-grid{grid-template-columns:1fr!important}}`}</style>\n <div\n className=\"matches-skeleton-grid\"\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(2, 1fr)\",\n gap: 16,\n }}\n >\n {Array.from({ length: 6 }).map((_, i) => (\n <SkeletonCard key={i} index={i} />\n ))}\n </div>\n </>\n );\n}\n\nfunction SkeletonCard({ index }: { index: number }) {\n const delay = index * 150;\n const shimmer: React.CSSProperties = {\n background:\n \"linear-gradient(90deg, rgba(255,255,255,0.03) 25%, rgba(255,255,255,0.06) 50%, rgba(255,255,255,0.03) 75%)\",\n backgroundSize: \"200% 100%\",\n animation: `shimmer 1.8s ease-in-out infinite ${delay}ms`,\n borderRadius: 6,\n };\n\n return (\n <div\n style={{\n borderRadius: 16,\n border: \"1px solid rgba(39,39,42,0.6)\",\n background: \"rgba(24,24,27,0.4)\",\n overflow: \"hidden\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n justifyContent: \"space-between\",\n padding: \"16px 16px 12px\",\n }}\n >\n <div\n style={{\n ...shimmer,\n height: 14,\n width: index % 2 === 0 ? \"75%\" : \"60%\",\n }}\n />\n <div\n style={{\n ...shimmer,\n height: 24,\n width: 64,\n borderRadius: 10,\n flexShrink: 0,\n marginLeft: 12,\n }}\n />\n </div>\n\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"1fr 1fr\",\n gap: 16,\n padding: \"0 16px\",\n }}\n >\n {[0, 1].map((j) => (\n <div\n key={j}\n style={{\n borderRadius: 12,\n border: \"1px solid rgba(255,255,255,0.04)\",\n background: \"rgba(255,255,255,0.02)\",\n padding: 12,\n display: \"flex\",\n flexDirection: \"column\" as const,\n gap: 8,\n }}\n >\n <div style={{ ...shimmer, height: 10, width: 72 }} />\n <div style={{ ...shimmer, height: 10, width: 48 }} />\n <div style={{ ...shimmer, height: 20, width: 56 }} />\n <div style={{ ...shimmer, height: 10, width: 60, marginTop: 4 }} />\n </div>\n ))}\n </div>\n\n <div style={{ padding: \"12px 16px\" }}>\n <div\n style={{\n ...shimmer,\n height: 36,\n borderRadius: 10,\n width: \"100%\",\n }}\n />\n </div>\n\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n borderTop: \"1px solid rgba(39,39,42,0.5)\",\n padding: \"10px 16px\",\n }}\n >\n <div style={{ display: \"flex\", gap: 12 }}>\n <div style={{ ...shimmer, height: 10, width: 40 }} />\n <div style={{ ...shimmer, height: 10, width: 50 }} />\n </div>\n <div style={{ ...shimmer, height: 10, width: 56 }} />\n </div>\n </div>\n );\n}\n","import {\n useState,\n useCallback,\n useRef,\n useEffect,\n startTransition,\n} from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type {\n MatchSortField,\n MatchMarketFlat,\n ProviderSource,\n} from \"@liberfi.io/react-predict\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { MatchesFilterBar } from \"./matches-filter-bar.ui\";\nimport { MatchesHero, type MatchesHeroStats } from \"./matches-hero.ui\";\nimport { MatchesWidget, type MatchesWidgetRef } from \"./matches.widget\";\n\nconst SORT_TITLE_KEY: Record<MatchSortField, string> = {\n spread: \"predict.matches.topOpportunities\",\n volume: \"predict.matches.highestVolume\",\n confidence: \"predict.matches.trendingToday\",\n};\n\nexport interface MatchesPageProps {\n onSelect?: (match: MatchMarketFlat, source: ProviderSource) => void;\n onHover?: (match: MatchMarketFlat) => void;\n getMarketHref?: (\n match: MatchMarketFlat,\n source: ProviderSource,\n ) => string | undefined;\n LinkComponent?: LinkComponentType;\n /** Path to the hero background image (e.g. \"/matches-bg.webp\") */\n bgImageSrc?: string;\n /** @deprecated Use onSelect instead */\n onSelectEntry?: (event: never) => void;\n /** @deprecated Use getMarketHref instead */\n getEventHref?: (event: never) => string;\n}\n\nfunction StatusClock() {\n const [time, setTime] = useState(\"\");\n\n useEffect(() => {\n const fmt = () => {\n const d = new Date();\n return `${String(d.getHours()).padStart(2, \"0\")}:${String(d.getMinutes()).padStart(2, \"0\")}`;\n };\n setTime(fmt());\n const id = setInterval(() => setTime(fmt()), 10_000);\n return () => clearInterval(id);\n }, []);\n\n return <span>{time}</span>;\n}\n\nfunction MatchesStatusBar({ stats }: { stats?: MatchesHeroStats }) {\n const { t } = useTranslation();\n return (\n <>\n <style>{`@media(max-width:768px){.matches-status-bar{display:none!important}}`}</style>\n <div\n className=\"matches-status-bar\"\n style={{\n position: \"fixed\",\n bottom: 0,\n left: 0,\n right: 0,\n height: 28,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"0 12px\",\n background: \"rgba(12,12,13,0.8)\",\n borderTop: \"1px solid rgba(39,39,42,0.6)\",\n fontSize: 11,\n color: \"rgba(255,255,255,0.4)\",\n zIndex: 50,\n backdropFilter: \"blur(12px)\",\n WebkitBackdropFilter: \"blur(12px)\",\n flexShrink: 0,\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 12 }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12, color: \"#00bc7d\" }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 20h.01\" />\n <path d=\"M2 8.82a15 15 0 0 1 20 0\" />\n <path d=\"M5 12.859a10 10 0 0 1 14 0\" />\n <path d=\"M8.5 16.429a5 5 0 0 1 7 0\" />\n </svg>\n <span style={{ color: \"#00bc7d\", fontWeight: 500 }}>\n {t(\"predict.matches.status.live\" as never)}\n </span>\n </div>\n {/* Vertical divider */}\n <div\n style={{ width: 1, height: 14, background: \"rgba(39,39,42,0.8)\" }}\n />\n {stats && (\n <div\n className=\"hidden sm:flex\"\n style={{ alignItems: \"center\", gap: 12 }}\n >\n <span\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n color: \"#71717a\",\n }}\n >\n {/* lucide activity */}\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2\" />\n </svg>\n <span style={{ color: \"#52525b\" }}>\n {t(\"predict.matches.status.markets\" as never)}\n </span>\n <span\n style={{\n color: \"#d4d4d8\",\n fontWeight: 500,\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n {stats.activePairs.toLocaleString()}\n </span>\n </span>\n <span\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n color: \"#71717a\",\n }}\n >\n {/* lucide chart-column */}\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 3v16a2 2 0 0 0 2 2h16\" />\n <path d=\"M18 17V9\" />\n <path d=\"M13 17V5\" />\n <path d=\"M8 17v-3\" />\n </svg>\n <span style={{ color: \"#52525b\" }}>\n {t(\"predict.matches.status.vol24h\" as never)}\n </span>\n <span\n style={{\n color: \"#d4d4d8\",\n fontWeight: 500,\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n {stats.totalVolume >= 1_000_000\n ? `$${(stats.totalVolume / 1_000_000).toFixed(1)}M`\n : stats.totalVolume >= 1_000\n ? `$${Math.round(stats.totalVolume / 1_000)}K`\n : `$${stats.totalVolume}`}\n </span>\n </span>\n </div>\n )}\n </div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n {/* Docs link with lucide-file-text icon */}\n <a\n href=\"#\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"4px 8px\",\n borderRadius: 4,\n color: \"#71717a\",\n textDecoration: \"none\",\n transition: \"color 0.15s, background 0.15s\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLAnchorElement).style.color = \"#d4d4d8\";\n (e.currentTarget as HTMLAnchorElement).style.background =\n \"rgba(39,39,42,0.5)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLAnchorElement).style.color = \"#71717a\";\n (e.currentTarget as HTMLAnchorElement).style.background =\n \"transparent\";\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\" />\n <path d=\"M14 2v4a2 2 0 0 0 2 2h4\" />\n <path d=\"M10 9H8\" />\n <path d=\"M16 13H8\" />\n <path d=\"M16 17H8\" />\n </svg>\n <span className=\"hidden lg:inline\">\n {t(\"predict.matches.status.docs\" as never)}\n </span>\n </a>\n {/* X link with X icon */}\n <a\n href=\"#\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"4px 8px\",\n borderRadius: 4,\n color: \"#71717a\",\n textDecoration: \"none\",\n transition: \"color 0.15s, background 0.15s\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLAnchorElement).style.color = \"#d4d4d8\";\n (e.currentTarget as HTMLAnchorElement).style.background =\n \"rgba(39,39,42,0.5)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLAnchorElement).style.color = \"#71717a\";\n (e.currentTarget as HTMLAnchorElement).style.background =\n \"transparent\";\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"currentColor\"\n >\n <path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\" />\n </svg>\n <span className=\"hidden lg:inline\">X</span>\n </a>\n {/* Divider */}\n <div\n style={{\n width: 1,\n height: 14,\n background: \"rgba(39,39,42,0.8)\",\n margin: \"0 4px\",\n }}\n />\n {/* Watchlist */}\n <button\n type=\"button\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"4px 8px\",\n borderRadius: 4,\n color: \"#71717a\",\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 11,\n transition: \"color 0.15s, background 0.15s\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLButtonElement).style.color = \"#d4d4d8\";\n (e.currentTarget as HTMLButtonElement).style.background =\n \"rgba(39,39,42,0.5)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLButtonElement).style.color = \"#71717a\";\n (e.currentTarget as HTMLButtonElement).style.background =\n \"transparent\";\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\" />\n </svg>\n <span className=\"hidden lg:inline\">\n {t(\"predict.matches.status.watchlist\" as never)}\n </span>\n </button>\n <button\n type=\"button\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"4px 8px\",\n borderRadius: 4,\n color: \"#71717a\",\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 11,\n transition: \"color 0.15s, background 0.15s\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLButtonElement).style.color = \"#d4d4d8\";\n (e.currentTarget as HTMLButtonElement).style.background =\n \"rgba(39,39,42,0.5)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLButtonElement).style.color = \"#71717a\";\n (e.currentTarget as HTMLButtonElement).style.background =\n \"transparent\";\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2.5\" />\n <path d=\"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4\" />\n </svg>\n <span className=\"hidden lg:inline\">\n {t(\"predict.matches.status.portfolio\" as never)}\n </span>\n </button>\n <button\n type=\"button\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"4px 8px\",\n borderRadius: 4,\n color: \"#71717a\",\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 11,\n transition: \"color 0.15s, background 0.15s\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLButtonElement).style.color = \"#d4d4d8\";\n (e.currentTarget as HTMLButtonElement).style.background =\n \"rgba(39,39,42,0.5)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLButtonElement).style.color = \"#71717a\";\n (e.currentTarget as HTMLButtonElement).style.background =\n \"transparent\";\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\" />\n <path d=\"M12 17h.01\" />\n </svg>\n <span className=\"hidden lg:inline\">\n {t(\"predict.matches.status.help\" as never)}\n </span>\n </button>\n {/* Divider */}\n <div\n style={{\n width: 1,\n height: 14,\n background: \"rgba(39,39,42,0.8)\",\n margin: \"0 4px\",\n }}\n />\n {/* Clock */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n color: \"#71717a\",\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polyline points=\"12 6 12 12 16 14\" />\n </svg>\n <StatusClock />\n </div>\n </div>\n </div>\n </>\n );\n}\n\nexport function MatchesPage({\n onSelect,\n onHover,\n getMarketHref,\n LinkComponent,\n bgImageSrc,\n}: MatchesPageProps) {\n const { t } = useTranslation();\n\n const [sortBy, setSortBy] = useState<MatchSortField>(\"spread\");\n const [sortAsc, setSortAsc] = useState(false);\n const [minVolume, setMinVolume] = useState<number | undefined>(5_000);\n const [heroStats, setHeroStats] = useState<MatchesHeroStats | undefined>();\n const widgetRef = useRef<MatchesWidgetRef>(null);\n\n const handleSortChange = useCallback((sort: MatchSortField) => {\n setSortBy(sort);\n }, []);\n\n const handleSortAscChange = useCallback((asc: boolean) => {\n setSortAsc(asc);\n }, []);\n\n const handleStatsChange = useCallback((stats: MatchesHeroStats) => {\n startTransition(() => {\n setHeroStats(stats);\n });\n }, []);\n\n const handleRefresh = useCallback(() => {\n widgetRef.current?.refetch();\n }, []);\n\n return (\n <div\n style={{\n minHeight: \"100vh\",\n position: \"relative\",\n }}\n >\n {/* Entrance animation keyframes + dot grid */}\n <style>{`\n @keyframes matchFadeIn{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}\n .match-fade-in{animation:matchFadeIn .5s ease-out both}\n .match-fade-in-d1{animation:matchFadeIn .5s ease-out .1s both}\n .match-fade-in-d2{animation:matchFadeIn .5s ease-out .2s both}\n `}</style>\n {/* Hero section — relative overflow-hidden with border-b like matchr */}\n <div\n style={{\n position: \"relative\",\n overflow: \"hidden\",\n borderBottom: \"1px solid rgba(39,39,42,0.5)\",\n }}\n >\n {/* Background — single wide image with full-width light arcs */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n pointerEvents: \"none\",\n zIndex: 0,\n overflow: \"hidden\",\n }}\n >\n {bgImageSrc && (\n <img\n src={bgImageSrc}\n alt=\"\"\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n inset: 0,\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n objectPosition: \"center center\",\n opacity: 0.3,\n mixBlendMode: \"lighten\" as const,\n maskImage:\n \"linear-gradient(to bottom, black 50%, transparent 100%)\",\n WebkitMaskImage:\n \"linear-gradient(to bottom, black 50%, transparent 100%)\",\n }}\n />\n )}\n {/* Dot grid texture */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n opacity: 0.025,\n backgroundImage:\n \"radial-gradient(circle at 1px 1px, rgb(255 255 255) 1px, transparent 0)\",\n backgroundSize: \"20px 20px\",\n }}\n />\n </div>\n <style>{`.matches-hero-wrap{padding:40px 16px 32px}@media(min-width:640px){.matches-hero-wrap{padding:48px 24px 40px}}@media(min-width:1024px){.matches-hero-wrap{padding:52px 32px 44px}}`}</style>\n <div\n className=\"match-fade-in matches-hero-wrap\"\n style={{\n position: \"relative\",\n zIndex: 2,\n maxWidth: 1152,\n margin: \"0 auto\",\n }}\n >\n <MatchesHero stats={heroStats} />\n </div>\n </div>\n\n {/* Sticky toolbar — full-width background, inner max-w-6xl */}\n <div\n style={{\n position: \"sticky\",\n top: 0,\n zIndex: 40,\n background: \"rgba(10,10,11,0.8)\",\n backdropFilter: \"blur(24px)\",\n WebkitBackdropFilter: \"blur(24px)\",\n borderBottom: \"1px solid rgba(39,39,42,0.5)\",\n }}\n >\n <style>{`.matches-toolbar-inner{padding:12px 16px}@media(min-width:640px){.matches-toolbar-inner{padding:12px 24px}}@media(min-width:1024px){.matches-toolbar-inner{padding:12px 32px}}`}</style>\n <div\n className=\"matches-toolbar-inner\"\n style={{\n maxWidth: 1152,\n margin: \"0 auto\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 12,\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n minWidth: 0,\n }}\n >\n <div\n className=\"hidden sm:flex\"\n style={{\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 32,\n height: 32,\n borderRadius: 10,\n background:\n \"linear-gradient(to bottom right, rgba(199,255,46,0.15), rgba(23,201,100,0.15))\",\n border: \"1px solid rgba(199,255,46,0.15)\",\n flexShrink: 0,\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 16, height: 16, color: \"#c7ff2e\" }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z\" />\n <path d=\"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12\" />\n <path d=\"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17\" />\n </svg>\n </div>\n <div style={{ minWidth: 0 }}>\n <h2\n style={{\n fontSize: 14,\n fontWeight: 600,\n color: \"#fff\",\n margin: 0,\n letterSpacing: \"-0.28px\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\" as const,\n }}\n >\n {t(SORT_TITLE_KEY[sortBy] as never)}\n </h2>\n {heroStats && heroStats.activePairs > 0 && (\n <p\n className=\"hidden sm:block\"\n style={{ fontSize: 11, color: \"#71717a\", margin: 0 }}\n >\n {t(\"predict.matches.pairsFound\" as never, {\n count: heroStats.activePairs,\n })}\n </p>\n )}\n </div>\n </div>\n <MatchesFilterBar\n sortBy={sortBy}\n onSortChange={handleSortChange}\n sortAsc={sortAsc}\n onSortAscChange={handleSortAscChange}\n minVolume={minVolume}\n onMinVolumeChange={setMinVolume}\n onRefresh={handleRefresh}\n />\n </div>\n </div>\n\n {/* Content — card grid + disclaimer, responsive padding + pb-20 */}\n <style>{`.matches-content-wrap{padding:24px 16px 80px}@media(min-width:640px){.matches-content-wrap{padding:32px 24px 80px}}@media(min-width:1024px){.matches-content-wrap{padding:24px 32px 80px}}`}</style>\n <div\n className=\"match-fade-in-d2 matches-content-wrap\"\n style={{\n position: \"relative\",\n maxWidth: 1152,\n margin: \"0 auto\",\n }}\n >\n {/* Disclaimer — shown above list so infinite scroll doesn't push it out of view */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n marginBottom: 16,\n padding: \"8px 12px\",\n borderRadius: 8,\n border: \"1px solid rgba(39,39,42,0.4)\",\n background: \"rgba(24,24,27,0.25)\",\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 14,\n height: 14,\n color: \"#52525b\",\n flexShrink: 0,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\" />\n </svg>\n <p\n style={{\n fontSize: 11,\n color: \"#52525b\",\n lineHeight: 1.5,\n margin: 0,\n }}\n >\n <span style={{ color: \"#71717a\", fontWeight: 500 }}>\n {t(\"predict.matches.experimentalFeature\" as const)}\n </span>\n {\" — \"}\n {t(\"predict.matches.disclaimer\" as const)}\n </p>\n </div>\n\n <MatchesWidget\n ref={widgetRef}\n sortBy={sortBy}\n sortAsc={sortAsc}\n minVolume={minVolume}\n onSelect={onSelect}\n onHover={onHover}\n getMarketHref={getMarketHref}\n LinkComponent={LinkComponent}\n onStatsChange={handleStatsChange}\n />\n </div>\n <MatchesStatusBar stats={heroStats} />\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type {\n MatchGroup,\n MatchGroupMarket,\n PredictEvent,\n} from \"@liberfi.io/react-predict\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { getSourceMeta } from \"./source-badge.ui\";\n\nexport interface MatchGroupCardProps {\n group: MatchGroup;\n onSelectEntry?: (event: PredictEvent) => void;\n getEventHref?: (event: PredictEvent) => string;\n LinkComponent?: LinkComponentType;\n}\n\nfunction formatVolume(vol: number | null | undefined): string {\n if (vol == null) return \"-\";\n if (vol >= 1_000_000) return `$${(vol / 1_000_000).toFixed(1)}M`;\n if (vol >= 1_000) return `$${Math.round(vol / 1_000)}K`;\n return `$${vol.toFixed(0)}`;\n}\n\ninterface PlatformData {\n source: string;\n outcomeName: string | null;\n yesPrice: number | null;\n volume: number | null;\n event?: PredictEvent;\n}\n\nconst PLATFORM_COLORS: Record<\n string,\n {\n text: string;\n border: string;\n hoverBorder: string;\n bg: string;\n priceColor: string;\n priceActiveColor: string;\n }\n> = {\n polymarket: {\n text: \"#50a2ff\",\n border: \"rgba(43,127,255,0.15)\",\n hoverBorder: \"rgba(43,127,255,0.3)\",\n bg: \"rgba(43,127,255,0.05)\",\n priceColor: \"rgba(244,244,245,1)\",\n priceActiveColor: \"rgba(244,244,245,1)\",\n },\n kalshi: {\n text: \"#00d492\",\n border: \"rgba(0,212,146,0.15)\",\n hoverBorder: \"rgba(0,212,146,0.3)\",\n bg: \"rgba(0,212,146,0.05)\",\n priceColor: \"#00d492\",\n priceActiveColor: \"#00d492\",\n },\n};\n\nconst DEFAULT_PLATFORM_COLORS = {\n text: \"#9ca3af\",\n border: \"rgba(156,163,175,0.15)\",\n hoverBorder: \"rgba(156,163,175,0.3)\",\n bg: \"rgba(156,163,175,0.05)\",\n priceColor: \"rgba(244,244,245,1)\",\n priceActiveColor: \"rgba(244,244,245,1)\",\n};\n\nfunction getPlatformColors(source: string) {\n return PLATFORM_COLORS[source] ?? DEFAULT_PLATFORM_COLORS;\n}\n\nfunction getBestMarketPair(group: MatchGroup): MatchGroupMarket | null {\n if (!group.matched_markets?.length) return null;\n let best: MatchGroupMarket | null = null;\n let bestSpread = -1;\n for (const m of group.matched_markets) {\n const spread = m.spread ?? 0;\n if (spread > bestSpread) {\n bestSpread = spread;\n best = m;\n }\n }\n return best;\n}\n\nfunction extractPlatformData(\n group: MatchGroup,\n pair: MatchGroupMarket | null,\n): [PlatformData, PlatformData] {\n const entryA = group.entries.find(\n (e) => e.source === (pair?.source_a ?? group.entries[0]?.source),\n );\n const entryB = group.entries.find(\n (e) => e.source === (pair?.source_b ?? group.entries[1]?.source),\n );\n\n const getOutcome = (market: MatchGroupMarket[\"market_a\"] | undefined) => {\n if (!market?.outcomes?.[0]) return { name: null, price: null };\n const o = market.outcomes[0];\n return {\n name: o.label || null,\n price: o.best_ask ?? o.price ?? null,\n };\n };\n\n const oA = getOutcome(pair?.market_a);\n const oB = getOutcome(pair?.market_b);\n\n return [\n {\n source: pair?.source_a ?? entryA?.source ?? \"unknown\",\n outcomeName: oA.name,\n yesPrice: oA.price,\n volume: entryA?.event?.volume ?? null,\n event: entryA?.event,\n },\n {\n source: pair?.source_b ?? entryB?.source ?? \"unknown\",\n outcomeName: oB.name,\n yesPrice: oB.price,\n volume: entryB?.event?.volume ?? null,\n event: entryB?.event,\n },\n ];\n}\n\nexport function MatchGroupCard({\n group,\n onSelectEntry,\n getEventHref,\n LinkComponent,\n}: MatchGroupCardProps) {\n const { t } = useTranslation();\n const bestPair = useMemo(() => getBestMarketPair(group), [group]);\n const spreadPercent =\n group.max_spread != null ? group.max_spread * 100 : null;\n\n const [platA, platB] = useMemo(\n () => extractPlatformData(group, bestPair),\n [group, bestPair],\n );\n\n const isHighSpread = spreadPercent != null && spreadPercent >= 3;\n const cheaperIsKalshi =\n platA.yesPrice != null && platB.yesPrice != null\n ? platA.source === \"kalshi\"\n ? platA.yesPrice > platB.yesPrice\n : platB.yesPrice > platA.yesPrice\n : false;\n\n const cheapest =\n platA.yesPrice != null && platB.yesPrice != null\n ? platA.yesPrice <= platB.yesPrice\n ? platA\n : platB\n : null;\n const cheapestMeta = cheapest ? getSourceMeta(cheapest.source) : null;\n\n const ctaAccent = isHighSpread ? \"amber\" : \"violet\";\n\n return (\n <div\n className=\"group\"\n style={{\n borderRadius: 16,\n border: \"1px solid rgba(39,39,42,0.6)\",\n background: \"rgba(24,24,27,0.4)\",\n overflow: \"hidden\",\n transition: \"all 0.2s\",\n position: \"relative\",\n }}\n onMouseEnter={(e) => {\n const el = e.currentTarget as HTMLDivElement;\n el.style.borderColor = \"rgba(63,63,70,0.6)\";\n el.style.boxShadow = \"0 10px 15px -3px rgba(0,0,0,0.2)\";\n }}\n onMouseLeave={(e) => {\n const el = e.currentTarget as HTMLDivElement;\n el.style.borderColor = \"rgba(39,39,42,0.6)\";\n el.style.boxShadow = \"none\";\n }}\n >\n {/* Spread badge — absolute top-3 right-3 */}\n {spreadPercent != null && (\n <span\n style={{\n position: \"absolute\",\n top: 12,\n right: 12,\n zIndex: 10,\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 4,\n borderRadius: 10,\n padding: \"4px 10px\",\n fontSize: 12,\n fontWeight: 600,\n border: `1px solid ${\n isHighSpread\n ? \"rgba(255,185,0,0.3)\"\n : spreadPercent >= 2\n ? \"rgba(166,132,255,0.3)\"\n : \"rgba(156,163,175,0.3)\"\n }`,\n background: isHighSpread\n ? \"rgba(255,185,0,0.15)\"\n : spreadPercent >= 2\n ? \"rgba(166,132,255,0.15)\"\n : \"rgba(156,163,175,0.12)\",\n color: isHighSpread\n ? \"#ffb900\"\n : spreadPercent >= 2\n ? \"#a684ff\"\n : \"#9ca3af\",\n }}\n >\n {/* lucide zap */}\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\" />\n </svg>\n {spreadPercent.toFixed(1)}%\n </span>\n )}\n\n {/* Card body — p-4 */}\n <div style={{ padding: 16 }}>\n {/* Title */}\n <h3\n style={{\n fontSize: 14,\n fontWeight: 600,\n lineHeight: 1.375,\n letterSpacing: \"-0.28px\",\n color: \"#f4f4f5\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n display: \"-webkit-box\",\n WebkitLineClamp: 2,\n WebkitBoxOrient: \"vertical\" as const,\n paddingRight: 80,\n margin: \"0 0 16px\",\n }}\n >\n {group.title}\n </h3>\n\n {/* Platform entries — grid-cols-2 gap-3 */}\n <div\n style={{ display: \"grid\", gridTemplateColumns: \"1fr 1fr\", gap: 12 }}\n >\n <PlatformBlock\n data={platA}\n isCheaper={cheapest === platA}\n onSelect={onSelectEntry}\n getEventHref={getEventHref}\n LinkComponent={LinkComponent}\n />\n <PlatformBlock\n data={platB}\n isCheaper={cheapest === platB}\n onSelect={onSelectEntry}\n getEventHref={getEventHref}\n LinkComponent={LinkComponent}\n />\n </div>\n\n {/* CTA bar — amber (high spread) or violet (low) */}\n {cheapest && cheapestMeta && spreadPercent != null && (\n <div\n style={{\n marginTop: 12,\n padding: \"8px 12px\",\n borderRadius: 10,\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n border: `1px solid ${ctaAccent === \"amber\" ? \"rgba(255,185,0,0.15)\" : \"rgba(166,132,255,0.15)\"}`,\n background:\n ctaAccent === \"amber\"\n ? \"rgba(255,185,0,0.05)\"\n : \"rgba(166,132,255,0.05)\",\n }}\n onClick={() => cheapest.event && onSelectEntry?.(cheapest.event)}\n >\n {/* lucide zap */}\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 14,\n height: 14,\n flexShrink: 0,\n color: ctaAccent === \"amber\" ? \"#ffb900\" : \"#a684ff\",\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\" />\n </svg>\n <span\n style={{\n fontSize: 11,\n fontWeight: 500,\n color:\n ctaAccent === \"amber\"\n ? \"rgba(255,185,0,0.9)\"\n : \"rgba(166,132,255,0.9)\",\n }}\n >\n {t(\"predict.matches.buyEdge\" as never, {\n platform:\n cheapest.source.charAt(0).toUpperCase() +\n cheapest.source.slice(1),\n spread: spreadPercent.toFixed(1),\n })}\n </span>\n {/* lucide arrow-right */}\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 12,\n height: 12,\n marginLeft: \"auto\",\n color:\n ctaAccent === \"amber\"\n ? \"rgba(255,185,0,0.5)\"\n : \"rgba(166,132,255,0.5)\",\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M5 12h14\" />\n <path d=\"m12 5 7 7-7 7\" />\n </svg>\n </div>\n )}\n </div>\n\n {/* Footer meta — px-4 py-2.5 bg-zinc-800/20 border-t */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n borderTop: \"1px solid rgba(39,39,42,0.5)\",\n background: \"rgba(39,39,42,0.2)\",\n padding: \"10px 16px\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n fontSize: 10,\n color: \"#71717a\",\n }}\n >\n <span style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n {/* lucide bar-chart-3 */}\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 3v16a2 2 0 0 0 2 2h16\" />\n <path d=\"M18 17V9\" />\n <path d=\"M13 17V5\" />\n <path d=\"M8 17v-3\" />\n </svg>\n {formatVolume(group.combined_volume)}\n </span>\n {group.combined_volume_24h != null &&\n group.combined_volume_24h > 0 && (\n <span style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n {/* lucide flame */}\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z\" />\n </svg>\n {formatVolume(group.combined_volume_24h)}{\" \"}\n {t(\"predict.matches.vol24h\" as never)}\n </span>\n )}\n </div>\n {group.confidence != null && (\n <span\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n fontSize: 10,\n color: \"#52525b\",\n }}\n >\n {/* lucide activity */}\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2\" />\n </svg>\n {Math.round(group.confidence * 100)}%{\" \"}\n {t(\"predict.matches.match\" as never)}\n </span>\n )}\n </div>\n </div>\n );\n}\n\nfunction PlatformBlock({\n data,\n isCheaper,\n onSelect,\n getEventHref,\n LinkComponent,\n}: {\n data: PlatformData;\n isCheaper: boolean;\n onSelect?: (event: PredictEvent) => void;\n getEventHref?: (event: PredictEvent) => string;\n LinkComponent?: LinkComponentType;\n}) {\n const { t } = useTranslation();\n const meta = getSourceMeta(data.source);\n const colors = getPlatformColors(data.source);\n const href = data.event ? getEventHref?.(data.event) : undefined;\n\n const content = (\n <div\n style={{\n borderRadius: 14,\n border: `1px solid ${colors.border}`,\n background: colors.bg,\n padding: 12,\n cursor: href || onSelect ? \"pointer\" : undefined,\n transition: \"border-color 0.15s\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLDivElement).style.borderColor =\n colors.hoverBorder;\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLDivElement).style.borderColor = colors.border;\n }}\n onClick={() => data.event && onSelect?.(data.event)}\n >\n {/* Platform name row */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n marginBottom: 8,\n }}\n >\n {meta.icon}\n <span\n style={{\n fontSize: 10,\n fontWeight: 600,\n letterSpacing: \"0.05em\",\n color: colors.text,\n textTransform: \"uppercase\" as const,\n }}\n >\n {meta.label}\n </span>\n {/* External link icon — group-hover:opacity-100 */}\n <svg\n viewBox=\"0 0 24 24\"\n className=\"opacity-0 group-hover:opacity-100 transition-opacity\"\n style={{\n width: 10,\n height: 10,\n color: \"#52525b\",\n marginLeft: \"auto\",\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M7 7h10v10\" />\n <path d=\"M7 17 17 7\" />\n </svg>\n </div>\n\n {/* Outcome name — text-[10px] */}\n {data.outcomeName && (\n <div\n style={{\n fontSize: 10,\n color: \"#71717a\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\" as const,\n marginBottom: 8,\n }}\n >\n {data.outcomeName}\n </div>\n )}\n\n {/* Price — text-xl font-bold tabular-nums */}\n <div style={{ display: \"flex\", alignItems: \"baseline\", gap: 6 }}>\n <span\n style={{\n fontSize: 20,\n fontWeight: 700,\n fontVariantNumeric: \"tabular-nums\",\n color: isCheaper ? colors.priceActiveColor : colors.priceColor,\n }}\n >\n {data.yesPrice != null ? (data.yesPrice * 100).toFixed(1) : \"-\"}\n </span>\n <span style={{ fontSize: 10, color: \"#71717a\" }}>\n {t(\"predict.matches.centsYes\" as never)}\n </span>\n </div>\n\n {/* Volume — text-[10px] text-zinc-600 mt-1.5 */}\n <div style={{ fontSize: 10, color: \"#52525b\", marginTop: 6 }}>\n {formatVolume(data.volume)} {t(\"predict.matches.volume\" as never)}\n </div>\n </div>\n );\n\n if (href && LinkComponent) {\n return (\n <LinkComponent href={href} className=\"block\">\n {content}\n </LinkComponent>\n );\n }\n\n return content;\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { MatchGroup } from \"@liberfi.io/react-predict\";\n\nexport interface MatchesStatsBarProps {\n matches: MatchGroup[];\n total?: number;\n}\n\nfunction formatVolume(vol: number): string {\n if (vol >= 1_000_000) return `$${(vol / 1_000_000).toFixed(1)}M`;\n if (vol >= 1_000) return `$${(vol / 1_000).toFixed(1)}K`;\n return `$${vol.toFixed(0)}`;\n}\n\nexport function MatchesStatsBar({ matches, total }: MatchesStatsBarProps) {\n const { t } = useTranslation();\n\n const stats = useMemo(() => {\n let maxSpread = 0;\n let totalVolume = 0;\n const sources = new Set<string>();\n\n for (const group of matches) {\n if (group.max_spread != null && group.max_spread > maxSpread) {\n maxSpread = group.max_spread;\n }\n if (group.combined_volume != null) {\n totalVolume += group.combined_volume;\n }\n for (const entry of group.entries) {\n sources.add(typeof entry.source === \"string\" ? entry.source : \"\");\n }\n }\n\n return {\n count: total ?? matches.length,\n maxSpread,\n totalVolume,\n platformCount: sources.size,\n };\n }, [matches, total]);\n\n return (\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-2 rounded-xl border border-border/60 bg-background/50 px-4 py-3 text-sm\">\n <StatItem\n label={t(\"predict.matches.stats.matchedMarkets\")}\n value={stats.count.toLocaleString()}\n />\n <Separator />\n <StatItem\n label={t(\"predict.matches.stats.totalVolume\")}\n value={formatVolume(stats.totalVolume)}\n />\n <Separator />\n <StatItem\n label={t(\"predict.matches.stats.highestSpread\")}\n value={`${(stats.maxSpread * 100).toFixed(1)}¢`}\n valueClassName=\"text-green-400\"\n />\n <Separator />\n <StatItem\n label={t(\"predict.matches.stats.platforms\")}\n value={String(stats.platformCount)}\n />\n </div>\n );\n}\n\nfunction StatItem({\n label,\n value,\n valueClassName = \"text-slate-200\",\n}: {\n label: string;\n value: string;\n valueClassName?: string;\n}) {\n return (\n <div className=\"flex items-center gap-x-1.5\">\n <span className=\"text-neutral-500\">{label}:</span>\n <span className={`font-semibold ${valueClassName}`}>{value}</span>\n </div>\n );\n}\n\nfunction Separator() {\n return <span className=\"hidden text-neutral-700 sm:inline\">|</span>;\n}\n","import { cn } from \"@liberfi.io/ui\";\n\nexport interface SpreadIndicatorProps {\n spread: number | null | undefined;\n spreadPercent?: number | null;\n arbProfit?: number | null;\n className?: string;\n}\n\nfunction formatCents(value: number): string {\n return `${(value * 100).toFixed(1)}¢`;\n}\n\nfunction getSpreadColor(spread: number): string {\n if (spread >= 0.05) return \"text-green-400\";\n if (spread >= 0.02) return \"text-yellow-400\";\n return \"text-neutral-400\";\n}\n\nexport function SpreadIndicator({\n spread,\n arbProfit,\n className,\n}: SpreadIndicatorProps) {\n if (spread == null) return null;\n\n const hasArb = arbProfit != null && arbProfit > 0;\n\n return (\n <div className={cn(\"flex items-center gap-x-2\", className)}>\n <span className={cn(\"text-sm font-semibold\", getSpreadColor(spread))}>\n {formatCents(spread)}\n </span>\n {hasArb && (\n <span className=\"text-xs text-green-500/80\">\n +{formatCents(arbProfit!)}\n </span>\n )}\n </div>\n );\n}\n","import { useState, useMemo, useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n type PredictTrade,\n type TradeType,\n useInfiniteTrades,\n} from \"@liberfi.io/react-predict\";\nimport { cn, Skeleton, Spinner } from \"@liberfi.io/ui\";\n\nconst PAGE_SIZE = 10;\nconst ROW_HEIGHT = 64;\nconst HEADER_HEIGHT = 40;\nconst PAGINATION_HEIGHT = 48;\n\nexport interface ProfileHistoryProps {\n solanaAddress?: string;\n evmAddress?: string;\n listHeight: number;\n}\n\nexport function ProfileHistory({\n solanaAddress,\n evmAddress,\n listHeight,\n}: ProfileHistoryProps) {\n const { t } = useTranslation();\n const [currentPage, setCurrentPage] = useState(1);\n\n const {\n data: kalshiData,\n isLoading: kalshiLoading,\n fetchNextPage: fetchNextKalshi,\n hasNextPage: hasMoreKalshi,\n isFetchingNextPage: isFetchingKalshi,\n } = useInfiniteTrades({\n source: \"kalshi\",\n wallet: solanaAddress ?? \"\",\n limit: 50,\n });\n\n const {\n data: polyData,\n isLoading: polyLoading,\n fetchNextPage: fetchNextPoly,\n hasNextPage: hasMorePoly,\n isFetchingNextPage: isFetchingPoly,\n } = useInfiniteTrades({\n source: \"polymarket\",\n wallet: evmAddress ?? \"\",\n limit: 50,\n });\n\n const isLoading = kalshiLoading || polyLoading;\n const isFetchingMore = isFetchingKalshi || isFetchingPoly;\n const hasNextPage = hasMoreKalshi || hasMorePoly;\n\n const allTrades = useMemo(() => {\n const all: PredictTrade[] = [];\n if (kalshiData?.pages)\n all.push(...kalshiData.pages.flatMap((p) => p.items));\n if (polyData?.pages) all.push(...polyData.pages.flatMap((p) => p.items));\n all.sort((a, b) => (b.timestamp ?? 0) - (a.timestamp ?? 0));\n return all;\n }, [kalshiData, polyData]);\n\n const totalPages = Math.max(\n 1,\n Math.ceil(allTrades.length / PAGE_SIZE) + (hasNextPage ? 1 : 0),\n );\n const pageStart = (currentPage - 1) * PAGE_SIZE;\n const pageTrades = allTrades.slice(pageStart, pageStart + PAGE_SIZE);\n\n const handlePrev = useCallback(() => {\n setCurrentPage((p) => Math.max(1, p - 1));\n }, []);\n\n const handleNext = useCallback(async () => {\n const nextPageStart = currentPage * PAGE_SIZE;\n if (nextPageStart >= allTrades.length && hasNextPage) {\n if (hasMoreKalshi) await fetchNextKalshi();\n if (hasMorePoly) await fetchNextPoly();\n }\n setCurrentPage((p) => p + 1);\n }, [\n currentPage,\n allTrades.length,\n hasNextPage,\n hasMoreKalshi,\n hasMorePoly,\n fetchNextKalshi,\n fetchNextPoly,\n ]);\n\n const canGoPrev = currentPage > 1;\n const canGoNext = currentPage * PAGE_SIZE < allTrades.length || hasNextPage;\n\n if (isLoading) return <TabSkeleton height={listHeight} />;\n\n if (allTrades.length === 0 && !hasNextPage) {\n return (\n <EmptyState\n message={t(\"predict.profile.noHistory\")}\n height={listHeight}\n />\n );\n }\n\n const contentHeight = listHeight - HEADER_HEIGHT - PAGINATION_HEIGHT;\n\n return (\n <div className=\"flex flex-col\" style={{ height: listHeight }}>\n {/* Desktop header */}\n <div\n className=\"hidden lg:flex items-center text-neutral text-xs font-normal shrink-0 border-b border-border/50\"\n style={{ height: HEADER_HEIGHT }}\n >\n <div className=\"flex-[3] min-w-0 pr-2\">\n {t(\"predict.profile.event\")}\n </div>\n <div className=\"flex-1 pr-2\">{t(\"predict.profile.action\")}</div>\n <div className=\"flex-1 pr-2\">{t(\"predict.profile.status\")}</div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.profile.price\")}\n </div>\n <div className=\"flex-[1.5] pr-2 text-right\">\n {t(\"predict.profile.depositWithdraw\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">{t(\"predict.profile.pnl\")}</div>\n <div className=\"flex-1 pr-2 text-right\">{t(\"predict.profile.fee\")}</div>\n <div className=\"w-10 shrink-0\" />\n </div>\n\n {/* Desktop rows */}\n <div\n className=\"hidden lg:block overflow-y-auto\"\n style={{ height: contentHeight }}\n >\n {pageTrades.map((trade, i) => (\n <HistoryRowStatic\n key={trade.id ?? `${pageStart + i}`}\n trade={trade}\n />\n ))}\n {isFetchingMore && (\n <div className=\"flex justify-center items-center py-4\">\n <Spinner size=\"sm\" />\n </div>\n )}\n </div>\n\n {/* Desktop pagination */}\n <div\n className=\"hidden lg:flex items-center justify-center gap-2 shrink-0\"\n style={{ height: PAGINATION_HEIGHT }}\n >\n <button\n type=\"button\"\n disabled={!canGoPrev}\n onClick={handlePrev}\n className={cn(\n \"text-sm transition-colors cursor-pointer flex items-center gap-1\",\n canGoPrev\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n ← {t(\"predict.profile.previous\")}\n </button>\n\n {Array.from({ length: Math.min(totalPages, 5) }, (_, i) => {\n const page = i + 1;\n return (\n <button\n key={page}\n type=\"button\"\n onClick={() => setCurrentPage(page)}\n className={cn(\n \"w-8 h-8 rounded text-sm transition-colors cursor-pointer\",\n page === currentPage\n ? \"bg-foreground/10 text-foreground font-medium\"\n : \"text-neutral hover:text-foreground\",\n )}\n >\n {page}\n </button>\n );\n })}\n\n <button\n type=\"button\"\n disabled={!canGoNext}\n onClick={handleNext}\n className={cn(\n \"text-sm transition-colors cursor-pointer flex items-center gap-1\",\n canGoNext\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n {t(\"predict.profile.next\")} →\n </button>\n </div>\n\n {/* Mobile cards */}\n <div\n className=\"lg:hidden flex flex-col gap-2 overflow-y-auto py-2\"\n style={{ height: listHeight - PAGINATION_HEIGHT }}\n >\n {pageTrades.map((trade, i) => (\n <HistoryCard key={trade.id ?? `m-${pageStart + i}`} trade={trade} />\n ))}\n </div>\n\n {/* Mobile pagination */}\n <div\n className=\"lg:hidden flex items-center justify-center gap-3 shrink-0\"\n style={{ height: PAGINATION_HEIGHT }}\n >\n <button\n type=\"button\"\n disabled={!canGoPrev}\n onClick={handlePrev}\n className={cn(\n \"text-sm cursor-pointer\",\n canGoPrev\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n ←\n </button>\n <span className=\"text-sm text-foreground tabular-nums\">\n {currentPage}\n </span>\n <button\n type=\"button\"\n disabled={!canGoNext}\n onClick={handleNext}\n className={cn(\n \"text-sm cursor-pointer\",\n canGoNext\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n →\n </button>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Desktop row (non-virtualized, paginated)\n// ---------------------------------------------------------------------------\n\nfunction HistoryRowStatic({ trade }: { trade: PredictTrade }) {\n const { t } = useTranslation();\n const isBuy = trade.side?.toUpperCase() === \"BUY\";\n const price = trade.price ?? 0;\n const usdSize = trade.usd_size ?? 0;\n const statusLabel = mapTradeStatus(trade.type, t);\n\n const isDeposit = isBuy;\n const depositSign = isDeposit ? \"+\" : \"-\";\n const depositColor = isDeposit ? \"text-success\" : \"text-foreground\";\n\n const eventTitle = trade.event?.title ?? trade.market?.question ?? \"—\";\n const eventImage = trade.event?.image_url;\n const outcomeLabel = trade.outcome ?? \"\";\n const timeStr = formatTimestamp(trade.timestamp);\n\n const txUrl = getTxUrl(trade);\n\n const pnlValue = extractPnl(trade);\n const feeValue = extractFee(trade);\n\n return (\n <div\n className=\"flex items-center border-b border-border/50 hover:bg-content2/40 transition-colors text-sm\"\n style={{ height: ROW_HEIGHT }}\n >\n {/* Event */}\n <div className=\"flex-[3] min-w-0 pr-2\">\n <div className=\"flex items-center gap-2.5 min-w-0\">\n {eventImage && (\n <img\n src={eventImage}\n alt=\"\"\n className=\"w-8 h-8 rounded-full object-cover shrink-0\"\n />\n )}\n <div className=\"flex flex-col gap-y-0.5 min-w-0\">\n <span className=\"text-foreground truncate font-medium text-sm\">\n {eventTitle}\n </span>\n <span className=\"text-[11px] text-neutral\">\n {outcomeLabel && <span className=\"mr-1\">{outcomeLabel}</span>}\n <span>{timeStr}</span>\n </span>\n </div>\n </div>\n </div>\n\n {/* Action */}\n <div className=\"flex-1 pr-2\">\n <span\n className={cn(\n \"text-sm font-medium\",\n isBuy ? \"text-success\" : \"text-danger\",\n )}\n >\n {isBuy ? t(\"predict.profile.buy\") : t(\"predict.profile.sell\")}\n </span>\n </div>\n\n {/* Status */}\n <div className=\"flex-1 pr-2 text-sm text-foreground\">{statusLabel}</div>\n\n {/* Price */}\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {formatCents(price)}\n </div>\n\n {/* Deposit / Withdraw */}\n <div className={cn(\"flex-[1.5] pr-2 text-right font-mono\", depositColor)}>\n {usdSize > 0 ? (\n <>\n {depositSign}${usdSize.toFixed(2)}\n </>\n ) : (\n \"—\"\n )}\n </div>\n\n {/* PNL */}\n <div\n className={cn(\n \"flex-1 pr-2 text-right font-mono\",\n pnlValue !== null\n ? pnlValue >= 0\n ? \"text-success\"\n : \"text-danger\"\n : \"text-neutral\",\n )}\n >\n {pnlValue !== null\n ? `${pnlValue >= 0 ? \"+\" : \"-\"}$${Math.abs(pnlValue).toFixed(2)}`\n : \"—\"}\n </div>\n\n {/* Fee */}\n <div className=\"flex-1 pr-2 text-right font-mono text-neutral\">\n {feeValue !== null ? `$${feeValue.toFixed(2)}` : \"—\"}\n </div>\n\n {/* Tx link */}\n <div className=\"w-10 shrink-0 text-right\">\n {txUrl && (\n <a\n href={txUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-neutral hover:text-foreground transition-colors\"\n aria-label=\"View transaction\"\n >\n <ExternalLinkIcon />\n </a>\n )}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Mobile card\n// ---------------------------------------------------------------------------\n\nfunction HistoryCard({ trade }: { trade: PredictTrade }) {\n const { t } = useTranslation();\n const isBuy = trade.side?.toUpperCase() === \"BUY\";\n const price = trade.price ?? 0;\n const usdSize = trade.usd_size ?? 0;\n const statusLabel = mapTradeStatus(trade.type, t);\n const eventTitle = trade.event?.title ?? trade.market?.question ?? \"—\";\n const timeStr = formatTimestamp(trade.timestamp);\n const txUrl = getTxUrl(trade);\n\n return (\n <div className=\"rounded-lg border border-border bg-content1 p-3 flex flex-col gap-2\">\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex items-center gap-2 min-w-0\">\n {trade.event?.image_url && (\n <img\n src={trade.event.image_url}\n alt=\"\"\n className=\"w-6 h-6 rounded-full object-cover shrink-0\"\n />\n )}\n <span className=\"text-sm font-medium text-foreground line-clamp-2\">\n {eventTitle}\n </span>\n </div>\n <span className=\"text-[11px] text-neutral whitespace-nowrap\">\n {timeStr}\n </span>\n </div>\n <div className=\"flex items-center gap-4 text-xs flex-wrap\">\n <div className=\"flex flex-col\">\n <span className=\"text-neutral\">{t(\"predict.profile.action\")}</span>\n <span\n className={cn(\n \"font-medium\",\n isBuy ? \"text-success\" : \"text-danger\",\n )}\n >\n {isBuy ? t(\"predict.profile.buy\") : t(\"predict.profile.sell\")}\n </span>\n </div>\n <div className=\"flex flex-col\">\n <span className=\"text-neutral\">{t(\"predict.profile.status\")}</span>\n <span className=\"text-foreground\">{statusLabel}</span>\n </div>\n <div className=\"flex flex-col\">\n <span className=\"text-neutral\">{t(\"predict.profile.price\")}</span>\n <span className=\"font-mono text-foreground\">\n {formatCents(price)}\n </span>\n </div>\n <div className=\"flex flex-col\">\n <span className=\"text-neutral\">\n {t(\"predict.profile.depositWithdraw\")}\n </span>\n <span className=\"font-mono text-foreground\">\n {usdSize > 0 ? `$${usdSize.toFixed(2)}` : \"—\"}\n </span>\n </div>\n {txUrl && (\n <a\n href={txUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"ml-auto text-neutral hover:text-foreground transition-colors\"\n >\n <ExternalLinkIcon />\n </a>\n )}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Shared\n// ---------------------------------------------------------------------------\n\nfunction mapTradeStatus(type: TradeType, t: (key: string) => string): string {\n switch (type) {\n case \"TRADE\":\n return t(\"predict.profile.filled\");\n case \"REDEEM\":\n return t(\"predict.profile.claimed\");\n case \"SPLIT\":\n case \"MERGE\":\n case \"CONVERSION\":\n return t(\"predict.profile.created\");\n default:\n return type;\n }\n}\n\nfunction getTxUrl(trade: PredictTrade): string | undefined {\n if (!trade.tx_hash) return undefined;\n if (trade.source === \"polymarket\") {\n return `https://polygonscan.com/tx/${trade.tx_hash}`;\n }\n return `https://solscan.io/tx/${trade.tx_hash}`;\n}\n\nfunction extractPnl(trade: PredictTrade): number | null {\n const meta = trade.provider_meta;\n if (meta) {\n const pnl =\n meta[\"pnl\"] ??\n meta[\"profit\"] ??\n meta[\"realized_pnl\"] ??\n meta[\"dflow.pnl\"];\n if (typeof pnl === \"number\") return pnl;\n if (typeof pnl === \"string\" && pnl !== \"\") {\n const parsed = parseFloat(pnl);\n if (!Number.isNaN(parsed)) return parsed;\n }\n }\n if (trade.type === \"REDEEM\" && trade.usd_size != null) {\n return trade.usd_size;\n }\n return null;\n}\n\nfunction extractFee(trade: PredictTrade): number | null {\n const meta = trade.provider_meta;\n if (meta) {\n const fee =\n meta[\"fee\"] ?? meta[\"fees\"] ?? meta[\"trading_fee\"] ?? meta[\"dflow.fee\"];\n if (typeof fee === \"number\") return fee;\n if (typeof fee === \"string\" && fee !== \"\") {\n const parsed = parseFloat(fee);\n if (!Number.isNaN(parsed)) return parsed;\n }\n }\n return null;\n}\n\nfunction ExternalLinkIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n <polyline points=\"15 3 21 3 21 9\" />\n <line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\" />\n </svg>\n );\n}\n\nfunction EmptyState({ message, height }: { message: string; height: number }) {\n return (\n <div\n className=\"flex items-center justify-center text-sm text-neutral\"\n style={{ height }}\n >\n {message}\n </div>\n );\n}\n\nfunction TabSkeleton({ height }: { height: number }) {\n return (\n <div\n className=\"flex flex-col gap-y-2 py-3 animate-pulse\"\n style={{ height }}\n >\n {Array.from({ length: 6 }).map((_, i) => (\n <Skeleton key={i} className=\"h-12 w-full rounded-md\" />\n ))}\n </div>\n );\n}\n\nfunction formatCents(price: number): string {\n const cents = price * 100;\n if (cents < 1 && cents > 0) return \"< 1¢\";\n return `${cents.toFixed(cents % 1 === 0 ? 0 : 1)}¢`;\n}\n\nfunction formatTimestamp(unixSeconds: number): string {\n const date = new Date(unixSeconds * 1000);\n const hours = date.getHours().toString().padStart(2, \"0\");\n const mins = date.getMinutes().toString().padStart(2, \"0\");\n const day = date.getDate().toString().padStart(2, \"0\");\n const month = (date.getMonth() + 1).toString().padStart(2, \"0\");\n const year = date.getFullYear();\n const tz = date.getTimezoneOffset();\n const tzSign = tz <= 0 ? \"+\" : \"-\";\n const tzHours = String(Math.abs(Math.floor(tz / 60))).padStart(2, \"0\");\n return `${hours}:${mins} ${day}/${month}/${year} (${tzSign}${tzHours})`;\n}\n","import { useState, useMemo, useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n type PredictOrder,\n useInfiniteOrders,\n useCancelOrder,\n} from \"@liberfi.io/react-predict\";\nimport { cn, Skeleton, Spinner } from \"@liberfi.io/ui\";\n\nconst PAGE_SIZE = 10;\nconst ROW_HEIGHT = 64;\nconst HEADER_HEIGHT = 40;\nconst PAGINATION_HEIGHT = 48;\n\nexport interface ProfileOrdersProps {\n solanaAddress?: string;\n evmAddress?: string;\n listHeight: number;\n}\n\nexport function ProfileOrders({\n solanaAddress,\n evmAddress,\n listHeight,\n}: ProfileOrdersProps) {\n const { t } = useTranslation();\n const cancelMutation = useCancelOrder();\n const [currentPage, setCurrentPage] = useState(1);\n\n const {\n data: kalshiData,\n isLoading: kalshiLoading,\n fetchNextPage: fetchNextKalshi,\n hasNextPage: hasMoreKalshi,\n isFetchingNextPage: isFetchingKalshi,\n } = useInfiniteOrders({\n source: \"kalshi\",\n wallet_address: solanaAddress ?? \"\",\n });\n\n const {\n data: polyData,\n isLoading: polyLoading,\n fetchNextPage: fetchNextPoly,\n hasNextPage: hasMorePoly,\n isFetchingNextPage: isFetchingPoly,\n } = useInfiniteOrders({\n source: \"polymarket\",\n wallet_address: evmAddress ?? \"\",\n });\n\n const isLoading = kalshiLoading || polyLoading;\n const isFetchingMore = isFetchingKalshi || isFetchingPoly;\n const hasNextPage = hasMoreKalshi || hasMorePoly;\n\n const orders = useMemo(() => {\n const all: PredictOrder[] = [];\n const openStatuses = new Set([\"live\", \"open\", \"submitted\", \"pending\"]);\n if (kalshiData?.pages) {\n all.push(\n ...kalshiData.pages\n .flatMap((p) => p.items)\n .filter((o) => openStatuses.has(o.status)),\n );\n }\n if (polyData?.pages) {\n all.push(\n ...polyData.pages\n .flatMap((p) => p.items)\n .filter((o) => openStatuses.has(o.status)),\n );\n }\n return all;\n }, [kalshiData, polyData]);\n\n const handleCancel = useCallback(\n (order: PredictOrder) => {\n cancelMutation.mutate({ source: order.source, id: order.id });\n },\n [cancelMutation],\n );\n\n const totalPages = Math.max(\n 1,\n Math.ceil(orders.length / PAGE_SIZE) + (hasNextPage ? 1 : 0),\n );\n const pageStart = (currentPage - 1) * PAGE_SIZE;\n const pageOrders = orders.slice(pageStart, pageStart + PAGE_SIZE);\n\n const handlePrev = useCallback(() => {\n setCurrentPage((p) => Math.max(1, p - 1));\n }, []);\n\n const handleNext = useCallback(async () => {\n const nextPageStart = currentPage * PAGE_SIZE;\n if (nextPageStart >= orders.length && hasNextPage) {\n if (hasMoreKalshi) await fetchNextKalshi();\n if (hasMorePoly) await fetchNextPoly();\n }\n setCurrentPage((p) => p + 1);\n }, [\n currentPage,\n orders.length,\n hasNextPage,\n hasMoreKalshi,\n hasMorePoly,\n fetchNextKalshi,\n fetchNextPoly,\n ]);\n\n const canGoPrev = currentPage > 1;\n const canGoNext = currentPage * PAGE_SIZE < orders.length || hasNextPage;\n\n if (isLoading) return <TabSkeleton height={listHeight} />;\n\n if (orders.length === 0 && !hasNextPage) {\n return (\n <EmptyState message={t(\"predict.profile.noOrders\")} height={listHeight} />\n );\n }\n\n const contentHeight = listHeight - HEADER_HEIGHT - PAGINATION_HEIGHT;\n\n return (\n <div className=\"flex flex-col\" style={{ height: listHeight }}>\n {/* Desktop header */}\n <div\n className=\"hidden lg:flex items-center text-neutral text-xs font-normal shrink-0 border-b border-border/50\"\n style={{ height: HEADER_HEIGHT }}\n >\n <div className=\"flex-[3] min-w-0 pr-2\">\n {t(\"predict.profile.event\")}\n </div>\n <div className=\"flex-1 pr-2\">{t(\"predict.profile.action\")}</div>\n <div className=\"flex-1 pr-2\">{t(\"predict.profile.type\")}</div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.profile.fillPrice\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.profile.cost\")}\n </div>\n </div>\n\n {/* Desktop rows */}\n <div\n className=\"hidden lg:block overflow-y-auto\"\n style={{ height: contentHeight }}\n >\n {pageOrders.map((order) => (\n <OrderRowStatic\n key={order.id}\n order={order}\n onCancel={handleCancel}\n />\n ))}\n {isFetchingMore && (\n <div className=\"flex justify-center items-center py-4\">\n <Spinner size=\"sm\" />\n </div>\n )}\n </div>\n\n {/* Desktop pagination */}\n <Pagination\n className=\"hidden lg:flex\"\n currentPage={currentPage}\n totalPages={totalPages}\n canGoPrev={canGoPrev}\n canGoNext={canGoNext}\n onPrev={handlePrev}\n onNext={handleNext}\n onPage={setCurrentPage}\n t={t}\n />\n\n {/* Mobile cards */}\n <div\n className=\"lg:hidden flex flex-col gap-2 overflow-y-auto py-2\"\n style={{ height: listHeight - PAGINATION_HEIGHT }}\n >\n {pageOrders.map((order) => (\n <OrderCard key={order.id} order={order} onCancel={handleCancel} />\n ))}\n </div>\n\n {/* Mobile pagination */}\n <Pagination\n className=\"lg:hidden\"\n currentPage={currentPage}\n totalPages={totalPages}\n canGoPrev={canGoPrev}\n canGoNext={canGoNext}\n onPrev={handlePrev}\n onNext={handleNext}\n onPage={setCurrentPage}\n t={t}\n compact\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Desktop row (non-virtualized, paginated)\n// ---------------------------------------------------------------------------\n\nfunction OrderRowStatic({\n order,\n onCancel,\n}: {\n order: PredictOrder;\n onCancel: (order: PredictOrder) => void;\n}) {\n const { t } = useTranslation();\n const isBuy = order.side === \"BUY\";\n const price = order.price ? parseFloat(order.price) : 0;\n const cost = order.in_amount\n ? parseFloat(order.in_amount)\n : price * parseFloat(order.original_size ?? \"0\");\n\n return (\n <div\n className=\"flex items-center border-b border-border/50 hover:bg-content2/40 transition-colors text-sm\"\n style={{ height: ROW_HEIGHT }}\n >\n {/* Event */}\n <div className=\"flex-[3] min-w-0 pr-2\">\n <div className=\"flex flex-col gap-y-0.5 min-w-0\">\n <span className=\"text-foreground truncate font-medium\">\n {order.outcome ?? order.market_id ?? \"—\"}\n </span>\n </div>\n </div>\n\n {/* Action */}\n <div className=\"flex-1 pr-2\">\n <span\n className={cn(\n \"text-sm font-medium\",\n isBuy ? \"text-success\" : \"text-danger\",\n )}\n >\n {isBuy ? t(\"predict.profile.buy\") : t(\"predict.profile.sell\")}\n </span>\n </div>\n\n {/* Type */}\n <div className=\"flex-1 pr-2 text-neutral capitalize text-sm\">\n {order.order_type ?? \"limit\"}\n </div>\n\n {/* Fill Price */}\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {price > 0 ? formatCents(price) : \"—\"}\n </div>\n\n {/* Cost */}\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {cost > 0 ? `$${cost.toFixed(2)}` : \"—\"}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Mobile card\n// ---------------------------------------------------------------------------\n\nfunction OrderCard({\n order,\n onCancel,\n}: {\n order: PredictOrder;\n onCancel: (order: PredictOrder) => void;\n}) {\n const { t } = useTranslation();\n const isBuy = order.side === \"BUY\";\n const price = order.price ? parseFloat(order.price) : 0;\n\n return (\n <div className=\"rounded-lg border border-border bg-content1 p-3 flex flex-col gap-2\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <span\n className={cn(\n \"text-xs font-medium px-1.5 py-0.5 rounded\",\n isBuy ? \"bg-success/10 text-success\" : \"bg-danger/10 text-danger\",\n )}\n >\n {order.side}\n </span>\n <span className=\"text-sm text-foreground capitalize\">\n {order.outcome ?? \"—\"}\n </span>\n </div>\n <span className=\"text-xs text-neutral capitalize\">\n {order.order_type ?? \"limit\"}\n </span>\n </div>\n <div className=\"flex items-center gap-4 text-xs\">\n <div className=\"flex flex-col\">\n <span className=\"text-neutral\">{t(\"predict.profile.fillPrice\")}</span>\n <span className=\"font-mono text-foreground\">\n {price > 0 ? formatCents(price) : \"—\"}\n </span>\n </div>\n <div className=\"flex-1\" />\n <button\n type=\"button\"\n onClick={() => onCancel(order)}\n className=\"text-xs text-danger hover:text-danger/80 cursor-pointer border border-border rounded px-2 py-1\"\n >\n {t(\"predict.orders.cancel\")}\n </button>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Shared\n// ---------------------------------------------------------------------------\n\nfunction Pagination({\n className,\n currentPage,\n totalPages,\n canGoPrev,\n canGoNext,\n onPrev,\n onNext,\n onPage,\n t,\n compact,\n}: {\n className?: string;\n currentPage: number;\n totalPages: number;\n canGoPrev: boolean;\n canGoNext: boolean;\n onPrev: () => void;\n onNext: () => void;\n onPage: (page: number) => void;\n t: (key: string) => string;\n compact?: boolean;\n}) {\n if (compact) {\n return (\n <div\n className={cn(\n \"flex items-center justify-center gap-3 shrink-0\",\n className,\n )}\n style={{ height: PAGINATION_HEIGHT }}\n >\n <button\n type=\"button\"\n disabled={!canGoPrev}\n onClick={onPrev}\n className={cn(\n \"text-sm cursor-pointer\",\n canGoPrev\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n ←\n </button>\n <span className=\"text-sm text-foreground tabular-nums\">\n {currentPage}\n </span>\n <button\n type=\"button\"\n disabled={!canGoNext}\n onClick={onNext}\n className={cn(\n \"text-sm cursor-pointer\",\n canGoNext\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n →\n </button>\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n \"flex items-center justify-center gap-2 shrink-0\",\n className,\n )}\n style={{ height: PAGINATION_HEIGHT }}\n >\n <button\n type=\"button\"\n disabled={!canGoPrev}\n onClick={onPrev}\n className={cn(\n \"text-sm transition-colors cursor-pointer flex items-center gap-1\",\n canGoPrev\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n ← {t(\"predict.profile.previous\")}\n </button>\n {Array.from({ length: Math.min(totalPages, 5) }, (_, i) => {\n const page = i + 1;\n return (\n <button\n key={page}\n type=\"button\"\n onClick={() => onPage(page)}\n className={cn(\n \"w-8 h-8 rounded text-sm transition-colors cursor-pointer\",\n page === currentPage\n ? \"bg-foreground/10 text-foreground font-medium\"\n : \"text-neutral hover:text-foreground\",\n )}\n >\n {page}\n </button>\n );\n })}\n <button\n type=\"button\"\n disabled={!canGoNext}\n onClick={onNext}\n className={cn(\n \"text-sm transition-colors cursor-pointer flex items-center gap-1\",\n canGoNext\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n {t(\"predict.profile.next\")} →\n </button>\n </div>\n );\n}\n\nfunction EmptyState({ message, height }: { message: string; height: number }) {\n return (\n <div\n className=\"flex items-center justify-center text-sm text-neutral\"\n style={{ height }}\n >\n {message}\n </div>\n );\n}\n\nfunction TabSkeleton({ height }: { height: number }) {\n return (\n <div\n className=\"flex flex-col gap-y-2 py-3 animate-pulse\"\n style={{ height }}\n >\n {Array.from({ length: 6 }).map((_, i) => (\n <Skeleton key={i} className=\"h-12 w-full rounded-md\" />\n ))}\n </div>\n );\n}\n\nfunction formatCents(price: number): string {\n const cents = price * 100;\n if (cents < 1 && cents > 0) return \"< 1¢\";\n return `${cents.toFixed(cents % 1 === 0 ? 0 : 1)}¢`;\n}\n","import { useState, useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent, PredictPosition } from \"@liberfi.io/react-predict\";\nimport { cn, Skeleton } from \"@liberfi.io/ui\";\n\nconst PAGE_SIZE = 10;\nconst ROW_HEIGHT = 64;\nconst HEADER_HEIGHT = 40;\nconst PAGINATION_HEIGHT = 48;\n\nexport interface ProfilePositionsProps {\n positions: PredictPosition[];\n isLoading: boolean;\n listHeight: number;\n onClosePosition?: (position: PredictPosition) => void;\n onEventClick?: (event: PredictEvent) => void;\n}\n\nexport function ProfilePositions({\n positions,\n isLoading,\n listHeight,\n onClosePosition,\n onEventClick,\n}: ProfilePositionsProps) {\n const { t } = useTranslation();\n const [currentPage, setCurrentPage] = useState(1);\n\n const handleCloseAll = useCallback(() => {\n for (const pos of positions) {\n onClosePosition?.(pos);\n }\n }, [positions, onClosePosition]);\n\n if (isLoading) return <TabSkeleton height={listHeight} />;\n\n if (positions.length === 0) {\n return (\n <EmptyState\n message={t(\"predict.profile.noPositions\")}\n height={listHeight}\n />\n );\n }\n\n const totalPages = Math.max(1, Math.ceil(positions.length / PAGE_SIZE));\n const pageStart = (currentPage - 1) * PAGE_SIZE;\n const pagePositions = positions.slice(pageStart, pageStart + PAGE_SIZE);\n const canGoPrev = currentPage > 1;\n const canGoNext = currentPage < totalPages;\n const contentHeight = listHeight - HEADER_HEIGHT - PAGINATION_HEIGHT;\n\n return (\n <div className=\"flex flex-col\" style={{ height: listHeight }}>\n {/* Desktop header */}\n <div\n className=\"hidden lg:flex items-center text-neutral text-xs font-normal shrink-0 border-b border-border/50\"\n style={{ height: HEADER_HEIGHT }}\n >\n <div className=\"flex-[3] min-w-0 pr-2\">\n {t(\"predict.profile.event\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.profile.totalSize\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.profile.value\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.profile.avgPrice\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.profile.markPrice\")}\n </div>\n <div className=\"flex-[1.5] pr-2 text-right\">\n <span>{t(\"predict.profile.pnl\")}</span>\n <span className=\"text-[10px] ml-1 opacity-60\">\n ({t(\"predict.profile.pnlExcludeFees\")})\n </span>\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.profile.payoutIfRight\")}\n </div>\n <div className=\"flex-[1.5] pr-2 text-right\">\n {t(\"predict.profile.estSettlement\")}\n </div>\n <div className=\"w-20 shrink-0 text-right\">\n {onClosePosition && positions.length > 0 && (\n <button\n type=\"button\"\n onClick={handleCloseAll}\n className=\"text-xs text-primary hover:text-primary/80 cursor-pointer transition-colors\"\n >\n {t(\"predict.profile.closeAll\")}\n </button>\n )}\n </div>\n </div>\n\n {/* Desktop rows */}\n <div\n className=\"hidden lg:block overflow-y-auto\"\n style={{ height: contentHeight }}\n >\n {pagePositions.map((pos, i) => (\n <PositionRowStatic\n key={`${pos.source}-${pos.market?.slug ?? pageStart + i}`}\n position={pos}\n onClosePosition={onClosePosition}\n onEventClick={onEventClick}\n />\n ))}\n </div>\n\n {/* Desktop pagination */}\n <div\n className=\"hidden lg:flex items-center justify-center gap-2 shrink-0\"\n style={{ height: PAGINATION_HEIGHT }}\n >\n <button\n type=\"button\"\n disabled={!canGoPrev}\n onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}\n className={cn(\n \"text-sm transition-colors cursor-pointer flex items-center gap-1\",\n canGoPrev\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n ← {t(\"predict.profile.previous\")}\n </button>\n {Array.from({ length: Math.min(totalPages, 5) }, (_, i) => {\n const page = i + 1;\n return (\n <button\n key={page}\n type=\"button\"\n onClick={() => setCurrentPage(page)}\n className={cn(\n \"w-8 h-8 rounded text-sm transition-colors cursor-pointer\",\n page === currentPage\n ? \"bg-foreground/10 text-foreground font-medium\"\n : \"text-neutral hover:text-foreground\",\n )}\n >\n {page}\n </button>\n );\n })}\n <button\n type=\"button\"\n disabled={!canGoNext}\n onClick={() => setCurrentPage((p) => p + 1)}\n className={cn(\n \"text-sm transition-colors cursor-pointer flex items-center gap-1\",\n canGoNext\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n {t(\"predict.profile.next\")} →\n </button>\n </div>\n\n {/* Mobile cards */}\n <div\n className=\"lg:hidden flex flex-col gap-2 overflow-y-auto py-2\"\n style={{ height: listHeight - PAGINATION_HEIGHT }}\n >\n {pagePositions.map((pos, i) => (\n <PositionCard\n key={`${pos.source}-${pos.market?.slug ?? `m-${pageStart + i}`}`}\n position={pos}\n onClose={onClosePosition}\n onEventClick={onEventClick}\n />\n ))}\n </div>\n\n {/* Mobile pagination */}\n <div\n className=\"lg:hidden flex items-center justify-center gap-3 shrink-0\"\n style={{ height: PAGINATION_HEIGHT }}\n >\n <button\n type=\"button\"\n disabled={!canGoPrev}\n onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}\n className={cn(\n \"text-sm cursor-pointer\",\n canGoPrev\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n ←\n </button>\n <span className=\"text-sm text-foreground tabular-nums\">\n {currentPage}\n </span>\n <button\n type=\"button\"\n disabled={!canGoNext}\n onClick={() => setCurrentPage((p) => p + 1)}\n className={cn(\n \"text-sm cursor-pointer\",\n canGoNext\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n →\n </button>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Desktop row (non-virtualized, paginated)\n// ---------------------------------------------------------------------------\n\nfunction PositionRowStatic({\n position: pos,\n onClosePosition,\n onEventClick,\n}: {\n position: PredictPosition;\n onClosePosition?: (position: PredictPosition) => void;\n onEventClick?: (event: PredictEvent) => void;\n}) {\n const { t } = useTranslation();\n\n const pnl = pos.pnl ?? 0;\n const pnlPercent = pos.pnl_percent ?? 0;\n const avgPrice = pos.avg_price ?? 0;\n const currentPrice = pos.current_price ?? 0;\n const value = pos.current_value ?? pos.size * currentPrice;\n const payoutIfRight = pos.size;\n\n const pnlColor =\n pnl > 0 ? \"text-success\" : pnl < 0 ? \"text-danger\" : \"text-foreground\";\n const pnlSign = pnl > 0 ? \"+\" : \"\";\n\n const eventTitle = pos.event?.title ?? pos.market?.question ?? \"—\";\n const eventImage = pos.event?.image_url;\n const outcomeSide = pos.side;\n const outcomeLabel = pos.market?.outcomes?.[0]?.label ?? \"\";\n\n const settlementStr = pos.market?.end_at\n ? formatSettlementTime(pos.market.end_at)\n : \"—\";\n\n return (\n <div\n className=\"flex items-center border-b border-border/50 hover:bg-content2/40 transition-colors text-sm\"\n style={{ height: ROW_HEIGHT }}\n >\n {/* Event cell */}\n <div className=\"flex-[3] min-w-0 pr-2\">\n <button\n type=\"button\"\n className=\"flex items-center gap-2.5 min-w-0 cursor-pointer text-left\"\n onClick={() => pos.event && onEventClick?.(pos.event)}\n >\n {eventImage && (\n <img\n src={eventImage}\n alt=\"\"\n className=\"w-8 h-8 rounded-full object-cover shrink-0\"\n />\n )}\n <div className=\"flex flex-col gap-y-0.5 min-w-0\">\n <span className=\"text-foreground truncate font-medium text-sm\">\n {eventTitle}\n </span>\n <span className=\"text-[11px] text-neutral\">\n <span\n className={cn(\n \"font-medium\",\n outcomeSide.toLowerCase() === \"yes\"\n ? \"text-success\"\n : \"text-danger\",\n )}\n >\n {outcomeSide}\n </span>\n {outcomeLabel && (\n <>\n <span className=\"mx-1\">·</span>\n <span>{outcomeLabel}</span>\n </>\n )}\n </span>\n </div>\n </button>\n </div>\n\n {/* Total Size */}\n <div className=\"flex-1 pr-2 text-right\">\n <div className=\"flex flex-col items-end\">\n <span className=\"font-mono text-foreground\">${value.toFixed(2)}</span>\n <span className=\"text-[10px] text-neutral\">\n {t(\"predict.profile.contracts\", { count: pos.size })}\n </span>\n </div>\n </div>\n\n {/* Value */}\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n ${(pos.size * avgPrice).toFixed(2)}\n </div>\n\n {/* Avg Price */}\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {formatCents(avgPrice)}\n </div>\n\n {/* Mark Price */}\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {formatCents(currentPrice)}\n </div>\n\n {/* PNL */}\n <div className={cn(\"flex-[1.5] pr-2 text-right font-mono\", pnlColor)}>\n <span>\n {pnlSign}${Math.abs(pnl).toFixed(2)}\n </span>\n <span className=\"text-[10px] ml-0.5 opacity-70\">\n ({pnlSign}\n {pnlPercent.toFixed(2)}%)\n </span>\n </div>\n\n {/* Payout if right */}\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n ${payoutIfRight.toFixed(2)}\n </div>\n\n {/* Est. Settlement */}\n <div className=\"flex-[1.5] pr-2 text-right text-neutral whitespace-nowrap text-xs\">\n {settlementStr}\n </div>\n\n {/* Close */}\n <div className=\"w-20 shrink-0 text-right\">\n {onClosePosition && (\n <button\n type=\"button\"\n onClick={() => onClosePosition(pos)}\n className=\"inline-flex items-center gap-1 text-xs text-neutral hover:text-foreground cursor-pointer transition-colors\"\n >\n <span className=\"text-danger\">✕</span>\n {t(\"predict.profile.close\")}\n </button>\n )}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Mobile card\n// ---------------------------------------------------------------------------\n\nfunction PositionCard({\n position: pos,\n onClose,\n onEventClick,\n}: {\n position: PredictPosition;\n onClose?: (pos: PredictPosition) => void;\n onEventClick?: (event: PredictEvent) => void;\n}) {\n const { t } = useTranslation();\n const pnl = pos.pnl ?? 0;\n const pnlPercent = pos.pnl_percent ?? 0;\n const currentPrice = pos.current_price ?? 0;\n const pnlColor =\n pnl > 0 ? \"text-success\" : pnl < 0 ? \"text-danger\" : \"text-foreground\";\n const pnlSign = pnl > 0 ? \"+\" : \"\";\n const eventTitle = pos.event?.title ?? pos.market?.question ?? \"—\";\n\n return (\n <div className=\"rounded-lg border border-border bg-content1 p-3 flex flex-col gap-2\">\n <button\n type=\"button\"\n className=\"flex items-start justify-between gap-2 text-left cursor-pointer\"\n onClick={() => pos.event && onEventClick?.(pos.event)}\n >\n <div className=\"flex items-center gap-2 min-w-0\">\n {pos.event?.image_url && (\n <img\n src={pos.event.image_url}\n alt=\"\"\n className=\"w-7 h-7 rounded-full object-cover shrink-0\"\n />\n )}\n <span className=\"text-sm font-medium text-foreground line-clamp-2\">\n {eventTitle}\n </span>\n </div>\n <span\n className={cn(\n \"shrink-0 text-xs font-medium px-1.5 py-0.5 rounded\",\n pos.side.toLowerCase() === \"yes\"\n ? \"bg-success/10 text-success\"\n : \"bg-danger/10 text-danger\",\n )}\n >\n {pos.side}\n </span>\n </button>\n <div className=\"flex items-center gap-4 text-xs flex-wrap\">\n <MobileStat\n label={t(\"predict.profile.totalSize\")}\n value={`${pos.size}`}\n />\n <MobileStat\n label={t(\"predict.profile.markPrice\")}\n value={formatCents(currentPrice)}\n />\n <MobileStat\n label={t(\"predict.profile.pnl\")}\n value={`${pnlSign}$${Math.abs(pnl).toFixed(2)} (${pnlSign}${pnlPercent.toFixed(1)}%)`}\n className={pnlColor}\n />\n <MobileStat\n label={t(\"predict.profile.payoutIfRight\")}\n value={`$${pos.size.toFixed(2)}`}\n />\n </div>\n {onClose && (\n <div className=\"flex justify-end\">\n <button\n type=\"button\"\n onClick={() => onClose(pos)}\n className=\"text-xs text-danger hover:text-danger/80 cursor-pointer transition-colors border border-border rounded px-2 py-1\"\n >\n {t(\"predict.profile.close\")}\n </button>\n </div>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Shared\n// ---------------------------------------------------------------------------\n\nfunction MobileStat({\n label,\n value,\n className,\n}: {\n label: string;\n value: string;\n className?: string;\n}) {\n return (\n <div className=\"flex flex-col\">\n <span className=\"text-neutral\">{label}</span>\n <span className={cn(\"font-mono text-foreground\", className)}>\n {value}\n </span>\n </div>\n );\n}\n\nfunction EmptyState({ message, height }: { message: string; height: number }) {\n return (\n <div\n className=\"flex items-center justify-center text-sm text-neutral\"\n style={{ height }}\n >\n {message}\n </div>\n );\n}\n\nfunction TabSkeleton({ height }: { height: number }) {\n return (\n <div\n className=\"flex flex-col gap-y-2 py-3 animate-pulse\"\n style={{ height }}\n >\n {Array.from({ length: 6 }).map((_, i) => (\n <Skeleton key={i} className=\"h-12 w-full rounded-md\" />\n ))}\n </div>\n );\n}\n\nfunction formatCents(price: number): string {\n const cents = price * 100;\n if (cents < 1 && cents > 0) return \"< 1¢\";\n return `${cents.toFixed(cents % 1 === 0 ? 0 : 1)}¢`;\n}\n\nfunction formatSettlementTime(isoString: string): string {\n try {\n const date = new Date(isoString);\n const hours = date.getHours().toString().padStart(2, \"0\");\n const mins = date.getMinutes().toString().padStart(2, \"0\");\n const day = date.getDate().toString().padStart(2, \"0\");\n const month = (date.getMonth() + 1).toString().padStart(2, \"0\");\n const year = date.getFullYear();\n const tz = date.getTimezoneOffset();\n const tzSign = tz <= 0 ? \"+\" : \"-\";\n const tzHours = String(Math.abs(Math.floor(tz / 60))).padStart(2, \"0\");\n return `${hours}:${mins} ${day}/${month}/${year} (${tzSign}${tzHours})`;\n } catch {\n return \"—\";\n }\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictPosition, PredictTrade } from \"@liberfi.io/react-predict\";\nimport { cn, Skeleton } from \"@liberfi.io/ui\";\n\nexport interface ProfileStatsProps {\n positions: PredictPosition[];\n trades: PredictTrade[];\n isLoading: boolean;\n}\n\nexport function ProfileStats({\n positions,\n trades,\n isLoading,\n}: ProfileStatsProps) {\n const { t } = useTranslation();\n\n const stats = useMemo(() => {\n let realizedPnl = 0;\n let positionsValue = 0;\n for (const p of positions) {\n realizedPnl += p.realized_pnl ?? 0;\n positionsValue += p.current_value ?? p.size * (p.current_price ?? 0);\n }\n\n let volume = 0;\n let wins = 0;\n let settled = 0;\n for (const tr of trades) {\n volume += tr.usd_size ?? 0;\n if (tr.type === \"REDEEM\") {\n settled++;\n if ((tr.usd_size ?? 0) > 0) wins++;\n }\n }\n\n const winRateStr = settled > 0 ? `${wins} / ${settled}` : \"0 / 0\";\n\n return { realizedPnl, positionsValue, volume, winRateStr };\n }, [positions, trades]);\n\n const pnlColor =\n stats.realizedPnl > 0\n ? \"text-success\"\n : stats.realizedPnl < 0\n ? \"text-danger\"\n : \"text-foreground\";\n const pnlSign = stats.realizedPnl > 0 ? \"+\" : \"\";\n\n return (\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 py-8\">\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-xl text-neutral\">\n {t(\"predict.profile.realizedPnl\")}\n </span>\n {isLoading ? (\n <Skeleton className=\"h-14 w-48 rounded-md\" />\n ) : (\n <span className={cn(\"text-5xl font-bold tabular-nums\", pnlColor)}>\n {pnlSign}${Math.abs(stats.realizedPnl).toFixed(2)}\n </span>\n )}\n </div>\n\n <div className=\"flex items-end gap-8 sm:gap-10\">\n <StatCard\n label={t(\"predict.profile.winRate\")}\n value={stats.winRateStr}\n isLoading={isLoading}\n />\n <StatCard\n label={t(\"predict.profile.positions\")}\n value={`$${stats.positionsValue.toFixed(2)}`}\n isLoading={isLoading}\n />\n <StatCard\n label={t(\"predict.profile.volume\")}\n value={`$${stats.volume.toFixed(2)}`}\n isLoading={isLoading}\n />\n </div>\n </div>\n );\n}\n\nfunction StatCard({\n label,\n value,\n isLoading,\n}: {\n label: string;\n value: string;\n isLoading: boolean;\n}) {\n return (\n <div className=\"flex flex-col items-end gap-0.5\">\n <span className=\"text-sm text-neutral whitespace-nowrap\">{label}</span>\n {isLoading ? (\n <Skeleton className=\"h-6 w-14 rounded-md\" />\n ) : (\n <span className=\"text-base font-semibold tabular-nums text-foreground\">\n {value}\n </span>\n )}\n </div>\n );\n}\n","import { useState, useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n type PredictEvent,\n type PredictPosition,\n usePositions,\n useInfiniteTrades,\n} from \"@liberfi.io/react-predict\";\nimport { cn } from \"@liberfi.io/ui\";\nimport { ProfileHistory } from \"./profile-history.ui\";\nimport { ProfileOrders } from \"./profile-orders.ui\";\nimport { ProfilePositions } from \"./profile-positions.ui\";\nimport { ProfileStats } from \"./profile-stats.ui\";\n\ntype ProfileTab = \"positions\" | \"orders\" | \"history\";\n\nconst LIST_HEIGHT = 600;\n\nexport interface ProfilePageProps {\n /** Solana wallet address (for Kalshi/DFlow positions). */\n solanaAddress?: string;\n /** EVM wallet address (for Polymarket positions). */\n evmAddress?: string;\n /** Called when user clicks Close on a position. */\n onClosePosition?: (position: PredictPosition) => void;\n /** Called when user clicks an event name. */\n onEventClick?: (event: PredictEvent) => void;\n}\n\nexport function ProfilePage({\n solanaAddress,\n evmAddress,\n onClosePosition,\n onEventClick,\n}: ProfilePageProps) {\n const { t } = useTranslation();\n const [activeTab, setActiveTab] = useState<ProfileTab>(\"positions\");\n\n const hasWallet = Boolean(solanaAddress || evmAddress);\n\n // Positions data (used by stats + positions tab)\n const { data: kalshiPositions, isLoading: kalshiPosLoading } = usePositions({\n source: \"kalshi\",\n user: solanaAddress ?? \"\",\n });\n const { data: polyPositions, isLoading: polyPosLoading } = usePositions({\n source: \"polymarket\",\n user: evmAddress ?? \"\",\n });\n\n const allPositions = useMemo(() => {\n const all: PredictPosition[] = [];\n if (kalshiPositions?.positions) all.push(...kalshiPositions.positions);\n if (polyPositions?.positions) all.push(...polyPositions.positions);\n return all;\n }, [kalshiPositions, polyPositions]);\n\n const positionsLoading = kalshiPosLoading || polyPosLoading;\n\n // Trades data (used by stats — fetch first page for stats aggregation)\n const { data: kalshiTrades, isLoading: kalshiTradesLoading } =\n useInfiniteTrades({\n source: \"kalshi\",\n wallet: solanaAddress ?? \"\",\n limit: 100,\n });\n const { data: polyTrades, isLoading: polyTradesLoading } = useInfiniteTrades({\n source: \"polymarket\",\n wallet: evmAddress ?? \"\",\n limit: 100,\n });\n\n const allTrades = useMemo(() => {\n const all = [\n ...(kalshiTrades?.pages?.flatMap((p) => p.items) ?? []),\n ...(polyTrades?.pages?.flatMap((p) => p.items) ?? []),\n ];\n return all;\n }, [kalshiTrades, polyTrades]);\n\n const statsLoading =\n positionsLoading || kalshiTradesLoading || polyTradesLoading;\n\n const positionsCount = allPositions.length;\n const positionsTabLabel =\n positionsCount > 0\n ? `${t(\"predict.profile.positionsTab\")} (${positionsCount})`\n : t(\"predict.profile.positionsTab\");\n\n const tabs: { key: ProfileTab; label: string }[] = [\n { key: \"positions\", label: positionsTabLabel },\n { key: \"orders\", label: t(\"predict.profile.openOrdersTab\") },\n { key: \"history\", label: t(\"predict.profile.historyTab\") },\n ];\n\n if (!hasWallet) {\n return (\n <div className=\"flex items-center justify-center text-sm text-neutral py-24 px-4\">\n {t(\"predict.profile.connectWallet\")}\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col max-w-[1280px] mx-auto w-full px-4 max-sm:px-2\">\n {/* Stats header */}\n <ProfileStats\n positions={allPositions}\n trades={allTrades}\n isLoading={statsLoading}\n />\n\n {/* Tab navigation */}\n <div className=\"flex items-center gap-1 border-b border-border\">\n {tabs.map((tab) => (\n <button\n key={tab.key}\n type=\"button\"\n onClick={() => setActiveTab(tab.key)}\n className={cn(\n \"px-3 py-3 text-base font-normal transition-colors cursor-pointer whitespace-nowrap\",\n activeTab === tab.key\n ? \"text-foreground border-b-2 border-foreground\"\n : \"text-neutral hover:text-foreground\",\n )}\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* Tab content */}\n <div className=\"py-2\">\n {activeTab === \"positions\" && (\n <ProfilePositions\n positions={allPositions}\n isLoading={positionsLoading}\n listHeight={LIST_HEIGHT}\n onClosePosition={onClosePosition}\n onEventClick={onEventClick}\n />\n )}\n {activeTab === \"orders\" && (\n <ProfileOrders\n solanaAddress={solanaAddress}\n evmAddress={evmAddress}\n listHeight={LIST_HEIGHT}\n />\n )}\n {activeTab === \"history\" && (\n <ProfileHistory\n solanaAddress={solanaAddress}\n evmAddress={evmAddress}\n listHeight={LIST_HEIGHT}\n />\n )}\n </div>\n </div>\n );\n}\n","import { useCallback, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { StyledModal, ModalContent } from \"@liberfi.io/ui\";\n\nexport interface SetupModalProps {\n isOpen: boolean;\n onClose: () => void;\n evmAddress: string;\n safeDeployed: boolean;\n tokenApproved: boolean;\n onDeployAndApprove: () => Promise<void>;\n}\n\ntype StepStatus = \"pending\" | \"running\" | \"done\";\n\nexport function SetupModal({\n isOpen,\n onClose,\n safeDeployed,\n tokenApproved,\n onDeployAndApprove,\n}: SetupModalProps) {\n const { t } = useTranslation();\n\n const [setupRunning, setSetupRunning] = useState(false);\n const [setupError, setSetupError] = useState<string | null>(null);\n const [optimisticDone, setOptimisticDone] = useState(false);\n\n const effectiveSafeDeployed = safeDeployed || optimisticDone;\n const effectiveTokenApproved = tokenApproved || optimisticDone;\n\n const step1Status: StepStatus = effectiveSafeDeployed\n ? \"done\"\n : setupRunning\n ? \"running\"\n : \"pending\";\n const step2Status: StepStatus = effectiveTokenApproved\n ? \"done\"\n : effectiveSafeDeployed && setupRunning\n ? \"running\"\n : \"pending\";\n\n const allDone = effectiveSafeDeployed && effectiveTokenApproved;\n\n const handleSetup = useCallback(async () => {\n setSetupError(null);\n setOptimisticDone(false);\n setSetupRunning(true);\n try {\n await onDeployAndApprove();\n setOptimisticDone(true);\n } catch (err) {\n setSetupError(err instanceof Error ? err.message : String(err));\n } finally {\n setSetupRunning(false);\n }\n }, [onDeployAndApprove]);\n\n const steps: {\n key: string;\n label: string;\n desc: string;\n status: StepStatus;\n }[] = [\n {\n key: \"step1\",\n label: t(\"predict.setup.step1\"),\n desc: t(\"predict.setup.step1Desc\" as never),\n status: step1Status,\n },\n {\n key: \"step2\",\n label: t(\"predict.setup.step2\"),\n desc: t(\"predict.setup.step2Desc\" as never),\n status: step2Status,\n },\n ];\n\n const handleAction = () => {\n if (allDone) {\n onClose();\n } else {\n handleSetup();\n }\n };\n\n const actionLabel = allDone\n ? t(\"predict.setup.done\")\n : t(\"predict.setup.setupButton\");\n\n return (\n <StyledModal\n isOpen={isOpen}\n onOpenChange={(open) => {\n if (!open) onClose();\n }}\n size=\"md\"\n classNames={{\n base: \"!bg-[#18181b] !rounded-[14px] !border !border-[rgba(39,39,42,1)] !shadow-[0_25px_50px_-12px_rgba(0,0,0,0.5)]\",\n body: \"!p-0\",\n }}\n >\n <ModalContent>\n <div>\n {/* Header */}\n <div className=\"flex items-center justify-between px-5 pt-5 pb-4\">\n <h3 className=\"text-base font-semibold text-white\">\n {t(\"predict.setup.modalTitle\")}\n </h3>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"p-1 rounded-[10px] hover:bg-[rgba(39,39,42,0.5)] text-zinc-400 hover:text-white transition-colors cursor-pointer focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n >\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n\n {/* Body */}\n <div className=\"px-5 pb-5 space-y-4\">\n <p className=\"text-[13px] text-zinc-400 text-left\">\n {t(\"predict.setup.modalDescription\")}\n </p>\n\n {/* Steps */}\n <div className=\"space-y-2.5\">\n {steps.map((step, idx) => (\n <div\n key={step.key}\n className=\"flex gap-3 rounded-[10px] border border-zinc-700/50 bg-zinc-800/50 px-3 py-3\"\n >\n <StepIndicator index={idx + 1} status={step.status} />\n <div className=\"flex-1 min-w-0 pt-0.5\">\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm font-medium text-zinc-200\">\n {step.label}\n </p>\n <span\n className={`text-[11px] leading-none ${\n step.status === \"done\"\n ? \"text-[#c7ff2e]\"\n : step.status === \"running\"\n ? \"text-[#c7ff2e]/70\"\n : \"text-zinc-500\"\n }`}\n >\n {step.status === \"done\"\n ? t(\"predict.setup.stepComplete\")\n : step.status === \"running\"\n ? t(\"predict.setup.stepRunning\")\n : t(\"predict.setup.stepPending\")}\n </span>\n </div>\n <p className=\"text-xs text-zinc-500 mt-1\">{step.desc}</p>\n </div>\n </div>\n ))}\n </div>\n\n {setupError && (\n <div className=\"rounded-[10px] bg-red-500/10 border border-red-500/20 px-3 py-2\">\n <p className=\"text-xs text-red-400\">{setupError}</p>\n </div>\n )}\n\n {/* Action button */}\n <button\n type=\"button\"\n onClick={handleAction}\n disabled={setupRunning}\n className={\n allDone\n ? \"w-full py-3 rounded-[10px] bg-[#c7ff2e] text-zinc-900 text-sm font-semibold hover:bg-[#c7ff2e]/90 transition-colors cursor-pointer focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n : \"w-full py-3 rounded-[10px] bg-[#c7ff2e] text-zinc-900 text-sm font-semibold hover:bg-[#c7ff2e]/90 transition-colors cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n }\n >\n {setupRunning ? (\n <span className=\"inline-flex items-center gap-2\">\n <svg\n className=\"animate-spin h-4 w-4\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n className=\"opacity-25\"\n />\n <path\n d=\"M4 12a8 8 0 018-8\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n className=\"opacity-75\"\n />\n </svg>\n {t(\"predict.setup.stepRunning\")}\n </span>\n ) : (\n actionLabel\n )}\n </button>\n\n {/* Cancel */}\n {!allDone && (\n <button\n type=\"button\"\n onClick={onClose}\n className=\"w-full py-2.5 rounded-[10px] text-sm text-zinc-400 hover:text-white hover:bg-[rgba(39,39,42,0.5)] transition-colors cursor-pointer focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n >\n {t(\"common.cancel\")}\n </button>\n )}\n </div>\n </div>\n </ModalContent>\n </StyledModal>\n );\n}\n\nfunction StepIndicator({\n index,\n status,\n}: {\n index: number;\n status: StepStatus;\n}) {\n if (status === \"done\") {\n return (\n <span className=\"flex h-8 w-8 items-center justify-center rounded-full bg-[#c7ff2e]/15 shrink-0\">\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"text-[#c7ff2e]\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n </span>\n );\n }\n if (status === \"running\") {\n return (\n <span className=\"flex h-8 w-8 items-center justify-center rounded-full bg-[#c7ff2e]/10 shrink-0\">\n <svg\n className=\"animate-spin h-4 w-4 text-[#c7ff2e]\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n className=\"opacity-25\"\n />\n <path\n d=\"M4 12a8 8 0 018-8\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n className=\"opacity-75\"\n />\n </svg>\n </span>\n );\n }\n return (\n <span className=\"flex h-8 w-8 items-center justify-center rounded-full bg-zinc-700/50 text-xs font-bold text-zinc-400 shrink-0\">\n {index}\n </span>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/version.ts","../src/components/categories/categories.script.ts","../src/components/categories/categories.ui.tsx","../src/components/categories/categories.widget.tsx","../src/utils/predict-market-adapter.ts","../src/consts/index.ts","../src/providers/PredictWalletProvider.tsx","../src/components/trade-form/trade-form.script.ts","../src/components/kyc-modal/kyc-modal.ui.tsx","../src/components/trade-form/trade-form.ui.tsx","../src/components/trade-form/trade-form.widget.tsx","../src/components/trade-form/trade-form.modal.tsx","../src/components/events/events-filter.ui.tsx","../src/components/events/events-hero.ui.tsx","../src/components/events/events-toolbar.ui.tsx","../src/components/events/events.script.ts","../src/components/events/events.skeleton.tsx","../src/components/events/event-item.ui.tsx","../src/components/events/events.ui.tsx","../src/components/events/events.widget.tsx","../src/components/events/events.page.tsx","../src/components/event-detail/event-detail-activity.ui.tsx","../src/components/event-detail/event-detail-skeleton.tsx","../src/components/event-detail/event-market-depth-chart.ui.tsx","../src/components/event-detail/event-market-detail.widget.tsx","../src/components/event-detail/event-price-chart.ui.tsx","../src/components/event-detail/event-detail.ui.tsx","../src/components/event-detail/event-detail.widget.tsx","../src/components/matches/source-badge.ui.tsx","../src/components/event-detail/event-similar-events.ui.tsx","../src/components/event-detail/event-detail.page.tsx","../src/components/event-detail/event-detail.scripts.ts","../src/components/search/search-history.script.ts","../src/components/search/search-history.ui.tsx","../src/components/search/search-history.widget.tsx","../src/components/search/search-input.ui.tsx","../src/components/search/search-result-item.ui.tsx","../src/components/search/search-result-list.script.ts","../src/components/search/search-result-list.widget.tsx","../src/components/search/search.script.ts","../src/components/search/search.widget.tsx","../src/components/search/search.modal.tsx","../src/components/search/search-events-button.tsx","../src/components/matches/matches-filter-bar.ui.tsx","../src/components/matches/matches-hero.ui.tsx","../src/components/matches/match-market-card.ui.tsx","../src/components/matches/matches.widget.tsx","../src/components/matches/matches.page.tsx","../src/components/matches/match-group-card.ui.tsx","../src/components/matches/matches-stats-bar.ui.tsx","../src/components/matches/spread-indicator.ui.tsx","../src/components/profile/profile-history.ui.tsx","../src/components/profile/profile-orders.ui.tsx","../src/components/profile/profile-positions.ui.tsx","../src/components/profile/profile-stats.ui.tsx","../src/components/profile/profile.page.tsx","../src/components/setup-modal/setup-modal.ui.tsx"],"names":["version_default","RAW_TAGS_BY_CATEGORIES","CATEGORY_ORDER","STATIC_CATEGORIES","orderIndex","cat","idx","label","rawTags","t","a","b","CategoriesUI","categories","selectedCategory","selectedTag","activeTags","onCategorySelect","onTagSelect","trailing","pulsingTab","className","useTranslation","handleSelectAll","useCallback","trendingLabel","jsxs","cn","jsx","Tab","TabSeparator","Chip","tag","isSelected","onPress","badge","showPulse","icon","CategoriesSkeleton","count","_","i","Skeleton","toUICategories","items","c","toUITags","CategoriesWidget","onSelect","selectedCategorySlug","setSelectedCategorySlug","useState","selectedTagSlug","setSelectedTagSlug","handleCategorySelect","categoryLabel","handleTagSelect","tagLabel","uiCategories","activeCat","predictEventToStandard","event","predictMarketToStandard","market","yes","no","DEFAULT_PAGE_SIZE","MAX_PRICE_HISTORY_MARKETS","CandlestickPeriod","ChartRange","DEFAULT_CHART_RANGE","CHART_RANGE_PERIOD","CHART_RANGE_SAMPLE_INTERVAL","CHART_RANGE_DURATION","ORDER_MIN_QUANTITY","ORDER_MIN_USDC","ORDER_PRICE_STEP","ORDER_MIN_PRICE","ORDER_MAX_PRICE","PriceHistoryInterval","DEFAULT_PRICE_HISTORY_INTERVAL","PRICE_HISTORY_SAMPLE_INTERVAL","PredictWalletContext","createContext","usePredictWallet","ctx","useContext","DEFAULT_POLLING_INTERVAL","PredictWalletProvider","pollingInterval","enabled","children","wallets","useWallets","solanaAddress","useMemo","w","ChainNamespace","evmAddress","kalshiBalanceData","kalshiBalanceLoading","kalshiBalanceFetching","kalshiBalanceError","useBalance","kalshiKycData","kalshiKycLoading","useDFlowKYC","polySetupData","polySetupLoading","usePolymarketSetup","polymarketSafeAddress","polymarketSetupVerified","polymarketBalanceData","polymarketBalanceLoading","polymarketBalanceFetching","polymarketBalanceError","value","DURATION_UNIT_SECONDS","resolveExpiration","preset","customDuration","customDurationUnit","now","end","fireCelebration","defaults","confetti","useTradeForm","initialOutcome","initialSide","authStatus","useAuth","switchChain","useSwitchChain","predictClient","usePredictClient","polymarketCtx","PolymarketContext","queryClient","useQueryClient","source","supportsLimitOrder","solanaWallet","evmWallet","isAuthenticated","userPublicKey","clobTokenId","raw","tickSizeData","useTickSize","tickSize","outcome","setOutcomeRaw","side","setSideRaw","orderType","setOrderTypeRaw","quantity","setQuantityRaw","limitPrice","setLimitPriceRaw","isSubmitting","setIsSubmitting","pendingSignature","setPendingSignature","pendingSellCashConvert","setPendingSellCashConvert","kycRequired","setKycRequired","expirationEnabled","setExpirationEnabled","expirationPreset","setExpirationPreset","setCustomDuration","setCustomDurationUnit","contextBalance","contextKycVerified","contextKycUrl","contextSafeAddress","pricePerShare","o","setOrderType","type","setOutcome","useEffect","shares","amountStr","yesMint","noMint","usdcMint","SOLANA_TOKENS","collateralMint","marketOutcomeMint","positionUser","positionsData","positionsLoading","usePositions","positionMarketMeta","p","effectiveOutcomeMint","effectiveCollateral","inputMint","outputMint","quoteEnabled","refetchQuote","useDFlowQuote","usdcBalance","sum","isBalanceLoading","yesTokenBalance","noTokenBalance","effectivePrice","estimatedCost","bidPrice","potentialPayout","potentialProfit","setSide","s","setQuantity","v","clamped","rounded","setLimitPrice","resetForm","validation","errors","holdingBalance","submitDFlow","useDFlowSubmit","orderStatus","useOrder","convertCashToUsdc","cashAmount","collateral","cashTx","txBytes","signedTxBytes","status","toast","submitDFlowOrder","quoteRecord","transaction","outAmount","result","submitPolymarketOrder","previousChain","needsSwitch","Chain","provider","usesSafe","signer","domain","types","primaryType","domainFields","fullTypes","creds","tokenIdx","tokenId","rawClobTokenIds","negRisk","price","polyOrderType","sizeInShares","input","buildCtfExchangeDomain","orderMessage","buildOrderMessage","signature","CTF_ORDER_TYPES","signedOrder","buildSignedOrder","clobPayload","buildClobPayload","body","headers","buildPolymarketL2Headers","submit","err","detail","KycModal","isOpen","onClose","kycUrl","StyledModal","open","ModalContent","key","USDC_LOGO","EXPIRATION_PRESETS","EXPIRATION_PRESET_I18N","DURATION_UNITS","DURATION_UNIT_I18N","TradeFormUI","variant","isValid","validationErrors","onOutcomeChange","onSideChange","onOrderTypeChange","onQuantityChange","onLimitPriceChange","onExpirationEnabledChange","onExpirationPresetChange","onCustomDurationChange","onCustomDurationUnitChange","onSubmit","showOdds","setShowOdds","kycModal","useDisclosure","quantityText","setQuantityText","quantityFocusedRef","useRef","prevSideRef","handleQuantityInput","val","setShowErrors","parsed","currentPriceCents","hasAmount","submitLabel","sideLabel","outcomeLabel","winAmount","submitColor","handleHalf","handleMax","showErrors","handleSubmitPress","Fragment","e","Tabs","StyledNumberInput","StyledInput","pct","StyledSwitch","Select","keys","SelectItem","u","ChevronDownIcon","Button","Spinner","TradeFormWidget","chain","authenticatedSubmit","useAuthCallback","adaptedEvent","adaptedMarket","PREDICT_TRADE_MODAL_ID","PredictTradeModal","id","AsyncModal","modalProps","PredictTradeModalContent","params","onOpenChange","isMobile","useScreen","DEFAULT_FILTER_STATE","countActiveFilters","state","EventsFilterUI","onChange","draft","setDraft","handleOpenChange","handleReset","handleApply","updateDraft","prev","activeCount","platformOptions","timeRemainingOptions","volumeOptions","liquidityOptions","CloseButton","FilterSection","FilterChipGroup","onClick","options","selected","allowDeselect","opt","isActive","formatCompact","STAT_CARDS","EventsHero","stats","line","card","SORT_PRESETS","SORT_LABEL_KEYS","SORT_ORDER","btnBase","dropdownBase","EventsToolbarUI","sortPreset","onSortChange","sortAsc","onSortAscChange","onFilterPress","filterCount","setIsOpen","dropdownRef","handleClickOutside","onEscape","ActiveIcon","SORT_ICONS","SortIcon","ChevronDown","Icon","FilterBarIcon","CalendarIcon","ChartLineIcon","DropletIcon","TimerIcon","useEventsInfinite","baseParams","resolveEventsParams","infiniteData","isLoading","isFetching","isFetchingMore","isError","error","hasMore","fetchNextPage","refetch","usePredictInfiniteEvents","data","page","item","fetchMore","refetchAll","SHIMMER_CSS","shimmer","shimmerDelay","delay","EventsSkeleton","SkeletonCard","index","titleWidth","j","HeroSkeleton","CategoriesToolbarSkeleton","EventsPageSkeleton","MAX_DISPLAYED_OUTCOMES","SOURCE_GLOW","GLOW_FALLBACK","C_PRIMARY","C_SECONDARY","C_RED","TEAM_PALETTE","hashString","hash","getOutcomeColors","labels","l","label0","label1","idx0","idx1","getYesAsk","getYesPercent","formatPercent","getYesCents","getNoCents","yesPrice","formatCountdown","isoDate","diff","d","h","m","parts","injectedCSS","EventItem","href","LinkComponent","onSelectOutcome","onHover","expandedSlug","setExpandedSlug","rawMarkets","openMarkets","singleMarket","displayedMarkets","moreCount","formattedVolume","expandedMarket","isExpanded","handleCardClick","handleHeaderClick","handleShowMore","footerContent","SingleMarketFooter","ExpandedMarketFooter","MarketListFooter","el","glowColor","CardHeader","SingleMarketBody","ExpandedMarketBody","MarketListBody","CardFooter","countdown","Linkable","Avatar","EventIndicators","getEventBadges","badges","isCrypto","isLive","remaining","fiveMin","fifteenMin","cryptoColor","LiveBadge","CryptoCountdownBadge","ClosedBadge","color","onMarketClick","YesNoPill","onShowMore","ChevronRightIcon","SourceIcon","ElevatedButton","bgColor","textColor","shadowColor","OutcomeButtons","dynamicColors","labelFormat","c0","c1","effectiveFormat","yesLabel","noLabel","onCollapse","ChevronUpIcon","ChevronLeftIcon","PolymarketIcon","KalshiIcon","GLOW_INSET","EventsUI","events","onFetchMore","getEventHref","sentinelRef","observer","entries","handleScrollToTop","showEndOfList","EndOfListRow","onScrollToTop","EventsWidget","tagSlugSelection","limit","sort_by","sort_asc","with_markets","timeRemaining","minVolume","minLiquidity","EventsPage","bgImageSrc","setTagSlugSelection","filterState","setFilterState","useEventStats","isFilterOpen","openFilter","closeFilter","openTradeModal","useAsyncModal","handleSelectOutcome","selection","handleSortChange","handleSortAscChange","asc","handleFilterChange","sortBy","toolbar","ROW_HEIGHT","HEADER_HEIGHT","CONTENT_HEIGHT","LIST_HEIGHT","UserActivitySection","walletAddress","onCancelOrder","activeTab","setActiveTab","marketSlugs","positionsCount","tabs","tab","PositionsTab","OrdersTab","TradesTab","positions","TabSkeleton","EmptyState","List","PositionVirtualRow","style","closeLabel","position","pnl","pnlPercent","avgPrice","currentPrice","pnlColor","pnlSign","marketLabel","payoutIfRight","settlementStr","formatSettlementTime","formatPrice","hasNextPage","useInfiniteOrders","cancelMutation","useCancelOrder","orders","allItems","openStatuses","filtered","handleCancel","order","itemCount","rowCount","isRowLoaded","loadMoreRows","onRowsRendered","useInfiniteLoader","OrderVirtualRow","onCancel","isCancelling","cancelLabel","isBuy","OrderStatusBadge","useInfiniteTrades","trades","TradeVirtualRow","trade","timeStr","formatTimestamp","usdSize","message","cents","unixSeconds","date","month","day","hours","mins","isoString","EventDetailSkeleton","marketCount","showBack","TradeFormSkeleton","BID_COLOR","ASK_COLOR","formatKMB","n","abs","heightPow","cumulative","maxCumulative","buildDepthData","bids","asks","rawBidQty","rawAskQty","bid","slot","ask","cumBid","cumBidCost","bidTotal","bidCumCostArr","cumAsk","cumAskCost","askTotal","askCumCostArr","isBid","isAsk","hasOrder","DepthTooltipPanel","info","left","right","DepthColumn","memo","onEnter","onLeave","barRef","isVisible","X_TICKS","DepthXAxis","tick","EventMarketDepthChartUI","midPrice","bestBid","bestAsk","hasData","tooltip","setTooltip","activeBarRef","handleColumnEnter","barEl","handleColumnLeave","formatPriceCents","OrderbookSkeleton","EventMarketDetailWidget","onTradeAction","viewMode","setViewMode","isNo","orderbook","isOrderbookLoading","useOrderbook","spread","OrderbookTableIcon","OrderbookDepthIcon","EventOrderbookTableUI","MAX_ROWS_PER_SIDE","sortedAsks","sortedBids","maxQty","all","r","OrderbookRow","depthPct","bgClass","priceClass","formattedContracts","dollarValue","formattedTotal","ChartErrorBoundary","Component","MAX_SELECTED","CHART_COLORS","ms","range","formatTooltipTimestamp","INTERVAL_OPTIONS","IntervalSwitcher","useCursorOverlay","wrapperRef","overlayRef","onMouseMove","wrapper","overlay","rect","xPct","onMouseLeave","CustomTooltip","active","payload","labelMap","allSeries","payloadMap","MarketSelector","markets","selectedSlugs","colorMap","onToggle","setOpen","rootRef","handleClick","atMax","triggerContent","slug","mk","isDisabled","isOnlyOne","yesOutcome","LegendBar","series","displayValues","medianOfSorted","sorted","mid","downsampleSeries","maxPoints","step","start","bucket","buildChartData","maxPointsPerSeries","sampledSeries","allTimestamps","lookups","lastValues","ts","row","map","last","EventPriceChart","props","EventPriceChartInner","externalLoading","volume","allMarkets","seen","sortedMarkets","priceOf","setSelectedSlugs","chartRange","setChartRange","selectedMarkets","hookSeries","hookLoading","useMarketHistory","dayMs","chartData","yDomain","min","max","pad","currentValues","tooltipSeries","chartWrapperRef","overlayDivRef","handleWrapperMouseMove","handleWrapperMouseLeave","handleToggle","hoveredValues","setHoveredValues","hoveredValuesRef","lastPayloadKeyRef","rafIdRef","showChart","ResponsiveContainer","LineChart","CartesianGrid","XAxis","YAxis","Tooltip","Line","lastRow","yVal","ReferenceDot","dx","dy","formatCents","getMarketLabel","getPlatformLabel","formatISOTimestamp","iso","year","minutes","useCountdown","targetIso","setNow","target","days","secs","formatCountdownDate","offset","sign","tzHours","EventDetailUI","collapseRef","isCollapsed","useScrollCollapse","rest","isEnded","startCountdown","endCountdown","startDateFormatted","endDateFormatted","EventMarketsUI","EventRulesUI","DEFAULT_VISIBLE_COUNT","showAll","setShowAll","firstOpenSlug","activeKey","setActiveKey","visibleMarkets","toggleExpand","handleTradeAction","noPrice","MarketRow","activeYes","activeNo","onToggleExpand","volumeFormatted","showFullRules","setShowFullRules","showTimeline","setShowTimeline","selectedIdx","setSelectedIdx","marketsWithContent","selectedMarket","rulesText","truncatedRules","Dropdown","DropdownTrigger","DropdownMenu","DropdownItem","arr","EventDetailWidget","eventSlug","isEventLoading","eventError","useEvent","SOURCE_META","DEFAULT_META","getSourceMeta","SourceBadge","meta","REST_BORDER","HOVER_BORDER","formatVolume","vol","SimilarEventsSection","onEventClick","onEventHover","similarEvents","useSimilarEvents","ev","SimilarEventCard","sourceMeta","firstTag","EventDetailPage","onSimilarEventClick","onSimilarEventHover","onBack","tradeSelection","setTradeSelection","hasBack","tradeFormKey","listCandlesticksParamsForRange","useEventDetail","candlestickMarketSlugs","client","candlestickParams","marketsToQuery","dedupedMarkets","candlestickQueries","useQueries","candlesticksQueryKey","isCandlesticksLoading","q","candlestickErrors","candlesticks","MAX_HISTORY_SIZE","searchHistoriesAtom","atomWithStorage","usePredictSearchHistory","histories","setHistories","useAtom","addHistory","keyword","trimmed","clearHistories","SearchHistoryUI","onClear","TrashIcon","SearchHistoryWidget","SearchInputUI","onValueChange","SearchIcon","XCloseIcon","Kbd","SearchResultItemUI","useSearchResultListScript","isFetchingNextPage","useSearchEvents","SearchResultListWidget","scriptParams","ref","height","useResizeObserver","isItemLoaded","loadMoreItems","onRowsLoaded","LoadingState","SearchResultRow","EmptyIcon","useSearchScript","onKeywordChange","text","setText","setKeyword","onKeywordChangeStable","useCallbackRef","addHistoryStable","debouncedSearch","debounce","setText_","setKeyword_","clearKeyword","SearchWidget","onSelectEvent","PREDICT_SEARCH_MODAL_ID","PredictSearchModal","PredictSearchModalContent","onResult","handleSelectEvent","handleEscape","ModalHeader","ModalBody","SearchEventsButton","modalParams","isDesktop","onOpen","onSelectEventStable","handleOpen","handleClose","handleKeyDown","activeElement","isInEditableElement","SORT_OPTIONS","VOLUME_PRESETS","getVolumeLabel","MatchesFilterBar","onMinVolumeChange","onRefresh","sortOpen","setSortOpen","volumeOpen","setVolumeOpen","tooltipVisible","setTooltipVisible","spinning","setSpinning","sortRef","volumeRef","currentSort","handleRefresh","SortOptionIcon","FilterIcon","InfoIcon","shared","onMouseEnter","MatchesHero","getYesPrice","getOutcomeName","getSpreadTier","spreadPercent","SPREAD_THEME","SPREAD_GLOW","CONFIDENCE_THEME","getConfidenceTierKey","tier","score","SpreadGauge","theme","filled","PLATFORM_COLORS","DEFAULT_PLATFORM","getPlatformColor","FOCUS_CSS","MatchMarketCard","match","getMarketHref","priceA","priceB","cheaperSource","title","confKey","confTheme","ctaAccent","glow","PlatformRow","isCheaper","platColor","outcomeName","content","MatchesWidget","forwardRef","onStatsChange","isPlaceholderData","useInfiniteMatchMarkets","keepPreviousData","animKey","setAnimKey","prevIsPlaceholder","setPrevIsPlaceholder","k","useImperativeHandle","allMatches","total","maxSpread","totalVolume","highSpreadCount","MatchesSkeletonList","itemIndex","MatchesEndOfList","SORT_TITLE_KEY","StatusClock","time","setTime","fmt","MatchesStatusBar","MatchesPage","setSortBy","setSortAsc","setMinVolume","heroStats","setHeroStats","widgetRef","sort","handleStatsChange","startTransition","DEFAULT_PLATFORM_COLORS","getPlatformColors","getBestMarketPair","group","best","bestSpread","extractPlatformData","pair","entryA","entryB","getOutcome","oA","oB","MatchGroupCard","onSelectEntry","bestPair","platA","platB","isHighSpread","cheapest","cheapestMeta","PlatformBlock","colors","MatchesStatsBar","matches","sources","entry","StatItem","Separator","valueClassName","getSpreadColor","SpreadIndicator","arbProfit","hasArb","PAGE_SIZE","PAGINATION_HEIGHT","ProfileHistory","listHeight","currentPage","setCurrentPage","kalshiData","kalshiLoading","fetchNextKalshi","hasMoreKalshi","isFetchingKalshi","polyData","polyLoading","fetchNextPoly","hasMorePoly","isFetchingPoly","allTrades","totalPages","pageStart","pageTrades","handlePrev","handleNext","canGoPrev","canGoNext","contentHeight","HistoryRowStatic","HistoryCard","statusLabel","mapTradeStatus","isDeposit","depositSign","depositColor","eventTitle","eventImage","txUrl","getTxUrl","pnlValue","extractPnl","feeValue","extractFee","ExternalLinkIcon","fee","tz","tzSign","ProfileOrders","pageOrders","OrderRowStatic","Pagination","OrderCard","cost","onPrev","onNext","onPage","compact","ProfilePositions","onClosePosition","handleCloseAll","pos","pagePositions","PositionRowStatic","PositionCard","outcomeSide","MobileStat","ProfileStats","realizedPnl","positionsValue","wins","settled","tr","winRateStr","StatCard","ProfilePage","hasWallet","kalshiPositions","kalshiPosLoading","polyPositions","polyPosLoading","allPositions","kalshiTrades","kalshiTradesLoading","polyTrades","polyTradesLoading","statsLoading","SetupModal","safeDeployed","tokenApproved","onDeployAndApprove","setupRunning","setSetupRunning","setupError","setSetupError","optimisticDone","setOptimisticDone","effectiveSafeDeployed","effectiveTokenApproved","step1Status","step2Status","allDone","handleSetup","steps","handleAction","actionLabel","StepIndicator"],"mappings":"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","file":"index.js","sourcesContent":["declare global {\n interface Window {\n __LIBERFI_VERSION__?: {\n [key: string]: string;\n };\n }\n}\nif (typeof window !== \"undefined\") {\n window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};\n window.__LIBERFI_VERSION__[\"@liberfi.io/ui-predict\"] = \"0.1.122\";\n}\n\nexport default \"0.1.122\";\n","// =============================================================================\n// Categories — static navigation data\n//\n// Static data source. Tags are hardcoded from:\n// GET https://dev-prediction-markets-api.dflow.net/api/v1/tags_by_categories\n//\n// Slug logic mirrors mapTag() in prediction-server/internal/strategy/dflow/mapper.go:\n// slug = label (the original label string is used as the slug verbatim)\n// =============================================================================\n\n// -----------------------------------------------------------------------------\n// Static data — sourced from DFlow API (2025-03-22)\n// -----------------------------------------------------------------------------\n\n/**\n * Raw API shape from GET /api/v1/tags_by_categories.\n * Category keys map to tag arrays (null when the category has no sub-tags).\n */\nconst RAW_TAGS_BY_CATEGORIES: Record<string, string[] | null> = {\n Weather: [\n \"Daily temperature\",\n \"Snow and rain\",\n \"Climate change\",\n \"Natural disasters\",\n \"Hurricanes\",\n ],\n Companies: [\n \"IPOs\",\n \"Product launches\",\n \"KPIs\",\n \"Elon Musk\",\n \"CEOs\",\n \"Layoffs\",\n ],\n Crypto: [\n \"BTC\",\n \"15 min\",\n \"Hourly\",\n \"ETH\",\n \"SOL\",\n \"DOGE\",\n \"Pre-Market\",\n \"XRP\",\n \"BNB\",\n \"HYPE\",\n ],\n Economics: [\n \"Growth\",\n \"Fed\",\n \"Inflation\",\n \"Oil and energy\",\n \"Employment\",\n \"Housing\",\n \"Jobs & Economy\",\n \"Bankruptcy & Defaults\",\n \"GDP\",\n \"Global Central Banks\",\n ],\n Elections: [\"Primaries\", \"International elections\"],\n Entertainment: [\n \"Music\",\n \"Movies\",\n \"Music charts\",\n \"Television\",\n \"Awards\",\n \"Video games\",\n \"Oscars\",\n \"Rotten Tomatoes\",\n ],\n Financials: [\n \"S&P\",\n \"Nasdaq\",\n \"Daily\",\n \"Metals\",\n \"Treasuries\",\n \"Oil\",\n \"EUR/USD\",\n \"USD/JPY\",\n \"WTI\",\n ],\n Mentions: [\"Politicians\", \"Earnings\", \"Entertainment\"],\n Politics: [\n \"Trump\",\n \"Congress\",\n \"International\",\n \"SCOTUS & courts\",\n \"Local\",\n \"Recurring\",\n \"Iran\",\n \"House\",\n ],\n Science: [\"AI\", \"Energy\", \"Space\"],\n Social: null,\n Sports: [\n \"Soccer\",\n \"Basketball\",\n \"Baseball\",\n \"Football\",\n \"Hockey\",\n \"Golf\",\n \"Tennis\",\n \"Motorsport\",\n \"Esports\",\n \"Boxing\",\n \"MMA\",\n \"Rugby\",\n \"Lacrosse\",\n \"Mentions\",\n \"Chess\",\n \"Cricket\",\n \"Aussie Rules\",\n \"Darts\",\n ],\n World: null,\n};\n\n// -----------------------------------------------------------------------------\n// Preferred display order (matches the DFlow category taxonomy)\n// -----------------------------------------------------------------------------\n\nconst CATEGORY_ORDER: string[] = [\n \"Politics\",\n \"Sports\",\n \"Crypto\",\n \"Economics\",\n \"Financials\",\n \"Elections\",\n \"Entertainment\",\n \"Companies\",\n \"Science and Technology\",\n \"Climate and Weather\",\n \"Mentions\",\n \"Social\",\n \"World\",\n];\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\n/**\n * A single category entry in the static navigation model.\n *\n * Slug logic: slug === label (verbatim), matching mapTag() in the prediction\n * server's DFlow strategy. Pass the slug directly to DFlow API filters.\n */\nexport interface CategoryListItem {\n /** Category slug — equals the label; use directly as DFlow `category` filter */\n slug: string;\n /** Display label */\n label: string;\n /** Tag entries for this category (empty array when the category has no sub-tags) */\n tags: CategoryTagItem[];\n}\n\n/** A single tag entry in the static navigation model */\nexport interface CategoryTagItem {\n /** Tag slug — equals the label; use directly as DFlow `tags` filter */\n slug: string;\n /** Display label */\n label: string;\n /** Optional Phosphor icon class name (e.g. \"ph--basketball-bold\") */\n icon?: string;\n}\n\n// -----------------------------------------------------------------------------\n// Derived static data\n// -----------------------------------------------------------------------------\n\n/**\n * Sorted category list derived from the static DFlow API snapshot.\n * Memoised at module level — computed once, never re-created.\n */\nexport const STATIC_CATEGORIES: CategoryListItem[] = (() => {\n const orderIndex = (cat: string): number => {\n const idx = CATEGORY_ORDER.indexOf(cat);\n return idx === -1 ? CATEGORY_ORDER.length : idx;\n };\n\n return Object.entries(RAW_TAGS_BY_CATEGORIES)\n .map(\n ([label, rawTags]): CategoryListItem => ({\n slug: label, // mapTag: slug = label\n label,\n tags: (rawTags ?? []).map(\n (t): CategoryTagItem => ({ slug: t, label: t }),\n ),\n }),\n )\n .sort((a, b) => orderIndex(a.slug) - orderIndex(b.slug));\n})();\n\n// -----------------------------------------------------------------------------\n// Selection type\n// -----------------------------------------------------------------------------\n\n/**\n * Selection emitted by CategoriesWidget.\n *\n * - `categorySlug = null, tagSlug = null` → \"Trending\" (no filter)\n * - `categorySlug = \"Politics\", tagSlug = null` → category selected, all its tags\n * - `categorySlug = \"Politics\", tagSlug = \"Trump\"` → specific tag selected\n */\nexport interface TagSlugSelection {\n /** Selected category slug (null = Trending / no filter) */\n categorySlug: string | null;\n /** Selected tag slug within the category (null = all tags in the category) */\n tagSlug: string | null;\n}\n","import { useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { cn, Skeleton } from \"@liberfi.io/ui\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\nexport interface CategoryItem {\n category: string;\n tags: string[];\n /** Optional badge text displayed above the tab (e.g. \"New\", \"Hot\") */\n badge?: string;\n}\n\nexport interface TagItem {\n label: string;\n /** Optional Phosphor icon class name (e.g. \"ph--basketball-bold\") */\n icon?: string;\n}\n\nexport interface CategoriesUIProps {\n /** List of categories to display */\n categories: CategoryItem[];\n /** Currently selected category name (null = \"Trending\") */\n selectedCategory: string | null;\n /** Currently selected tag within the category (null = all tags) */\n selectedTag: string | null;\n /** Tags of the currently selected category */\n activeTags: TagItem[];\n /** Callback when a category is selected (null = \"Trending\") */\n onCategorySelect: (category: string | null) => void;\n /** Callback when a tag is selected (null = deselect) */\n onTagSelect: (tag: string | null) => void;\n /** Content rendered at the end of the primary chip row (e.g. sort/filter controls) */\n trailing?: React.ReactNode;\n /** Name of the tab that shows a pulsing dot (default: \"Trending\") */\n pulsingTab?: string;\n /** Optional class name for the root element */\n className?: string;\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function CategoriesUI({\n categories,\n selectedCategory,\n selectedTag,\n activeTags,\n onCategorySelect,\n onTagSelect,\n trailing,\n pulsingTab = \"Trending\",\n className,\n}: CategoriesUIProps) {\n const { t } = useTranslation();\n\n const handleSelectAll = useCallback(() => {\n onCategorySelect(null);\n }, [onCategorySelect]);\n\n const trendingLabel = t(\"predict.categories.trending\");\n\n return (\n <div\n className={cn(\n \"sticky top-0 z-30 flex w-full flex-col justify-between gap-2 px-4 py-2.5 lg:px-4 lg:py-2\",\n className,\n )}\n >\n {/* Primary row: category tabs + trailing controls */}\n <div className=\"flex w-full items-center gap-2\">\n <div className=\"hideScrollbar min-w-0 flex-1 overflow-x-auto overflow-y-hidden\">\n <div className=\"flex min-h-9 items-stretch gap-x-3 lg:min-h-10\">\n {/* Trending tab */}\n <Tab\n label={trendingLabel}\n isSelected={selectedCategory === null}\n onPress={handleSelectAll}\n showPulse={trendingLabel === pulsingTab}\n />\n\n {/* Separator between Trending and categories */}\n <TabSeparator />\n\n {/* Category tabs */}\n {categories.map((cat) => (\n <Tab\n key={cat.category}\n label={cat.category}\n isSelected={selectedCategory === cat.category}\n onPress={() => onCategorySelect(cat.category)}\n badge={cat.badge}\n showPulse={cat.category === pulsingTab}\n />\n ))}\n </div>\n </div>\n {trailing && <div className=\"flex-shrink-0\">{trailing}</div>}\n </div>\n\n {/* Secondary: tag chips (visible when a category is selected) */}\n {selectedCategory && activeTags.length > 0 && (\n <div className=\"hideScrollbar overflow-x-auto overflow-y-hidden flex items-center\">\n <div className=\"flex gap-x-1.5 pl-1 lg:w-full lg:gap-x-2\">\n <Chip\n label={t(\"predict.categories.allMarkets\")}\n isSelected={selectedTag === null}\n onPress={() => onTagSelect(null)}\n />\n {activeTags.map((tag) => (\n <Chip\n key={tag.label}\n label={tag.label}\n icon={tag.icon}\n isSelected={selectedTag === tag.label}\n onPress={() => onTagSelect(tag.label)}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Tab — primary category navigation item\n// -----------------------------------------------------------------------------\n\ninterface TabProps {\n label: string;\n isSelected: boolean;\n onPress: () => void;\n badge?: string;\n showPulse?: boolean;\n}\n\nfunction Tab({ label, isSelected, onPress, badge, showPulse }: TabProps) {\n return (\n <button\n type=\"button\"\n onClick={onPress}\n className={cn(\n \"relative shrink-0 cursor-pointer whitespace-nowrap border-b px-2.5 py-1.5 text-sm font-medium capitalize transition-colors\",\n isSelected\n ? \"border-primary/50 text-primary\"\n : \"border-transparent text-neutral-500 hover:text-neutral-300\",\n )}\n >\n {showPulse ? (\n <span className=\"flex items-center gap-x-1.5\">\n <span className=\"h-2 w-2 animate-pulse rounded-full bg-[rgb(240,68,56)]\" />\n <span>{label}</span>\n </span>\n ) : (\n label\n )}\n\n {badge && (\n <span className=\"absolute -right-1 top-0 rounded bg-primary px-0.5 py-px text-[0.625rem] font-semibold leading-none text-neutral-950\">\n {badge}\n </span>\n )}\n </button>\n );\n}\n\n// -----------------------------------------------------------------------------\n// TabSeparator — vertical divider between tab groups\n// -----------------------------------------------------------------------------\n\nfunction TabSeparator() {\n return (\n <span className=\"flex items-center text-neutral-600\" aria-hidden=\"true\">\n |\n </span>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Chip — secondary tag chip (pixel-perfect Jupiter clone)\n// -----------------------------------------------------------------------------\n\ninterface ChipProps {\n label: string;\n icon?: string;\n isSelected: boolean;\n onPress: () => void;\n}\n\nfunction Chip({ label, icon, isSelected, onPress }: ChipProps) {\n return (\n <button\n type=\"button\"\n onClick={onPress}\n className={cn(\n \"flex shrink-0 items-center justify-center gap-x-1 min-w-14 rounded-2xl border px-3 py-1.5 text-sm font-medium uppercase transition-colors cursor-pointer\",\n isSelected\n ? \"border-primary/40 bg-primary/15 text-primary\"\n : \"border-border/80 text-neutral-500 hover:bg-primary/10 hover:text-primary\",\n )}\n >\n {icon && <span className={cn(\"iconify size-4\", icon)} />}\n {label}\n </button>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Skeleton\n// -----------------------------------------------------------------------------\n\nexport function CategoriesSkeleton({ count = 6 }: { count?: number }) {\n return (\n <div className=\"flex w-full flex-col gap-2 px-4 py-2.5 lg:px-4 lg:py-2\">\n <div className=\"flex min-h-9 items-center gap-x-3 lg:min-h-10\">\n {Array.from({ length: count }).map((_, i) => (\n <Skeleton key={i} className=\"h-6 w-16 shrink-0 rounded\" />\n ))}\n </div>\n </div>\n );\n}\n","// =============================================================================\n// CategoriesWidget\n//\n// Category / tag navigation backed by a static hardcoded snapshot (categories.script.ts).\n// Callbacks emit `TagSlugSelection` (categorySlug / tagSlug). Slug values follow the\n// DFlow mapTag() convention: slug === label verbatim.\n//\n// UI layer is shared with CategoriesUI / CategoriesSkeleton where available.\n// =============================================================================\nimport { useState, useCallback } from \"react\";\nimport {\n STATIC_CATEGORIES,\n type CategoryListItem,\n type TagSlugSelection,\n} from \"./categories.script\";\nimport { CategoriesUI, type CategoryItem, type TagItem } from \"./categories.ui\";\n\n// Re-export types so consumers can import from this single entry point.\nexport type { TagSlugSelection } from \"./categories.script\";\n\n// -----------------------------------------------------------------------------\n// Props\n// -----------------------------------------------------------------------------\n\nexport interface CategoriesWidgetProps {\n /**\n * Callback fired when the category / tag selection changes.\n *\n * Slug values follow the DFlow `mapTag()` convention (slug === label):\n * - `{ categorySlug: null, tagSlug: null }` → \"Trending\" (no filter)\n * - `{ categorySlug: \"Crypto\", tagSlug: null }` → category selected\n * - `{ categorySlug: \"Crypto\", tagSlug: \"BTC\" }` → specific tag selected\n */\n onSelect?: (selection: TagSlugSelection) => void;\n /** Content rendered at the end of the primary chip row (e.g. sort/filter controls) */\n trailing?: React.ReactNode;\n /** Optional class name applied to the root element */\n className?: string;\n}\n\n// -----------------------------------------------------------------------------\n// Adapter helpers\n// -----------------------------------------------------------------------------\n\n/** Convert CategoryListItem[] to the shape expected by CategoriesUI */\nfunction toUICategories(items: CategoryListItem[]): CategoryItem[] {\n return items.map((c) => ({\n category: c.label,\n tags: c.tags.map((t) => t.label),\n }));\n}\n\nfunction toUITags(cat: CategoryListItem | undefined): TagItem[] {\n if (!cat) return [];\n return cat.tags.map((t) => ({\n label: t.label,\n icon: t.icon,\n }));\n}\n\n// -----------------------------------------------------------------------------\n// Widget\n// -----------------------------------------------------------------------------\n\nexport function CategoriesWidget({\n onSelect,\n trailing,\n className,\n}: CategoriesWidgetProps) {\n const [selectedCategorySlug, setSelectedCategorySlug] = useState<\n string | null\n >(null);\n const [selectedTagSlug, setSelectedTagSlug] = useState<string | null>(null);\n\n // --- handlers ---\n\n const handleCategorySelect = useCallback(\n (categoryLabel: string | null) => {\n setSelectedCategorySlug(categoryLabel); // slug === label\n setSelectedTagSlug(null);\n\n onSelect?.({\n categorySlug: categoryLabel, // null → \"Trending\"\n tagSlug: null,\n });\n },\n [onSelect],\n );\n\n const handleTagSelect = useCallback(\n (tagLabel: string | null) => {\n setSelectedTagSlug(tagLabel); // slug === label\n\n onSelect?.({\n categorySlug: selectedCategorySlug,\n tagSlug: tagLabel,\n });\n },\n [selectedCategorySlug, onSelect],\n );\n\n // --- derive UI data ---\n\n const uiCategories = toUICategories(STATIC_CATEGORIES);\n\n const activeCat = STATIC_CATEGORIES.find(\n (c) => c.slug === selectedCategorySlug,\n );\n const activeTags = toUITags(activeCat);\n\n return (\n <CategoriesUI\n categories={uiCategories}\n selectedCategory={selectedCategorySlug}\n selectedTag={selectedTagSlug}\n activeTags={activeTags}\n onCategorySelect={handleCategorySelect}\n onTagSelect={handleTagSelect}\n trailing={trailing}\n className={className}\n />\n );\n}\n","import type { PredictEvent, PredictMarket } from \"@liberfi.io/react-predict\";\nimport type { StandardEvent, StandardMarket } from \"../types\";\n\nexport function predictEventToStandard(event: PredictEvent): StandardEvent {\n return {\n title: event.title,\n imageUrl: event.image_url,\n };\n}\n\nexport function predictMarketToStandard(market: PredictMarket): StandardMarket {\n const yes = market.outcomes[0];\n const no = market.outcomes[1];\n return {\n question: market.question,\n yesAsk: yes?.best_ask ?? yes?.price,\n noAsk: no?.best_ask ?? no?.price,\n yesBid: yes?.best_bid,\n noBid: no?.best_bid,\n yesSubTitle: yes?.label ?? \"Yes\",\n noSubTitle: no?.label ?? \"No\",\n };\n}\n","/** Default page size for list queries */\nexport const DEFAULT_PAGE_SIZE = 48;\n\n/** Maximum number of markets to display in price history chart */\nexport const MAX_PRICE_HISTORY_MARKETS = 4;\n\n/**\n * Candlestick period intervals in minutes (granularity for API queries)\n */\nexport const CandlestickPeriod = {\n /** 1 minute */\n ONE_MINUTE: 1,\n /** 1 hour (60 minutes) */\n ONE_HOUR: 60,\n /** 1 day (1440 minutes) */\n ONE_DAY: 1440,\n} as const;\n\nexport type CandlestickPeriodType =\n (typeof CandlestickPeriod)[keyof typeof CandlestickPeriod];\n\n/**\n * Chart range options (the user-facing time range selector)\n */\nexport const ChartRange = {\n /** 1 day */\n ONE_DAY: \"1d\",\n /** 1 week */\n ONE_WEEK: \"1w\",\n /** 1 month */\n ONE_MONTH: \"1m\",\n /** All time */\n ALL: \"all\",\n} as const;\n\nexport type ChartRangeType = (typeof ChartRange)[keyof typeof ChartRange];\n\n/** Default chart range */\nexport const DEFAULT_CHART_RANGE = ChartRange.ALL;\n\n/** Candlestick granularity derived from chart range (1D → minute, 1W/1M → hourly, ALL → daily) */\nexport const CHART_RANGE_PERIOD: Record<ChartRangeType, CandlestickPeriodType> =\n {\n [ChartRange.ONE_DAY]: CandlestickPeriod.ONE_MINUTE,\n [ChartRange.ONE_WEEK]: CandlestickPeriod.ONE_HOUR,\n [ChartRange.ONE_MONTH]: CandlestickPeriod.ONE_HOUR,\n [ChartRange.ALL]: CandlestickPeriod.ONE_DAY,\n };\n\n/** Chart sampling interval in seconds (used to downsample candlestick data for display) */\nexport const CHART_RANGE_SAMPLE_INTERVAL: Record<ChartRangeType, number> = {\n [ChartRange.ONE_DAY]: 5 * 60, // 5 minutes\n [ChartRange.ONE_WEEK]: 60 * 60, // 1 hour\n [ChartRange.ONE_MONTH]: 3 * 60 * 60, // 3 hours\n [ChartRange.ALL]: 24 * 60 * 60, // 1 day\n};\n\n/** Duration in seconds for each chart range (null = all time) */\nexport const CHART_RANGE_DURATION: Record<ChartRangeType, number | null> = {\n [ChartRange.ONE_DAY]: 24 * 60 * 60,\n [ChartRange.ONE_WEEK]: 7 * 24 * 60 * 60,\n [ChartRange.ONE_MONTH]: 30 * 24 * 60 * 60,\n [ChartRange.ALL]: null,\n};\n\n// -- Order-related constants -------------------------------------------------\n\n/** Minimum order quantity (contracts / shares for sell) */\nexport const ORDER_MIN_QUANTITY = 1;\n\n/** Minimum marketable BUY order in USDC (applies to Polymarket & Kalshi) */\nexport const ORDER_MIN_USDC = 1;\n\n/** Price step size in cents */\nexport const ORDER_PRICE_STEP = 1;\n\n/** Minimum price in cents */\nexport const ORDER_MIN_PRICE = 1;\n\n/** Maximum price in cents */\nexport const ORDER_MAX_PRICE = 99;\n\n// -- Legacy aliases for backward compatibility -------------------------------\n\n/** @deprecated Use ChartRange instead */\nexport const PriceHistoryInterval = {\n ONE_HOUR: \"1h\",\n SIX_HOURS: \"6h\",\n ONE_DAY: \"1d\",\n ONE_WEEK: \"1w\",\n MAX: \"max\",\n} as const;\n\n/** @deprecated Use ChartRangeType instead */\nexport type PriceHistoryIntervalType =\n (typeof PriceHistoryInterval)[keyof typeof PriceHistoryInterval];\n\n/** @deprecated Use DEFAULT_CHART_RANGE instead */\nexport const DEFAULT_PRICE_HISTORY_INTERVAL = PriceHistoryInterval.ONE_WEEK;\n\n/** @deprecated */\nexport const PRICE_HISTORY_SAMPLE_INTERVAL: Record<\n PriceHistoryIntervalType,\n number\n> = {\n [PriceHistoryInterval.ONE_HOUR]: 60,\n [PriceHistoryInterval.SIX_HOURS]: 60,\n [PriceHistoryInterval.ONE_DAY]: 300,\n [PriceHistoryInterval.ONE_WEEK]: 1800,\n [PriceHistoryInterval.MAX]: 1800,\n};\n","import {\n createContext,\n useContext,\n type PropsWithChildren,\n useMemo,\n} from \"react\";\nimport {\n useBalance,\n useDFlowKYC,\n usePolymarketSetup,\n} from \"@liberfi.io/react-predict\";\nimport { ChainNamespace } from \"@liberfi.io/types\";\nimport { useWallets } from \"@liberfi.io/wallet-connector\";\n\nexport interface PredictWalletContextValue {\n /** Connected Solana wallet address (for Kalshi). */\n solanaAddress: string | undefined;\n /** Connected EVM wallet address (for Polymarket). */\n evmAddress: string | undefined;\n /** Polymarket Safe (proxy) wallet address, derived from EOA via CREATE2. */\n polymarketSafeAddress: string | undefined;\n /** `null` when no wallet is connected or data has not loaded yet. */\n kalshiUsdcBalance: number | null;\n /** `null` when wallet not connected or setup not complete. */\n polymarketUsdcBalance: number | null;\n /** Whether the Solana wallet has completed Kalshi/DFlow KYC verification. */\n kalshiKycVerified: boolean;\n /** URL to redirect for KYC onboarding, or `null` if unavailable. */\n kalshiKycUrl: string | null;\n /** `true` while the KYC status query is loading for the first time. */\n kalshiKycLoading: boolean;\n /** Whether Polymarket wallet setup is fully complete (Safe deployed + USDC.e approved). */\n polymarketSetupVerified: boolean;\n /** Whether the Safe wallet has been deployed on Polygon. */\n polymarketSafeDeployed: boolean;\n /** Whether USDC.e is approved for the CTF Exchange. */\n polymarketTokenApproved: boolean;\n /** `true` while the Polymarket setup status is loading. */\n polymarketSetupLoading: boolean;\n /** `true` only on initial load when there is no cached data yet. */\n isLoading: boolean;\n /** `true` whenever a request is in-flight (including background refetches). */\n isFetching: boolean;\n error: Error | null;\n}\n\nconst PredictWalletContext = createContext<PredictWalletContextValue | null>(\n null,\n);\n\nexport function usePredictWallet() {\n const ctx = useContext(PredictWalletContext);\n if (!ctx) {\n throw new Error(\n \"usePredictWallet must be used within a PredictWalletProvider\",\n );\n }\n return ctx;\n}\n\nconst DEFAULT_POLLING_INTERVAL = 10_000;\n\nexport type PredictWalletProviderProps = PropsWithChildren<{\n pollingInterval?: number;\n enabled?: boolean;\n}>;\n\nexport function PredictWalletProvider({\n pollingInterval = DEFAULT_POLLING_INTERVAL,\n enabled = true,\n children,\n}: PredictWalletProviderProps) {\n // ---------------------------------------------------------------------------\n // Derive wallet addresses from wallet-connector\n // ---------------------------------------------------------------------------\n const wallets = useWallets();\n\n const solanaAddress = useMemo(\n () =>\n wallets.find(\n (w) => w.chainNamespace === ChainNamespace.SOLANA && w.isConnected,\n )?.address,\n [wallets],\n );\n\n const evmAddress = useMemo(\n () =>\n wallets.find(\n (w) => w.chainNamespace === ChainNamespace.EVM && w.isConnected,\n )?.address,\n [wallets],\n );\n\n // ---------------------------------------------------------------------------\n // DFlow (Solana) USDC balance polling\n // ---------------------------------------------------------------------------\n const {\n data: kalshiBalanceData,\n isLoading: kalshiBalanceLoading,\n isFetching: kalshiBalanceFetching,\n error: kalshiBalanceError,\n } = useBalance(\n { source: \"kalshi\", user: solanaAddress ?? \"\" },\n {\n enabled: enabled && !!solanaAddress,\n refetchInterval: pollingInterval,\n },\n );\n\n // ---------------------------------------------------------------------------\n // Kalshi / DFlow KYC status polling\n // ---------------------------------------------------------------------------\n const { data: kalshiKycData, isLoading: kalshiKycLoading } = useDFlowKYC(\n solanaAddress,\n {\n enabled: enabled && !!solanaAddress,\n refetchInterval: 30_000,\n },\n );\n\n // ---------------------------------------------------------------------------\n // Polymarket wallet setup status polling\n // ---------------------------------------------------------------------------\n const { data: polySetupData, isLoading: polySetupLoading } =\n usePolymarketSetup(evmAddress, {\n enabled: enabled && !!evmAddress,\n refetchInterval: 30_000,\n });\n\n // ---------------------------------------------------------------------------\n // Polymarket (Polygon) USDC.e balance polling\n // The backend derives the Safe address from the EOA via CREATE2, so we\n // always pass the EOA here — consistent with positions and trades queries.\n // ---------------------------------------------------------------------------\n const polymarketSafeAddress = polySetupData?.safe_address;\n const polymarketSetupVerified = polySetupData?.verified ?? false;\n\n const {\n data: polymarketBalanceData,\n isLoading: polymarketBalanceLoading,\n isFetching: polymarketBalanceFetching,\n error: polymarketBalanceError,\n } = useBalance(\n { source: \"polymarket\", user: evmAddress ?? \"\" },\n {\n enabled: enabled && polymarketSetupVerified && !!evmAddress,\n refetchInterval: pollingInterval,\n },\n );\n\n // ---------------------------------------------------------------------------\n // Context value\n // ---------------------------------------------------------------------------\n const value = useMemo(\n () => ({\n solanaAddress,\n evmAddress,\n polymarketSafeAddress,\n kalshiUsdcBalance: kalshiBalanceData\n ? Number(kalshiBalanceData.balance)\n : null,\n polymarketUsdcBalance:\n polymarketSetupVerified && polymarketBalanceData\n ? Number(polymarketBalanceData.balance)\n : null,\n kalshiKycVerified: kalshiKycData?.verified ?? false,\n kalshiKycUrl: kalshiKycData?.kyc_url ?? null,\n kalshiKycLoading,\n polymarketSetupVerified,\n polymarketSafeDeployed: polySetupData?.safe_deployed ?? false,\n polymarketTokenApproved: polySetupData?.token_approved ?? false,\n polymarketSetupLoading: polySetupLoading,\n isLoading: kalshiBalanceLoading || polymarketBalanceLoading,\n isFetching: kalshiBalanceFetching || polymarketBalanceFetching,\n error: kalshiBalanceError ?? polymarketBalanceError ?? null,\n }),\n [\n solanaAddress,\n evmAddress,\n polymarketSafeAddress,\n kalshiBalanceData,\n polymarketBalanceData,\n polymarketSetupVerified,\n kalshiKycData,\n kalshiKycLoading,\n polySetupData,\n polySetupLoading,\n kalshiBalanceLoading,\n polymarketBalanceLoading,\n kalshiBalanceFetching,\n polymarketBalanceFetching,\n kalshiBalanceError,\n polymarketBalanceError,\n ],\n );\n\n return (\n <PredictWalletContext.Provider value={value}>\n {children}\n </PredictWalletContext.Provider>\n );\n}\n","import { useState, useContext, useMemo, useCallback, useEffect } from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport confetti from \"canvas-confetti\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type {\n PredictMarket,\n ProviderSource,\n CreateOrderInput,\n PolymarketSigner,\n} from \"@liberfi.io/react-predict\";\nimport {\n useDFlowQuote,\n useDFlowSubmit,\n useOrder,\n usePositions,\n usePredictClient,\n useTickSize,\n PolymarketContext,\n buildPolymarketL2Headers,\n buildCtfExchangeDomain,\n CTF_ORDER_TYPES,\n buildOrderMessage,\n buildSignedOrder,\n buildClobPayload,\n} from \"@liberfi.io/react-predict\";\nimport { Chain, ChainNamespace } from \"@liberfi.io/types\";\nimport { toast } from \"@liberfi.io/ui\";\nimport { SOLANA_TOKENS } from \"@liberfi.io/utils\";\nimport {\n useAuth,\n useWallets,\n useSwitchChain,\n type EvmWalletAdapter,\n} from \"@liberfi.io/wallet-connector\";\nimport { ORDER_MIN_QUANTITY, ORDER_MIN_USDC } from \"../../consts\";\nimport { usePredictWallet } from \"../../providers/PredictWalletProvider\";\n\n// ---------------------------------------------------------------------------\n// Shared form types\n// ---------------------------------------------------------------------------\n\nexport type TradeOutcome = \"yes\" | \"no\";\nexport type TradeSide = \"buy\" | \"sell\";\nexport type OrderType = \"market\" | \"limit\";\nexport type ExpirationPreset = \"5m\" | \"1h\" | \"12h\" | \"24h\" | \"eod\" | \"custom\";\nexport type DurationUnit = \"minutes\" | \"hours\" | \"days\";\n\nexport interface TradeFormValidation {\n isValid: boolean;\n errors: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UseTradeFormParams {\n market: PredictMarket;\n chain?: string;\n initialOutcome?: TradeOutcome;\n initialSide?: TradeSide;\n}\n\nexport interface UseTradeFormResult {\n outcome: TradeOutcome;\n side: TradeSide;\n orderType: OrderType;\n quantity: number;\n limitPrice: number;\n shares: number;\n estimatedCost: number;\n potentialPayout: number;\n potentialProfit: number;\n usdcBalance: number | null;\n yesTokenBalance: number | null;\n noTokenBalance: number | null;\n isBalanceLoading: boolean;\n isSubmitting: boolean;\n validation: TradeFormValidation;\n supportsLimitOrder: boolean;\n kycRequired: boolean;\n kycUrl: string | null;\n setOutcome: (outcome: TradeOutcome) => void;\n setSide: (side: TradeSide) => void;\n setOrderType: (type: OrderType) => void;\n expirationEnabled: boolean;\n expirationPreset: ExpirationPreset;\n customDuration: number;\n customDurationUnit: DurationUnit;\n setQuantity: (quantity: number) => void;\n setLimitPrice: (price: number) => void;\n setExpirationEnabled: (enabled: boolean) => void;\n setExpirationPreset: (preset: ExpirationPreset) => void;\n setCustomDuration: (v: number) => void;\n setCustomDurationUnit: (u: DurationUnit) => void;\n submit: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst DURATION_UNIT_SECONDS: Record<DurationUnit, number> = {\n minutes: 60,\n hours: 3600,\n days: 86400,\n};\n\nfunction resolveExpiration(\n preset: ExpirationPreset,\n customDuration: number,\n customDurationUnit: DurationUnit,\n): number {\n const now = Math.floor(Date.now() / 1000);\n switch (preset) {\n case \"5m\":\n return now + 5 * 60;\n case \"1h\":\n return now + 60 * 60;\n case \"12h\":\n return now + 12 * 60 * 60;\n case \"24h\":\n return now + 24 * 60 * 60;\n case \"eod\": {\n const end = new Date();\n end.setUTCHours(23, 59, 59, 0);\n return Math.floor(end.getTime() / 1000);\n }\n case \"custom\":\n return now + customDuration * DURATION_UNIT_SECONDS[customDurationUnit];\n }\n}\n\nfunction fireCelebration() {\n const defaults = { startVelocity: 30, spread: 360, ticks: 60, zIndex: 9999 };\n confetti({ ...defaults, particleCount: 80, origin: { x: 0.5, y: 0.4 } });\n setTimeout(() => {\n confetti({ ...defaults, particleCount: 40, origin: { x: 0.3, y: 0.6 } });\n }, 150);\n setTimeout(() => {\n confetti({ ...defaults, particleCount: 40, origin: { x: 0.7, y: 0.6 } });\n }, 300);\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useTradeForm({\n market,\n initialOutcome = \"yes\",\n initialSide = \"buy\",\n}: UseTradeFormParams): UseTradeFormResult {\n const { t } = useTranslation();\n const { status: authStatus } = useAuth();\n const wallets = useWallets();\n const switchChain = useSwitchChain();\n const predictClient = usePredictClient();\n const polymarketCtx = useContext(PolymarketContext);\n const queryClient = useQueryClient();\n const source: ProviderSource = market.source;\n const supportsLimitOrder = source === \"polymarket\";\n\n const solanaWallet = wallets.find(\n (w) => w.chainNamespace === ChainNamespace.SOLANA && w.isConnected,\n );\n const evmWallet = wallets.find(\n (w): w is EvmWalletAdapter =>\n w.chainNamespace === ChainNamespace.EVM &&\n w.isConnected &&\n \"switchChain\" in w,\n );\n\n const isAuthenticated = authStatus === \"authenticated\";\n const userPublicKey = solanaWallet?.address;\n const evmAddress = evmWallet?.address;\n\n // ---------------------------------------------------------------------------\n // Polymarket tick size — query the actual tick size for this market's token\n // ---------------------------------------------------------------------------\n const clobTokenId = useMemo(() => {\n if (source !== \"polymarket\") return undefined;\n const raw = market.provider_meta?.[\"polymarket.clobTokenIds\"] as\n | string\n | string[]\n | undefined;\n if (!raw) return undefined;\n const ids = typeof raw === \"string\" ? (JSON.parse(raw) as string[]) : raw;\n return ids[0];\n }, [source, market.provider_meta]);\n\n const { data: tickSizeData } = useTickSize(clobTokenId);\n const tickSize = (\n tickSizeData?.minimum_tick_size\n ? String(tickSizeData.minimum_tick_size)\n : \"0.01\"\n ) as \"0.1\" | \"0.01\" | \"0.001\" | \"0.0001\";\n\n // ---------------------------------------------------------------------------\n // Local state\n // ---------------------------------------------------------------------------\n const [outcome, setOutcomeRaw] = useState<TradeOutcome>(initialOutcome);\n const [side, setSideRaw] = useState<TradeSide>(initialSide);\n const [orderType, setOrderTypeRaw] = useState<OrderType>(\"market\");\n const [quantity, setQuantityRaw] = useState<number>(NaN);\n const [limitPrice, setLimitPriceRaw] = useState<number>(NaN);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [pendingSignature, setPendingSignature] = useState<string | null>(null);\n const [pendingSellCashConvert, setPendingSellCashConvert] = useState<{\n cashAmount: string;\n collateral: string;\n } | null>(null);\n const [kycRequired, setKycRequired] = useState(false);\n const [expirationEnabled, setExpirationEnabled] = useState(false);\n const [expirationPreset, setExpirationPreset] =\n useState<ExpirationPreset>(\"1h\");\n const [customDuration, setCustomDuration] = useState(30);\n const [customDurationUnit, setCustomDurationUnit] =\n useState<DurationUnit>(\"minutes\");\n\n // ---------------------------------------------------------------------------\n // USDC balances from context\n // ---------------------------------------------------------------------------\n let contextBalance: {\n kalshiUsdcBalance: number | null;\n polymarketUsdcBalance: number | null;\n isLoading: boolean;\n } | null = null;\n let contextKycVerified = false;\n let contextKycUrl: string | null = null;\n let contextSafeAddress: string | undefined;\n try {\n const ctx = usePredictWallet();\n contextBalance = {\n kalshiUsdcBalance: ctx.kalshiUsdcBalance,\n polymarketUsdcBalance: ctx.polymarketUsdcBalance,\n isLoading: ctx.isLoading,\n };\n contextKycVerified = ctx.kalshiKycVerified;\n contextKycUrl = ctx.kalshiKycUrl;\n contextSafeAddress = ctx.polymarketSafeAddress;\n } catch {\n // Provider not mounted — fall back to local position query\n }\n\n // ---------------------------------------------------------------------------\n // Price per share from market outcomes\n // ---------------------------------------------------------------------------\n const pricePerShare = useMemo(() => {\n const idx = outcome === \"yes\" ? 0 : 1;\n const o = market.outcomes[idx];\n return side === \"buy\"\n ? (o?.best_ask ?? o?.price ?? 0.5)\n : (o?.best_bid ?? o?.price ?? 0.5);\n }, [market.outcomes, outcome, side]);\n\n const setOrderType = useCallback((type: OrderType) => {\n setOrderTypeRaw(type);\n }, []);\n\n const setOutcome = useCallback((o: TradeOutcome) => {\n setOutcomeRaw(o);\n setLimitPriceRaw(NaN);\n }, []);\n\n useEffect(() => {\n if (orderType === \"limit\" && isNaN(limitPrice)) {\n setLimitPriceRaw(Math.round(pricePerShare * 100) / 100);\n }\n }, [orderType, limitPrice, pricePerShare]);\n\n const shares = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return 0;\n return side === \"buy\"\n ? pricePerShare > 0\n ? quantity / pricePerShare\n : 0\n : quantity;\n }, [side, quantity, pricePerShare]);\n\n const amountStr = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return \"0\";\n return String(Math.round(quantity * 1_000_000));\n }, [quantity]);\n\n // ---------------------------------------------------------------------------\n // DFlow mints (only used when source === \"kalshi\")\n // ---------------------------------------------------------------------------\n const yesMint = (market.provider_meta?.[\"dflow.yesMint\"] as string) ?? \"\";\n const noMint = (market.provider_meta?.[\"dflow.noMint\"] as string) ?? \"\";\n const usdcMint = SOLANA_TOKENS.stablecoins.USDC.address;\n const collateralMint =\n (market.provider_meta?.[\"dflow.collateralMint\"] as string) || \"\";\n const marketOutcomeMint = outcome === \"yes\" ? yesMint : noMint;\n\n // ---------------------------------------------------------------------------\n // Positions for share balances (fallback when context not available)\n // ---------------------------------------------------------------------------\n const positionUser =\n source === \"kalshi\" ? (userPublicKey ?? \"\") : (evmAddress ?? \"\");\n\n const { data: positionsData, isLoading: positionsLoading } = usePositions(\n { source, user: positionUser },\n { enabled: Boolean(positionUser) },\n );\n\n // ---------------------------------------------------------------------------\n // DFlow sell mint resolution — use position's actual on-chain outcome mint\n // stored in market.provider_meta by the positions API enrichment.\n // A market may have multiple collateral pools with different outcome mints;\n // dflow.outcomeMint carries the one the user actually holds.\n // ---------------------------------------------------------------------------\n const matchingPosition = useMemo(() => {\n if (!positionsData || side !== \"sell\") return null;\n return (\n positionsData.positions.find(\n (p) =>\n p.side?.toLowerCase() === outcome && p.market?.slug === market.slug,\n ) ?? null\n );\n }, [positionsData, market.slug, outcome, side]);\n\n const positionMarketMeta = matchingPosition?.market?.provider_meta;\n const effectiveOutcomeMint =\n (side === \"sell\" &&\n (positionMarketMeta?.[\"dflow.outcomeMint\"] as string)) ||\n marketOutcomeMint;\n const effectiveCollateral =\n (side === \"sell\" &&\n (positionMarketMeta?.[\"dflow.collateralMint\"] as string)) ||\n collateralMint;\n\n // Buy: USDC → outcome\n // Sell: outcome → collateral (USDC or CASH depending on collateral pool)\n const inputMint = side === \"buy\" ? usdcMint : effectiveOutcomeMint;\n const outputMint =\n side === \"buy\" ? marketOutcomeMint : effectiveCollateral || usdcMint;\n\n // ---------------------------------------------------------------------------\n // DFlow quote (only enabled for dflow source)\n // ---------------------------------------------------------------------------\n const quoteEnabled =\n source === \"kalshi\" &&\n Boolean(inputMint) &&\n Boolean(outputMint) &&\n Boolean(userPublicKey) &&\n amountStr !== \"0\";\n\n const { refetch: refetchQuote } = useDFlowQuote(\n {\n inputMint,\n outputMint,\n amount: amountStr,\n userPublicKey: userPublicKey ?? \"\",\n slippageBps: 100,\n },\n { enabled: quoteEnabled },\n );\n\n // ---------------------------------------------------------------------------\n // Resolved balances\n // ---------------------------------------------------------------------------\n const usdcBalance = useMemo(() => {\n if (contextBalance) {\n return source === \"kalshi\"\n ? contextBalance.kalshiUsdcBalance\n : contextBalance.polymarketUsdcBalance;\n }\n if (!positionsData) return null;\n const total = positionsData.positions.reduce((sum, p) => {\n if (p.side === \"USDC\" || p.side === \"collateral\")\n return sum + (p.current_value ?? 0);\n return sum;\n }, 0);\n return total || null;\n }, [contextBalance, positionsData, source]);\n\n const isBalanceLoading = contextBalance\n ? contextBalance.isLoading\n : positionsLoading;\n\n const yesTokenBalance = useMemo(() => {\n if (!positionsData) return null;\n const pos = positionsData.positions.find(\n (p) => p.side?.toLowerCase() === \"yes\" && p.market?.slug === market.slug,\n );\n return pos?.size ?? 0;\n }, [positionsData, market.slug]);\n\n const noTokenBalance = useMemo(() => {\n if (!positionsData) return null;\n const pos = positionsData.positions.find(\n (p) => p.side?.toLowerCase() === \"no\" && p.market?.slug === market.slug,\n );\n return pos?.size ?? 0;\n }, [positionsData, market.slug]);\n\n // ---------------------------------------------------------------------------\n // Cost / payout\n // ---------------------------------------------------------------------------\n const effectivePrice = useMemo(() => {\n if (orderType === \"limit\" && supportsLimitOrder && !isNaN(limitPrice)) {\n return limitPrice;\n }\n return pricePerShare;\n }, [orderType, supportsLimitOrder, limitPrice, pricePerShare]);\n\n const estimatedCost = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return 0;\n if (side === \"buy\") return quantity;\n const bidPrice =\n outcome === \"yes\"\n ? (market.outcomes[0]?.best_bid ?? 0)\n : (market.outcomes[1]?.best_bid ?? 0);\n return quantity * bidPrice;\n }, [side, outcome, quantity, market.outcomes]);\n\n const potentialPayout = useMemo(() => {\n if (isNaN(quantity) || quantity <= 0) return 0;\n if (side === \"buy\") {\n return effectivePrice > 0 ? (quantity / effectivePrice) * 1 : 0;\n }\n return estimatedCost;\n }, [side, quantity, effectivePrice, estimatedCost]);\n\n const potentialProfit = potentialPayout - estimatedCost;\n\n // ---------------------------------------------------------------------------\n // Setters\n // ---------------------------------------------------------------------------\n const setSide = useCallback((s: TradeSide) => {\n setSideRaw(s);\n setQuantityRaw(NaN);\n }, []);\n\n const setQuantity = useCallback(\n (v: number) => {\n if (isNaN(v)) {\n setQuantityRaw(NaN);\n return;\n }\n const clamped = Math.max(0, v);\n const rounded =\n side === \"buy\" ? Math.round(clamped * 100) / 100 : Math.round(clamped);\n setQuantityRaw(rounded);\n },\n [side],\n );\n\n const setLimitPrice = useCallback((v: number) => {\n if (isNaN(v)) {\n setLimitPriceRaw(NaN);\n return;\n }\n const clamped = Math.max(0.01, Math.min(0.99, v));\n setLimitPriceRaw(Math.round(clamped * 100) / 100);\n }, []);\n\n const resetForm = useCallback(() => {\n setQuantityRaw(NaN);\n setLimitPriceRaw(NaN);\n setOrderTypeRaw(\"market\");\n setExpirationEnabled(false);\n setExpirationPreset(\"1h\");\n setCustomDuration(30);\n setCustomDurationUnit(\"minutes\");\n }, []);\n\n // ---------------------------------------------------------------------------\n // Validation\n // ---------------------------------------------------------------------------\n const validation = useMemo<TradeFormValidation>(() => {\n const errors: string[] = [];\n if (isNaN(quantity) || quantity <= 0) {\n if (side === \"buy\") {\n errors.push(\n t(\"predict.trade.minAmountUsd\", { amount: ORDER_MIN_USDC }),\n );\n } else {\n errors.push(\n t(\"predict.trade.minQuantity\", { amount: ORDER_MIN_QUANTITY }),\n );\n }\n } else if (side === \"buy\" && quantity < ORDER_MIN_USDC) {\n errors.push(t(\"predict.trade.minAmountUsd\", { amount: ORDER_MIN_USDC }));\n } else if (side === \"sell\" && quantity < ORDER_MIN_QUANTITY) {\n errors.push(\n t(\"predict.trade.minQuantity\", { amount: ORDER_MIN_QUANTITY }),\n );\n }\n if (market.status !== \"open\") {\n errors.push(t(\"predict.trade.marketNotActive\"));\n }\n if (\n side === \"buy\" &&\n usdcBalance != null &&\n !isNaN(quantity) &&\n quantity > 0 &&\n quantity > usdcBalance\n ) {\n errors.push(t(\"predict.trade.insufficientBalance\"));\n }\n const holdingBalance = outcome === \"yes\" ? yesTokenBalance : noTokenBalance;\n if (\n side === \"sell\" &&\n holdingBalance != null &&\n !isNaN(quantity) &&\n quantity > 0 &&\n quantity > holdingBalance\n ) {\n errors.push(t(\"predict.trade.insufficientShares\"));\n }\n if (\n orderType === \"limit\" &&\n supportsLimitOrder &&\n (isNaN(limitPrice) || limitPrice < 0.01 || limitPrice > 0.99)\n ) {\n errors.push(t(\"predict.trade.limitPriceRange\"));\n }\n if (\n orderType === \"limit\" &&\n supportsLimitOrder &&\n expirationEnabled &&\n expirationPreset === \"custom\" &&\n (isNaN(customDuration) || customDuration <= 0)\n ) {\n errors.push(t(\"predict.trade.expiration.invalidDate\"));\n }\n return { isValid: errors.length === 0, errors };\n }, [\n quantity,\n market.status,\n side,\n source,\n usdcBalance,\n yesTokenBalance,\n noTokenBalance,\n outcome,\n orderType,\n supportsLimitOrder,\n limitPrice,\n expirationEnabled,\n expirationPreset,\n customDuration,\n t,\n ]);\n\n // ---------------------------------------------------------------------------\n // DFlow submit mutation\n // ---------------------------------------------------------------------------\n const { mutateAsync: submitDFlow } = useDFlowSubmit();\n\n // ---------------------------------------------------------------------------\n // Polymarket: context is optional (null when PolymarketProvider is absent)\n // ---------------------------------------------------------------------------\n\n // ---------------------------------------------------------------------------\n // Poll order status for pending DFlow signature\n // ---------------------------------------------------------------------------\n const { data: orderStatus } = useOrder(\n { id: pendingSignature ?? \"\", source },\n { enabled: Boolean(pendingSignature) },\n );\n\n const convertCashToUsdc = useCallback(async () => {\n if (!pendingSellCashConvert || !userPublicKey || !solanaWallet) return;\n const { cashAmount, collateral } = pendingSellCashConvert;\n setPendingSellCashConvert(null);\n\n try {\n const cashQuote = await predictClient.createDFlowQuote({\n inputMint: collateral,\n outputMint: usdcMint,\n amount: cashAmount,\n userPublicKey,\n slippageBps: 100,\n });\n const cashTx = (cashQuote as Record<string, unknown>)?.transaction as\n | string\n | undefined;\n if (!cashTx) return;\n\n const txBytes = Uint8Array.from(atob(cashTx), (c) => c.charCodeAt(0));\n const signedTxBytes = await solanaWallet.signTransaction(txBytes);\n await submitDFlow({\n signedTransaction: btoa(String.fromCharCode(...signedTxBytes)),\n orderContext: {\n user_public_key: userPublicKey,\n input_mint: collateral,\n output_mint: usdcMint,\n amount: cashAmount,\n price: \"1\",\n side: \"SELL\",\n outcome: \"\",\n market_slug: \"\",\n slippage_bps: 100,\n },\n });\n } catch (err) {\n console.error(\"[TradeForm] CASH→USDC conversion failed:\", err);\n }\n }, [\n pendingSellCashConvert,\n userPublicKey,\n solanaWallet,\n predictClient,\n submitDFlow,\n usdcMint,\n ]);\n\n useEffect(() => {\n if (!orderStatus || !pendingSignature) return;\n const { status } = orderStatus;\n if (status === \"closed\") {\n setPendingSignature(null);\n if (pendingSellCashConvert) {\n // Sell confirmed — auto-convert CASH → USDC before showing success\n convertCashToUsdc().finally(() => {\n setIsSubmitting(false);\n toast.success(t(\"predict.trade.submitSuccess\"));\n fireCelebration();\n resetForm();\n });\n } else {\n setIsSubmitting(false);\n toast.success(t(\"predict.trade.submitSuccess\"));\n fireCelebration();\n resetForm();\n }\n } else if (status === \"failed\" || status === \"expired\") {\n setIsSubmitting(false);\n setPendingSignature(null);\n setPendingSellCashConvert(null);\n toast.error(t(\"predict.trade.submitError\"));\n }\n }, [\n orderStatus,\n pendingSignature,\n pendingSellCashConvert,\n convertCashToUsdc,\n resetForm,\n t,\n ]);\n\n // ---------------------------------------------------------------------------\n // Submit — routes to DFlow or Polymarket based on source\n // ---------------------------------------------------------------------------\n const submitDFlowOrder = useCallback(async () => {\n if (!userPublicKey || !solanaWallet) return;\n\n if (!inputMint || !outputMint) {\n toast.error(\"Missing token mint addresses\");\n setIsSubmitting(false);\n return;\n }\n\n if (!contextKycVerified) {\n setKycRequired(true);\n setIsSubmitting(false);\n return;\n }\n\n const quoteResult = await refetchQuote();\n const quote = quoteResult.data;\n const quoteRecord = quote as Record<string, unknown> | undefined;\n const transaction = quoteRecord?.transaction as string | undefined;\n\n if (!transaction) {\n toast.error(t(\"predict.trade.submitError\"));\n setIsSubmitting(false);\n return;\n }\n\n // For sells to non-USDC collateral (e.g. CASH), track the outAmount\n // so we can auto-convert collateral→USDC after the sell completes.\n if (\n side === \"sell\" &&\n effectiveCollateral &&\n effectiveCollateral !== usdcMint\n ) {\n const outAmount = String(quoteRecord?.outAmount ?? \"\");\n if (outAmount && outAmount !== \"0\") {\n setPendingSellCashConvert({\n cashAmount: outAmount,\n collateral: effectiveCollateral,\n });\n }\n }\n\n const txBytes = Uint8Array.from(atob(transaction), (c) => c.charCodeAt(0));\n const signedTxBytes = await solanaWallet.signTransaction(txBytes);\n\n const result = await submitDFlow({\n signedTransaction: btoa(String.fromCharCode(...signedTxBytes)),\n orderContext: {\n user_public_key: userPublicKey,\n input_mint: inputMint,\n output_mint: outputMint,\n amount: amountStr,\n price: String(pricePerShare),\n side: side === \"buy\" ? \"BUY\" : \"SELL\",\n outcome: outcome === \"yes\" ? \"YES\" : \"NO\",\n market_slug: market.slug,\n slippage_bps: 100,\n },\n });\n\n setPendingSignature(result.signature);\n }, [\n userPublicKey,\n solanaWallet,\n predictClient,\n refetchQuote,\n submitDFlow,\n inputMint,\n outputMint,\n amountStr,\n pricePerShare,\n side,\n outcome,\n market.slug,\n effectiveCollateral,\n usdcMint,\n t,\n ]);\n\n const submitPolymarketOrder = useCallback(async () => {\n if (!evmWallet || !polymarketCtx) return;\n\n // Switch to Polygon before submitting; restore original chain afterwards\n const previousChain = evmWallet.chain;\n const needsSwitch = previousChain !== Chain.POLYGON;\n if (needsSwitch) {\n await switchChain(Chain.POLYGON);\n }\n\n try {\n const provider = await evmWallet.getEip1193Provider();\n if (!provider) {\n toast.error(t(\"predict.trade.submitError\"));\n setIsSubmitting(false);\n return;\n }\n\n const usesSafe = !!contextSafeAddress;\n const signer: PolymarketSigner = {\n address: evmWallet.address,\n signatureType: usesSafe ? 2 : 0,\n signTypedData: async (domain, types, primaryType, value) => {\n const domainFields: { name: string; type: string }[] = [];\n if (\"name\" in domain)\n domainFields.push({ name: \"name\", type: \"string\" });\n if (\"version\" in domain)\n domainFields.push({ name: \"version\", type: \"string\" });\n if (\"chainId\" in domain)\n domainFields.push({ name: \"chainId\", type: \"uint256\" });\n if (\"verifyingContract\" in domain)\n domainFields.push({ name: \"verifyingContract\", type: \"address\" });\n if (\"salt\" in domain)\n domainFields.push({ name: \"salt\", type: \"bytes32\" });\n\n const fullTypes = { EIP712Domain: domainFields, ...types };\n\n return (await provider.request({\n method: \"eth_signTypedData_v4\",\n params: [\n evmWallet.address,\n JSON.stringify({\n domain,\n types: fullTypes,\n primaryType,\n message: value,\n }),\n ],\n })) as string;\n },\n };\n\n const creds =\n polymarketCtx.credentials ?? (await polymarketCtx.authenticate(signer));\n\n const tokenIdx = outcome === \"yes\" ? 0 : 1;\n let tokenId = \"\";\n const rawClobTokenIds = market.provider_meta?.[\n \"polymarket.clobTokenIds\"\n ] as string | string[] | undefined;\n if (rawClobTokenIds) {\n const ids =\n typeof rawClobTokenIds === \"string\"\n ? (JSON.parse(rawClobTokenIds) as string[])\n : rawClobTokenIds;\n tokenId = ids[tokenIdx] ?? \"\";\n }\n\n const negRisk =\n (market.provider_meta?.[\"polymarket.negRisk\"] as boolean) ?? false;\n\n const price =\n orderType === \"limit\" && !isNaN(limitPrice)\n ? limitPrice\n : pricePerShare;\n\n const polyOrderType =\n orderType === \"limit\" ? (expirationEnabled ? \"GTD\" : \"GTC\") : \"FOK\";\n\n const sizeInShares =\n side === \"buy\" && price > 0 ? quantity / price : quantity;\n\n const input: CreateOrderInput = {\n tokenId,\n price,\n size: sizeInShares,\n side: side === \"buy\" ? \"BUY\" : \"SELL\",\n orderType: polyOrderType,\n tickSize,\n negRisk,\n ...(contextSafeAddress && { funderAddress: contextSafeAddress }),\n ...(orderType === \"limit\" &&\n expirationEnabled && {\n expiration: resolveExpiration(\n expirationPreset,\n customDuration,\n customDurationUnit,\n ),\n }),\n };\n\n const domain = buildCtfExchangeDomain(negRisk);\n const orderMessage = buildOrderMessage({\n ...input,\n signerAddress: signer.address,\n signatureType: signer.signatureType,\n });\n const signature = await signer.signTypedData(\n domain,\n CTF_ORDER_TYPES as unknown as Record<string, unknown[]>,\n \"Order\",\n orderMessage as unknown as Record<string, unknown>,\n );\n const signedOrder = buildSignedOrder(\n orderMessage,\n signature,\n input.orderType,\n );\n\n // Convert to CLOB payload format (numeric salt, string side, deferExec).\n const clobPayload = buildClobPayload(signedOrder, creds.apiKey);\n\n const body = JSON.stringify(clobPayload);\n const headers = await buildPolymarketL2Headers(creds.address, {\n apiKey: creds.apiKey,\n secret: creds.secret,\n passphrase: creds.passphrase,\n method: \"POST\",\n requestPath: \"/order\",\n body,\n });\n\n await predictClient.createPolymarketOrder(\n clobPayload as unknown as CreateOrderInput,\n headers as unknown as Record<string, string>,\n );\n\n queryClient.invalidateQueries({ queryKey: [\"predict\", \"orders\"] });\n queryClient.invalidateQueries({ queryKey: [\"predict\", \"positions\"] });\n\n toast.success(t(\"predict.trade.submitSuccess\"));\n fireCelebration();\n resetForm();\n setIsSubmitting(false);\n } finally {\n if (needsSwitch && previousChain) {\n switchChain(previousChain).catch(() => {});\n }\n }\n }, [\n evmWallet,\n polymarketCtx,\n switchChain,\n outcome,\n market.provider_meta,\n orderType,\n limitPrice,\n pricePerShare,\n quantity,\n side,\n predictClient,\n queryClient,\n expirationEnabled,\n expirationPreset,\n customDuration,\n customDurationUnit,\n resetForm,\n t,\n ]);\n\n const submit = useCallback(async () => {\n if (!validation.isValid || !isAuthenticated) return;\n\n setIsSubmitting(true);\n setPendingSignature(null);\n setKycRequired(false);\n\n try {\n if (source === \"kalshi\") {\n await submitDFlowOrder();\n } else {\n await submitPolymarketOrder();\n }\n } catch (err) {\n console.error(\"[TradeForm] submit failed:\", err);\n const detail = err instanceof Error ? err.message : undefined;\n toast.error(detail || t(\"predict.trade.submitError\"));\n setIsSubmitting(false);\n }\n }, [\n validation.isValid,\n isAuthenticated,\n source,\n submitDFlowOrder,\n submitPolymarketOrder,\n t,\n ]);\n\n return {\n outcome,\n side,\n orderType,\n quantity,\n limitPrice,\n shares,\n estimatedCost,\n potentialPayout,\n potentialProfit,\n usdcBalance,\n yesTokenBalance,\n noTokenBalance,\n isBalanceLoading,\n isSubmitting,\n validation,\n supportsLimitOrder,\n kycRequired,\n kycUrl: contextKycUrl,\n expirationEnabled,\n expirationPreset,\n customDuration,\n customDurationUnit,\n setOutcome,\n setSide,\n setOrderType,\n setQuantity,\n setLimitPrice,\n setExpirationEnabled,\n setExpirationPreset,\n setCustomDuration,\n setCustomDurationUnit,\n submit,\n };\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport { StyledModal, ModalContent } from \"@liberfi.io/ui\";\n\nexport interface KycModalProps {\n isOpen: boolean;\n onClose: () => void;\n kycUrl: string | null;\n}\n\nexport function KycModal({ isOpen, onClose, kycUrl }: KycModalProps) {\n const { t } = useTranslation();\n\n return (\n <StyledModal\n isOpen={isOpen}\n onOpenChange={(open) => {\n if (!open) onClose();\n }}\n size=\"md\"\n classNames={{\n base: \"!bg-[#18181b] !rounded-[14px] !border !border-[rgba(39,39,42,1)] !shadow-[0_25px_50px_-12px_rgba(0,0,0,0.5)]\",\n body: \"!p-0\",\n }}\n >\n <ModalContent>\n <div>\n {/* Header */}\n <div className=\"flex items-center justify-between px-5 pt-5 pb-4\">\n <h3 className=\"text-base font-semibold text-white\">\n {t(\"predict.trade.kycModalTitle\")}\n </h3>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"p-1 rounded-[10px] hover:bg-[rgba(39,39,42,0.5)] text-zinc-400 hover:text-white transition-colors cursor-pointer focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n >\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n\n {/* Body */}\n <div className=\"px-5 pb-5\">\n <p className=\"text-[13px] text-zinc-400 mb-4 text-left\">\n {t(\"predict.trade.kycModalDescription\")}\n </p>\n\n {/* Checklist */}\n <div className=\"flex flex-col gap-2 mb-4\">\n {(\n [\n \"predict.trade.kycModalBullet1\",\n \"predict.trade.kycModalBullet2\",\n \"predict.trade.kycModalBullet3\",\n ] as const\n ).map((key) => (\n <div\n key={key}\n className=\"flex items-center gap-2.5 text-[13px] text-zinc-300\"\n >\n <svg\n width={14}\n height={14}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"text-[#c7ff2e] shrink-0\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n <span>{t(key)}</span>\n </div>\n ))}\n </div>\n\n {/* KYC link */}\n {kycUrl && (\n <a\n href={kycUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1 text-[13px] text-[#c7ff2e]/70 hover:text-[#c7ff2e] transition-colors mb-3\"\n >\n {t(\"predict.trade.goToKYC\")} →\n </a>\n )}\n\n <p className=\"text-[11px] text-zinc-500 mb-5\">\n {t(\"predict.trade.kycModalNote\")}\n </p>\n\n {/* OK button */}\n <button\n type=\"button\"\n onClick={onClose}\n className=\"w-full py-2.5 rounded-[10px] bg-[#c7ff2e] text-zinc-900 text-sm font-semibold hover:bg-[#c7ff2e]/90 transition-colors cursor-pointer focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n >\n {t(\"common.ok\")}\n </button>\n </div>\n </div>\n </ModalContent>\n </StyledModal>\n );\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n ChevronDownIcon,\n Tabs,\n Tab,\n StyledInput,\n StyledNumberInput,\n Spinner,\n Select,\n SelectItem,\n StyledSwitch,\n useDisclosure,\n cn,\n} from \"@liberfi.io/ui\";\nimport { SOLANA_TOKENS } from \"@liberfi.io/utils\";\nimport type { StandardEvent, StandardMarket } from \"../../types\";\nimport { KycModal } from \"../kyc-modal\";\nimport type {\n TradeSide,\n TradeOutcome,\n OrderType,\n ExpirationPreset,\n DurationUnit,\n} from \"./trade-form.script\";\n\nconst USDC_LOGO = `https://s1.chainstream.io/chains/sol/tokens/${SOLANA_TOKENS.stablecoins.USDC.address}/image.png`;\n\nconst EXPIRATION_PRESETS: ExpirationPreset[] = [\n \"5m\",\n \"1h\",\n \"12h\",\n \"24h\",\n \"eod\",\n \"custom\",\n];\n\nconst EXPIRATION_PRESET_I18N = {\n \"5m\": \"predict.trade.expiration.5m\",\n \"1h\": \"predict.trade.expiration.1h\",\n \"12h\": \"predict.trade.expiration.12h\",\n \"24h\": \"predict.trade.expiration.24h\",\n eod: \"predict.trade.expiration.eod\",\n custom: \"predict.trade.expiration.custom\",\n} as const;\n\nconst DURATION_UNITS: DurationUnit[] = [\"minutes\", \"hours\", \"days\"];\n\nconst DURATION_UNIT_I18N = {\n minutes: \"predict.trade.expiration.minutes\",\n hours: \"predict.trade.expiration.hours\",\n days: \"predict.trade.expiration.days\",\n} as const;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface TradeFormUIProps {\n event?: StandardEvent;\n market: StandardMarket;\n /** \"bordered\" (default) renders with border + rounded container; \"flat\" omits border (e.g. inside a modal). */\n variant?: \"bordered\" | \"flat\";\n outcome: TradeOutcome;\n side: TradeSide;\n orderType: OrderType;\n quantity: number;\n limitPrice: number;\n shares: number;\n estimatedCost: number;\n potentialPayout: number;\n potentialProfit: number;\n isSubmitting: boolean;\n usdcBalance: number | null;\n yesTokenBalance: number | null;\n noTokenBalance: number | null;\n isBalanceLoading: boolean;\n isValid: boolean;\n validationErrors: string[];\n supportsLimitOrder: boolean;\n kycRequired: boolean;\n kycUrl: string | null;\n expirationEnabled: boolean;\n expirationPreset: ExpirationPreset;\n customDuration: number;\n customDurationUnit: DurationUnit;\n onOutcomeChange: (outcome: TradeOutcome) => void;\n onSideChange: (side: TradeSide) => void;\n onOrderTypeChange: (type: OrderType) => void;\n onQuantityChange: (quantity: number) => void;\n onLimitPriceChange: (price: number) => void;\n onExpirationEnabledChange: (enabled: boolean) => void;\n onExpirationPresetChange: (preset: ExpirationPreset) => void;\n onCustomDurationChange: (v: number) => void;\n onCustomDurationUnitChange: (u: DurationUnit) => void;\n onSubmit: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function TradeFormUI({\n event,\n market,\n variant = \"bordered\",\n outcome,\n side,\n orderType,\n quantity,\n limitPrice,\n shares,\n potentialProfit,\n potentialPayout,\n estimatedCost,\n usdcBalance,\n yesTokenBalance,\n noTokenBalance,\n isBalanceLoading,\n isSubmitting,\n isValid,\n validationErrors,\n supportsLimitOrder,\n kycRequired,\n kycUrl,\n expirationEnabled,\n expirationPreset,\n customDuration,\n customDurationUnit,\n onOutcomeChange,\n onSideChange,\n onOrderTypeChange,\n onQuantityChange,\n onLimitPriceChange,\n onExpirationEnabledChange,\n onExpirationPresetChange,\n onCustomDurationChange,\n onCustomDurationUnitChange,\n onSubmit,\n}: TradeFormUIProps) {\n const { t } = useTranslation();\n const [showOdds, setShowOdds] = useState(false);\n const kycModal = useDisclosure();\n\n // ---------------------------------------------------------------------------\n // Local string state for the quantity input.\n // HeroUI NumberInput's onValueChange only fires on commit (blur/Enter),\n // so external re-renders (e.g. WebSocket price updates) would reset the\n // display back to the stale controlled value while the user is typing.\n // Using a plain text input with local string state avoids this entirely.\n // ---------------------------------------------------------------------------\n const [quantityText, setQuantityText] = useState(\"\");\n const quantityFocusedRef = useRef(false);\n const prevSideRef = useRef(side);\n\n // Sync display text from parent value when not focused\n // (handles Half / Max / Reset / external changes)\n useEffect(() => {\n if (!quantityFocusedRef.current) {\n setQuantityText(isNaN(quantity) ? \"\" : String(quantity));\n }\n }, [quantity]);\n\n // Reset local text on side switch\n useEffect(() => {\n if (side !== prevSideRef.current) {\n prevSideRef.current = side;\n setQuantityText(\"\");\n }\n }, [side]);\n\n const handleQuantityInput = useCallback(\n (val: string) => {\n const pattern = side === \"buy\" ? /^\\d*\\.?\\d{0,2}$/ : /^\\d*$/;\n if (val !== \"\" && !pattern.test(val)) return;\n setQuantityText(val);\n setShowErrors(false);\n\n if (val === \"\" || val === \".\") {\n onQuantityChange(NaN);\n return;\n }\n const parsed = parseFloat(val);\n if (!isNaN(parsed)) {\n onQuantityChange(parsed);\n }\n },\n [side, onQuantityChange],\n );\n\n useEffect(() => {\n if (kycRequired && !kycModal.isOpen) {\n kycModal.onOpen();\n }\n }, [kycRequired]);\n\n const currentPriceCents = useMemo(() => {\n const price =\n side === \"buy\"\n ? outcome === \"yes\"\n ? market.yesAsk\n : market.noAsk\n : outcome === \"yes\"\n ? market.yesBid\n : market.noBid;\n return price != null ? parseFloat((Number(price) * 100).toFixed(2)) : null;\n }, [side, outcome, market]);\n\n const hasAmount = !isNaN(quantity) && quantity > 0;\n\n const submitLabel = useMemo(() => {\n if (isBalanceLoading) return t(\"predict.trade.loadingBalance\");\n if (isSubmitting) return t(\"predict.trade.submitting\");\n if (kycRequired) return t(\"predict.trade.kycRequired\");\n if (!hasAmount) return t(\"predict.trade.enterAmount\");\n const sideLabel =\n side === \"buy\" ? t(\"predict.trade.buy\") : t(\"predict.trade.sell\");\n const outcomeLabel =\n outcome === \"yes\" ? t(\"predict.trade.yes\") : t(\"predict.trade.no\");\n const winAmount =\n side === \"buy\" && potentialProfit > 0\n ? ` → Win $${potentialProfit.toFixed(2)}`\n : \"\";\n return `${sideLabel} ${outcomeLabel}${winAmount}`;\n }, [\n isBalanceLoading,\n isSubmitting,\n kycRequired,\n hasAmount,\n side,\n outcome,\n potentialProfit,\n t,\n ]);\n\n const submitColor = useMemo(() => {\n return outcome === \"yes\" ? \"primary\" : \"secondary\";\n }, [outcome]);\n\n const handleHalf = () => {\n const bal = usdcBalance ?? 0;\n onQuantityChange(Math.floor((bal / 2) * 100) / 100);\n };\n const handleMax = () => {\n onQuantityChange(usdcBalance ?? 0);\n };\n\n const [showErrors, setShowErrors] = useState(false);\n\n const handleSubmitPress = () => {\n if (kycRequired) {\n kycModal.onOpen();\n return;\n }\n if (!isValid) {\n setShowErrors(true);\n return;\n }\n setShowErrors(false);\n onSubmit();\n };\n\n return (\n <>\n <div\n className=\"flex w-full flex-col gap-y-4 p-4\"\n style={\n variant === \"bordered\"\n ? {\n borderRadius: 14,\n border: \"1px solid rgba(39,39,42,0.6)\",\n background: \"rgba(24,24,27,0.4)\",\n transition: \"border-color 0.2s\",\n }\n : undefined\n }\n onMouseEnter={(e) => {\n if (variant === \"bordered\") {\n e.currentTarget.style.borderColor = \"rgba(63,63,70,0.8)\";\n }\n }}\n onMouseLeave={(e) => {\n if (variant === \"bordered\") {\n e.currentTarget.style.borderColor = \"rgba(39,39,42,0.6)\";\n }\n }}\n >\n {/* Event title bar */}\n {event && (\n <div className=\"flex items-center gap-x-3\">\n {event.imageUrl && (\n <img\n src={event.imageUrl}\n alt={event.title}\n className=\"h-10 w-10 shrink-0 rounded-lg object-cover\"\n />\n )}\n <div className=\"flex min-w-0 flex-col gap-y-0.5\">\n <span className=\"text-sm text-neutral-500 leading-tight line-clamp-1\">\n {event.title}\n </span>\n <span className=\"text-base font-semibold leading-tight line-clamp-1\">\n <span\n className={\n outcome === \"yes\" ? \"text-bullish\" : \"text-bearish\"\n }\n >\n {side === \"buy\"\n ? t(\"predict.trade.buy\")\n : t(\"predict.trade.sell\")}{\" \"}\n {outcome === \"yes\"\n ? t(\"predict.trade.yes\")\n : t(\"predict.trade.no\")}\n </span>\n <span className=\"text-foreground\">\n {\" · \"}\n {market.yesSubTitle}\n </span>\n </span>\n </div>\n </div>\n )}\n\n {/* Market/Limit order-type tabs + current price */}\n <div className=\"flex items-center justify-between\">\n {supportsLimitOrder ? (\n <Tabs\n variant=\"underlined\"\n selectedKey={orderType}\n onSelectionChange={(key) => onOrderTypeChange(key as OrderType)}\n classNames={{\n tabList: \"gap-x-4\",\n tab: \"px-0\",\n }}\n >\n <Tab key=\"market\" title={t(\"predict.trade.market\")} />\n <Tab key=\"limit\" title={t(\"predict.trade.limit\")} />\n </Tabs>\n ) : (\n <span className=\"text-sm font-medium text-foreground\">\n {t(\"predict.trade.market\")}\n </span>\n )}\n {orderType === \"limit\" && supportsLimitOrder ? (\n <StyledNumberInput\n aria-label=\"Limit price\"\n placeholder=\"50\"\n size=\"sm\"\n radius=\"none\"\n value={\n isNaN(limitPrice)\n ? undefined\n : parseFloat((limitPrice * 100).toFixed(2))\n }\n onValueChange={(v) => onLimitPriceChange(v / 100)}\n minValue={1}\n maxValue={99}\n step={1}\n formatOptions={{ maximumFractionDigits: 2 }}\n endContent={\n <span className=\"text-xl font-bold tabular-nums text-foreground\">\n ¢\n </span>\n }\n classNames={{\n base: \"w-28\",\n inputWrapper:\n \"bg-content2 data-[hover=true]:bg-content2 group-data-[focus=true]:bg-content2 rounded-lg px-2 h-9 min-h-9\",\n input: \"text-xl font-bold tabular-nums text-right\",\n }}\n />\n ) : (\n currentPriceCents != null && (\n <span className=\"text-xl font-bold tabular-nums\">\n {currentPriceCents} ¢\n </span>\n )\n )}\n </div>\n\n {/* TODO: unhide when sell flow is ready */}\n {/* <Tabs\n variant=\"underlined\"\n selectedKey={side}\n onSelectionChange={(key) => onSideChange(key as TradeSide)}\n classNames={{\n tabList: \"gap-x-4\",\n tab: \"px-0\",\n }}\n >\n <Tab key=\"buy\" title={t(\"predict.trade.buy\")} />\n <Tab key=\"sell\" title={t(\"predict.trade.sell\")} />\n </Tabs> */}\n\n {/* Outcome: Yes / No */}\n <div className=\"flex gap-x-2\">\n {([\"yes\", \"no\"] as TradeOutcome[]).map((o) => {\n const holdingBalance =\n o === \"yes\" ? yesTokenBalance : noTokenBalance;\n return (\n <div key={o} className=\"flex flex-1 flex-col gap-y-1\">\n <button\n type=\"button\"\n onClick={() => onOutcomeChange(o)}\n className={`w-full rounded-lg border py-2 text-sm font-medium transition-colors cursor-pointer ${\n outcome === o\n ? o === \"yes\"\n ? \"border-primary bg-primary-50 text-primary\"\n : \"border-secondary bg-secondary-50 text-secondary\"\n : \"border-default-400 text-foreground hover:border-default-500\"\n }`}\n >\n <span>\n {o === \"yes\"\n ? t(\"predict.trade.yes\")\n : t(\"predict.trade.no\")}\n </span>\n {(() => {\n const price =\n side === \"buy\"\n ? o === \"yes\"\n ? market.yesAsk\n : market.noAsk\n : o === \"yes\"\n ? market.yesBid\n : market.noBid;\n return price != null ? (\n <span className=\"ml-1 opacity-70\">\n {parseFloat((Number(price) * 100).toFixed(2))}¢\n </span>\n ) : null;\n })()}\n </button>\n {side === \"sell\" && outcome === o && (\n <span className=\"text-center text-xs text-foreground\">\n {isBalanceLoading ? \"–\" : `${holdingBalance ?? 0} shares`}\n </span>\n )}\n </div>\n );\n })}\n </div>\n\n {/* Amount / Shares input */}\n <div className=\"flex flex-col gap-y-1.5\">\n <div className=\"flex items-center justify-between text-xs text-neutral-500\">\n <span className=\"text-sm font-medium text-foreground\">\n {side === \"buy\"\n ? t(\"predict.trade.youArePaying\")\n : t(\"predict.trade.contracts\")}\n </span>\n {side === \"buy\" && (\n <div className=\"flex items-center gap-x-2\">\n <img\n src={USDC_LOGO}\n alt=\"USDC\"\n className=\"h-3.5 w-3.5 rounded-full object-cover\"\n />\n <span className=\"font-medium text-foreground tabular-nums\">\n {usdcBalance != null ? `${usdcBalance.toFixed(2)} USDC` : \"–\"}\n </span>\n <button\n type=\"button\"\n onClick={handleHalf}\n className=\"rounded px-1.5 py-0.5 bg-content2 hover:bg-content3 transition-colors cursor-pointer text-foreground font-medium\"\n >\n {t(\"predict.trade.half\")}\n </button>\n <button\n type=\"button\"\n onClick={handleMax}\n className=\"rounded px-1.5 py-0.5 bg-content2 hover:bg-content3 transition-colors cursor-pointer text-foreground font-medium\"\n >\n {t(\"predict.trade.max\")}\n </button>\n </div>\n )}\n </div>\n <StyledInput\n aria-label=\"Trade amount\"\n fullWidth\n placeholder=\"0\"\n radius=\"lg\"\n size=\"lg\"\n inputMode={side === \"buy\" ? \"decimal\" : \"numeric\"}\n value={quantityText}\n onChange={(e) => handleQuantityInput(e.target.value)}\n onFocus={() => {\n quantityFocusedRef.current = true;\n }}\n onBlur={() => {\n quantityFocusedRef.current = false;\n setQuantityText(isNaN(quantity) ? \"\" : String(quantity));\n }}\n startContent={\n side === \"buy\" ? (\n <span className=\"text-default-600 text-xl\">$</span>\n ) : undefined\n }\n classNames={{\n inputWrapper:\n \"bg-content2 data-[hover=true]:bg-content2 group-data-[focus=true]:bg-content2 h-14 min-h-14\",\n input: \"text-lg\",\n }}\n />\n\n {/* Sell side quick percentage buttons */}\n {side === \"sell\" && (\n <div className=\"flex gap-x-2 justify-end\">\n {[25, 50].map((pct) => (\n <button\n key={pct}\n type=\"button\"\n onClick={() => {\n const bal =\n outcome === \"yes\"\n ? (yesTokenBalance ?? 0)\n : (noTokenBalance ?? 0);\n onQuantityChange(Math.floor((bal * pct) / 100));\n }}\n className=\"rounded-md bg-content2 px-2.5 py-1 text-xs font-medium text-default-600 transition-colors hover:bg-content3 cursor-pointer\"\n >\n {pct}%\n </button>\n ))}\n <button\n type=\"button\"\n onClick={() => {\n const bal =\n outcome === \"yes\"\n ? (yesTokenBalance ?? 0)\n : (noTokenBalance ?? 0);\n onQuantityChange(bal);\n }}\n className=\"rounded-md bg-content2 px-2.5 py-1 text-xs font-medium text-default-600 transition-colors hover:bg-content3 cursor-pointer\"\n >\n {t(\"common.all\")}\n </button>\n </div>\n )}\n\n {showErrors && validationErrors.length > 0 && (\n <div className=\"flex flex-col gap-y-0.5\">\n {validationErrors.map((err) => (\n <span key={err} className=\"text-xs text-danger\">\n {err}\n </span>\n ))}\n </div>\n )}\n </div>\n\n {/* Limit order expiration (GTD) — only for Polymarket limit orders */}\n {orderType === \"limit\" && supportsLimitOrder && (\n <div className=\"flex flex-col gap-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium text-primary\">\n {t(\"predict.trade.setExpiration\")}\n </span>\n <StyledSwitch\n size=\"sm\"\n color=\"primary\"\n isSelected={expirationEnabled}\n onValueChange={onExpirationEnabledChange}\n aria-label={t(\"predict.trade.setExpiration\")}\n />\n </div>\n {expirationEnabled && (\n <>\n <Select\n aria-label={t(\"predict.trade.setExpiration\")}\n selectedKeys={[expirationPreset]}\n onSelectionChange={(keys) => {\n const val = Array.from(keys)[0] as\n | ExpirationPreset\n | undefined;\n if (val) onExpirationPresetChange(val);\n }}\n size=\"sm\"\n radius=\"lg\"\n classNames={{\n trigger:\n \"bg-content2 data-[hover=true]:bg-content2 min-h-10\",\n value: \"text-sm\",\n }}\n >\n {EXPIRATION_PRESETS.map((preset) => (\n <SelectItem key={preset}>\n {t(EXPIRATION_PRESET_I18N[preset])}\n </SelectItem>\n ))}\n </Select>\n {expirationPreset === \"custom\" && (\n <div className=\"flex gap-x-2\">\n <StyledNumberInput\n aria-label=\"Duration amount\"\n size=\"sm\"\n radius=\"lg\"\n value={isNaN(customDuration) ? undefined : customDuration}\n onValueChange={onCustomDurationChange}\n minValue={1}\n step={1}\n formatOptions={{ maximumFractionDigits: 0 }}\n classNames={{\n base: \"flex-1\",\n inputWrapper:\n \"bg-content2 data-[hover=true]:bg-content2 group-data-[focus=true]:bg-content2 min-h-10\",\n input: \"text-sm\",\n }}\n />\n <Select\n aria-label=\"Duration unit\"\n selectedKeys={[customDurationUnit]}\n onSelectionChange={(keys) => {\n const val = Array.from(keys)[0] as\n | DurationUnit\n | undefined;\n if (val) onCustomDurationUnitChange(val);\n }}\n size=\"sm\"\n radius=\"lg\"\n classNames={{\n base: \"w-32\",\n trigger:\n \"bg-content2 data-[hover=true]:bg-content2 min-h-10\",\n value: \"text-sm\",\n }}\n >\n {DURATION_UNITS.map((u) => (\n <SelectItem key={u}>\n {t(DURATION_UNIT_I18N[u])}\n </SelectItem>\n ))}\n </Select>\n </div>\n )}\n </>\n )}\n </div>\n )}\n\n {/* Odds collapsible row */}\n <div className=\"flex flex-col gap-y-2\">\n <div className=\"flex items-center justify-between text-sm\">\n <button\n type=\"button\"\n onClick={() => setShowOdds((v) => !v)}\n className=\"flex items-center gap-x-1 text-neutral-500 hover:text-foreground cursor-pointer transition-colors\"\n >\n <span>{t(\"predict.trade.odds\")}</span>\n <ChevronDownIcon\n className={cn(\n \"h-3.5 w-3.5 transition-transform\",\n showOdds && \"rotate-180\",\n )}\n />\n </button>\n {currentPriceCents != null && (\n <span className=\"text-foreground font-medium tabular-nums\">\n {currentPriceCents}% chance\n </span>\n )}\n </div>\n {showOdds && (\n <div className=\"flex flex-col gap-y-1.5 border-l-2 border-default-300 pl-3 text-sm text-neutral-500\">\n <div className=\"flex items-center justify-between\">\n <span>Total Size</span>\n <span className=\"tabular-nums text-foreground\">\n {!isNaN(quantity) && quantity > 0\n ? `$${estimatedCost.toFixed(2)}`\n : \"–\"}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span>No. of Contracts</span>\n <span className=\"tabular-nums text-foreground\">\n {!isNaN(shares) && shares > 0\n ? parseFloat(shares.toFixed(2))\n : \"–\"}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span>Payout</span>\n <span className=\"tabular-nums text-foreground\">\n {!isNaN(quantity) && quantity > 0\n ? `$${potentialPayout.toFixed(2)}`\n : \"–\"}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span>Est. Profit</span>\n <span className=\"tabular-nums text-bullish\">\n {!isNaN(quantity) && quantity > 0 && potentialProfit > 0\n ? `+$${potentialProfit.toFixed(2)}`\n : \"–\"}\n </span>\n </div>\n </div>\n )}\n </div>\n\n {/* Submit button */}\n <Button\n color={submitColor as \"primary\" | \"secondary\" | \"default\"}\n fullWidth\n radius=\"lg\"\n size=\"lg\"\n isDisabled={isBalanceLoading || !hasAmount || isSubmitting}\n isLoading={isSubmitting || isBalanceLoading}\n spinner={<Spinner size=\"sm\" color=\"current\" />}\n onPress={handleSubmitPress}\n >\n {submitLabel}\n </Button>\n </div>\n\n <KycModal\n isOpen={kycModal.isOpen}\n onClose={kycModal.onClose}\n kycUrl={kycUrl}\n />\n </>\n );\n}\n","import { useMemo } from \"react\";\nimport type { PredictEvent, PredictMarket } from \"@liberfi.io/react-predict\";\nimport { useAuthCallback } from \"@liberfi.io/wallet-connector\";\nimport {\n predictEventToStandard,\n predictMarketToStandard,\n} from \"../../utils/predict-market-adapter\";\nimport {\n useTradeForm,\n type TradeOutcome,\n type TradeSide,\n type ExpirationPreset,\n} from \"./trade-form.script\";\nimport { TradeFormUI } from \"./trade-form.ui\";\n\nexport interface TradeFormWidgetProps {\n event?: PredictEvent;\n market: PredictMarket;\n variant?: \"bordered\" | \"flat\";\n initialSide?: TradeSide;\n initialOutcome?: TradeOutcome;\n chain?: string;\n}\n\nexport function TradeFormWidget({\n event,\n market,\n variant,\n initialSide,\n initialOutcome,\n chain,\n}: TradeFormWidgetProps) {\n const {\n outcome,\n side,\n orderType,\n quantity,\n limitPrice,\n shares,\n estimatedCost,\n potentialPayout,\n potentialProfit,\n usdcBalance,\n yesTokenBalance,\n noTokenBalance,\n isBalanceLoading,\n isSubmitting,\n validation,\n supportsLimitOrder,\n kycRequired,\n kycUrl,\n expirationEnabled,\n expirationPreset,\n customDuration,\n customDurationUnit,\n setOutcome,\n setSide,\n setOrderType,\n setQuantity,\n setLimitPrice,\n setExpirationEnabled,\n setExpirationPreset,\n setCustomDuration,\n setCustomDurationUnit,\n submit,\n } = useTradeForm({\n market,\n initialSide,\n initialOutcome,\n chain,\n });\n\n const authenticatedSubmit = useAuthCallback(submit);\n\n const adaptedEvent = useMemo(\n () => (event ? predictEventToStandard(event) : undefined),\n [event],\n );\n const adaptedMarket = useMemo(\n () => predictMarketToStandard(market),\n [market],\n );\n\n return (\n <TradeFormUI\n event={adaptedEvent}\n market={adaptedMarket}\n variant={variant}\n outcome={outcome}\n side={side}\n orderType={orderType}\n quantity={quantity}\n limitPrice={limitPrice}\n shares={shares}\n estimatedCost={estimatedCost}\n potentialPayout={potentialPayout}\n potentialProfit={potentialProfit}\n usdcBalance={usdcBalance}\n yesTokenBalance={yesTokenBalance}\n noTokenBalance={noTokenBalance}\n isBalanceLoading={isBalanceLoading}\n isSubmitting={isSubmitting}\n isValid={validation.isValid}\n validationErrors={validation.errors}\n supportsLimitOrder={supportsLimitOrder}\n kycRequired={kycRequired}\n kycUrl={kycUrl}\n expirationEnabled={expirationEnabled}\n expirationPreset={expirationPreset}\n customDuration={customDuration}\n customDurationUnit={customDurationUnit}\n onOutcomeChange={setOutcome}\n onSideChange={setSide}\n onOrderTypeChange={setOrderType}\n onQuantityChange={setQuantity}\n onLimitPriceChange={setLimitPrice}\n onExpirationEnabledChange={setExpirationEnabled}\n onExpirationPresetChange={setExpirationPreset}\n onCustomDurationChange={setCustomDuration}\n onCustomDurationUnitChange={setCustomDurationUnit}\n onSubmit={authenticatedSubmit}\n />\n );\n}\n","\"use client\";\n\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent, PredictMarket } from \"@liberfi.io/react-predict\";\nimport { ModalContent, StyledModal, useScreen } from \"@liberfi.io/ui\";\nimport {\n AsyncModal,\n type RenderAsyncModalProps,\n} from \"@liberfi.io/ui-scaffold\";\nimport type { TradeOutcome, TradeSide } from \"./trade-form.script\";\nimport { TradeFormWidget } from \"./trade-form.widget\";\n\nexport type PredictTradeModalParams = {\n event: PredictEvent;\n market: PredictMarket;\n initialOutcome?: TradeOutcome;\n initialSide?: TradeSide;\n chain?: string;\n};\n\nexport type PredictTradeModalResult = void;\n\nexport const PREDICT_TRADE_MODAL_ID = \"predict-trade\";\n\nexport function PredictTradeModal({\n id = PREDICT_TRADE_MODAL_ID,\n}: {\n id?: string;\n}) {\n return (\n <AsyncModal<PredictTradeModalParams, PredictTradeModalResult> id={id}>\n {(modalProps) => <PredictTradeModalContent {...modalProps} />}\n </AsyncModal>\n );\n}\n\nfunction PredictTradeModalContent({\n params,\n isOpen,\n onOpenChange,\n}: RenderAsyncModalProps<PredictTradeModalParams, PredictTradeModalResult>) {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n\n if (!params) return null;\n\n return (\n <StyledModal\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n size={isMobile ? \"lg\" : \"md\"}\n backdrop=\"blur\"\n hideCloseButton\n classNames={{\n base: \"!bg-[#18181b] !rounded-[14px] !border !border-[rgba(39,39,42,1)] !shadow-[0_25px_50px_-12px_rgba(0,0,0,0.5)]\",\n body: \"!p-0\",\n }}\n >\n <ModalContent>\n <div className={isMobile ? \"\" : \"p-2\"}>\n <TradeFormWidget\n event={params.event}\n market={params.market}\n initialOutcome={params.initialOutcome}\n initialSide={params.initialSide ?? \"buy\"}\n chain={params.chain}\n variant=\"flat\"\n />\n <div className=\"px-4 pb-4\">\n <button\n type=\"button\"\n onClick={() => onOpenChange(false)}\n className=\"w-full h-12 rounded-xl text-sm font-medium text-zinc-400 hover:text-white hover:bg-[rgba(39,39,42,0.5)] transition-colors cursor-pointer focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n >\n {t(\"common.cancel\")}\n </button>\n </div>\n </div>\n </ModalContent>\n </StyledModal>\n );\n}\n","// =============================================================================\n// EventsFilterUI\n//\n// Filter modal for the events list. Contains chip-based filter sections:\n// - Platform (source provider)\n// - Time Remaining\n// - Min Volume\n// - Min Liquidity\n//\n// Visual style aligned with the matches page dark zinc theme.\n// Pure presentational component — state is managed by the parent page via\n// a draft-and-apply pattern: the modal works on a draft copy of the filter\n// state, and only commits changes when \"Show Results\" is pressed.\n// =============================================================================\nimport { useState, useCallback, useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { ProviderSource } from \"@liberfi.io/react-predict\";\nimport { StyledModal, ModalContent } from \"@liberfi.io/ui\";\nimport type { SortPreset } from \"./events-toolbar.ui\";\n\n// -----------------------------------------------------------------------------\n// Filter state type\n// -----------------------------------------------------------------------------\n\nexport interface EventsFilterState {\n sortPreset: SortPreset;\n sortAsc: boolean;\n source?: ProviderSource;\n timeRemaining?: string;\n minVolume?: string;\n minLiquidity?: string;\n}\n\nexport const DEFAULT_FILTER_STATE: EventsFilterState = {\n sortPreset: \"volume\",\n sortAsc: false,\n source: undefined,\n timeRemaining: undefined,\n minVolume: undefined,\n minLiquidity: undefined,\n};\n\n/** Count how many non-default filters are active (excluding sortPreset) */\nexport function countActiveFilters(state: EventsFilterState): number {\n let count = 0;\n if (state.source) count++;\n if (state.timeRemaining) count++;\n if (state.minVolume) count++;\n if (state.minLiquidity) count++;\n return count;\n}\n\n// -----------------------------------------------------------------------------\n// Props\n// -----------------------------------------------------------------------------\n\nexport interface EventsFilterUIProps {\n /** Whether the modal is open */\n isOpen: boolean;\n /** Callback to close the modal */\n onClose: () => void;\n /** Current committed filter state */\n value: EventsFilterState;\n /** Callback when \"Show Results\" is pressed with the new filter state */\n onChange: (state: EventsFilterState) => void;\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function EventsFilterUI({\n isOpen,\n onClose,\n value,\n onChange,\n}: EventsFilterUIProps) {\n const { t } = useTranslation();\n\n const [draft, setDraft] = useState<EventsFilterState>(value);\n\n const handleOpenChange = useCallback(\n (open: boolean) => {\n if (open) {\n setDraft(value);\n } else {\n onClose();\n }\n },\n [value, onClose],\n );\n\n const handleReset = useCallback(() => {\n setDraft(DEFAULT_FILTER_STATE);\n }, []);\n\n const handleApply = useCallback(() => {\n onChange(draft);\n onClose();\n }, [draft, onChange, onClose]);\n\n const updateDraft = useCallback(\n <K extends keyof EventsFilterState>(key: K, val: EventsFilterState[K]) => {\n setDraft((prev) => ({ ...prev, [key]: val }));\n },\n [],\n );\n\n const activeCount = useMemo(() => countActiveFilters(draft), [draft]);\n\n const platformOptions = useMemo(\n () => [\n { value: undefined, label: t(\"predict.filter.all\") },\n { value: \"polymarket\" as const, label: t(\"predict.platform.polymarket\") },\n { value: \"kalshi\" as const, label: t(\"predict.platform.kalshi\") },\n ],\n [t],\n );\n\n const timeRemainingOptions = useMemo(\n () => [\n { value: undefined, label: t(\"predict.filter.all\") },\n { value: \"1d\", label: t(\"predict.filter.lessThanDay\") },\n { value: \"7d\", label: t(\"predict.filter.lessThanWeek\") },\n { value: \"30d\", label: t(\"predict.filter.lessThanMonth\") },\n ],\n [t],\n );\n\n const volumeOptions = useMemo(\n () => [\n { value: undefined, label: t(\"predict.filter.all\") },\n { value: \"1000\", label: \">$1K\" },\n { value: \"10000\", label: \">$10K\" },\n { value: \"100000\", label: \">$100K\" },\n { value: \"1000000\", label: \">$1M\" },\n ],\n [t],\n );\n\n const liquidityOptions = useMemo(\n () => [\n { value: undefined, label: t(\"predict.filter.all\") },\n { value: \"1000\", label: \">$1K\" },\n { value: \"10000\", label: \">$10K\" },\n { value: \"100000\", label: \">$100K\" },\n { value: \"1000000\", label: \">$1M\" },\n ],\n [t],\n );\n\n return (\n <StyledModal\n isOpen={isOpen}\n onOpenChange={handleOpenChange}\n size=\"md\"\n backdrop=\"blur\"\n scrollBehavior=\"inside\"\n classNames={{\n base: \"!bg-[#18181b] !rounded-[14px] !border !border-[rgba(39,39,42,1)] !shadow-[0_25px_50px_-12px_rgba(0,0,0,0.5)]\",\n body: \"!p-0\",\n }}\n >\n <ModalContent>\n <div>\n {/* Header */}\n <div className=\"flex items-center justify-between px-5 pt-5 pb-4\">\n <h3 className=\"text-base font-semibold text-white\">\n {t(\"predict.filter.title\")}\n </h3>\n <CloseButton onClick={() => handleOpenChange(false)} />\n </div>\n\n {/* Body */}\n <div\n style={{\n padding: \"0 20px 16px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 20,\n }}\n >\n <FilterSection label={t(\"predict.filter.platform\")}>\n <FilterChipGroup\n options={platformOptions}\n selected={draft.source}\n onSelect={(v) =>\n updateDraft(\"source\", v as ProviderSource | undefined)\n }\n />\n </FilterSection>\n\n <FilterSection label={t(\"predict.filter.timeRemaining\")}>\n <FilterChipGroup\n options={timeRemainingOptions}\n selected={draft.timeRemaining}\n onSelect={(v) => updateDraft(\"timeRemaining\", v)}\n />\n </FilterSection>\n\n <FilterSection label={t(\"predict.filter.minVolume\")}>\n <FilterChipGroup\n options={volumeOptions}\n selected={draft.minVolume}\n onSelect={(v) => updateDraft(\"minVolume\", v)}\n />\n </FilterSection>\n\n <FilterSection label={t(\"predict.filter.minLiquidity\")}>\n <FilterChipGroup\n options={liquidityOptions}\n selected={draft.minLiquidity}\n onSelect={(v) => updateDraft(\"minLiquidity\", v)}\n />\n </FilterSection>\n </div>\n\n {/* Footer */}\n <div\n className=\"flex items-center gap-3 px-5 py-4\"\n style={{ borderTop: \"1px solid rgba(39,39,42,0.5)\" }}\n >\n <button\n type=\"button\"\n className=\"inline-flex items-center justify-center py-2.5 px-5 rounded-[10px] text-zinc-400 text-sm font-medium hover:text-white transition-colors cursor-pointer\"\n onClick={handleReset}\n >\n {t(\"predict.filter.reset\")}\n </button>\n <button\n type=\"button\"\n className=\"flex-1 inline-flex items-center justify-center gap-2 py-2.5 rounded-[10px] bg-[#c7ff2e] text-zinc-900 text-sm font-semibold hover:bg-[#c7ff2e]/90 transition-colors cursor-pointer\"\n onClick={handleApply}\n >\n {t(\"predict.filter.showResults\")}\n {activeCount > 0 && (\n <span style={{ opacity: 0.7 }}>({activeCount})</span>\n )}\n </button>\n </div>\n </div>\n </ModalContent>\n </StyledModal>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Filter section wrapper\n// -----------------------------------------------------------------------------\n\nfunction FilterSection({\n label,\n children,\n}: {\n label: string;\n children: React.ReactNode;\n}) {\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 10 }}>\n <span\n style={{\n fontSize: 11,\n fontWeight: 500,\n color: \"#71717a\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n }}\n >\n {label}\n </span>\n {children}\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// FilterChipGroup — reusable chip selection row\n// -----------------------------------------------------------------------------\n\ninterface ChipOption {\n value: string | undefined;\n label: string;\n}\n\ninterface FilterChipGroupProps {\n options: ChipOption[];\n selected: string | undefined;\n onSelect: (value: string | undefined) => void;\n allowDeselect?: boolean;\n}\n\n// -----------------------------------------------------------------------------\n// Close button (matches KYC modal style)\n// -----------------------------------------------------------------------------\n\nfunction CloseButton({ onClick }: { onClick: () => void }) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"p-1 rounded-[10px] hover:bg-[rgba(39,39,42,0.5)] text-zinc-400 hover:text-white transition-colors cursor-pointer focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n >\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n );\n}\n\n// -----------------------------------------------------------------------------\n// FilterChipGroup — reusable chip selection row\n// -----------------------------------------------------------------------------\n\nfunction FilterChipGroup({\n options,\n selected,\n onSelect,\n allowDeselect = true,\n}: FilterChipGroupProps) {\n return (\n <div style={{ display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\n {options.map((opt) => {\n const isActive = selected === opt.value;\n return (\n <button\n key={opt.value ?? \"__all\"}\n type=\"button\"\n onClick={() => {\n if (isActive && allowDeselect) {\n onSelect(undefined);\n } else {\n onSelect(opt.value);\n }\n }}\n style={{\n flexShrink: 0,\n borderRadius: 10,\n padding: \"6px 14px\",\n fontSize: 13,\n fontWeight: 500,\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n border: isActive\n ? \"1px solid rgba(199,255,46,0.3)\"\n : \"1px solid rgba(63,63,70,0.5)\",\n background: isActive\n ? \"rgba(199,255,46,0.08)\"\n : \"rgba(39,39,42,0.4)\",\n color: isActive ? \"#c7ff2e\" : \"#a1a1aa\",\n }}\n onMouseEnter={(e) => {\n if (!isActive) {\n e.currentTarget.style.background = \"rgba(39,39,42,0.8)\";\n e.currentTarget.style.color = \"#fff\";\n }\n }}\n onMouseLeave={(e) => {\n if (!isActive) {\n e.currentTarget.style.background = \"rgba(39,39,42,0.4)\";\n e.currentTarget.style.color = \"#a1a1aa\";\n }\n }}\n >\n {opt.label}\n </button>\n );\n })}\n </div>\n );\n}\n","// =============================================================================\n// EventsHero\n//\n// Brand-focused hero: slogan + feature description (left) and 2x2 stats grid\n// (right). No individual event cards — the hero communicates the platform value\n// proposition and shows aggregate market stats.\n// =============================================================================\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { EventStats } from \"@liberfi.io/react-predict\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\nexport interface EventsHeroProps {\n stats?: EventStats;\n}\n\n// -----------------------------------------------------------------------------\n// Helpers\n// -----------------------------------------------------------------------------\n\nfunction formatCompact(val: number): string {\n if (val >= 1_000_000_000) return `$${(val / 1_000_000_000).toFixed(1)}B`;\n if (val >= 1_000_000) return `$${(val / 1_000_000).toFixed(1)}M`;\n if (val >= 1_000) return `$${(val / 1_000).toFixed(1)}K`;\n return `$${val.toFixed(0)}`;\n}\n\n// -----------------------------------------------------------------------------\n// Stat card config — matches the Matches hero color palette (theme colors)\n// -----------------------------------------------------------------------------\n\nconst STAT_CARDS: {\n key: keyof EventStats;\n labelKey: string;\n format: (v: number) => string;\n valueColor: string;\n gradientFrom: string;\n gradientTo: string;\n}[] = [\n {\n key: \"total_events\",\n labelKey: \"predict.events.stats.totalEvents\",\n format: (v) => v.toLocaleString(),\n valueColor: \"#c7ff2e\",\n gradientFrom: \"rgba(199,255,46,0.18)\",\n gradientTo: \"rgba(199,255,46,0.04)\",\n },\n {\n key: \"total_volume_24h\",\n labelKey: \"predict.events.stats.volume24h\",\n format: formatCompact,\n valueColor: \"#f76816\",\n gradientFrom: \"rgba(247,104,22,0.18)\",\n gradientTo: \"rgba(247,104,22,0.04)\",\n },\n {\n key: \"avg_liquidity\",\n labelKey: \"predict.events.stats.avgLiquidity\",\n format: formatCompact,\n valueColor: \"#17c964\",\n gradientFrom: \"rgba(23,201,100,0.18)\",\n gradientTo: \"rgba(23,201,100,0.04)\",\n },\n {\n key: \"active_sources\",\n labelKey: \"predict.events.stats.activeSources\",\n format: (v) => v.toLocaleString(),\n valueColor: \"#f5a524\",\n gradientFrom: \"rgba(245,165,36,0.18)\",\n gradientTo: \"rgba(245,165,36,0.04)\",\n },\n];\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function EventsHero({ stats }: EventsHeroProps) {\n const { t } = useTranslation();\n\n return (\n <>\n <style>{`\n@keyframes evt-live-ping{75%,100%{transform:scale(2.2);opacity:0}}\n@keyframes evt-live-breathe{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.55;transform:scale(.85)}}\n@keyframes evtHeroTitleEnter{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}\n@keyframes evtStatsEnter{from{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}\n@keyframes evtStatCardEnter{from{opacity:0;transform:translateY(8px) scale(0.97)}to{opacity:1;transform:translateY(0) scale(1)}}\n\n.evt-hero-outer{display:flex;flex-direction:column;align-items:center;text-align:center;gap:28px}\n@media(min-width:640px){.evt-hero-outer{flex-direction:row;align-items:center;text-align:left;gap:40px}}\n@media(min-width:1024px){.evt-hero-outer{gap:56px}}\n\n.evt-hero-left{display:flex;flex-direction:column;align-items:center}\n@media(min-width:640px){.evt-hero-left{align-items:flex-start}}\n\n.evt-hero-live{display:flex;justify-content:center}\n@media(min-width:640px){.evt-hero-live{justify-content:flex-start}}\n\n.evt-hero-subtitle-text{text-align:center;margin:0 auto}\n@media(min-width:640px){.evt-hero-subtitle-text{text-align:left;margin:0}}\n\n.evt-hero-title{font-size:32px!important;line-height:1.2!important}\n@media(min-width:640px){.evt-hero-title{font-size:38px!important}}\n@media(min-width:1024px){.evt-hero-title{font-size:46px!important}}\n\n.evt-hero-subtitle{font-size:14px}\n@media(min-width:640px){.evt-hero-subtitle{font-size:15px}}\n\n.evt-stat-grid{display:grid;grid-template-columns:repeat(2,1fr);width:100%;max-width:360px;border-radius:16px;border:1px solid rgba(39,39,42,0.5);overflow:hidden;flex-shrink:0;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}\n@media(min-width:640px){.evt-stat-grid{width:340px;max-width:none}}\n@media(min-width:1024px){.evt-stat-grid{width:380px}}\n\n.evt-stat-val{font-size:18px;line-height:24px;min-height:24px}\n@media(min-width:640px){.evt-stat-val{font-size:20px;line-height:28px;min-height:28px}}\n@media(min-width:1024px){.evt-stat-val{font-size:22px;line-height:30px;min-height:30px}}\n\n.evt-stat-label{font-size:11px;line-height:16px;min-height:16px;white-space:nowrap}\n@media(min-width:640px){.evt-stat-label{font-size:12px;line-height:18px;min-height:18px}}\n`}</style>\n\n <div className=\"evt-hero-outer\">\n {/* Left: title group */}\n <div\n className=\"evt-hero-left\"\n style={{\n minWidth: 0,\n flex: 1,\n animation:\n \"evtHeroTitleEnter 0.5s cubic-bezier(0.34,1.56,0.64,1) both\",\n }}\n >\n {/* Live badge */}\n <div className=\"evt-hero-live\" style={{ marginBottom: 16 }}>\n <div\n className=\"inline-flex items-center\"\n style={{\n gap: 8,\n borderRadius: 9999,\n border: \"1px solid rgba(63,63,70,0.5)\",\n background: \"rgba(39,39,42,0.6)\",\n padding: \"6px 12px\",\n backdropFilter: \"blur(8px)\",\n WebkitBackdropFilter: \"blur(8px)\",\n }}\n >\n <span\n style={{\n position: \"relative\",\n display: \"flex\",\n width: 8,\n height: 8,\n }}\n >\n <span\n style={{\n position: \"absolute\",\n display: \"inline-flex\",\n width: \"100%\",\n height: \"100%\",\n borderRadius: 9999,\n background: \"#00d492\",\n opacity: 0.75,\n animation:\n \"evt-live-ping 1.2s cubic-bezier(0,0,0.2,1) infinite\",\n }}\n />\n <span\n style={{\n position: \"relative\",\n display: \"inline-flex\",\n width: 8,\n height: 8,\n borderRadius: 9999,\n background: \"#00bc7d\",\n animation: \"evt-live-breathe 2.4s ease-in-out infinite\",\n }}\n />\n </span>\n <span\n style={{\n fontSize: 12,\n fontWeight: 500,\n color: \"#d4d4d8\",\n letterSpacing: \"0.025em\",\n }}\n >\n {t(\"predict.events.liveBadge\" as never)}\n </span>\n </div>\n </div>\n\n {/* Title */}\n <h1\n className=\"evt-hero-title\"\n style={{\n fontFamily: \"var(--font-dm-sans, 'DM Sans', sans-serif)\",\n fontWeight: 700,\n letterSpacing: \"-1.2px\",\n lineHeight: 1.2,\n color: \"#fff\",\n margin: \"0 0 14px\",\n }}\n >\n <span style={{ color: \"#fff\" }}>\n {t(\"predict.events.titlePrefix\" as never)}{\" \"}\n </span>\n <span\n style={{\n backgroundImage:\n \"linear-gradient(to right, #c7ff2e, #a0e515, #17c964)\",\n WebkitBackgroundClip: \"text\",\n WebkitTextFillColor: \"transparent\",\n backgroundClip: \"text\",\n }}\n >\n {t(\"predict.events.titleHighlight\" as never)}\n </span>\n </h1>\n\n {/* Subtitle */}\n <p\n className=\"evt-hero-subtitle evt-hero-subtitle-text\"\n style={{ lineHeight: 1.6, color: \"#71717a\", maxWidth: 460 }}\n >\n {String(t(\"predict.events.heroSubtitle\" as never))\n .split(\"\\n\")\n .map((line: string, i: number) => (\n <span key={i}>\n {i > 0 && <br className=\"hidden sm:block\" />}\n {line}\n {i === 0 ? \" \" : \"\"}\n </span>\n ))}\n </p>\n </div>\n\n {/* Right: 2x2 stats grid */}\n <div\n className=\"evt-stat-grid\"\n style={\n stats\n ? {\n animation:\n \"evtStatsEnter 0.5s cubic-bezier(0.34,1.56,0.64,1) both\",\n animationDelay: \"0.1s\",\n }\n : {}\n }\n >\n {STAT_CARDS.map((card, idx) => (\n <div\n key={card.key}\n style={{\n padding: \"14px 16px\",\n background: stats\n ? `linear-gradient(to bottom, ${card.gradientFrom}, ${card.gradientTo})`\n : \"rgba(255,255,255,0.02)\",\n borderRight:\n idx % 2 === 0 ? \"1px solid rgba(39,39,42,0.4)\" : \"none\",\n borderBottom: idx < 2 ? \"1px solid rgba(39,39,42,0.4)\" : \"none\",\n ...(stats\n ? {\n animation:\n \"evtStatCardEnter 0.45s cubic-bezier(0.34,1.56,0.64,1) both\",\n animationDelay: `${150 + idx * 60}ms`,\n }\n : {}),\n }}\n >\n <div\n className=\"evt-stat-val\"\n style={{\n fontWeight: 700,\n fontVariantNumeric: \"tabular-nums\",\n color: stats ? card.valueColor : \"transparent\",\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n {stats ? (\n card.format(stats[card.key])\n ) : (\n <div\n style={{\n height: 16,\n width: 56,\n borderRadius: 4,\n background: \"rgba(255,255,255,0.06)\",\n animation: \"evtStatCardEnter 0.6s ease-out both\",\n animationDelay: `${idx * 80}ms`,\n }}\n />\n )}\n </div>\n <div\n className=\"evt-stat-label\"\n style={{\n fontWeight: 500,\n color: stats ? \"#71717a\" : \"transparent\",\n marginTop: 2,\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n {stats ? (\n t(card.labelKey as never)\n ) : (\n <div\n style={{\n height: 10,\n width: 64,\n borderRadius: 4,\n background: \"rgba(255,255,255,0.04)\",\n animation: \"evtStatCardEnter 0.6s ease-out both\",\n animationDelay: `${50 + idx * 80}ms`,\n }}\n />\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n </>\n );\n}\n","// =============================================================================\n// EventsToolbarUI\n//\n// Toolbar bar between categories and the events grid. Contains:\n// - Sort pill: sort-field dropdown + ascending/descending toggle\n// - Filter button with active-filter badge\n//\n// Visual style aligned with the matches filter bar (dark zinc theme).\n// Pure presentational component — state is managed by the parent page.\n// =============================================================================\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { EventSortField } from \"@liberfi.io/react-predict\";\nimport {\n CalendarIcon,\n ChartLineIcon,\n DropletIcon,\n TimerIcon,\n} from \"@liberfi.io/ui\";\n\n// -----------------------------------------------------------------------------\n// Sort presets\n// -----------------------------------------------------------------------------\n\nexport type SortPreset = \"start_time\" | \"volume\" | \"liquidity\" | \"ending_soon\";\n\nexport const SORT_PRESETS: Record<SortPreset, { sort_by: EventSortField }> = {\n start_time: { sort_by: \"created_at\" },\n volume: { sort_by: \"volume\" },\n liquidity: { sort_by: \"liquidity\" },\n ending_soon: { sort_by: \"end_at\" },\n};\n\nconst SORT_LABEL_KEYS = {\n start_time: \"predict.sort.startTime\",\n volume: \"predict.sort.volume\",\n liquidity: \"predict.sort.liquidity\",\n ending_soon: \"predict.sort.endingSoon\",\n} as const;\n\nconst SORT_ORDER: SortPreset[] = [\n \"start_time\",\n \"volume\",\n \"liquidity\",\n \"ending_soon\",\n];\n\n// -----------------------------------------------------------------------------\n// Shared inline styles (matches filter bar theme)\n// -----------------------------------------------------------------------------\n\nconst btnBase: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n borderRadius: 10,\n border: \"1px solid rgba(63,63,70,0.5)\",\n background: \"rgba(39,39,42,0.6)\",\n padding: \"8px 12px\",\n fontSize: 14,\n color: \"#d4d4d8\",\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n};\n\nconst dropdownBase: React.CSSProperties = {\n position: \"absolute\",\n left: 0,\n top: \"100%\",\n zIndex: 20,\n marginTop: 8,\n borderRadius: 14,\n border: \"1px solid rgba(39,39,42,1)\",\n background: \"rgba(24,24,27,1)\",\n boxShadow: \"0 25px 50px -12px rgba(0,0,0,0.5)\",\n overflow: \"hidden\",\n};\n\n// -----------------------------------------------------------------------------\n// Props\n// -----------------------------------------------------------------------------\n\nexport interface EventsToolbarUIProps {\n /** Currently active sort preset */\n sortPreset: SortPreset;\n /** Callback when the user picks a different sort preset */\n onSortChange: (preset: SortPreset) => void;\n /** Current sort direction: true = ascending, false = descending */\n sortAsc: boolean;\n /** Callback when the user toggles the sort direction */\n onSortAscChange: (asc: boolean) => void;\n /** Callback when the filter button is pressed */\n onFilterPress: () => void;\n /** Number of currently active filters (shown as badge count) */\n filterCount?: number;\n /** Optional class name for the root element */\n className?: string;\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function EventsToolbarUI({\n sortPreset,\n onSortChange,\n sortAsc,\n onSortAscChange,\n onFilterPress,\n filterCount = 0,\n className,\n}: EventsToolbarUIProps) {\n const { t } = useTranslation();\n const [isOpen, setIsOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n const handleClickOutside = useCallback((e: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(e.target as Node)\n ) {\n setIsOpen(false);\n }\n }, []);\n\n useEffect(() => {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [handleClickOutside]);\n\n useEffect(() => {\n if (!isOpen) return;\n const onEscape = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setIsOpen(false);\n };\n document.addEventListener(\"keydown\", onEscape);\n return () => document.removeEventListener(\"keydown\", onEscape);\n }, [isOpen]);\n\n const ActiveIcon = SORT_ICONS[sortPreset];\n\n return (\n <div\n className={className}\n style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}\n >\n {/* Sort dropdown */}\n <div ref={dropdownRef} style={{ position: \"relative\" }}>\n <button\n type=\"button\"\n style={btnBase}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,1)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,0.6)\";\n }}\n onClick={() => setIsOpen((v) => !v)}\n >\n <SortIcon />\n <ActiveIcon\n className=\"size-4 shrink-0\"\n style={{ color: \"#a1a1aa\" }}\n />\n <span className=\"hidden sm:block\" style={{ color: \"#d4d4d8\" }}>\n {t(SORT_LABEL_KEYS[sortPreset])}\n </span>\n <ChevronDown open={isOpen} />\n </button>\n\n {isOpen && (\n <div style={{ ...dropdownBase, width: 224, padding: 4 }}>\n {SORT_ORDER.map((key) => {\n const Icon = SORT_ICONS[key];\n const isActive = sortPreset === key;\n return (\n <button\n key={key}\n type=\"button\"\n style={{\n display: \"flex\",\n width: \"100%\",\n alignItems: \"center\",\n gap: 12,\n padding: \"10px 12px\",\n textAlign: \"left\",\n fontSize: 14,\n border: \"none\",\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n background: isActive\n ? \"rgba(199,255,46,0.08)\"\n : \"transparent\",\n color: isActive ? \"#c7ff2e\" : \"#a1a1aa\",\n borderRadius: 10,\n }}\n onMouseEnter={(e) => {\n if (!isActive) {\n e.currentTarget.style.background = \"rgba(39,39,42,0.5)\";\n e.currentTarget.style.color = \"#fff\";\n }\n }}\n onMouseLeave={(e) => {\n if (!isActive) {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"#a1a1aa\";\n }\n }}\n onClick={() => {\n if (sortPreset === key) {\n onSortAscChange(!sortAsc);\n } else {\n onSortChange(key);\n }\n setIsOpen(false);\n }}\n >\n <Icon\n className=\"size-4 shrink-0\"\n style={{ color: isActive ? \"#c7ff2e\" : \"#71717a\" }}\n />\n <span style={{ flex: 1, fontWeight: 500 }}>\n {t(SORT_LABEL_KEYS[key])}\n </span>\n {isActive && (\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 16,\n height: 16,\n color: \"#c7ff2e\",\n flexShrink: 0,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n )}\n </button>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Sort direction toggle */}\n <button\n type=\"button\"\n style={{\n borderRadius: 10,\n border: \"1px solid rgba(63,63,70,0.5)\",\n background: \"rgba(39,39,42,0.6)\",\n width: 36,\n height: 36,\n color: \"#a1a1aa\",\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: 14,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,1)\";\n e.currentTarget.style.color = \"#fff\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,0.6)\";\n e.currentTarget.style.color = \"#a1a1aa\";\n }}\n onClick={() => onSortAscChange(!sortAsc)}\n >\n {sortAsc ? \"↑\" : \"↓\"}\n </button>\n\n {/* Filter button */}\n <div style={{ position: \"relative\", display: \"inline-flex\" }}>\n <button\n type=\"button\"\n style={btnBase}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,1)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,0.6)\";\n }}\n onClick={onFilterPress}\n >\n <FilterBarIcon />\n <span className=\"hidden sm:block\" style={{ color: \"#d4d4d8\" }}>\n {t(\"predict.filter.title\")}\n </span>\n </button>\n {filterCount > 0 && (\n <span\n style={{\n position: \"absolute\",\n top: -4,\n right: -4,\n minWidth: 16,\n height: 16,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderRadius: 8,\n background: \"#c7ff2e\",\n color: \"#000\",\n fontSize: 10,\n fontWeight: 600,\n padding: \"0 4px\",\n }}\n >\n {filterCount}\n </span>\n )}\n </div>\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Sort option icon map\n// -----------------------------------------------------------------------------\n\nconst SORT_ICONS: Record<\n SortPreset,\n React.FC<{ className?: string; style?: React.CSSProperties }>\n> = {\n start_time: CalendarIcon,\n volume: ChartLineIcon,\n liquidity: DropletIcon,\n ending_soon: TimerIcon,\n};\n\n// -----------------------------------------------------------------------------\n// Inline SVG icons\n// -----------------------------------------------------------------------------\n\nfunction SortIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 14, height: 14, color: \"#a1a1aa\" }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m21 16-4 4-4-4\" />\n <path d=\"M17 20V4\" />\n <path d=\"m3 8 4-4 4 4\" />\n <path d=\"M7 4v16\" />\n </svg>\n );\n}\n\nfunction FilterBarIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 14, height: 14, color: \"#a1a1aa\" }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z\" />\n </svg>\n );\n}\n\nfunction ChevronDown({ open }: { open: boolean }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 14,\n height: 14,\n color: \"#71717a\",\n transition: \"transform 0.15s\",\n transform: open ? \"rotate(180deg)\" : undefined,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n );\n}\n","// =============================================================================\n// Events list script\n//\n// Composes resolveEventsParams() and useInfiniteEvents() from @liberfi.io/react-predict.\n// Owns flattened page data and fetchMore / hasMore helpers for the events grid UI.\n// =============================================================================\nimport { useMemo, useCallback } from \"react\";\nimport type {\n PredictEvent,\n ListEventsParams,\n ResolveEventsParamsInput,\n} from \"@liberfi.io/react-predict\";\nimport {\n resolveEventsParams,\n useInfiniteEvents as usePredictInfiniteEvents,\n} from \"@liberfi.io/react-predict\";\n\nexport type {\n PredictEvent,\n ListEventsParams,\n PredictPage,\n EventSortField,\n EventStatus,\n ProviderSource,\n ResolveEventsParamsInput,\n} from \"@liberfi.io/react-predict\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\n/** Parameters for useEventsInfinite */\nexport type UseEventsInfiniteParams = ResolveEventsParamsInput;\n\n/** Return value of useEventsInfinite */\nexport interface UseEventsInfiniteResult {\n data: PredictEvent[];\n isLoading: boolean;\n isFetching: boolean;\n isFetchingMore: boolean;\n isError: boolean;\n error: Error | null;\n hasMore: boolean;\n fetchMore: () => void;\n refetch: () => void;\n}\n\n// -----------------------------------------------------------------------------\n// Hook\n// -----------------------------------------------------------------------------\n\n/**\n * Infinite events list hook with flattened pages for virtualized grids.\n *\n * Wraps {@link useInfiniteEvents} from `@liberfi.io/react-predict` and exposes\n * a single `data` array plus loading helpers matching legacy list-hook ergonomics.\n */\nexport function useEventsInfinite(\n params: UseEventsInfiniteParams = {},\n): UseEventsInfiniteResult {\n const baseParams = useMemo<ListEventsParams>(\n () => resolveEventsParams(params),\n [\n params.tagSlugSelection,\n params.limit,\n params.status,\n params.sort_by,\n params.sort_asc,\n params.source,\n params.with_markets,\n params.minVolume,\n params.minLiquidity,\n params.timeRemaining,\n ],\n );\n\n const {\n data: infiniteData,\n isLoading,\n isFetching,\n isFetchingNextPage: isFetchingMore,\n isError,\n error,\n hasNextPage: hasMore,\n fetchNextPage,\n refetch,\n } = usePredictInfiniteEvents(baseParams);\n\n const data = useMemo(\n () =>\n infiniteData?.pages\n .flatMap((page) => page.items)\n .filter((item): item is PredictEvent => item != null) ?? [],\n [infiniteData],\n );\n\n const fetchMore = useCallback(() => {\n void fetchNextPage();\n }, [fetchNextPage]);\n\n const refetchAll = useCallback(() => {\n void refetch();\n }, [refetch]);\n\n return {\n data,\n isLoading,\n isFetching: isFetching && !isFetchingMore,\n isFetchingMore,\n isError,\n error: error ?? null,\n hasMore: hasMore ?? false,\n fetchMore,\n refetch: refetchAll,\n };\n}\n","import { DEFAULT_PAGE_SIZE } from \"../../consts\";\n\n// ---------------------------------------------------------------------------\n// Shimmer animation keyframes (injected once per mount)\n// ---------------------------------------------------------------------------\n\nconst SHIMMER_CSS = `\n@keyframes evtShimmer{0%{background-position:200% 0}100%{background-position:-200% 0}}\n@media(max-width:1279px){.evt-skel-grid{grid-template-columns:repeat(3,1fr)!important}}\n@media(max-width:1023px){.evt-skel-grid{grid-template-columns:repeat(2,1fr)!important}.evt-skel-card{min-height:200px!important}}\n@media(max-width:767px){.evt-skel-grid{grid-template-columns:1fr!important}}\n.evt-skel-hero-outer{display:flex;flex-direction:column;align-items:center;gap:28px}\n@media(min-width:640px){.evt-skel-hero-outer{flex-direction:row;align-items:center;gap:40px}}\n@media(min-width:1024px){.evt-skel-hero-outer{gap:56px}}\n.evt-skel-hero-left{display:flex;flex-direction:column;align-items:center}\n@media(min-width:640px){.evt-skel-hero-left{align-items:flex-start}}\n.evt-skel-stat-grid{display:grid;grid-template-columns:repeat(2,1fr);width:100%;max-width:360px;border-radius:16px;border:1px solid rgba(39,39,42,0.5);overflow:hidden;flex-shrink:0}\n@media(min-width:640px){.evt-skel-stat-grid{width:340px;max-width:none}}\n@media(min-width:1024px){.evt-skel-stat-grid{width:380px}}\n.evt-skel-hero-wrap{padding:40px 16px 32px}\n@media(min-width:640px){.evt-skel-hero-wrap{padding:48px 24px 40px}}\n@media(min-width:1024px){.evt-skel-hero-wrap{padding:52px 32px 44px}}\n`;\n\nconst shimmer: React.CSSProperties = {\n background:\n \"linear-gradient(90deg, rgba(255,255,255,0.03) 25%, rgba(255,255,255,0.06) 50%, rgba(255,255,255,0.03) 75%)\",\n backgroundSize: \"200% 100%\",\n animation: \"evtShimmer 1.8s ease-in-out infinite\",\n borderRadius: 6,\n};\n\nfunction shimmerDelay(delay: number): React.CSSProperties {\n return {\n ...shimmer,\n animationDelay: `${delay}ms`,\n };\n}\n\n// ---------------------------------------------------------------------------\n// EventsSkeleton — card grid skeleton matching EventItem layout\n// ---------------------------------------------------------------------------\n\nexport interface EventsSkeletonProps {\n count?: number;\n}\n\nexport function EventsSkeleton({ count = 6 }: EventsSkeletonProps) {\n return (\n <>\n <style>{SHIMMER_CSS}</style>\n <div\n className=\"evt-skel-grid\"\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(4, 1fr)\",\n width: \"100%\",\n }}\n >\n {Array.from({ length: count }).map((_, i) => (\n <SkeletonCard key={i} index={i} />\n ))}\n </div>\n </>\n );\n}\n\n// ---------------------------------------------------------------------------\n// SkeletonCard — mirrors EventItem: header + 3 outcome rows + footer\n// ---------------------------------------------------------------------------\n\nfunction SkeletonCard({ index }: { index: number }) {\n const delay = index * 120;\n const s: React.CSSProperties = {\n ...shimmer,\n animationDelay: `${delay}ms`,\n };\n\n const titleWidth = index % 3 === 0 ? \"85%\" : index % 3 === 1 ? \"70%\" : \"60%\";\n\n return (\n <div style={{ padding: 8 }}>\n <div\n className=\"evt-skel-card\"\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n minHeight: 248,\n borderRadius: 14,\n border: \"1px solid rgba(39,39,42,0.6)\",\n background: \"rgba(24,24,27,0.4)\",\n overflow: \"hidden\",\n }}\n >\n {/* Header: avatar + title */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n padding: \"14px 14px 8px\",\n }}\n >\n <div\n style={{\n ...s,\n width: 36,\n height: 36,\n borderRadius: 10,\n flexShrink: 0,\n }}\n />\n <div\n style={{\n flex: 1,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 6,\n }}\n >\n <div style={{ ...s, height: 12, width: titleWidth }} />\n <div style={{ ...s, height: 10, width: \"40%\" }} />\n </div>\n </div>\n\n {/* Body: 3 outcome rows */}\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 6,\n padding: \"4px 14px 14px\",\n flex: 1,\n }}\n >\n {[0, 1, 2].map((j) => (\n <div\n key={j}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 8,\n }}\n >\n <div\n style={{\n ...s,\n height: 11,\n width: j === 0 ? \"55%\" : j === 1 ? \"45%\" : \"35%\",\n }}\n />\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\n <div style={{ ...s, height: 11, width: 32 }} />\n <div\n style={{\n ...s,\n height: 28,\n width: 80,\n borderRadius: 8,\n }}\n />\n </div>\n </div>\n ))}\n </div>\n\n {/* Footer */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n borderTop: \"1px solid rgba(39,39,42,0.5)\",\n background: \"rgba(39,39,42,0.15)\",\n padding: \"8px 14px\",\n }}\n >\n <div style={{ ...s, height: 10, width: 56 }} />\n <div style={{ ...s, height: 10, width: 72 }} />\n </div>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// HeroSkeleton — left-right layout: slogan left, 2x2 stats grid right\n// ---------------------------------------------------------------------------\n\nfunction HeroSkeleton() {\n return (\n <div\n style={{\n position: \"relative\",\n overflow: \"hidden\",\n borderBottom: \"1px solid rgba(39,39,42,0.5)\",\n width: \"100vw\",\n marginLeft: \"calc(-50vw + 50%)\",\n }}\n >\n {/* Background dots */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n opacity: 0.025,\n backgroundImage:\n \"radial-gradient(circle at 1px 1px, rgb(255 255 255) 1px, transparent 0)\",\n backgroundSize: \"20px 20px\",\n pointerEvents: \"none\",\n }}\n />\n <div\n className=\"evt-skel-hero-wrap\"\n style={{\n position: \"relative\",\n zIndex: 1,\n maxWidth: 1152,\n margin: \"0 auto\",\n }}\n >\n <div className=\"evt-skel-hero-outer\">\n {/* Left: badge + title + subtitle */}\n <div\n className=\"evt-skel-hero-left\"\n style={{ minWidth: 0, flex: 1, gap: 16 }}\n >\n {/* Badge */}\n <div\n style={{\n ...shimmerDelay(0),\n width: 120,\n height: 28,\n borderRadius: 9999,\n }}\n />\n {/* Title lines */}\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n }}\n >\n <div\n style={{\n ...shimmerDelay(50),\n width: 280,\n height: 28,\n borderRadius: 8,\n }}\n />\n <div\n style={{\n ...shimmerDelay(80),\n width: 200,\n height: 28,\n borderRadius: 8,\n }}\n />\n </div>\n {/* Subtitle lines */}\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 6,\n }}\n >\n <div\n style={{\n ...shimmerDelay(120),\n height: 14,\n width: 360,\n maxWidth: \"100%\",\n }}\n />\n <div\n style={{\n ...shimmerDelay(150),\n height: 14,\n width: 300,\n maxWidth: \"100%\",\n }}\n />\n </div>\n </div>\n\n {/* Right: 2x2 stats grid */}\n <div className=\"evt-skel-stat-grid\">\n {[0, 1, 2, 3].map((idx) => (\n <div\n key={idx}\n style={{\n padding: \"14px 16px\",\n background: \"rgba(255,255,255,0.02)\",\n borderRight:\n idx % 2 === 0 ? \"1px solid rgba(39,39,42,0.4)\" : \"none\",\n borderBottom:\n idx < 2 ? \"1px solid rgba(39,39,42,0.4)\" : \"none\",\n }}\n >\n <div\n style={{\n ...shimmerDelay(200 + idx * 60),\n height: 22,\n width: 56,\n borderRadius: 4,\n }}\n />\n <div\n style={{\n ...shimmerDelay(230 + idx * 60),\n height: 14,\n width: 64,\n borderRadius: 4,\n marginTop: 4,\n }}\n />\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// CategoriesToolbarSkeleton — matches CategoriesUI container styles\n// ---------------------------------------------------------------------------\n\nfunction CategoriesToolbarSkeleton() {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"10px 16px\",\n borderBottom: \"1px solid rgba(39,39,42,0.3)\",\n background: \"rgba(10,10,11,0.8)\",\n }}\n >\n {/* Category tabs */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n minHeight: 40,\n flex: 1,\n }}\n >\n {[48, 64, 48, 56, 72, 56].map((w, i) => (\n <div\n key={i}\n style={{\n ...shimmerDelay(i * 50),\n height: 28,\n width: w,\n borderRadius: 6,\n }}\n />\n ))}\n </div>\n\n {/* Toolbar buttons */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n flexShrink: 0,\n }}\n >\n <div\n style={{\n ...shimmerDelay(0),\n height: 36,\n width: 120,\n borderRadius: 10,\n }}\n />\n <div\n style={{\n ...shimmerDelay(50),\n height: 36,\n width: 36,\n borderRadius: 10,\n }}\n />\n <div\n style={{\n ...shimmerDelay(100),\n height: 36,\n width: 80,\n borderRadius: 10,\n }}\n />\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// EventsPageSkeleton — full page: hero + categories + toolbar + card grid\n// ---------------------------------------------------------------------------\n\nexport interface EventsPageSkeletonProps extends EventsSkeletonProps {}\n\nexport function EventsPageSkeleton({\n count = DEFAULT_PAGE_SIZE,\n}: EventsPageSkeletonProps) {\n return (\n <div\n style={{\n minHeight: \"100vh\",\n position: \"relative\",\n width: \"100%\",\n maxWidth: 1680,\n margin: \"0 auto\",\n }}\n >\n <style>{SHIMMER_CSS}</style>\n\n {/* Hero skeleton */}\n <HeroSkeleton />\n\n {/* Categories + toolbar skeleton */}\n <CategoriesToolbarSkeleton />\n\n {/* Card grid skeleton */}\n <div style={{ padding: \"12px 8px 80px\" }}>\n <EventsSkeleton count={count} />\n </div>\n </div>\n );\n}\n","// =============================================================================\n// EventItem\n//\n// Event card with three modes:\n// 1. **List view** — header + up to 3 outcome rows with a compact Yes/No\n// pill + footer (Show More / volume).\n// 2. **Single view** — header + single market with large Yes/No buy\n// buttons + View Event link.\n// 3. **Expanded view** — header + single market with large Yes/No buy\n// buttons + Back link.\n//\n// Pixel-perfect clone of the Jupiter Prediction Market card design.\n// =============================================================================\nimport { useMemo, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type {\n PredictEvent,\n PredictMarket,\n ProviderSource,\n} from \"@liberfi.io/react-predict\";\nimport {\n Avatar,\n ChevronUpIcon,\n cn,\n KalshiIcon,\n Linkable,\n PolymarketIcon,\n TimerIcon,\n} from \"@liberfi.io/ui\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\n\n// -----------------------------------------------------------------------------\n// Types\n// -----------------------------------------------------------------------------\n\nexport type EventItemProps = {\n event: PredictEvent;\n /** URL for the detail page. When set, header / Show More render as links. */\n href?: string;\n /** Custom link component (e.g. next/link). Passed to Linkable. */\n LinkComponent?: LinkComponentType;\n onSelect?: (event: PredictEvent) => void;\n onSelectOutcome?: (\n event: PredictEvent,\n market: PredictMarket,\n side: \"yes\" | \"no\",\n ) => void;\n /** Called when the card is hovered (for data prefetching). */\n onHover?: (event: PredictEvent) => void;\n};\n\n// -----------------------------------------------------------------------------\n// Constants\n// -----------------------------------------------------------------------------\n\nconst MAX_DISPLAYED_OUTCOMES = 3;\n\n// -----------------------------------------------------------------------------\n// Platform-specific hover glow colors\n// -----------------------------------------------------------------------------\n\ntype GlowColor = { border: string; shadow: string };\n\nconst SOURCE_GLOW: Record<string, GlowColor> = {\n polymarket: {\n border: \"rgba(80,162,255,0.4)\",\n shadow: \"0 2px 18px rgba(80,162,255,0.45)\",\n },\n kalshi: {\n border: \"rgba(0,212,146,0.4)\",\n shadow: \"0 2px 18px rgba(0,212,146,0.45)\",\n },\n};\n\nconst GLOW_FALLBACK: GlowColor = {\n border: \"hsl(var(--heroui-primary) / 0.4)\",\n shadow: \"0 2px 18px hsl(var(--heroui-primary) / 0.45)\",\n};\n\n// -----------------------------------------------------------------------------\n// Outcome color scheme — 8-color palette with deterministic hash selection\n// -----------------------------------------------------------------------------\n\ntype OutcomeColor = { bg: string; text: string; shadow: string };\n\nconst C_PRIMARY: OutcomeColor = {\n bg: \"hsl(var(--heroui-primary) / 0.14)\",\n text: \"hsl(var(--heroui-primary))\",\n shadow: \"hsl(var(--heroui-primary) / 0.18)\",\n};\n\nconst C_SECONDARY: OutcomeColor = {\n bg: \"hsl(var(--heroui-secondary) / 0.14)\",\n text: \"hsl(var(--heroui-secondary))\",\n shadow: \"hsl(var(--heroui-secondary) / 0.18)\",\n};\n\nconst C_RED: OutcomeColor = {\n bg: \"rgba(239, 68, 68, 0.14)\",\n text: \"rgb(239, 68, 68)\",\n shadow: \"rgba(239, 68, 68, 0.18)\",\n};\n\nconst TEAM_PALETTE: OutcomeColor[] = [\n {\n bg: \"rgba(139,92,246,0.14)\",\n text: \"rgb(139,92,246)\",\n shadow: \"rgba(139,92,246,0.18)\",\n },\n {\n bg: \"rgba(34,197,94,0.14)\",\n text: \"rgb(34,197,94)\",\n shadow: \"rgba(34,197,94,0.18)\",\n },\n {\n bg: \"rgba(0,166,212,0.14)\",\n text: \"rgb(0,166,212)\",\n shadow: \"rgba(0,166,212,0.18)\",\n },\n {\n bg: \"rgba(194,120,32,0.14)\",\n text: \"rgb(194,120,32)\",\n shadow: \"rgba(194,120,32,0.18)\",\n },\n {\n bg: \"rgba(202,138,4,0.14)\",\n text: \"rgb(202,138,4)\",\n shadow: \"rgba(202,138,4,0.18)\",\n },\n {\n bg: \"rgba(236,72,153,0.14)\",\n text: \"rgb(236,72,153)\",\n shadow: \"rgba(236,72,153,0.18)\",\n },\n {\n bg: \"rgba(99,102,241,0.14)\",\n text: \"rgb(99,102,241)\",\n shadow: \"rgba(99,102,241,0.18)\",\n },\n {\n bg: \"rgba(244,114,82,0.14)\",\n text: \"rgb(244,114,82)\",\n shadow: \"rgba(244,114,82,0.18)\",\n },\n];\n\nfunction hashString(s: string): number {\n let hash = 0;\n for (let i = 0; i < s.length; i++) {\n hash = ((hash << 5) - hash + s.charCodeAt(i)) | 0;\n }\n return Math.abs(hash);\n}\n\nfunction getOutcomeColors(market: PredictMarket): [OutcomeColor, OutcomeColor] {\n const labels =\n market.outcomes?.map((o) => o.label?.toLowerCase().trim() ?? \"\") ?? [];\n\n if (labels.some((l) => l === \"up\") && labels.some((l) => l === \"down\")) {\n return [C_PRIMARY, C_RED];\n }\n\n if (labels.some((l) => l === \"yes\") && labels.some((l) => l === \"no\")) {\n return [C_PRIMARY, C_SECONDARY];\n }\n\n const label0 = labels[0] ?? \"\";\n const label1 = labels[1] ?? \"\";\n const idx0 = hashString(label0) % TEAM_PALETTE.length;\n let idx1 = hashString(label1) % TEAM_PALETTE.length;\n if (idx1 === idx0) idx1 = (idx1 + 1) % TEAM_PALETTE.length;\n\n return [TEAM_PALETTE[idx0], TEAM_PALETTE[idx1]];\n}\n\n// -----------------------------------------------------------------------------\n// Price helpers\n// -----------------------------------------------------------------------------\n\nfunction getYesAsk(market: PredictMarket): number | null {\n const yes = market.outcomes?.[0];\n if (!yes) return null;\n return yes.best_ask ?? yes.price ?? null;\n}\n\nfunction getYesPercent(market: PredictMarket): number {\n const price = getYesAsk(market);\n return price != null ? parseFloat((price * 100).toFixed(2)) : 0;\n}\n\nfunction formatPercent(value: number): string {\n if (value <= 1 && value > 0) return \"< 1%\";\n if (value >= 99 && value < 100) return \"> 99%\";\n return `${value}%`;\n}\n\nfunction getYesCents(market: PredictMarket): string {\n const yes = market.outcomes?.[0];\n const price = yes?.best_ask ?? yes?.price ?? 0;\n return parseFloat((price * 100).toFixed(2)).toString();\n}\n\nfunction getNoCents(market: PredictMarket): string {\n const no = market.outcomes?.[1];\n if (no) {\n const price = no.best_ask ?? no.price ?? 0;\n return parseFloat((price * 100).toFixed(2)).toString();\n }\n const yes = market.outcomes?.[0];\n const yesPrice = yes?.best_ask ?? yes?.price ?? 0;\n return parseFloat(((1 - yesPrice) * 100).toFixed(2)).toString();\n}\n\n// -----------------------------------------------------------------------------\n// Countdown helpers\n// -----------------------------------------------------------------------------\n\nfunction formatCountdown(isoDate: string): string | null {\n const diff = new Date(isoDate).getTime() - Date.now();\n if (diff <= 0) return null;\n\n const d = Math.floor(diff / 86_400_000);\n const h = Math.floor((diff % 86_400_000) / 3_600_000);\n const m = Math.floor((diff % 3_600_000) / 60_000);\n\n const parts: string[] = [];\n if (d > 0) parts.push(`${d}d`);\n if (h > 0) parts.push(`${h}h`);\n parts.push(`${m}m`);\n\n return parts.join(\" \");\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nconst injectedCSS = `\n.badge-shine { position: relative; overflow: hidden; }\n.badge-shine::after {\n content: \"\";\n position: absolute;\n inset: 0;\n background: linear-gradient(120deg,\n transparent 0%, transparent 30%,\n rgba(255,255,255,0.15) 45%, rgba(255,255,255,0.25) 50%,\n rgba(255,255,255,0.15) 55%, transparent 70%, transparent 100%);\n transform: translate(-200%);\n animation: badge-shine-sweep 6s ease-in-out infinite;\n}\n@keyframes badge-shine-sweep {\n 0% { transform: translate(-200%); }\n 60% { transform: translate(200%); }\n 100% { transform: translate(200%); }\n}\n.evt-card button:focus-visible,\n.evt-card a:focus-visible,\n.evt-card [role=\"button\"]:focus-visible {\n outline: 2px solid hsl(var(--heroui-primary) / 0.4);\n outline-offset: 2px;\n}\n`;\n\nexport function EventItem({\n event,\n href,\n LinkComponent,\n onSelect,\n onSelectOutcome,\n onHover,\n}: EventItemProps) {\n const [expandedSlug, setExpandedSlug] = useState<string | null>(null);\n\n const rawMarkets = event.markets ?? [];\n const markets = useMemo(\n () =>\n rawMarkets.length > 2\n ? [...rawMarkets].sort(\n (a, b) =>\n (b.outcomes?.[0]?.price ?? 0) - (a.outcomes?.[0]?.price ?? 0),\n )\n : rawMarkets,\n [rawMarkets],\n );\n\n const openMarkets = markets.filter((m) => m.status === \"open\");\n const singleMarket = openMarkets.length === 1;\n const displayedMarkets = openMarkets.slice(0, MAX_DISPLAYED_OUTCOMES);\n const moreCount = openMarkets.length - MAX_DISPLAYED_OUTCOMES;\n\n const formattedVolume = useMemo(() => {\n const vol = Math.round(event.volume ?? 0);\n return `$${vol.toLocaleString(\"en-US\")}`;\n }, [event.volume]);\n\n const expandedMarket = expandedSlug\n ? (openMarkets.find((m) => m.slug === expandedSlug) ?? null)\n : null;\n\n const isExpanded = !!expandedMarket || singleMarket;\n\n // -- handlers --\n\n const handleCardClick = () => {\n if (!isExpanded) {\n onSelect?.(event);\n }\n };\n\n const handleHeaderClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (expandedMarket) {\n e.preventDefault();\n setExpandedSlug(null);\n }\n };\n\n const handleShowMore = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!href) {\n e.preventDefault();\n onSelect?.(event);\n }\n };\n\n const footerContent = singleMarket ? (\n <SingleMarketFooter\n event={event}\n formattedVolume={formattedVolume}\n href={href}\n LinkComponent={LinkComponent}\n onSelect={onSelect}\n />\n ) : expandedMarket ? (\n <ExpandedMarketFooter onCollapse={() => setExpandedSlug(null)} />\n ) : (\n <MarketListFooter\n moreCount={moreCount}\n formattedVolume={formattedVolume}\n source={event.source}\n href={href}\n LinkComponent={LinkComponent}\n onShowMore={handleShowMore}\n />\n );\n\n return (\n <div\n className=\"group evt-card\"\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n width: \"100%\",\n borderRadius: 14,\n border: \"1px solid rgba(39,39,42,0.6)\",\n background: \"rgba(24,24,27,0.4)\",\n overflow: \"hidden\",\n transition: \"all 0.2s\",\n cursor: !isExpanded ? \"pointer\" : undefined,\n }}\n onMouseEnter={(e) => {\n const el = e.currentTarget as HTMLDivElement;\n const glowColor = SOURCE_GLOW[event.source] ?? GLOW_FALLBACK;\n el.style.borderColor = glowColor.border;\n el.style.boxShadow = glowColor.shadow;\n onHover?.(event);\n }}\n onMouseLeave={(e) => {\n const el = e.currentTarget as HTMLDivElement;\n el.style.borderColor = \"rgba(39,39,42,0.6)\";\n el.style.boxShadow = \"none\";\n }}\n onClick={handleCardClick}\n >\n <style>{injectedCSS}</style>\n\n {/* ---- Header + Body (padded) ---- */}\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n flex: 1,\n padding: \"14px 14px 12px\",\n gap: 8,\n }}\n >\n <CardHeader\n event={event}\n href={href}\n LinkComponent={LinkComponent}\n onClick={handleHeaderClick}\n isExpanded={isExpanded}\n />\n\n <div style={{ display: \"flex\", flexDirection: \"column\", flex: 1 }}>\n {singleMarket ? (\n <SingleMarketBody\n market={openMarkets[0]}\n event={event}\n onSelectOutcome={onSelectOutcome}\n />\n ) : expandedMarket ? (\n <ExpandedMarketBody\n market={expandedMarket}\n event={event}\n onCollapse={() => setExpandedSlug(null)}\n onSelectOutcome={onSelectOutcome}\n />\n ) : (\n <MarketListBody\n displayedMarkets={displayedMarkets}\n onMarketClick={(m) => setExpandedSlug(m.slug)}\n />\n )}\n </div>\n </div>\n\n {/* ---- Footer (edge-to-edge, outside padding) ---- */}\n <CardFooter>{footerContent}</CardFooter>\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Card header (avatar + title + badges)\n// -----------------------------------------------------------------------------\n\nfunction CardHeader({\n event,\n href,\n LinkComponent,\n onClick,\n isExpanded,\n}: {\n event: PredictEvent;\n href?: string;\n LinkComponent?: LinkComponentType;\n onClick: React.MouseEventHandler;\n isExpanded: boolean;\n}) {\n const countdown = event.start_at ? formatCountdown(event.start_at) : null;\n\n const cls =\n \"group/header flex items-center gap-x-2 lg:gap-x-4 w-full text-left cursor-pointer\";\n\n return (\n <Linkable\n href={href}\n LinkComponent={LinkComponent}\n as=\"button\"\n className={cls}\n onClick={onClick}\n >\n <Avatar\n src={event.image_url || undefined}\n name={event.title || \"Event\"}\n radius=\"lg\"\n className=\"h-8 w-8 flex-shrink-0 transition-transform duration-300 group-hover/header:scale-110 lg:h-12 lg:w-12\"\n classNames={{ base: \"bg-transparent\" }}\n />\n <div className=\"flex min-w-0 flex-1 flex-col justify-center gap-y-0.5\">\n <p\n className={cn(\n \"min-w-0 text-sm font-semibold leading-snug text-slate-200 line-clamp-2 lg:text-base\",\n isExpanded && \"group-hover/header:text-neutral-400\",\n )}\n >\n {event.title}\n </p>\n {countdown && (\n <span className=\"text-[10px] leading-4 text-neutral-500\">\n Live in {countdown}\n </span>\n )}\n </div>\n <EventIndicators event={event} />\n </Linkable>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Event indicator badges (Live / Crypto Countdown / Closed)\n// -----------------------------------------------------------------------------\n\ntype BadgeType =\n | { kind: \"live\" }\n | { kind: \"crypto-short\"; label: string; color: string }\n | { kind: \"closed\" };\n\nfunction getEventBadges(event: PredictEvent): BadgeType[] {\n const badges: BadgeType[] = [];\n\n if (event.status === \"closed\") {\n badges.push({ kind: \"closed\" });\n return badges.slice(0, 2);\n }\n\n const isCrypto = event.tags?.some((t) => t.label?.toLowerCase() === \"crypto\");\n const isLive = event.tags?.some((t) => t.label?.toLowerCase() === \"live\");\n\n if (isCrypto && event.end_at) {\n const remaining = new Date(event.end_at).getTime() - Date.now();\n const fiveMin = 5 * 60 * 1000;\n const fifteenMin = 15 * 60 * 1000;\n\n if (remaining > 0 && remaining <= fifteenMin) {\n const cryptoColor = remaining <= fiveMin ? \"#ef4444\" : \"#f59e0b\";\n badges.push({\n kind: \"crypto-short\",\n label: remaining <= fiveMin ? \"5m\" : \"15m\",\n color: cryptoColor,\n });\n }\n }\n\n if (isLive) {\n badges.push({ kind: \"live\" });\n }\n\n return badges.slice(0, 2);\n}\n\nfunction EventIndicators({ event }: { event: PredictEvent }) {\n const badges = useMemo(() => getEventBadges(event), [event]);\n\n if (badges.length === 0) return null;\n\n return (\n <div className=\"flex flex-shrink-0 flex-col items-end gap-1\">\n {badges.map((badge, i) => {\n switch (badge.kind) {\n case \"live\":\n return <LiveBadge key={i} />;\n case \"crypto-short\":\n return (\n <CryptoCountdownBadge\n key={i}\n label={badge.label}\n color={badge.color}\n />\n );\n case \"closed\":\n return <ClosedBadge key={i} />;\n }\n })}\n </div>\n );\n}\n\nfunction LiveBadge() {\n const { t } = useTranslation();\n return (\n <span className=\"badge-shine relative inline-flex items-center gap-1 overflow-hidden rounded-md bg-[rgb(240,68,56)]/10 px-1.5 py-0.5 text-xs font-semibold text-[rgb(240,68,56)]\">\n <span className=\"h-2 w-2 animate-pulse rounded-full bg-current\" />\n {t(\"predict.event.status.live\")}\n </span>\n );\n}\n\nfunction CryptoCountdownBadge({\n label,\n color,\n}: {\n label: string;\n color: string;\n}) {\n return (\n <span\n className=\"badge-shine relative inline-flex items-center gap-1 overflow-hidden rounded-md px-1.5 py-0.5 text-xs font-semibold\"\n style={{\n backgroundColor: `${color}26`,\n color,\n }}\n >\n <TimerIcon className=\"size-3 shrink-0\" />\n {label}\n </span>\n );\n}\n\nfunction ClosedBadge() {\n const { t } = useTranslation();\n return (\n <span className=\"inline-flex items-center rounded-md bg-neutral-800/80 px-1.5 py-0.5 text-xs font-semibold text-neutral-400\">\n {t(\"predict.event.status.closed\")}\n </span>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Market list — body (outcome rows only)\n// -----------------------------------------------------------------------------\n\nfunction MarketListBody({\n displayedMarkets,\n onMarketClick,\n}: {\n displayedMarkets: PredictMarket[];\n onMarketClick: (market: PredictMarket) => void;\n}) {\n return displayedMarkets.length > 0 ? (\n <div className=\"flex w-full flex-1 flex-col gap-y-0.5 lg:gap-y-2\">\n {displayedMarkets.map((market) => {\n const pct = getYesPercent(market);\n return (\n <button\n type=\"button\"\n key={market.id ?? `${market.source}-${market.slug}`}\n className=\"flex h-9 w-full items-center justify-between gap-x-2 transition-opacity hover:cursor-pointer hover:opacity-80\"\n onClick={(e) => {\n e.stopPropagation();\n onMarketClick(market);\n }}\n >\n <span className=\"min-w-0 flex-1 text-left text-xs text-slate-200 line-clamp-1 lg:text-sm\">\n {market.outcomes?.[0]?.label ?? market.question}\n </span>\n <div className=\"flex items-center gap-x-2\">\n <span className=\"text-sm font-semibold text-slate-200 lg:text-lg\">\n {formatPercent(pct)}\n </span>\n <YesNoPill />\n </div>\n </button>\n );\n })}\n </div>\n ) : null;\n}\n\n// -----------------------------------------------------------------------------\n// Market list — footer\n// -----------------------------------------------------------------------------\n\nfunction MarketListFooter({\n moreCount,\n formattedVolume,\n source,\n href,\n LinkComponent,\n onShowMore,\n}: {\n moreCount: number;\n formattedVolume: string;\n source: ProviderSource;\n href?: string;\n LinkComponent?: LinkComponentType;\n onShowMore: React.MouseEventHandler;\n}) {\n const { t } = useTranslation();\n\n return (\n <>\n {moreCount > 0 ? (\n <Linkable\n href={href}\n LinkComponent={LinkComponent}\n as=\"button\"\n className=\"flex items-center gap-1 text-[10px] font-normal text-zinc-500 transition-colors hover:text-slate-200 cursor-pointer lg:text-xs\"\n onClick={onShowMore}\n >\n {t(\"predict.event.showMore\")}\n <ChevronRightIcon className=\"h-3 w-3\" />\n </Linkable>\n ) : (\n <div />\n )}\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n fontSize: 10,\n color: \"#71717a\",\n }}\n >\n {formattedVolume} {t(\"predict.event.volume\")}\n <SourceIcon source={source} />\n </span>\n </>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Card footer (separated bar matching matches card style)\n// -----------------------------------------------------------------------------\n\nfunction CardFooter({ children }: { children: React.ReactNode }) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n borderTop: \"1px solid rgba(39,39,42,0.5)\",\n background: \"rgba(39,39,42,0.15)\",\n padding: \"8px 14px\",\n marginTop: \"auto\",\n }}\n >\n {children}\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Elevated button (matches Jupiter design exactly)\n// -----------------------------------------------------------------------------\n\nfunction ElevatedButton({\n bgColor,\n textColor,\n shadowColor,\n onClick,\n children,\n}: {\n bgColor: string;\n textColor: string;\n shadowColor: string;\n onClick: React.MouseEventHandler;\n children: React.ReactNode;\n}) {\n const handleEnter = (e: React.MouseEvent<HTMLButtonElement>) => {\n const el = e.currentTarget;\n el.style.setProperty(\"--shadow-offset\", \"2px\");\n el.style.transform = \"translateY(2px)\";\n };\n\n const handleLeave = (e: React.MouseEvent<HTMLButtonElement>) => {\n const el = e.currentTarget;\n el.style.setProperty(\"--shadow-offset\", \"4px\");\n el.style.transform = \"translateY(0px)\";\n };\n\n return (\n <button\n type=\"button\"\n className=\"flex h-12 flex-1 w-full items-center justify-center gap-x-1 overflow-hidden rounded-lg p-3 text-base font-normal hover:cursor-pointer will-change-transform [-webkit-tap-highlight-color:transparent]\"\n style={\n {\n backgroundColor: bgColor,\n color: textColor,\n \"--shadow-color\": shadowColor,\n \"--shadow-offset\": \"4px\",\n boxShadow:\n \"inset 0 -1px 0 rgba(255,255,255,0.08), 0 var(--shadow-offset, 4px) 0 var(--shadow-color, rgba(0,0,0,0.22))\",\n transition: \"transform .12s, box-shadow .12s, opacity .14s\",\n } as React.CSSProperties\n }\n onMouseEnter={handleEnter}\n onMouseLeave={handleLeave}\n onClick={onClick}\n >\n {children}\n </button>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Outcome buy buttons (shared by SingleMarketView & ExpandedMarketView)\n// -----------------------------------------------------------------------------\n\nfunction OutcomeButtons({\n market,\n event,\n onSelectOutcome,\n dynamicColors = false,\n labelFormat = \"action\",\n}: {\n market: PredictMarket;\n event: PredictEvent;\n onSelectOutcome?: (\n event: PredictEvent,\n market: PredictMarket,\n side: \"yes\" | \"no\",\n ) => void;\n dynamicColors?: boolean;\n /** \"action\" → \"Yes XX.X¢\" / \"No XX¢\", \"label\" → \"Label XX¢\" */\n labelFormat?: \"action\" | \"label\";\n}) {\n const { t } = useTranslation();\n const [c0, c1] = dynamicColors\n ? getOutcomeColors(market)\n : [C_PRIMARY, C_SECONDARY];\n\n const label0 = market.outcomes?.[0]?.label?.toLowerCase().trim() ?? \"\";\n const label1 = market.outcomes?.[1]?.label?.toLowerCase().trim() ?? \"\";\n const effectiveFormat =\n labelFormat === \"label\" && label0 === label1 ? \"action\" : labelFormat;\n\n const yesLabel =\n effectiveFormat === \"label\"\n ? `${market.outcomes?.[0]?.label ?? \"Yes\"} ${getYesCents(market)}¢`\n : t(\"predict.market.action.yes\", { price: getYesCents(market) });\n\n const noLabel =\n effectiveFormat === \"label\"\n ? `${market.outcomes?.[1]?.label ?? \"No\"} ${getNoCents(market)}¢`\n : t(\"predict.market.action.no\", { price: getNoCents(market) });\n\n return (\n <div className=\"flex gap-2\">\n <ElevatedButton\n bgColor={c0.bg}\n textColor={c0.text}\n shadowColor={c0.shadow}\n onClick={(e) => {\n e.stopPropagation();\n onSelectOutcome?.(event, market, \"yes\");\n }}\n >\n {yesLabel}\n </ElevatedButton>\n <ElevatedButton\n bgColor={c1.bg}\n textColor={c1.text}\n shadowColor={c1.shadow}\n onClick={(e) => {\n e.stopPropagation();\n onSelectOutcome?.(event, market, \"no\");\n }}\n >\n {noLabel}\n </ElevatedButton>\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Yes / No pill (compact, used in list rows)\n// -----------------------------------------------------------------------------\n\nfunction YesNoPill() {\n const { t } = useTranslation();\n\n return (\n <span className=\"inline-flex h-7 w-[85px] items-center justify-center gap-x-3 rounded-lg p-1.5 text-xs font-semibold flex-shrink-0 bg-gradient-to-r from-primary/15 to-secondary/15 lg:h-9 lg:w-24 lg:gap-x-4 lg:p-2 lg:text-sm\">\n <span className=\"text-primary\">{t(\"predict.market.yes\")}</span>\n <span className=\"text-neutral-400\">/</span>\n <span className=\"text-secondary\">{t(\"predict.market.no\")}</span>\n </span>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Single market — body (buy buttons only)\n// -----------------------------------------------------------------------------\n\nfunction SingleMarketBody({\n market,\n event,\n onSelectOutcome,\n}: {\n market: PredictMarket;\n event: PredictEvent;\n onSelectOutcome?: (\n event: PredictEvent,\n market: PredictMarket,\n side: \"yes\" | \"no\",\n ) => void;\n}) {\n return (\n <div style={{ flex: 1 }}>\n <OutcomeButtons\n market={market}\n event={event}\n onSelectOutcome={onSelectOutcome}\n dynamicColors\n labelFormat=\"label\"\n />\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Single market — footer\n// -----------------------------------------------------------------------------\n\nfunction SingleMarketFooter({\n event,\n formattedVolume,\n href,\n LinkComponent,\n onSelect,\n}: {\n event: PredictEvent;\n formattedVolume: string;\n href?: string;\n LinkComponent?: LinkComponentType;\n onSelect?: (event: PredictEvent) => void;\n}) {\n const { t } = useTranslation();\n\n const handleViewEvent = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (!href) {\n e.preventDefault();\n onSelect?.(event);\n }\n };\n\n return (\n <>\n <Linkable\n href={href}\n LinkComponent={LinkComponent}\n as=\"button\"\n className=\"flex items-center gap-1 text-[10px] font-normal text-zinc-500 transition-colors hover:text-slate-200 cursor-pointer lg:text-xs\"\n onClick={handleViewEvent}\n >\n {t(\"predict.event.viewEvent\")}\n <ChevronRightIcon className=\"h-3 w-3\" />\n </Linkable>\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n fontSize: 10,\n color: \"#71717a\",\n }}\n >\n {formattedVolume} {t(\"predict.event.volume\")}\n <SourceIcon source={event.source} />\n </span>\n </>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Expanded market — body (collapse toggle + buy buttons)\n// -----------------------------------------------------------------------------\n\nfunction ExpandedMarketBody({\n market,\n event,\n onCollapse,\n onSelectOutcome,\n}: {\n market: PredictMarket;\n event: PredictEvent;\n onCollapse: () => void;\n onSelectOutcome?: (\n event: PredictEvent,\n market: PredictMarket,\n side: \"yes\" | \"no\",\n ) => void;\n}) {\n const pct = getYesPercent(market);\n\n return (\n <div style={{ flex: 1 }}>\n <button\n type=\"button\"\n className=\"flex h-9 w-full items-center justify-between cursor-pointer\"\n onClick={(e) => {\n e.stopPropagation();\n onCollapse();\n }}\n >\n <span className=\"min-w-0 flex-1 text-left text-xs text-slate-200 lg:text-sm\">\n {market.outcomes?.[0]?.label ?? market.question}\n </span>\n <div className=\"flex items-center gap-x-1 flex-shrink-0\">\n <span className=\"text-sm font-semibold text-slate-200 lg:text-lg\">\n {formatPercent(pct)}\n </span>\n <ChevronUpIcon className=\"h-4 w-4 text-neutral-400\" />\n </div>\n </button>\n <div style={{ marginTop: 12 }}>\n <OutcomeButtons\n market={market}\n event={event}\n onSelectOutcome={onSelectOutcome}\n labelFormat=\"action\"\n />\n </div>\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Expanded market — footer\n// -----------------------------------------------------------------------------\n\nfunction ExpandedMarketFooter({ onCollapse }: { onCollapse: () => void }) {\n const { t } = useTranslation();\n\n return (\n <>\n <button\n type=\"button\"\n className=\"flex items-center gap-x-1 text-[10px] font-normal transition-colors hover:text-slate-200 cursor-pointer lg:text-xs\"\n style={{ color: \"#71717a\" }}\n onClick={(e) => {\n e.stopPropagation();\n onCollapse();\n }}\n >\n <ChevronLeftIcon className=\"h-3 w-3\" />\n {t(\"predict.event.back\")}\n </button>\n <div />\n </>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Inline icons\n// -----------------------------------------------------------------------------\n\nfunction ChevronRightIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M4.5 2.5L8 6l-3.5 3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nfunction ChevronLeftIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M7.5 2.5L4 6l3.5 3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Source (platform) icons\n// -----------------------------------------------------------------------------\n\nfunction SourceIcon({ source }: { source: ProviderSource }) {\n const title = source === \"polymarket\" ? \"Polymarket\" : \"Kalshi\";\n return (\n <span\n className=\"inline-flex items-center gap-x-1 text-neutral-400\"\n title={title}\n >\n <span className=\"text-neutral-600\">·</span>\n {source === \"polymarket\" ? (\n <PolymarketIcon className=\"h-5 w-auto shrink-0\" />\n ) : (\n <KalshiIcon className=\"h-3 w-auto shrink-0\" />\n )}\n </span>\n );\n}\n","// =============================================================================\n// EventsUI\n//\n// Events grid: PredictEvent[] with EventItem cards.\n// Layout: responsive 1-4 column CSS grid with IntersectionObserver infinite\n// scroll sentinel.\n// =============================================================================\nimport { useCallback, useEffect, useRef } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent, PredictMarket } from \"@liberfi.io/react-predict\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { EventItem } from \"./event-item.ui\";\n\nconst GLOW_INSET = 8;\n\n// -----------------------------------------------------------------------------\n// EventsUI\n// -----------------------------------------------------------------------------\n\nexport type EventsUIProps = {\n events: PredictEvent[];\n hasMore?: boolean;\n isFetchingMore?: boolean;\n onFetchMore?: () => void;\n onSelect?: (event: PredictEvent) => void;\n onSelectOutcome?: (\n event: PredictEvent,\n market: PredictMarket,\n side: \"yes\" | \"no\",\n ) => void;\n getEventHref?: (event: PredictEvent) => string;\n LinkComponent?: LinkComponentType;\n onHover?: (event: PredictEvent) => void;\n};\n\nexport function EventsUI({\n events,\n hasMore = false,\n isFetchingMore = false,\n onFetchMore,\n onSelect,\n onSelectOutcome,\n getEventHref,\n LinkComponent,\n onHover,\n}: EventsUIProps) {\n const { t } = useTranslation();\n const sentinelRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const el = sentinelRef.current;\n if (!el) return;\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries[0]?.isIntersecting && hasMore && !isFetchingMore) {\n onFetchMore?.();\n }\n },\n { rootMargin: \"300px\" },\n );\n observer.observe(el);\n return () => observer.disconnect();\n }, [hasMore, isFetchingMore, onFetchMore]);\n\n const handleScrollToTop = useCallback(() => {\n window.scrollTo({ top: 0, behavior: \"smooth\" });\n }, []);\n\n const showEndOfList = !hasMore && events.length > 0;\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\" }}>\n <style>{`\n@keyframes eventCardEnter{from{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}\n@keyframes evt-load-spin{to{transform:rotate(360deg)}}\n@media(max-width:767px){.evt-card-grid{grid-template-columns:1fr!important}}\n@media(min-width:768px) and (max-width:1023px){.evt-card-grid{grid-template-columns:repeat(2,1fr)!important}}\n@media(min-width:1024px) and (max-width:1279px){.evt-card-grid{grid-template-columns:repeat(3,1fr)!important}}\n`}</style>\n <div\n className=\"evt-card-grid\"\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(4, 1fr)\",\n }}\n >\n {events.map((event, i) =>\n event == null ? null : (\n <div\n key={`${event.source}-${event.slug}`}\n style={{\n padding: GLOW_INSET,\n animation: `eventCardEnter 0.45s cubic-bezier(0.34,1.56,0.64,1) ${(i % 4) * 35}ms both`,\n }}\n >\n <EventItem\n event={event}\n href={getEventHref?.(event)}\n LinkComponent={LinkComponent}\n onSelect={onSelect}\n onSelectOutcome={onSelectOutcome}\n onHover={onHover}\n />\n </div>\n ),\n )}\n </div>\n\n {/* Infinite scroll sentinel */}\n <div\n ref={sentinelRef}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 8,\n padding: \"16px 0\",\n minHeight: 1,\n }}\n >\n {isFetchingMore && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n color: \"#71717a\",\n fontSize: 13,\n }}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ animation: \"evt-load-spin 1s linear infinite\" }}\n >\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n {t(\"predict.events.loadMore\" as never)}\n </div>\n )}\n </div>\n\n {showEndOfList && <EndOfListRow onScrollToTop={handleScrollToTop} />}\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// End of list + Back to top\n// -----------------------------------------------------------------------------\n\nfunction EndOfListRow({ onScrollToTop }: { onScrollToTop?: () => void }) {\n const { t } = useTranslation();\n\n return (\n <div className=\"flex w-full flex-col items-center justify-center gap-y-4 py-6\">\n <div className=\"flex w-full items-center justify-center gap-x-4\">\n <div className=\"h-px w-16 bg-neutral-700\" />\n <span className=\"text-xs font-medium text-neutral-500\">\n {t(\"predict.event.endOfList\")}\n </span>\n <div className=\"h-px w-16 bg-neutral-700\" />\n </div>\n\n <button\n type=\"button\"\n className=\"flex cursor-pointer items-center gap-x-1 text-xs font-medium text-neutral-400\"\n onClick={onScrollToTop}\n >\n <span className=\"iconify size-4 ph--arrow-up-bold\" />\n <span>{t(\"predict.event.backToTop\")}</span>\n </button>\n </div>\n );\n}\n","// =============================================================================\n// EventsWidget\n//\n// Container widget that wires useEventsInfinite (data) to EventsUI (presentation).\n// Accepts `tagSlugSelection` from the categories widget for slug-based filtering.\n// =============================================================================\nimport type {\n PredictEvent,\n PredictMarket,\n EventStatus,\n EventSortField,\n ProviderSource,\n TagSlugSelection,\n} from \"@liberfi.io/react-predict\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { DEFAULT_PAGE_SIZE } from \"../../consts\";\nimport { useEventsInfinite } from \"./events.script\";\nimport { EventsSkeleton } from \"./events.skeleton\";\nimport { EventsUI } from \"./events.ui\";\n\nexport type { TagSlugSelection } from \"../categories/categories.widget\";\n\n// -----------------------------------------------------------------------------\n// Props\n// -----------------------------------------------------------------------------\n\nexport interface EventsWidgetProps {\n /** Category / tag selection from the categories widget. */\n tagSlugSelection?: TagSlugSelection | null;\n /** Page size (default: DEFAULT_PAGE_SIZE) */\n limit?: number;\n /** Event lifecycle status filter (default: \"open\") */\n status?: EventStatus;\n /** Sort field */\n sort_by?: EventSortField;\n /** Ascending sort order (default: false → descending) */\n sort_asc?: boolean;\n /** Filter by upstream provider (undefined = all providers) */\n source?: ProviderSource;\n /** Include nested markets in the response (default: true) */\n with_markets?: boolean;\n /**\n * Client-side time-remaining filter. Keeps only events whose `end_at` is\n * within the given window: \"1d\" = < 24 h, \"7d\" = < 7 days, \"30d\" = < 30 days.\n */\n timeRemaining?: string;\n /** Client-side minimum volume filter (USD string, e.g. \"1000\"). */\n minVolume?: string;\n /** Client-side minimum liquidity filter (USD string, e.g. \"10000\"). */\n minLiquidity?: string;\n /** Callback when an event card is selected */\n onSelect?: (event: PredictEvent) => void;\n /** Callback when an outcome button (yes/no) is pressed */\n onSelectOutcome?: (\n event: PredictEvent,\n market: PredictMarket,\n side: \"yes\" | \"no\",\n ) => void;\n /** Generate href for each event card. When set, cards render as links. */\n getEventHref?: (event: PredictEvent) => string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n /** Called when a card is hovered (for data prefetching). */\n onHover?: (event: PredictEvent) => void;\n}\n\n// -----------------------------------------------------------------------------\n// Widget\n// -----------------------------------------------------------------------------\n\nexport function EventsWidget({\n tagSlugSelection,\n limit = DEFAULT_PAGE_SIZE,\n status,\n sort_by,\n sort_asc,\n source,\n with_markets,\n timeRemaining,\n minVolume,\n minLiquidity,\n onSelect,\n onSelectOutcome,\n getEventHref,\n LinkComponent,\n onHover,\n}: EventsWidgetProps) {\n const {\n data: events,\n hasMore,\n fetchMore,\n isFetching,\n isFetchingMore,\n } = useEventsInfinite({\n tagSlugSelection,\n limit,\n status,\n sort_by,\n sort_asc,\n source,\n with_markets,\n timeRemaining,\n minVolume,\n minLiquidity,\n });\n\n if (isFetching) {\n return <EventsSkeleton count={DEFAULT_PAGE_SIZE} />;\n }\n\n return (\n <EventsUI\n events={events}\n hasMore={hasMore}\n isFetchingMore={isFetchingMore}\n onFetchMore={fetchMore}\n onSelect={onSelect}\n onSelectOutcome={onSelectOutcome}\n getEventHref={getEventHref}\n LinkComponent={LinkComponent}\n onHover={onHover}\n />\n );\n}\n","// =============================================================================\n// EventsPage\n//\n// Full-page scroll layout:\n// 1. EventsHero — brand slogan + 2x2 stats grid\n// 2. Sticky categories + toolbar\n// 3. Content area — events grid with IntersectionObserver infinite scroll\n//\n// Owns the sort/filter state and converts it to API params for the widget.\n// =============================================================================\nimport { useState, useCallback, useMemo } from \"react\";\nimport type { PredictEvent, PredictMarket } from \"@liberfi.io/react-predict\";\nimport { useEventStats } from \"@liberfi.io/react-predict\";\nimport { useDisclosure } from \"@liberfi.io/ui\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { useAsyncModal } from \"@liberfi.io/ui-scaffold\";\nimport {\n CategoriesWidget,\n type TagSlugSelection,\n} from \"../categories/categories.widget\";\nimport {\n PredictTradeModal,\n PREDICT_TRADE_MODAL_ID,\n type PredictTradeModalParams,\n} from \"../trade-form/trade-form.modal\";\nimport {\n EventsFilterUI,\n countActiveFilters,\n DEFAULT_FILTER_STATE,\n type EventsFilterState,\n} from \"./events-filter.ui\";\nimport { EventsHero } from \"./events-hero.ui\";\nimport {\n EventsToolbarUI,\n SORT_PRESETS,\n type SortPreset,\n} from \"./events-toolbar.ui\";\nimport { EventsWidget } from \"./events.widget\";\n\nexport type { TagSlugSelection } from \"../categories/categories.widget\";\nexport type { SortPreset } from \"./events-toolbar.ui\";\nexport type { EventsFilterState } from \"./events-filter.ui\";\n\n// -----------------------------------------------------------------------------\n// Props\n// -----------------------------------------------------------------------------\n\nexport interface EventsPageProps {\n /** Callback when an event card is selected */\n onSelect?: (event: PredictEvent) => void;\n /** Callback when an outcome button (yes / no) is pressed */\n onSelectOutcome?: (\n event: PredictEvent,\n market: PredictMarket,\n side: \"yes\" | \"no\",\n ) => void;\n /** Generate href for each event card. When set, cards render as links. */\n getEventHref?: (event: PredictEvent) => string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n /** Called when a card is hovered (for data prefetching). */\n onHover?: (event: PredictEvent) => void;\n /** Optional background image for the Hero area. */\n bgImageSrc?: string;\n}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function EventsPage({\n onSelect,\n onSelectOutcome,\n getEventHref,\n LinkComponent,\n onHover,\n bgImageSrc,\n}: EventsPageProps) {\n const [tagSlugSelection, setTagSlugSelection] = useState<TagSlugSelection>({\n categorySlug: null,\n tagSlug: null,\n });\n\n const [filterState, setFilterState] =\n useState<EventsFilterState>(DEFAULT_FILTER_STATE);\n\n const { data: stats } = useEventStats();\n\n const {\n isOpen: isFilterOpen,\n onOpen: openFilter,\n onClose: closeFilter,\n } = useDisclosure();\n\n const { onOpen: openTradeModal } = useAsyncModal<PredictTradeModalParams>(\n PREDICT_TRADE_MODAL_ID,\n );\n\n const handleSelectOutcome = useCallback(\n (event: PredictEvent, market: PredictMarket, side: \"yes\" | \"no\") => {\n onSelectOutcome?.(event, market, side);\n openTradeModal({\n params: { event, market, initialOutcome: side },\n });\n },\n [onSelectOutcome, openTradeModal],\n );\n\n const handleCategorySelect = useCallback((selection: TagSlugSelection) => {\n setTagSlugSelection(selection);\n }, []);\n\n const handleSortChange = useCallback((preset: SortPreset) => {\n setFilterState((prev) => ({ ...prev, sortPreset: preset }));\n }, []);\n\n const handleSortAscChange = useCallback((asc: boolean) => {\n setFilterState((prev) => ({ ...prev, sortAsc: asc }));\n }, []);\n\n const handleFilterChange = useCallback((state: EventsFilterState) => {\n setFilterState(state);\n }, []);\n\n const sortBy = useMemo(\n () => SORT_PRESETS[filterState.sortPreset].sort_by,\n [filterState.sortPreset],\n );\n\n const filterCount = useMemo(\n () => countActiveFilters(filterState),\n [filterState],\n );\n\n const toolbar = useMemo(\n () => (\n <EventsToolbarUI\n sortPreset={filterState.sortPreset}\n onSortChange={handleSortChange}\n sortAsc={filterState.sortAsc}\n onSortAscChange={handleSortAscChange}\n onFilterPress={openFilter}\n filterCount={filterCount}\n />\n ),\n [\n filterState.sortPreset,\n filterState.sortAsc,\n filterCount,\n handleSortChange,\n handleSortAscChange,\n openFilter,\n ],\n );\n\n return (\n <div\n style={{\n minHeight: \"100vh\",\n position: \"relative\",\n width: \"100%\",\n maxWidth: 1680,\n margin: \"0 auto\",\n }}\n >\n {/* Hero section — break out of maxWidth container to span full viewport */}\n <div\n style={{\n position: \"relative\",\n overflow: \"hidden\",\n borderBottom: \"1px solid rgba(39,39,42,0.5)\",\n width: \"100vw\",\n marginLeft: \"calc(-50vw + 50%)\",\n }}\n >\n {/* Background layers */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n pointerEvents: \"none\",\n zIndex: 0,\n overflow: \"hidden\",\n }}\n >\n {bgImageSrc && (\n <img\n src={bgImageSrc}\n alt=\"\"\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n inset: 0,\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n objectPosition: \"center center\",\n opacity: 0.3,\n mixBlendMode: \"lighten\" as const,\n maskImage:\n \"linear-gradient(to bottom, black 50%, transparent 100%)\",\n WebkitMaskImage:\n \"linear-gradient(to bottom, black 50%, transparent 100%)\",\n }}\n />\n )}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n opacity: 0.025,\n backgroundImage:\n \"radial-gradient(circle at 1px 1px, rgb(255 255 255) 1px, transparent 0)\",\n backgroundSize: \"20px 20px\",\n }}\n />\n </div>\n <style>{`.evt-hero-wrap{padding:40px 16px 32px}@media(min-width:640px){.evt-hero-wrap{padding:48px 24px 40px}}@media(min-width:1024px){.evt-hero-wrap{padding:52px 32px 44px}}`}</style>\n <div\n className=\"evt-hero-wrap\"\n style={{\n position: \"relative\",\n zIndex: 2,\n maxWidth: 1152,\n margin: \"0 auto\",\n }}\n >\n <EventsHero stats={stats} />\n </div>\n </div>\n\n {/* Sticky categories + toolbar */}\n <div\n style={{\n position: \"sticky\",\n top: 0,\n zIndex: 40,\n background: \"rgba(10,10,11,0.8)\",\n backdropFilter: \"blur(24px)\",\n WebkitBackdropFilter: \"blur(24px)\",\n borderBottom: \"1px solid rgba(39,39,42,0.5)\",\n }}\n >\n <CategoriesWidget onSelect={handleCategorySelect} trailing={toolbar} />\n </div>\n\n {/* Content area */}\n <div style={{ padding: \"12px 8px 80px\" }}>\n <EventsFilterUI\n isOpen={isFilterOpen}\n onClose={closeFilter}\n value={filterState}\n onChange={handleFilterChange}\n />\n\n <EventsWidget\n tagSlugSelection={tagSlugSelection}\n sort_by={sortBy}\n sort_asc={filterState.sortAsc}\n source={filterState.source}\n timeRemaining={filterState.timeRemaining}\n minVolume={filterState.minVolume}\n minLiquidity={filterState.minLiquidity}\n onSelect={onSelect}\n onSelectOutcome={handleSelectOutcome}\n getEventHref={getEventHref}\n LinkComponent={LinkComponent}\n onHover={onHover}\n />\n </div>\n\n <PredictTradeModal />\n </div>\n );\n}\n","import { useState, useMemo, useCallback } from \"react\";\nimport { List, type RowComponentProps } from \"react-window\";\nimport { useInfiniteLoader } from \"react-window-infinite-loader\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n type OrderStatus,\n type PredictEvent,\n type PredictOrder,\n type PredictPosition,\n type PredictTrade,\n type ProviderSource,\n useCancelOrder,\n useInfiniteOrders,\n useInfiniteTrades,\n usePositions,\n} from \"@liberfi.io/react-predict\";\nimport { cn, Skeleton, Spinner } from \"@liberfi.io/ui\";\n\nconst ROW_HEIGHT = 40;\nconst HEADER_HEIGHT = 36;\nconst CONTENT_HEIGHT = 480;\nconst LIST_HEIGHT = CONTENT_HEIGHT - HEADER_HEIGHT;\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface UserActivitySectionProps {\n event: PredictEvent;\n /** Connected wallet address. When empty the section shows a connect prompt. */\n walletAddress?: string;\n /** Callback to cancel an open order. */\n onCancelOrder?: (orderId: string) => void;\n}\n\ntype ActivityTab = \"positions\" | \"orders\" | \"trades\";\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function UserActivitySection({\n event,\n walletAddress,\n onCancelOrder,\n}: UserActivitySectionProps) {\n const { t } = useTranslation();\n const [activeTab, setActiveTab] = useState<ActivityTab>(\"positions\");\n\n const marketSlugs = useMemo(\n () => event.markets?.map((m) => m.slug) ?? [],\n [event.markets],\n );\n\n const { data: positionsData } = usePositions({\n source: event.source,\n user: walletAddress ?? \"\",\n });\n const positionsCount = useMemo(() => {\n if (!positionsData?.positions || !walletAddress) return 0;\n if (marketSlugs.length === 0) return positionsData.positions.length;\n return positionsData.positions.filter(\n (p) => p.market && marketSlugs.includes(p.market.slug),\n ).length;\n }, [positionsData?.positions, marketSlugs, walletAddress]);\n\n const positionsLabel =\n positionsCount > 0\n ? `${t(\"predict.positions.title\")} (${positionsCount})`\n : t(\"predict.positions.title\");\n\n const tabs: { key: ActivityTab; label: string }[] = [\n { key: \"positions\", label: positionsLabel },\n { key: \"orders\", label: t(\"predict.openOrders.title\") },\n { key: \"trades\", label: t(\"predict.tradeHistory.title\") },\n ];\n\n return (\n <div className=\"flex flex-col gap-y-2 mt-6 px-1 lg:px-4\">\n {/* Tab bar */}\n <div className=\"flex items-center gap-x-1 border-b border-border\">\n {tabs.map((tab) => (\n <button\n key={tab.key}\n type=\"button\"\n onClick={() => setActiveTab(tab.key)}\n className={cn(\n \"px-3 py-2 text-sm font-medium transition-colors cursor-pointer\",\n activeTab === tab.key\n ? \"text-foreground border-b-2 border-primary\"\n : \"text-neutral hover:text-foreground\",\n )}\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* Tab content */}\n {!walletAddress ? (\n <div\n className=\"flex items-center justify-center text-sm text-neutral\"\n style={{ height: CONTENT_HEIGHT }}\n >\n {t(\"predict.trade.connectWallet\")}\n </div>\n ) : (\n <div style={{ height: CONTENT_HEIGHT }}>\n {activeTab === \"positions\" && (\n <PositionsTab\n source={event.source}\n walletAddress={walletAddress}\n marketSlugs={marketSlugs}\n />\n )}\n {activeTab === \"orders\" && (\n <OrdersTab\n source={event.source}\n walletAddress={walletAddress}\n marketSlugs={marketSlugs}\n onCancelOrder={onCancelOrder}\n />\n )}\n {activeTab === \"trades\" && (\n <TradesTab source={event.source} walletAddress={walletAddress} />\n )}\n </div>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Positions Tab — virtual list (no infinite loading)\n// ---------------------------------------------------------------------------\n\nfunction PositionsTab({\n source,\n walletAddress,\n marketSlugs,\n}: {\n source: ProviderSource;\n walletAddress: string;\n marketSlugs: string[];\n}) {\n const { t } = useTranslation();\n const { data, isLoading } = usePositions({\n source,\n user: walletAddress,\n });\n\n const positions = useMemo(() => {\n if (!data?.positions) return [];\n if (marketSlugs.length === 0) return data.positions;\n return data.positions.filter(\n (p) => p.market && marketSlugs.includes(p.market.slug),\n );\n }, [data?.positions, marketSlugs]);\n\n if (isLoading) return <TabSkeleton />;\n\n if (positions.length === 0) {\n return <EmptyState message={t(\"predict.positions.empty\")} />;\n }\n\n return (\n <div className=\"flex flex-col h-full\">\n <div\n className=\"flex items-center text-neutral text-xs lg:text-sm font-normal shrink-0\"\n style={{ height: HEADER_HEIGHT }}\n >\n <div className=\"flex-[3] min-w-0 pr-2 whitespace-nowrap\">\n {t(\"predict.positions.event\")}\n </div>\n <div className=\"flex-1 pr-2 text-right whitespace-nowrap\">\n {t(\"predict.positions.totalSize\")}\n </div>\n <div className=\"flex-1 pr-2 text-right whitespace-nowrap\">\n {t(\"predict.positions.value\")}\n </div>\n <div className=\"flex-1 pr-2 text-right whitespace-nowrap\">\n {t(\"predict.positions.avgPrice\")}\n </div>\n <div className=\"flex-1 pr-2 text-right whitespace-nowrap\">\n {t(\"predict.positions.markPrice\")}\n </div>\n <div className=\"flex-[1.5] pr-2 text-right whitespace-nowrap\">\n {t(\"predict.positions.pnl\")}\n </div>\n <div className=\"flex-1 pr-2 text-right whitespace-nowrap\">\n {t(\"predict.positions.payoutIfRight\")}\n </div>\n <div className=\"flex-[1.5] pr-2 text-right whitespace-nowrap\">\n {t(\"predict.positions.estSettlement\")}\n </div>\n <div className=\"w-16 shrink-0\" />\n </div>\n\n <List\n style={{ height: LIST_HEIGHT }}\n rowComponent={PositionVirtualRow}\n rowCount={positions.length}\n rowHeight={ROW_HEIGHT}\n rowProps={{\n positions,\n closeLabel: t(\"predict.positions.close\"),\n }}\n />\n </div>\n );\n}\n\ntype PositionRowData = {\n positions: PredictPosition[];\n closeLabel: string;\n};\n\nfunction PositionVirtualRow({\n index,\n style,\n positions,\n closeLabel,\n}: RowComponentProps<PositionRowData>) {\n const position = positions[index];\n if (!position) return null;\n\n const pnl = position.pnl ?? 0;\n const pnlPercent = position.pnl_percent ?? 0;\n const avgPrice = position.avg_price ?? 0;\n const currentPrice = position.current_price ?? 0;\n\n const pnlColor =\n pnl > 0 ? \"text-success\" : pnl < 0 ? \"text-danger\" : \"text-foreground\";\n const pnlSign = pnl > 0 ? \"+\" : \"\";\n\n const marketLabel =\n position.market?.outcomes?.[0]?.label ?? position.market?.question ?? \"—\";\n const sideLabel = position.side;\n const payoutIfRight = position.size;\n const value = position.size * currentPrice;\n const settlementStr = position.market?.end_at\n ? formatSettlementTime(position.market.end_at)\n : \"—\";\n\n return (\n <div\n style={style}\n className=\"flex items-center border-b border-border/50 hover:bg-content2/40 transition-colors text-xs lg:text-sm\"\n >\n <div className=\"flex-[3] min-w-0 pr-2\">\n <div className=\"flex flex-col gap-y-0.5\">\n <span className=\"text-foreground truncate font-medium\">\n {marketLabel}\n </span>\n <span\n className={cn(\n \"text-[10px] font-medium\",\n sideLabel.toLowerCase() === \"yes\"\n ? \"text-primary\"\n : \"text-secondary\",\n )}\n >\n {sideLabel}\n </span>\n </div>\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground whitespace-nowrap\">\n {position.size}\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground whitespace-nowrap\">\n ${value.toFixed(2)}\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground whitespace-nowrap\">\n {formatPrice(avgPrice)}\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground whitespace-nowrap\">\n {formatPrice(currentPrice)}\n </div>\n <div\n className={cn(\n \"flex-[1.5] pr-2 text-right font-mono whitespace-nowrap\",\n pnlColor,\n )}\n >\n {pnlSign}${Math.abs(pnl).toFixed(2)}\n <span className=\"text-[10px] ml-0.5 opacity-70\">\n ({pnlSign}\n {pnlPercent.toFixed(1)}%)\n </span>\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground whitespace-nowrap\">\n ${payoutIfRight.toFixed(2)}\n </div>\n <div className=\"flex-[1.5] pr-2 text-right text-neutral whitespace-nowrap\">\n {settlementStr}\n </div>\n <div className=\"w-16 shrink-0 text-right\">\n <button\n type=\"button\"\n className=\"text-xs text-neutral hover:text-foreground cursor-pointer transition-colors rounded px-2 py-0.5 border border-border hover:border-foreground/40\"\n >\n {closeLabel}\n </button>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Orders Tab — virtual list + infinite loading\n// ---------------------------------------------------------------------------\n\nfunction OrdersTab({\n source,\n walletAddress,\n marketSlugs,\n onCancelOrder,\n}: {\n source: ProviderSource;\n walletAddress: string;\n marketSlugs: string[];\n onCancelOrder?: (orderId: string) => void;\n}) {\n const { t } = useTranslation();\n const { data, isLoading, fetchNextPage, hasNextPage } = useInfiniteOrders({\n source,\n wallet_address: walletAddress,\n });\n\n const cancelMutation = useCancelOrder();\n\n const orders = useMemo(() => {\n const allItems = data?.pages?.flatMap((p) => p.items) ?? [];\n const openStatuses = new Set([\"live\", \"open\", \"submitted\", \"pending\"]);\n let filtered = allItems.filter((o) => openStatuses.has(o.status));\n if (marketSlugs.length > 0) {\n filtered = filtered.filter(\n (o) => o.market_id && marketSlugs.includes(o.market_id),\n );\n }\n return filtered;\n }, [data?.pages, marketSlugs]);\n\n const handleCancel = useCallback(\n (order: PredictOrder) => {\n if (onCancelOrder) {\n onCancelOrder(order.id);\n } else {\n cancelMutation.mutate({ source: order.source, id: order.id });\n }\n },\n [onCancelOrder, cancelMutation],\n );\n\n const itemCount = orders.length;\n const rowCount = itemCount + (hasNextPage ? 1 : 0);\n\n const isRowLoaded = useCallback(\n (index: number) => index < itemCount,\n [itemCount],\n );\n\n const loadMoreRows = useCallback(async () => {\n await fetchNextPage();\n }, [fetchNextPage]);\n\n const onRowsRendered = useInfiniteLoader({\n isRowLoaded,\n loadMoreRows,\n rowCount,\n threshold: 5,\n });\n\n if (isLoading) return <TabSkeleton />;\n\n if (orders.length === 0 && !hasNextPage) {\n return <EmptyState message={t(\"predict.openOrders.empty\")} />;\n }\n\n return (\n <div className=\"flex flex-col h-full\">\n <div\n className=\"flex items-center text-neutral text-xs lg:text-sm font-normal shrink-0\"\n style={{ height: HEADER_HEIGHT }}\n >\n <div className=\"w-16 shrink-0 pr-2\">{t(\"predict.openOrders.side\")}</div>\n <div className=\"flex-1 pr-2\">{t(\"predict.openOrders.outcome\")}</div>\n <div className=\"flex-1 pr-2\">{t(\"predict.openOrders.type\")}</div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.openOrders.price\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.openOrders.filled\")}\n </div>\n <div className=\"w-20 shrink-0 pr-2\">\n {t(\"predict.openOrders.status\")}\n </div>\n <div className=\"w-16 shrink-0\" />\n </div>\n\n <List\n style={{ height: LIST_HEIGHT }}\n onRowsRendered={onRowsRendered}\n rowComponent={OrderVirtualRow}\n rowCount={rowCount}\n rowHeight={ROW_HEIGHT}\n rowProps={{\n orders,\n itemCount,\n onCancel: handleCancel,\n isCancelling: cancelMutation.isPending,\n cancelLabel: t(\"predict.openOrders.cancel\"),\n }}\n />\n </div>\n );\n}\n\ntype OrderRowData = {\n orders: PredictOrder[];\n itemCount: number;\n onCancel: (order: PredictOrder) => void;\n isCancelling: boolean;\n cancelLabel: string;\n};\n\nfunction OrderVirtualRow({\n index,\n style,\n orders,\n itemCount,\n onCancel,\n isCancelling,\n cancelLabel,\n}: RowComponentProps<OrderRowData>) {\n if (index >= itemCount) {\n return (\n <div style={style} className=\"flex justify-center items-center\">\n <Spinner size=\"sm\" />\n </div>\n );\n }\n\n const order = orders[index];\n if (!order) return null;\n\n const isBuy = order.side === \"BUY\";\n\n return (\n <div\n style={style}\n className=\"flex items-center border-b border-border/50 text-xs lg:text-sm\"\n >\n <div className=\"w-16 shrink-0 pr-2\">\n <span\n className={cn(\n \"inline-block rounded px-1.5 py-0.5 text-[10px] font-medium\",\n isBuy ? \"bg-primary/10 text-primary\" : \"bg-danger/10 text-danger\",\n )}\n >\n {order.side}\n </span>\n </div>\n <div className=\"flex-1 pr-2 text-foreground capitalize\">\n {order.outcome ?? \"—\"}\n </div>\n <div className=\"flex-1 pr-2 text-neutral capitalize\">\n {order.order_type ?? \"limit\"}\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {order.price ? formatPrice(parseFloat(order.price)) : \"—\"}\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {order.size_matched ?? \"0\"}/{order.original_size ?? \"—\"}\n </div>\n <div className=\"w-20 shrink-0 pr-2\">\n <OrderStatusBadge status={order.status} />\n </div>\n <div className=\"w-16 shrink-0 text-right\">\n <button\n type=\"button\"\n onClick={() => onCancel(order)}\n disabled={isCancelling}\n className=\"text-[10px] text-danger hover:text-danger/80 cursor-pointer disabled:opacity-50 transition-colors\"\n >\n {isCancelling ? <Spinner size=\"sm\" /> : cancelLabel}\n </button>\n </div>\n </div>\n );\n}\n\nfunction OrderStatusBadge({ status }: { status: OrderStatus }) {\n const colorMap: Record<string, string> = {\n live: \"bg-success/10 text-success\",\n open: \"bg-success/10 text-success\",\n submitted: \"bg-warning/10 text-warning\",\n pending: \"bg-warning/10 text-warning\",\n matched: \"bg-primary/10 text-primary\",\n cancelled: \"bg-neutral/10 text-neutral\",\n failed: \"bg-danger/10 text-danger\",\n expired: \"bg-neutral/10 text-neutral\",\n };\n\n return (\n <span\n className={cn(\n \"inline-block rounded px-1.5 py-0.5 text-[10px] font-medium capitalize\",\n colorMap[status] ?? \"bg-neutral/10 text-neutral\",\n )}\n >\n {status}\n </span>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Trades Tab — virtual list + infinite loading\n// ---------------------------------------------------------------------------\n\nfunction TradesTab({\n source,\n walletAddress,\n}: {\n source: ProviderSource;\n walletAddress: string;\n}) {\n const { t } = useTranslation();\n const { data, isLoading, fetchNextPage, hasNextPage } = useInfiniteTrades({\n source,\n wallet: walletAddress,\n limit: 50,\n });\n\n const trades = useMemo(\n () => data?.pages?.flatMap((p) => p.items) ?? [],\n [data?.pages],\n );\n\n const itemCount = trades.length;\n const rowCount = itemCount + (hasNextPage ? 1 : 0);\n\n const isRowLoaded = useCallback(\n (index: number) => index < itemCount,\n [itemCount],\n );\n\n const loadMoreRows = useCallback(async () => {\n await fetchNextPage();\n }, [fetchNextPage]);\n\n const onRowsRendered = useInfiniteLoader({\n isRowLoaded,\n loadMoreRows,\n rowCount,\n threshold: 5,\n });\n\n if (isLoading) return <TabSkeleton />;\n\n if (trades.length === 0 && !hasNextPage) {\n return <EmptyState message={t(\"predict.tradeHistory.empty\")} />;\n }\n\n return (\n <div className=\"flex flex-col h-full\">\n <div\n className=\"flex items-center text-neutral text-xs lg:text-sm font-normal shrink-0\"\n style={{ height: HEADER_HEIGHT }}\n >\n <div className=\"w-16 shrink-0 pr-2\">\n {t(\"predict.tradeHistory.side\")}\n </div>\n <div className=\"flex-1 pr-2\">{t(\"predict.tradeHistory.outcome\")}</div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.tradeHistory.price\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.tradeHistory.qty\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.tradeHistory.total\")}\n </div>\n <div className=\"flex-[1.5] pr-2 text-right\">\n {t(\"predict.tradeHistory.time\")}\n </div>\n </div>\n\n <List\n style={{ height: LIST_HEIGHT }}\n onRowsRendered={onRowsRendered}\n rowComponent={TradeVirtualRow}\n rowCount={rowCount}\n rowHeight={ROW_HEIGHT}\n rowProps={{ trades, itemCount }}\n />\n </div>\n );\n}\n\ntype TradeRowData = {\n trades: PredictTrade[];\n itemCount: number;\n};\n\nfunction TradeVirtualRow({\n index,\n style,\n trades,\n itemCount,\n}: RowComponentProps<TradeRowData>) {\n if (index >= itemCount) {\n return (\n <div style={style} className=\"flex justify-center items-center\">\n <Spinner size=\"sm\" />\n </div>\n );\n }\n\n const trade = trades[index];\n if (!trade) return null;\n\n const isBuy = trade.side?.toUpperCase() === \"BUY\";\n const timeStr = formatTimestamp(trade.timestamp);\n const price = trade.price ?? 0;\n const usdSize = trade.usd_size ?? 0;\n\n return (\n <div\n style={style}\n className=\"flex items-center border-b border-border/50 text-xs lg:text-sm\"\n >\n <div className=\"w-16 shrink-0 pr-2\">\n <span\n className={cn(\n \"inline-block rounded px-1.5 py-0.5 text-[10px] font-medium\",\n isBuy ? \"bg-primary/10 text-primary\" : \"bg-danger/10 text-danger\",\n )}\n >\n {trade.side}\n </span>\n </div>\n <div className=\"flex-1 pr-2 text-foreground capitalize\">\n {trade.outcome ?? \"—\"}\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {formatPrice(price)}\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {trade.size}\n </div>\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n ${usdSize.toFixed(2)}\n </div>\n <div className=\"flex-[1.5] pr-2 text-right text-neutral whitespace-nowrap\">\n {timeStr}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Shared helpers\n// ---------------------------------------------------------------------------\n\nfunction EmptyState({ message }: { message: string }) {\n return (\n <div\n className=\"flex items-center justify-center text-sm text-neutral\"\n style={{ height: CONTENT_HEIGHT }}\n >\n {message}\n </div>\n );\n}\n\nfunction TabSkeleton() {\n return (\n <div\n className=\"flex flex-col gap-y-2 py-3 animate-pulse\"\n style={{ height: CONTENT_HEIGHT }}\n >\n {Array.from({ length: 6 }).map((_, i) => (\n <Skeleton key={i} className=\"h-8 w-full rounded-md\" />\n ))}\n </div>\n );\n}\n\nfunction formatPrice(price: number): string {\n const cents = price * 100;\n if (cents < 1 && cents > 0) return \"< 1¢\";\n return `${cents.toFixed(1)}¢`;\n}\n\nfunction formatTimestamp(unixSeconds: number): string {\n const date = new Date(unixSeconds * 1000);\n const month = (date.getMonth() + 1).toString().padStart(2, \"0\");\n const day = date.getDate().toString().padStart(2, \"0\");\n const hours = date.getHours().toString().padStart(2, \"0\");\n const mins = date.getMinutes().toString().padStart(2, \"0\");\n return `${month}/${day} ${hours}:${mins}`;\n}\n\nfunction formatSettlementTime(isoString: string): string {\n try {\n const date = new Date(isoString);\n return date.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n });\n } catch {\n return \"—\";\n }\n}\n","// ---------------------------------------------------------------------------\n// Shimmer animation — same visual language as events.skeleton / matches\n// ---------------------------------------------------------------------------\n\nconst SHIMMER_CSS = `\n@keyframes detailShimmer{0%{background-position:200% 0}100%{background-position:-200% 0}}\n`;\n\nconst shimmer: React.CSSProperties = {\n background:\n \"linear-gradient(90deg, rgba(255,255,255,0.03) 25%, rgba(255,255,255,0.06) 50%, rgba(255,255,255,0.03) 75%)\",\n backgroundSize: \"200% 100%\",\n animation: \"detailShimmer 1.8s ease-in-out infinite\",\n borderRadius: 6,\n};\n\nfunction shimmerDelay(delay: number): React.CSSProperties {\n return { ...shimmer, animationDelay: `${delay}ms` };\n}\n\n// ---------------------------------------------------------------------------\n// EventDetailSkeleton\n// ---------------------------------------------------------------------------\n\nexport interface EventDetailSkeletonProps {\n marketCount?: number;\n showBack?: boolean;\n}\n\nexport function EventDetailSkeleton({\n marketCount = 4,\n showBack,\n}: EventDetailSkeletonProps) {\n return (\n <>\n <style>{SHIMMER_CSS}</style>\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n width: \"100%\",\n gap: 20,\n }}\n >\n {/* Back button placeholder */}\n {showBack && <div style={{ height: 20 }} />}\n\n {/* Header — avatar + tags + title */}\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 12 }}>\n <div\n style={{\n ...shimmer,\n width: 64,\n height: 64,\n borderRadius: 10,\n flexShrink: 0,\n }}\n />\n <div\n style={{\n flex: 1,\n minWidth: 0,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\n <div style={{ ...shimmerDelay(0), height: 14, width: 48 }} />\n <div style={{ ...shimmerDelay(30), height: 14, width: 40 }} />\n <div style={{ ...shimmerDelay(60), height: 14, width: 40 }} />\n </div>\n <div\n style={{\n ...shimmerDelay(80),\n height: 20,\n width: \"80%\",\n maxWidth: 384,\n borderRadius: 4,\n }}\n />\n </div>\n </div>\n\n {/* Countdown */}\n <div style={{ ...shimmerDelay(100), height: 16, width: 192 }} />\n\n {/* Chart area — legend + chart + bottom bar */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 12 }}>\n {/* Legend bar */}\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 16 }}>\n <div style={{ ...shimmerDelay(120), height: 16, width: 96 }} />\n <div style={{ ...shimmerDelay(140), height: 16, width: 80 }} />\n </div>\n {/* Chart body */}\n <div\n style={{\n ...shimmerDelay(160),\n height: 300,\n width: \"100%\",\n borderRadius: 12,\n }}\n />\n {/* Bottom bar — volume + interval switcher */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n }}\n >\n <div style={{ ...shimmerDelay(180), height: 16, width: 80 }} />\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <div\n style={{\n ...shimmerDelay(200),\n height: 28,\n width: 200,\n borderRadius: 8,\n }}\n />\n <div\n style={{\n ...shimmerDelay(220),\n height: 28,\n width: 112,\n borderRadius: 8,\n }}\n />\n </div>\n </div>\n </div>\n\n {/* Markets table */}\n <div style={{ display: \"flex\", flexDirection: \"column\" }}>\n {/* Table header */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"8px 0\",\n }}\n >\n <div style={{ ...shimmerDelay(240), height: 14, width: 56 }} />\n </div>\n {/* Market rows */}\n {Array.from({ length: marketCount }).map((_, i) => (\n <div\n key={i}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n padding: \"10px 0\",\n borderBottom: \"1px solid rgba(39,39,42,0.5)\",\n }}\n >\n <div\n style={{\n ...shimmerDelay(260 + i * 40),\n width: 28,\n height: 28,\n borderRadius: 8,\n flexShrink: 0,\n }}\n />\n <div\n style={{\n flex: 1,\n minWidth: 0,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n }}\n >\n <div\n style={{\n ...shimmerDelay(280 + i * 40),\n height: 14,\n width: i % 2 === 0 ? 192 : 160,\n }}\n />\n <div\n style={{\n ...shimmerDelay(300 + i * 40),\n height: 10,\n width: 64,\n }}\n />\n </div>\n <div\n style={{ ...shimmerDelay(320 + i * 40), height: 16, width: 40 }}\n />\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <div\n style={{\n ...shimmerDelay(340 + i * 40),\n height: 32,\n width: 80,\n borderRadius: 8,\n }}\n />\n <div\n style={{\n ...shimmerDelay(360 + i * 40),\n height: 32,\n width: 80,\n borderRadius: 8,\n }}\n />\n </div>\n </div>\n ))}\n </div>\n\n {/* Rules */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>\n <div style={{ ...shimmerDelay(400), height: 16, width: 64 }} />\n <div style={{ ...shimmerDelay(420), height: 14, width: \"100%\" }} />\n <div style={{ ...shimmerDelay(440), height: 14, width: \"80%\" }} />\n <div style={{ ...shimmerDelay(460), height: 14, width: \"60%\" }} />\n </div>\n </div>\n </>\n );\n}\n\n// ---------------------------------------------------------------------------\n// TradeFormSkeleton — zinc glass card matching event/match card style\n// ---------------------------------------------------------------------------\n\nexport function TradeFormSkeleton() {\n return (\n <>\n <style>{SHIMMER_CSS}</style>\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 12,\n borderRadius: 14,\n border: \"1px solid rgba(39,39,42,0.6)\",\n background: \"rgba(24,24,27,0.4)\",\n padding: 16,\n }}\n >\n {/* Outcome tabs */}\n <div\n style={{\n ...shimmerDelay(0),\n height: 40,\n width: \"100%\",\n borderRadius: 8,\n }}\n />\n {/* Amount input area */}\n <div\n style={{\n ...shimmerDelay(60),\n height: 96,\n width: \"100%\",\n borderRadius: 8,\n }}\n />\n {/* Submit button */}\n <div\n style={{\n ...shimmerDelay(120),\n height: 40,\n width: \"100%\",\n borderRadius: 8,\n }}\n />\n </div>\n </>\n );\n}\n","// =============================================================================\n// EventMarketDepthChartUI — CSS div implementation (no Recharts)\n//\n// Reverse-engineered from Jupiter's production code (chunk-1824.js).\n//\n// Why CSS divs instead of Recharts SVG?\n// Hover performance: brightness filter applied via imperative DOM mutation —\n// zero React re-renders on hover. Recharts requires a setState → full chart\n// re-render (101 shape functions) on every mousemove.\n//\n// Visual encoding:\n// BAR HEIGHT = (cumulative / maxCumulative) ^ 0.3 (Jupiter's z-function)\n// BAR OPACITY = 1.0 (order exists at this price) | 0.5 (cumulative only)\n// HOVER = filter: brightness(1.5) applied imperatively to the bar div\n//\n// Coloring: bearish (bid/buy-Yes) | bullish (ask/sell-Yes).\n// =============================================================================\nimport { useState, useMemo, useRef, useCallback, memo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport interface DepthLevel {\n price: number;\n quantity: number;\n}\n\nexport interface EventMarketDepthChartUIProps {\n bids: DepthLevel[];\n asks: DepthLevel[];\n}\n\n// ---------------------------------------------------------------------------\n// Color tokens\n// ---------------------------------------------------------------------------\n\n/** Bid bars: bullish (lime-green), buying YES. */\nconst BID_COLOR = \"var(--color-bullish)\";\n/** Ask bars: bearish (orange-red), selling YES. */\nconst ASK_COLOR = \"var(--color-bearish)\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Format a number using K / M / B notation (thousands-based).\n * 1500 → \"1.5K\" | 2300000 → \"2.3M\" | 1200000000 → \"1.2B\" | 999 → \"999\"\n */\nexport function formatKMB(n: number): string {\n const abs = Math.abs(n);\n if (abs >= 1_000_000_000) {\n return `${parseFloat((n / 1_000_000_000).toFixed(2))}B`;\n }\n if (abs >= 1_000_000) {\n return `${parseFloat((n / 1_000_000).toFixed(2))}M`;\n }\n if (abs >= 1_000) {\n return `${parseFloat((n / 1_000).toFixed(2))}K`;\n }\n return n.toLocaleString();\n}\n\n// ---------------------------------------------------------------------------\n// Data model\n// ---------------------------------------------------------------------------\n\nexport interface DepthSlot {\n priceCents: number;\n // (cumulative / maxCumulative)^0.3, range [0, 1]\n displayHeight: number;\n // 1.0 = actual order here; 0.5 = only cumulative depth passes through\n opacity: number;\n isBid: boolean;\n isAsk: boolean;\n bidCumTotal: number;\n askCumTotal: number;\n bidCumCost: number;\n askCumCost: number;\n}\n\n/**\n * Jupiter height formula (z function):\n * z(e, t) = e<=0 || t<=0 ? 0 : 100 * Math.pow(e/t, 0.3)\n * Returns normalized height in [0, 1].\n */\nfunction heightPow(cumulative: number, maxCumulative: number): number {\n if (cumulative <= 0 || maxCumulative <= 0) return 0;\n return Math.pow(cumulative / maxCumulative, 0.3);\n}\n\nfunction buildDepthData(bids: DepthLevel[], asks: DepthLevel[]): DepthSlot[] {\n const rawBidQty = new Float64Array(101);\n const rawAskQty = new Float64Array(101);\n\n for (const bid of bids) {\n const slot = Math.round(bid.price * 100);\n if (slot >= 0 && slot <= 100) rawBidQty[slot] += bid.quantity;\n }\n for (const ask of asks) {\n const slot = Math.round(ask.price * 100);\n if (slot >= 0 && slot <= 100) rawAskQty[slot] += ask.quantity;\n }\n\n // Bid cumulative: spread → 0¢\n let cumBid = 0;\n let cumBidCost = 0;\n const bidTotal = new Float64Array(101);\n const bidCumCostArr = new Float64Array(101);\n for (let i = 100; i >= 0; i--) {\n cumBid += rawBidQty[i];\n cumBidCost += (rawBidQty[i] * i) / 100;\n bidTotal[i] = cumBid;\n bidCumCostArr[i] = cumBidCost;\n }\n\n // Ask cumulative: spread → 100¢\n let cumAsk = 0;\n let cumAskCost = 0;\n const askTotal = new Float64Array(101);\n const askCumCostArr = new Float64Array(101);\n for (let i = 0; i <= 100; i++) {\n cumAsk += rawAskQty[i];\n cumAskCost += (rawAskQty[i] * i) / 100;\n askTotal[i] = cumAsk;\n askCumCostArr[i] = cumAskCost;\n }\n\n const maxCumulative = Math.max(bidTotal[0] ?? 0, askTotal[100] ?? 0);\n\n return Array.from({ length: 101 }, (_, i) => {\n const isBid = bidTotal[i] > 0;\n const isAsk = askTotal[i] > 0;\n const cumulative = bidTotal[i] || askTotal[i];\n const hasOrder = rawBidQty[i] > 0 || rawAskQty[i] > 0;\n\n return {\n priceCents: i,\n displayHeight: heightPow(cumulative, maxCumulative),\n opacity: cumulative > 0 ? (hasOrder ? 1 : 0.5) : 0,\n isBid,\n isAsk,\n bidCumTotal: bidTotal[i],\n askCumTotal: askTotal[i],\n bidCumCost: bidCumCostArr[i],\n askCumCost: askCumCostArr[i],\n };\n });\n}\n\n// ---------------------------------------------------------------------------\n// Tooltip\n// ---------------------------------------------------------------------------\n\ninterface TooltipInfo {\n priceCents: number;\n isBid: boolean;\n cumTotal: number;\n cumCost: number;\n leftPct: number;\n}\n\nfunction DepthTooltipPanel({ info }: { info: TooltipInfo }) {\n const { t } = useTranslation();\n const color = info.isBid ? BID_COLOR : ASK_COLOR;\n const left = info.leftPct > 65 ? undefined : `${info.leftPct}%`;\n const right = info.leftPct > 65 ? `${100 - info.leftPct}%` : undefined;\n\n return (\n <div\n style={{\n position: \"absolute\",\n top: 8,\n left,\n right,\n zIndex: 10,\n background: \"rgba(17,24,39,0.95)\",\n border: \"1px solid rgba(255,255,255,0.08)\",\n borderRadius: 8,\n padding: \"8px 12px\",\n fontSize: 12,\n color: \"#f9fafb\",\n minWidth: 140,\n pointerEvents: \"none\",\n }}\n >\n <div style={{ marginBottom: 4, fontWeight: 600 }}>\n {t(\"predict.orderBook.depthToPrice\", { price: info.priceCents })}\n </div>\n <div style={{ color }}>\n {t(\"predict.orderBook.depthContracts\", {\n amount: formatKMB(Math.round(info.cumTotal)),\n })}\n </div>\n <div style={{ color }}>${formatKMB(Math.round(info.cumCost))}</div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Single column — memo-ized so only the hovered column re-renders\n// ---------------------------------------------------------------------------\n\ninterface DepthColumnProps {\n slot: DepthSlot;\n onEnter: (slot: DepthSlot, barEl: HTMLDivElement | null) => void;\n onLeave: () => void;\n}\n\nconst DepthColumn = memo(function DepthColumn({\n slot,\n onEnter,\n onLeave,\n}: DepthColumnProps) {\n const barRef = useRef<HTMLDivElement>(null);\n const isVisible = slot.isBid || slot.isAsk;\n const bgColor = slot.isBid ? BID_COLOR : slot.isAsk ? ASK_COLOR : undefined;\n\n return (\n <div\n style={{\n position: \"absolute\",\n left: `${slot.priceCents}%`,\n // 1px transparent right border creates the same subtle column\n // separation as Jupiter's borderRightWidth: \"0.0625rem\"\n width: \"1%\",\n height: \"100%\",\n boxSizing: \"border-box\",\n borderRight: slot.priceCents < 100 ? \"1px solid transparent\" : \"none\",\n cursor: isVisible ? \"crosshair\" : \"default\",\n }}\n onMouseEnter={() => onEnter(slot, barRef.current)}\n onMouseLeave={onLeave}\n >\n {isVisible && (\n <div\n ref={barRef}\n style={{\n position: \"absolute\",\n bottom: 0,\n left: 0,\n width: \"100%\",\n height: `${slot.displayHeight * 100}%`,\n backgroundColor: bgColor,\n opacity: slot.opacity,\n }}\n />\n )}\n </div>\n );\n});\n\n// ---------------------------------------------------------------------------\n// X-axis\n// ---------------------------------------------------------------------------\n\nconst X_TICKS = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100];\n\nfunction DepthXAxis() {\n return (\n // Mirrors Jupiter: h-6 flex items-center with top+bottom border and dim bg\n <div\n className=\"relative flex h-6 items-center border-b border-t border-border px-1\"\n style={{ background: \"rgba(0,0,0,0.15)\" }}\n >\n {X_TICKS.map((tick) => (\n <span\n key={tick}\n className=\"absolute text-neutral font-normal\"\n style={{\n fontSize: 10,\n left: `${tick}%`,\n // 0 → no offset; 100 → pull fully left; others → center\n transform:\n tick === 0\n ? \"translateX(0px)\"\n : tick === 100\n ? \"translateX(-100%)\"\n : \"translateX(-50%)\",\n }}\n >\n {tick}\n </span>\n ))}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EventMarketDepthChartUI({\n bids,\n asks,\n}: EventMarketDepthChartUIProps) {\n const { t } = useTranslation();\n const data = useMemo(() => buildDepthData(bids, asks), [bids, asks]);\n\n const midPrice = useMemo(() => {\n const bestBid = bids.length > 0 ? Math.max(...bids.map((b) => b.price)) : 0;\n const bestAsk = asks.length > 0 ? Math.min(...asks.map((a) => a.price)) : 1;\n return Math.round(((bestBid + bestAsk) / 2) * 100);\n }, [bids, asks]);\n\n const hasData = useMemo(() => data.some((d) => d.isBid || d.isAsk), [data]);\n\n // Tooltip state — only this re-renders on hover, not the bar columns\n const [tooltip, setTooltip] = useState<TooltipInfo | null>(null);\n\n // Active bar element ref — we mutate DOM directly for brightness filter\n const activeBarRef = useRef<HTMLDivElement | null>(null);\n\n const handleColumnEnter = useCallback(\n (slot: DepthSlot, barEl: HTMLDivElement | null) => {\n // Remove brightness from the previously hovered bar\n if (activeBarRef.current) {\n activeBarRef.current.style.filter = \"\";\n }\n // Apply brightness to the newly hovered bar\n if (barEl) {\n barEl.style.filter = \"brightness(1.5)\";\n activeBarRef.current = barEl;\n } else {\n activeBarRef.current = null;\n }\n\n // Update tooltip (only re-renders the tooltip panel)\n if (slot.isBid || slot.isAsk) {\n setTooltip({\n priceCents: slot.priceCents,\n isBid: slot.isBid,\n cumTotal: slot.isBid ? slot.bidCumTotal : slot.askCumTotal,\n cumCost: slot.isBid ? slot.bidCumCost : slot.askCumCost,\n leftPct: slot.priceCents,\n });\n } else {\n setTooltip(null);\n }\n },\n [],\n );\n\n const handleColumnLeave = useCallback(() => {\n if (activeBarRef.current) {\n activeBarRef.current.style.filter = \"\";\n activeBarRef.current = null;\n }\n setTooltip(null);\n }, []);\n\n if (!hasData) {\n return (\n <div\n style={{\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"#6b7280\",\n fontSize: 13,\n }}\n >\n {t(\"predict.orderBook.noData\")}\n </div>\n );\n }\n\n return (\n // Fill the parent container (flex-1 in the widget).\n // flex-col: bar area flex-grows, x-axis stays h-6.\n // overflow: hidden prevents the priceCents=100 column (left:100%+width:1%)\n // from creating a horizontal scrollbar on any ancestor.\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n width: \"100%\",\n height: \"100%\",\n userSelect: \"none\",\n overflow: \"hidden\",\n }}\n >\n {/* Chart area — fills available height above the X-axis */}\n <div\n style={{\n flex: 1,\n position: \"relative\",\n width: \"100%\",\n overflow: \"hidden\",\n }}\n >\n {/* Mid-price dashed reference line */}\n {midPrice > 0 && (\n <div\n style={{\n position: \"absolute\",\n left: `${midPrice}%`,\n top: 0,\n bottom: 0,\n width: 1,\n backgroundImage:\n \"repeating-linear-gradient(to bottom, #6b7280 0, #6b7280 4px, transparent 4px, transparent 8px)\",\n zIndex: 1,\n pointerEvents: \"none\",\n }}\n />\n )}\n\n {/* Tooltip */}\n {tooltip && <DepthTooltipPanel info={tooltip} />}\n\n {/* Bar columns — each memo-ized, only the hovered one re-renders */}\n {data.map((slot) => (\n <DepthColumn\n key={slot.priceCents}\n slot={slot}\n onEnter={handleColumnEnter}\n onLeave={handleColumnLeave}\n />\n ))}\n </div>\n\n {/* X-axis */}\n <DepthXAxis />\n </div>\n );\n}\n","import { useState, useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictMarket } from \"@liberfi.io/react-predict\";\nimport { useOrderbook } from \"@liberfi.io/react-predict\";\nimport {\n Spinner,\n cn,\n OrderbookDepthIcon,\n OrderbookTableIcon,\n} from \"@liberfi.io/ui\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport {\n EventMarketDepthChartUI,\n formatKMB,\n type DepthLevel,\n} from \"./event-market-depth-chart.ui\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Format a price (0–1) as cents with up to 1 decimal place.\n * Whole numbers: \"8¢\" Fractional: \"8.1¢\"\n * Matches Jupiter's display format.\n */\nfunction formatPriceCents(price: number): string {\n const cents = price * 100;\n const rounded = Math.round(cents * 10) / 10; // round to 1 decimal\n return Number.isInteger(rounded) ? `${rounded}¢` : `${rounded.toFixed(1)}¢`;\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype ViewMode = \"depth\" | \"table\";\n\nexport interface EventMarketDetailWidgetProps {\n market: PredictMarket;\n /** Which outcome's orderbook to display; defaults to \"yes\". */\n outcome?: TradeOutcome;\n onTradeAction?: (\n market: PredictMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Loading skeleton shared by depth and table views\n// ---------------------------------------------------------------------------\n\nfunction OrderbookSkeleton() {\n const { t } = useTranslation();\n return (\n <div className=\"flex items-center justify-center gap-x-2 h-full text-neutral text-xs\">\n <Spinner size=\"sm\" />\n <span>{t(\"predict.orderBook.loading\")}</span>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EventMarketDetailWidget({\n market,\n outcome = \"yes\",\n onTradeAction,\n}: EventMarketDetailWidgetProps) {\n const { t } = useTranslation();\n const [viewMode, setViewMode] = useState<ViewMode>(\"depth\");\n const isNo = outcome === \"no\";\n\n const source = market.source;\n\n const { data: orderbook, isLoading: isOrderbookLoading } = useOrderbook({\n slug: market.slug,\n source,\n });\n\n const bids = useMemo(() => {\n const raw = isNo ? orderbook?.asks : orderbook?.bids;\n return (raw ?? []).map((o) => ({\n price: isNo ? 1 - o.price : o.price,\n quantity: o.size,\n }));\n }, [orderbook?.bids, orderbook?.asks, isNo]);\n\n const asks = useMemo(() => {\n const raw = isNo ? orderbook?.bids : orderbook?.asks;\n return (raw ?? []).map((o) => ({\n price: isNo ? 1 - o.price : o.price,\n quantity: o.size,\n }));\n }, [orderbook?.bids, orderbook?.asks, isNo]);\n\n const bestBid = useMemo(\n () => (bids.length > 0 ? Math.max(...bids.map((b) => b.price)) : null),\n [bids],\n );\n const bestAsk = useMemo(\n () => (asks.length > 0 ? Math.min(...asks.map((a) => a.price)) : null),\n [asks],\n );\n const spread = useMemo(() => {\n if (bestBid == null || bestAsk == null) return null;\n const raw = (bestAsk - bestBid) * 100;\n const rounded = Math.round(raw * 10) / 10;\n return rounded;\n }, [bestBid, bestAsk]);\n\n // Fixed total height matches Jupiter (header + content = 262px).\n return (\n <div className=\"flex flex-col h-[262px]\">\n {/*\n * Header — mirrors Jupiter's exact layout:\n * [flex-1] Spread [flex-1 center] Bid | Ask [flex-1 end] icon buttons\n * Each section is flex-1 (equal thirds), no absolute positioning.\n * Button active state is text-only (no bg highlight), matching Jupiter.\n */}\n <div className=\"flex h-9 items-center border-b border-border px-1 text-xs\">\n {/* LEFT: Spread — flex-1, plain neutral text */}\n <span className=\"flex-1 text-left text-neutral\">\n {spread != null\n ? `${t(\"predict.orderBook.spread\")}: ${Number.isInteger(spread) ? `${spread}¢` : `${spread.toFixed(1)}¢`}`\n : null}\n </span>\n\n {/* CENTER: Bid | Ask — flex-1, centered */}\n <span className=\"flex flex-1 items-center justify-center gap-x-1 whitespace-nowrap\">\n {bestBid != null && (\n <span style={{ color: \"var(--color-bullish)\" }}>\n {t(\"predict.trade.bestBid\")}: {formatPriceCents(bestBid)}\n </span>\n )}\n {bestBid != null && bestAsk != null && (\n <span className=\"text-neutral\">|</span>\n )}\n {bestAsk != null && (\n <span style={{ color: \"var(--color-bearish)\" }}>\n {t(\"predict.trade.bestAsk\")}: {formatPriceCents(bestAsk)}\n </span>\n )}\n </span>\n\n {/* RIGHT: View mode toggle icons — flex-1, end-aligned, color-only active state */}\n <div className=\"flex flex-1 justify-end\">\n <button\n type=\"button\"\n title={viewMode === \"depth\" ? \"Orderbook\" : \"Depth chart\"}\n onClick={() =>\n setViewMode((prev) => (prev === \"depth\" ? \"table\" : \"depth\"))\n }\n className=\"flex items-center text-neutral transition-colors cursor-pointer hover:text-foreground\"\n >\n {viewMode === \"depth\" ? (\n <OrderbookTableIcon className=\"h-4 w-4\" />\n ) : (\n <OrderbookDepthIcon className=\"h-4 w-4\" />\n )}\n </button>\n </div>\n </div>\n\n {/* Content area — fills the remaining height so total stays at 262px */}\n <div className=\"flex-1 min-h-0 overflow-hidden\">\n {viewMode === \"depth\" && (\n <>\n {isOrderbookLoading ? (\n <OrderbookSkeleton />\n ) : (\n <EventMarketDepthChartUI bids={bids} asks={asks} />\n )}\n </>\n )}\n\n {viewMode === \"table\" && (\n <>\n {isOrderbookLoading ? (\n <OrderbookSkeleton />\n ) : (\n <EventOrderbookTableUI\n bids={bids}\n asks={asks}\n bestBid={bestBid ?? undefined}\n bestAsk={bestAsk ?? undefined}\n spread={spread ?? undefined}\n />\n )}\n </>\n )}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// EventOrderbookTableUI — Jupiter-style traditional orderbook table\n// ---------------------------------------------------------------------------\n\nconst MAX_ROWS_PER_SIDE = 8;\n\ninterface EventOrderbookTableUIProps {\n bids: DepthLevel[];\n asks: DepthLevel[];\n bestBid?: number;\n bestAsk?: number;\n spread?: number;\n}\n\nfunction EventOrderbookTableUI({\n bids,\n asks,\n spread,\n}: EventOrderbookTableUIProps) {\n const { t } = useTranslation();\n\n // Asks: closest-to-spread first (ascending), take N, reverse for display (highest at top)\n const sortedAsks = useMemo(\n () =>\n [...asks]\n .sort((a, b) => a.price - b.price)\n .slice(0, MAX_ROWS_PER_SIDE)\n .reverse(),\n [asks],\n );\n\n // Bids: highest first (closest to spread at top), take N\n const sortedBids = useMemo(\n () =>\n [...bids].sort((a, b) => b.price - a.price).slice(0, MAX_ROWS_PER_SIDE),\n [bids],\n );\n\n // Max quantity across all visible rows — used for background depth bar width\n const maxQty = useMemo(() => {\n const all = [...sortedAsks, ...sortedBids].map((r) => r.quantity);\n return Math.max(...all, 1);\n }, [sortedAsks, sortedBids]);\n\n const isEmpty = sortedAsks.length === 0 && sortedBids.length === 0;\n\n if (isEmpty) {\n return (\n <div className=\"flex items-center justify-center h-full text-xs text-neutral\">\n {t(\"predict.orderBook.empty\")}\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col h-full overflow-y-auto text-xs font-mono select-none\">\n {/* Ask rows (sell Yes / buy No) */}\n {sortedAsks.map((ask) => (\n <OrderbookRow\n key={`ask-${ask.price}`}\n price={ask.price}\n quantity={ask.quantity}\n side=\"ask\"\n maxQty={maxQty}\n />\n ))}\n\n {/* Spread separator */}\n <div className=\"flex items-center justify-center gap-x-2 py-1 border-y border-border text-neutral text-[10px]\">\n {spread != null && (\n <span>\n {t(\"predict.orderBook.spread\")}:{\" \"}\n {Number.isInteger(spread) ? `${spread}¢` : `${spread.toFixed(1)}¢`}\n </span>\n )}\n </div>\n\n {/* Bid rows (buy Yes) */}\n {sortedBids.map((bid) => (\n <OrderbookRow\n key={`bid-${bid.price}`}\n price={bid.price}\n quantity={bid.quantity}\n side=\"bid\"\n maxQty={maxQty}\n />\n ))}\n\n {/* Column headers at the bottom, matching Jupiter's layout */}\n <div className=\"grid grid-cols-3 px-2 pt-2 pb-0.5 text-[10px] text-neutral border-t border-border\">\n <span>{t(\"predict.orderBook.price\")}</span>\n <span className=\"text-center\">{t(\"predict.orderBook.contracts\")}</span>\n <span className=\"text-right\">{t(\"predict.orderBook.total\")}</span>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Single orderbook row with background depth bar\n// ---------------------------------------------------------------------------\n\ninterface OrderbookRowProps {\n price: number;\n quantity: number;\n side: \"bid\" | \"ask\";\n maxQty: number;\n}\n\nfunction OrderbookRow({ price, quantity, side, maxQty }: OrderbookRowProps) {\n const isAsk = side === \"ask\";\n const depthPct = Math.min((quantity / maxQty) * 100, 100);\n const bgClass = isAsk ? \"bg-bearish/10\" : \"bg-bullish/10\";\n const priceClass = isAsk ? \"text-bearish\" : \"text-bullish\";\n\n const formattedContracts = formatKMB(Math.round(quantity));\n const dollarValue = Math.round(quantity * price);\n const formattedTotal = `$${formatKMB(dollarValue)}`;\n\n return (\n <div className=\"relative grid grid-cols-3 px-2 py-1 hover:bg-content2 transition-colors cursor-default\">\n {/* Background depth bar */}\n <div\n className={`absolute inset-y-0 left-0 ${bgClass} transition-[width] duration-200`}\n style={{ width: `${depthPct}%` }}\n />\n {/* Price */}\n <span className={`relative z-10 ${priceClass}`}>\n {formatPriceCents(price)}\n </span>\n {/* Contracts */}\n <span className=\"relative z-10 text-foreground text-center\">\n {formattedContracts}\n </span>\n {/* Total */}\n <span className=\"relative z-10 text-foreground text-right\">\n {formattedTotal}\n </span>\n </div>\n );\n}\n","// =============================================================================\n// EventPriceChart\n//\n// Pixel-accurate clone of the Jupiter Prediction Market price chart.\n// Uses Recharts LineChart with 7 visual effects:\n// 1. Top legend (dot + label + live %)\n// 2. Real-time tooltip on hover\n// 3. Active cursor dot on each line\n// 4. Breathing pulsing dot at the last data point\n// 5. Left/right opacity overlay that follows the cursor\n// 6. Custom X/Y axis styling\n// 7. Horizontal dashed grid lines\n//\n// Accepts a PredictEvent and selects up to 4 markets to display via a chip selector.\n// =============================================================================\nimport {\n Component,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ErrorInfo,\n type ReactNode,\n} from \"react\";\nimport {\n CartesianGrid,\n Line,\n LineChart,\n ReferenceDot,\n ResponsiveContainer,\n Tooltip,\n XAxis,\n YAxis,\n} from \"recharts\";\nimport type { PredictEvent, PredictMarket } from \"@liberfi.io/react-predict\";\nimport {\n ChartRange,\n type ChartRangeType,\n useMarketHistory,\n type MarketHistorySeries,\n} from \"@liberfi.io/react-predict\";\nimport { DEFAULT_CHART_RANGE } from \"../../consts\";\n\n// ---------------------------------------------------------------------------\n// Error boundary — prevents chart crashes from taking down the page\n// ---------------------------------------------------------------------------\n\ninterface ChartErrorBoundaryState {\n error: Error | null;\n}\n\nclass ChartErrorBoundary extends Component<\n { children: ReactNode; fallbackHeight?: number },\n ChartErrorBoundaryState\n> {\n state: ChartErrorBoundaryState = { error: null };\n\n static getDerivedStateFromError(error: Error) {\n return { error };\n }\n\n componentDidCatch(error: Error, info: ErrorInfo) {\n console.error(\"[EventPriceChart] render error:\", error, info);\n }\n\n render() {\n if (this.state.error) {\n return (\n <div\n style={{\n height: this.props.fallbackHeight ?? 320,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n color: \"#6b7280\",\n fontSize: 13,\n }}\n >\n <span>Chart unavailable</span>\n <span style={{ fontSize: 11, opacity: 0.7 }}>\n {this.state.error.message}\n </span>\n </div>\n );\n }\n return this.props.children;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst MAX_SELECTED = 4;\n\n/** Jupiter-aligned chart colors */\nconst CHART_COLORS = [\n \"#22d3ee\", // cyan\n \"#a3e635\", // lime\n \"#f97316\", // orange\n \"#f472b6\", // pink\n \"#a78bfa\", // violet\n];\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction formatTimestamp(ms: number, range?: ChartRangeType): string {\n const d = new Date(ms);\n if (range === ChartRange.ONE_DAY) {\n // e.g. \"14:30\"\n return d.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n }\n // e.g. \"Mar 18\"\n return d.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" });\n}\n\nfunction formatTooltipTimestamp(ms: number, range?: ChartRangeType): string {\n const d = new Date(ms);\n if (range === ChartRange.ONE_DAY) {\n return d.toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n }\n if (range === ChartRange.ONE_WEEK) {\n return d.toLocaleDateString(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n }\n return d.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" });\n}\n\nfunction formatPercent(value: number): string {\n return `${(value * 100).toFixed(2)}%`;\n}\n\n// ---------------------------------------------------------------------------\n// Interval labels\n// ---------------------------------------------------------------------------\n\nconst INTERVAL_OPTIONS: { range: ChartRangeType; label: string }[] = [\n { range: ChartRange.ONE_DAY, label: \"1D\" },\n { range: ChartRange.ONE_WEEK, label: \"1W\" },\n { range: ChartRange.ONE_MONTH, label: \"1M\" },\n { range: ChartRange.ALL, label: \"ALL\" },\n];\n\n// ---------------------------------------------------------------------------\n// IntervalSwitcher — plain text buttons, Jupiter-style\n// ---------------------------------------------------------------------------\n\ninterface IntervalSwitcherProps {\n value: ChartRangeType;\n onChange: (range: ChartRangeType) => void;\n}\n\nfunction IntervalSwitcher({ value, onChange }: IntervalSwitcherProps) {\n return (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 2 }}>\n {INTERVAL_OPTIONS.map(({ range, label }) => {\n const isActive = range === value;\n return (\n <button\n key={range}\n onClick={() => onChange(range)}\n style={{\n padding: \"2px 8px\",\n border: \"none\",\n background: \"transparent\",\n color: isActive ? \"#f9fafb\" : \"#6b7280\",\n fontWeight: isActive ? 700 : 400,\n fontSize: 12,\n cursor: \"pointer\",\n borderRadius: 4,\n letterSpacing: \"0.02em\",\n transition: \"color 0.15s\",\n userSelect: \"none\",\n }}\n >\n {label}\n </button>\n );\n })}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// useCursorOverlay\n//\n// Returns refs for the chart wrapper div and the overlay div.\n// Mouse position tracking is done at the div level (not via Recharts internals)\n// so the approach works regardless of Recharts version or SVG structure.\n// DOM style is updated imperatively — zero React re-renders on mousemove.\n// ---------------------------------------------------------------------------\n\nfunction useCursorOverlay() {\n const wrapperRef = useRef<HTMLDivElement | null>(null);\n const overlayRef = useRef<HTMLDivElement | null>(null);\n\n const onMouseMove = useCallback((e: React.MouseEvent<HTMLDivElement>) => {\n const wrapper = wrapperRef.current;\n const overlay = overlayRef.current;\n if (!wrapper || !overlay) return;\n\n const rect = wrapper.getBoundingClientRect();\n // Cursor offset as percentage of the wrapper — this is exactly where the\n // cursor is visually, so the gradient cutoff aligns perfectly with it.\n const xPct = ((e.clientX - rect.left) / rect.width) * 100;\n\n // Left of cursor: transparent (lines at full brightness).\n // Right of cursor: ~38% dark overlay, matching Jupiter's visual where\n // lines to the right appear ~30% dimmer than lines to the left.\n overlay.style.background = `linear-gradient(to right, transparent ${xPct}%, rgba(0,0,0,0.55) ${xPct}%)`;\n overlay.style.opacity = \"1\";\n }, []);\n\n const onMouseLeave = useCallback(() => {\n if (overlayRef.current) overlayRef.current.style.opacity = \"0\";\n }, []);\n\n return { wrapperRef, overlayRef, onMouseMove, onMouseLeave };\n}\n\n// ---------------------------------------------------------------------------\n// CustomTooltip\n// ---------------------------------------------------------------------------\n\ninterface CustomTooltipPayloadItem {\n dataKey: string;\n value: number | undefined;\n stroke: string;\n color: string;\n}\n\ninterface CustomTooltipProps {\n active?: boolean;\n payload?: CustomTooltipPayloadItem[];\n label?: number | string;\n labelMap: Map<string, string>;\n /** All series slugs + colors so missing entries can be shown as \"--\" */\n allSeries?: Array<{ slug: string; color: string }>;\n range?: ChartRangeType;\n}\n\nfunction CustomTooltip({\n active,\n payload,\n label,\n labelMap,\n allSeries,\n range,\n}: CustomTooltipProps) {\n if (!active || !allSeries?.length) return null;\n\n const payloadMap = new Map<string, CustomTooltipPayloadItem>();\n payload?.forEach((p) => payloadMap.set(p.dataKey, p));\n\n const items: CustomTooltipPayloadItem[] = allSeries.map((s) => {\n const existing = payloadMap.get(s.slug);\n return (\n existing ?? {\n dataKey: s.slug,\n value: undefined,\n stroke: s.color,\n color: s.color,\n }\n );\n });\n\n return (\n <div\n style={{\n background: \"rgba(10,10,10,0.92)\",\n border: \"1px solid rgba(255,255,255,0.1)\",\n borderRadius: 8,\n padding: \"8px 12px\",\n minWidth: 180,\n backdropFilter: \"blur(8px)\",\n fontSize: 12,\n }}\n >\n <div style={{ color: \"#9ca3af\", marginBottom: 6, fontWeight: 500 }}>\n {typeof label === \"number\"\n ? formatTooltipTimestamp(label, range)\n : label}\n </div>\n {items.map((p) => (\n <div\n key={p.dataKey}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n marginBottom: 3,\n }}\n >\n <span\n style={{\n display: \"inline-block\",\n width: 3,\n height: 14,\n borderRadius: 2,\n background: p.stroke ?? p.color,\n flexShrink: 0,\n }}\n />\n <span\n style={{\n color: \"#9ca3af\",\n flex: 1,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n maxWidth: 120,\n }}\n >\n {labelMap.get(p.dataKey) ?? p.dataKey}\n </span>\n <span\n style={{\n color: \"#f9fafb\",\n fontWeight: 700,\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n {p.value != null ? formatPercent(p.value) : \"--\"}\n </span>\n </div>\n ))}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// MarketSelector — dropdown multi-select, max MAX_SELECTED markets\n// ---------------------------------------------------------------------------\n\ninterface MarketSelectorProps {\n markets: PredictMarket[];\n selectedSlugs: string[];\n colorMap: Map<string, string>;\n onToggle: (slug: string) => void;\n}\n\nfunction MarketSelector({\n markets,\n selectedSlugs,\n colorMap,\n onToggle,\n}: MarketSelectorProps) {\n const [open, setOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n\n // Close on outside click\n useEffect(() => {\n if (!open) return;\n function handleClick(e: MouseEvent) {\n if (rootRef.current && !rootRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n }\n document.addEventListener(\"mousedown\", handleClick);\n return () => document.removeEventListener(\"mousedown\", handleClick);\n }, [open]);\n\n const atMax = selectedSlugs.length >= MAX_SELECTED;\n\n // Trigger label: show colored dots + count summary\n const triggerContent = (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n flex: 1,\n minWidth: 0,\n }}\n >\n {/* Color dots for selected markets */}\n <div style={{ display: \"flex\", gap: 3, flexShrink: 0 }}>\n {selectedSlugs.map((slug) => (\n <span\n key={slug}\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: colorMap.get(slug) ?? \"#6b7280\",\n display: \"inline-block\",\n }}\n />\n ))}\n </div>\n {/* Label */}\n <span\n style={{\n color: \"#e5e7eb\",\n fontSize: 12,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {selectedSlugs.length === 1\n ? (() => {\n const m = markets.find((mk) => mk.slug === selectedSlugs[0]);\n return m?.outcomes?.[0]?.label ?? m?.question ?? \"1 market\";\n })()\n : `${selectedSlugs.length} / ${markets.length} markets`}\n </span>\n </div>\n );\n\n return (\n <div\n ref={rootRef}\n style={{ position: \"relative\", display: \"inline-block\", width: 200 }}\n >\n {/* Trigger button */}\n <button\n onClick={() => setOpen((v) => !v)}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"5px 10px\",\n borderRadius: 8,\n border: \"1px solid rgba(255,255,255,0.12)\",\n background: \"rgba(255,255,255,0.05)\",\n cursor: \"pointer\",\n width: \"100%\",\n userSelect: \"none\",\n }}\n >\n {triggerContent}\n {/* Chevron */}\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n style={{\n flexShrink: 0,\n transform: open ? \"rotate(180deg)\" : \"rotate(0deg)\",\n transition: \"transform 0.15s\",\n color: \"#6b7280\",\n }}\n >\n <path\n d=\"M2 4l4 4 4-4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n\n {/* Dropdown panel */}\n {open && (\n <div\n style={{\n position: \"absolute\",\n top: \"calc(100% + 4px)\",\n left: 0,\n zIndex: 50,\n background: \"#111827\",\n border: \"1px solid rgba(255,255,255,0.1)\",\n borderRadius: 10,\n boxShadow: \"0 8px 24px rgba(0,0,0,0.5)\",\n minWidth: 260,\n maxWidth: 360,\n maxHeight: 320,\n overflowY: \"auto\",\n padding: \"6px 0\",\n }}\n >\n {/* Header hint */}\n <div\n style={{\n padding: \"4px 12px 8px\",\n fontSize: 11,\n color: \"#6b7280\",\n borderBottom: \"1px solid rgba(255,255,255,0.06)\",\n marginBottom: 4,\n }}\n >\n Select up to {MAX_SELECTED} markets\n </div>\n\n {markets.map((market, idx) => {\n const isSelected = selectedSlugs.includes(market.slug);\n const isDisabled = !isSelected && atMax;\n const isOnlyOne = isSelected && selectedSlugs.length === 1;\n const color = colorMap.get(market.slug) ?? \"#6b7280\";\n const yesOutcome =\n market.outcomes.find((o) => o.label.toLowerCase() === \"yes\") ??\n market.outcomes[0];\n const pct =\n yesOutcome?.price != null\n ? `${Math.round(yesOutcome.price * 100)}%`\n : null;\n\n return (\n <button\n key={market.id ?? `${idx}-${market.slug}`}\n onClick={() => {\n if (isOnlyOne || isDisabled) return;\n onToggle(market.slug);\n }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n width: \"100%\",\n padding: \"7px 12px\",\n border: \"none\",\n background: isSelected\n ? \"rgba(255,255,255,0.05)\"\n : \"transparent\",\n cursor: isDisabled || isOnlyOne ? \"not-allowed\" : \"pointer\",\n opacity: isDisabled ? 0.35 : 1,\n textAlign: \"left\",\n transition: \"background 0.1s\",\n }}\n onMouseEnter={(e) => {\n if (!isDisabled && !isOnlyOne)\n (e.currentTarget as HTMLButtonElement).style.background =\n \"rgba(255,255,255,0.07)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLButtonElement).style.background =\n isSelected ? \"rgba(255,255,255,0.05)\" : \"transparent\";\n }}\n >\n {/* Checkbox */}\n <span\n style={{\n width: 16,\n height: 16,\n borderRadius: 4,\n border: isSelected\n ? `2px solid ${color}`\n : \"2px solid rgba(255,255,255,0.2)\",\n background: isSelected ? `${color}30` : \"transparent\",\n flexShrink: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {isSelected && (\n <svg width=\"9\" height=\"7\" viewBox=\"0 0 9 7\" fill=\"none\">\n <path\n d=\"M1 3.5L3.5 6L8 1\"\n stroke={color}\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </span>\n\n {/* Color dot */}\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: color,\n flexShrink: 0,\n }}\n />\n\n {/* Question text */}\n <span\n style={{\n color: isSelected ? \"#f9fafb\" : \"#9ca3af\",\n fontSize: 12,\n flex: 1,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {market.outcomes?.[0]?.label ?? market.question}\n </span>\n\n {/* Odds */}\n {pct && (\n <span\n style={{\n color,\n fontWeight: 700,\n fontSize: 12,\n flexShrink: 0,\n }}\n >\n {pct}\n </span>\n )}\n </button>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Legend\n// ---------------------------------------------------------------------------\n\ninterface LegendBarProps {\n series: MarketHistorySeries[];\n colorMap: Map<string, string>;\n /** Values to display — hovered values when scrubbing, else latest values */\n displayValues: Map<string, number>;\n}\n\nfunction LegendBar({ series, colorMap, displayValues }: LegendBarProps) {\n return (\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"6px 24px\",\n padding: \"0 2px\",\n }}\n >\n {series.map((s) => {\n const color = colorMap.get(s.marketSlug) ?? \"#6b7280\";\n const value = displayValues.get(s.marketSlug);\n return (\n <div\n key={s.marketSlug}\n style={{\n display: \"inline-flex\",\n alignItems: \"flex-start\",\n gap: 6,\n }}\n >\n {/* Dot — aligned to the name row */}\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: color,\n flexShrink: 0,\n marginTop: 3,\n }}\n />\n {/* Name + percentage stacked vertically */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 1 }}>\n <span\n style={{\n color: \"#9ca3af\",\n fontSize: 12,\n lineHeight: \"17px\",\n whiteSpace: \"nowrap\",\n }}\n >\n {s.label}\n </span>\n <span\n style={{\n color: \"#f9fafb\",\n fontSize: 14,\n fontWeight: 700,\n lineHeight: \"20px\",\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n {value != null ? formatPercent(value) : \"--\"}\n </span>\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Chart data transformation (timestamp union + forward fill)\n// ---------------------------------------------------------------------------\n\ntype ChartRow = Record<string, number>;\n\n/**\n * Compute the median of a sorted numeric array.\n * The array must be sorted ascending before calling this function.\n */\nfunction medianOfSorted(sorted: number[]): number {\n const mid = Math.floor(sorted.length / 2);\n return sorted.length % 2 === 1\n ? sorted[mid]\n : (sorted[mid - 1] + sorted[mid]) / 2;\n}\n\n/**\n * Reduce a price series to at most `maxPoints` data points using bucket\n * median. Within each bucket the median price is taken (more robust to\n * short-lived outlier spikes than the mean), and the last timestamp of\n * the bucket is kept to preserve the breathing-dot position at the end.\n */\nfunction downsampleSeries(\n data: MarketHistorySeries[\"data\"],\n maxPoints: number,\n): MarketHistorySeries[\"data\"] {\n if (data.length <= maxPoints) return data;\n\n const result: MarketHistorySeries[\"data\"] = [];\n const step = data.length / maxPoints;\n\n for (let i = 0; i < maxPoints; i++) {\n const start = Math.floor(i * step);\n const end = Math.min(Math.floor((i + 1) * step), data.length);\n const bucket = data.slice(start, end);\n const sorted = bucket.map((p) => p.price).sort((a, b) => a - b);\n result.push({\n timestamp: bucket[bucket.length - 1].timestamp,\n price: medianOfSorted(sorted),\n });\n }\n\n return result;\n}\n\nfunction buildChartData(\n series: MarketHistorySeries[],\n maxPointsPerSeries = 200,\n): ChartRow[] {\n if (series.length === 0) return [];\n\n // Downsample each series before merging to reduce visual noise\n const sampledSeries = series.map((s) => ({\n ...s,\n data: downsampleSeries(s.data, maxPointsPerSeries),\n }));\n\n const allTimestamps = new Set<number>();\n sampledSeries.forEach((s) =>\n s.data.forEach((p) => allTimestamps.add(p.timestamp)),\n );\n\n const sorted = Array.from(allTimestamps).sort((a, b) => a - b);\n\n // Build per-series lookup map\n const lookups = sampledSeries.map((s) => {\n const m = new Map<number, number>();\n s.data.forEach((p) => m.set(p.timestamp, p.price));\n return { slug: s.marketSlug, map: m };\n });\n\n const lastValues = new Map<string, number>();\n\n return sorted.map((ts) => {\n const row: ChartRow = { timestamp: ts };\n lookups.forEach(({ slug, map }) => {\n const val = map.get(ts);\n if (val !== undefined) {\n lastValues.set(slug, val);\n row[slug] = val;\n } else {\n const last = lastValues.get(slug);\n if (last !== undefined) row[slug] = last;\n }\n });\n return row;\n });\n}\n\n// ---------------------------------------------------------------------------\n// EventPriceChart\n// ---------------------------------------------------------------------------\n\nexport interface EventPriceChartProps {\n event: PredictEvent;\n isLoading?: boolean;\n /** Optional CSS class for the outer container */\n className?: string;\n /** Event total volume (shown in chart footer bar alongside interval switcher) */\n volume?: number;\n}\n\nexport function EventPriceChart(props: EventPriceChartProps) {\n return (\n <ChartErrorBoundary>\n <EventPriceChartInner {...props} />\n </ChartErrorBoundary>\n );\n}\n\nfunction EventPriceChartInner({\n event,\n isLoading: externalLoading,\n className,\n volume,\n}: EventPriceChartProps) {\n const allMarkets = useMemo(() => {\n const seen = new Set<string>();\n return (event.markets ?? []).filter((m) => {\n if (m.status !== \"open\" || seen.has(m.slug)) return false;\n seen.add(m.slug);\n return true;\n });\n }, [event.markets]);\n\n // Sort markets by YES outcome price descending so the highest-probability\n // candidates appear first in both the default selection and the dropdown.\n const sortedMarkets = useMemo(\n () =>\n [...allMarkets].sort((a, b) => {\n const priceOf = (m: PredictMarket) =>\n (\n m.outcomes.find((o) => o.label.toLowerCase() === \"yes\") ??\n m.outcomes[0]\n )?.price ?? 0;\n return priceOf(b) - priceOf(a);\n }),\n [allMarkets],\n );\n\n // Default: first MAX_SELECTED markets by price (highest first)\n const [selectedSlugs, setSelectedSlugs] = useState<string[]>(() =>\n sortedMarkets.slice(0, MAX_SELECTED).map((m) => m.slug),\n );\n\n // Chart time range (interval selector)\n const [chartRange, setChartRange] =\n useState<ChartRangeType>(DEFAULT_CHART_RANGE);\n\n // Color mapping: only selected markets get chart colors.\n // Colors are assigned by selection order so they stay stable\n // as long as the selection doesn't change.\n const colorMap = useMemo(() => {\n const map = new Map<string, string>();\n selectedSlugs.forEach((slug, idx) => {\n map.set(slug, CHART_COLORS[idx % CHART_COLORS.length]);\n });\n return map;\n }, [selectedSlugs]);\n\n const selectedMarkets = useMemo(\n () => allMarkets.filter((m) => selectedSlugs.includes(m.slug)),\n [allMarkets, selectedSlugs],\n );\n\n const { series: hookSeries, isLoading: hookLoading } = useMarketHistory(\n selectedMarkets,\n chartRange,\n );\n const isLoading = externalLoading || hookLoading;\n\n // Belt-and-suspenders: if hook returns no renderable data, generate\n // synthetic flat lines from current outcome prices so the chart is never empty.\n const series = useMemo<MarketHistorySeries[]>(() => {\n if (hookSeries.length > 0 && hookSeries.some((s) => s.data.length > 0)) {\n return hookSeries;\n }\n const now = Date.now();\n const dayMs = 86_400_000;\n return selectedMarkets.map((market) => {\n const yesOutcome =\n market.outcomes?.find((o) => o.label.toLowerCase() === \"yes\") ??\n market.outcomes?.[0];\n const price = yesOutcome?.price ?? 0.5;\n return {\n marketSlug: market.slug,\n label: market.outcomes?.[0]?.label ?? market.question,\n data: [\n { timestamp: now - 7 * dayMs, price },\n { timestamp: now, price },\n ],\n };\n });\n }, [hookSeries, selectedMarkets]);\n\n // Fewer points for short ranges (data is already sparse); more for ALL so\n // the long history still has enough resolution without being noisy.\n const maxPointsPerSeries = useMemo(() => {\n if (chartRange === ChartRange.ONE_DAY) return 96; // ~15-min buckets\n if (chartRange === ChartRange.ONE_WEEK) return 168; // ~1-hour buckets\n if (chartRange === ChartRange.ONE_MONTH) return 180; // ~4-hour buckets\n return 300; // ALL — daily-ish buckets\n }, [chartRange]);\n\n const chartData = useMemo(\n () => buildChartData(series, maxPointsPerSeries),\n [series, maxPointsPerSeries],\n );\n\n // Y-axis domain: padded range of all values\n const yDomain = useMemo((): [number, number] => {\n if (chartData.length === 0) return [0, 1];\n let min = Infinity;\n let max = -Infinity;\n selectedSlugs.forEach((slug) => {\n chartData.forEach((row) => {\n const v = row[slug];\n if (v != null) {\n if (v < min) min = v;\n if (v > max) max = v;\n }\n });\n });\n if (!isFinite(min)) return [0, 1];\n const pad = Math.max((max - min) * 0.15, 0.05);\n return [Math.max(0, min - pad), Math.min(1, max + pad)];\n }, [chartData, selectedSlugs]);\n\n // Current values for legend (latest point)\n const currentValues = useMemo(() => {\n const map = new Map<string, number>();\n series.forEach((s) => {\n if (s.data.length > 0) {\n map.set(s.marketSlug, s.data[s.data.length - 1].price);\n }\n });\n return map;\n }, [series]);\n\n // Tooltip label map\n const labelMap = useMemo(() => {\n const map = new Map<string, string>();\n series.forEach((s) => map.set(s.marketSlug, s.label));\n return map;\n }, [series]);\n\n // All series slugs + colors for tooltip (so missing entries show \"--\")\n const tooltipSeries = useMemo(\n () =>\n series.map((s) => ({\n slug: s.marketSlug,\n color: colorMap.get(s.marketSlug) ?? \"#6b7280\",\n })),\n [series, colorMap],\n );\n\n // Effect 5: cursor overlay (left transparent / right dimmed)\n const {\n wrapperRef: chartWrapperRef,\n overlayRef: overlayDivRef,\n onMouseMove: handleWrapperMouseMove,\n onMouseLeave: handleWrapperMouseLeave,\n } = useCursorOverlay();\n\n // Market selector toggle handler\n const handleToggle = useCallback((slug: string) => {\n setSelectedSlugs((prev) => {\n if (prev.includes(slug)) {\n if (prev.length <= 1) return prev;\n return prev.filter((s) => s !== slug);\n }\n if (prev.length >= MAX_SELECTED) return prev;\n return [...prev, slug];\n });\n }, []);\n\n // Hovered values for legend.\n // Tooltip writes to refs during render (safe, no state update).\n // Wrapper onMouseMove schedules a rAF to flush ref → state after Recharts\n // has finished rendering the tooltip, so the ref is up-to-date.\n const [hoveredValues, setHoveredValues] = useState<Map<\n string,\n number\n > | null>(null);\n const hoveredValuesRef = useRef<Map<string, number> | null>(null);\n const lastPayloadKeyRef = useRef(\"\");\n const rafIdRef = useRef(0);\n\n const showChart = !isLoading && chartData.length > 0;\n\n return (\n <div\n className={className}\n style={{ display: \"flex\", flexDirection: \"column\", gap: 12 }}\n >\n {/* Legend — values update dynamically when scrubbing the chart */}\n <LegendBar\n series={series}\n colorMap={colorMap}\n displayValues={hoveredValues ?? currentValues}\n />\n\n {/* Chart */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 0 }}>\n <div\n ref={chartWrapperRef}\n style={{\n height: 300,\n width: \"100%\",\n userSelect: \"none\",\n position: \"relative\",\n }}\n onMouseMove={\n showChart\n ? (e) => {\n handleWrapperMouseMove(e);\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = requestAnimationFrame(() => {\n setHoveredValues(hoveredValuesRef.current);\n });\n }\n : undefined\n }\n onMouseLeave={\n showChart\n ? () => {\n handleWrapperMouseLeave();\n cancelAnimationFrame(rafIdRef.current);\n lastPayloadKeyRef.current = \"\";\n hoveredValuesRef.current = null;\n setHoveredValues(null);\n }\n : undefined\n }\n >\n {isLoading ? (\n <div\n style={{\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <div\n style={{\n width: 28,\n height: 28,\n borderRadius: \"50%\",\n border: \"2.5px solid #22d3ee\",\n borderTopColor: \"transparent\",\n animation: \"spin 0.7s linear infinite\",\n }}\n />\n </div>\n ) : chartData.length === 0 ? (\n <div\n style={{\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"#6b7280\",\n fontSize: 13,\n }}\n >\n No price history data\n </div>\n ) : (\n <>\n {/* Effect 5: left transparent / right dimmed overlay div */}\n <div\n ref={overlayDivRef}\n style={{\n position: \"absolute\",\n inset: 0,\n opacity: 0,\n pointerEvents: \"none\",\n zIndex: 1,\n }}\n />\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <LineChart\n data={chartData}\n margin={{ top: 8, right: 16, left: 0, bottom: 0 }}\n >\n {/* Effect 7: horizontal dashed grid */}\n <CartesianGrid\n horizontal\n vertical={false}\n strokeDasharray=\"3 3\"\n stroke=\"#374151\"\n opacity={0.5}\n />\n\n {/* Effect 6: X axis */}\n <XAxis\n dataKey=\"timestamp\"\n type=\"number\"\n scale=\"time\"\n domain={[\"dataMin\", \"dataMax\"]}\n tickFormatter={(ms: number) =>\n formatTimestamp(ms, chartRange)\n }\n axisLine={false}\n tickLine={false}\n tick={{ fill: \"#6b7280\", fontSize: 11 }}\n minTickGap={70}\n />\n\n {/* Effect 6: Y axis */}\n <YAxis\n domain={yDomain}\n tickFormatter={(v: number) => `${Math.round(v * 100)}%`}\n axisLine={false}\n tickLine={false}\n tick={{ fill: \"#6b7280\", fontSize: 11 }}\n width={40}\n tickCount={6}\n />\n\n {/* Effect 2: real-time tooltip */}\n <Tooltip\n content={(props) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const p = props as any;\n if (p.active && p.payload?.length) {\n const key = p.payload\n .map(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (item: any) => `${item.dataKey}:${item.value}`,\n )\n .join(\",\");\n if (key !== lastPayloadKeyRef.current) {\n lastPayloadKeyRef.current = key;\n const map = new Map<string, number>();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n p.payload.forEach((item: any) => {\n if (item.value != null)\n map.set(item.dataKey, item.value);\n });\n hoveredValuesRef.current = map;\n }\n }\n return (\n <CustomTooltip\n {...p}\n labelMap={labelMap}\n allSeries={tooltipSeries}\n range={chartRange}\n />\n );\n }}\n cursor={{\n stroke: \"#4b5563\",\n strokeWidth: 1,\n strokeDasharray: \"4 4\",\n }}\n wrapperStyle={{ zIndex: 2 }}\n isAnimationActive={false}\n />\n\n {/* Lines — dot={false} to skip per-point React calls.\n * type=\"linear\" (straight segments) avoids the cubic-spline\n * overshoot that \"monotone\" produces at sharp price jumps on\n * low-liquidity forward-filled data. strokeLinejoin=\"round\"\n * softens the angle at each vertex. */}\n {series.map((s) => {\n const color = colorMap.get(s.marketSlug) ?? \"#6b7280\";\n return (\n <Line\n key={s.marketSlug}\n type=\"linear\"\n dataKey={s.marketSlug}\n stroke={color}\n strokeWidth={2}\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n dot={false}\n activeDot={{\n r: 4.5,\n strokeWidth: 2,\n stroke: \"rgba(10,10,10,0.8)\",\n fill: color,\n }}\n connectNulls\n isAnimationActive={false}\n />\n );\n })}\n\n {/* Breathing dots at each series' last data point */}\n {hoveredValues == null &&\n chartData.length > 0 &&\n series.map((s) => {\n const lastRow = chartData[chartData.length - 1];\n const yVal = lastRow[s.marketSlug];\n if (yVal == null) return null;\n const color = colorMap.get(s.marketSlug) ?? \"#6b7280\";\n return (\n <ReferenceDot\n key={`pulse-${s.marketSlug}`}\n x={lastRow.timestamp}\n y={yVal as number}\n ifOverflow=\"extendDomain\"\n shape={(props: { cx?: number; cy?: number }) => {\n const { cx: dx, cy: dy } = props;\n if (dx == null || dy == null) return <g />;\n return (\n <g>\n <circle\n cx={dx}\n cy={dy}\n r={6}\n fill={color}\n opacity={0.3}\n >\n <animate\n attributeName=\"r\"\n values=\"4;9;4\"\n dur=\"2s\"\n repeatCount=\"indefinite\"\n />\n <animate\n attributeName=\"opacity\"\n values=\"0.4;0.05;0.4\"\n dur=\"2s\"\n repeatCount=\"indefinite\"\n />\n </circle>\n <circle cx={dx} cy={dy} r={3.5} fill={color} />\n </g>\n );\n }}\n />\n );\n })}\n </LineChart>\n </ResponsiveContainer>\n </>\n )}\n </div>\n\n {/* Bottom bar: [volume] [IntervalSwitcher] on row 1, [MarketSelector] on row 2 (mobile) */}\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n alignItems: \"center\",\n gap: \"6px 8px\",\n marginTop: 6,\n }}\n >\n {volume != null && volume > 0 && (\n <span\n style={{\n color: \"#6b7280\",\n fontSize: 12,\n }}\n >\n ${Math.round(volume).toLocaleString()} vol\n </span>\n )}\n <div style={{ flex: 1, minWidth: 0 }} />\n <IntervalSwitcher value={chartRange} onChange={setChartRange} />\n {sortedMarkets.length > 1 && (\n <div\n style={{\n width: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n <MarketSelector\n markets={sortedMarkets}\n selectedSlugs={selectedSlugs}\n colorMap={colorMap}\n onToggle={handleToggle}\n />\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","import { Fragment, useState, useMemo, useEffect, type Key } from \"react\";\nimport { useScrollCollapse } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent, PredictMarket } from \"@liberfi.io/react-predict\";\nimport {\n Avatar,\n Button,\n ChevronDownIcon,\n cn,\n Dropdown,\n DropdownItem,\n DropdownMenu,\n DropdownTrigger,\n KalshiIcon,\n PolymarketIcon,\n useScreen,\n} from \"@liberfi.io/ui\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport { EventMarketDetailWidget } from \"./event-market-detail.widget\";\nimport { EventPriceChart } from \"./event-price-chart.ui\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getYesAsk(market: PredictMarket): number {\n return market.outcomes[0]?.best_ask ?? market.outcomes[0]?.price ?? 0;\n}\n\nfunction formatPercent(value: number): string {\n return `${parseFloat((value * 100).toFixed(2))}%`;\n}\n\nfunction formatCents(value: number): string {\n const cents = value * 100;\n if (cents < 1 && cents > 0) return `< 1`;\n return parseFloat(cents.toFixed(2)).toString();\n}\n\n/** Display label for a market row — prefer first outcome label, fall back to question. */\nfunction getMarketLabel(market: PredictMarket): string {\n return market.outcomes?.[0]?.label ?? market.question;\n}\n\nfunction getPlatformLabel(source: string): string {\n switch (source) {\n case \"polymarket\":\n return \"Polymarket\";\n case \"kalshi\":\n return \"Kalshi\";\n default:\n return source;\n }\n}\n\nfunction formatISOTimestamp(iso: string | undefined): string {\n if (!iso) return \"—\";\n const date = new Date(iso);\n if (isNaN(date.getTime())) return \"—\";\n const month = date.toLocaleString(\"default\", { month: \"short\" });\n const day = date.getDate();\n const year = date.getFullYear();\n const hours = date.getHours().toString().padStart(2, \"0\");\n const minutes = date.getMinutes().toString().padStart(2, \"0\");\n return `${month} ${day}, ${year} ${hours}:${minutes}`;\n}\n\n// ---------------------------------------------------------------------------\n// Countdown hook\n// ---------------------------------------------------------------------------\n\nfunction useCountdown(targetIso: string | undefined): string | null {\n const [now, setNow] = useState(0);\n\n useEffect(() => {\n if (!targetIso) return;\n setNow(Date.now());\n const id = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(id);\n }, [targetIso]);\n\n if (!targetIso || now === 0) return null;\n const target = new Date(targetIso).getTime();\n if (isNaN(target)) return null;\n\n const diff = target - now;\n if (diff <= 0) return null;\n\n const days = Math.floor(diff / 86400000);\n const hours = Math.floor((diff % 86400000) / 3600000);\n const mins = Math.floor((diff % 3600000) / 60000);\n const secs = Math.floor((diff % 60000) / 1000);\n\n const parts: string[] = [];\n if (days > 0) parts.push(`${days}d`);\n parts.push(`${String(hours).padStart(2, \"0\")}h`);\n parts.push(`${String(mins).padStart(2, \"0\")}m`);\n parts.push(`${String(secs).padStart(2, \"0\")}s`);\n return parts.join(\" \");\n}\n\nfunction formatCountdownDate(iso: string | undefined): string | null {\n if (!iso) return null;\n const d = new Date(iso);\n if (isNaN(d.getTime())) return null;\n const hours = d.getHours().toString().padStart(2, \"0\");\n const mins = d.getMinutes().toString().padStart(2, \"0\");\n const month = (d.getMonth() + 1).toString().padStart(2, \"0\");\n const day = d.getDate().toString().padStart(2, \"0\");\n const year = d.getFullYear();\n const offset = -d.getTimezoneOffset();\n const sign = offset >= 0 ? \"+\" : \"-\";\n const tzHours = String(Math.abs(Math.floor(offset / 60))).padStart(2, \"0\");\n return `${hours}:${mins} ${month}/${day}/${year} (${sign}${tzHours})`;\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface EventDetailUIProps {\n event: PredictEvent;\n /** Callback when a trade action is triggered */\n onTradeAction?: (\n market: PredictMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EventDetailUI({ event, onTradeAction }: EventDetailUIProps) {\n const { t } = useTranslation();\n const { ref: collapseRef, isCollapsed } = useScrollCollapse();\n\n const markets = useMemo(() => {\n const all = [...(event.markets || [])];\n const open = all\n .filter((m) => m.status === \"open\")\n .sort((a, b) => getYesAsk(b) - getYesAsk(a));\n const rest = all\n .filter((m) => m.status !== \"open\")\n .sort((a, b) => getYesAsk(b) - getYesAsk(a));\n return [...open, ...rest];\n }, [event.markets]);\n\n const isEnded = event.status === \"closed\" || event.status === \"voided\";\n const startCountdown = useCountdown(isEnded ? undefined : event.start_at);\n const endCountdown = useCountdown(isEnded ? undefined : event.end_at);\n const startDateFormatted = formatCountdownDate(event.start_at);\n const endDateFormatted = formatCountdownDate(event.end_at);\n\n return (\n <div className=\"w-full flex flex-col gap-y-4 lg:gap-y-6\">\n {/* Header – sticky with compact transition */}\n <div\n ref={collapseRef}\n className={`sticky top-0 z-30 flex items-center backdrop-blur-md transition-all duration-300 ${\n isCollapsed\n ? \"h-14 lg:h-16 gap-x-2 py-2 px-1 lg:px-4 -mx-1 lg:-mx-4 shadow-sm\"\n : \"h-16 lg:h-20 gap-x-2 lg:gap-x-4\"\n }`}\n >\n <Avatar\n src={event.image_url || undefined}\n name={event.title || \"Event\"}\n radius=\"lg\"\n classNames={{ base: \"bg-transparent\" }}\n className={`flex-shrink-0 transition-all duration-300 ${\n isCollapsed\n ? \"!h-10 !w-10 lg:!h-12 lg:!w-12\"\n : \"!h-16 !w-16 lg:!h-20 lg:!w-20\"\n }`}\n />\n <div className=\"flex flex-col gap-0.5 min-w-0 flex-1\">\n {!isCollapsed && (\n <div className=\"flex items-center gap-1.5\">\n {event.tags?.slice(0, 3).map((tag, i) => (\n <Fragment key={tag.slug}>\n {i > 0 && <span className=\"text-sm text-neutral/50\">·</span>}\n <span className=\"text-sm text-neutral truncate\">\n {tag.label}\n </span>\n </Fragment>\n ))}\n <SourceIcon source={event.source} />\n </div>\n )}\n <span\n className={`font-semibold truncate transition-all duration-300 ${\n isCollapsed ? \"text-sm lg:text-base\" : \"text-lg lg:text-xl\"\n }`}\n >\n {event.title}\n </span>\n </div>\n </div>\n\n {/* Countdown / ended timestamp */}\n {(startCountdown || endCountdown || isEnded) && (\n <div className=\"flex items-center gap-x-2 text-xs lg:text-sm font-mono\">\n {isEnded ? (\n endDateFormatted && (\n <span className=\"text-neutral\">\n {t(\"predict.event.endedAt\", { time: endDateFormatted })}\n </span>\n )\n ) : startCountdown ? (\n <>\n <span className=\"text-foreground\">\n {t(\"predict.event.beginsIn\", { time: startCountdown })}\n </span>\n {startDateFormatted && (\n <>\n <span className=\"text-neutral/50\">·</span>\n <span className=\"text-neutral\">{startDateFormatted}</span>\n </>\n )}\n </>\n ) : endCountdown ? (\n <>\n <span className=\"text-foreground\">\n {t(\"predict.event.endsIn\", { time: endCountdown })}\n </span>\n {endDateFormatted && (\n <>\n <span className=\"text-neutral/50\">·</span>\n <span className=\"text-neutral\">{endDateFormatted}</span>\n </>\n )}\n </>\n ) : null}\n </div>\n )}\n\n {/* Chart section — volume displayed in chart footer bar */}\n <EventPriceChart event={event} volume={event.volume ?? undefined} />\n\n {/* Markets list */}\n <EventMarketsUI markets={markets} onTradeAction={onTradeAction} />\n\n {/* Rules section */}\n <EventRulesUI markets={markets} event={event} />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Markets list (Jupiter-style table layout)\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_VISIBLE_COUNT = 5;\n\ninterface EventMarketsUIProps {\n markets: PredictMarket[];\n onTradeAction?: (\n market: PredictMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\nfunction EventMarketsUI({\n markets: rawMarkets,\n onTradeAction,\n}: EventMarketsUIProps) {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n const [showAll, setShowAll] = useState(false);\n const [expandedSlug, setExpandedSlug] = useState<string | null>(null);\n\n const markets = useMemo(() => {\n const seen = new Set<string>();\n return rawMarkets.filter((m) => {\n if (seen.has(m.slug)) return false;\n seen.add(m.slug);\n return true;\n });\n }, [rawMarkets]);\n\n const firstOpenSlug = markets.find((m) => m.status === \"open\")?.slug;\n const [activeKey, setActiveKey] = useState<string | null>(\n firstOpenSlug ? `${firstOpenSlug}:yes` : null,\n );\n\n if (markets.length === 0) return null;\n\n const hasMore = markets.length > DEFAULT_VISIBLE_COUNT;\n const visibleMarkets = showAll\n ? markets\n : markets.slice(0, DEFAULT_VISIBLE_COUNT);\n\n const toggleExpand = (slug: string) => {\n setExpandedSlug((prev) => (prev === slug ? null : slug));\n };\n\n const handleTradeAction = (\n market: PredictMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => {\n setActiveKey(`${market.slug}:${outcome}`);\n if (!isMobile) {\n setExpandedSlug(market.slug);\n }\n onTradeAction?.(market, outcome, side);\n };\n\n return (\n <div className=\"flex flex-col\">\n {/* Table */}\n <table className=\"w-full border-collapse\">\n {/* Column header */}\n <thead>\n <tr>\n <th />\n <th className=\"py-2 text-left text-xs text-neutral font-normal lg:text-center lg:text-sm\">\n {t(\"predict.market.table.chance\")}\n </th>\n <th />\n </tr>\n </thead>\n <tbody>\n {visibleMarkets.map((market, idx) => {\n const yesPrice = getYesAsk(market);\n const noPrice =\n market.outcomes[1]?.best_ask ?? market.outcomes[1]?.price;\n const isExpanded = expandedSlug === market.slug;\n\n return (\n <MarketRow\n key={market.id ?? `${idx}-${market.slug}`}\n market={market}\n yesPrice={yesPrice}\n noPrice={noPrice ?? undefined}\n activeYes={activeKey === `${market.slug}:yes`}\n activeNo={activeKey === `${market.slug}:no`}\n isExpanded={isExpanded}\n onToggleExpand={() => toggleExpand(market.slug)}\n onTradeAction={handleTradeAction}\n />\n );\n })}\n </tbody>\n </table>\n\n {/* More Markets button */}\n {hasMore && (\n <button\n type=\"button\"\n onClick={() => setShowAll((prev) => !prev)}\n className=\"flex w-full items-center justify-start gap-x-2 py-2 pl-1 text-xs text-neutral lg:pl-2 lg:text-sm cursor-pointer hover:text-foreground transition-colors\"\n >\n <span>\n {showAll\n ? t(\"predict.event.rules.collapse\")\n : t(\"predict.event.moreMarketsLabel\")}\n </span>\n <ChevronDownIcon\n className={cn(\n \"h-4 w-4 transition-transform\",\n showAll && \"rotate-180\",\n )}\n />\n </button>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Market Row (Jupiter-style <tr>)\n// ---------------------------------------------------------------------------\n\ninterface MarketRowProps {\n market: PredictMarket;\n yesPrice: number;\n noPrice?: number;\n activeYes: boolean;\n activeNo: boolean;\n isExpanded: boolean;\n onToggleExpand: () => void;\n onTradeAction?: (\n market: PredictMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\nfunction MarketRow({\n market,\n yesPrice,\n noPrice,\n activeYes,\n activeNo,\n isExpanded,\n onToggleExpand,\n onTradeAction,\n}: MarketRowProps) {\n const { t } = useTranslation();\n const isOpen = market.status === \"open\";\n const volumeFormatted = market.volume\n ? `$${Math.round(market.volume).toLocaleString(\"en-US\")} vol`\n : undefined;\n\n return (\n <>\n <tr\n className=\"cursor-pointer border-b border-border text-xs hover:bg-content2 lg:text-base\"\n onClick={onToggleExpand}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onToggleExpand();\n }\n }}\n >\n {/* TD1: Avatar + Name + Volume */}\n <td className=\"py-2 pl-1 lg:pl-2\">\n <div className=\"flex items-center gap-x-1 lg:gap-x-2\">\n {market.image_url && (\n <Avatar\n src={market.image_url}\n name={getMarketLabel(market)?.[0] || \"?\"}\n radius=\"lg\"\n className=\"size-5 shrink-0 lg:size-8\"\n imgProps={{ className: \"object-cover\" }}\n />\n )}\n <div className=\"flex flex-col\">\n <span className=\"text-foreground truncate max-w-[200px] lg:max-w-[300px]\">\n {getMarketLabel(market)}\n </span>\n {volumeFormatted && (\n <span className=\"text-[8px] text-neutral lg:text-xxs\">\n {volumeFormatted}\n </span>\n )}\n </div>\n </div>\n </td>\n\n {/* TD2: Chance % */}\n <td className=\"py-2 text-left text-foreground lg:text-center\">\n {formatPercent(yesPrice)}\n </td>\n\n {/* TD3: Yes / No buttons or status badge */}\n <td className=\"py-2 pr-1 lg:pr-2\">\n {isOpen ? (\n <div className=\"flex items-center justify-end gap-x-2\">\n <button\n type=\"button\"\n className={cn(\n \"flex min-w-16 items-center justify-center whitespace-nowrap rounded-lg p-2 lg:min-w-24 cursor-pointer hover:opacity-80 transition-all focus-visible:outline-2 focus-visible:outline-primary/40 focus-visible:outline-offset-2\",\n activeYes\n ? \"bg-primary text-primary-foreground\"\n : \"bg-primary/10 text-primary\",\n )}\n onClick={(e) => {\n e.stopPropagation();\n onTradeAction?.(market, \"yes\", \"buy\");\n }}\n >\n {t(\"predict.market.action.yes\", {\n price: formatCents(yesPrice),\n })}\n </button>\n <button\n type=\"button\"\n className={cn(\n \"flex min-w-16 items-center justify-center whitespace-nowrap rounded-lg p-2 lg:min-w-24 cursor-pointer hover:opacity-80 transition-all focus-visible:outline-2 focus-visible:outline-primary/40 focus-visible:outline-offset-2\",\n activeNo\n ? \"bg-secondary text-secondary-foreground\"\n : \"bg-secondary/10 text-secondary\",\n )}\n onClick={(e) => {\n e.stopPropagation();\n onTradeAction?.(market, \"no\", \"buy\");\n }}\n >\n {noPrice != null\n ? t(\"predict.market.action.no\", {\n price: formatCents(noPrice),\n })\n : t(\"predict.market.no\")}\n </button>\n </div>\n ) : (\n <div className=\"flex items-center justify-end\">\n <span\n className={cn(\n \"inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium\",\n market.status === \"closed\"\n ? \"bg-neutral/10 text-neutral\"\n : market.status === \"voided\"\n ? \"bg-warning/10 text-warning\"\n : \"bg-primary/10 text-primary\",\n )}\n >\n {market.status === \"closed\"\n ? t(\"predict.event.status.closed\")\n : market.status === \"voided\"\n ? t(\"predict.event.status.voided\")\n : t(\"predict.event.status.pending\")}\n </span>\n </div>\n )}\n </td>\n </tr>\n\n {/* Expanded detail row */}\n {isExpanded && (\n <tr>\n <td colSpan={3} className=\"pb-3\">\n <div className=\"max-h-100 overflow-y-auto\">\n <EventMarketDetailWidget\n market={market}\n outcome={activeNo ? \"no\" : \"yes\"}\n onTradeAction={onTradeAction}\n />\n </div>\n </td>\n </tr>\n )}\n </>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Rules\n// ---------------------------------------------------------------------------\n\ninterface EventRulesUIProps {\n markets: PredictMarket[];\n event: PredictEvent;\n}\n\nfunction EventRulesUI({ markets, event }: EventRulesUIProps) {\n const { t } = useTranslation();\n const [showFullRules, setShowFullRules] = useState(false);\n const [showTimeline, setShowTimeline] = useState(false);\n const [selectedIdx, setSelectedIdx] = useState(0);\n\n const marketsWithContent = markets.filter(\n (m) => (m.rules && m.rules.length > 0) || m.description,\n );\n if (marketsWithContent.length === 0) return null;\n\n const selectedMarket =\n marketsWithContent[selectedIdx] ?? marketsWithContent[0];\n const rulesText =\n selectedMarket.rules && selectedMarket.rules.length > 0\n ? selectedMarket.rules.join(\"\\n\\n\")\n : (selectedMarket.description ?? \"\");\n if (!rulesText) return null;\n const truncatedRules =\n rulesText.length > 200 && !showFullRules\n ? rulesText.slice(0, 200) + \"...\"\n : rulesText;\n\n return (\n <div className=\"flex flex-col gap-y-3\">\n {/* Header: title + market selector */}\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-semibold text-foreground lg:text-base\">\n {t(\"predict.event.rules\")}\n </span>\n\n {marketsWithContent.length > 1 && (\n <Dropdown\n placement=\"bottom-end\"\n classNames={{\n content: \"min-w-36 bg-content1 border border-border\",\n }}\n >\n <DropdownTrigger>\n <Button\n size=\"sm\"\n variant=\"bordered\"\n radius=\"lg\"\n endContent={<ChevronDownIcon className=\"h-3.5 w-3.5\" />}\n className=\"text-xs text-foreground\"\n >\n {getMarketLabel(selectedMarket)}\n </Button>\n </DropdownTrigger>\n <DropdownMenu\n aria-label=\"Select market rules\"\n selectionMode=\"single\"\n selectedKeys={[String(selectedIdx)]}\n onAction={(key: Key) => {\n setSelectedIdx(Number(key));\n setShowFullRules(false);\n }}\n classNames={{ list: \"gap-1\" }}\n itemClasses={{ base: \"rounded-md px-3 h-8\" }}\n >\n {marketsWithContent.map((m, idx) => (\n <DropdownItem\n key={String(idx)}\n className={cn(\n idx === selectedIdx\n ? \"bg-content2 text-foreground\"\n : \"text-neutral\",\n \"data-[hover=true]:bg-content2 data-[hover=true]:text-foreground\",\n )}\n >\n {getMarketLabel(m)}\n </DropdownItem>\n ))}\n </DropdownMenu>\n </Dropdown>\n )}\n </div>\n\n {/* Rules text */}\n <div className=\"text-xs text-foreground/80 lg:text-sm whitespace-pre-wrap\">\n {truncatedRules}\n </div>\n\n {rulesText.length > 200 && (\n <button\n type=\"button\"\n onClick={() => setShowFullRules((v) => !v)}\n className=\"text-xs text-neutral hover:text-foreground cursor-pointer transition-colors self-start\"\n >\n {showFullRules\n ? t(\"predict.event.rules.collapse\")\n : t(\"predict.event.showMore\")}\n </button>\n )}\n\n {/* Timeline and payout — collapsible */}\n <button\n type=\"button\"\n onClick={() => setShowTimeline((v) => !v)}\n className=\"flex items-center justify-between w-full mt-2 text-xs font-medium text-neutral lg:text-sm cursor-pointer hover:text-foreground transition-colors\"\n >\n <span>{t(\"predict.event.timelineAndPayout\")}</span>\n <ChevronDownIcon\n className={cn(\n \"h-4 w-4 transition-transform\",\n showTimeline && \"rotate-180\",\n )}\n />\n </button>\n\n {showTimeline && (\n <>\n <div className=\"flex flex-col\">\n {(() => {\n const status = selectedMarket.status;\n const items: {\n label: string;\n value: string | null;\n isActive: boolean;\n }[] = [];\n\n if (selectedMarket.created_at) {\n items.push({\n label: t(\"predict.event.timeline.created\"),\n value: formatISOTimestamp(selectedMarket.created_at),\n isActive: true,\n });\n }\n\n items.push({\n label: t(\"predict.event.timeline.open\"),\n value: formatISOTimestamp(selectedMarket.start_at),\n isActive: status !== \"pending\",\n });\n\n if (status === \"voided\") {\n items.push({\n label: t(\"predict.event.timeline.voided\"),\n value: formatISOTimestamp(\n selectedMarket.closed_at ?? selectedMarket.end_at,\n ),\n isActive: true,\n });\n } else if (status === \"closed\") {\n items.push({\n label: t(\"predict.event.timeline.closed\"),\n value: formatISOTimestamp(\n selectedMarket.closed_at ?? selectedMarket.end_at,\n ),\n isActive: true,\n });\n } else {\n items.push({\n label: t(\"predict.event.timeline.close\"),\n value: formatISOTimestamp(selectedMarket.end_at),\n isActive: false,\n });\n }\n\n return items;\n })().map((item, index, arr) => (\n <div key={item.label} className=\"flex items-stretch gap-x-3\">\n <div className=\"flex flex-col items-center w-3\">\n <div\n className={`h-3 w-3 shrink-0 rounded-full border-2 mt-0.5 ${\n item.isActive\n ? \"border-primary bg-primary\"\n : \"border-border bg-transparent\"\n }`}\n />\n {index < arr.length - 1 && (\n <div className=\"w-px flex-1 bg-border\" />\n )}\n </div>\n <div\n className={`flex flex-col ${index < arr.length - 1 ? \"pb-4\" : \"\"}`}\n >\n <span className=\"text-xs font-medium text-foreground lg:text-sm\">\n {item.label}\n </span>\n <span className=\"text-xs text-neutral lg:text-sm\">\n {item.value}\n </span>\n </div>\n </div>\n ))}\n </div>\n\n {/* Identifiers */}\n <div className=\"flex flex-wrap items-center gap-x-3 text-xxs text-neutral mt-2 lg:text-xs\">\n <span>\n <span className=\"text-neutral\">\n {t(\"predict.event.id.event\")}:\n </span>{\" \"}\n <span className=\"text-foreground\">{event.slug}</span>\n </span>\n <span>\n <span className=\"text-neutral\">\n {t(\"predict.event.id.market\")}:\n </span>{\" \"}\n <span className=\"text-foreground\">{selectedMarket.slug}</span>\n </span>\n <span>\n <span className=\"text-neutral\">\n {t(\"predict.event.id.source\")}:\n </span>{\" \"}\n <span className=\"text-foreground\">\n {getPlatformLabel(selectedMarket.source)}\n </span>\n </span>\n </div>\n </>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Source (platform) icon\n// ---------------------------------------------------------------------------\n\nfunction SourceIcon({ source }: { source: string }) {\n const title = source === \"polymarket\" ? \"Polymarket\" : \"Kalshi\";\n return (\n <span\n className=\"inline-flex items-center gap-x-1 text-neutral-400\"\n title={title}\n >\n <span className=\"text-neutral-600\">·</span>\n {source === \"polymarket\" ? (\n <PolymarketIcon className=\"h-5 w-auto shrink-0\" />\n ) : (\n <KalshiIcon className=\"h-3 w-auto shrink-0\" />\n )}\n </span>\n );\n}\n","import type { PredictMarket, ProviderSource } from \"@liberfi.io/react-predict\";\nimport { useEvent } from \"@liberfi.io/react-predict\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport { EventDetailSkeleton } from \"./event-detail-skeleton\";\nimport { EventDetailUI } from \"./event-detail.ui\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface EventDetailWidgetProps {\n /** Event slug (canonical business key). */\n eventSlug: string;\n /** Upstream provider (`\"kalshi\"` or `\"polymarket\"`). Required by prediction-server. */\n source?: ProviderSource;\n /** Callback when a trade action is triggered (market button / orderbook click). */\n onTradeAction?: (\n market: PredictMarket,\n outcome: TradeOutcome,\n side: TradeSide,\n ) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EventDetailWidget({\n eventSlug,\n source,\n onTradeAction,\n}: EventDetailWidgetProps) {\n const {\n data: event,\n isLoading: isEventLoading,\n error: eventError,\n } = useEvent({ slug: eventSlug, source });\n\n if (isEventLoading) {\n return <EventDetailSkeleton />;\n }\n\n if (eventError || !event) {\n return (\n <div className=\"flex w-full items-center justify-center py-20 text-danger\">\n {eventError?.message || \"Event not found\"}\n </div>\n );\n }\n\n return <EventDetailUI event={event} onTradeAction={onTradeAction} />;\n}\n","import type { ReactNode } from \"react\";\nimport type { ProviderSource } from \"@liberfi.io/react-predict\";\nimport { KalshiIcon, PolymarketIcon, cn } from \"@liberfi.io/ui\";\n\ninterface SourceMeta {\n label: string;\n color: string;\n bgColor: string;\n icon: ReactNode;\n}\n\nconst SOURCE_META: Record<string, SourceMeta> = {\n kalshi: {\n label: \"KALSHI\",\n color: \"#00d492\",\n bgColor: \"rgba(0, 212, 146, 0.12)\",\n icon: <KalshiIcon className=\"w-3.5 h-3.5 shrink-0\" />,\n },\n polymarket: {\n label: \"POLYMARKET\",\n color: \"#50a2ff\",\n bgColor: \"rgba(43, 127, 255, 0.12)\",\n icon: <PolymarketIcon className=\"w-3.5 h-3.5 shrink-0\" />,\n },\n dflow: {\n label: \"DFLOW\",\n color: \"rgb(16, 185, 129)\",\n bgColor: \"rgba(16, 185, 129, 0.12)\",\n icon: null,\n },\n};\n\nconst DEFAULT_META: SourceMeta = {\n label: \"Unknown\",\n color: \"rgb(156, 163, 175)\",\n bgColor: \"rgba(156, 163, 175, 0.12)\",\n icon: null,\n};\n\nexport function getSourceMeta(source: ProviderSource | string): SourceMeta {\n return SOURCE_META[source] ?? DEFAULT_META;\n}\n\nexport interface SourceBadgeProps {\n source: ProviderSource | string;\n className?: string;\n}\n\nexport function SourceBadge({ source, className }: SourceBadgeProps) {\n const meta = getSourceMeta(source);\n return (\n <span\n className={cn(\n \"inline-flex items-center gap-x-1 rounded-md px-1.5 py-0.5 text-xs font-medium\",\n className,\n )}\n style={{ backgroundColor: meta.bgColor, color: meta.color }}\n >\n {meta.icon}\n {meta.label}\n </span>\n );\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent, ProviderSource } from \"@liberfi.io/react-predict\";\nimport { useSimilarEvents } from \"@liberfi.io/react-predict\";\nimport { Avatar, ChevronRightIcon } from \"@liberfi.io/ui\";\nimport { getSourceMeta } from \"../matches/source-badge.ui\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst REST_BORDER = \"rgba(39,39,42,0.6)\";\nconst HOVER_BORDER = \"rgba(63,63,70,0.8)\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction formatVolume(vol: number | null | undefined): string {\n if (vol == null) return \"-\";\n if (vol >= 1_000_000) return `$${(vol / 1_000_000).toFixed(1)}M`;\n if (vol >= 1_000) return `$${Math.round(vol / 1_000)}K`;\n return `$${vol.toFixed(0)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface SimilarEventsSectionProps {\n eventSlug: string;\n source: ProviderSource;\n /** Number of similar events to fetch (default: 4). */\n limit?: number;\n onEventClick?: (event: PredictEvent) => void;\n /** Called when a card is hovered (for data prefetching). */\n onEventHover?: (event: PredictEvent) => void;\n}\n\nexport interface SimilarEventCardProps {\n event: PredictEvent;\n onClick?: (event: PredictEvent) => void;\n /** Called when the card is hovered (for data prefetching). */\n onHover?: (event: PredictEvent) => void;\n}\n\n// ---------------------------------------------------------------------------\n// SimilarEventsSection\n// ---------------------------------------------------------------------------\n\nexport function SimilarEventsSection({\n eventSlug,\n source,\n limit = 4,\n onEventClick,\n onEventHover,\n}: SimilarEventsSectionProps) {\n const { t } = useTranslation();\n const { data: similarEvents, isLoading } = useSimilarEvents({\n slug: eventSlug,\n source,\n limit,\n });\n\n if (isLoading || !similarEvents || similarEvents.length === 0) return null;\n\n return (\n <div className=\"flex flex-col gap-y-3 mt-6 px-1 lg:px-0\">\n <span style={{ color: \"#f4f4f5\", fontSize: 14, fontWeight: 600 }}>\n {t(\"predict.similar.title\")}\n </span>\n <div className=\"grid grid-cols-1 gap-2\">\n {similarEvents.map((ev) => (\n <SimilarEventCard\n key={`${ev.source}-${ev.slug}`}\n event={ev}\n onClick={onEventClick}\n onHover={onEventHover}\n />\n ))}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// SimilarEventCard — border-highlight hover, layout mirrors search results\n// ---------------------------------------------------------------------------\n\nexport function SimilarEventCard({\n event,\n onClick,\n onHover,\n}: SimilarEventCardProps) {\n const { t } = useTranslation();\n const sourceMeta = getSourceMeta(event.source);\n const formattedVolume = useMemo(\n () => formatVolume(event.volume),\n [event.volume],\n );\n const firstTag = event.tags?.[0];\n\n return (\n <button\n type=\"button\"\n onClick={() => onClick?.(event)}\n onMouseEnter={(e) => {\n e.currentTarget.style.borderColor = HOVER_BORDER;\n onHover?.(event);\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.borderColor = REST_BORDER;\n }}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 10,\n padding: \"10px 12px\",\n borderRadius: 14,\n border: `1px solid ${REST_BORDER}`,\n background: \"rgba(24,24,27,0.4)\",\n cursor: \"pointer\",\n textAlign: \"left\",\n width: \"100%\",\n transition: \"border-color 0.2s\",\n }}\n className=\"group\"\n >\n {/* Avatar */}\n <Avatar\n src={event.image_url || undefined}\n name={event.title?.[0] || \"?\"}\n radius=\"full\"\n className=\"size-9 shrink-0 bg-transparent\"\n imgProps={{ className: \"object-cover\" }}\n />\n\n {/* Title + meta row */}\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n minWidth: 0,\n flex: 1,\n gap: 2,\n }}\n >\n <span\n style={{\n fontSize: 13,\n fontWeight: 500,\n color: \"#f4f4f5\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {event.title}\n </span>\n\n {/* Meta: source + volume + tag */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n fontSize: 10,\n color: \"#71717a\",\n }}\n >\n {/* Source icon + label */}\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 3,\n color: sourceMeta.color,\n flexShrink: 0,\n }}\n >\n {sourceMeta.icon}\n <span\n style={{\n fontSize: 10,\n fontWeight: 600,\n letterSpacing: \"0.04em\",\n textTransform: \"uppercase\" as const,\n }}\n >\n {sourceMeta.label}\n </span>\n </span>\n\n <span style={{ color: \"#52525b\" }}>·</span>\n\n {/* Volume */}\n <span style={{ color: \"#a1a1aa\" }}>\n {formattedVolume} {t(\"predict.event.volume\")}\n </span>\n\n {/* Tag */}\n {firstTag && (\n <>\n <span style={{ color: \"#52525b\" }}>·</span>\n <span style={{ color: \"#71717a\" }}>{firstTag.label}</span>\n </>\n )}\n </div>\n </div>\n\n {/* Hover arrow */}\n <ChevronRightIcon\n width={14}\n height={14}\n className=\"shrink-0 opacity-0 group-hover:opacity-100 transition-opacity\"\n style={{ color: \"#71717a\" }}\n />\n </button>\n );\n}\n","import { useMemo, useState, useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type {\n PredictEvent,\n PredictMarket,\n ProviderSource,\n} from \"@liberfi.io/react-predict\";\nimport { useEvent } from \"@liberfi.io/react-predict\";\nimport { Button, ChevronLeftIcon, useScreen } from \"@liberfi.io/ui\";\nimport { useAsyncModal } from \"@liberfi.io/ui-scaffold\";\nimport {\n PredictTradeModal,\n PREDICT_TRADE_MODAL_ID,\n type PredictTradeModalParams,\n} from \"../trade-form/trade-form.modal\";\nimport type { TradeOutcome, TradeSide } from \"../trade-form/trade-form.script\";\nimport { TradeFormWidget } from \"../trade-form/trade-form.widget\";\nimport { UserActivitySection } from \"./event-detail-activity.ui\";\nimport {\n EventDetailSkeleton,\n TradeFormSkeleton,\n} from \"./event-detail-skeleton\";\nimport { EventDetailWidget } from \"./event-detail.widget\";\nimport { SimilarEventsSection } from \"./event-similar-events.ui\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getYesAsk(m: PredictMarket): number {\n return m.outcomes[0]?.best_ask ?? m.outcomes[0]?.price ?? 0;\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface EventDetailPageProps {\n /** Event slug (canonical business key). */\n eventSlug: string;\n /** Upstream provider (`\"kalshi\"` or `\"polymarket\"`). Required by prediction-server. */\n source?: ProviderSource;\n /** Chain network for trading (default: 'solana'). */\n chain?: string;\n /** Connected wallet address for user activity (positions/orders/trades). */\n walletAddress?: string;\n /** Callback when a similar event card is clicked. Receives the clicked event. */\n onSimilarEventClick?: (event: PredictEvent) => void;\n /** Called when a similar event card is hovered (for data prefetching). */\n onSimilarEventHover?: (event: PredictEvent) => void;\n /** Navigation callback — if provided, a \"Back\" button is shown at the top. */\n onBack?: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function EventDetailPage({\n eventSlug,\n source,\n chain,\n walletAddress,\n onSimilarEventClick,\n onSimilarEventHover,\n onBack,\n}: EventDetailPageProps) {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n\n const { onOpen: openTradeModal } = useAsyncModal<PredictTradeModalParams>(\n PREDICT_TRADE_MODAL_ID,\n );\n\n const { data: event, isLoading: isEventLoading } = useEvent({\n slug: eventSlug,\n source,\n });\n\n const markets = useMemo(\n () =>\n [...(event?.markets || [])].sort((a, b) => getYesAsk(b) - getYesAsk(a)),\n [event?.markets],\n );\n\n const [tradeSelection, setTradeSelection] = useState<{\n market: PredictMarket;\n outcome: TradeOutcome;\n side: TradeSide;\n version: number;\n } | null>(null);\n\n const handleTradeAction = useCallback(\n (market: PredictMarket, outcome: TradeOutcome, side: TradeSide) => {\n setTradeSelection((prev) => ({\n market,\n outcome,\n side,\n version: (prev?.version ?? 0) + 1,\n }));\n if (isMobile && event) {\n openTradeModal({\n params: { event, market, initialOutcome: outcome, chain },\n });\n }\n },\n [isMobile, event, chain, openTradeModal],\n );\n\n const selectedMarket = tradeSelection?.market ?? markets[0];\n\n // -----------------------------------------------------------------------\n // Loading skeleton\n // -----------------------------------------------------------------------\n if (isEventLoading) {\n const hasBack = !!onBack;\n if (isMobile) {\n return <EventDetailSkeleton showBack={hasBack} />;\n }\n return (\n <div className=\"flex w-full max-w-6xl mx-auto gap-x-4 lg:gap-x-6\">\n <div className=\"min-w-0 flex-1 max-w-3xl\">\n <EventDetailSkeleton showBack={hasBack} />\n </div>\n <aside className=\"hidden lg:block w-[340px] xl:w-[380px] shrink-0\">\n <div className=\"sticky top-4 max-h-[calc(100dvh-2rem)] overflow-y-auto scrollbar-thin\">\n <TradeFormSkeleton />\n </div>\n </aside>\n </div>\n );\n }\n\n const tradeFormKey = tradeSelection\n ? `${tradeSelection.market.slug}-${tradeSelection.version}`\n : (selectedMarket?.slug ?? \"default\");\n\n return (\n <div className=\"flex w-full flex-col gap-y-4 pb-12 lg:max-w-7xl lg:gap-y-8 lg:pb-16 mx-auto\">\n <div className=\"flex w-full justify-center gap-4 pt-4 lg:gap-6\">\n <div className=\"flex-auto min-w-0 flex flex-col gap-y-4 px-4 lg:gap-y-6 lg:px-0\">\n {/* back button */}\n {onBack && (\n <div className=\"flex items-center justify-between\">\n <Button\n as=\"a\"\n onPress={onBack}\n startContent={<ChevronLeftIcon className=\"h-4 w-4\" />}\n className=\"text-neutral bg-transparent h-5 min-h-5 gap-x-2 p-0 text-base w-auto min-w-auto\"\n >\n {t(\"common.back\")}\n </Button>\n </div>\n )}\n <EventDetailWidget\n eventSlug={eventSlug}\n source={source}\n onTradeAction={handleTradeAction}\n />\n </div>\n <div className=\"hidden flex-none w-md flex-col gap-y-4 lg:sticky lg:top-4 lg:flex lg:self-start\">\n {selectedMarket && (\n <TradeFormWidget\n key={tradeFormKey}\n event={event}\n market={selectedMarket}\n initialSide={tradeSelection?.side}\n initialOutcome={tradeSelection?.outcome}\n chain={chain}\n />\n )}\n\n {event && (\n <SimilarEventsSection\n eventSlug={eventSlug}\n source={event.source}\n onEventClick={onSimilarEventClick}\n onEventHover={onSimilarEventHover}\n />\n )}\n </div>\n </div>\n {event && (\n <div className=\"flex w-full flex-col\">\n <UserActivitySection event={event} walletAddress={walletAddress} />\n </div>\n )}\n\n <PredictTradeModal />\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport {\n candlesticksQueryKey,\n ChartRange,\n type Candlestick,\n type ChartRangeType,\n type ListCandlesticksParams,\n type PredictEvent,\n type PredictMarket,\n type ProviderSource,\n useEvent,\n usePredictClient,\n} from \"@liberfi.io/react-predict\";\nimport { DEFAULT_CHART_RANGE, MAX_PRICE_HISTORY_MARKETS } from \"../../consts\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getYesAsk(m: PredictMarket): number {\n return m.outcomes[0]?.best_ask ?? m.outcomes[0]?.price ?? 0;\n}\n\nfunction listCandlesticksParamsForRange(\n chartRange: ChartRangeType,\n): ListCandlesticksParams {\n switch (chartRange) {\n case ChartRange.ONE_DAY:\n return { interval: \"15m\", limit: 96 };\n case ChartRange.ONE_WEEK:\n return { interval: \"1h\", limit: 168 };\n case ChartRange.ONE_MONTH:\n return { interval: \"4h\", limit: 180 };\n case ChartRange.ALL:\n return { interval: \"1d\", limit: 300 };\n default:\n return { interval: \"1h\", limit: 100 };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport interface UseEventDetailParams {\n /** Event slug (canonical business key). */\n eventSlug: string;\n /** Upstream provider (`\"kalshi\"` or `\"polymarket\"`). Required by prediction-server. */\n source?: ProviderSource;\n /** Market slugs to query candlesticks for. Default: top 4 by yesAsk. */\n candlestickMarketSlugs?: string[];\n /** Chart time range (1d / 1w / 1m / all). */\n chartRange?: ChartRangeType;\n}\n\nexport const useEventDetail = (params: UseEventDetailParams) => {\n const {\n candlestickMarketSlugs,\n chartRange = DEFAULT_CHART_RANGE,\n source,\n } = params;\n\n const client = usePredictClient();\n const candlestickParams = useMemo(\n () => listCandlesticksParamsForRange(chartRange),\n [chartRange],\n );\n\n const {\n data: event,\n isLoading: isEventLoading,\n error: eventError,\n } = useEvent({ slug: params.eventSlug, source });\n\n const marketsToQuery = useMemo(() => {\n if (!event?.markets) return [];\n\n // Deduplicate markets by slug (backend may return duplicates)\n const seen = new Set<string>();\n const dedupedMarkets = event.markets.filter((m) => {\n if (seen.has(m.slug)) return false;\n seen.add(m.slug);\n return true;\n });\n\n const markets =\n candlestickMarketSlugs && candlestickMarketSlugs.length > 0\n ? candlestickMarketSlugs\n .slice(0, MAX_PRICE_HISTORY_MARKETS)\n .map((slug) =>\n dedupedMarkets.find((m: PredictMarket) => m.slug === slug),\n )\n .filter((m): m is PredictMarket => m !== undefined)\n : [...dedupedMarkets]\n .sort((a, b) => getYesAsk(b) - getYesAsk(a))\n .slice(0, MAX_PRICE_HISTORY_MARKETS);\n\n return markets.map((m) => m.slug);\n }, [candlestickMarketSlugs, event?.markets]);\n\n const candlestickQueries = useQueries({\n queries: marketsToQuery.map((slug) => ({\n queryKey: candlesticksQueryKey(slug, candlestickParams),\n queryFn: () => client.listCandlesticks(slug, candlestickParams),\n enabled: marketsToQuery.length > 0,\n })),\n });\n\n const isCandlesticksLoading = candlestickQueries.some((q) => q.isLoading);\n\n const candlestickErrors = useMemo(() => {\n const errors = new Map<string, Error>();\n marketsToQuery.forEach((slug, index) => {\n const error = candlestickQueries[index]?.error;\n if (error) errors.set(slug, error);\n });\n return errors;\n }, [marketsToQuery, candlestickQueries]);\n\n const candlesticks = useMemo(() => {\n const map = new Map<string, Candlestick[]>();\n marketsToQuery.forEach((slug, index) => {\n const data = candlestickQueries[index]?.data;\n if (data) map.set(slug, data);\n });\n return map;\n }, [marketsToQuery, candlestickQueries]);\n\n return {\n event,\n isEventLoading,\n eventError,\n candlestickParams,\n candlesticks,\n isCandlesticksLoading,\n candlestickErrors,\n };\n};\n\nexport type { PredictEvent, PredictMarket };\n","\"use client\";\n\nimport { useCallback } from \"react\";\nimport { useAtom } from \"jotai\";\nimport { atomWithStorage } from \"jotai/utils\";\n\nconst MAX_HISTORY_SIZE = 10;\n\nconst searchHistoriesAtom = atomWithStorage<string[]>(\n \"liberfi:predict_search_histories\",\n [],\n undefined,\n { getOnInit: true },\n);\n\nexport function usePredictSearchHistory() {\n const [histories, setHistories] = useAtom(searchHistoriesAtom);\n\n const addHistory = useCallback(\n (keyword: string) => {\n const trimmed = keyword.trim();\n if (!trimmed) return;\n\n setHistories((prev) => {\n const filtered = prev.filter((h) => h !== trimmed);\n return [trimmed, ...filtered].slice(0, MAX_HISTORY_SIZE);\n });\n },\n [setHistories],\n );\n\n const clearHistories = useCallback(() => {\n setHistories([]);\n }, [setHistories]);\n\n return { histories, addHistory, clearHistories };\n}\n","\"use client\";\n\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { cn, Chip, TrashIcon, Button } from \"@liberfi.io/ui\";\n\nexport type SearchHistoryUIProps = {\n histories: string[];\n onSelect?: (keyword: string) => void;\n onClear?: () => void;\n className?: string;\n};\n\nexport function SearchHistoryUI({\n histories,\n onSelect,\n onClear,\n className,\n}: SearchHistoryUIProps) {\n const { t } = useTranslation();\n\n if (histories.length === 0) return null;\n\n return (\n <div className={cn(\"px-4 pb-4\", className)}>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">\n {t(\"predict.search.history\")}\n </span>\n <Button\n isIconOnly\n size=\"sm\"\n className=\"bg-transparent min-w-6 w-6 h-6 text-neutral\"\n onPress={onClear}\n >\n <TrashIcon width={20} height={20} />\n </Button>\n </div>\n <div className=\"flex flex-wrap gap-2 mt-2\">\n {histories.map((keyword) => (\n <Chip\n key={keyword}\n size=\"sm\"\n variant=\"bordered\"\n className={cn(\n \"text-neutral\",\n \"border-border border-1\",\n \"cursor-pointer\",\n \"hover:opacity-hover\",\n )}\n onClick={() => onSelect?.(keyword)}\n >\n {keyword}\n </Chip>\n ))}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { cn } from \"@liberfi.io/ui\";\nimport { usePredictSearchHistory } from \"./search-history.script\";\nimport { SearchHistoryUI } from \"./search-history.ui\";\n\nexport type SearchHistoryWidgetProps = {\n /** Callback when a history keyword is selected */\n onSelect?: (keyword: string) => void;\n className?: string;\n};\n\nexport function SearchHistoryWidget({\n onSelect,\n className,\n}: SearchHistoryWidgetProps) {\n const { histories, clearHistories } = usePredictSearchHistory();\n\n return (\n <SearchHistoryUI\n className={cn(className)}\n histories={histories}\n onSelect={onSelect}\n onClear={clearHistories}\n />\n );\n}\n","\"use client\";\n\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n Kbd,\n SearchIcon,\n StyledInput,\n XCloseIcon,\n} from \"@liberfi.io/ui\";\n\nexport type SearchInputUIProps = {\n /** Controlled input value */\n value: string;\n /** Called on every keystroke */\n onValueChange: (value: string) => void;\n /** Called when clear button is pressed */\n onClear?: () => void;\n /** Called when Esc button is pressed */\n onEscape?: () => void;\n className?: string;\n};\n\nexport function SearchInputUI({\n value,\n onValueChange,\n onClear,\n onEscape,\n className,\n}: SearchInputUIProps) {\n const { t } = useTranslation();\n\n return (\n <div className={className}>\n <StyledInput\n autoFocus\n variant=\"bordered\"\n radius=\"lg\"\n value={value}\n onValueChange={onValueChange}\n placeholder={t(\"predict.search.placeholder\")}\n classNames={{\n inputWrapper: [\n \"!bg-[rgba(39,39,42,0.6)]\",\n \"!border-[rgba(63,63,70,0.5)]\",\n \"data-[hover=true]:!bg-[rgba(39,39,42,1)]\",\n \"group-data-[focus=true]:!bg-[rgba(39,39,42,1)]\",\n \"group-data-[focus=true]:!border-[rgba(63,63,70,0.8)]\",\n ].join(\" \"),\n }}\n startContent={\n <SearchIcon width={20} height={20} className=\"text-neutral\" />\n }\n endContent={\n value ? (\n <Button\n isIconOnly\n className=\"bg-transparent min-w-6 w-6 h-6 text-neutral\"\n onPress={onClear}\n >\n <XCloseIcon width={20} height={20} />\n </Button>\n ) : (\n <Kbd\n className=\"min-w-8 justify-center text-xs text-neutral bg-transparent border border-[rgba(63,63,70,0.5)] rounded-lg cursor-pointer select-none\"\n onMouseDown={(e: React.MouseEvent) => {\n e.preventDefault();\n onEscape?.();\n }}\n >\n Esc\n </Kbd>\n )\n }\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent } from \"@liberfi.io/react-predict\";\nimport { Avatar, cn, ChevronRightIcon, Linkable } from \"@liberfi.io/ui\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { getSourceMeta } from \"../matches/source-badge.ui\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type SearchResultItemUIProps = {\n event: PredictEvent;\n /** URL for the detail page. When set, the row renders as a link via Linkable. */\n href?: string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n onSelect?: (event: PredictEvent) => void;\n /** Called when the row is hovered (for data prefetching). */\n onHover?: (event: PredictEvent) => void;\n className?: string;\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction formatVolume(vol: number | null | undefined): string {\n if (vol == null) return \"-\";\n if (vol >= 1_000_000) return `$${(vol / 1_000_000).toFixed(1)}M`;\n if (vol >= 1_000) return `$${Math.round(vol / 1_000)}K`;\n return `$${vol.toFixed(0)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function SearchResultItemUI({\n event,\n href,\n LinkComponent,\n onSelect,\n onHover,\n className,\n}: SearchResultItemUIProps) {\n const { t } = useTranslation();\n const firstTag = event.tags?.[0];\n const sourceMeta = getSourceMeta(event.source);\n\n const formattedVolume = useMemo(\n () => formatVolume(event.volume),\n [event.volume],\n );\n\n return (\n <Linkable\n href={href}\n LinkComponent={LinkComponent}\n className={cn(\n \"group w-full h-full px-3 flex items-center gap-3\",\n \"hover:cursor-pointer hover:bg-content2 rounded-lg\",\n \"transition-colors duration-150\",\n className,\n )}\n onClick={(e) => {\n if (href && onSelect) e.preventDefault();\n onSelect?.(event);\n }}\n onMouseEnter={() => onHover?.(event)}\n >\n {/* Avatar */}\n <Avatar\n src={event.image_url || undefined}\n name={event.title || \"Event\"}\n radius=\"full\"\n className=\"h-10 w-10 flex-shrink-0\"\n />\n\n {/* Title + meta */}\n <div className=\"flex-1 min-w-0 flex flex-col justify-center gap-y-0.5\">\n <span className=\"min-w-0 text-sm font-medium line-clamp-2 group-hover:text-primary transition-colors\">\n {event.title}\n </span>\n\n <div className=\"flex items-center gap-x-2 text-[10px] font-normal text-neutral-500 lg:text-xs\">\n {/* Source icon + label */}\n <span\n className=\"inline-flex items-center gap-x-1 shrink-0\"\n style={{ color: sourceMeta.color }}\n >\n {sourceMeta.icon}\n <span\n style={{\n fontSize: 10,\n fontWeight: 600,\n letterSpacing: \"0.04em\",\n textTransform: \"uppercase\",\n }}\n >\n {sourceMeta.label}\n </span>\n </span>\n\n <span className=\"text-neutral-600\">·</span>\n\n {/* Volume */}\n <span className=\"text-neutral-400\">\n {formattedVolume} {t(\"predict.event.volume\")}\n </span>\n\n {/* Tag */}\n {firstTag && (\n <>\n <span className=\"text-neutral-600\">·</span>\n <span className=\"text-neutral-500\">{firstTag.label}</span>\n </>\n )}\n </div>\n </div>\n\n {/* Hover arrow */}\n <ChevronRightIcon\n width={16}\n height={16}\n className=\"shrink-0 text-neutral-500 opacity-0 group-hover:opacity-100 transition-opacity\"\n />\n </Linkable>\n );\n}\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport {\n useSearchEvents,\n type PredictEvent,\n type PredictPage,\n type ProviderSource,\n} from \"@liberfi.io/react-predict\";\n\nexport interface UseSearchResultListScriptParams {\n keyword?: string;\n limit?: number;\n /** Filter by upstream provider. When set, only events from that provider are returned. */\n source?: ProviderSource;\n}\n\nexport function useSearchResultListScript({\n keyword = \"\",\n limit,\n source,\n}: UseSearchResultListScriptParams) {\n const { data, isLoading, isFetchingNextPage, hasNextPage, fetchNextPage } =\n useSearchEvents(\n {\n keyword,\n limit,\n source,\n sort_by: keyword ? undefined : \"volume\",\n sort_asc: keyword ? undefined : false,\n },\n { enabled: true },\n );\n\n const events = useMemo<PredictEvent[]>(\n () =>\n data?.pages\n .flatMap((p: PredictPage<PredictEvent>) => p.items)\n .filter((item): item is PredictEvent => item != null) ?? [],\n [data],\n );\n\n return {\n events,\n isLoading,\n isFetchingNextPage,\n hasNextPage: hasNextPage ?? false,\n fetchNextPage,\n };\n}\n","\"use client\";\n\nimport { ReactElement, useCallback, useMemo, useRef } from \"react\";\nimport { List, type RowComponentProps } from \"react-window\";\nimport { useInfiniteLoader } from \"react-window-infinite-loader\";\nimport { useResizeObserver } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent } from \"@liberfi.io/react-predict\";\nimport { cn, EmptyIcon, Spinner } from \"@liberfi.io/ui\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { SearchResultItemUI } from \"./search-result-item.ui\";\nimport {\n useSearchResultListScript,\n type UseSearchResultListScriptParams,\n} from \"./search-result-list.script\";\n\nconst ROW_HEIGHT = 64;\n\nexport type SearchResultListWidgetProps = {\n onSelect?: (event: PredictEvent) => void;\n /** Generate href for each event row. When set, rows render as links. */\n getEventHref?: (event: PredictEvent) => string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n /** Called when a row is hovered (for data prefetching). */\n onHover?: (event: PredictEvent) => void;\n className?: string;\n} & UseSearchResultListScriptParams;\n\nexport function SearchResultListWidget({\n onSelect,\n getEventHref,\n LinkComponent,\n onHover,\n className,\n ...scriptParams\n}: SearchResultListWidgetProps) {\n const { events, isLoading, isFetchingNextPage, hasNextPage, fetchNextPage } =\n useSearchResultListScript(scriptParams);\n\n const ref = useRef<HTMLDivElement>(null);\n const { height } = useResizeObserver<HTMLDivElement>({ ref });\n\n const isItemLoaded = useCallback(\n (index: number) => index < events.length,\n [events],\n );\n\n const loadMoreItems = useCallback(async () => {\n if (hasNextPage && !isFetchingNextPage) {\n await fetchNextPage();\n }\n }, [hasNextPage, isFetchingNextPage, fetchNextPage]);\n\n const itemCount = useMemo(\n () => (hasNextPage ? events.length + 1 : events.length),\n [events, hasNextPage],\n );\n\n const onRowsLoaded = useInfiniteLoader({\n isRowLoaded: isItemLoaded,\n loadMoreRows: loadMoreItems,\n rowCount: itemCount,\n threshold: 5,\n });\n\n if (isLoading) {\n return <LoadingState className={className} />;\n }\n\n if (events.length === 0) {\n return <EmptyState className={className} />;\n }\n\n return (\n <div className={cn(\"w-full h-full flex flex-col\", className)}>\n <div className=\"flex-auto min-h-0\" ref={ref}>\n <List\n className=\"no-scrollbar\"\n style={{ height }}\n onRowsRendered={onRowsLoaded}\n rowComponent={SearchResultRow}\n rowCount={itemCount}\n rowHeight={ROW_HEIGHT}\n rowProps={{ events, onSelect, getEventHref, LinkComponent, onHover }}\n overscanCount={5}\n />\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Row renderer\n// ---------------------------------------------------------------------------\n\ninterface SearchResultRowData {\n events: PredictEvent[];\n onSelect?: (event: PredictEvent) => void;\n getEventHref?: (event: PredictEvent) => string;\n LinkComponent?: LinkComponentType;\n onHover?: (event: PredictEvent) => void;\n}\n\nfunction SearchResultRow({\n index,\n style,\n events,\n onSelect,\n getEventHref,\n LinkComponent,\n onHover,\n}: RowComponentProps<SearchResultRowData>): ReactElement {\n const event = events[index];\n\n if (!event) {\n return (\n <div style={style} className=\"flex items-center justify-center\">\n <Spinner size=\"sm\" />\n </div>\n );\n }\n\n return (\n <div style={style}>\n <SearchResultItemUI\n event={event}\n href={getEventHref?.(event)}\n LinkComponent={LinkComponent}\n onSelect={onSelect}\n onHover={onHover}\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// States\n// ---------------------------------------------------------------------------\n\nfunction LoadingState({ className }: { className?: string }) {\n const { t } = useTranslation();\n\n return (\n <div\n className={cn(\"flex items-center justify-center gap-2 py-16\", className)}\n >\n <Spinner size=\"sm\" />\n <span className=\"text-sm text-neutral\">\n {t(\"predict.search.loading\")}\n </span>\n </div>\n );\n}\n\nfunction EmptyState({ className }: { className?: string }) {\n const { t } = useTranslation();\n\n return (\n <div\n className={cn(\n \"flex flex-col items-center justify-center py-16\",\n className,\n )}\n >\n <EmptyIcon width={28} height={28} className=\"text-neutral\" />\n <p className=\"mt-2 text-sm text-neutral\">\n {t(\"predict.search.noResults\")}\n </p>\n </div>\n );\n}\n","\"use client\";\n\nimport { useCallback, useMemo, useState } from \"react\";\nimport { useCallbackRef } from \"@liberfi.io/hooks\";\nimport { debounce } from \"@liberfi.io/utils\";\nimport { usePredictSearchHistory } from \"./search-history.script\";\n\nexport interface UseSearchScriptParams {\n /** Callback when the debounced keyword changes */\n onKeywordChange?: (keyword: string) => void;\n}\n\nexport function useSearchScript({ onKeywordChange }: UseSearchScriptParams) {\n const [text, setText] = useState(\"\");\n const [keyword, setKeyword] = useState(\"\");\n const { addHistory } = usePredictSearchHistory();\n\n const onKeywordChangeStable = useCallbackRef(onKeywordChange);\n const addHistoryStable = useCallbackRef(addHistory);\n\n const debouncedSearch = useMemo(\n () =>\n debounce((v: string) => {\n setKeyword(v);\n onKeywordChangeStable(v);\n if (v) addHistoryStable(v);\n }, 500),\n [onKeywordChangeStable, addHistoryStable],\n );\n\n const setText_ = useCallback(\n (v: string) => {\n setText(v);\n debouncedSearch(v);\n },\n [debouncedSearch],\n );\n\n const setKeyword_ = useCallback(\n (value: string) => {\n debouncedSearch.cancel();\n setText(value);\n setKeyword(value);\n onKeywordChangeStable(value);\n if (value) addHistoryStable(value);\n },\n [debouncedSearch, onKeywordChangeStable, addHistoryStable],\n );\n\n const clearKeyword = useCallback(() => setKeyword_(\"\"), [setKeyword_]);\n\n return {\n text,\n keyword,\n setText: setText_,\n setKeyword: setKeyword_,\n clearKeyword,\n };\n}\n","\"use client\";\n\nimport type { PredictEvent, ProviderSource } from \"@liberfi.io/react-predict\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { SearchHistoryWidget } from \"./search-history.widget\";\nimport { SearchInputUI } from \"./search-input.ui\";\nimport { SearchResultListWidget } from \"./search-result-list.widget\";\nimport { useSearchScript } from \"./search.script\";\n\nexport type SearchWidgetProps = {\n /** Callback when the debounced keyword changes */\n onKeywordChange?: (keyword: string) => void;\n /** Callback when an event is selected */\n onSelectEvent?: (event: PredictEvent) => void;\n /** Generate href for each event row. When set, rows render as links. */\n getEventHref?: (event: PredictEvent) => string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n /** Called when a row is hovered (for data prefetching). */\n onHover?: (event: PredictEvent) => void;\n /** Called when the Esc button / key is pressed. */\n onEscape?: () => void;\n /** Filter by upstream provider. When set, only events from that provider are returned. */\n source?: ProviderSource;\n};\n\nexport function SearchWidget({\n onKeywordChange,\n onSelectEvent,\n getEventHref,\n LinkComponent,\n onHover,\n onEscape,\n source,\n}: SearchWidgetProps) {\n const { text, keyword, setText, setKeyword, clearKeyword } = useSearchScript({\n onKeywordChange,\n });\n\n return (\n <div className=\"w-full h-full flex flex-col gap-3\">\n <SearchInputUI\n value={text}\n onValueChange={setText}\n onClear={clearKeyword}\n onEscape={onEscape}\n />\n {!keyword && <SearchHistoryWidget onSelect={setKeyword} />}\n <SearchResultListWidget\n className=\"flex-auto min-h-0\"\n keyword={keyword}\n onSelect={onSelectEvent}\n getEventHref={getEventHref}\n LinkComponent={LinkComponent}\n onHover={onHover}\n source={source}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport { useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent, ProviderSource } from \"@liberfi.io/react-predict\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport {\n Button,\n ModalBody,\n ModalContent,\n ModalHeader,\n StyledModal,\n useScreen,\n XCloseIcon,\n} from \"@liberfi.io/ui\";\nimport {\n AsyncModal,\n type RenderAsyncModalProps,\n} from \"@liberfi.io/ui-scaffold\";\nimport { SearchWidget } from \"./search.widget\";\n\nexport type PredictSearchModalParams = {\n /** Generate href for each event row. When set, rows render as links. */\n getEventHref?: (event: PredictEvent) => string;\n /** Custom link component (e.g. next/link). */\n LinkComponent?: LinkComponentType;\n /** Called when a row is hovered (for data prefetching). */\n onHover?: (event: PredictEvent) => void;\n /** Filter by upstream provider. When set, only events from that provider are returned. */\n source?: ProviderSource;\n};\n\nexport type PredictSearchModalResult = PredictEvent;\n\nexport const PREDICT_SEARCH_MODAL_ID = \"predict-search\";\n\nexport function PredictSearchModal({\n id = PREDICT_SEARCH_MODAL_ID,\n}: {\n id?: string;\n}) {\n return (\n <AsyncModal<PredictSearchModalParams, PredictSearchModalResult> id={id}>\n {(modalProps) => <PredictSearchModalContent {...modalProps} />}\n </AsyncModal>\n );\n}\n\nfunction PredictSearchModalContent({\n params,\n isOpen,\n onOpenChange,\n onResult,\n}: RenderAsyncModalProps<PredictSearchModalParams, PredictSearchModalResult>) {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n\n const handleSelectEvent = useCallback(\n (event: PredictEvent) => {\n onResult(event);\n },\n [onResult],\n );\n\n const handleEscape = useCallback(() => {\n onOpenChange(false);\n }, [onOpenChange]);\n\n return (\n <StyledModal\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n size={isMobile ? \"full\" : \"lg\"}\n hideCloseButton\n backdrop=\"blur\"\n radius=\"lg\"\n >\n <ModalContent\n className=\"w-full h-full\"\n style={{\n borderRadius: isMobile ? undefined : 14,\n border: isMobile ? undefined : \"1px solid rgba(39,39,42,1)\",\n background: \"rgba(24,24,27,1)\",\n boxShadow: isMobile ? undefined : \"0 25px 50px -12px rgba(0,0,0,0.5)\",\n overflow: \"hidden\",\n }}\n >\n <ModalHeader className=\"sm:hidden flex items-center justify-between pt-4 pb-2\">\n <span className=\"text-base font-semibold\">\n {t(\"predict.search.title\")}\n </span>\n <Button\n isIconOnly\n onPress={() => onOpenChange(false)}\n size=\"sm\"\n className=\"bg-transparent min-w-6 w-6 h-6\"\n >\n <XCloseIcon width={20} height={20} />\n </Button>\n </ModalHeader>\n <ModalBody className=\"p-4\">\n <SearchWidget\n getEventHref={params?.getEventHref}\n LinkComponent={params?.LinkComponent}\n onHover={params?.onHover}\n source={params?.source}\n onSelectEvent={handleSelectEvent}\n onEscape={handleEscape}\n />\n </ModalBody>\n </ModalContent>\n </StyledModal>\n );\n}\n","\"use client\";\n\nimport { useEffect } from \"react\";\nimport { useCallbackRef } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent } from \"@liberfi.io/react-predict\";\nimport { Button, cn, Kbd, SearchIcon, useScreen } from \"@liberfi.io/ui\";\nimport { useAsyncModal } from \"@liberfi.io/ui-scaffold\";\nimport {\n PREDICT_SEARCH_MODAL_ID,\n type PredictSearchModalParams,\n type PredictSearchModalResult,\n} from \"./search.modal\";\n\nexport type SearchEventsButtonProps = {\n /** Callback when an event is selected from the search modal */\n onSelectEvent?: (event: PredictEvent) => void;\n /** Params forwarded to the search modal (getEventHref, LinkComponent, onHover) */\n modalParams?: Omit<PredictSearchModalParams, never>;\n className?: string;\n};\n\nexport function SearchEventsButton({\n onSelectEvent,\n modalParams,\n className,\n}: SearchEventsButtonProps) {\n const { t } = useTranslation();\n const { isDesktop, isMobile } = useScreen();\n\n const { onOpen, onClose } = useAsyncModal<\n PredictSearchModalParams,\n PredictSearchModalResult\n >(PREDICT_SEARCH_MODAL_ID);\n\n const onSelectEventStable = useCallbackRef(onSelectEvent);\n\n const handleOpen = useCallbackRef(async () => {\n const result = await onOpen({ params: modalParams });\n if (result) {\n onSelectEventStable(result);\n }\n });\n\n const handleClose = useCallbackRef(() => {\n onClose();\n });\n\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n const activeElement = document.activeElement as HTMLElement | null;\n\n const isInEditableElement =\n !!activeElement &&\n (activeElement.tagName === \"INPUT\" ||\n activeElement.tagName === \"TEXTAREA\" ||\n activeElement.getAttribute(\"contenteditable\") === \"true\");\n\n if (event.key === \"/\" && !isInEditableElement) {\n event.preventDefault();\n handleOpen();\n }\n\n if (event.key === \"Escape\") {\n event.preventDefault();\n handleClose();\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n window.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [handleOpen, handleClose]);\n\n return (\n <Button\n size=\"sm\"\n radius=\"full\"\n isIconOnly={!isDesktop}\n onPress={handleOpen}\n variant={isMobile ? \"flat\" : \"bordered\"}\n startContent={\n isDesktop ? <SearchIcon className=\"text-neutral\" /> : undefined\n }\n endContent={\n isDesktop ? (\n <Kbd className=\"ml-auto min-w-6 justify-center text-xs bg-transparent border border-border rounded-full\">\n /\n </Kbd>\n ) : undefined\n }\n className={cn(\n isDesktop && \"min-w-56 justify-start pl-3 pr-1.5 text-neutral\",\n className,\n )}\n >\n {isDesktop ? (\n t(\"predict.search.placeholder\")\n ) : (\n <SearchIcon className=\"text-neutral\" />\n )}\n </Button>\n );\n}\n","import { useState, useRef, useEffect, useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { MatchSortField } from \"@liberfi.io/react-predict\";\n\nexport interface MatchesFilterBarProps {\n sortBy: MatchSortField;\n onSortChange: (sort: MatchSortField) => void;\n sortAsc: boolean;\n onSortAscChange: (asc: boolean) => void;\n minVolume?: number;\n onMinVolumeChange?: (vol: number | undefined) => void;\n onRefresh?: () => void;\n}\n\nconst SORT_OPTIONS: {\n value: MatchSortField;\n labelKey: string;\n descKey: string;\n icon: \"trending-up\" | \"chart-column\" | \"flame\";\n}[] = [\n {\n value: \"spread\",\n labelKey: \"predict.matches.sort.spread\",\n descKey: \"predict.matches.sort.spreadDesc\",\n icon: \"trending-up\",\n },\n {\n value: \"volume\",\n labelKey: \"predict.matches.sort.volume\",\n descKey: \"predict.matches.sort.volumeDesc\",\n icon: \"chart-column\",\n },\n {\n value: \"confidence\",\n labelKey: \"predict.matches.sort.confidence\",\n descKey: \"predict.matches.sort.confidenceDesc\",\n icon: \"flame\",\n },\n];\n\nconst VOLUME_PRESETS = [\n { labelKey: \"predict.matches.filter.noMinimum\", label: \"$0\", value: 0 },\n { labelKey: null, label: \"$100+\", value: 100 },\n { labelKey: null, label: \"$500+\", value: 500 },\n { labelKey: null, label: \"$1K+\", value: 1_000 },\n { labelKey: null, label: \"$5K+\", value: 5_000 },\n { labelKey: null, label: \"$10K+\", value: 10_000 },\n { labelKey: null, label: \"$50K+\", value: 50_000 },\n { labelKey: null, label: \"$100K+\", value: 100_000 },\n];\n\nconst btnBase: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n borderRadius: 10,\n border: \"1px solid rgba(63,63,70,0.5)\",\n background: \"rgba(39,39,42,0.6)\",\n padding: \"8px 12px\",\n fontSize: 14,\n color: \"#d4d4d8\",\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n};\n\nconst dropdownBase: React.CSSProperties = {\n position: \"absolute\",\n right: 0,\n top: \"100%\",\n zIndex: 20,\n marginTop: 8,\n borderRadius: 14,\n border: \"1px solid rgba(39,39,42,1)\",\n background: \"rgba(24,24,27,1)\",\n boxShadow: \"0 25px 50px -12px rgba(0,0,0,0.5)\",\n overflow: \"hidden\",\n};\n\nfunction getVolumeLabel(\n vol: number | undefined,\n t: (key: string) => string,\n): string {\n if (!vol) return \"$5K+\";\n const preset = VOLUME_PRESETS.find((p) => p.value === vol);\n if (!preset) return `$${vol}`;\n return preset.labelKey ? t(preset.labelKey) : preset.label;\n}\n\nexport function MatchesFilterBar({\n sortBy,\n onSortChange,\n sortAsc,\n onSortAscChange,\n minVolume,\n onMinVolumeChange,\n onRefresh,\n}: MatchesFilterBarProps) {\n const { t } = useTranslation();\n const [sortOpen, setSortOpen] = useState(false);\n const [volumeOpen, setVolumeOpen] = useState(false);\n const [tooltipVisible, setTooltipVisible] = useState(false);\n const [spinning, setSpinning] = useState(false);\n const sortRef = useRef<HTMLDivElement>(null);\n const volumeRef = useRef<HTMLDivElement>(null);\n\n const currentSort =\n SORT_OPTIONS.find((o) => o.value === sortBy) ?? SORT_OPTIONS[0];\n\n const handleClickOutside = useCallback((e: MouseEvent) => {\n if (sortRef.current && !sortRef.current.contains(e.target as Node)) {\n setSortOpen(false);\n }\n if (volumeRef.current && !volumeRef.current.contains(e.target as Node)) {\n setVolumeOpen(false);\n }\n }, []);\n\n useEffect(() => {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => document.removeEventListener(\"mousedown\", handleClickOutside);\n }, [handleClickOutside]);\n\n const handleRefresh = useCallback(() => {\n onRefresh?.();\n setSpinning(true);\n setTimeout(() => setSpinning(false), 700);\n }, [onRefresh]);\n\n return (\n <>\n <style>{`\n @keyframes matchRefreshSpin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}\n .match-refresh-spin{animation:matchRefreshSpin .6s ease-in-out}\n .match-btn:focus-visible{outline:2px solid #c7ff2e;outline-offset:2px;z-index:10}\n `}</style>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n {/* Sort dropdown */}\n <div ref={sortRef} style={{ position: \"relative\" }}>\n <button\n type=\"button\"\n className=\"match-btn\"\n style={btnBase}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,1)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,0.6)\";\n }}\n onClick={() => {\n setSortOpen((v) => !v);\n setVolumeOpen(false);\n }}\n >\n <SortIcon />\n <span className=\"hidden sm:block\" style={{ color: \"#d4d4d8\" }}>\n {t(currentSort.labelKey as never)}\n </span>\n <ChevronDown open={sortOpen} />\n </button>\n\n {sortOpen && (\n <div style={{ ...dropdownBase, width: 224, padding: 4 }}>\n {SORT_OPTIONS.map((opt) => {\n const isActive = sortBy === opt.value;\n return (\n <button\n key={opt.value}\n type=\"button\"\n style={{\n display: \"flex\",\n width: \"100%\",\n alignItems: \"center\",\n gap: 12,\n padding: \"10px 12px\",\n textAlign: \"left\",\n fontSize: 14,\n border: \"none\",\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n background: isActive\n ? \"rgba(199,255,46,0.08)\"\n : \"transparent\",\n color: isActive ? \"#c7ff2e\" : \"#a1a1aa\",\n borderRadius: 10,\n }}\n onMouseEnter={(e) => {\n if (!isActive) {\n e.currentTarget.style.background = \"rgba(39,39,42,0.5)\";\n e.currentTarget.style.color = \"#fff\";\n }\n }}\n onMouseLeave={(e) => {\n if (!isActive) {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"#a1a1aa\";\n }\n }}\n onClick={() => {\n if (sortBy === opt.value) {\n onSortAscChange(!sortAsc);\n } else {\n onSortChange(opt.value);\n }\n setSortOpen(false);\n }}\n >\n <div\n style={{\n color: isActive ? \"#c7ff2e\" : \"#71717a\",\n }}\n >\n <SortOptionIcon type={opt.icon} />\n </div>\n <div style={{ flex: 1, textAlign: \"left\" as const }}>\n <div style={{ fontWeight: 500 }}>\n {t(opt.labelKey as never)}\n </div>\n <div\n style={{\n fontSize: 11,\n color: \"#71717a\",\n marginTop: 1,\n }}\n >\n {t(opt.descKey as never)}\n </div>\n </div>\n {isActive && (\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 16,\n height: 16,\n color: \"#c7ff2e\",\n flexShrink: 0,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n )}\n </button>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Volume filter */}\n {onMinVolumeChange && (\n <div ref={volumeRef} style={{ position: \"relative\" }}>\n <div style={{ position: \"relative\", display: \"inline-flex\" }}>\n <button\n type=\"button\"\n className=\"match-btn\"\n style={btnBase}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,1)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,0.6)\";\n }}\n onClick={() => {\n setVolumeOpen((v) => !v);\n setSortOpen(false);\n }}\n >\n <FilterIcon />\n <span className=\"hidden sm:block\" style={{ color: \"#d4d4d8\" }}>\n {getVolumeLabel(minVolume, t as (key: string) => string)}\n </span>\n <InfoIcon\n onMouseEnter={() => setTooltipVisible(true)}\n onMouseLeave={() => setTooltipVisible(false)}\n />\n <ChevronDown open={volumeOpen} />\n </button>\n\n {/* Tooltip */}\n {tooltipVisible && (\n <div\n style={{\n position: \"absolute\",\n zIndex: 100,\n top: \"100%\",\n marginTop: 8,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n width: 256,\n padding: 12,\n borderRadius: 14,\n background: \"rgba(24,24,27,1)\",\n border: \"1px solid rgba(63,63,70,0.5)\",\n boxShadow: \"0 25px 50px -12px rgba(0,0,0,0.5)\",\n pointerEvents: \"none\",\n }}\n >\n {/* Arrow */}\n <div\n style={{\n position: \"absolute\",\n top: -6,\n left: \"50%\",\n transform: \"translateX(-50%) rotate(45deg)\",\n width: 12,\n height: 12,\n background: \"rgba(24,24,27,1)\",\n borderLeft: \"1px solid rgba(63,63,70,0.5)\",\n borderTop: \"1px solid rgba(63,63,70,0.5)\",\n }}\n />\n <div\n style={{\n position: \"relative\",\n fontSize: 12,\n color: \"#d4d4d8\",\n lineHeight: 1.625,\n }}\n >\n <div\n style={{\n fontWeight: 600,\n color: \"#fff\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n marginBottom: 8,\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 14,\n height: 14,\n color: \"#c7ff2e\",\n flexShrink: 0,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z\" />\n </svg>\n {t(\"predict.matches.filter.liquidityFilter\" as never)}\n </div>\n <p style={{ color: \"#a1a1aa\", margin: \"0 0 4px\" }}>\n {t(\"predict.matches.filter.tooltipDesc\" as never)}\n </p>\n <p style={{ color: \"#71717a\", fontSize: 11, margin: 0 }}>\n {t(\"predict.matches.filter.tooltipNote\" as never)}\n </p>\n </div>\n </div>\n )}\n </div>\n\n {/* Volume dropdown */}\n {volumeOpen && (\n <div style={{ ...dropdownBase, right: 0, width: 176 }}>\n <div\n style={{\n padding: \"8px 12px\",\n borderBottom: \"1px solid rgba(39,39,42,1)\",\n }}\n >\n <span\n style={{\n fontSize: 11,\n fontWeight: 500,\n color: \"#71717a\",\n textTransform: \"uppercase\" as const,\n letterSpacing: \"0.05em\",\n }}\n >\n {t(\"predict.matches.filter.minVolumeEach\" as never)}\n </span>\n </div>\n <div style={{ padding: 4 }}>\n {VOLUME_PRESETS.map((p) => {\n const isActive =\n p.value === 0 ? !minVolume : minVolume === p.value;\n return (\n <button\n key={p.value}\n type=\"button\"\n style={{\n display: \"flex\",\n width: \"100%\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"8px 12px\",\n textAlign: \"left\",\n fontSize: 14,\n border: \"none\",\n cursor: \"pointer\",\n background: isActive\n ? \"rgba(199,255,46,0.08)\"\n : \"transparent\",\n color: isActive ? \"#c7ff2e\" : \"#a1a1aa\",\n borderRadius: 10,\n transition: \"all 0.15s\",\n }}\n onMouseEnter={(e) => {\n if (!isActive) {\n e.currentTarget.style.background =\n \"rgba(39,39,42,0.5)\";\n e.currentTarget.style.color = \"#fff\";\n }\n }}\n onMouseLeave={(e) => {\n if (!isActive) {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"#a1a1aa\";\n }\n }}\n onClick={() => {\n onMinVolumeChange?.(\n p.value === 0 ? undefined : p.value,\n );\n setVolumeOpen(false);\n }}\n >\n <span>\n {p.labelKey ? t(p.labelKey as never) : p.label}\n </span>\n {isActive && (\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 16,\n height: 16,\n color: \"#c7ff2e\",\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n )}\n </button>\n );\n })}\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* Refresh button */}\n {onRefresh && (\n <button\n type=\"button\"\n className=\"match-btn\"\n style={{\n borderRadius: 10,\n border: \"1px solid rgba(63,63,70,0.5)\",\n background: \"rgba(39,39,42,0.6)\",\n width: 36,\n height: 36,\n color: \"#a1a1aa\",\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,1)\";\n e.currentTarget.style.color = \"#fff\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"rgba(39,39,42,0.6)\";\n e.currentTarget.style.color = \"#a1a1aa\";\n }}\n onClick={handleRefresh}\n >\n <svg\n className={spinning ? \"match-refresh-spin\" : undefined}\n viewBox=\"0 0 24 24\"\n style={{ width: 16, height: 16 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\" />\n <path d=\"M21 3v5h-5\" />\n <path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\" />\n <path d=\"M8 16H3v5\" />\n </svg>\n </button>\n )}\n </div>\n </>\n );\n}\n\nfunction SortIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 14, height: 14, color: \"#a1a1aa\" }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m21 16-4 4-4-4\" />\n <path d=\"M17 20V4\" />\n <path d=\"m3 8 4-4 4 4\" />\n <path d=\"M7 4v16\" />\n </svg>\n );\n}\n\nfunction SortOptionIcon({\n type,\n}: {\n type: \"trending-up\" | \"chart-column\" | \"flame\";\n}) {\n const style: React.CSSProperties = { width: 16, height: 16 };\n const shared = {\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\" as const,\n strokeLinejoin: \"round\" as const,\n };\n\n if (type === \"trending-up\") {\n return (\n <svg {...shared} style={style}>\n <path d=\"M16 7h6v6\" />\n <path d=\"m22 7-8.5 8.5-5-5L2 17\" />\n </svg>\n );\n }\n if (type === \"chart-column\") {\n return (\n <svg {...shared} style={style}>\n <path d=\"M3 3v16a2 2 0 0 0 2 2h16\" />\n <path d=\"M18 17V9\" />\n <path d=\"M13 17V5\" />\n <path d=\"M8 17v-3\" />\n </svg>\n );\n }\n return (\n <svg {...shared} style={style}>\n <path d=\"M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z\" />\n </svg>\n );\n}\n\nfunction FilterIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 14, height: 14, color: \"#a1a1aa\" }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z\" />\n </svg>\n );\n}\n\nfunction InfoIcon({\n onMouseEnter,\n onMouseLeave,\n}: {\n onMouseEnter?: () => void;\n onMouseLeave?: () => void;\n}) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n className=\"hidden sm:block\"\n style={{ width: 12, height: 12, color: \"#52525b\", flexShrink: 0 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 16v-4\" />\n <path d=\"M12 8h.01\" />\n </svg>\n );\n}\n\nfunction ChevronDown({ open }: { open: boolean }) {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 14,\n height: 14,\n color: \"#71717a\",\n transition: \"transform 0.15s\",\n transform: open ? \"rotate(180deg)\" : undefined,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n );\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\n\nexport interface MatchesHeroStats {\n activePairs: number;\n maxSpread: number;\n highSpreadCount: number;\n totalVolume: number;\n}\n\nexport interface MatchesHeroProps {\n stats?: MatchesHeroStats;\n}\n\nfunction formatVolume(vol: number): string {\n if (vol >= 1_000_000) return `$${(vol / 1_000_000).toFixed(1)}M`;\n if (vol >= 1_000) return `$${(vol / 1_000).toFixed(0)}K`;\n return `$${vol.toFixed(0)}`;\n}\n\nconst STAT_CARDS: {\n key: keyof MatchesHeroStats;\n labelKey: string;\n format: (v: number) => string;\n valueColor: string;\n gradientFrom: string;\n gradientTo: string;\n borderColor: string;\n}[] = [\n {\n key: \"activePairs\",\n labelKey: \"predict.matches.stats.activePairs\",\n format: (v) => v.toLocaleString(),\n valueColor: \"#c7ff2e\",\n gradientFrom: \"rgba(199,255,46,0.18)\",\n gradientTo: \"rgba(199,255,46,0.04)\",\n borderColor: \"rgba(199,255,46,0.18)\",\n },\n {\n key: \"maxSpread\",\n labelKey: \"predict.matches.stats.maxSpread\",\n format: (v) => `${(v * 100).toFixed(1)}%`,\n valueColor: \"#f76816\",\n gradientFrom: \"rgba(247,104,22,0.18)\",\n gradientTo: \"rgba(247,104,22,0.04)\",\n borderColor: \"rgba(247,104,22,0.18)\",\n },\n {\n key: \"highSpreadCount\",\n labelKey: \"predict.matches.stats.highSpreadCount\",\n format: (v) => v.toLocaleString(),\n valueColor: \"#17c964\",\n gradientFrom: \"rgba(23,201,100,0.18)\",\n gradientTo: \"rgba(23,201,100,0.04)\",\n borderColor: \"rgba(23,201,100,0.18)\",\n },\n {\n key: \"totalVolume\",\n labelKey: \"predict.matches.stats.totalVolume\",\n format: formatVolume,\n valueColor: \"#f5a524\",\n gradientFrom: \"rgba(245,165,36,0.18)\",\n gradientTo: \"rgba(245,165,36,0.04)\",\n borderColor: \"rgba(245,165,36,0.18)\",\n },\n];\n\nexport function MatchesHero({ stats }: MatchesHeroProps) {\n const { t } = useTranslation();\n\n return (\n <>\n <style>{`\n @keyframes match-live-ping{75%,100%{transform:scale(2.2);opacity:0}}\n @keyframes match-live-breathe{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.55;transform:scale(.85)}}\n @keyframes matchStatsEnter{from{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}\n @keyframes matchStatCardEnter{from{opacity:0;transform:translateY(8px) scale(0.97)}to{opacity:1;transform:translateY(0) scale(1)}}\n @keyframes matchHeroTitleEnter{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}\n\n .matches-hero-title{font-size:32px!important;line-height:1.2!important}\n @media(min-width:640px){.matches-hero-title{font-size:38px!important}}\n @media(min-width:1024px){.matches-hero-title{font-size:46px!important}}\n\n .matches-hero-subtitle{font-size:14px}\n @media(min-width:640px){.matches-hero-subtitle{font-size:15px}}\n\n .matches-hero-outer{flex-direction:column;align-items:center;text-align:center;gap:28px}\n @media(min-width:640px){.matches-hero-outer{flex-direction:row;align-items:center;text-align:left;gap:40px}}\n @media(min-width:1024px){.matches-hero-outer{gap:56px}}\n\n .matches-hero-left{align-items:center}\n @media(min-width:640px){.matches-hero-left{align-items:flex-start}}\n\n .matches-hero-live{justify-content:center}\n @media(min-width:640px){.matches-hero-live{justify-content:flex-start}}\n\n .matches-hero-subtitle-text{text-align:center;margin:0 auto}\n @media(min-width:640px){.matches-hero-subtitle-text{text-align:left;margin:0}}\n\n .matches-stat-grid{grid-template-columns:repeat(2,1fr);width:100%;max-width:360px}\n @media(min-width:640px){.matches-stat-grid{width:340px;max-width:none}}\n @media(min-width:1024px){.matches-stat-grid{width:380px}}\n\n .matches-stat-val{font-size:20px;line-height:28px;min-height:28px}\n @media(min-width:640px){.matches-stat-val{font-size:22px;line-height:30px;min-height:30px}}\n @media(min-width:1024px){.matches-stat-val{font-size:24px;line-height:32px;min-height:32px}}\n\n .matches-stat-label{font-size:11px;line-height:16px;min-height:16px}\n @media(min-width:640px){.matches-stat-label{font-size:12px;line-height:18px;min-height:18px}}\n `}</style>\n\n <div\n className=\"matches-hero-outer\"\n style={{\n display: \"flex\",\n marginBottom: 0,\n }}\n >\n {/* Left: title group */}\n <div\n className=\"matches-hero-left\"\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n minWidth: 0,\n flex: 1,\n animation:\n \"matchHeroTitleEnter 0.5s cubic-bezier(0.34,1.56,0.64,1) both\",\n }}\n >\n {/* Live badge */}\n <div\n className=\"matches-hero-live\"\n style={{ display: \"flex\", marginBottom: 16 }}\n >\n <div\n className=\"inline-flex items-center\"\n style={{\n gap: 8,\n borderRadius: 9999,\n border: \"1px solid rgba(63,63,70,0.5)\",\n background: \"rgba(39,39,42,0.6)\",\n padding: \"6px 12px\",\n backdropFilter: \"blur(8px)\",\n WebkitBackdropFilter: \"blur(8px)\",\n }}\n >\n <span\n style={{\n position: \"relative\",\n display: \"flex\",\n width: 8,\n height: 8,\n }}\n >\n <span\n style={{\n position: \"absolute\",\n display: \"inline-flex\",\n width: \"100%\",\n height: \"100%\",\n borderRadius: 9999,\n background: \"#00d492\",\n opacity: 0.75,\n animation:\n \"match-live-ping 1.2s cubic-bezier(0,0,0.2,1) infinite\",\n }}\n />\n <span\n style={{\n position: \"relative\",\n display: \"inline-flex\",\n width: 8,\n height: 8,\n borderRadius: 9999,\n background: \"#00bc7d\",\n animation: \"match-live-breathe 2.4s ease-in-out infinite\",\n }}\n />\n </span>\n <span\n style={{\n fontSize: 12,\n fontWeight: 500,\n color: \"#d4d4d8\",\n letterSpacing: \"0.025em\",\n }}\n >\n {t(\"predict.matches.liveBadge\" as const)}\n </span>\n <span\n style={{\n borderRadius: 4,\n background: \"rgba(199,255,46,0.12)\",\n padding: \"2px 6px\",\n fontSize: 10,\n fontWeight: 600,\n color: \"#c7ff2e\",\n textTransform: \"uppercase\" as const,\n border: \"1px solid rgba(199,255,46,0.22)\",\n }}\n >\n {t(\"predict.matches.betaTag\" as const)}\n </span>\n </div>\n </div>\n\n {/* Title */}\n <h1\n className=\"matches-hero-title\"\n style={{\n fontFamily: \"var(--font-dm-sans, 'DM Sans', sans-serif)\",\n fontSize: 46,\n fontWeight: 700,\n letterSpacing: \"-1.2px\",\n lineHeight: 1.2,\n color: \"#fff\",\n margin: \"0 0 14px\",\n }}\n >\n <span style={{ color: \"#fff\" }}>\n {t(\"predict.matches.titlePrefix\" as never)}{\" \"}\n </span>\n <span\n style={{\n backgroundImage:\n \"linear-gradient(to right, #c7ff2e, #a0e515, #17c964)\",\n WebkitBackgroundClip: \"text\",\n WebkitTextFillColor: \"transparent\",\n backgroundClip: \"text\",\n }}\n >\n {t(\"predict.matches.titleHighlight\" as never)}\n </span>\n </h1>\n\n {/* Subtitle */}\n <p\n className=\"matches-hero-subtitle matches-hero-subtitle-text\"\n style={{\n lineHeight: 1.6,\n color: \"#71717a\",\n maxWidth: 460,\n }}\n >\n {String(t(\"predict.matches.heroSubtitle\" as never))\n .split(\"\\n\")\n .map((line: string, i: number) => (\n <span key={i}>\n {i > 0 && <br className=\"hidden sm:block\" />}\n {line}\n {i === 0 ? \" \" : \"\"}\n </span>\n ))}\n </p>\n </div>\n\n {/* Right: 2x2 stat grid */}\n <div\n className=\"matches-stat-grid\"\n style={{\n display: \"grid\",\n borderRadius: 16,\n border: \"1px solid rgba(39,39,42,0.5)\",\n overflow: \"hidden\",\n flexShrink: 0,\n backdropFilter: \"blur(8px)\",\n WebkitBackdropFilter: \"blur(8px)\",\n ...(stats\n ? {\n animation:\n \"matchStatsEnter 0.5s cubic-bezier(0.34,1.56,0.64,1) both\",\n animationDelay: \"0.1s\",\n }\n : {}),\n }}\n >\n {STAT_CARDS.map((card, idx) => (\n <div\n key={card.key}\n style={{\n padding: \"16px 20px\",\n background: stats\n ? `linear-gradient(to bottom, ${card.gradientFrom}, ${card.gradientTo})`\n : \"rgba(255,255,255,0.02)\",\n borderRight:\n idx % 2 === 0 ? \"1px solid rgba(39,39,42,0.4)\" : \"none\",\n borderBottom: idx < 2 ? \"1px solid rgba(39,39,42,0.4)\" : \"none\",\n ...(stats\n ? {\n animation:\n \"matchStatCardEnter 0.45s cubic-bezier(0.34,1.56,0.64,1) both\",\n animationDelay: `${150 + idx * 60}ms`,\n }\n : {}),\n }}\n >\n <div\n className=\"matches-stat-val\"\n style={{\n fontWeight: 700,\n fontVariantNumeric: \"tabular-nums\",\n color: stats ? card.valueColor : \"transparent\",\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n {stats ? (\n card.format(stats[card.key])\n ) : (\n <div\n style={{\n height: 16,\n width: 56,\n borderRadius: 4,\n background: \"rgba(255,255,255,0.06)\",\n animation: \"matchStatCardEnter 0.6s ease-out both\",\n animationDelay: `${idx * 80}ms`,\n }}\n />\n )}\n </div>\n <div\n className=\"matches-stat-label\"\n style={{\n fontWeight: 500,\n color: stats ? \"#71717a\" : \"transparent\",\n marginTop: 2,\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n {stats ? (\n t(card.labelKey as never)\n ) : (\n <div\n style={{\n height: 10,\n width: 64,\n borderRadius: 4,\n background: \"rgba(255,255,255,0.04)\",\n animation: \"matchStatCardEnter 0.6s ease-out both\",\n animationDelay: `${50 + idx * 80}ms`,\n }}\n />\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n </>\n );\n}\n","import { useTranslation } from \"@liberfi.io/i18n\";\nimport type {\n MatchConfidenceTier,\n MatchMarketFlat,\n PredictMarket,\n ProviderSource,\n} from \"@liberfi.io/react-predict\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { getSourceMeta } from \"./source-badge.ui\";\n\nexport interface MatchMarketCardProps {\n match: MatchMarketFlat;\n onSelect?: (match: MatchMarketFlat, source: ProviderSource) => void;\n onHover?: (match: MatchMarketFlat) => void;\n getMarketHref?: (\n match: MatchMarketFlat,\n source: ProviderSource,\n ) => string | undefined;\n LinkComponent?: LinkComponentType;\n}\n\nfunction formatVolume(vol: number | null | undefined): string {\n if (vol == null) return \"-\";\n if (vol >= 1_000_000) return `$${(vol / 1_000_000).toFixed(1)}M`;\n if (vol >= 1_000) return `$${Math.round(vol / 1_000)}K`;\n return `$${vol.toFixed(0)}`;\n}\n\nfunction getYesPrice(market: PredictMarket): number | null {\n const yes = market.outcomes?.[0];\n return yes?.best_ask ?? yes?.price ?? null;\n}\n\nfunction getOutcomeName(market: PredictMarket): string | null {\n return market.outcomes?.[0]?.label || null;\n}\n\ntype SpreadTier = \"high\" | \"medium\" | \"low\";\n\nfunction getSpreadTier(spreadPercent: number | null): SpreadTier {\n if (spreadPercent == null) return \"low\";\n if (spreadPercent >= 3) return \"high\";\n if (spreadPercent >= 2) return \"medium\";\n return \"low\";\n}\n\nconst SPREAD_THEME: Record<\n SpreadTier,\n {\n color: string;\n bandFrom: string;\n bandTo: string;\n gaugeActive: string;\n gaugeInactive: string;\n }\n> = {\n high: {\n color: \"#f76816\",\n bandFrom: \"rgba(247,104,22,0.14)\",\n bandTo: \"rgba(247,104,22,0.03)\",\n gaugeActive: \"#f76816\",\n gaugeInactive: \"rgba(247,104,22,0.15)\",\n },\n medium: {\n color: \"#c7ff2e\",\n bandFrom: \"rgba(199,255,46,0.12)\",\n bandTo: \"rgba(199,255,46,0.02)\",\n gaugeActive: \"#c7ff2e\",\n gaugeInactive: \"rgba(199,255,46,0.15)\",\n },\n low: {\n color: \"#71717a\",\n bandFrom: \"rgba(113,113,122,0.08)\",\n bandTo: \"transparent\",\n gaugeActive: \"#71717a\",\n gaugeInactive: \"rgba(113,113,122,0.12)\",\n },\n};\n\nconst SPREAD_GLOW: Record<SpreadTier, { border: string; shadow: string }> = {\n high: {\n border: \"rgba(247,104,22,0.4)\",\n shadow: \"0 2px 18px rgba(247,104,22,0.35)\",\n },\n medium: {\n border: \"rgba(199,255,46,0.5)\",\n shadow: \"0 2px 20px rgba(199,255,46,0.45)\",\n },\n low: {\n border: \"rgba(113,113,122,0.5)\",\n shadow: \"0 2px 20px rgba(113,113,122,0.35)\",\n },\n};\n\nconst CONFIDENCE_THEME: Record<string, { dot: string; label: string }> = {\n high: { dot: \"#17c964\", label: \"predict.matches.confidenceHigh\" },\n medium: { dot: \"#f5a524\", label: \"predict.matches.confidenceMed\" },\n low: { dot: \"#71717a\", label: \"predict.matches.confidenceLow\" },\n};\n\nfunction getConfidenceTierKey(\n tier: MatchConfidenceTier | undefined,\n score: number | undefined,\n): string {\n if (tier) return tier;\n if (score == null) return \"low\";\n if (score >= 0.9) return \"high\";\n if (score >= 0.7) return \"medium\";\n return \"low\";\n}\n\nfunction SpreadGauge({ tier }: { tier: SpreadTier }) {\n const theme = SPREAD_THEME[tier];\n const filled = tier === \"high\" ? 5 : tier === \"medium\" ? 3 : 1;\n return (\n <div style={{ display: \"flex\", gap: 2, alignItems: \"center\" }}>\n {Array.from({ length: 5 }, (_, i) => (\n <div\n key={i}\n style={{\n width: 6,\n height: 10,\n borderRadius: 1.5,\n background: i < filled ? theme.gaugeActive : theme.gaugeInactive,\n transition: \"background 0.2s\",\n }}\n />\n ))}\n </div>\n );\n}\n\nconst PLATFORM_COLORS: Record<string, { text: string; icon: string }> = {\n polymarket: { text: \"#50a2ff\", icon: \"#50a2ff\" },\n kalshi: { text: \"#00d492\", icon: \"#00d492\" },\n};\n\nconst DEFAULT_PLATFORM = { text: \"#9ca3af\", icon: \"#9ca3af\" };\n\nfunction getPlatformColor(source: string) {\n return PLATFORM_COLORS[source] ?? DEFAULT_PLATFORM;\n}\n\nconst FOCUS_CSS = `\n.match-card button:focus-visible,\n.match-card a:focus-visible,\n.match-card [role=\"button\"]:focus-visible {\n outline: 2px solid hsl(var(--heroui-primary) / 0.4);\n outline-offset: 2px;\n}\n`;\n\nexport function MatchMarketCard({\n match,\n onSelect,\n onHover,\n getMarketHref,\n LinkComponent,\n}: MatchMarketCardProps) {\n const { t } = useTranslation();\n\n const priceA = getYesPrice(match.market_a);\n const priceB = getYesPrice(match.market_b);\n const spreadPercent =\n match.spread_percent != null\n ? match.spread_percent\n : match.spread != null\n ? match.spread * 100\n : null;\n\n const tier = getSpreadTier(spreadPercent);\n const theme = SPREAD_THEME[tier];\n\n const cheaperSource: ProviderSource | null =\n priceA != null && priceB != null\n ? priceA <= priceB\n ? match.source_a\n : match.source_b\n : null;\n\n const title = match.event_a_title || match.event_b_title;\n\n const confKey = getConfidenceTierKey(\n match.confidence_tier,\n match.similarity_score,\n );\n const confTheme = CONFIDENCE_THEME[confKey] ?? CONFIDENCE_THEME.low;\n\n const ctaAccent = tier === \"high\" ? \"orange\" : \"lime\";\n\n return (\n <div\n className=\"group match-card\"\n style={{\n borderRadius: 14,\n border: \"1px solid rgba(39,39,42,0.6)\",\n background: \"rgba(24,24,27,0.4)\",\n overflow: \"hidden\",\n transition: \"all 0.2s\",\n }}\n onMouseEnter={(e) => {\n const el = e.currentTarget as HTMLDivElement;\n const glow = SPREAD_GLOW[tier];\n el.style.borderColor = glow.border;\n el.style.boxShadow = glow.shadow;\n onHover?.(match);\n }}\n onMouseLeave={(e) => {\n const el = e.currentTarget as HTMLDivElement;\n el.style.borderColor = \"rgba(39,39,42,0.6)\";\n el.style.boxShadow = \"none\";\n }}\n >\n <style>{FOCUS_CSS}</style>\n {/* Spread hero band */}\n {spreadPercent != null && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"8px 14px\",\n background: `linear-gradient(90deg, ${theme.bandFrom}, ${theme.bandTo})`,\n borderBottom: \"1px solid rgba(39,39,42,0.3)\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 14,\n height: 14,\n flexShrink: 0,\n color: theme.color,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\" />\n </svg>\n <span\n style={{\n fontSize: 15,\n fontWeight: 700,\n fontVariantNumeric: \"tabular-nums\",\n color: theme.color,\n }}\n >\n {spreadPercent.toFixed(1)}%\n </span>\n <span\n style={{\n fontSize: 10,\n fontWeight: 500,\n color: \"rgba(161,161,170,0.7)\",\n textTransform: \"uppercase\" as const,\n letterSpacing: \"0.06em\",\n }}\n >\n SPREAD\n </span>\n </div>\n <SpreadGauge tier={tier} />\n </div>\n )}\n\n <div style={{ padding: \"14px 14px 12px\" }}>\n {/* Title */}\n <h3\n style={{\n fontSize: 13,\n fontWeight: 600,\n lineHeight: 1.4,\n letterSpacing: \"-0.2px\",\n color: \"#f4f4f5\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n display: \"-webkit-box\",\n WebkitLineClamp: 2,\n WebkitBoxOrient: \"vertical\" as const,\n margin: \"0 0 12px\",\n }}\n >\n {title}\n </h3>\n\n {/* Platform comparison rows */}\n <div\n style={{\n borderRadius: 10,\n border: \"1px solid rgba(39,39,42,0.4)\",\n overflow: \"hidden\",\n }}\n >\n <PlatformRow\n source={match.source_a}\n market={match.market_a}\n isCheaper={cheaperSource === match.source_a}\n onClick={() => onSelect?.(match, match.source_a)}\n href={getMarketHref?.(match, match.source_a)}\n LinkComponent={LinkComponent}\n />\n <div style={{ height: 1, background: \"rgba(39,39,42,0.3)\" }} />\n <PlatformRow\n source={match.source_b}\n market={match.market_b}\n isCheaper={cheaperSource === match.source_b}\n onClick={() => onSelect?.(match, match.source_b)}\n href={getMarketHref?.(match, match.source_b)}\n LinkComponent={LinkComponent}\n />\n </div>\n\n {/* CTA button */}\n {cheaperSource && spreadPercent != null && (\n <div\n style={{\n display: \"flex\",\n justifyContent: \"flex-end\",\n marginTop: 10,\n }}\n >\n <button\n type=\"button\"\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"5px 12px\",\n borderRadius: 8,\n border: `1px solid ${ctaAccent === \"orange\" ? \"rgba(247,104,22,0.2)\" : \"rgba(199,255,46,0.15)\"}`,\n background:\n ctaAccent === \"orange\"\n ? \"rgba(247,104,22,0.08)\"\n : \"rgba(199,255,46,0.06)\",\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n fontSize: 11,\n fontWeight: 500,\n color:\n ctaAccent === \"orange\"\n ? \"rgba(247,104,22,0.9)\"\n : \"rgba(199,255,46,0.85)\",\n }}\n onMouseEnter={(e) => {\n const el = e.currentTarget;\n el.style.background =\n ctaAccent === \"orange\"\n ? \"rgba(247,104,22,0.14)\"\n : \"rgba(199,255,46,0.10)\";\n }}\n onMouseLeave={(e) => {\n const el = e.currentTarget;\n el.style.background =\n ctaAccent === \"orange\"\n ? \"rgba(247,104,22,0.08)\"\n : \"rgba(199,255,46,0.06)\";\n }}\n onClick={() => onSelect?.(match, cheaperSource)}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 12,\n height: 12,\n flexShrink: 0,\n color: ctaAccent === \"orange\" ? \"#f76816\" : \"#c7ff2e\",\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\" />\n </svg>\n {t(\"predict.matches.buyEdge\" as never, {\n platform:\n cheaperSource.charAt(0).toUpperCase() +\n cheaperSource.slice(1),\n spread: spreadPercent.toFixed(1),\n })}\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 10,\n height: 10,\n color:\n ctaAccent === \"orange\"\n ? \"rgba(247,104,22,0.5)\"\n : \"rgba(199,255,46,0.4)\",\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M5 12h14\" />\n <path d=\"m12 5 7 7-7 7\" />\n </svg>\n </button>\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n borderTop: \"1px solid rgba(39,39,42,0.5)\",\n background: \"rgba(39,39,42,0.15)\",\n padding: \"8px 14px\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n fontSize: 10,\n color: \"#71717a\",\n }}\n >\n <span style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 11, height: 11 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 3v16a2 2 0 0 0 2 2h16\" />\n <path d=\"M18 17V9\" />\n <path d=\"M13 17V5\" />\n <path d=\"M8 17v-3\" />\n </svg>\n {formatVolume(match.combined_volume)}\n </span>\n {match.combined_volume_24h != null &&\n match.combined_volume_24h > 0 && (\n <span style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 11, height: 11 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z\" />\n </svg>\n {formatVolume(match.combined_volume_24h)}{\" \"}\n {t(\"predict.matches.vol24h\" as never)}\n </span>\n )}\n </div>\n {/* Confidence tier badge */}\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 4,\n fontSize: 10,\n color: \"#52525b\",\n }}\n >\n <span\n style={{\n width: 6,\n height: 6,\n borderRadius: \"50%\",\n background: confTheme.dot,\n flexShrink: 0,\n }}\n />\n {t(confTheme.label as never)}\n </span>\n </div>\n </div>\n );\n}\n\nfunction PlatformRow({\n source,\n market,\n isCheaper,\n onClick,\n href,\n LinkComponent,\n}: {\n source: ProviderSource | string;\n market: PredictMarket;\n isCheaper: boolean;\n onClick?: () => void;\n href?: string;\n LinkComponent?: LinkComponentType;\n}) {\n const { t } = useTranslation();\n const meta = getSourceMeta(source);\n const platColor = getPlatformColor(source);\n const yesPrice = getYesPrice(market);\n const outcomeName = getOutcomeName(market);\n const volume = market.volume;\n\n const content = (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"10px 12px\",\n cursor: href || onClick ? \"pointer\" : undefined,\n transition: \"background 0.15s\",\n background: isCheaper ? \"rgba(199,255,46,0.03)\" : \"transparent\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLDivElement).style.background = isCheaper\n ? \"rgba(199,255,46,0.06)\"\n : \"rgba(255,255,255,0.02)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLDivElement).style.background = isCheaper\n ? \"rgba(199,255,46,0.03)\"\n : \"transparent\";\n }}\n onClick={onClick}\n >\n {/* Cheaper indicator */}\n {isCheaper ? (\n <span style={{ fontSize: 10, color: \"#c7ff2e\", flexShrink: 0 }}>★</span>\n ) : (\n <span style={{ width: 10, flexShrink: 0 }} />\n )}\n\n {/* Platform icon + name */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 5,\n width: 90,\n flexShrink: 0,\n }}\n >\n {meta.icon}\n <span\n style={{\n fontSize: 10,\n fontWeight: 600,\n letterSpacing: \"0.04em\",\n color: platColor.text,\n textTransform: \"uppercase\" as const,\n }}\n >\n {meta.label}\n </span>\n </div>\n\n {/* Outcome name + volume */}\n <div\n style={{\n flex: 1,\n minWidth: 0,\n display: \"flex\",\n flexDirection: \"column\" as const,\n gap: 1,\n }}\n >\n {outcomeName && (\n <span\n style={{\n fontSize: 10,\n color: \"#71717a\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\" as const,\n }}\n >\n {outcomeName}\n </span>\n )}\n <span style={{ fontSize: 9, color: \"#52525b\" }}>\n {formatVolume(volume)} {t(\"predict.matches.volume\" as never)}\n </span>\n </div>\n\n {/* Price */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"baseline\",\n gap: 3,\n flexShrink: 0,\n }}\n >\n <span\n style={{\n fontSize: 18,\n fontWeight: 700,\n fontVariantNumeric: \"tabular-nums\",\n color: isCheaper ? \"#c7ff2e\" : \"#f4f4f5\",\n }}\n >\n {yesPrice != null ? (yesPrice * 100).toFixed(1) : \"-\"}\n </span>\n <span style={{ fontSize: 9, color: \"#71717a\" }}>\n {t(\"predict.matches.centsYes\" as never)}\n </span>\n </div>\n\n {/* External link icon */}\n <svg\n viewBox=\"0 0 24 24\"\n className=\"opacity-0 group-hover:opacity-100 transition-opacity\"\n style={{\n width: 10,\n height: 10,\n color: \"#52525b\",\n flexShrink: 0,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M7 7h10v10\" />\n <path d=\"M7 17 17 7\" />\n </svg>\n </div>\n );\n\n if (href && LinkComponent) {\n return (\n <LinkComponent href={href} className=\"block\">\n {content}\n </LinkComponent>\n );\n }\n\n return content;\n}\n","import {\n useState,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n forwardRef,\n} from \"react\";\nimport { keepPreviousData } from \"@tanstack/react-query\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type {\n MatchSortField,\n MatchMarketFlat,\n ProviderSource,\n} from \"@liberfi.io/react-predict\";\nimport { useInfiniteMatchMarkets } from \"@liberfi.io/react-predict\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { MatchMarketCard } from \"./match-market-card.ui\";\nimport type { MatchesHeroStats } from \"./matches-hero.ui\";\n\nexport interface MatchesWidgetRef {\n refetch: () => void;\n}\n\nexport interface MatchesWidgetProps {\n sortBy: MatchSortField;\n sortAsc: boolean;\n minVolume?: number;\n onSelect?: (match: MatchMarketFlat, source: ProviderSource) => void;\n onHover?: (match: MatchMarketFlat) => void;\n getMarketHref?: (\n match: MatchMarketFlat,\n source: ProviderSource,\n ) => string | undefined;\n LinkComponent?: LinkComponentType;\n onStatsChange?: (stats: MatchesHeroStats) => void;\n /** @deprecated Use onSelect instead */\n onSelectEntry?: (event: never) => void;\n /** @deprecated Use getMarketHref instead */\n getEventHref?: (event: never) => string;\n}\n\nexport const MatchesWidget = forwardRef<MatchesWidgetRef, MatchesWidgetProps>(\n function MatchesWidget(\n {\n sortBy,\n sortAsc,\n minVolume,\n onSelect,\n onHover,\n getMarketHref,\n LinkComponent,\n onStatsChange,\n },\n ref,\n ) {\n const { t } = useTranslation();\n\n const {\n data,\n hasNextPage,\n fetchNextPage,\n isFetchingNextPage,\n isLoading,\n isPlaceholderData,\n refetch,\n } = useInfiniteMatchMarkets(\n {\n sort_by: sortBy,\n sort_asc: sortAsc,\n min_volume: minVolume,\n status: \"active\",\n limit: 20,\n },\n { placeholderData: keepPreviousData },\n );\n\n const [animKey, setAnimKey] = useState(0);\n const [prevIsPlaceholder, setPrevIsPlaceholder] = useState(false);\n\n if (prevIsPlaceholder && !isPlaceholderData) {\n setPrevIsPlaceholder(false);\n setAnimKey((k) => k + 1);\n } else if (isPlaceholderData && !prevIsPlaceholder) {\n setPrevIsPlaceholder(true);\n }\n\n // staggerBase removed: rendering iterates pages directly so each card's\n // animation delay is stable across page loads (no mass DOM reflow).\n\n useImperativeHandle(\n ref,\n () => ({\n refetch: () => {\n refetch();\n },\n }),\n [refetch],\n );\n\n const allMatches = useMemo(\n () => data?.pages.flatMap((p) => p.items ?? []) ?? [],\n [data],\n );\n\n const total = data?.pages[0]?.total;\n\n const stats = useMemo<MatchesHeroStats>(() => {\n let maxSpread = 0;\n let totalVolume = 0;\n let highSpreadCount = 0;\n\n for (const m of allMatches) {\n const spread = m.spread ?? 0;\n if (spread > maxSpread) maxSpread = spread;\n if (spread >= 0.03) highSpreadCount++;\n if (m.combined_volume != null) {\n totalVolume += m.combined_volume;\n }\n }\n\n return {\n activePairs: total ?? allMatches.length,\n maxSpread,\n highSpreadCount,\n totalVolume,\n };\n }, [allMatches, total]);\n\n useEffect(() => {\n if (stats.activePairs > 0) {\n onStatsChange?.(stats);\n }\n }, [stats, onStatsChange]);\n\n const sentinelRef = useRef<HTMLDivElement>(null);\n\n const handleScrollToTop = useCallback(() => {\n window.scrollTo({ top: 0, behavior: \"smooth\" });\n }, []);\n\n useEffect(() => {\n const el = sentinelRef.current;\n if (!el) return;\n const observer = new IntersectionObserver(\n (entries) => {\n if (\n entries[0]?.isIntersecting &&\n hasNextPage &&\n !isFetchingNextPage\n ) {\n fetchNextPage();\n }\n },\n { rootMargin: \"200px\" },\n );\n observer.observe(el);\n return () => observer.disconnect();\n }, [hasNextPage, isFetchingNextPage, fetchNextPage]);\n\n useEffect(() => {\n if (!hasNextPage) return;\n document.documentElement.style.overscrollBehaviorY = \"none\";\n return () => {\n document.documentElement.style.overscrollBehaviorY = \"\";\n };\n }, [hasNextPage]);\n\n if (isLoading) {\n return <MatchesSkeletonList />;\n }\n\n if (allMatches.length === 0) {\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"80px 0\",\n color: \"rgba(255,255,255,0.35)\",\n }}\n >\n <p style={{ fontSize: 18 }}>{t(\"predict.matches.empty\")}</p>\n </div>\n );\n }\n\n const showEndOfList = !hasNextPage && allMatches.length > 0;\n\n return (\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 16 }}>\n <style>{`\n@media(max-width:1023px){.matches-card-grid{grid-template-columns:1fr!important}}\n@keyframes matchCardEnter{from{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}\n`}</style>\n <div\n className=\"matches-card-grid\"\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(2, 1fr)\",\n gap: 16,\n }}\n >\n {data?.pages.map((page) =>\n page.items?.map((match, itemIndex) => (\n <div\n key={`${animKey}-${match.match_id}-${match.source_a}-${match.market_a?.slug ?? itemIndex}`}\n style={{\n animation: `matchCardEnter 0.45s cubic-bezier(0.34,1.56,0.64,1) ${itemIndex * 35}ms both`,\n }}\n >\n <MatchMarketCard\n match={match}\n onSelect={onSelect}\n onHover={onHover}\n getMarketHref={getMarketHref}\n LinkComponent={LinkComponent}\n />\n </div>\n )),\n )}\n </div>\n\n {/* Infinite scroll sentinel */}\n <div\n ref={sentinelRef}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 8,\n padding: \"16px 0\",\n minHeight: 1,\n }}\n >\n <style>{`@keyframes match-load-spin{to{transform:rotate(360deg)}}`}</style>\n {isFetchingNextPage && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n color: \"#71717a\",\n fontSize: 13,\n }}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ animation: \"match-load-spin 1s linear infinite\" }}\n >\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n {t(\"predict.matches.loadMore\")}\n </div>\n )}\n </div>\n\n {showEndOfList && (\n <MatchesEndOfList onScrollToTop={handleScrollToTop} />\n )}\n </div>\n );\n },\n);\n\nfunction MatchesEndOfList({ onScrollToTop }: { onScrollToTop?: () => void }) {\n const { t } = useTranslation();\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 16,\n padding: \"24px 0\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 16,\n width: \"100%\",\n }}\n >\n <div\n style={{ height: 1, width: 64, background: \"rgba(82,82,91,0.5)\" }}\n />\n <span style={{ fontSize: 12, fontWeight: 500, color: \"#71717a\" }}>\n {t(\"predict.matches.endOfList\" as never)}\n </span>\n <div\n style={{ height: 1, width: 64, background: \"rgba(82,82,91,0.5)\" }}\n />\n </div>\n <button\n type=\"button\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n fontSize: 12,\n fontWeight: 500,\n color: \"#a1a1aa\",\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: 0,\n }}\n onClick={onScrollToTop}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 19V5\" />\n <path d=\"m5 12 7-7 7 7\" />\n </svg>\n <span>{t(\"predict.matches.backToTop\" as never)}</span>\n </button>\n </div>\n );\n}\n\nfunction MatchesSkeletonList() {\n return (\n <>\n <style>{`@keyframes shimmer{0%{background-position:200% 0}100%{background-position:-200% 0}}@media(max-width:1023px){.matches-skeleton-grid{grid-template-columns:1fr!important}}`}</style>\n <div\n className=\"matches-skeleton-grid\"\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(2, 1fr)\",\n gap: 16,\n }}\n >\n {Array.from({ length: 6 }).map((_, i) => (\n <SkeletonCard key={i} index={i} />\n ))}\n </div>\n </>\n );\n}\n\nfunction SkeletonCard({ index }: { index: number }) {\n const delay = index * 150;\n const shimmer: React.CSSProperties = {\n background:\n \"linear-gradient(90deg, rgba(255,255,255,0.03) 25%, rgba(255,255,255,0.06) 50%, rgba(255,255,255,0.03) 75%)\",\n backgroundSize: \"200% 100%\",\n animation: `shimmer 1.8s ease-in-out infinite ${delay}ms`,\n borderRadius: 6,\n };\n\n return (\n <div\n style={{\n borderRadius: 16,\n border: \"1px solid rgba(39,39,42,0.6)\",\n background: \"rgba(24,24,27,0.4)\",\n overflow: \"hidden\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n justifyContent: \"space-between\",\n padding: \"16px 16px 12px\",\n }}\n >\n <div\n style={{\n ...shimmer,\n height: 14,\n width: index % 2 === 0 ? \"75%\" : \"60%\",\n }}\n />\n <div\n style={{\n ...shimmer,\n height: 24,\n width: 64,\n borderRadius: 10,\n flexShrink: 0,\n marginLeft: 12,\n }}\n />\n </div>\n\n <div\n style={{\n display: \"grid\",\n gridTemplateColumns: \"1fr 1fr\",\n gap: 16,\n padding: \"0 16px\",\n }}\n >\n {[0, 1].map((j) => (\n <div\n key={j}\n style={{\n borderRadius: 12,\n border: \"1px solid rgba(255,255,255,0.04)\",\n background: \"rgba(255,255,255,0.02)\",\n padding: 12,\n display: \"flex\",\n flexDirection: \"column\" as const,\n gap: 8,\n }}\n >\n <div style={{ ...shimmer, height: 10, width: 72 }} />\n <div style={{ ...shimmer, height: 10, width: 48 }} />\n <div style={{ ...shimmer, height: 20, width: 56 }} />\n <div style={{ ...shimmer, height: 10, width: 60, marginTop: 4 }} />\n </div>\n ))}\n </div>\n\n <div style={{ padding: \"12px 16px\" }}>\n <div\n style={{\n ...shimmer,\n height: 36,\n borderRadius: 10,\n width: \"100%\",\n }}\n />\n </div>\n\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n borderTop: \"1px solid rgba(39,39,42,0.5)\",\n padding: \"10px 16px\",\n }}\n >\n <div style={{ display: \"flex\", gap: 12 }}>\n <div style={{ ...shimmer, height: 10, width: 40 }} />\n <div style={{ ...shimmer, height: 10, width: 50 }} />\n </div>\n <div style={{ ...shimmer, height: 10, width: 56 }} />\n </div>\n </div>\n );\n}\n","import {\n useState,\n useCallback,\n useRef,\n useEffect,\n startTransition,\n} from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type {\n MatchSortField,\n MatchMarketFlat,\n ProviderSource,\n} from \"@liberfi.io/react-predict\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { MatchesFilterBar } from \"./matches-filter-bar.ui\";\nimport { MatchesHero, type MatchesHeroStats } from \"./matches-hero.ui\";\nimport { MatchesWidget, type MatchesWidgetRef } from \"./matches.widget\";\n\nconst SORT_TITLE_KEY: Record<MatchSortField, string> = {\n spread: \"predict.matches.topOpportunities\",\n volume: \"predict.matches.highestVolume\",\n confidence: \"predict.matches.trendingToday\",\n};\n\nexport interface MatchesPageProps {\n onSelect?: (match: MatchMarketFlat, source: ProviderSource) => void;\n onHover?: (match: MatchMarketFlat) => void;\n getMarketHref?: (\n match: MatchMarketFlat,\n source: ProviderSource,\n ) => string | undefined;\n LinkComponent?: LinkComponentType;\n /** Path to the hero background image (e.g. \"/matches-bg.webp\") */\n bgImageSrc?: string;\n /** @deprecated Use onSelect instead */\n onSelectEntry?: (event: never) => void;\n /** @deprecated Use getMarketHref instead */\n getEventHref?: (event: never) => string;\n}\n\nfunction StatusClock() {\n const [time, setTime] = useState(\"\");\n\n useEffect(() => {\n const fmt = () => {\n const d = new Date();\n return `${String(d.getHours()).padStart(2, \"0\")}:${String(d.getMinutes()).padStart(2, \"0\")}`;\n };\n setTime(fmt());\n const id = setInterval(() => setTime(fmt()), 10_000);\n return () => clearInterval(id);\n }, []);\n\n return <span>{time}</span>;\n}\n\nfunction MatchesStatusBar({ stats }: { stats?: MatchesHeroStats }) {\n const { t } = useTranslation();\n return (\n <>\n <style>{`@media(max-width:768px){.matches-status-bar{display:none!important}}`}</style>\n <div\n className=\"matches-status-bar\"\n style={{\n position: \"fixed\",\n bottom: 0,\n left: 0,\n right: 0,\n height: 28,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"0 12px\",\n background: \"rgba(12,12,13,0.8)\",\n borderTop: \"1px solid rgba(39,39,42,0.6)\",\n fontSize: 11,\n color: \"rgba(255,255,255,0.4)\",\n zIndex: 50,\n backdropFilter: \"blur(12px)\",\n WebkitBackdropFilter: \"blur(12px)\",\n flexShrink: 0,\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 12 }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 6 }}>\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12, color: \"#00bc7d\" }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 20h.01\" />\n <path d=\"M2 8.82a15 15 0 0 1 20 0\" />\n <path d=\"M5 12.859a10 10 0 0 1 14 0\" />\n <path d=\"M8.5 16.429a5 5 0 0 1 7 0\" />\n </svg>\n <span style={{ color: \"#00bc7d\", fontWeight: 500 }}>\n {t(\"predict.matches.status.live\" as never)}\n </span>\n </div>\n {/* Vertical divider */}\n <div\n style={{ width: 1, height: 14, background: \"rgba(39,39,42,0.8)\" }}\n />\n {stats && (\n <div\n className=\"hidden sm:flex\"\n style={{ alignItems: \"center\", gap: 12 }}\n >\n <span\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n color: \"#71717a\",\n }}\n >\n {/* lucide activity */}\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2\" />\n </svg>\n <span style={{ color: \"#52525b\" }}>\n {t(\"predict.matches.status.markets\" as never)}\n </span>\n <span\n style={{\n color: \"#d4d4d8\",\n fontWeight: 500,\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n {stats.activePairs.toLocaleString()}\n </span>\n </span>\n <span\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n color: \"#71717a\",\n }}\n >\n {/* lucide chart-column */}\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 3v16a2 2 0 0 0 2 2h16\" />\n <path d=\"M18 17V9\" />\n <path d=\"M13 17V5\" />\n <path d=\"M8 17v-3\" />\n </svg>\n <span style={{ color: \"#52525b\" }}>\n {t(\"predict.matches.status.vol24h\" as never)}\n </span>\n <span\n style={{\n color: \"#d4d4d8\",\n fontWeight: 500,\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n {stats.totalVolume >= 1_000_000\n ? `$${(stats.totalVolume / 1_000_000).toFixed(1)}M`\n : stats.totalVolume >= 1_000\n ? `$${Math.round(stats.totalVolume / 1_000)}K`\n : `$${stats.totalVolume}`}\n </span>\n </span>\n </div>\n )}\n </div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n {/* Docs link with lucide-file-text icon */}\n <a\n href=\"#\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"4px 8px\",\n borderRadius: 4,\n color: \"#71717a\",\n textDecoration: \"none\",\n transition: \"color 0.15s, background 0.15s\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLAnchorElement).style.color = \"#d4d4d8\";\n (e.currentTarget as HTMLAnchorElement).style.background =\n \"rgba(39,39,42,0.5)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLAnchorElement).style.color = \"#71717a\";\n (e.currentTarget as HTMLAnchorElement).style.background =\n \"transparent\";\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\" />\n <path d=\"M14 2v4a2 2 0 0 0 2 2h4\" />\n <path d=\"M10 9H8\" />\n <path d=\"M16 13H8\" />\n <path d=\"M16 17H8\" />\n </svg>\n <span className=\"hidden lg:inline\">\n {t(\"predict.matches.status.docs\" as never)}\n </span>\n </a>\n {/* X link with X icon */}\n <a\n href=\"#\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"4px 8px\",\n borderRadius: 4,\n color: \"#71717a\",\n textDecoration: \"none\",\n transition: \"color 0.15s, background 0.15s\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLAnchorElement).style.color = \"#d4d4d8\";\n (e.currentTarget as HTMLAnchorElement).style.background =\n \"rgba(39,39,42,0.5)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLAnchorElement).style.color = \"#71717a\";\n (e.currentTarget as HTMLAnchorElement).style.background =\n \"transparent\";\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"currentColor\"\n >\n <path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\" />\n </svg>\n <span className=\"hidden lg:inline\">X</span>\n </a>\n {/* Divider */}\n <div\n style={{\n width: 1,\n height: 14,\n background: \"rgba(39,39,42,0.8)\",\n margin: \"0 4px\",\n }}\n />\n {/* Watchlist */}\n <button\n type=\"button\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"4px 8px\",\n borderRadius: 4,\n color: \"#71717a\",\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 11,\n transition: \"color 0.15s, background 0.15s\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLButtonElement).style.color = \"#d4d4d8\";\n (e.currentTarget as HTMLButtonElement).style.background =\n \"rgba(39,39,42,0.5)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLButtonElement).style.color = \"#71717a\";\n (e.currentTarget as HTMLButtonElement).style.background =\n \"transparent\";\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\" />\n </svg>\n <span className=\"hidden lg:inline\">\n {t(\"predict.matches.status.watchlist\" as never)}\n </span>\n </button>\n <button\n type=\"button\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"4px 8px\",\n borderRadius: 4,\n color: \"#71717a\",\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 11,\n transition: \"color 0.15s, background 0.15s\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLButtonElement).style.color = \"#d4d4d8\";\n (e.currentTarget as HTMLButtonElement).style.background =\n \"rgba(39,39,42,0.5)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLButtonElement).style.color = \"#71717a\";\n (e.currentTarget as HTMLButtonElement).style.background =\n \"transparent\";\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2.5\" />\n <path d=\"M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4\" />\n </svg>\n <span className=\"hidden lg:inline\">\n {t(\"predict.matches.status.portfolio\" as never)}\n </span>\n </button>\n <button\n type=\"button\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"4px 8px\",\n borderRadius: 4,\n color: \"#71717a\",\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: 11,\n transition: \"color 0.15s, background 0.15s\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLButtonElement).style.color = \"#d4d4d8\";\n (e.currentTarget as HTMLButtonElement).style.background =\n \"rgba(39,39,42,0.5)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLButtonElement).style.color = \"#71717a\";\n (e.currentTarget as HTMLButtonElement).style.background =\n \"transparent\";\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\" />\n <path d=\"M12 17h.01\" />\n </svg>\n <span className=\"hidden lg:inline\">\n {t(\"predict.matches.status.help\" as never)}\n </span>\n </button>\n {/* Divider */}\n <div\n style={{\n width: 1,\n height: 14,\n background: \"rgba(39,39,42,0.8)\",\n margin: \"0 4px\",\n }}\n />\n {/* Clock */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n color: \"#71717a\",\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polyline points=\"12 6 12 12 16 14\" />\n </svg>\n <StatusClock />\n </div>\n </div>\n </div>\n </>\n );\n}\n\nexport function MatchesPage({\n onSelect,\n onHover,\n getMarketHref,\n LinkComponent,\n bgImageSrc,\n}: MatchesPageProps) {\n const { t } = useTranslation();\n\n const [sortBy, setSortBy] = useState<MatchSortField>(\"spread\");\n const [sortAsc, setSortAsc] = useState(false);\n const [minVolume, setMinVolume] = useState<number | undefined>(5_000);\n const [heroStats, setHeroStats] = useState<MatchesHeroStats | undefined>();\n const widgetRef = useRef<MatchesWidgetRef>(null);\n\n const handleSortChange = useCallback((sort: MatchSortField) => {\n setSortBy(sort);\n }, []);\n\n const handleSortAscChange = useCallback((asc: boolean) => {\n setSortAsc(asc);\n }, []);\n\n const handleStatsChange = useCallback((stats: MatchesHeroStats) => {\n startTransition(() => {\n setHeroStats(stats);\n });\n }, []);\n\n const handleRefresh = useCallback(() => {\n widgetRef.current?.refetch();\n }, []);\n\n return (\n <div\n style={{\n minHeight: \"100vh\",\n position: \"relative\",\n }}\n >\n {/* Entrance animation keyframes + dot grid */}\n <style>{`\n @keyframes matchFadeIn{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}\n .match-fade-in{animation:matchFadeIn .5s ease-out both}\n .match-fade-in-d1{animation:matchFadeIn .5s ease-out .1s both}\n .match-fade-in-d2{animation:matchFadeIn .5s ease-out .2s both}\n `}</style>\n {/* Hero section — relative overflow-hidden with border-b like matchr */}\n <div\n style={{\n position: \"relative\",\n overflow: \"hidden\",\n borderBottom: \"1px solid rgba(39,39,42,0.5)\",\n }}\n >\n {/* Background — single wide image with full-width light arcs */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n pointerEvents: \"none\",\n zIndex: 0,\n overflow: \"hidden\",\n }}\n >\n {bgImageSrc && (\n <img\n src={bgImageSrc}\n alt=\"\"\n aria-hidden=\"true\"\n style={{\n position: \"absolute\",\n inset: 0,\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n objectPosition: \"center center\",\n opacity: 0.3,\n mixBlendMode: \"lighten\" as const,\n maskImage:\n \"linear-gradient(to bottom, black 50%, transparent 100%)\",\n WebkitMaskImage:\n \"linear-gradient(to bottom, black 50%, transparent 100%)\",\n }}\n />\n )}\n {/* Dot grid texture */}\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n opacity: 0.025,\n backgroundImage:\n \"radial-gradient(circle at 1px 1px, rgb(255 255 255) 1px, transparent 0)\",\n backgroundSize: \"20px 20px\",\n }}\n />\n </div>\n <style>{`.matches-hero-wrap{padding:40px 16px 32px}@media(min-width:640px){.matches-hero-wrap{padding:48px 24px 40px}}@media(min-width:1024px){.matches-hero-wrap{padding:52px 32px 44px}}`}</style>\n <div\n className=\"match-fade-in matches-hero-wrap\"\n style={{\n position: \"relative\",\n zIndex: 2,\n maxWidth: 1152,\n margin: \"0 auto\",\n }}\n >\n <MatchesHero stats={heroStats} />\n </div>\n </div>\n\n {/* Sticky toolbar — full-width background, inner max-w-6xl */}\n <div\n style={{\n position: \"sticky\",\n top: 0,\n zIndex: 40,\n background: \"rgba(10,10,11,0.8)\",\n backdropFilter: \"blur(24px)\",\n WebkitBackdropFilter: \"blur(24px)\",\n borderBottom: \"1px solid rgba(39,39,42,0.5)\",\n }}\n >\n <style>{`.matches-toolbar-inner{padding:12px 16px}@media(min-width:640px){.matches-toolbar-inner{padding:12px 24px}}@media(min-width:1024px){.matches-toolbar-inner{padding:12px 32px}}`}</style>\n <div\n className=\"matches-toolbar-inner\"\n style={{\n maxWidth: 1152,\n margin: \"0 auto\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 12,\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n minWidth: 0,\n }}\n >\n <div\n className=\"hidden sm:flex\"\n style={{\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 32,\n height: 32,\n borderRadius: 10,\n background:\n \"linear-gradient(to bottom right, rgba(199,255,46,0.15), rgba(23,201,100,0.15))\",\n border: \"1px solid rgba(199,255,46,0.15)\",\n flexShrink: 0,\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 16, height: 16, color: \"#c7ff2e\" }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z\" />\n <path d=\"M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12\" />\n <path d=\"M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17\" />\n </svg>\n </div>\n <div style={{ minWidth: 0 }}>\n <h2\n style={{\n fontSize: 14,\n fontWeight: 600,\n color: \"#fff\",\n margin: 0,\n letterSpacing: \"-0.28px\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\" as const,\n }}\n >\n {t(SORT_TITLE_KEY[sortBy] as never)}\n </h2>\n {heroStats && heroStats.activePairs > 0 && (\n <p\n className=\"hidden sm:block\"\n style={{ fontSize: 11, color: \"#71717a\", margin: 0 }}\n >\n {t(\"predict.matches.pairsFound\" as never, {\n count: heroStats.activePairs,\n })}\n </p>\n )}\n </div>\n </div>\n <MatchesFilterBar\n sortBy={sortBy}\n onSortChange={handleSortChange}\n sortAsc={sortAsc}\n onSortAscChange={handleSortAscChange}\n minVolume={minVolume}\n onMinVolumeChange={setMinVolume}\n onRefresh={handleRefresh}\n />\n </div>\n </div>\n\n {/* Content — card grid + disclaimer, responsive padding + pb-20 */}\n <style>{`.matches-content-wrap{padding:24px 16px 80px}@media(min-width:640px){.matches-content-wrap{padding:32px 24px 80px}}@media(min-width:1024px){.matches-content-wrap{padding:24px 32px 80px}}`}</style>\n <div\n className=\"match-fade-in-d2 matches-content-wrap\"\n style={{\n position: \"relative\",\n maxWidth: 1152,\n margin: \"0 auto\",\n }}\n >\n {/* Disclaimer — shown above list so infinite scroll doesn't push it out of view */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n marginBottom: 16,\n padding: \"8px 12px\",\n borderRadius: 8,\n border: \"1px solid rgba(39,39,42,0.4)\",\n background: \"rgba(24,24,27,0.25)\",\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 14,\n height: 14,\n color: \"#52525b\",\n flexShrink: 0,\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\" />\n </svg>\n <p\n style={{\n fontSize: 11,\n color: \"#52525b\",\n lineHeight: 1.5,\n margin: 0,\n }}\n >\n <span style={{ color: \"#71717a\", fontWeight: 500 }}>\n {t(\"predict.matches.experimentalFeature\" as const)}\n </span>\n {\" — \"}\n {t(\"predict.matches.disclaimer\" as const)}\n </p>\n </div>\n\n <MatchesWidget\n ref={widgetRef}\n sortBy={sortBy}\n sortAsc={sortAsc}\n minVolume={minVolume}\n onSelect={onSelect}\n onHover={onHover}\n getMarketHref={getMarketHref}\n LinkComponent={LinkComponent}\n onStatsChange={handleStatsChange}\n />\n </div>\n <MatchesStatusBar stats={heroStats} />\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type {\n MatchGroup,\n MatchGroupMarket,\n PredictEvent,\n} from \"@liberfi.io/react-predict\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { getSourceMeta } from \"./source-badge.ui\";\n\nexport interface MatchGroupCardProps {\n group: MatchGroup;\n onSelectEntry?: (event: PredictEvent) => void;\n getEventHref?: (event: PredictEvent) => string;\n LinkComponent?: LinkComponentType;\n}\n\nfunction formatVolume(vol: number | null | undefined): string {\n if (vol == null) return \"-\";\n if (vol >= 1_000_000) return `$${(vol / 1_000_000).toFixed(1)}M`;\n if (vol >= 1_000) return `$${Math.round(vol / 1_000)}K`;\n return `$${vol.toFixed(0)}`;\n}\n\ninterface PlatformData {\n source: string;\n outcomeName: string | null;\n yesPrice: number | null;\n volume: number | null;\n event?: PredictEvent;\n}\n\nconst PLATFORM_COLORS: Record<\n string,\n {\n text: string;\n border: string;\n hoverBorder: string;\n bg: string;\n priceColor: string;\n priceActiveColor: string;\n }\n> = {\n polymarket: {\n text: \"#50a2ff\",\n border: \"rgba(43,127,255,0.15)\",\n hoverBorder: \"rgba(43,127,255,0.3)\",\n bg: \"rgba(43,127,255,0.05)\",\n priceColor: \"rgba(244,244,245,1)\",\n priceActiveColor: \"rgba(244,244,245,1)\",\n },\n kalshi: {\n text: \"#00d492\",\n border: \"rgba(0,212,146,0.15)\",\n hoverBorder: \"rgba(0,212,146,0.3)\",\n bg: \"rgba(0,212,146,0.05)\",\n priceColor: \"#00d492\",\n priceActiveColor: \"#00d492\",\n },\n};\n\nconst DEFAULT_PLATFORM_COLORS = {\n text: \"#9ca3af\",\n border: \"rgba(156,163,175,0.15)\",\n hoverBorder: \"rgba(156,163,175,0.3)\",\n bg: \"rgba(156,163,175,0.05)\",\n priceColor: \"rgba(244,244,245,1)\",\n priceActiveColor: \"rgba(244,244,245,1)\",\n};\n\nfunction getPlatformColors(source: string) {\n return PLATFORM_COLORS[source] ?? DEFAULT_PLATFORM_COLORS;\n}\n\nfunction getBestMarketPair(group: MatchGroup): MatchGroupMarket | null {\n if (!group.matched_markets?.length) return null;\n let best: MatchGroupMarket | null = null;\n let bestSpread = -1;\n for (const m of group.matched_markets) {\n const spread = m.spread ?? 0;\n if (spread > bestSpread) {\n bestSpread = spread;\n best = m;\n }\n }\n return best;\n}\n\nfunction extractPlatformData(\n group: MatchGroup,\n pair: MatchGroupMarket | null,\n): [PlatformData, PlatformData] {\n const entryA = group.entries.find(\n (e) => e.source === (pair?.source_a ?? group.entries[0]?.source),\n );\n const entryB = group.entries.find(\n (e) => e.source === (pair?.source_b ?? group.entries[1]?.source),\n );\n\n const getOutcome = (market: MatchGroupMarket[\"market_a\"] | undefined) => {\n if (!market?.outcomes?.[0]) return { name: null, price: null };\n const o = market.outcomes[0];\n return {\n name: o.label || null,\n price: o.best_ask ?? o.price ?? null,\n };\n };\n\n const oA = getOutcome(pair?.market_a);\n const oB = getOutcome(pair?.market_b);\n\n return [\n {\n source: pair?.source_a ?? entryA?.source ?? \"unknown\",\n outcomeName: oA.name,\n yesPrice: oA.price,\n volume: entryA?.event?.volume ?? null,\n event: entryA?.event,\n },\n {\n source: pair?.source_b ?? entryB?.source ?? \"unknown\",\n outcomeName: oB.name,\n yesPrice: oB.price,\n volume: entryB?.event?.volume ?? null,\n event: entryB?.event,\n },\n ];\n}\n\nexport function MatchGroupCard({\n group,\n onSelectEntry,\n getEventHref,\n LinkComponent,\n}: MatchGroupCardProps) {\n const { t } = useTranslation();\n const bestPair = useMemo(() => getBestMarketPair(group), [group]);\n const spreadPercent =\n group.max_spread != null ? group.max_spread * 100 : null;\n\n const [platA, platB] = useMemo(\n () => extractPlatformData(group, bestPair),\n [group, bestPair],\n );\n\n const isHighSpread = spreadPercent != null && spreadPercent >= 3;\n const cheaperIsKalshi =\n platA.yesPrice != null && platB.yesPrice != null\n ? platA.source === \"kalshi\"\n ? platA.yesPrice > platB.yesPrice\n : platB.yesPrice > platA.yesPrice\n : false;\n\n const cheapest =\n platA.yesPrice != null && platB.yesPrice != null\n ? platA.yesPrice <= platB.yesPrice\n ? platA\n : platB\n : null;\n const cheapestMeta = cheapest ? getSourceMeta(cheapest.source) : null;\n\n const ctaAccent = isHighSpread ? \"amber\" : \"violet\";\n\n return (\n <div\n className=\"group\"\n style={{\n borderRadius: 16,\n border: \"1px solid rgba(39,39,42,0.6)\",\n background: \"rgba(24,24,27,0.4)\",\n overflow: \"hidden\",\n transition: \"all 0.2s\",\n position: \"relative\",\n }}\n onMouseEnter={(e) => {\n const el = e.currentTarget as HTMLDivElement;\n el.style.borderColor = \"rgba(63,63,70,0.6)\";\n el.style.boxShadow = \"0 10px 15px -3px rgba(0,0,0,0.2)\";\n }}\n onMouseLeave={(e) => {\n const el = e.currentTarget as HTMLDivElement;\n el.style.borderColor = \"rgba(39,39,42,0.6)\";\n el.style.boxShadow = \"none\";\n }}\n >\n {/* Spread badge — absolute top-3 right-3 */}\n {spreadPercent != null && (\n <span\n style={{\n position: \"absolute\",\n top: 12,\n right: 12,\n zIndex: 10,\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 4,\n borderRadius: 10,\n padding: \"4px 10px\",\n fontSize: 12,\n fontWeight: 600,\n border: `1px solid ${\n isHighSpread\n ? \"rgba(255,185,0,0.3)\"\n : spreadPercent >= 2\n ? \"rgba(166,132,255,0.3)\"\n : \"rgba(156,163,175,0.3)\"\n }`,\n background: isHighSpread\n ? \"rgba(255,185,0,0.15)\"\n : spreadPercent >= 2\n ? \"rgba(166,132,255,0.15)\"\n : \"rgba(156,163,175,0.12)\",\n color: isHighSpread\n ? \"#ffb900\"\n : spreadPercent >= 2\n ? \"#a684ff\"\n : \"#9ca3af\",\n }}\n >\n {/* lucide zap */}\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\" />\n </svg>\n {spreadPercent.toFixed(1)}%\n </span>\n )}\n\n {/* Card body — p-4 */}\n <div style={{ padding: 16 }}>\n {/* Title */}\n <h3\n style={{\n fontSize: 14,\n fontWeight: 600,\n lineHeight: 1.375,\n letterSpacing: \"-0.28px\",\n color: \"#f4f4f5\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n display: \"-webkit-box\",\n WebkitLineClamp: 2,\n WebkitBoxOrient: \"vertical\" as const,\n paddingRight: 80,\n margin: \"0 0 16px\",\n }}\n >\n {group.title}\n </h3>\n\n {/* Platform entries — grid-cols-2 gap-3 */}\n <div\n style={{ display: \"grid\", gridTemplateColumns: \"1fr 1fr\", gap: 12 }}\n >\n <PlatformBlock\n data={platA}\n isCheaper={cheapest === platA}\n onSelect={onSelectEntry}\n getEventHref={getEventHref}\n LinkComponent={LinkComponent}\n />\n <PlatformBlock\n data={platB}\n isCheaper={cheapest === platB}\n onSelect={onSelectEntry}\n getEventHref={getEventHref}\n LinkComponent={LinkComponent}\n />\n </div>\n\n {/* CTA bar — amber (high spread) or violet (low) */}\n {cheapest && cheapestMeta && spreadPercent != null && (\n <div\n style={{\n marginTop: 12,\n padding: \"8px 12px\",\n borderRadius: 10,\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n cursor: \"pointer\",\n transition: \"all 0.15s\",\n border: `1px solid ${ctaAccent === \"amber\" ? \"rgba(255,185,0,0.15)\" : \"rgba(166,132,255,0.15)\"}`,\n background:\n ctaAccent === \"amber\"\n ? \"rgba(255,185,0,0.05)\"\n : \"rgba(166,132,255,0.05)\",\n }}\n onClick={() => cheapest.event && onSelectEntry?.(cheapest.event)}\n >\n {/* lucide zap */}\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 14,\n height: 14,\n flexShrink: 0,\n color: ctaAccent === \"amber\" ? \"#ffb900\" : \"#a684ff\",\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\" />\n </svg>\n <span\n style={{\n fontSize: 11,\n fontWeight: 500,\n color:\n ctaAccent === \"amber\"\n ? \"rgba(255,185,0,0.9)\"\n : \"rgba(166,132,255,0.9)\",\n }}\n >\n {t(\"predict.matches.buyEdge\" as never, {\n platform:\n cheapest.source.charAt(0).toUpperCase() +\n cheapest.source.slice(1),\n spread: spreadPercent.toFixed(1),\n })}\n </span>\n {/* lucide arrow-right */}\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 12,\n height: 12,\n marginLeft: \"auto\",\n color:\n ctaAccent === \"amber\"\n ? \"rgba(255,185,0,0.5)\"\n : \"rgba(166,132,255,0.5)\",\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M5 12h14\" />\n <path d=\"m12 5 7 7-7 7\" />\n </svg>\n </div>\n )}\n </div>\n\n {/* Footer meta — px-4 py-2.5 bg-zinc-800/20 border-t */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n borderTop: \"1px solid rgba(39,39,42,0.5)\",\n background: \"rgba(39,39,42,0.2)\",\n padding: \"10px 16px\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n fontSize: 10,\n color: \"#71717a\",\n }}\n >\n <span style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n {/* lucide bar-chart-3 */}\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 3v16a2 2 0 0 0 2 2h16\" />\n <path d=\"M18 17V9\" />\n <path d=\"M13 17V5\" />\n <path d=\"M8 17v-3\" />\n </svg>\n {formatVolume(group.combined_volume)}\n </span>\n {group.combined_volume_24h != null &&\n group.combined_volume_24h > 0 && (\n <span style={{ display: \"flex\", alignItems: \"center\", gap: 4 }}>\n {/* lucide flame */}\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z\" />\n </svg>\n {formatVolume(group.combined_volume_24h)}{\" \"}\n {t(\"predict.matches.vol24h\" as never)}\n </span>\n )}\n </div>\n {group.confidence != null && (\n <span\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n fontSize: 10,\n color: \"#52525b\",\n }}\n >\n {/* lucide activity */}\n <svg\n viewBox=\"0 0 24 24\"\n style={{ width: 12, height: 12 }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2\" />\n </svg>\n {Math.round(group.confidence * 100)}%{\" \"}\n {t(\"predict.matches.match\" as never)}\n </span>\n )}\n </div>\n </div>\n );\n}\n\nfunction PlatformBlock({\n data,\n isCheaper,\n onSelect,\n getEventHref,\n LinkComponent,\n}: {\n data: PlatformData;\n isCheaper: boolean;\n onSelect?: (event: PredictEvent) => void;\n getEventHref?: (event: PredictEvent) => string;\n LinkComponent?: LinkComponentType;\n}) {\n const { t } = useTranslation();\n const meta = getSourceMeta(data.source);\n const colors = getPlatformColors(data.source);\n const href = data.event ? getEventHref?.(data.event) : undefined;\n\n const content = (\n <div\n style={{\n borderRadius: 14,\n border: `1px solid ${colors.border}`,\n background: colors.bg,\n padding: 12,\n cursor: href || onSelect ? \"pointer\" : undefined,\n transition: \"border-color 0.15s\",\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLDivElement).style.borderColor =\n colors.hoverBorder;\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLDivElement).style.borderColor = colors.border;\n }}\n onClick={() => data.event && onSelect?.(data.event)}\n >\n {/* Platform name row */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n marginBottom: 8,\n }}\n >\n {meta.icon}\n <span\n style={{\n fontSize: 10,\n fontWeight: 600,\n letterSpacing: \"0.05em\",\n color: colors.text,\n textTransform: \"uppercase\" as const,\n }}\n >\n {meta.label}\n </span>\n {/* External link icon — group-hover:opacity-100 */}\n <svg\n viewBox=\"0 0 24 24\"\n className=\"opacity-0 group-hover:opacity-100 transition-opacity\"\n style={{\n width: 10,\n height: 10,\n color: \"#52525b\",\n marginLeft: \"auto\",\n }}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M7 7h10v10\" />\n <path d=\"M7 17 17 7\" />\n </svg>\n </div>\n\n {/* Outcome name — text-[10px] */}\n {data.outcomeName && (\n <div\n style={{\n fontSize: 10,\n color: \"#71717a\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\" as const,\n marginBottom: 8,\n }}\n >\n {data.outcomeName}\n </div>\n )}\n\n {/* Price — text-xl font-bold tabular-nums */}\n <div style={{ display: \"flex\", alignItems: \"baseline\", gap: 6 }}>\n <span\n style={{\n fontSize: 20,\n fontWeight: 700,\n fontVariantNumeric: \"tabular-nums\",\n color: isCheaper ? colors.priceActiveColor : colors.priceColor,\n }}\n >\n {data.yesPrice != null ? (data.yesPrice * 100).toFixed(1) : \"-\"}\n </span>\n <span style={{ fontSize: 10, color: \"#71717a\" }}>\n {t(\"predict.matches.centsYes\" as never)}\n </span>\n </div>\n\n {/* Volume — text-[10px] text-zinc-600 mt-1.5 */}\n <div style={{ fontSize: 10, color: \"#52525b\", marginTop: 6 }}>\n {formatVolume(data.volume)} {t(\"predict.matches.volume\" as never)}\n </div>\n </div>\n );\n\n if (href && LinkComponent) {\n return (\n <LinkComponent href={href} className=\"block\">\n {content}\n </LinkComponent>\n );\n }\n\n return content;\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { MatchGroup } from \"@liberfi.io/react-predict\";\n\nexport interface MatchesStatsBarProps {\n matches: MatchGroup[];\n total?: number;\n}\n\nfunction formatVolume(vol: number): string {\n if (vol >= 1_000_000) return `$${(vol / 1_000_000).toFixed(1)}M`;\n if (vol >= 1_000) return `$${(vol / 1_000).toFixed(1)}K`;\n return `$${vol.toFixed(0)}`;\n}\n\nexport function MatchesStatsBar({ matches, total }: MatchesStatsBarProps) {\n const { t } = useTranslation();\n\n const stats = useMemo(() => {\n let maxSpread = 0;\n let totalVolume = 0;\n const sources = new Set<string>();\n\n for (const group of matches) {\n if (group.max_spread != null && group.max_spread > maxSpread) {\n maxSpread = group.max_spread;\n }\n if (group.combined_volume != null) {\n totalVolume += group.combined_volume;\n }\n for (const entry of group.entries) {\n sources.add(typeof entry.source === \"string\" ? entry.source : \"\");\n }\n }\n\n return {\n count: total ?? matches.length,\n maxSpread,\n totalVolume,\n platformCount: sources.size,\n };\n }, [matches, total]);\n\n return (\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-2 rounded-xl border border-border/60 bg-background/50 px-4 py-3 text-sm\">\n <StatItem\n label={t(\"predict.matches.stats.matchedMarkets\")}\n value={stats.count.toLocaleString()}\n />\n <Separator />\n <StatItem\n label={t(\"predict.matches.stats.totalVolume\")}\n value={formatVolume(stats.totalVolume)}\n />\n <Separator />\n <StatItem\n label={t(\"predict.matches.stats.highestSpread\")}\n value={`${(stats.maxSpread * 100).toFixed(1)}¢`}\n valueClassName=\"text-green-400\"\n />\n <Separator />\n <StatItem\n label={t(\"predict.matches.stats.platforms\")}\n value={String(stats.platformCount)}\n />\n </div>\n );\n}\n\nfunction StatItem({\n label,\n value,\n valueClassName = \"text-slate-200\",\n}: {\n label: string;\n value: string;\n valueClassName?: string;\n}) {\n return (\n <div className=\"flex items-center gap-x-1.5\">\n <span className=\"text-neutral-500\">{label}:</span>\n <span className={`font-semibold ${valueClassName}`}>{value}</span>\n </div>\n );\n}\n\nfunction Separator() {\n return <span className=\"hidden text-neutral-700 sm:inline\">|</span>;\n}\n","import { cn } from \"@liberfi.io/ui\";\n\nexport interface SpreadIndicatorProps {\n spread: number | null | undefined;\n spreadPercent?: number | null;\n arbProfit?: number | null;\n className?: string;\n}\n\nfunction formatCents(value: number): string {\n return `${(value * 100).toFixed(1)}¢`;\n}\n\nfunction getSpreadColor(spread: number): string {\n if (spread >= 0.05) return \"text-green-400\";\n if (spread >= 0.02) return \"text-yellow-400\";\n return \"text-neutral-400\";\n}\n\nexport function SpreadIndicator({\n spread,\n arbProfit,\n className,\n}: SpreadIndicatorProps) {\n if (spread == null) return null;\n\n const hasArb = arbProfit != null && arbProfit > 0;\n\n return (\n <div className={cn(\"flex items-center gap-x-2\", className)}>\n <span className={cn(\"text-sm font-semibold\", getSpreadColor(spread))}>\n {formatCents(spread)}\n </span>\n {hasArb && (\n <span className=\"text-xs text-green-500/80\">\n +{formatCents(arbProfit!)}\n </span>\n )}\n </div>\n );\n}\n","import { useState, useMemo, useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n type PredictTrade,\n type TradeType,\n useInfiniteTrades,\n} from \"@liberfi.io/react-predict\";\nimport { cn, Skeleton, Spinner } from \"@liberfi.io/ui\";\n\nconst PAGE_SIZE = 10;\nconst ROW_HEIGHT = 64;\nconst HEADER_HEIGHT = 40;\nconst PAGINATION_HEIGHT = 48;\n\nexport interface ProfileHistoryProps {\n solanaAddress?: string;\n evmAddress?: string;\n listHeight: number;\n}\n\nexport function ProfileHistory({\n solanaAddress,\n evmAddress,\n listHeight,\n}: ProfileHistoryProps) {\n const { t } = useTranslation();\n const [currentPage, setCurrentPage] = useState(1);\n\n const {\n data: kalshiData,\n isLoading: kalshiLoading,\n fetchNextPage: fetchNextKalshi,\n hasNextPage: hasMoreKalshi,\n isFetchingNextPage: isFetchingKalshi,\n } = useInfiniteTrades({\n source: \"kalshi\",\n wallet: solanaAddress ?? \"\",\n limit: 50,\n });\n\n const {\n data: polyData,\n isLoading: polyLoading,\n fetchNextPage: fetchNextPoly,\n hasNextPage: hasMorePoly,\n isFetchingNextPage: isFetchingPoly,\n } = useInfiniteTrades({\n source: \"polymarket\",\n wallet: evmAddress ?? \"\",\n limit: 50,\n });\n\n const isLoading = kalshiLoading || polyLoading;\n const isFetchingMore = isFetchingKalshi || isFetchingPoly;\n const hasNextPage = hasMoreKalshi || hasMorePoly;\n\n const allTrades = useMemo(() => {\n const all: PredictTrade[] = [];\n if (kalshiData?.pages)\n all.push(...kalshiData.pages.flatMap((p) => p.items));\n if (polyData?.pages) all.push(...polyData.pages.flatMap((p) => p.items));\n all.sort((a, b) => (b.timestamp ?? 0) - (a.timestamp ?? 0));\n return all;\n }, [kalshiData, polyData]);\n\n const totalPages = Math.max(\n 1,\n Math.ceil(allTrades.length / PAGE_SIZE) + (hasNextPage ? 1 : 0),\n );\n const pageStart = (currentPage - 1) * PAGE_SIZE;\n const pageTrades = allTrades.slice(pageStart, pageStart + PAGE_SIZE);\n\n const handlePrev = useCallback(() => {\n setCurrentPage((p) => Math.max(1, p - 1));\n }, []);\n\n const handleNext = useCallback(async () => {\n const nextPageStart = currentPage * PAGE_SIZE;\n if (nextPageStart >= allTrades.length && hasNextPage) {\n if (hasMoreKalshi) await fetchNextKalshi();\n if (hasMorePoly) await fetchNextPoly();\n }\n setCurrentPage((p) => p + 1);\n }, [\n currentPage,\n allTrades.length,\n hasNextPage,\n hasMoreKalshi,\n hasMorePoly,\n fetchNextKalshi,\n fetchNextPoly,\n ]);\n\n const canGoPrev = currentPage > 1;\n const canGoNext = currentPage * PAGE_SIZE < allTrades.length || hasNextPage;\n\n if (isLoading) return <TabSkeleton height={listHeight} />;\n\n if (allTrades.length === 0 && !hasNextPage) {\n return (\n <EmptyState\n message={t(\"predict.profile.noHistory\")}\n height={listHeight}\n />\n );\n }\n\n const contentHeight = listHeight - HEADER_HEIGHT - PAGINATION_HEIGHT;\n\n return (\n <div className=\"flex flex-col\" style={{ height: listHeight }}>\n {/* Desktop header */}\n <div\n className=\"hidden lg:flex items-center text-neutral text-xs font-normal shrink-0 border-b border-border/50\"\n style={{ height: HEADER_HEIGHT }}\n >\n <div className=\"flex-[3] min-w-0 pr-2\">\n {t(\"predict.profile.event\")}\n </div>\n <div className=\"flex-1 pr-2\">{t(\"predict.profile.action\")}</div>\n <div className=\"flex-1 pr-2\">{t(\"predict.profile.status\")}</div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.profile.price\")}\n </div>\n <div className=\"flex-[1.5] pr-2 text-right\">\n {t(\"predict.profile.depositWithdraw\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">{t(\"predict.profile.pnl\")}</div>\n <div className=\"flex-1 pr-2 text-right\">{t(\"predict.profile.fee\")}</div>\n <div className=\"w-10 shrink-0\" />\n </div>\n\n {/* Desktop rows */}\n <div\n className=\"hidden lg:block overflow-y-auto\"\n style={{ height: contentHeight }}\n >\n {pageTrades.map((trade, i) => (\n <HistoryRowStatic\n key={trade.id ?? `${pageStart + i}`}\n trade={trade}\n />\n ))}\n {isFetchingMore && (\n <div className=\"flex justify-center items-center py-4\">\n <Spinner size=\"sm\" />\n </div>\n )}\n </div>\n\n {/* Desktop pagination */}\n <div\n className=\"hidden lg:flex items-center justify-center gap-2 shrink-0\"\n style={{ height: PAGINATION_HEIGHT }}\n >\n <button\n type=\"button\"\n disabled={!canGoPrev}\n onClick={handlePrev}\n className={cn(\n \"text-sm transition-colors cursor-pointer flex items-center gap-1\",\n canGoPrev\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n ← {t(\"predict.profile.previous\")}\n </button>\n\n {Array.from({ length: Math.min(totalPages, 5) }, (_, i) => {\n const page = i + 1;\n return (\n <button\n key={page}\n type=\"button\"\n onClick={() => setCurrentPage(page)}\n className={cn(\n \"w-8 h-8 rounded text-sm transition-colors cursor-pointer\",\n page === currentPage\n ? \"bg-foreground/10 text-foreground font-medium\"\n : \"text-neutral hover:text-foreground\",\n )}\n >\n {page}\n </button>\n );\n })}\n\n <button\n type=\"button\"\n disabled={!canGoNext}\n onClick={handleNext}\n className={cn(\n \"text-sm transition-colors cursor-pointer flex items-center gap-1\",\n canGoNext\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n {t(\"predict.profile.next\")} →\n </button>\n </div>\n\n {/* Mobile cards */}\n <div\n className=\"lg:hidden flex flex-col gap-2 overflow-y-auto py-2\"\n style={{ height: listHeight - PAGINATION_HEIGHT }}\n >\n {pageTrades.map((trade, i) => (\n <HistoryCard key={trade.id ?? `m-${pageStart + i}`} trade={trade} />\n ))}\n </div>\n\n {/* Mobile pagination */}\n <div\n className=\"lg:hidden flex items-center justify-center gap-3 shrink-0\"\n style={{ height: PAGINATION_HEIGHT }}\n >\n <button\n type=\"button\"\n disabled={!canGoPrev}\n onClick={handlePrev}\n className={cn(\n \"text-sm cursor-pointer\",\n canGoPrev\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n ←\n </button>\n <span className=\"text-sm text-foreground tabular-nums\">\n {currentPage}\n </span>\n <button\n type=\"button\"\n disabled={!canGoNext}\n onClick={handleNext}\n className={cn(\n \"text-sm cursor-pointer\",\n canGoNext\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n →\n </button>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Desktop row (non-virtualized, paginated)\n// ---------------------------------------------------------------------------\n\nfunction HistoryRowStatic({ trade }: { trade: PredictTrade }) {\n const { t } = useTranslation();\n const isBuy = trade.side?.toUpperCase() === \"BUY\";\n const price = trade.price ?? 0;\n const usdSize = trade.usd_size ?? 0;\n const statusLabel = mapTradeStatus(trade.type, t);\n\n const isDeposit = isBuy;\n const depositSign = isDeposit ? \"+\" : \"-\";\n const depositColor = isDeposit ? \"text-success\" : \"text-foreground\";\n\n const eventTitle = trade.event?.title ?? trade.market?.question ?? \"—\";\n const eventImage = trade.event?.image_url;\n const outcomeLabel = trade.outcome ?? \"\";\n const timeStr = formatTimestamp(trade.timestamp);\n\n const txUrl = getTxUrl(trade);\n\n const pnlValue = extractPnl(trade);\n const feeValue = extractFee(trade);\n\n return (\n <div\n className=\"flex items-center border-b border-border/50 hover:bg-content2/40 transition-colors text-sm\"\n style={{ height: ROW_HEIGHT }}\n >\n {/* Event */}\n <div className=\"flex-[3] min-w-0 pr-2\">\n <div className=\"flex items-center gap-2.5 min-w-0\">\n {eventImage && (\n <img\n src={eventImage}\n alt=\"\"\n className=\"w-8 h-8 rounded-full object-cover shrink-0\"\n />\n )}\n <div className=\"flex flex-col gap-y-0.5 min-w-0\">\n <span className=\"text-foreground truncate font-medium text-sm\">\n {eventTitle}\n </span>\n <span className=\"text-[11px] text-neutral\">\n {outcomeLabel && <span className=\"mr-1\">{outcomeLabel}</span>}\n <span>{timeStr}</span>\n </span>\n </div>\n </div>\n </div>\n\n {/* Action */}\n <div className=\"flex-1 pr-2\">\n <span\n className={cn(\n \"text-sm font-medium\",\n isBuy ? \"text-success\" : \"text-danger\",\n )}\n >\n {isBuy ? t(\"predict.profile.buy\") : t(\"predict.profile.sell\")}\n </span>\n </div>\n\n {/* Status */}\n <div className=\"flex-1 pr-2 text-sm text-foreground\">{statusLabel}</div>\n\n {/* Price */}\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {formatCents(price)}\n </div>\n\n {/* Deposit / Withdraw */}\n <div className={cn(\"flex-[1.5] pr-2 text-right font-mono\", depositColor)}>\n {usdSize > 0 ? (\n <>\n {depositSign}${usdSize.toFixed(2)}\n </>\n ) : (\n \"—\"\n )}\n </div>\n\n {/* PNL */}\n <div\n className={cn(\n \"flex-1 pr-2 text-right font-mono\",\n pnlValue !== null\n ? pnlValue >= 0\n ? \"text-success\"\n : \"text-danger\"\n : \"text-neutral\",\n )}\n >\n {pnlValue !== null\n ? `${pnlValue >= 0 ? \"+\" : \"-\"}$${Math.abs(pnlValue).toFixed(2)}`\n : \"—\"}\n </div>\n\n {/* Fee */}\n <div className=\"flex-1 pr-2 text-right font-mono text-neutral\">\n {feeValue !== null ? `$${feeValue.toFixed(2)}` : \"—\"}\n </div>\n\n {/* Tx link */}\n <div className=\"w-10 shrink-0 text-right\">\n {txUrl && (\n <a\n href={txUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-neutral hover:text-foreground transition-colors\"\n aria-label=\"View transaction\"\n >\n <ExternalLinkIcon />\n </a>\n )}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Mobile card\n// ---------------------------------------------------------------------------\n\nfunction HistoryCard({ trade }: { trade: PredictTrade }) {\n const { t } = useTranslation();\n const isBuy = trade.side?.toUpperCase() === \"BUY\";\n const price = trade.price ?? 0;\n const usdSize = trade.usd_size ?? 0;\n const statusLabel = mapTradeStatus(trade.type, t);\n const eventTitle = trade.event?.title ?? trade.market?.question ?? \"—\";\n const timeStr = formatTimestamp(trade.timestamp);\n const txUrl = getTxUrl(trade);\n\n return (\n <div className=\"rounded-lg border border-border bg-content1 p-3 flex flex-col gap-2\">\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex items-center gap-2 min-w-0\">\n {trade.event?.image_url && (\n <img\n src={trade.event.image_url}\n alt=\"\"\n className=\"w-6 h-6 rounded-full object-cover shrink-0\"\n />\n )}\n <span className=\"text-sm font-medium text-foreground line-clamp-2\">\n {eventTitle}\n </span>\n </div>\n <span className=\"text-[11px] text-neutral whitespace-nowrap\">\n {timeStr}\n </span>\n </div>\n <div className=\"flex items-center gap-4 text-xs flex-wrap\">\n <div className=\"flex flex-col\">\n <span className=\"text-neutral\">{t(\"predict.profile.action\")}</span>\n <span\n className={cn(\n \"font-medium\",\n isBuy ? \"text-success\" : \"text-danger\",\n )}\n >\n {isBuy ? t(\"predict.profile.buy\") : t(\"predict.profile.sell\")}\n </span>\n </div>\n <div className=\"flex flex-col\">\n <span className=\"text-neutral\">{t(\"predict.profile.status\")}</span>\n <span className=\"text-foreground\">{statusLabel}</span>\n </div>\n <div className=\"flex flex-col\">\n <span className=\"text-neutral\">{t(\"predict.profile.price\")}</span>\n <span className=\"font-mono text-foreground\">\n {formatCents(price)}\n </span>\n </div>\n <div className=\"flex flex-col\">\n <span className=\"text-neutral\">\n {t(\"predict.profile.depositWithdraw\")}\n </span>\n <span className=\"font-mono text-foreground\">\n {usdSize > 0 ? `$${usdSize.toFixed(2)}` : \"—\"}\n </span>\n </div>\n {txUrl && (\n <a\n href={txUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"ml-auto text-neutral hover:text-foreground transition-colors\"\n >\n <ExternalLinkIcon />\n </a>\n )}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Shared\n// ---------------------------------------------------------------------------\n\nfunction mapTradeStatus(type: TradeType, t: (key: string) => string): string {\n switch (type) {\n case \"TRADE\":\n return t(\"predict.profile.filled\");\n case \"REDEEM\":\n return t(\"predict.profile.claimed\");\n case \"SPLIT\":\n case \"MERGE\":\n case \"CONVERSION\":\n return t(\"predict.profile.created\");\n default:\n return type;\n }\n}\n\nfunction getTxUrl(trade: PredictTrade): string | undefined {\n if (!trade.tx_hash) return undefined;\n if (trade.source === \"polymarket\") {\n return `https://polygonscan.com/tx/${trade.tx_hash}`;\n }\n return `https://solscan.io/tx/${trade.tx_hash}`;\n}\n\nfunction extractPnl(trade: PredictTrade): number | null {\n const meta = trade.provider_meta;\n if (meta) {\n const pnl =\n meta[\"pnl\"] ??\n meta[\"profit\"] ??\n meta[\"realized_pnl\"] ??\n meta[\"dflow.pnl\"];\n if (typeof pnl === \"number\") return pnl;\n if (typeof pnl === \"string\" && pnl !== \"\") {\n const parsed = parseFloat(pnl);\n if (!Number.isNaN(parsed)) return parsed;\n }\n }\n if (trade.type === \"REDEEM\" && trade.usd_size != null) {\n return trade.usd_size;\n }\n return null;\n}\n\nfunction extractFee(trade: PredictTrade): number | null {\n const meta = trade.provider_meta;\n if (meta) {\n const fee =\n meta[\"fee\"] ?? meta[\"fees\"] ?? meta[\"trading_fee\"] ?? meta[\"dflow.fee\"];\n if (typeof fee === \"number\") return fee;\n if (typeof fee === \"string\" && fee !== \"\") {\n const parsed = parseFloat(fee);\n if (!Number.isNaN(parsed)) return parsed;\n }\n }\n return null;\n}\n\nfunction ExternalLinkIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n <polyline points=\"15 3 21 3 21 9\" />\n <line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\" />\n </svg>\n );\n}\n\nfunction EmptyState({ message, height }: { message: string; height: number }) {\n return (\n <div\n className=\"flex items-center justify-center text-sm text-neutral\"\n style={{ height }}\n >\n {message}\n </div>\n );\n}\n\nfunction TabSkeleton({ height }: { height: number }) {\n return (\n <div\n className=\"flex flex-col gap-y-2 py-3 animate-pulse\"\n style={{ height }}\n >\n {Array.from({ length: 6 }).map((_, i) => (\n <Skeleton key={i} className=\"h-12 w-full rounded-md\" />\n ))}\n </div>\n );\n}\n\nfunction formatCents(price: number): string {\n const cents = price * 100;\n if (cents < 1 && cents > 0) return \"< 1¢\";\n return `${cents.toFixed(cents % 1 === 0 ? 0 : 1)}¢`;\n}\n\nfunction formatTimestamp(unixSeconds: number): string {\n const date = new Date(unixSeconds * 1000);\n const hours = date.getHours().toString().padStart(2, \"0\");\n const mins = date.getMinutes().toString().padStart(2, \"0\");\n const day = date.getDate().toString().padStart(2, \"0\");\n const month = (date.getMonth() + 1).toString().padStart(2, \"0\");\n const year = date.getFullYear();\n const tz = date.getTimezoneOffset();\n const tzSign = tz <= 0 ? \"+\" : \"-\";\n const tzHours = String(Math.abs(Math.floor(tz / 60))).padStart(2, \"0\");\n return `${hours}:${mins} ${day}/${month}/${year} (${tzSign}${tzHours})`;\n}\n","import { useState, useMemo, useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n type PredictOrder,\n useInfiniteOrders,\n useCancelOrder,\n} from \"@liberfi.io/react-predict\";\nimport { cn, Skeleton, Spinner } from \"@liberfi.io/ui\";\n\nconst PAGE_SIZE = 10;\nconst ROW_HEIGHT = 64;\nconst HEADER_HEIGHT = 40;\nconst PAGINATION_HEIGHT = 48;\n\nexport interface ProfileOrdersProps {\n solanaAddress?: string;\n evmAddress?: string;\n listHeight: number;\n}\n\nexport function ProfileOrders({\n solanaAddress,\n evmAddress,\n listHeight,\n}: ProfileOrdersProps) {\n const { t } = useTranslation();\n const cancelMutation = useCancelOrder();\n const [currentPage, setCurrentPage] = useState(1);\n\n const {\n data: kalshiData,\n isLoading: kalshiLoading,\n fetchNextPage: fetchNextKalshi,\n hasNextPage: hasMoreKalshi,\n isFetchingNextPage: isFetchingKalshi,\n } = useInfiniteOrders({\n source: \"kalshi\",\n wallet_address: solanaAddress ?? \"\",\n });\n\n const {\n data: polyData,\n isLoading: polyLoading,\n fetchNextPage: fetchNextPoly,\n hasNextPage: hasMorePoly,\n isFetchingNextPage: isFetchingPoly,\n } = useInfiniteOrders({\n source: \"polymarket\",\n wallet_address: evmAddress ?? \"\",\n });\n\n const isLoading = kalshiLoading || polyLoading;\n const isFetchingMore = isFetchingKalshi || isFetchingPoly;\n const hasNextPage = hasMoreKalshi || hasMorePoly;\n\n const orders = useMemo(() => {\n const all: PredictOrder[] = [];\n const openStatuses = new Set([\"live\", \"open\", \"submitted\", \"pending\"]);\n if (kalshiData?.pages) {\n all.push(\n ...kalshiData.pages\n .flatMap((p) => p.items)\n .filter((o) => openStatuses.has(o.status)),\n );\n }\n if (polyData?.pages) {\n all.push(\n ...polyData.pages\n .flatMap((p) => p.items)\n .filter((o) => openStatuses.has(o.status)),\n );\n }\n return all;\n }, [kalshiData, polyData]);\n\n const handleCancel = useCallback(\n (order: PredictOrder) => {\n cancelMutation.mutate({ source: order.source, id: order.id });\n },\n [cancelMutation],\n );\n\n const totalPages = Math.max(\n 1,\n Math.ceil(orders.length / PAGE_SIZE) + (hasNextPage ? 1 : 0),\n );\n const pageStart = (currentPage - 1) * PAGE_SIZE;\n const pageOrders = orders.slice(pageStart, pageStart + PAGE_SIZE);\n\n const handlePrev = useCallback(() => {\n setCurrentPage((p) => Math.max(1, p - 1));\n }, []);\n\n const handleNext = useCallback(async () => {\n const nextPageStart = currentPage * PAGE_SIZE;\n if (nextPageStart >= orders.length && hasNextPage) {\n if (hasMoreKalshi) await fetchNextKalshi();\n if (hasMorePoly) await fetchNextPoly();\n }\n setCurrentPage((p) => p + 1);\n }, [\n currentPage,\n orders.length,\n hasNextPage,\n hasMoreKalshi,\n hasMorePoly,\n fetchNextKalshi,\n fetchNextPoly,\n ]);\n\n const canGoPrev = currentPage > 1;\n const canGoNext = currentPage * PAGE_SIZE < orders.length || hasNextPage;\n\n if (isLoading) return <TabSkeleton height={listHeight} />;\n\n if (orders.length === 0 && !hasNextPage) {\n return (\n <EmptyState message={t(\"predict.profile.noOrders\")} height={listHeight} />\n );\n }\n\n const contentHeight = listHeight - HEADER_HEIGHT - PAGINATION_HEIGHT;\n\n return (\n <div className=\"flex flex-col\" style={{ height: listHeight }}>\n {/* Desktop header */}\n <div\n className=\"hidden lg:flex items-center text-neutral text-xs font-normal shrink-0 border-b border-border/50\"\n style={{ height: HEADER_HEIGHT }}\n >\n <div className=\"flex-[3] min-w-0 pr-2\">\n {t(\"predict.profile.event\")}\n </div>\n <div className=\"flex-1 pr-2\">{t(\"predict.profile.action\")}</div>\n <div className=\"flex-1 pr-2\">{t(\"predict.profile.type\")}</div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.profile.fillPrice\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.profile.cost\")}\n </div>\n </div>\n\n {/* Desktop rows */}\n <div\n className=\"hidden lg:block overflow-y-auto\"\n style={{ height: contentHeight }}\n >\n {pageOrders.map((order) => (\n <OrderRowStatic\n key={order.id}\n order={order}\n onCancel={handleCancel}\n />\n ))}\n {isFetchingMore && (\n <div className=\"flex justify-center items-center py-4\">\n <Spinner size=\"sm\" />\n </div>\n )}\n </div>\n\n {/* Desktop pagination */}\n <Pagination\n className=\"hidden lg:flex\"\n currentPage={currentPage}\n totalPages={totalPages}\n canGoPrev={canGoPrev}\n canGoNext={canGoNext}\n onPrev={handlePrev}\n onNext={handleNext}\n onPage={setCurrentPage}\n t={t}\n />\n\n {/* Mobile cards */}\n <div\n className=\"lg:hidden flex flex-col gap-2 overflow-y-auto py-2\"\n style={{ height: listHeight - PAGINATION_HEIGHT }}\n >\n {pageOrders.map((order) => (\n <OrderCard key={order.id} order={order} onCancel={handleCancel} />\n ))}\n </div>\n\n {/* Mobile pagination */}\n <Pagination\n className=\"lg:hidden\"\n currentPage={currentPage}\n totalPages={totalPages}\n canGoPrev={canGoPrev}\n canGoNext={canGoNext}\n onPrev={handlePrev}\n onNext={handleNext}\n onPage={setCurrentPage}\n t={t}\n compact\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Desktop row (non-virtualized, paginated)\n// ---------------------------------------------------------------------------\n\nfunction OrderRowStatic({\n order,\n onCancel,\n}: {\n order: PredictOrder;\n onCancel: (order: PredictOrder) => void;\n}) {\n const { t } = useTranslation();\n const isBuy = order.side === \"BUY\";\n const price = order.price ? parseFloat(order.price) : 0;\n const cost = order.in_amount\n ? parseFloat(order.in_amount)\n : price * parseFloat(order.original_size ?? \"0\");\n\n return (\n <div\n className=\"flex items-center border-b border-border/50 hover:bg-content2/40 transition-colors text-sm\"\n style={{ height: ROW_HEIGHT }}\n >\n {/* Event */}\n <div className=\"flex-[3] min-w-0 pr-2\">\n <div className=\"flex flex-col gap-y-0.5 min-w-0\">\n <span className=\"text-foreground truncate font-medium\">\n {order.outcome ?? order.market_id ?? \"—\"}\n </span>\n </div>\n </div>\n\n {/* Action */}\n <div className=\"flex-1 pr-2\">\n <span\n className={cn(\n \"text-sm font-medium\",\n isBuy ? \"text-success\" : \"text-danger\",\n )}\n >\n {isBuy ? t(\"predict.profile.buy\") : t(\"predict.profile.sell\")}\n </span>\n </div>\n\n {/* Type */}\n <div className=\"flex-1 pr-2 text-neutral capitalize text-sm\">\n {order.order_type ?? \"limit\"}\n </div>\n\n {/* Fill Price */}\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {price > 0 ? formatCents(price) : \"—\"}\n </div>\n\n {/* Cost */}\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {cost > 0 ? `$${cost.toFixed(2)}` : \"—\"}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Mobile card\n// ---------------------------------------------------------------------------\n\nfunction OrderCard({\n order,\n onCancel,\n}: {\n order: PredictOrder;\n onCancel: (order: PredictOrder) => void;\n}) {\n const { t } = useTranslation();\n const isBuy = order.side === \"BUY\";\n const price = order.price ? parseFloat(order.price) : 0;\n\n return (\n <div className=\"rounded-lg border border-border bg-content1 p-3 flex flex-col gap-2\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <span\n className={cn(\n \"text-xs font-medium px-1.5 py-0.5 rounded\",\n isBuy ? \"bg-success/10 text-success\" : \"bg-danger/10 text-danger\",\n )}\n >\n {order.side}\n </span>\n <span className=\"text-sm text-foreground capitalize\">\n {order.outcome ?? \"—\"}\n </span>\n </div>\n <span className=\"text-xs text-neutral capitalize\">\n {order.order_type ?? \"limit\"}\n </span>\n </div>\n <div className=\"flex items-center gap-4 text-xs\">\n <div className=\"flex flex-col\">\n <span className=\"text-neutral\">{t(\"predict.profile.fillPrice\")}</span>\n <span className=\"font-mono text-foreground\">\n {price > 0 ? formatCents(price) : \"—\"}\n </span>\n </div>\n <div className=\"flex-1\" />\n <button\n type=\"button\"\n onClick={() => onCancel(order)}\n className=\"text-xs text-danger hover:text-danger/80 cursor-pointer border border-border rounded px-2 py-1\"\n >\n {t(\"predict.orders.cancel\")}\n </button>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Shared\n// ---------------------------------------------------------------------------\n\nfunction Pagination({\n className,\n currentPage,\n totalPages,\n canGoPrev,\n canGoNext,\n onPrev,\n onNext,\n onPage,\n t,\n compact,\n}: {\n className?: string;\n currentPage: number;\n totalPages: number;\n canGoPrev: boolean;\n canGoNext: boolean;\n onPrev: () => void;\n onNext: () => void;\n onPage: (page: number) => void;\n t: (key: string) => string;\n compact?: boolean;\n}) {\n if (compact) {\n return (\n <div\n className={cn(\n \"flex items-center justify-center gap-3 shrink-0\",\n className,\n )}\n style={{ height: PAGINATION_HEIGHT }}\n >\n <button\n type=\"button\"\n disabled={!canGoPrev}\n onClick={onPrev}\n className={cn(\n \"text-sm cursor-pointer\",\n canGoPrev\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n ←\n </button>\n <span className=\"text-sm text-foreground tabular-nums\">\n {currentPage}\n </span>\n <button\n type=\"button\"\n disabled={!canGoNext}\n onClick={onNext}\n className={cn(\n \"text-sm cursor-pointer\",\n canGoNext\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n →\n </button>\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n \"flex items-center justify-center gap-2 shrink-0\",\n className,\n )}\n style={{ height: PAGINATION_HEIGHT }}\n >\n <button\n type=\"button\"\n disabled={!canGoPrev}\n onClick={onPrev}\n className={cn(\n \"text-sm transition-colors cursor-pointer flex items-center gap-1\",\n canGoPrev\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n ← {t(\"predict.profile.previous\")}\n </button>\n {Array.from({ length: Math.min(totalPages, 5) }, (_, i) => {\n const page = i + 1;\n return (\n <button\n key={page}\n type=\"button\"\n onClick={() => onPage(page)}\n className={cn(\n \"w-8 h-8 rounded text-sm transition-colors cursor-pointer\",\n page === currentPage\n ? \"bg-foreground/10 text-foreground font-medium\"\n : \"text-neutral hover:text-foreground\",\n )}\n >\n {page}\n </button>\n );\n })}\n <button\n type=\"button\"\n disabled={!canGoNext}\n onClick={onNext}\n className={cn(\n \"text-sm transition-colors cursor-pointer flex items-center gap-1\",\n canGoNext\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n {t(\"predict.profile.next\")} →\n </button>\n </div>\n );\n}\n\nfunction EmptyState({ message, height }: { message: string; height: number }) {\n return (\n <div\n className=\"flex items-center justify-center text-sm text-neutral\"\n style={{ height }}\n >\n {message}\n </div>\n );\n}\n\nfunction TabSkeleton({ height }: { height: number }) {\n return (\n <div\n className=\"flex flex-col gap-y-2 py-3 animate-pulse\"\n style={{ height }}\n >\n {Array.from({ length: 6 }).map((_, i) => (\n <Skeleton key={i} className=\"h-12 w-full rounded-md\" />\n ))}\n </div>\n );\n}\n\nfunction formatCents(price: number): string {\n const cents = price * 100;\n if (cents < 1 && cents > 0) return \"< 1¢\";\n return `${cents.toFixed(cents % 1 === 0 ? 0 : 1)}¢`;\n}\n","import { useState, useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictEvent, PredictPosition } from \"@liberfi.io/react-predict\";\nimport { cn, Skeleton } from \"@liberfi.io/ui\";\n\nconst PAGE_SIZE = 10;\nconst ROW_HEIGHT = 64;\nconst HEADER_HEIGHT = 40;\nconst PAGINATION_HEIGHT = 48;\n\nexport interface ProfilePositionsProps {\n positions: PredictPosition[];\n isLoading: boolean;\n listHeight: number;\n onClosePosition?: (position: PredictPosition) => void;\n onEventClick?: (event: PredictEvent) => void;\n}\n\nexport function ProfilePositions({\n positions,\n isLoading,\n listHeight,\n onClosePosition,\n onEventClick,\n}: ProfilePositionsProps) {\n const { t } = useTranslation();\n const [currentPage, setCurrentPage] = useState(1);\n\n const handleCloseAll = useCallback(() => {\n for (const pos of positions) {\n onClosePosition?.(pos);\n }\n }, [positions, onClosePosition]);\n\n if (isLoading) return <TabSkeleton height={listHeight} />;\n\n if (positions.length === 0) {\n return (\n <EmptyState\n message={t(\"predict.profile.noPositions\")}\n height={listHeight}\n />\n );\n }\n\n const totalPages = Math.max(1, Math.ceil(positions.length / PAGE_SIZE));\n const pageStart = (currentPage - 1) * PAGE_SIZE;\n const pagePositions = positions.slice(pageStart, pageStart + PAGE_SIZE);\n const canGoPrev = currentPage > 1;\n const canGoNext = currentPage < totalPages;\n const contentHeight = listHeight - HEADER_HEIGHT - PAGINATION_HEIGHT;\n\n return (\n <div className=\"flex flex-col\" style={{ height: listHeight }}>\n {/* Desktop header */}\n <div\n className=\"hidden lg:flex items-center text-neutral text-xs font-normal shrink-0 border-b border-border/50\"\n style={{ height: HEADER_HEIGHT }}\n >\n <div className=\"flex-[3] min-w-0 pr-2\">\n {t(\"predict.profile.event\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.profile.totalSize\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.profile.value\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.profile.avgPrice\")}\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.profile.markPrice\")}\n </div>\n <div className=\"flex-[1.5] pr-2 text-right\">\n <span>{t(\"predict.profile.pnl\")}</span>\n <span className=\"text-[10px] ml-1 opacity-60\">\n ({t(\"predict.profile.pnlExcludeFees\")})\n </span>\n </div>\n <div className=\"flex-1 pr-2 text-right\">\n {t(\"predict.profile.payoutIfRight\")}\n </div>\n <div className=\"flex-[1.5] pr-2 text-right\">\n {t(\"predict.profile.estSettlement\")}\n </div>\n <div className=\"w-20 shrink-0 text-right\">\n {onClosePosition && positions.length > 0 && (\n <button\n type=\"button\"\n onClick={handleCloseAll}\n className=\"text-xs text-primary hover:text-primary/80 cursor-pointer transition-colors\"\n >\n {t(\"predict.profile.closeAll\")}\n </button>\n )}\n </div>\n </div>\n\n {/* Desktop rows */}\n <div\n className=\"hidden lg:block overflow-y-auto\"\n style={{ height: contentHeight }}\n >\n {pagePositions.map((pos, i) => (\n <PositionRowStatic\n key={`${pos.source}-${pos.market?.slug ?? pageStart + i}`}\n position={pos}\n onClosePosition={onClosePosition}\n onEventClick={onEventClick}\n />\n ))}\n </div>\n\n {/* Desktop pagination */}\n <div\n className=\"hidden lg:flex items-center justify-center gap-2 shrink-0\"\n style={{ height: PAGINATION_HEIGHT }}\n >\n <button\n type=\"button\"\n disabled={!canGoPrev}\n onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}\n className={cn(\n \"text-sm transition-colors cursor-pointer flex items-center gap-1\",\n canGoPrev\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n ← {t(\"predict.profile.previous\")}\n </button>\n {Array.from({ length: Math.min(totalPages, 5) }, (_, i) => {\n const page = i + 1;\n return (\n <button\n key={page}\n type=\"button\"\n onClick={() => setCurrentPage(page)}\n className={cn(\n \"w-8 h-8 rounded text-sm transition-colors cursor-pointer\",\n page === currentPage\n ? \"bg-foreground/10 text-foreground font-medium\"\n : \"text-neutral hover:text-foreground\",\n )}\n >\n {page}\n </button>\n );\n })}\n <button\n type=\"button\"\n disabled={!canGoNext}\n onClick={() => setCurrentPage((p) => p + 1)}\n className={cn(\n \"text-sm transition-colors cursor-pointer flex items-center gap-1\",\n canGoNext\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n {t(\"predict.profile.next\")} →\n </button>\n </div>\n\n {/* Mobile cards */}\n <div\n className=\"lg:hidden flex flex-col gap-2 overflow-y-auto py-2\"\n style={{ height: listHeight - PAGINATION_HEIGHT }}\n >\n {pagePositions.map((pos, i) => (\n <PositionCard\n key={`${pos.source}-${pos.market?.slug ?? `m-${pageStart + i}`}`}\n position={pos}\n onClose={onClosePosition}\n onEventClick={onEventClick}\n />\n ))}\n </div>\n\n {/* Mobile pagination */}\n <div\n className=\"lg:hidden flex items-center justify-center gap-3 shrink-0\"\n style={{ height: PAGINATION_HEIGHT }}\n >\n <button\n type=\"button\"\n disabled={!canGoPrev}\n onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}\n className={cn(\n \"text-sm cursor-pointer\",\n canGoPrev\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n ←\n </button>\n <span className=\"text-sm text-foreground tabular-nums\">\n {currentPage}\n </span>\n <button\n type=\"button\"\n disabled={!canGoNext}\n onClick={() => setCurrentPage((p) => p + 1)}\n className={cn(\n \"text-sm cursor-pointer\",\n canGoNext\n ? \"text-neutral hover:text-foreground\"\n : \"text-neutral/40 cursor-not-allowed\",\n )}\n >\n →\n </button>\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Desktop row (non-virtualized, paginated)\n// ---------------------------------------------------------------------------\n\nfunction PositionRowStatic({\n position: pos,\n onClosePosition,\n onEventClick,\n}: {\n position: PredictPosition;\n onClosePosition?: (position: PredictPosition) => void;\n onEventClick?: (event: PredictEvent) => void;\n}) {\n const { t } = useTranslation();\n\n const pnl = pos.pnl ?? 0;\n const pnlPercent = pos.pnl_percent ?? 0;\n const avgPrice = pos.avg_price ?? 0;\n const currentPrice = pos.current_price ?? 0;\n const value = pos.current_value ?? pos.size * currentPrice;\n const payoutIfRight = pos.size;\n\n const pnlColor =\n pnl > 0 ? \"text-success\" : pnl < 0 ? \"text-danger\" : \"text-foreground\";\n const pnlSign = pnl > 0 ? \"+\" : \"\";\n\n const eventTitle = pos.event?.title ?? pos.market?.question ?? \"—\";\n const eventImage = pos.event?.image_url;\n const outcomeSide = pos.side;\n const outcomeLabel = pos.market?.outcomes?.[0]?.label ?? \"\";\n\n const settlementStr = pos.market?.end_at\n ? formatSettlementTime(pos.market.end_at)\n : \"—\";\n\n return (\n <div\n className=\"flex items-center border-b border-border/50 hover:bg-content2/40 transition-colors text-sm\"\n style={{ height: ROW_HEIGHT }}\n >\n {/* Event cell */}\n <div className=\"flex-[3] min-w-0 pr-2\">\n <button\n type=\"button\"\n className=\"flex items-center gap-2.5 min-w-0 cursor-pointer text-left\"\n onClick={() => pos.event && onEventClick?.(pos.event)}\n >\n {eventImage && (\n <img\n src={eventImage}\n alt=\"\"\n className=\"w-8 h-8 rounded-full object-cover shrink-0\"\n />\n )}\n <div className=\"flex flex-col gap-y-0.5 min-w-0\">\n <span className=\"text-foreground truncate font-medium text-sm\">\n {eventTitle}\n </span>\n <span className=\"text-[11px] text-neutral\">\n <span\n className={cn(\n \"font-medium\",\n outcomeSide.toLowerCase() === \"yes\"\n ? \"text-success\"\n : \"text-danger\",\n )}\n >\n {outcomeSide}\n </span>\n {outcomeLabel && (\n <>\n <span className=\"mx-1\">·</span>\n <span>{outcomeLabel}</span>\n </>\n )}\n </span>\n </div>\n </button>\n </div>\n\n {/* Total Size */}\n <div className=\"flex-1 pr-2 text-right\">\n <div className=\"flex flex-col items-end\">\n <span className=\"font-mono text-foreground\">${value.toFixed(2)}</span>\n <span className=\"text-[10px] text-neutral\">\n {t(\"predict.profile.contracts\", { count: pos.size })}\n </span>\n </div>\n </div>\n\n {/* Value */}\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n ${(pos.size * avgPrice).toFixed(2)}\n </div>\n\n {/* Avg Price */}\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {formatCents(avgPrice)}\n </div>\n\n {/* Mark Price */}\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n {formatCents(currentPrice)}\n </div>\n\n {/* PNL */}\n <div className={cn(\"flex-[1.5] pr-2 text-right font-mono\", pnlColor)}>\n <span>\n {pnlSign}${Math.abs(pnl).toFixed(2)}\n </span>\n <span className=\"text-[10px] ml-0.5 opacity-70\">\n ({pnlSign}\n {pnlPercent.toFixed(2)}%)\n </span>\n </div>\n\n {/* Payout if right */}\n <div className=\"flex-1 pr-2 text-right font-mono text-foreground\">\n ${payoutIfRight.toFixed(2)}\n </div>\n\n {/* Est. Settlement */}\n <div className=\"flex-[1.5] pr-2 text-right text-neutral whitespace-nowrap text-xs\">\n {settlementStr}\n </div>\n\n {/* Close */}\n <div className=\"w-20 shrink-0 text-right\">\n {onClosePosition && (\n <button\n type=\"button\"\n onClick={() => onClosePosition(pos)}\n className=\"inline-flex items-center gap-1 text-xs text-neutral hover:text-foreground cursor-pointer transition-colors\"\n >\n <span className=\"text-danger\">✕</span>\n {t(\"predict.profile.close\")}\n </button>\n )}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Mobile card\n// ---------------------------------------------------------------------------\n\nfunction PositionCard({\n position: pos,\n onClose,\n onEventClick,\n}: {\n position: PredictPosition;\n onClose?: (pos: PredictPosition) => void;\n onEventClick?: (event: PredictEvent) => void;\n}) {\n const { t } = useTranslation();\n const pnl = pos.pnl ?? 0;\n const pnlPercent = pos.pnl_percent ?? 0;\n const currentPrice = pos.current_price ?? 0;\n const pnlColor =\n pnl > 0 ? \"text-success\" : pnl < 0 ? \"text-danger\" : \"text-foreground\";\n const pnlSign = pnl > 0 ? \"+\" : \"\";\n const eventTitle = pos.event?.title ?? pos.market?.question ?? \"—\";\n\n return (\n <div className=\"rounded-lg border border-border bg-content1 p-3 flex flex-col gap-2\">\n <button\n type=\"button\"\n className=\"flex items-start justify-between gap-2 text-left cursor-pointer\"\n onClick={() => pos.event && onEventClick?.(pos.event)}\n >\n <div className=\"flex items-center gap-2 min-w-0\">\n {pos.event?.image_url && (\n <img\n src={pos.event.image_url}\n alt=\"\"\n className=\"w-7 h-7 rounded-full object-cover shrink-0\"\n />\n )}\n <span className=\"text-sm font-medium text-foreground line-clamp-2\">\n {eventTitle}\n </span>\n </div>\n <span\n className={cn(\n \"shrink-0 text-xs font-medium px-1.5 py-0.5 rounded\",\n pos.side.toLowerCase() === \"yes\"\n ? \"bg-success/10 text-success\"\n : \"bg-danger/10 text-danger\",\n )}\n >\n {pos.side}\n </span>\n </button>\n <div className=\"flex items-center gap-4 text-xs flex-wrap\">\n <MobileStat\n label={t(\"predict.profile.totalSize\")}\n value={`${pos.size}`}\n />\n <MobileStat\n label={t(\"predict.profile.markPrice\")}\n value={formatCents(currentPrice)}\n />\n <MobileStat\n label={t(\"predict.profile.pnl\")}\n value={`${pnlSign}$${Math.abs(pnl).toFixed(2)} (${pnlSign}${pnlPercent.toFixed(1)}%)`}\n className={pnlColor}\n />\n <MobileStat\n label={t(\"predict.profile.payoutIfRight\")}\n value={`$${pos.size.toFixed(2)}`}\n />\n </div>\n {onClose && (\n <div className=\"flex justify-end\">\n <button\n type=\"button\"\n onClick={() => onClose(pos)}\n className=\"text-xs text-danger hover:text-danger/80 cursor-pointer transition-colors border border-border rounded px-2 py-1\"\n >\n {t(\"predict.profile.close\")}\n </button>\n </div>\n )}\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Shared\n// ---------------------------------------------------------------------------\n\nfunction MobileStat({\n label,\n value,\n className,\n}: {\n label: string;\n value: string;\n className?: string;\n}) {\n return (\n <div className=\"flex flex-col\">\n <span className=\"text-neutral\">{label}</span>\n <span className={cn(\"font-mono text-foreground\", className)}>\n {value}\n </span>\n </div>\n );\n}\n\nfunction EmptyState({ message, height }: { message: string; height: number }) {\n return (\n <div\n className=\"flex items-center justify-center text-sm text-neutral\"\n style={{ height }}\n >\n {message}\n </div>\n );\n}\n\nfunction TabSkeleton({ height }: { height: number }) {\n return (\n <div\n className=\"flex flex-col gap-y-2 py-3 animate-pulse\"\n style={{ height }}\n >\n {Array.from({ length: 6 }).map((_, i) => (\n <Skeleton key={i} className=\"h-12 w-full rounded-md\" />\n ))}\n </div>\n );\n}\n\nfunction formatCents(price: number): string {\n const cents = price * 100;\n if (cents < 1 && cents > 0) return \"< 1¢\";\n return `${cents.toFixed(cents % 1 === 0 ? 0 : 1)}¢`;\n}\n\nfunction formatSettlementTime(isoString: string): string {\n try {\n const date = new Date(isoString);\n const hours = date.getHours().toString().padStart(2, \"0\");\n const mins = date.getMinutes().toString().padStart(2, \"0\");\n const day = date.getDate().toString().padStart(2, \"0\");\n const month = (date.getMonth() + 1).toString().padStart(2, \"0\");\n const year = date.getFullYear();\n const tz = date.getTimezoneOffset();\n const tzSign = tz <= 0 ? \"+\" : \"-\";\n const tzHours = String(Math.abs(Math.floor(tz / 60))).padStart(2, \"0\");\n return `${hours}:${mins} ${day}/${month}/${year} (${tzSign}${tzHours})`;\n } catch {\n return \"—\";\n }\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport type { PredictPosition, PredictTrade } from \"@liberfi.io/react-predict\";\nimport { cn, Skeleton } from \"@liberfi.io/ui\";\n\nexport interface ProfileStatsProps {\n positions: PredictPosition[];\n trades: PredictTrade[];\n isLoading: boolean;\n}\n\nexport function ProfileStats({\n positions,\n trades,\n isLoading,\n}: ProfileStatsProps) {\n const { t } = useTranslation();\n\n const stats = useMemo(() => {\n let realizedPnl = 0;\n let positionsValue = 0;\n for (const p of positions) {\n realizedPnl += p.realized_pnl ?? 0;\n positionsValue += p.current_value ?? p.size * (p.current_price ?? 0);\n }\n\n let volume = 0;\n let wins = 0;\n let settled = 0;\n for (const tr of trades) {\n volume += tr.usd_size ?? 0;\n if (tr.type === \"REDEEM\") {\n settled++;\n if ((tr.usd_size ?? 0) > 0) wins++;\n }\n }\n\n const winRateStr = settled > 0 ? `${wins} / ${settled}` : \"0 / 0\";\n\n return { realizedPnl, positionsValue, volume, winRateStr };\n }, [positions, trades]);\n\n const pnlColor =\n stats.realizedPnl > 0\n ? \"text-success\"\n : stats.realizedPnl < 0\n ? \"text-danger\"\n : \"text-foreground\";\n const pnlSign = stats.realizedPnl > 0 ? \"+\" : \"\";\n\n return (\n <div className=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-4 py-8\">\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-xl text-neutral\">\n {t(\"predict.profile.realizedPnl\")}\n </span>\n {isLoading ? (\n <Skeleton className=\"h-14 w-48 rounded-md\" />\n ) : (\n <span className={cn(\"text-5xl font-bold tabular-nums\", pnlColor)}>\n {pnlSign}${Math.abs(stats.realizedPnl).toFixed(2)}\n </span>\n )}\n </div>\n\n <div className=\"flex items-end gap-8 sm:gap-10\">\n <StatCard\n label={t(\"predict.profile.winRate\")}\n value={stats.winRateStr}\n isLoading={isLoading}\n />\n <StatCard\n label={t(\"predict.profile.positions\")}\n value={`$${stats.positionsValue.toFixed(2)}`}\n isLoading={isLoading}\n />\n <StatCard\n label={t(\"predict.profile.volume\")}\n value={`$${stats.volume.toFixed(2)}`}\n isLoading={isLoading}\n />\n </div>\n </div>\n );\n}\n\nfunction StatCard({\n label,\n value,\n isLoading,\n}: {\n label: string;\n value: string;\n isLoading: boolean;\n}) {\n return (\n <div className=\"flex flex-col items-end gap-0.5\">\n <span className=\"text-sm text-neutral whitespace-nowrap\">{label}</span>\n {isLoading ? (\n <Skeleton className=\"h-6 w-14 rounded-md\" />\n ) : (\n <span className=\"text-base font-semibold tabular-nums text-foreground\">\n {value}\n </span>\n )}\n </div>\n );\n}\n","import { useState, useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n type PredictEvent,\n type PredictPosition,\n usePositions,\n useInfiniteTrades,\n} from \"@liberfi.io/react-predict\";\nimport { cn } from \"@liberfi.io/ui\";\nimport { ProfileHistory } from \"./profile-history.ui\";\nimport { ProfileOrders } from \"./profile-orders.ui\";\nimport { ProfilePositions } from \"./profile-positions.ui\";\nimport { ProfileStats } from \"./profile-stats.ui\";\n\ntype ProfileTab = \"positions\" | \"orders\" | \"history\";\n\nconst LIST_HEIGHT = 600;\n\nexport interface ProfilePageProps {\n /** Solana wallet address (for Kalshi/DFlow positions). */\n solanaAddress?: string;\n /** EVM wallet address (for Polymarket positions). */\n evmAddress?: string;\n /** Called when user clicks Close on a position. */\n onClosePosition?: (position: PredictPosition) => void;\n /** Called when user clicks an event name. */\n onEventClick?: (event: PredictEvent) => void;\n}\n\nexport function ProfilePage({\n solanaAddress,\n evmAddress,\n onClosePosition,\n onEventClick,\n}: ProfilePageProps) {\n const { t } = useTranslation();\n const [activeTab, setActiveTab] = useState<ProfileTab>(\"positions\");\n\n const hasWallet = Boolean(solanaAddress || evmAddress);\n\n // Positions data (used by stats + positions tab)\n const { data: kalshiPositions, isLoading: kalshiPosLoading } = usePositions({\n source: \"kalshi\",\n user: solanaAddress ?? \"\",\n });\n const { data: polyPositions, isLoading: polyPosLoading } = usePositions({\n source: \"polymarket\",\n user: evmAddress ?? \"\",\n });\n\n const allPositions = useMemo(() => {\n const all: PredictPosition[] = [];\n if (kalshiPositions?.positions) all.push(...kalshiPositions.positions);\n if (polyPositions?.positions) all.push(...polyPositions.positions);\n return all;\n }, [kalshiPositions, polyPositions]);\n\n const positionsLoading = kalshiPosLoading || polyPosLoading;\n\n // Trades data (used by stats — fetch first page for stats aggregation)\n const { data: kalshiTrades, isLoading: kalshiTradesLoading } =\n useInfiniteTrades({\n source: \"kalshi\",\n wallet: solanaAddress ?? \"\",\n limit: 100,\n });\n const { data: polyTrades, isLoading: polyTradesLoading } = useInfiniteTrades({\n source: \"polymarket\",\n wallet: evmAddress ?? \"\",\n limit: 100,\n });\n\n const allTrades = useMemo(() => {\n const all = [\n ...(kalshiTrades?.pages?.flatMap((p) => p.items) ?? []),\n ...(polyTrades?.pages?.flatMap((p) => p.items) ?? []),\n ];\n return all;\n }, [kalshiTrades, polyTrades]);\n\n const statsLoading =\n positionsLoading || kalshiTradesLoading || polyTradesLoading;\n\n const positionsCount = allPositions.length;\n const positionsTabLabel =\n positionsCount > 0\n ? `${t(\"predict.profile.positionsTab\")} (${positionsCount})`\n : t(\"predict.profile.positionsTab\");\n\n const tabs: { key: ProfileTab; label: string }[] = [\n { key: \"positions\", label: positionsTabLabel },\n { key: \"orders\", label: t(\"predict.profile.openOrdersTab\") },\n { key: \"history\", label: t(\"predict.profile.historyTab\") },\n ];\n\n if (!hasWallet) {\n return (\n <div className=\"flex items-center justify-center text-sm text-neutral py-24 px-4\">\n {t(\"predict.profile.connectWallet\")}\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col max-w-[1280px] mx-auto w-full px-4 max-sm:px-2\">\n {/* Stats header */}\n <ProfileStats\n positions={allPositions}\n trades={allTrades}\n isLoading={statsLoading}\n />\n\n {/* Tab navigation */}\n <div className=\"flex items-center gap-1 border-b border-border\">\n {tabs.map((tab) => (\n <button\n key={tab.key}\n type=\"button\"\n onClick={() => setActiveTab(tab.key)}\n className={cn(\n \"px-3 py-3 text-base font-normal transition-colors cursor-pointer whitespace-nowrap\",\n activeTab === tab.key\n ? \"text-foreground border-b-2 border-foreground\"\n : \"text-neutral hover:text-foreground\",\n )}\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* Tab content */}\n <div className=\"py-2\">\n {activeTab === \"positions\" && (\n <ProfilePositions\n positions={allPositions}\n isLoading={positionsLoading}\n listHeight={LIST_HEIGHT}\n onClosePosition={onClosePosition}\n onEventClick={onEventClick}\n />\n )}\n {activeTab === \"orders\" && (\n <ProfileOrders\n solanaAddress={solanaAddress}\n evmAddress={evmAddress}\n listHeight={LIST_HEIGHT}\n />\n )}\n {activeTab === \"history\" && (\n <ProfileHistory\n solanaAddress={solanaAddress}\n evmAddress={evmAddress}\n listHeight={LIST_HEIGHT}\n />\n )}\n </div>\n </div>\n );\n}\n","import { useCallback, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { StyledModal, ModalContent } from \"@liberfi.io/ui\";\n\nexport interface SetupModalProps {\n isOpen: boolean;\n onClose: () => void;\n evmAddress: string;\n safeDeployed: boolean;\n tokenApproved: boolean;\n onDeployAndApprove: () => Promise<void>;\n}\n\ntype StepStatus = \"pending\" | \"running\" | \"done\";\n\nexport function SetupModal({\n isOpen,\n onClose,\n safeDeployed,\n tokenApproved,\n onDeployAndApprove,\n}: SetupModalProps) {\n const { t } = useTranslation();\n\n const [setupRunning, setSetupRunning] = useState(false);\n const [setupError, setSetupError] = useState<string | null>(null);\n const [optimisticDone, setOptimisticDone] = useState(false);\n\n const effectiveSafeDeployed = safeDeployed || optimisticDone;\n const effectiveTokenApproved = tokenApproved || optimisticDone;\n\n const step1Status: StepStatus = effectiveSafeDeployed\n ? \"done\"\n : setupRunning\n ? \"running\"\n : \"pending\";\n const step2Status: StepStatus = effectiveTokenApproved\n ? \"done\"\n : effectiveSafeDeployed && setupRunning\n ? \"running\"\n : \"pending\";\n\n const allDone = effectiveSafeDeployed && effectiveTokenApproved;\n\n const handleSetup = useCallback(async () => {\n setSetupError(null);\n setOptimisticDone(false);\n setSetupRunning(true);\n try {\n await onDeployAndApprove();\n setOptimisticDone(true);\n } catch (err) {\n setSetupError(err instanceof Error ? err.message : String(err));\n } finally {\n setSetupRunning(false);\n }\n }, [onDeployAndApprove]);\n\n const steps: {\n key: string;\n label: string;\n desc: string;\n status: StepStatus;\n }[] = [\n {\n key: \"step1\",\n label: t(\"predict.setup.step1\"),\n desc: t(\"predict.setup.step1Desc\" as never),\n status: step1Status,\n },\n {\n key: \"step2\",\n label: t(\"predict.setup.step2\"),\n desc: t(\"predict.setup.step2Desc\" as never),\n status: step2Status,\n },\n ];\n\n const handleAction = () => {\n if (allDone) {\n onClose();\n } else {\n handleSetup();\n }\n };\n\n const actionLabel = allDone\n ? t(\"predict.setup.done\")\n : t(\"predict.setup.setupButton\");\n\n return (\n <StyledModal\n isOpen={isOpen}\n onOpenChange={(open) => {\n if (!open) onClose();\n }}\n size=\"md\"\n classNames={{\n base: \"!bg-[#18181b] !rounded-[14px] !border !border-[rgba(39,39,42,1)] !shadow-[0_25px_50px_-12px_rgba(0,0,0,0.5)]\",\n body: \"!p-0\",\n }}\n >\n <ModalContent>\n <div>\n {/* Header */}\n <div className=\"flex items-center justify-between px-5 pt-5 pb-4\">\n <h3 className=\"text-base font-semibold text-white\">\n {t(\"predict.setup.modalTitle\")}\n </h3>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"p-1 rounded-[10px] hover:bg-[rgba(39,39,42,0.5)] text-zinc-400 hover:text-white transition-colors cursor-pointer focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n >\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n\n {/* Body */}\n <div className=\"px-5 pb-5 space-y-4\">\n <p className=\"text-[13px] text-zinc-400 text-left\">\n {t(\"predict.setup.modalDescription\")}\n </p>\n\n {/* Steps */}\n <div className=\"space-y-2.5\">\n {steps.map((step, idx) => (\n <div\n key={step.key}\n className=\"flex gap-3 rounded-[10px] border border-zinc-700/50 bg-zinc-800/50 px-3 py-3\"\n >\n <StepIndicator index={idx + 1} status={step.status} />\n <div className=\"flex-1 min-w-0 pt-0.5\">\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm font-medium text-zinc-200\">\n {step.label}\n </p>\n <span\n className={`text-[11px] leading-none ${\n step.status === \"done\"\n ? \"text-[#c7ff2e]\"\n : step.status === \"running\"\n ? \"text-[#c7ff2e]/70\"\n : \"text-zinc-500\"\n }`}\n >\n {step.status === \"done\"\n ? t(\"predict.setup.stepComplete\")\n : step.status === \"running\"\n ? t(\"predict.setup.stepRunning\")\n : t(\"predict.setup.stepPending\")}\n </span>\n </div>\n <p className=\"text-xs text-zinc-500 mt-1\">{step.desc}</p>\n </div>\n </div>\n ))}\n </div>\n\n {setupError && (\n <div className=\"rounded-[10px] bg-red-500/10 border border-red-500/20 px-3 py-2\">\n <p className=\"text-xs text-red-400\">{setupError}</p>\n </div>\n )}\n\n {/* Action button */}\n <button\n type=\"button\"\n onClick={handleAction}\n disabled={setupRunning}\n className={\n allDone\n ? \"w-full py-3 rounded-[10px] bg-[#c7ff2e] text-zinc-900 text-sm font-semibold hover:bg-[#c7ff2e]/90 transition-colors cursor-pointer focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n : \"w-full py-3 rounded-[10px] bg-[#c7ff2e] text-zinc-900 text-sm font-semibold hover:bg-[#c7ff2e]/90 transition-colors cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n }\n >\n {setupRunning ? (\n <span className=\"inline-flex items-center gap-2\">\n <svg\n className=\"animate-spin h-4 w-4\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n className=\"opacity-25\"\n />\n <path\n d=\"M4 12a8 8 0 018-8\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n className=\"opacity-75\"\n />\n </svg>\n {t(\"predict.setup.stepRunning\")}\n </span>\n ) : (\n actionLabel\n )}\n </button>\n\n {/* Cancel */}\n {!allDone && (\n <button\n type=\"button\"\n onClick={onClose}\n className=\"w-full py-2.5 rounded-[10px] text-sm text-zinc-400 hover:text-white hover:bg-[rgba(39,39,42,0.5)] transition-colors cursor-pointer focus-visible:z-10 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus\"\n >\n {t(\"common.cancel\")}\n </button>\n )}\n </div>\n </div>\n </ModalContent>\n </StyledModal>\n );\n}\n\nfunction StepIndicator({\n index,\n status,\n}: {\n index: number;\n status: StepStatus;\n}) {\n if (status === \"done\") {\n return (\n <span className=\"flex h-8 w-8 items-center justify-center rounded-full bg-[#c7ff2e]/15 shrink-0\">\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"text-[#c7ff2e]\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n </span>\n );\n }\n if (status === \"running\") {\n return (\n <span className=\"flex h-8 w-8 items-center justify-center rounded-full bg-[#c7ff2e]/10 shrink-0\">\n <svg\n className=\"animate-spin h-4 w-4 text-[#c7ff2e]\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n className=\"opacity-25\"\n />\n <path\n d=\"M4 12a8 8 0 018-8\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n className=\"opacity-75\"\n />\n </svg>\n </span>\n );\n }\n return (\n <span className=\"flex h-8 w-8 items-center justify-center rounded-full bg-zinc-700/50 text-xs font-bold text-zinc-400 shrink-0\">\n {index}\n </span>\n );\n}\n"]}
|