@liberfi.io/ui-predict 0.1.102 → 0.1.103
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 +5 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +5 -5
- package/dist/index.mjs.map +1 -1
- package/package.json +15 -15
package/dist/index.mjs.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-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/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/source-badge.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_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","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","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","KycModal","isOpen","onClose","kycUrl","Modal","ModalContent","ModalHeader","ModalBody","ModalFooter","Button","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","currentPriceCents","hasAmount","submitLabel","sideLabel","outcomeLabel","winAmount","submitColor","handleHalf","handleMax","showErrors","setShowErrors","handleSubmitPress","Fragment","Tabs","key","StyledNumberInput","pct","err","StyledSwitch","Select","keys","val","SelectItem","u","ChevronDownIcon","TradeFormWidget","chain","authenticatedSubmit","useAuthCallback","adaptedEvent","adaptedMarket","PREDICT_TRADE_MODAL_ID","PredictTradeModal","id","AsyncModal","modalProps","PredictTradeModalContent","params","onOpenChange","isMobile","useScreen","StyledModal","DEFAULT_FILTER_STATE","countActiveFilters","state","EventsFilterUI","onChange","draft","setDraft","handleOpenChange","open","handleReset","handleApply","updateDraft","prev","activeCount","platformOptions","timeRemainingOptions","volumeOptions","liquidityOptions","FilterSection","FilterChipGroup","RefreshIcon","options","selected","allowDeselect","opt","isActive","SORT_PRESETS","SORT_LABEL_KEYS","SORT_ORDER","EventsToolbarUI","sortPreset","onSortChange","sortAsc","onSortAscChange","onFilterPress","filterCount","setIsOpen","dropdownRef","useRef","onClickOutside","e","onEscape","ActiveIcon","SORT_ICONS","Icon","StyledBadge","FilterIcon","CalendarIcon","ChartLineIcon","DropletIcon","TimerIcon","useEventsInfinite","baseParams","resolveEventsParams","infiniteData","isLoading","isFetching","isFetchingMore","isError","error","hasMore","fetchNextPage","refetch","usePredictInfiniteEvents","data","page","item","fetchMore","refetchAll","EventsSkeleton","EventsPageSkeleton","MAX_DISPLAYED_OUTCOMES","C_PRIMARY","C_SECONDARY","C_RED","TEAM_PALETTE","hashString","hash","getOutcomeColors","labels","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","CardHeader","SingleMarketView","ExpandedMarketView","MarketListView","onClick","countdown","Linkable","Avatar","EventIndicators","getEventBadges","badges","isCrypto","isLive","remaining","fiveMin","fifteenMin","cryptoColor","LiveBadge","CryptoCountdownBadge","ClosedBadge","color","onMarketClick","onShowMore","YesNoPill","ChevronRightIcon","SourceIcon","ElevatedButton","bgColor","textColor","shadowColor","el","OutcomeButtons","dynamicColors","labelFormat","c0","c1","effectiveFormat","yesLabel","noLabel","onCollapse","ChevronUpIcon","ChevronLeftIcon","PolymarketIcon","KalshiIcon","MD","LG","XL","GLOW_INSET","ROW_HEIGHT_SM","ROW_HEIGHT_LG","END_ROW_HEIGHT","getColumnCount","width","getRowHeight","EventsUI","events","onFetchMore","getEventHref","containerRef","listRef","containerWidth","containerHeight","useResizeObserver","columnCount","rowHeight","dataRowCount","showEndOfList","totalRowCount","isRowLoaded","index","loadMoreRows","onRowsRendered","useInfiniteLoader","handleScrollToTop","List","EventGridRow","style","onScrollToTop","EndOfListRow","Spinner","startIdx","rowEvents","emptySlots","EventsWidget","tagSlugSelection","limit","sort_by","sort_asc","with_markets","timeRemaining","minVolume","minLiquidity","EventsPage","setTagSlugSelection","filterState","setFilterState","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","PositionVirtualRow","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","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","raw","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","SimilarEventsSection","onEventClick","similarEvents","useSimilarEvents","ev","SimilarEventCard","EventDetailPage","onSimilarEventClick","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","StyledInput","SearchIcon","XCloseIcon","Kbd","SearchResultItemUI","firstTag","useSearchResultListScript","isFetchingNextPage","useSearchEvents","SearchResultListWidget","scriptParams","ref","height","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","SearchEventsButton","modalParams","isDesktop","onOpen","onSelectEventStable","handleOpen","handleClose","handleKeyDown","activeElement","isInEditableElement","SORT_OPTIONS","VOLUME_PRESETS","btnBase","dropdownBase","getVolumeLabel","vol","MatchesFilterBar","onMinVolumeChange","onRefresh","sortOpen","setSortOpen","volumeOpen","setVolumeOpen","tooltipVisible","setTooltipVisible","spinning","setSpinning","sortRef","volumeRef","currentSort","handleClickOutside","handleRefresh","SortIcon","ChevronDown","SortOptionIcon","InfoIcon","shared","onMouseEnter","formatVolume","STAT_CARDS","MatchesHero","stats","line","card","SOURCE_META","DEFAULT_META","getSourceMeta","SourceBadge","meta","getYesPrice","getOutcomeName","getSpreadTier","spreadPercent","SPREAD_THEME","CONFIDENCE_THEME","getConfidenceTierKey","tier","score","SpreadGauge","theme","filled","PLATFORM_COLORS","DEFAULT_PLATFORM","getPlatformColor","MatchMarketCard","match","getMarketHref","priceA","priceB","cheaperSource","title","confKey","confTheme","ctaAccent","PlatformRow","isCheaper","platColor","outcomeName","content","MatchesWidget","forwardRef","onStatsChange","isPlaceholderData","useInfiniteMatchMarkets","keepPreviousData","animKey","setAnimKey","prevIsPlaceholder","setPrevIsPlaceholder","k","staggerBase","pages","acc","useImperativeHandle","allMatches","total","maxSpread","totalVolume","highSpreadCount","sentinelRef","observer","entries","MatchesSkeletonList","SkeletonCard","shimmer","j","SORT_TITLE_KEY","StatusClock","time","setTime","fmt","MatchesStatusBar","MatchesPage","bgImageSrc","setSortBy","setSortAsc","setMinVolume","heroStats","setHeroStats","widgetRef","sort","handleStatsChange","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","parsed","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","stepIcon","SetupModal","safeDeployed","tokenApproved","keysConnected","onDeployAndApprove","onConnectKeys","setupRunning","setSetupRunning","step3Running","setStep3Running","setupError","setSetupError","step1Status","step2Status","step3Status","allDone","handleSetup","handleConnectKeys"],"mappings":"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","file":"index.mjs","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.102\";\n}\n\nexport default \"0.1.102\";\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-1 lg:px-2 lg:py-1\",\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-8 items-stretch gap-x-2 lg:min-h-9\">\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 pl-2 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 p-1 text-base font-normal 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-2 py-1 text-sm font-medium uppercase transition-colors cursor-pointer\",\n isSelected\n ? \"border-transparent bg-primary text-black\"\n : \"border-border/80 text-neutral-200 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-1 lg:px-2 lg:py-1\">\n <div className=\"flex min-h-8 items-center gap-x-2 lg:min-h-9\">\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) */\nexport const ORDER_MIN_QUANTITY = 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 on Safe address\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: polymarketSafeAddress ?? \"\" },\n {\n enabled: enabled && polymarketSetupVerified && !!polymarketSafeAddress,\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 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 } 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 // 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 // ---------------------------------------------------------------------------\n // Validation\n // ---------------------------------------------------------------------------\n const validation = useMemo<TradeFormValidation>(() => {\n const errors: string[] = [];\n if (isNaN(quantity) || quantity < ORDER_MIN_QUANTITY) {\n errors.push(`Minimum quantity is ${ORDER_MIN_QUANTITY}`);\n }\n if (market.status !== \"open\") {\n errors.push(\"Market is not active\");\n }\n if (\n side === \"buy\" &&\n usdcBalance != null &&\n !isNaN(quantity) &&\n quantity > 0 &&\n quantity > usdcBalance\n ) {\n errors.push(\"Insufficient USDC balance\");\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(\"Insufficient shares\");\n }\n if (\n orderType === \"limit\" &&\n supportsLimitOrder &&\n (isNaN(limitPrice) || limitPrice < 0.01 || limitPrice > 0.99)\n ) {\n errors.push(\"Limit price must be between $0.01 and $0.99\");\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 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 setQuantityRaw(NaN);\n });\n } else {\n setIsSubmitting(false);\n toast.success(t(\"predict.trade.submitSuccess\"));\n fireCelebration();\n setQuantityRaw(NaN);\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 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: \"0.01\",\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 setQuantityRaw(NaN);\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 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 toast.error(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 {\n Button,\n Modal,\n ModalContent,\n ModalHeader,\n ModalBody,\n ModalFooter,\n} 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 <Modal isOpen={isOpen} onClose={onClose} size=\"md\">\n <ModalContent>\n <ModalHeader className=\"flex flex-col gap-1\">\n <span className=\"text-lg\">🛡️ {t(\"predict.trade.kycModalTitle\")}</span>\n </ModalHeader>\n <ModalBody className=\"gap-y-4\">\n <p className=\"text-sm text-default-600\">\n {t(\"predict.trade.kycModalDescription\")}\n </p>\n <ul className=\"flex flex-col gap-y-2 text-sm text-foreground\">\n <li className=\"flex items-start gap-x-2\">\n <span className=\"mt-0.5 text-primary\">✓</span>\n <span>{t(\"predict.trade.kycModalBullet1\")}</span>\n </li>\n <li className=\"flex items-start gap-x-2\">\n <span className=\"mt-0.5 text-primary\">✓</span>\n <span>{t(\"predict.trade.kycModalBullet2\")}</span>\n </li>\n <li className=\"flex items-start gap-x-2\">\n <span className=\"mt-0.5 text-primary\">✓</span>\n <span>{t(\"predict.trade.kycModalBullet3\")}</span>\n </li>\n </ul>\n <p className=\"text-xs text-default-400\">\n {t(\"predict.trade.kycModalNote\")}\n </p>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"light\" onPress={onClose}>\n {t(\"common.cancel\")}\n </Button>\n {kycUrl && (\n <Button\n color=\"primary\"\n onPress={() => {\n window.open(kycUrl, \"_blank\", \"noopener,noreferrer\");\n onClose();\n }}\n >\n {t(\"predict.trade.goToKYC\")}\n </Button>\n )}\n </ModalFooter>\n </ModalContent>\n </Modal>\n );\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n ChevronDownIcon,\n Tabs,\n Tab,\n StyledNumberInput,\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 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 (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 }, [isSubmitting, kycRequired, hasAmount, side, outcome, potentialProfit, t]);\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={cn(\n \"flex w-full flex-col gap-y-4 p-4\",\n variant === \"bordered\" &&\n \"rounded-xl border border-default-200 bg-content1\",\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 <StyledNumberInput\n key={side}\n aria-label=\"Trade amount\"\n fullWidth\n placeholder=\"0\"\n radius=\"lg\"\n size=\"lg\"\n value={isNaN(quantity) ? undefined : quantity}\n onValueChange={(v) => {\n setShowErrors(false);\n onQuantityChange(v);\n }}\n minValue={0}\n step={side === \"buy\" ? 0.01 : 1}\n formatOptions={\n side === \"buy\"\n ? { maximumFractionDigits: 2 }\n : { maximumFractionDigits: 0 }\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={!hasAmount || isSubmitting}\n isLoading={isSubmitting}\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 type { PredictEvent, PredictMarket } from \"@liberfi.io/react-predict\";\nimport {\n ModalBody,\n ModalContent,\n StyledModal,\n useScreen,\n} 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 { 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 radius=\"lg\"\n >\n <ModalContent>\n <ModalBody className=\"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 </ModalBody>\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// - Sort By (mirrors the toolbar sort dropdown)\n// - Time Remaining\n// - Min Volume\n// - Min Liquidity\n//\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 {\n Button,\n cn,\n StyledModal,\n ModalContent,\n ModalHeader,\n ModalBody,\n ModalFooter,\n RefreshIcon,\n} 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 // Draft state — local copy modified by user, committed on \"Show Results\"\n const [draft, setDraft] = useState<EventsFilterState>(value);\n\n // Sync draft when the modal opens with new value\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 // Pre-translate chip labels so the child component receives plain strings\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 scrollBehavior=\"inside\"\n >\n <ModalContent>\n {/* Header */}\n <ModalHeader className=\"px-4 py-2\">\n <span className=\"text-base font-semibold\">\n {t(\"predict.filter.title\")}\n </span>\n </ModalHeader>\n\n {/* Body */}\n <ModalBody className=\"flex flex-col gap-5\">\n {/* Platform */}\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 {/* Time Remaining */}\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 {/* Min Volume */}\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 {/* Min Liquidity */}\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 </ModalBody>\n\n {/* Footer */}\n <ModalFooter className=\"px-4\">\n <div className=\"w-full flex justify-between items-center\">\n <Button\n variant=\"light\"\n color=\"default\"\n size=\"sm\"\n radius=\"full\"\n startContent={<RefreshIcon width={16} height={16} />}\n onPress={handleReset}\n >\n {t(\"predict.filter.reset\")}\n </Button>\n <Button\n color=\"primary\"\n size=\"sm\"\n radius=\"full\"\n onPress={handleApply}\n >\n {t(\"predict.filter.showResults\")}\n {activeCount > 0 && (\n <span className=\"ml-1 text-xs opacity-80\">({activeCount})</span>\n )}\n </Button>\n </div>\n </ModalFooter>\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 className=\"flex flex-col gap-2.5\">\n <span className=\"text-sm font-semibold text-foreground\">{label}</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\nfunction FilterChipGroup({\n options,\n selected,\n onSelect,\n allowDeselect = true,\n}: FilterChipGroupProps) {\n return (\n <div className=\"flex flex-wrap gap-2\">\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 className={cn(\n \"shrink-0 rounded-lg px-3 py-1.5 text-xs font-medium transition-colors duration-150 cursor-pointer border\",\n isActive\n ? \"bg-primary/15 text-primary border-primary/40\"\n : \"bg-content2 text-foreground/60 border-default-100 hover:bg-default-100 hover:text-foreground\",\n )}\n >\n {opt.label}\n </button>\n );\n })}\n </div>\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// Pixel-level replica of Jupiter's prediction toolbar.\n// Pure presentational component — state is managed by the parent page.\n// =============================================================================\nimport { 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 cn,\n DropletIcon,\n FilterIcon,\n StyledBadge,\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// 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 useEffect(() => {\n if (!isOpen) return;\n const onClickOutside = (e: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(e.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n const onEscape = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setIsOpen(false);\n };\n document.addEventListener(\"mousedown\", onClickOutside);\n document.addEventListener(\"keydown\", onEscape);\n return () => {\n document.removeEventListener(\"mousedown\", onClickOutside);\n document.removeEventListener(\"keydown\", onEscape);\n };\n }, [isOpen]);\n\n const ActiveIcon = SORT_ICONS[sortPreset];\n\n return (\n <div className={cn(\"flex items-center gap-2\", className)}>\n {/* Sort pill — dropdown + direction toggle */}\n <div\n ref={dropdownRef}\n className=\"relative flex shrink-0 items-center rounded-full border border-border\"\n >\n {/* Sort field selector */}\n <button\n type=\"button\"\n onClick={() => setIsOpen((v) => !v)}\n className=\"flex shrink-0 items-center gap-2 px-3 py-1.5 text-xs font-medium text-neutral transition-colors hover:text-primary/80 cursor-pointer\"\n >\n <ActiveIcon className=\"size-[18px] shrink-0\" />\n <span className=\"whitespace-nowrap\">\n {t(SORT_LABEL_KEYS[sortPreset])}\n </span>\n </button>\n\n {/* Divider */}\n <div className=\"h-6 w-px bg-border\" />\n\n {/* Sort direction toggle */}\n <button\n type=\"button\"\n onClick={() => onSortAscChange(!sortAsc)}\n className=\"px-2.5 py-1.5 text-xs text-neutral transition-colors hover:text-primary/80 cursor-pointer\"\n >\n {sortAsc ? \"↑\" : \"↓\"}\n </button>\n\n {/* Dropdown menu */}\n {isOpen && (\n <div className=\"absolute left-0 top-full z-20 mt-1 flex min-w-max flex-col gap-0.5 rounded-lg border border-border bg-content1 p-1 shadow-lg\">\n {SORT_ORDER.map((key) => {\n const Icon = SORT_ICONS[key];\n return (\n <button\n key={key}\n type=\"button\"\n onClick={() => {\n onSortChange(key);\n setIsOpen(false);\n }}\n className={cn(\n \"flex w-full items-center gap-2 rounded px-2.5 py-1.5 text-xs font-medium transition-colors cursor-pointer\",\n key === sortPreset\n ? \"bg-primary/10 text-primary\"\n : \"text-neutral hover:bg-content2 hover:text-foreground\",\n )}\n >\n <Icon className=\"size-4 shrink-0\" />\n <span>{t(SORT_LABEL_KEYS[key])}</span>\n </button>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Filter button */}\n <StyledBadge\n content={filterCount > 0 ? filterCount : undefined}\n color=\"primary\"\n size=\"sm\"\n isInvisible={filterCount === 0}\n >\n <button\n type=\"button\"\n onClick={onFilterPress}\n className=\"flex shrink-0 items-center gap-2 rounded-full border border-border px-3 py-1.5 text-xs font-medium text-neutral transition-colors hover:text-primary/80 cursor-pointer\"\n >\n <FilterIcon className=\"size-[18px]\" />\n <span className=\"whitespace-nowrap\">{t(\"predict.filter.title\")}</span>\n </button>\n </StyledBadge>\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Sort option icon map\n// -----------------------------------------------------------------------------\n\nconst SORT_ICONS: Record<SortPreset, React.FC<{ className?: string }>> = {\n start_time: CalendarIcon,\n volume: ChartLineIcon,\n liquidity: DropletIcon,\n ending_soon: TimerIcon,\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 { Skeleton } from \"@liberfi.io/ui\";\nimport { DEFAULT_PAGE_SIZE } from \"../../consts\";\n\nexport interface EventsSkeletonProps {\n count?: number;\n}\n\nexport function EventsSkeleton({ count = 6 }: EventsSkeletonProps) {\n return (\n <div className=\"grid w-full grid-cols-1 gap-0 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\">\n {Array.from({ length: count }).map((_, i) => (\n <div key={i} className=\"p-2\">\n <div className=\"flex h-full min-h-52 flex-col rounded-xl border border-border/90 bg-background p-3 lg:min-h-72 lg:p-4\">\n <div className=\"flex items-center gap-3\">\n <Skeleton className=\"size-10 shrink-0 rounded-lg\" />\n <div className=\"flex flex-1 flex-col gap-1\">\n <Skeleton className=\"h-4 w-11/12 rounded\" />\n <Skeleton className=\"h-3 w-2/5 rounded\" />\n </div>\n </div>\n\n <div className=\"mt-3 flex flex-1 flex-col gap-2 lg:gap-3\">\n <div className=\"flex items-center justify-between gap-2\">\n <Skeleton className=\"h-7 w-1/2 rounded\" />\n <Skeleton className=\"h-7 w-[85px] rounded-lg lg:h-9 lg:w-24\" />\n </div>\n <div className=\"flex items-center justify-between gap-2\">\n <Skeleton className=\"h-7 w-3/5 rounded\" />\n <Skeleton className=\"h-7 w-[85px] rounded-lg lg:h-9 lg:w-24\" />\n </div>\n <div className=\"flex items-center justify-between gap-2\">\n <Skeleton className=\"h-7 w-2/5 rounded\" />\n <Skeleton className=\"h-7 w-[85px] rounded-lg lg:h-9 lg:w-24\" />\n </div>\n </div>\n\n <div className=\"mt-auto flex items-center justify-between pt-3\">\n <Skeleton className=\"h-3 w-20 rounded\" />\n <Skeleton className=\"h-3 w-24 rounded\" />\n </div>\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nexport interface EventsPageSkeletonProps extends EventsSkeletonProps {}\n\n/**\n * Page-level loading skeleton for `EventsPage`.\n * Includes placeholders for categories / toolbar, then the events grid skeleton.\n */\nexport function EventsPageSkeleton({\n count = DEFAULT_PAGE_SIZE,\n}: EventsPageSkeletonProps) {\n return (\n <div className=\"flex h-full w-full max-w-[1680px] mx-auto flex-col gap-y-3\">\n <div className=\"flex min-h-8 items-center justify-between gap-3 lg:min-h-9\">\n <div className=\"flex items-center gap-2 overflow-hidden\">\n <Skeleton className=\"h-6 w-16 rounded\" />\n <Skeleton className=\"h-6 w-20 rounded\" />\n <Skeleton className=\"h-6 w-16 rounded\" />\n <Skeleton className=\"h-6 w-20 rounded\" />\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n <Skeleton className=\"h-7 w-28 rounded-full\" />\n <Skeleton className=\"h-7 w-24 rounded-full\" />\n </div>\n </div>\n\n <div className=\"min-h-0 flex-1\">\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// 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`;\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 return (\n <div\n className={cn(\n \"group flex h-full w-full flex-col rounded-xl\",\n \"min-h-52 border border-border/90 bg-background p-3\",\n \"lg:min-h-72 lg:max-w-md lg:p-4\",\n \"gap-y-1.5 lg:gap-y-4\",\n \"transition duration-300\",\n \"hover:border-primary/40 hover:shadow-card-glow\",\n \"focus-within:border-primary/40 focus-within:shadow-card-glow\",\n !isExpanded && \"cursor-pointer\",\n )}\n onMouseEnter={() => onHover?.(event)}\n onClick={handleCardClick}\n >\n <style>{injectedCSS}</style>\n {/* ---- Header ---- */}\n <CardHeader\n event={event}\n href={href}\n LinkComponent={LinkComponent}\n onClick={handleHeaderClick}\n isExpanded={isExpanded}\n />\n\n {/* ---- Body ---- */}\n <div className=\"flex flex-1 flex-col\">\n {singleMarket ? (\n <SingleMarketView\n market={openMarkets[0]}\n event={event}\n formattedVolume={formattedVolume}\n href={href}\n LinkComponent={LinkComponent}\n onSelect={onSelect}\n onSelectOutcome={onSelectOutcome}\n />\n ) : expandedMarket ? (\n <ExpandedMarketView\n market={expandedMarket}\n event={event}\n onCollapse={() => setExpandedSlug(null)}\n onSelectOutcome={onSelectOutcome}\n />\n ) : (\n <MarketListView\n displayedMarkets={displayedMarkets}\n moreCount={moreCount}\n formattedVolume={formattedVolume}\n source={event.source}\n href={href}\n LinkComponent={LinkComponent}\n onMarketClick={(m) => setExpandedSlug(m.slug)}\n onShowMore={handleShowMore}\n />\n )}\n </div>\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 view (normal card body)\n// -----------------------------------------------------------------------------\n\nfunction MarketListView({\n displayedMarkets,\n moreCount,\n formattedVolume,\n source,\n href,\n LinkComponent,\n onMarketClick,\n onShowMore,\n}: {\n displayedMarkets: PredictMarket[];\n moreCount: number;\n formattedVolume: string;\n source: ProviderSource;\n href?: string;\n LinkComponent?: LinkComponentType;\n onMarketClick: (market: PredictMarket) => void;\n onShowMore: React.MouseEventHandler;\n}) {\n const { t } = useTranslation();\n\n return (\n <>\n {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 )}\n\n {/* Footer */}\n <div className=\"mt-auto flex items-center justify-between pt-3\">\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-neutral-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 className=\"inline-flex items-center gap-x-1.5 text-[10px] font-normal text-neutral-500 lg:text-xs\">\n {formattedVolume} {t(\"predict.event.volume\")}\n <SourceIcon source={source} />\n </span>\n </div>\n </>\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 view (only 1 open market — show buttons directly + View Event)\n// -----------------------------------------------------------------------------\n\nfunction SingleMarketView({\n market,\n event,\n formattedVolume,\n href,\n LinkComponent,\n onSelect,\n onSelectOutcome,\n}: {\n market: PredictMarket;\n event: PredictEvent;\n formattedVolume: string;\n href?: string;\n LinkComponent?: LinkComponentType;\n onSelect?: (event: PredictEvent) => void;\n onSelectOutcome?: (\n event: PredictEvent,\n market: PredictMarket,\n side: \"yes\" | \"no\",\n ) => 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 <div className=\"flex-1\">\n <OutcomeButtons\n market={market}\n event={event}\n onSelectOutcome={onSelectOutcome}\n dynamicColors\n labelFormat=\"label\"\n />\n </div>\n\n {/* Footer: View Event + Volume */}\n <div className=\"mt-auto flex items-center justify-between pt-3\">\n <Linkable\n href={href}\n LinkComponent={LinkComponent}\n as=\"button\"\n className=\"flex items-center gap-1 text-[10px] font-normal text-neutral-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 className=\"inline-flex items-center gap-x-1.5 text-[10px] font-normal text-neutral-500 lg:text-xs\">\n {formattedVolume} {t(\"predict.event.volume\")}\n <SourceIcon source={event.source} />\n </span>\n </div>\n </>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Expanded market view (single market with large Yes/No buttons)\n// -----------------------------------------------------------------------------\n\nfunction ExpandedMarketView({\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 { t } = useTranslation();\n const pct = getYesPercent(market);\n\n return (\n <>\n <div className=\"flex-1\">\n {/* Market header with collapse toggle */}\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\n {/* Yes / No buy buttons */}\n <div className=\"mt-3\">\n <OutcomeButtons\n market={market}\n event={event}\n onSelectOutcome={onSelectOutcome}\n labelFormat=\"action\"\n />\n </div>\n </div>\n\n {/* Back */}\n <button\n type=\"button\"\n className=\"mt-auto flex items-center gap-x-1 pt-4 text-[10px] font-normal text-neutral-500 transition-colors hover:text-slate-200 cursor-pointer lg:text-xs\"\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 </>\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 virtual grid: PredictEvent[] with EventItem cards.\n// Layout: responsive 1-4 column grid with react-window virtualisation and\n// infinite-scroll sentinel row.\n// =============================================================================\nimport { useCallback, useRef } from \"react\";\nimport {\n List,\n type ListImperativeAPI,\n type RowComponentProps,\n} 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, PredictMarket } from \"@liberfi.io/react-predict\";\nimport { Spinner } from \"@liberfi.io/ui\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { EventItem } from \"./event-item.ui\";\n\nconst MD = 768;\nconst LG = 1024;\nconst XL = 1280;\n\nconst GLOW_INSET = 8;\n\nconst ROW_HEIGHT_SM = 224;\nconst ROW_HEIGHT_LG = 304;\n\nconst END_ROW_HEIGHT = 114;\n\nfunction getColumnCount(width: number): number {\n if (width >= XL) return 4;\n if (width >= LG) return 3;\n if (width >= MD) return 2;\n return 1;\n}\n\nfunction getRowHeight(width: number): number {\n if (width >= LG) return ROW_HEIGHT_LG;\n return ROW_HEIGHT_SM;\n}\n\n// -----------------------------------------------------------------------------\n// EventsUI\n// -----------------------------------------------------------------------------\n\nexport type EventsUIProps = {\n events: PredictEvent[];\n hasMore?: 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 onFetchMore,\n onSelect,\n onSelectOutcome,\n getEventHref,\n LinkComponent,\n onHover,\n}: EventsUIProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const listRef = useRef<ListImperativeAPI>(null);\n const { width: containerWidth = 0, height: containerHeight = 0 } =\n useResizeObserver({ ref: containerRef });\n\n const columnCount = getColumnCount(containerWidth);\n const rowHeight = getRowHeight(containerWidth);\n const dataRowCount = Math.ceil(events.length / columnCount) || 0;\n const showEndOfList = !hasMore && events.length > 0;\n const totalRowCount =\n dataRowCount + (hasMore ? 1 : 0) + (showEndOfList ? 1 : 0);\n\n const isRowLoaded = useCallback(\n (index: number) => index < dataRowCount,\n [dataRowCount],\n );\n\n const loadMoreRows = useCallback(async () => {\n onFetchMore?.();\n }, [onFetchMore]);\n\n const onRowsRendered = useInfiniteLoader({\n isRowLoaded,\n loadMoreRows,\n rowCount: totalRowCount,\n threshold: 3,\n });\n\n const handleScrollToTop = useCallback(() => {\n listRef.current?.scrollToRow({ index: 0, behavior: \"smooth\" });\n }, []);\n\n return (\n <div ref={containerRef} className=\"@container w-full h-full\">\n {containerHeight > 0 && (\n <List\n listRef={listRef}\n className=\"no-scrollbar\"\n style={{ height: containerHeight }}\n onRowsRendered={onRowsRendered}\n rowComponent={EventGridRow}\n rowCount={totalRowCount}\n rowHeight={(index) => {\n if (showEndOfList && index === totalRowCount - 1)\n return END_ROW_HEIGHT;\n if (hasMore && index >= dataRowCount) return rowHeight;\n return rowHeight;\n }}\n rowProps={{\n events,\n columnCount,\n dataRowCount,\n showEndOfList,\n totalRowCount,\n onSelect,\n onSelectOutcome,\n getEventHref,\n LinkComponent,\n onHover,\n onScrollToTop: handleScrollToTop,\n }}\n />\n )}\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Row component\n// -----------------------------------------------------------------------------\n\ntype EventGridRowData = {\n events: PredictEvent[];\n columnCount: number;\n dataRowCount: number;\n showEndOfList: boolean;\n totalRowCount: number;\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 onScrollToTop?: () => void;\n};\n\nfunction EventGridRow({\n index,\n style,\n events,\n columnCount,\n dataRowCount,\n showEndOfList,\n totalRowCount,\n onSelect,\n onSelectOutcome,\n getEventHref,\n LinkComponent,\n onHover,\n onScrollToTop,\n}: RowComponentProps<EventGridRowData>) {\n if (showEndOfList && index === totalRowCount - 1) {\n return (\n <div style={style}>\n <EndOfListRow onScrollToTop={onScrollToTop} />\n </div>\n );\n }\n\n if (index >= dataRowCount) {\n return (\n <div style={style} className=\"flex justify-center items-start pt-4\">\n <Spinner size=\"sm\" />\n </div>\n );\n }\n\n const startIdx = index * columnCount;\n const rowEvents = events.slice(startIdx, startIdx + columnCount);\n const emptySlots = columnCount - rowEvents.length;\n\n return (\n <div style={style}>\n <div className=\"flex w-full h-full\">\n {rowEvents.map((event, i) =>\n event == null ? null : (\n <div\n className=\"flex-1 min-w-0 flex\"\n key={`${startIdx + i}-${event.source}-${event.slug}`}\n style={{ padding: GLOW_INSET }}\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 {emptySlots > 0 &&\n Array.from({ length: emptySlots }).map((_, i) => (\n <div key={`spacer-${i}`} style={{ flex: 1, minWidth: 0 }} />\n ))}\n </div>\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 } = 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 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// Composes:\n// - CategoriesWidget — category / tag navigation (static data, slug-based)\n// - EventsToolbarUI — sort dropdown + filter button\n// - EventsFilterUI — filter modal (platform, sort, time, volume, liquidity)\n// - EventsWidget — events grid backed by @liberfi.io/react-predict\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 { 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 {\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}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function EventsPage({\n onSelect,\n onSelectOutcome,\n getEventHref,\n LinkComponent,\n onHover,\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 {\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 className=\"flex h-full w-full max-w-[1680px] mx-auto flex-col gap-y-3\">\n <CategoriesWidget onSelect={handleCategorySelect} trailing={toolbar} />\n\n <EventsFilterUI\n isOpen={isFilterOpen}\n onClose={closeFilter}\n value={filterState}\n onChange={handleFilterChange}\n />\n\n <div className=\"min-h-0 flex-1\">\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","import { Skeleton } from \"@liberfi.io/ui\";\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 <div className=\"flex w-full flex-col gap-4 animate-pulse lg:gap-6\">\n {/* Back button placeholder */}\n {showBack && <div className=\"h-5\" />}\n\n {/* Header — avatar + tags + title */}\n <div className=\"flex items-center gap-x-2 h-16 lg:h-20 lg:gap-x-4\">\n <Skeleton className=\"size-16 shrink-0 rounded-lg lg:size-20\" />\n <div className=\"flex min-w-0 flex-1 flex-col gap-1.5\">\n <div className=\"flex items-center gap-1.5\">\n <Skeleton className=\"h-3.5 w-12 rounded\" />\n <Skeleton className=\"h-3.5 w-10 rounded\" />\n <Skeleton className=\"h-3.5 w-10 rounded\" />\n </div>\n <Skeleton className=\"h-5 w-full max-w-sm rounded lg:h-6\" />\n </div>\n </div>\n\n {/* Countdown */}\n <Skeleton className=\"h-4 w-48 rounded\" />\n\n {/* Chart area — legend + chart + bottom bar */}\n <div className=\"flex flex-col gap-3\">\n {/* Legend bar */}\n <div className=\"flex items-center gap-4\">\n <Skeleton className=\"h-4 w-24 rounded\" />\n <Skeleton className=\"h-4 w-20 rounded\" />\n </div>\n {/* Chart body (300px) */}\n <Skeleton className=\"h-[300px] w-full rounded-xl\" />\n {/* Bottom bar — volume + interval switcher */}\n <div className=\"flex items-center justify-between\">\n <Skeleton className=\"h-4 w-20 rounded\" />\n <div className=\"flex items-center gap-2\">\n <Skeleton className=\"h-7 w-[200px] rounded-lg\" />\n <Skeleton className=\"h-7 w-28 rounded-lg\" />\n </div>\n </div>\n </div>\n\n {/* Markets table */}\n <div className=\"flex flex-col\">\n {/* Table header */}\n <div className=\"flex items-center py-2\">\n <div className=\"flex-1\" />\n <Skeleton className=\"h-3.5 w-14 rounded\" />\n <div className=\"flex-1\" />\n </div>\n {/* Market rows */}\n {Array.from({ length: marketCount }).map((_, i) => (\n <div\n key={i}\n className=\"flex items-center gap-x-2 border-b border-border py-2.5 lg:gap-x-3\"\n >\n <Skeleton className=\"size-5 shrink-0 rounded-lg lg:size-8\" />\n <div className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <Skeleton className=\"h-3.5 w-32 rounded lg:h-4 lg:w-48\" />\n <Skeleton className=\"h-2.5 w-16 rounded\" />\n </div>\n <Skeleton className=\"h-4 w-10 rounded\" />\n <div className=\"flex items-center gap-2\">\n <Skeleton className=\"h-8 w-16 rounded-lg lg:w-24\" />\n <Skeleton className=\"h-8 w-16 rounded-lg lg:w-24\" />\n </div>\n </div>\n ))}\n </div>\n\n {/* Rules */}\n <div className=\"flex flex-col gap-2\">\n <Skeleton className=\"h-4 w-16 rounded\" />\n <Skeleton className=\"h-3.5 w-full rounded\" />\n <Skeleton className=\"h-3.5 w-4/5 rounded\" />\n <Skeleton className=\"h-3.5 w-3/5 rounded\" />\n </div>\n </div>\n );\n}\n\nexport function TradeFormSkeleton() {\n return (\n <div className=\"flex flex-col gap-3 rounded-xl border border-border p-4 animate-pulse\">\n <Skeleton className=\"h-10 w-full rounded-lg\" />\n <Skeleton className=\"h-24 w-full rounded-lg\" />\n <Skeleton className=\"h-10 w-full rounded-lg\" />\n </div>\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\",\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\",\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 { 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\";\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}\n\nexport interface SimilarEventCardProps {\n event: PredictEvent;\n onClick?: (event: PredictEvent) => void;\n}\n\n// ---------------------------------------------------------------------------\n// SimilarEventsSection\n// ---------------------------------------------------------------------------\n\nexport function SimilarEventsSection({\n eventSlug,\n source,\n limit = 4,\n onEventClick,\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 className=\"text-sm font-semibold text-foreground lg:text-base\">\n {t(\"predict.similar.title\")}\n </span>\n <div className=\"grid grid-cols-1 gap-3\">\n {similarEvents.map((ev) => (\n <SimilarEventCard\n key={`${ev.source}-${ev.slug}`}\n event={ev}\n onClick={onEventClick}\n />\n ))}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// SimilarEventCard\n// ---------------------------------------------------------------------------\n\nexport function SimilarEventCard({ event, onClick }: SimilarEventCardProps) {\n const volume = event.volume;\n return (\n <button\n type=\"button\"\n onClick={() => onClick?.(event)}\n className=\"flex items-center gap-x-3 rounded-xl border border-border p-3 hover:bg-content2 transition-colors cursor-pointer text-left w-full\"\n >\n <Avatar\n src={event.image_url || undefined}\n name={event.title?.[0] || \"?\"}\n radius=\"lg\"\n className=\"size-8 shrink-0 bg-transparent\"\n imgProps={{ className: \"object-cover\" }}\n />\n <div className=\"flex flex-col min-w-0 flex-1\">\n <span className=\"text-sm font-medium text-foreground truncate\">\n {event.title}\n </span>\n {volume != null && volume > 0 && (\n <span className=\"text-xs text-neutral\">\n ${Math.round(volume).toLocaleString()} vol\n </span>\n )}\n </div>\n <ChevronRightIcon className=\"h-4 w-4 text-neutral shrink-0\" />\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 /** 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 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 />\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=\"flat\"\n radius=\"full\"\n value={value}\n onValueChange={onValueChange}\n placeholder={t(\"predict.search.placeholder\")}\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-border rounded-full 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, ProviderSource } from \"@liberfi.io/react-predict\";\nimport {\n Avatar,\n cn,\n KalshiIcon,\n Linkable,\n PolymarketIcon,\n} from \"@liberfi.io/ui\";\nimport type { LinkComponentType } from \"@liberfi.io/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// 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\n const formattedVolume = useMemo(() => {\n const vol = Math.round(event.volume ?? 0);\n return `$${vol.toLocaleString(\"en-US\")}`;\n }, [event.volume]);\n\n return (\n <Linkable\n href={href}\n LinkComponent={LinkComponent}\n className={cn(\n \"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 // When href is present, Next.js Link would also navigate client-side.\n // Prevent that so navigation is handled exactly once by the onSelect callback\n // (which closes the modal, then the caller does router.push).\n // Right-click / middle-click \"Open in new tab\" still works via href.\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 truncate\">\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 {firstTag && (\n <span\n className={cn(\n \"inline-flex items-center\",\n \"rounded-full px-1.5 py-0.5\",\n \"text-[10px] font-semibold leading-none uppercase\",\n \"bg-primary/15 text-primary\",\n )}\n >\n {firstTag.label}\n </span>\n )}\n <span className=\"inline-flex items-center gap-x-1.5\">\n {formattedVolume} {t(\"predict.event.volume\")}\n <SourceIcon source={event.source} />\n </span>\n </div>\n </div>\n </Linkable>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Source (platform) icon\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","\"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({ keyword, limit, source }, { enabled: true });\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 = 56;\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 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 className=\"w-full h-full\">\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 `}</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 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 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 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 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 { 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 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\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\"\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 el.style.borderColor = \"rgba(63,63,70,0.6)\";\n el.style.boxShadow = `0 8px 24px -4px ${tier === \"high\" ? \"rgba(247,104,22,0.10)\" : \"rgba(199,255,46,0.08)\"}`;\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 {/* 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 const staggerBase = useMemo(() => {\n const pages = data?.pages;\n if (!pages || pages.length <= 1) return 0;\n return pages\n .slice(0, -1)\n .reduce((acc, p) => acc + (p.items?.length ?? 0), 0);\n }, [data?.pages]);\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 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 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 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 {allMatches.map((match, index) => (\n <div\n key={`${animKey}-${match.match_id}-${match.source_a}-${match.market_a?.slug ?? index}`}\n style={{\n animation: `matchCardEnter 0.45s cubic-bezier(0.34,1.56,0.64,1) ${Math.max(0, index - staggerBase) * 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 </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 {total != null && (\n <span style={{ fontSize: 12, color: \"rgba(255,255,255,0.35)\" }}>\n {t(\"predict.matches.showing\" as never, {\n current: allMatches.length,\n total,\n })}\n </span>\n )}\n </div>\n </div>\n );\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 { useState, useCallback, useRef, useEffect } 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 setHeroStats(stats);\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 {/* Background image — fixed, covers viewport like matchr.xyz */}\n {bgImageSrc && (\n <img\n src={bgImageSrc}\n alt=\"\"\n aria-hidden=\"true\"\n style={{\n position: \"fixed\",\n inset: 0,\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n objectPosition: \"bottom\",\n opacity: 0.25,\n pointerEvents: \"none\",\n zIndex: 0,\n }}\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 layers — gradient + dot grid + blur orbs (contained within hero) */}\n <div style={{ position: \"absolute\", inset: 0, pointerEvents: \"none\" }}>\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n background:\n \"linear-gradient(to bottom right, rgba(50,80,0,0.15), transparent 50%, rgba(80,40,0,0.1))\",\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={{\n position: \"absolute\",\n top: 0,\n left: \"25%\",\n width: 384,\n height: 384,\n background: \"rgba(199,255,46,0.04)\",\n borderRadius: 9999,\n filter: \"blur(96px)\",\n }}\n />\n <div\n style={{\n position: \"absolute\",\n bottom: 0,\n right: \"25%\",\n width: 384,\n height: 384,\n background: \"rgba(247,104,22,0.03)\",\n borderRadius: 9999,\n filter: \"blur(96px)\",\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 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 <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\n {/* Disclaimer */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 12,\n marginTop: 48,\n padding: 16,\n borderRadius: 12,\n border: \"1px solid rgba(39,39,42,0.5)\",\n background: \"rgba(24,24,27,0.3)\",\n }}\n >\n <svg\n viewBox=\"0 0 24 24\"\n style={{\n width: 16,\n height: 16,\n color: \"#71717a\",\n flexShrink: 0,\n marginTop: 1,\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 <div>\n <p\n style={{\n fontSize: 12,\n fontWeight: 500,\n color: \"#a1a1aa\",\n margin: \"0 0 4px\",\n }}\n >\n {t(\"predict.matches.experimentalFeature\" as const)}\n </p>\n <p\n style={{\n fontSize: 11,\n color: \"#52525b\",\n lineHeight: 1.625,\n margin: 0,\n }}\n >\n {t(\"predict.matches.disclaimer\" as const)}\n </p>\n </div>\n </div>\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 {\n Button,\n Modal,\n ModalContent,\n ModalHeader,\n ModalBody,\n ModalFooter,\n Spinner,\n} from \"@liberfi.io/ui\";\n\nexport interface SetupModalProps {\n isOpen: boolean;\n onClose: () => void;\n evmAddress: string;\n safeDeployed: boolean;\n tokenApproved: boolean;\n /**\n * Whether Polymarket L2 API credentials are already derived.\n * Comes from `PolymarketContext.credentials !== null`.\n */\n keysConnected: boolean;\n /**\n * Callback to deploy Safe + approve tokens (Steps 1-2).\n * The consuming app provides the implementation using RelayClient.\n */\n onDeployAndApprove: () => Promise<void>;\n /**\n * Callback to trigger L2 key derivation (Step 3).\n * Provided by the consuming app that has access to the wallet signer.\n */\n onConnectKeys?: () => Promise<void>;\n}\n\ntype StepStatus = \"pending\" | \"running\" | \"done\";\n\nfunction stepIcon(status: StepStatus) {\n if (status === \"done\") return \"✅\";\n if (status === \"running\") return null;\n return \"⏳\";\n}\n\nexport function SetupModal({\n isOpen,\n onClose,\n evmAddress,\n safeDeployed,\n tokenApproved,\n keysConnected,\n onDeployAndApprove,\n onConnectKeys,\n}: SetupModalProps) {\n const { t } = useTranslation();\n\n const [setupRunning, setSetupRunning] = useState(false);\n const [step3Running, setStep3Running] = useState(false);\n const [setupError, setSetupError] = useState<string | null>(null);\n\n const step1Status: StepStatus = safeDeployed\n ? \"done\"\n : setupRunning\n ? \"running\"\n : \"pending\";\n const step2Status: StepStatus = tokenApproved\n ? \"done\"\n : safeDeployed && setupRunning\n ? \"running\"\n : \"pending\";\n const step3Status: StepStatus = keysConnected\n ? \"done\"\n : step3Running\n ? \"running\"\n : \"pending\";\n\n const allDone = safeDeployed && tokenApproved && keysConnected;\n\n const handleSetup = useCallback(async () => {\n setSetupError(null);\n setSetupRunning(true);\n try {\n await onDeployAndApprove();\n } catch (err) {\n setSetupError(err instanceof Error ? err.message : String(err));\n } finally {\n setSetupRunning(false);\n }\n }, [onDeployAndApprove]);\n\n const handleConnectKeys = useCallback(async () => {\n setSetupError(null);\n setStep3Running(true);\n try {\n if (onConnectKeys) {\n await onConnectKeys();\n }\n } catch (err) {\n setSetupError(err instanceof Error ? err.message : String(err));\n } finally {\n setStep3Running(false);\n }\n }, [onConnectKeys]);\n\n return (\n <Modal isOpen={isOpen} onClose={onClose} size=\"md\">\n <ModalContent>\n <ModalHeader className=\"flex flex-col gap-1\">\n <span className=\"text-lg\">\n 🔧 {t(\"predict.setup.modalTitle\", \"Polymarket Wallet Setup\")}\n </span>\n </ModalHeader>\n <ModalBody className=\"gap-y-4\">\n <p className=\"text-sm text-default-600\">\n {t(\n \"predict.setup.modalDescription\",\n \"Complete these steps to trade on Polymarket. Gas fees are covered.\",\n )}\n </p>\n\n {/* Step 1: Deploy Safe */}\n <div className=\"flex items-center gap-x-3 rounded-lg border border-default-200 p-3\">\n <span className=\"flex h-8 w-8 items-center justify-center rounded-full bg-default-100 text-sm font-bold\">\n {step1Status === \"running\" ? (\n <Spinner size=\"sm\" />\n ) : (\n stepIcon(step1Status)\n )}\n </span>\n <div className=\"flex-1\">\n <p className=\"text-sm font-medium\">\n {t(\"predict.setup.step1\", \"Deploy Safe Wallet\")}\n </p>\n <p className=\"text-xs text-default-400\">\n {step1Status === \"done\"\n ? t(\"predict.setup.stepComplete\", \"Complete\")\n : step1Status === \"running\"\n ? t(\"predict.setup.stepRunning\", \"Processing...\")\n : t(\"predict.setup.stepPending\", \"Pending\")}\n </p>\n </div>\n </div>\n\n {/* Step 2: Approve Token */}\n <div className=\"flex items-center gap-x-3 rounded-lg border border-default-200 p-3\">\n <span className=\"flex h-8 w-8 items-center justify-center rounded-full bg-default-100 text-sm font-bold\">\n {step2Status === \"running\" ? (\n <Spinner size=\"sm\" />\n ) : (\n stepIcon(step2Status)\n )}\n </span>\n <div className=\"flex-1\">\n <p className=\"text-sm font-medium\">\n {t(\"predict.setup.step2\", \"Approve USDC\")}\n </p>\n <p className=\"text-xs text-default-400\">\n {step2Status === \"done\"\n ? t(\"predict.setup.stepComplete\", \"Complete\")\n : step2Status === \"running\"\n ? t(\"predict.setup.stepRunning\", \"Processing...\")\n : t(\"predict.setup.stepPending\", \"Pending\")}\n </p>\n </div>\n </div>\n\n {/* Step 3: Connect API */}\n <div className=\"flex items-center gap-x-3 rounded-lg border border-default-200 p-3\">\n <span className=\"flex h-8 w-8 items-center justify-center rounded-full bg-default-100 text-sm font-bold\">\n {step3Status === \"running\" ? (\n <Spinner size=\"sm\" />\n ) : (\n stepIcon(step3Status)\n )}\n </span>\n <div className=\"flex-1\">\n <p className=\"text-sm font-medium\">\n {t(\"predict.setup.step3\", \"Connect API Keys\")}\n </p>\n <p className=\"text-xs text-default-400\">\n {step3Status === \"done\"\n ? t(\"predict.setup.stepComplete\", \"Complete\")\n : step3Status === \"running\"\n ? t(\"predict.setup.stepRunning\", \"Processing...\")\n : t(\"predict.setup.stepPending\", \"Pending\")}\n </p>\n </div>\n </div>\n\n {setupError && <p className=\"text-xs text-danger\">{setupError}</p>}\n </ModalBody>\n <ModalFooter>\n <Button variant=\"light\" onPress={onClose}>\n {t(\"common.cancel\", \"Cancel\")}\n </Button>\n {allDone ? (\n <Button color=\"success\" onPress={onClose}>\n {t(\"predict.setup.done\", \"Done\")}\n </Button>\n ) : !safeDeployed || !tokenApproved ? (\n <Button\n color=\"primary\"\n isLoading={setupRunning}\n onPress={handleSetup}\n >\n {t(\"predict.setup.setupButton\", \"Set Up Wallet\")}\n </Button>\n ) : (\n <Button\n color=\"primary\"\n isLoading={step3Running}\n onPress={handleConnectKeys}\n >\n {t(\"predict.setup.connectButton\", \"Connect API\")}\n </Button>\n )}\n </ModalFooter>\n </ModalContent>\n </Modal>\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-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/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/source-badge.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_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","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","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","KycModal","isOpen","onClose","kycUrl","Modal","ModalContent","ModalHeader","ModalBody","ModalFooter","Button","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","currentPriceCents","hasAmount","submitLabel","sideLabel","outcomeLabel","winAmount","submitColor","handleHalf","handleMax","showErrors","setShowErrors","handleSubmitPress","Fragment","Tabs","key","StyledNumberInput","pct","err","StyledSwitch","Select","keys","val","SelectItem","u","ChevronDownIcon","TradeFormWidget","chain","authenticatedSubmit","useAuthCallback","adaptedEvent","adaptedMarket","PREDICT_TRADE_MODAL_ID","PredictTradeModal","id","AsyncModal","modalProps","PredictTradeModalContent","params","onOpenChange","isMobile","useScreen","StyledModal","DEFAULT_FILTER_STATE","countActiveFilters","state","EventsFilterUI","onChange","draft","setDraft","handleOpenChange","open","handleReset","handleApply","updateDraft","prev","activeCount","platformOptions","timeRemainingOptions","volumeOptions","liquidityOptions","FilterSection","FilterChipGroup","RefreshIcon","options","selected","allowDeselect","opt","isActive","SORT_PRESETS","SORT_LABEL_KEYS","SORT_ORDER","EventsToolbarUI","sortPreset","onSortChange","sortAsc","onSortAscChange","onFilterPress","filterCount","setIsOpen","dropdownRef","useRef","onClickOutside","e","onEscape","ActiveIcon","SORT_ICONS","Icon","StyledBadge","FilterIcon","CalendarIcon","ChartLineIcon","DropletIcon","TimerIcon","useEventsInfinite","baseParams","resolveEventsParams","infiniteData","isLoading","isFetching","isFetchingMore","isError","error","hasMore","fetchNextPage","refetch","usePredictInfiniteEvents","data","page","item","fetchMore","refetchAll","EventsSkeleton","EventsPageSkeleton","MAX_DISPLAYED_OUTCOMES","C_PRIMARY","C_SECONDARY","C_RED","TEAM_PALETTE","hashString","hash","getOutcomeColors","labels","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","CardHeader","SingleMarketView","ExpandedMarketView","MarketListView","onClick","countdown","Linkable","Avatar","EventIndicators","getEventBadges","badges","isCrypto","isLive","remaining","fiveMin","fifteenMin","cryptoColor","LiveBadge","CryptoCountdownBadge","ClosedBadge","color","onMarketClick","onShowMore","YesNoPill","ChevronRightIcon","SourceIcon","ElevatedButton","bgColor","textColor","shadowColor","el","OutcomeButtons","dynamicColors","labelFormat","c0","c1","effectiveFormat","yesLabel","noLabel","onCollapse","ChevronUpIcon","ChevronLeftIcon","PolymarketIcon","KalshiIcon","MD","LG","XL","GLOW_INSET","ROW_HEIGHT_SM","ROW_HEIGHT_LG","END_ROW_HEIGHT","getColumnCount","width","getRowHeight","EventsUI","events","onFetchMore","getEventHref","containerRef","listRef","containerWidth","containerHeight","useResizeObserver","columnCount","rowHeight","dataRowCount","showEndOfList","totalRowCount","isRowLoaded","index","loadMoreRows","onRowsRendered","useInfiniteLoader","handleScrollToTop","List","EventGridRow","style","onScrollToTop","EndOfListRow","Spinner","startIdx","rowEvents","emptySlots","EventsWidget","tagSlugSelection","limit","sort_by","sort_asc","with_markets","timeRemaining","minVolume","minLiquidity","EventsPage","setTagSlugSelection","filterState","setFilterState","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","PositionVirtualRow","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","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","raw","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","SimilarEventsSection","onEventClick","similarEvents","useSimilarEvents","ev","SimilarEventCard","EventDetailPage","onSimilarEventClick","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","StyledInput","SearchIcon","XCloseIcon","Kbd","SearchResultItemUI","firstTag","useSearchResultListScript","isFetchingNextPage","useSearchEvents","SearchResultListWidget","scriptParams","ref","height","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","SearchEventsButton","modalParams","isDesktop","onOpen","onSelectEventStable","handleOpen","handleClose","handleKeyDown","activeElement","isInEditableElement","SORT_OPTIONS","VOLUME_PRESETS","btnBase","dropdownBase","getVolumeLabel","vol","MatchesFilterBar","onMinVolumeChange","onRefresh","sortOpen","setSortOpen","volumeOpen","setVolumeOpen","tooltipVisible","setTooltipVisible","spinning","setSpinning","sortRef","volumeRef","currentSort","handleClickOutside","handleRefresh","SortIcon","ChevronDown","SortOptionIcon","InfoIcon","shared","onMouseEnter","formatVolume","STAT_CARDS","MatchesHero","stats","line","card","SOURCE_META","DEFAULT_META","getSourceMeta","SourceBadge","meta","getYesPrice","getOutcomeName","getSpreadTier","spreadPercent","SPREAD_THEME","CONFIDENCE_THEME","getConfidenceTierKey","tier","score","SpreadGauge","theme","filled","PLATFORM_COLORS","DEFAULT_PLATFORM","getPlatformColor","MatchMarketCard","match","getMarketHref","priceA","priceB","cheaperSource","title","confKey","confTheme","ctaAccent","PlatformRow","isCheaper","platColor","outcomeName","content","MatchesWidget","forwardRef","onStatsChange","isPlaceholderData","useInfiniteMatchMarkets","keepPreviousData","animKey","setAnimKey","prevIsPlaceholder","setPrevIsPlaceholder","k","staggerBase","pages","acc","useImperativeHandle","allMatches","total","maxSpread","totalVolume","highSpreadCount","sentinelRef","observer","entries","MatchesSkeletonList","SkeletonCard","shimmer","j","SORT_TITLE_KEY","StatusClock","time","setTime","fmt","MatchesStatusBar","MatchesPage","bgImageSrc","setSortBy","setSortAsc","setMinVolume","heroStats","setHeroStats","widgetRef","sort","handleStatsChange","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","parsed","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","stepIcon","SetupModal","safeDeployed","tokenApproved","keysConnected","onDeployAndApprove","onConnectKeys","setupRunning","setSetupRunning","step3Running","setStep3Running","setupError","setSetupError","step1Status","step2Status","step3Status","allDone","handleSetup","handleConnectKeys"],"mappings":"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","file":"index.mjs","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.103\";\n}\n\nexport default \"0.1.103\";\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-1 lg:px-2 lg:py-1\",\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-8 items-stretch gap-x-2 lg:min-h-9\">\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 pl-2 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 p-1 text-base font-normal 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-2 py-1 text-sm font-medium uppercase transition-colors cursor-pointer\",\n isSelected\n ? \"border-transparent bg-primary text-black\"\n : \"border-border/80 text-neutral-200 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-1 lg:px-2 lg:py-1\">\n <div className=\"flex min-h-8 items-center gap-x-2 lg:min-h-9\">\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) */\nexport const ORDER_MIN_QUANTITY = 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 on Safe address\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: polymarketSafeAddress ?? \"\" },\n {\n enabled: enabled && polymarketSetupVerified && !!polymarketSafeAddress,\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 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 } 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 // 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 // ---------------------------------------------------------------------------\n // Validation\n // ---------------------------------------------------------------------------\n const validation = useMemo<TradeFormValidation>(() => {\n const errors: string[] = [];\n if (isNaN(quantity) || quantity < ORDER_MIN_QUANTITY) {\n errors.push(`Minimum quantity is ${ORDER_MIN_QUANTITY}`);\n }\n if (market.status !== \"open\") {\n errors.push(\"Market is not active\");\n }\n if (\n side === \"buy\" &&\n usdcBalance != null &&\n !isNaN(quantity) &&\n quantity > 0 &&\n quantity > usdcBalance\n ) {\n errors.push(\"Insufficient USDC balance\");\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(\"Insufficient shares\");\n }\n if (\n orderType === \"limit\" &&\n supportsLimitOrder &&\n (isNaN(limitPrice) || limitPrice < 0.01 || limitPrice > 0.99)\n ) {\n errors.push(\"Limit price must be between $0.01 and $0.99\");\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 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 setQuantityRaw(NaN);\n });\n } else {\n setIsSubmitting(false);\n toast.success(t(\"predict.trade.submitSuccess\"));\n fireCelebration();\n setQuantityRaw(NaN);\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 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: \"0.01\",\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 setQuantityRaw(NaN);\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 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 toast.error(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 {\n Button,\n Modal,\n ModalContent,\n ModalHeader,\n ModalBody,\n ModalFooter,\n} 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 <Modal isOpen={isOpen} onClose={onClose} size=\"md\">\n <ModalContent>\n <ModalHeader className=\"flex flex-col gap-1\">\n <span className=\"text-lg\">🛡️ {t(\"predict.trade.kycModalTitle\")}</span>\n </ModalHeader>\n <ModalBody className=\"gap-y-4\">\n <p className=\"text-sm text-default-600\">\n {t(\"predict.trade.kycModalDescription\")}\n </p>\n <ul className=\"flex flex-col gap-y-2 text-sm text-foreground\">\n <li className=\"flex items-start gap-x-2\">\n <span className=\"mt-0.5 text-primary\">✓</span>\n <span>{t(\"predict.trade.kycModalBullet1\")}</span>\n </li>\n <li className=\"flex items-start gap-x-2\">\n <span className=\"mt-0.5 text-primary\">✓</span>\n <span>{t(\"predict.trade.kycModalBullet2\")}</span>\n </li>\n <li className=\"flex items-start gap-x-2\">\n <span className=\"mt-0.5 text-primary\">✓</span>\n <span>{t(\"predict.trade.kycModalBullet3\")}</span>\n </li>\n </ul>\n <p className=\"text-xs text-default-400\">\n {t(\"predict.trade.kycModalNote\")}\n </p>\n </ModalBody>\n <ModalFooter>\n <Button variant=\"light\" onPress={onClose}>\n {t(\"common.cancel\")}\n </Button>\n {kycUrl && (\n <Button\n color=\"primary\"\n onPress={() => {\n window.open(kycUrl, \"_blank\", \"noopener,noreferrer\");\n onClose();\n }}\n >\n {t(\"predict.trade.goToKYC\")}\n </Button>\n )}\n </ModalFooter>\n </ModalContent>\n </Modal>\n );\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Button,\n ChevronDownIcon,\n Tabs,\n Tab,\n StyledNumberInput,\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 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 (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 }, [isSubmitting, kycRequired, hasAmount, side, outcome, potentialProfit, t]);\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={cn(\n \"flex w-full flex-col gap-y-4 p-4\",\n variant === \"bordered\" &&\n \"rounded-xl border border-default-200 bg-content1\",\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 <StyledNumberInput\n key={side}\n aria-label=\"Trade amount\"\n fullWidth\n placeholder=\"0\"\n radius=\"lg\"\n size=\"lg\"\n value={isNaN(quantity) ? undefined : quantity}\n onValueChange={(v) => {\n setShowErrors(false);\n onQuantityChange(v);\n }}\n minValue={0}\n step={side === \"buy\" ? 0.01 : 1}\n formatOptions={\n side === \"buy\"\n ? { maximumFractionDigits: 2 }\n : { maximumFractionDigits: 0 }\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={!hasAmount || isSubmitting}\n isLoading={isSubmitting}\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 type { PredictEvent, PredictMarket } from \"@liberfi.io/react-predict\";\nimport {\n ModalBody,\n ModalContent,\n StyledModal,\n useScreen,\n} 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 { 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 radius=\"lg\"\n >\n <ModalContent>\n <ModalBody className=\"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 </ModalBody>\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// - Sort By (mirrors the toolbar sort dropdown)\n// - Time Remaining\n// - Min Volume\n// - Min Liquidity\n//\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 {\n Button,\n cn,\n StyledModal,\n ModalContent,\n ModalHeader,\n ModalBody,\n ModalFooter,\n RefreshIcon,\n} 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 // Draft state — local copy modified by user, committed on \"Show Results\"\n const [draft, setDraft] = useState<EventsFilterState>(value);\n\n // Sync draft when the modal opens with new value\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 // Pre-translate chip labels so the child component receives plain strings\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 scrollBehavior=\"inside\"\n >\n <ModalContent>\n {/* Header */}\n <ModalHeader className=\"px-4 py-2\">\n <span className=\"text-base font-semibold\">\n {t(\"predict.filter.title\")}\n </span>\n </ModalHeader>\n\n {/* Body */}\n <ModalBody className=\"flex flex-col gap-5\">\n {/* Platform */}\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 {/* Time Remaining */}\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 {/* Min Volume */}\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 {/* Min Liquidity */}\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 </ModalBody>\n\n {/* Footer */}\n <ModalFooter className=\"px-4\">\n <div className=\"w-full flex justify-between items-center\">\n <Button\n variant=\"light\"\n color=\"default\"\n size=\"sm\"\n radius=\"full\"\n startContent={<RefreshIcon width={16} height={16} />}\n onPress={handleReset}\n >\n {t(\"predict.filter.reset\")}\n </Button>\n <Button\n color=\"primary\"\n size=\"sm\"\n radius=\"full\"\n onPress={handleApply}\n >\n {t(\"predict.filter.showResults\")}\n {activeCount > 0 && (\n <span className=\"ml-1 text-xs opacity-80\">({activeCount})</span>\n )}\n </Button>\n </div>\n </ModalFooter>\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 className=\"flex flex-col gap-2.5\">\n <span className=\"text-sm font-semibold text-foreground\">{label}</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\nfunction FilterChipGroup({\n options,\n selected,\n onSelect,\n allowDeselect = true,\n}: FilterChipGroupProps) {\n return (\n <div className=\"flex flex-wrap gap-2\">\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 className={cn(\n \"shrink-0 rounded-lg px-3 py-1.5 text-xs font-medium transition-colors duration-150 cursor-pointer border\",\n isActive\n ? \"bg-primary/15 text-primary border-primary/40\"\n : \"bg-content2 text-foreground/60 border-default-100 hover:bg-default-100 hover:text-foreground\",\n )}\n >\n {opt.label}\n </button>\n );\n })}\n </div>\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// Pixel-level replica of Jupiter's prediction toolbar.\n// Pure presentational component — state is managed by the parent page.\n// =============================================================================\nimport { 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 cn,\n DropletIcon,\n FilterIcon,\n StyledBadge,\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// 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 useEffect(() => {\n if (!isOpen) return;\n const onClickOutside = (e: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(e.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n const onEscape = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") setIsOpen(false);\n };\n document.addEventListener(\"mousedown\", onClickOutside);\n document.addEventListener(\"keydown\", onEscape);\n return () => {\n document.removeEventListener(\"mousedown\", onClickOutside);\n document.removeEventListener(\"keydown\", onEscape);\n };\n }, [isOpen]);\n\n const ActiveIcon = SORT_ICONS[sortPreset];\n\n return (\n <div className={cn(\"flex items-center gap-2\", className)}>\n {/* Sort pill — dropdown + direction toggle */}\n <div\n ref={dropdownRef}\n className=\"relative flex shrink-0 items-center rounded-full border border-border\"\n >\n {/* Sort field selector */}\n <button\n type=\"button\"\n onClick={() => setIsOpen((v) => !v)}\n className=\"flex shrink-0 items-center gap-2 px-3 py-1.5 text-xs font-medium text-neutral transition-colors hover:text-primary/80 cursor-pointer\"\n >\n <ActiveIcon className=\"size-[18px] shrink-0\" />\n <span className=\"whitespace-nowrap\">\n {t(SORT_LABEL_KEYS[sortPreset])}\n </span>\n </button>\n\n {/* Divider */}\n <div className=\"h-6 w-px bg-border\" />\n\n {/* Sort direction toggle */}\n <button\n type=\"button\"\n onClick={() => onSortAscChange(!sortAsc)}\n className=\"px-2.5 py-1.5 text-xs text-neutral transition-colors hover:text-primary/80 cursor-pointer\"\n >\n {sortAsc ? \"↑\" : \"↓\"}\n </button>\n\n {/* Dropdown menu */}\n {isOpen && (\n <div className=\"absolute left-0 top-full z-20 mt-1 flex min-w-max flex-col gap-0.5 rounded-lg border border-border bg-content1 p-1 shadow-lg\">\n {SORT_ORDER.map((key) => {\n const Icon = SORT_ICONS[key];\n return (\n <button\n key={key}\n type=\"button\"\n onClick={() => {\n onSortChange(key);\n setIsOpen(false);\n }}\n className={cn(\n \"flex w-full items-center gap-2 rounded px-2.5 py-1.5 text-xs font-medium transition-colors cursor-pointer\",\n key === sortPreset\n ? \"bg-primary/10 text-primary\"\n : \"text-neutral hover:bg-content2 hover:text-foreground\",\n )}\n >\n <Icon className=\"size-4 shrink-0\" />\n <span>{t(SORT_LABEL_KEYS[key])}</span>\n </button>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Filter button */}\n <StyledBadge\n content={filterCount > 0 ? filterCount : undefined}\n color=\"primary\"\n size=\"sm\"\n isInvisible={filterCount === 0}\n >\n <button\n type=\"button\"\n onClick={onFilterPress}\n className=\"flex shrink-0 items-center gap-2 rounded-full border border-border px-3 py-1.5 text-xs font-medium text-neutral transition-colors hover:text-primary/80 cursor-pointer\"\n >\n <FilterIcon className=\"size-[18px]\" />\n <span className=\"whitespace-nowrap\">{t(\"predict.filter.title\")}</span>\n </button>\n </StyledBadge>\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Sort option icon map\n// -----------------------------------------------------------------------------\n\nconst SORT_ICONS: Record<SortPreset, React.FC<{ className?: string }>> = {\n start_time: CalendarIcon,\n volume: ChartLineIcon,\n liquidity: DropletIcon,\n ending_soon: TimerIcon,\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 { Skeleton } from \"@liberfi.io/ui\";\nimport { DEFAULT_PAGE_SIZE } from \"../../consts\";\n\nexport interface EventsSkeletonProps {\n count?: number;\n}\n\nexport function EventsSkeleton({ count = 6 }: EventsSkeletonProps) {\n return (\n <div className=\"grid w-full grid-cols-1 gap-0 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\">\n {Array.from({ length: count }).map((_, i) => (\n <div key={i} className=\"p-2\">\n <div className=\"flex h-full min-h-52 flex-col rounded-xl border border-border/90 bg-background p-3 lg:min-h-72 lg:p-4\">\n <div className=\"flex items-center gap-3\">\n <Skeleton className=\"size-10 shrink-0 rounded-lg\" />\n <div className=\"flex flex-1 flex-col gap-1\">\n <Skeleton className=\"h-4 w-11/12 rounded\" />\n <Skeleton className=\"h-3 w-2/5 rounded\" />\n </div>\n </div>\n\n <div className=\"mt-3 flex flex-1 flex-col gap-2 lg:gap-3\">\n <div className=\"flex items-center justify-between gap-2\">\n <Skeleton className=\"h-7 w-1/2 rounded\" />\n <Skeleton className=\"h-7 w-[85px] rounded-lg lg:h-9 lg:w-24\" />\n </div>\n <div className=\"flex items-center justify-between gap-2\">\n <Skeleton className=\"h-7 w-3/5 rounded\" />\n <Skeleton className=\"h-7 w-[85px] rounded-lg lg:h-9 lg:w-24\" />\n </div>\n <div className=\"flex items-center justify-between gap-2\">\n <Skeleton className=\"h-7 w-2/5 rounded\" />\n <Skeleton className=\"h-7 w-[85px] rounded-lg lg:h-9 lg:w-24\" />\n </div>\n </div>\n\n <div className=\"mt-auto flex items-center justify-between pt-3\">\n <Skeleton className=\"h-3 w-20 rounded\" />\n <Skeleton className=\"h-3 w-24 rounded\" />\n </div>\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nexport interface EventsPageSkeletonProps extends EventsSkeletonProps {}\n\n/**\n * Page-level loading skeleton for `EventsPage`.\n * Includes placeholders for categories / toolbar, then the events grid skeleton.\n */\nexport function EventsPageSkeleton({\n count = DEFAULT_PAGE_SIZE,\n}: EventsPageSkeletonProps) {\n return (\n <div className=\"flex h-full w-full max-w-[1680px] mx-auto flex-col gap-y-3\">\n <div className=\"flex min-h-8 items-center justify-between gap-3 lg:min-h-9\">\n <div className=\"flex items-center gap-2 overflow-hidden\">\n <Skeleton className=\"h-6 w-16 rounded\" />\n <Skeleton className=\"h-6 w-20 rounded\" />\n <Skeleton className=\"h-6 w-16 rounded\" />\n <Skeleton className=\"h-6 w-20 rounded\" />\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n <Skeleton className=\"h-7 w-28 rounded-full\" />\n <Skeleton className=\"h-7 w-24 rounded-full\" />\n </div>\n </div>\n\n <div className=\"min-h-0 flex-1\">\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// 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`;\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 return (\n <div\n className={cn(\n \"group flex h-full w-full flex-col rounded-xl\",\n \"min-h-52 border border-border/90 bg-background p-3\",\n \"lg:min-h-72 lg:max-w-md lg:p-4\",\n \"gap-y-1.5 lg:gap-y-4\",\n \"transition duration-300\",\n \"hover:border-primary/40 hover:shadow-card-glow\",\n \"focus-within:border-primary/40 focus-within:shadow-card-glow\",\n !isExpanded && \"cursor-pointer\",\n )}\n onMouseEnter={() => onHover?.(event)}\n onClick={handleCardClick}\n >\n <style>{injectedCSS}</style>\n {/* ---- Header ---- */}\n <CardHeader\n event={event}\n href={href}\n LinkComponent={LinkComponent}\n onClick={handleHeaderClick}\n isExpanded={isExpanded}\n />\n\n {/* ---- Body ---- */}\n <div className=\"flex flex-1 flex-col\">\n {singleMarket ? (\n <SingleMarketView\n market={openMarkets[0]}\n event={event}\n formattedVolume={formattedVolume}\n href={href}\n LinkComponent={LinkComponent}\n onSelect={onSelect}\n onSelectOutcome={onSelectOutcome}\n />\n ) : expandedMarket ? (\n <ExpandedMarketView\n market={expandedMarket}\n event={event}\n onCollapse={() => setExpandedSlug(null)}\n onSelectOutcome={onSelectOutcome}\n />\n ) : (\n <MarketListView\n displayedMarkets={displayedMarkets}\n moreCount={moreCount}\n formattedVolume={formattedVolume}\n source={event.source}\n href={href}\n LinkComponent={LinkComponent}\n onMarketClick={(m) => setExpandedSlug(m.slug)}\n onShowMore={handleShowMore}\n />\n )}\n </div>\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 view (normal card body)\n// -----------------------------------------------------------------------------\n\nfunction MarketListView({\n displayedMarkets,\n moreCount,\n formattedVolume,\n source,\n href,\n LinkComponent,\n onMarketClick,\n onShowMore,\n}: {\n displayedMarkets: PredictMarket[];\n moreCount: number;\n formattedVolume: string;\n source: ProviderSource;\n href?: string;\n LinkComponent?: LinkComponentType;\n onMarketClick: (market: PredictMarket) => void;\n onShowMore: React.MouseEventHandler;\n}) {\n const { t } = useTranslation();\n\n return (\n <>\n {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 )}\n\n {/* Footer */}\n <div className=\"mt-auto flex items-center justify-between pt-3\">\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-neutral-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 className=\"inline-flex items-center gap-x-1.5 text-[10px] font-normal text-neutral-500 lg:text-xs\">\n {formattedVolume} {t(\"predict.event.volume\")}\n <SourceIcon source={source} />\n </span>\n </div>\n </>\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 view (only 1 open market — show buttons directly + View Event)\n// -----------------------------------------------------------------------------\n\nfunction SingleMarketView({\n market,\n event,\n formattedVolume,\n href,\n LinkComponent,\n onSelect,\n onSelectOutcome,\n}: {\n market: PredictMarket;\n event: PredictEvent;\n formattedVolume: string;\n href?: string;\n LinkComponent?: LinkComponentType;\n onSelect?: (event: PredictEvent) => void;\n onSelectOutcome?: (\n event: PredictEvent,\n market: PredictMarket,\n side: \"yes\" | \"no\",\n ) => 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 <div className=\"flex-1\">\n <OutcomeButtons\n market={market}\n event={event}\n onSelectOutcome={onSelectOutcome}\n dynamicColors\n labelFormat=\"label\"\n />\n </div>\n\n {/* Footer: View Event + Volume */}\n <div className=\"mt-auto flex items-center justify-between pt-3\">\n <Linkable\n href={href}\n LinkComponent={LinkComponent}\n as=\"button\"\n className=\"flex items-center gap-1 text-[10px] font-normal text-neutral-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 className=\"inline-flex items-center gap-x-1.5 text-[10px] font-normal text-neutral-500 lg:text-xs\">\n {formattedVolume} {t(\"predict.event.volume\")}\n <SourceIcon source={event.source} />\n </span>\n </div>\n </>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Expanded market view (single market with large Yes/No buttons)\n// -----------------------------------------------------------------------------\n\nfunction ExpandedMarketView({\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 { t } = useTranslation();\n const pct = getYesPercent(market);\n\n return (\n <>\n <div className=\"flex-1\">\n {/* Market header with collapse toggle */}\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\n {/* Yes / No buy buttons */}\n <div className=\"mt-3\">\n <OutcomeButtons\n market={market}\n event={event}\n onSelectOutcome={onSelectOutcome}\n labelFormat=\"action\"\n />\n </div>\n </div>\n\n {/* Back */}\n <button\n type=\"button\"\n className=\"mt-auto flex items-center gap-x-1 pt-4 text-[10px] font-normal text-neutral-500 transition-colors hover:text-slate-200 cursor-pointer lg:text-xs\"\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 </>\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 virtual grid: PredictEvent[] with EventItem cards.\n// Layout: responsive 1-4 column grid with react-window virtualisation and\n// infinite-scroll sentinel row.\n// =============================================================================\nimport { useCallback, useRef } from \"react\";\nimport {\n List,\n type ListImperativeAPI,\n type RowComponentProps,\n} 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, PredictMarket } from \"@liberfi.io/react-predict\";\nimport { Spinner } from \"@liberfi.io/ui\";\nimport type { LinkComponentType } from \"@liberfi.io/ui\";\nimport { EventItem } from \"./event-item.ui\";\n\nconst MD = 768;\nconst LG = 1024;\nconst XL = 1280;\n\nconst GLOW_INSET = 8;\n\nconst ROW_HEIGHT_SM = 224;\nconst ROW_HEIGHT_LG = 304;\n\nconst END_ROW_HEIGHT = 114;\n\nfunction getColumnCount(width: number): number {\n if (width >= XL) return 4;\n if (width >= LG) return 3;\n if (width >= MD) return 2;\n return 1;\n}\n\nfunction getRowHeight(width: number): number {\n if (width >= LG) return ROW_HEIGHT_LG;\n return ROW_HEIGHT_SM;\n}\n\n// -----------------------------------------------------------------------------\n// EventsUI\n// -----------------------------------------------------------------------------\n\nexport type EventsUIProps = {\n events: PredictEvent[];\n hasMore?: 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 onFetchMore,\n onSelect,\n onSelectOutcome,\n getEventHref,\n LinkComponent,\n onHover,\n}: EventsUIProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const listRef = useRef<ListImperativeAPI>(null);\n const { width: containerWidth = 0, height: containerHeight = 0 } =\n useResizeObserver({ ref: containerRef });\n\n const columnCount = getColumnCount(containerWidth);\n const rowHeight = getRowHeight(containerWidth);\n const dataRowCount = Math.ceil(events.length / columnCount) || 0;\n const showEndOfList = !hasMore && events.length > 0;\n const totalRowCount =\n dataRowCount + (hasMore ? 1 : 0) + (showEndOfList ? 1 : 0);\n\n const isRowLoaded = useCallback(\n (index: number) => index < dataRowCount,\n [dataRowCount],\n );\n\n const loadMoreRows = useCallback(async () => {\n onFetchMore?.();\n }, [onFetchMore]);\n\n const onRowsRendered = useInfiniteLoader({\n isRowLoaded,\n loadMoreRows,\n rowCount: totalRowCount,\n threshold: 3,\n });\n\n const handleScrollToTop = useCallback(() => {\n listRef.current?.scrollToRow({ index: 0, behavior: \"smooth\" });\n }, []);\n\n return (\n <div ref={containerRef} className=\"@container w-full h-full\">\n {containerHeight > 0 && (\n <List\n listRef={listRef}\n className=\"no-scrollbar\"\n style={{ height: containerHeight }}\n onRowsRendered={onRowsRendered}\n rowComponent={EventGridRow}\n rowCount={totalRowCount}\n rowHeight={(index) => {\n if (showEndOfList && index === totalRowCount - 1)\n return END_ROW_HEIGHT;\n if (hasMore && index >= dataRowCount) return rowHeight;\n return rowHeight;\n }}\n rowProps={{\n events,\n columnCount,\n dataRowCount,\n showEndOfList,\n totalRowCount,\n onSelect,\n onSelectOutcome,\n getEventHref,\n LinkComponent,\n onHover,\n onScrollToTop: handleScrollToTop,\n }}\n />\n )}\n </div>\n );\n}\n\n// -----------------------------------------------------------------------------\n// Row component\n// -----------------------------------------------------------------------------\n\ntype EventGridRowData = {\n events: PredictEvent[];\n columnCount: number;\n dataRowCount: number;\n showEndOfList: boolean;\n totalRowCount: number;\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 onScrollToTop?: () => void;\n};\n\nfunction EventGridRow({\n index,\n style,\n events,\n columnCount,\n dataRowCount,\n showEndOfList,\n totalRowCount,\n onSelect,\n onSelectOutcome,\n getEventHref,\n LinkComponent,\n onHover,\n onScrollToTop,\n}: RowComponentProps<EventGridRowData>) {\n if (showEndOfList && index === totalRowCount - 1) {\n return (\n <div style={style}>\n <EndOfListRow onScrollToTop={onScrollToTop} />\n </div>\n );\n }\n\n if (index >= dataRowCount) {\n return (\n <div style={style} className=\"flex justify-center items-start pt-4\">\n <Spinner size=\"sm\" />\n </div>\n );\n }\n\n const startIdx = index * columnCount;\n const rowEvents = events.slice(startIdx, startIdx + columnCount);\n const emptySlots = columnCount - rowEvents.length;\n\n return (\n <div style={style}>\n <div className=\"flex w-full h-full\">\n {rowEvents.map((event, i) =>\n event == null ? null : (\n <div\n className=\"flex-1 min-w-0 flex\"\n key={`${startIdx + i}-${event.source}-${event.slug}`}\n style={{ padding: GLOW_INSET }}\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 {emptySlots > 0 &&\n Array.from({ length: emptySlots }).map((_, i) => (\n <div key={`spacer-${i}`} style={{ flex: 1, minWidth: 0 }} />\n ))}\n </div>\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 } = 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 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// Composes:\n// - CategoriesWidget — category / tag navigation (static data, slug-based)\n// - EventsToolbarUI — sort dropdown + filter button\n// - EventsFilterUI — filter modal (platform, sort, time, volume, liquidity)\n// - EventsWidget — events grid backed by @liberfi.io/react-predict\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 { 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 {\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}\n\n// -----------------------------------------------------------------------------\n// Component\n// -----------------------------------------------------------------------------\n\nexport function EventsPage({\n onSelect,\n onSelectOutcome,\n getEventHref,\n LinkComponent,\n onHover,\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 {\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 className=\"flex h-full w-full max-w-[1680px] mx-auto flex-col gap-y-3\">\n <CategoriesWidget onSelect={handleCategorySelect} trailing={toolbar} />\n\n <EventsFilterUI\n isOpen={isFilterOpen}\n onClose={closeFilter}\n value={filterState}\n onChange={handleFilterChange}\n />\n\n <div className=\"min-h-0 flex-1\">\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","import { Skeleton } from \"@liberfi.io/ui\";\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 <div className=\"flex w-full flex-col gap-4 animate-pulse lg:gap-6\">\n {/* Back button placeholder */}\n {showBack && <div className=\"h-5\" />}\n\n {/* Header — avatar + tags + title */}\n <div className=\"flex items-center gap-x-2 h-16 lg:h-20 lg:gap-x-4\">\n <Skeleton className=\"size-16 shrink-0 rounded-lg lg:size-20\" />\n <div className=\"flex min-w-0 flex-1 flex-col gap-1.5\">\n <div className=\"flex items-center gap-1.5\">\n <Skeleton className=\"h-3.5 w-12 rounded\" />\n <Skeleton className=\"h-3.5 w-10 rounded\" />\n <Skeleton className=\"h-3.5 w-10 rounded\" />\n </div>\n <Skeleton className=\"h-5 w-full max-w-sm rounded lg:h-6\" />\n </div>\n </div>\n\n {/* Countdown */}\n <Skeleton className=\"h-4 w-48 rounded\" />\n\n {/* Chart area — legend + chart + bottom bar */}\n <div className=\"flex flex-col gap-3\">\n {/* Legend bar */}\n <div className=\"flex items-center gap-4\">\n <Skeleton className=\"h-4 w-24 rounded\" />\n <Skeleton className=\"h-4 w-20 rounded\" />\n </div>\n {/* Chart body (300px) */}\n <Skeleton className=\"h-[300px] w-full rounded-xl\" />\n {/* Bottom bar — volume + interval switcher */}\n <div className=\"flex items-center justify-between\">\n <Skeleton className=\"h-4 w-20 rounded\" />\n <div className=\"flex items-center gap-2\">\n <Skeleton className=\"h-7 w-[200px] rounded-lg\" />\n <Skeleton className=\"h-7 w-28 rounded-lg\" />\n </div>\n </div>\n </div>\n\n {/* Markets table */}\n <div className=\"flex flex-col\">\n {/* Table header */}\n <div className=\"flex items-center py-2\">\n <div className=\"flex-1\" />\n <Skeleton className=\"h-3.5 w-14 rounded\" />\n <div className=\"flex-1\" />\n </div>\n {/* Market rows */}\n {Array.from({ length: marketCount }).map((_, i) => (\n <div\n key={i}\n className=\"flex items-center gap-x-2 border-b border-border py-2.5 lg:gap-x-3\"\n >\n <Skeleton className=\"size-5 shrink-0 rounded-lg lg:size-8\" />\n <div className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <Skeleton className=\"h-3.5 w-32 rounded lg:h-4 lg:w-48\" />\n <Skeleton className=\"h-2.5 w-16 rounded\" />\n </div>\n <Skeleton className=\"h-4 w-10 rounded\" />\n <div className=\"flex items-center gap-2\">\n <Skeleton className=\"h-8 w-16 rounded-lg lg:w-24\" />\n <Skeleton className=\"h-8 w-16 rounded-lg lg:w-24\" />\n </div>\n </div>\n ))}\n </div>\n\n {/* Rules */}\n <div className=\"flex flex-col gap-2\">\n <Skeleton className=\"h-4 w-16 rounded\" />\n <Skeleton className=\"h-3.5 w-full rounded\" />\n <Skeleton className=\"h-3.5 w-4/5 rounded\" />\n <Skeleton className=\"h-3.5 w-3/5 rounded\" />\n </div>\n </div>\n );\n}\n\nexport function TradeFormSkeleton() {\n return (\n <div className=\"flex flex-col gap-3 rounded-xl border border-border p-4 animate-pulse\">\n <Skeleton className=\"h-10 w-full rounded-lg\" />\n <Skeleton className=\"h-24 w-full rounded-lg\" />\n <Skeleton className=\"h-10 w-full rounded-lg\" />\n </div>\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\",\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\",\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 { 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\";\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}\n\nexport interface SimilarEventCardProps {\n event: PredictEvent;\n onClick?: (event: PredictEvent) => void;\n}\n\n// ---------------------------------------------------------------------------\n// SimilarEventsSection\n// ---------------------------------------------------------------------------\n\nexport function SimilarEventsSection({\n eventSlug,\n source,\n limit = 4,\n onEventClick,\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 className=\"text-sm font-semibold text-foreground lg:text-base\">\n {t(\"predict.similar.title\")}\n </span>\n <div className=\"grid grid-cols-1 gap-3\">\n {similarEvents.map((ev) => (\n <SimilarEventCard\n key={`${ev.source}-${ev.slug}`}\n event={ev}\n onClick={onEventClick}\n />\n ))}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// SimilarEventCard\n// ---------------------------------------------------------------------------\n\nexport function SimilarEventCard({ event, onClick }: SimilarEventCardProps) {\n const volume = event.volume;\n return (\n <button\n type=\"button\"\n onClick={() => onClick?.(event)}\n className=\"flex items-center gap-x-3 rounded-xl border border-border p-3 hover:bg-content2 transition-colors cursor-pointer text-left w-full\"\n >\n <Avatar\n src={event.image_url || undefined}\n name={event.title?.[0] || \"?\"}\n radius=\"lg\"\n className=\"size-8 shrink-0 bg-transparent\"\n imgProps={{ className: \"object-cover\" }}\n />\n <div className=\"flex flex-col min-w-0 flex-1\">\n <span className=\"text-sm font-medium text-foreground truncate\">\n {event.title}\n </span>\n {volume != null && volume > 0 && (\n <span className=\"text-xs text-neutral\">\n ${Math.round(volume).toLocaleString()} vol\n </span>\n )}\n </div>\n <ChevronRightIcon className=\"h-4 w-4 text-neutral shrink-0\" />\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 /** 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 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 />\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=\"flat\"\n radius=\"full\"\n value={value}\n onValueChange={onValueChange}\n placeholder={t(\"predict.search.placeholder\")}\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-border rounded-full 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, ProviderSource } from \"@liberfi.io/react-predict\";\nimport {\n Avatar,\n cn,\n KalshiIcon,\n Linkable,\n PolymarketIcon,\n} from \"@liberfi.io/ui\";\nimport type { LinkComponentType } from \"@liberfi.io/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// 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\n const formattedVolume = useMemo(() => {\n const vol = Math.round(event.volume ?? 0);\n return `$${vol.toLocaleString(\"en-US\")}`;\n }, [event.volume]);\n\n return (\n <Linkable\n href={href}\n LinkComponent={LinkComponent}\n className={cn(\n \"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 // When href is present, Next.js Link would also navigate client-side.\n // Prevent that so navigation is handled exactly once by the onSelect callback\n // (which closes the modal, then the caller does router.push).\n // Right-click / middle-click \"Open in new tab\" still works via href.\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 truncate\">\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 {firstTag && (\n <span\n className={cn(\n \"inline-flex items-center\",\n \"rounded-full px-1.5 py-0.5\",\n \"text-[10px] font-semibold leading-none uppercase\",\n \"bg-primary/15 text-primary\",\n )}\n >\n {firstTag.label}\n </span>\n )}\n <span className=\"inline-flex items-center gap-x-1.5\">\n {formattedVolume} {t(\"predict.event.volume\")}\n <SourceIcon source={event.source} />\n </span>\n </div>\n </div>\n </Linkable>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Source (platform) icon\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","\"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({ keyword, limit, source }, { enabled: true });\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 = 56;\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 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 className=\"w-full h-full\">\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 `}</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 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 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 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 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 { 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 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\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\"\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 el.style.borderColor = \"rgba(63,63,70,0.6)\";\n el.style.boxShadow = `0 8px 24px -4px ${tier === \"high\" ? \"rgba(247,104,22,0.10)\" : \"rgba(199,255,46,0.08)\"}`;\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 {/* 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 const staggerBase = useMemo(() => {\n const pages = data?.pages;\n if (!pages || pages.length <= 1) return 0;\n return pages\n .slice(0, -1)\n .reduce((acc, p) => acc + (p.items?.length ?? 0), 0);\n }, [data?.pages]);\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 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 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 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 {allMatches.map((match, index) => (\n <div\n key={`${animKey}-${match.match_id}-${match.source_a}-${match.market_a?.slug ?? index}`}\n style={{\n animation: `matchCardEnter 0.45s cubic-bezier(0.34,1.56,0.64,1) ${Math.max(0, index - staggerBase) * 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 </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 </div>\n );\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 { useState, useCallback, useRef, useEffect } 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 setHeroStats(stats);\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 {/* Background image — fixed, covers viewport like matchr.xyz */}\n {bgImageSrc && (\n <img\n src={bgImageSrc}\n alt=\"\"\n aria-hidden=\"true\"\n style={{\n position: \"fixed\",\n inset: 0,\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n objectPosition: \"bottom\",\n opacity: 0.4,\n pointerEvents: \"none\",\n zIndex: 0,\n }}\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 layers — gradient + dot grid + blur orbs (contained within hero) */}\n <div style={{ position: \"absolute\", inset: 0, pointerEvents: \"none\" }}>\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n background:\n \"linear-gradient(to bottom right, rgba(50,80,0,0.15), transparent 50%, rgba(80,40,0,0.1))\",\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={{\n position: \"absolute\",\n top: 0,\n left: \"25%\",\n width: 384,\n height: 384,\n background: \"rgba(199,255,46,0.04)\",\n borderRadius: 9999,\n filter: \"blur(96px)\",\n }}\n />\n <div\n style={{\n position: \"absolute\",\n bottom: 0,\n right: \"25%\",\n width: 384,\n height: 384,\n background: \"rgba(247,104,22,0.03)\",\n borderRadius: 9999,\n filter: \"blur(96px)\",\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 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 {\n Button,\n Modal,\n ModalContent,\n ModalHeader,\n ModalBody,\n ModalFooter,\n Spinner,\n} from \"@liberfi.io/ui\";\n\nexport interface SetupModalProps {\n isOpen: boolean;\n onClose: () => void;\n evmAddress: string;\n safeDeployed: boolean;\n tokenApproved: boolean;\n /**\n * Whether Polymarket L2 API credentials are already derived.\n * Comes from `PolymarketContext.credentials !== null`.\n */\n keysConnected: boolean;\n /**\n * Callback to deploy Safe + approve tokens (Steps 1-2).\n * The consuming app provides the implementation using RelayClient.\n */\n onDeployAndApprove: () => Promise<void>;\n /**\n * Callback to trigger L2 key derivation (Step 3).\n * Provided by the consuming app that has access to the wallet signer.\n */\n onConnectKeys?: () => Promise<void>;\n}\n\ntype StepStatus = \"pending\" | \"running\" | \"done\";\n\nfunction stepIcon(status: StepStatus) {\n if (status === \"done\") return \"✅\";\n if (status === \"running\") return null;\n return \"⏳\";\n}\n\nexport function SetupModal({\n isOpen,\n onClose,\n evmAddress,\n safeDeployed,\n tokenApproved,\n keysConnected,\n onDeployAndApprove,\n onConnectKeys,\n}: SetupModalProps) {\n const { t } = useTranslation();\n\n const [setupRunning, setSetupRunning] = useState(false);\n const [step3Running, setStep3Running] = useState(false);\n const [setupError, setSetupError] = useState<string | null>(null);\n\n const step1Status: StepStatus = safeDeployed\n ? \"done\"\n : setupRunning\n ? \"running\"\n : \"pending\";\n const step2Status: StepStatus = tokenApproved\n ? \"done\"\n : safeDeployed && setupRunning\n ? \"running\"\n : \"pending\";\n const step3Status: StepStatus = keysConnected\n ? \"done\"\n : step3Running\n ? \"running\"\n : \"pending\";\n\n const allDone = safeDeployed && tokenApproved && keysConnected;\n\n const handleSetup = useCallback(async () => {\n setSetupError(null);\n setSetupRunning(true);\n try {\n await onDeployAndApprove();\n } catch (err) {\n setSetupError(err instanceof Error ? err.message : String(err));\n } finally {\n setSetupRunning(false);\n }\n }, [onDeployAndApprove]);\n\n const handleConnectKeys = useCallback(async () => {\n setSetupError(null);\n setStep3Running(true);\n try {\n if (onConnectKeys) {\n await onConnectKeys();\n }\n } catch (err) {\n setSetupError(err instanceof Error ? err.message : String(err));\n } finally {\n setStep3Running(false);\n }\n }, [onConnectKeys]);\n\n return (\n <Modal isOpen={isOpen} onClose={onClose} size=\"md\">\n <ModalContent>\n <ModalHeader className=\"flex flex-col gap-1\">\n <span className=\"text-lg\">\n 🔧 {t(\"predict.setup.modalTitle\", \"Polymarket Wallet Setup\")}\n </span>\n </ModalHeader>\n <ModalBody className=\"gap-y-4\">\n <p className=\"text-sm text-default-600\">\n {t(\n \"predict.setup.modalDescription\",\n \"Complete these steps to trade on Polymarket. Gas fees are covered.\",\n )}\n </p>\n\n {/* Step 1: Deploy Safe */}\n <div className=\"flex items-center gap-x-3 rounded-lg border border-default-200 p-3\">\n <span className=\"flex h-8 w-8 items-center justify-center rounded-full bg-default-100 text-sm font-bold\">\n {step1Status === \"running\" ? (\n <Spinner size=\"sm\" />\n ) : (\n stepIcon(step1Status)\n )}\n </span>\n <div className=\"flex-1\">\n <p className=\"text-sm font-medium\">\n {t(\"predict.setup.step1\", \"Deploy Safe Wallet\")}\n </p>\n <p className=\"text-xs text-default-400\">\n {step1Status === \"done\"\n ? t(\"predict.setup.stepComplete\", \"Complete\")\n : step1Status === \"running\"\n ? t(\"predict.setup.stepRunning\", \"Processing...\")\n : t(\"predict.setup.stepPending\", \"Pending\")}\n </p>\n </div>\n </div>\n\n {/* Step 2: Approve Token */}\n <div className=\"flex items-center gap-x-3 rounded-lg border border-default-200 p-3\">\n <span className=\"flex h-8 w-8 items-center justify-center rounded-full bg-default-100 text-sm font-bold\">\n {step2Status === \"running\" ? (\n <Spinner size=\"sm\" />\n ) : (\n stepIcon(step2Status)\n )}\n </span>\n <div className=\"flex-1\">\n <p className=\"text-sm font-medium\">\n {t(\"predict.setup.step2\", \"Approve USDC\")}\n </p>\n <p className=\"text-xs text-default-400\">\n {step2Status === \"done\"\n ? t(\"predict.setup.stepComplete\", \"Complete\")\n : step2Status === \"running\"\n ? t(\"predict.setup.stepRunning\", \"Processing...\")\n : t(\"predict.setup.stepPending\", \"Pending\")}\n </p>\n </div>\n </div>\n\n {/* Step 3: Connect API */}\n <div className=\"flex items-center gap-x-3 rounded-lg border border-default-200 p-3\">\n <span className=\"flex h-8 w-8 items-center justify-center rounded-full bg-default-100 text-sm font-bold\">\n {step3Status === \"running\" ? (\n <Spinner size=\"sm\" />\n ) : (\n stepIcon(step3Status)\n )}\n </span>\n <div className=\"flex-1\">\n <p className=\"text-sm font-medium\">\n {t(\"predict.setup.step3\", \"Connect API Keys\")}\n </p>\n <p className=\"text-xs text-default-400\">\n {step3Status === \"done\"\n ? t(\"predict.setup.stepComplete\", \"Complete\")\n : step3Status === \"running\"\n ? t(\"predict.setup.stepRunning\", \"Processing...\")\n : t(\"predict.setup.stepPending\", \"Pending\")}\n </p>\n </div>\n </div>\n\n {setupError && <p className=\"text-xs text-danger\">{setupError}</p>}\n </ModalBody>\n <ModalFooter>\n <Button variant=\"light\" onPress={onClose}>\n {t(\"common.cancel\", \"Cancel\")}\n </Button>\n {allDone ? (\n <Button color=\"success\" onPress={onClose}>\n {t(\"predict.setup.done\", \"Done\")}\n </Button>\n ) : !safeDeployed || !tokenApproved ? (\n <Button\n color=\"primary\"\n isLoading={setupRunning}\n onPress={handleSetup}\n >\n {t(\"predict.setup.setupButton\", \"Set Up Wallet\")}\n </Button>\n ) : (\n <Button\n color=\"primary\"\n isLoading={step3Running}\n onPress={handleConnectKeys}\n >\n {t(\"predict.setup.connectButton\", \"Connect API\")}\n </Button>\n )}\n </ModalFooter>\n </ModalContent>\n </Modal>\n );\n}\n"]}
|