@agg-build/ui 1.3.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -5298,482 +5298,131 @@ var import_hooks27 = require("@agg-build/hooks");
5298
5298
  var import_react9 = require("react");
5299
5299
 
5300
5300
  // src/events/list/event-list.utils.ts
5301
- var import_hooks9 = require("@agg-build/hooks");
5302
- var import_sdk = require("@agg-build/sdk");
5303
-
5304
- // src/events/item/event-list-item.utils.ts
5305
5301
  var import_hooks8 = require("@agg-build/hooks");
5306
-
5307
- // src/events/shared/venue-market-cluster.ts
5308
- var toNonEmptyString = (value) => {
5309
- if (typeof value !== "string") return void 0;
5310
- const trimmedValue = value.trim();
5311
- return trimmedValue ? trimmedValue : void 0;
5312
- };
5313
- var addGraphEdge = (adjacencyById, fromMarketId, toMarketId) => {
5314
- var _a, _b;
5315
- if (fromMarketId === toMarketId) return;
5316
- const fromNeighbors = (_a = adjacencyById.get(fromMarketId)) != null ? _a : /* @__PURE__ */ new Set();
5317
- fromNeighbors.add(toMarketId);
5318
- adjacencyById.set(fromMarketId, fromNeighbors);
5319
- const toNeighbors = (_b = adjacencyById.get(toMarketId)) != null ? _b : /* @__PURE__ */ new Set();
5320
- toNeighbors.add(fromMarketId);
5321
- adjacencyById.set(toMarketId, toNeighbors);
5322
- };
5323
- var dedupeSourceMarketsById = (markets) => {
5324
- const seenMarketIds = /* @__PURE__ */ new Set();
5325
- return markets.filter((market) => {
5326
- if (seenMarketIds.has(market.id)) {
5327
- return false;
5328
- }
5329
- seenMarketIds.add(market.id);
5302
+ var import_sdk = require("@agg-build/sdk");
5303
+ var filterOpenEvents = (events) => {
5304
+ return events.filter((event) => {
5305
+ var _a;
5306
+ if (event.status && event.status !== import_hooks8.MarketStatus.open) return false;
5307
+ const openMarkets = (_a = event.venueMarkets) == null ? void 0 : _a.filter(
5308
+ (m) => !m.status || m.status === import_hooks8.MarketStatus.open
5309
+ );
5310
+ if (!openMarkets || openMarkets.length === 0) return false;
5330
5311
  return true;
5331
5312
  });
5332
5313
  };
5333
- var collectDirectRelationMarkets = (market) => {
5334
- var _a, _b, _c;
5335
- const relationMarkets = [];
5336
- const seenRelationIds = /* @__PURE__ */ new Set();
5337
- const addRelationMarket = (relationMarket) => {
5338
- if (!relationMarket) return;
5339
- if (seenRelationIds.has(relationMarket.id)) return;
5340
- seenRelationIds.add(relationMarket.id);
5341
- relationMarkets.push(relationMarket);
5342
- };
5343
- for (const matchedVenueMarket of (_a = market.matchedVenueMarkets) != null ? _a : []) {
5344
- addRelationMarket(matchedVenueMarket);
5314
+ var resolveEventVolume = (event) => {
5315
+ if (typeof event.volume === "number" && Number.isFinite(event.volume)) {
5316
+ return event.volume;
5345
5317
  }
5346
- addRelationMarket(
5347
- (_c = (_b = market.matchEntry) == null ? void 0 : _b.targetVenueMarket) != null ? _c : void 0
5348
- );
5349
- return relationMarkets;
5318
+ return event.venueMarkets.reduce((maxVolume, market) => {
5319
+ if (typeof market.volume !== "number" || !Number.isFinite(market.volume)) {
5320
+ return maxVolume;
5321
+ }
5322
+ return Math.max(maxVolume, market.volume);
5323
+ }, -1);
5350
5324
  };
5351
- var collectUniqueRelatedMarkets = (markets, sourceMarketsById) => {
5352
- const relatedMarketsById = /* @__PURE__ */ new Map();
5353
- for (const market of markets) {
5354
- for (const relatedMarket of collectDirectRelationMarkets(market)) {
5355
- if (sourceMarketsById.has(relatedMarket.id) || relatedMarketsById.has(relatedMarket.id)) {
5356
- continue;
5325
+ var sortEventsByVolumeDesc = (events, sortEventsBy) => {
5326
+ return events.map((event, index) => ({
5327
+ event,
5328
+ index,
5329
+ volume: resolveEventVolume(event)
5330
+ })).sort((left, right) => {
5331
+ if (sortEventsBy === "volume") {
5332
+ if (left.volume !== right.volume) {
5333
+ return right.volume - left.volume;
5357
5334
  }
5358
- relatedMarketsById.set(relatedMarket.id, relatedMarket);
5359
5335
  }
5360
- }
5361
- return Array.from(relatedMarketsById.values());
5336
+ return left.index - right.index;
5337
+ }).map(({ event }) => event);
5362
5338
  };
5363
- var normalizeVenueMarketCluster = (markets, selectedMarketId) => {
5364
- var _a, _b;
5365
- if (markets.length === 0) return [];
5366
- const orderedSourceMarkets = dedupeSourceMarketsById(markets);
5367
- const sourceMarketsById = new Map(orderedSourceMarkets.map((market) => [market.id, market]));
5368
- const orderedRelatedMarkets = collectUniqueRelatedMarkets(
5369
- orderedSourceMarkets,
5370
- sourceMarketsById
5339
+ var resolveEventLifecycle = (event) => {
5340
+ const hasOpenMarket = event.venueMarkets.some(
5341
+ (market) => !market.status || market.status === import_hooks8.MarketStatus.open
5371
5342
  );
5372
- const relatedMarketsById = new Map(orderedRelatedMarkets.map((market) => [market.id, market]));
5373
- const resolvedSelectedMarketId = toNonEmptyString(selectedMarketId);
5374
- if (!resolvedSelectedMarketId) {
5375
- return [...orderedSourceMarkets, ...orderedRelatedMarkets];
5376
- }
5377
- const adjacencyById = /* @__PURE__ */ new Map();
5378
- for (const market of orderedSourceMarkets) {
5379
- for (const relatedMarket of collectDirectRelationMarkets(market)) {
5380
- addGraphEdge(adjacencyById, market.id, relatedMarket.id);
5381
- }
5382
- const targetVenueMarketId = toNonEmptyString((_a = market.matchEntry) == null ? void 0 : _a.targetVenueMarketId);
5383
- if (targetVenueMarketId) {
5384
- addGraphEdge(adjacencyById, market.id, targetVenueMarketId);
5385
- }
5386
- }
5387
- if (!sourceMarketsById.has(resolvedSelectedMarketId) && !relatedMarketsById.has(resolvedSelectedMarketId)) {
5388
- return [];
5389
- }
5390
- const visitedMarketIds = /* @__PURE__ */ new Set();
5391
- const queue = [resolvedSelectedMarketId];
5392
- while (queue.length > 0) {
5393
- const currentMarketId = queue.shift();
5394
- if (!currentMarketId || visitedMarketIds.has(currentMarketId)) {
5395
- continue;
5396
- }
5397
- visitedMarketIds.add(currentMarketId);
5398
- const neighborMarketIds = adjacencyById.get(currentMarketId);
5399
- for (const neighborMarketId of Array.from(neighborMarketIds != null ? neighborMarketIds : /* @__PURE__ */ new Set())) {
5400
- if (!visitedMarketIds.has(neighborMarketId)) {
5401
- queue.push(neighborMarketId);
5402
- }
5403
- }
5404
- }
5405
- const orderedClusterMarkets = [];
5406
- const appendedMarketIds = /* @__PURE__ */ new Set();
5407
- const appendMarket = (market) => {
5408
- if (!market) return;
5409
- if (!visitedMarketIds.has(market.id)) return;
5410
- if (appendedMarketIds.has(market.id)) return;
5411
- appendedMarketIds.add(market.id);
5412
- orderedClusterMarkets.push(market);
5413
- };
5414
- appendMarket(
5415
- (_b = sourceMarketsById.get(resolvedSelectedMarketId)) != null ? _b : relatedMarketsById.get(resolvedSelectedMarketId)
5343
+ if (hasOpenMarket) return "open";
5344
+ const hasUpcomingMarket = event.venueMarkets.some(
5345
+ (market) => market.status === import_hooks8.MarketStatus.unopened
5416
5346
  );
5417
- for (const market of orderedSourceMarkets) {
5418
- appendMarket(market);
5419
- }
5420
- for (const market of orderedRelatedMarkets) {
5421
- appendMarket(market);
5422
- }
5423
- return orderedClusterMarkets;
5424
- };
5425
-
5426
- // src/events/item/event-list-item.utils.ts
5427
- var resolveEventListItemEvent = (fetchedEvent) => {
5428
- if (!fetchedEvent) return void 0;
5429
- if (!fetchedEvent.venueMarkets || fetchedEvent.venueMarkets.length === 0) return void 0;
5430
- return fetchedEvent;
5431
- };
5432
- var normalizeProbability = (value) => {
5433
- if (typeof value !== "number" || !Number.isFinite(value)) return void 0;
5434
- if (value < 0) return 0;
5435
- if (value > 1) return 1;
5436
- return value;
5347
+ if (hasUpcomingMarket) return "upcoming";
5348
+ const hasResolvedMarket = event.venueMarkets.some(
5349
+ (market) => market.status === import_hooks8.MarketStatus.resolved
5350
+ );
5351
+ if (hasResolvedMarket) return "resolved";
5352
+ if (event.status === import_hooks8.MarketStatus.open) return "open";
5353
+ if (event.status === import_hooks8.MarketStatus.unopened) return "upcoming";
5354
+ if (event.status === import_hooks8.MarketStatus.resolved) return "resolved";
5355
+ return "ignore";
5437
5356
  };
5438
- var formatWholePercent = (value) => {
5439
- return `${Math.round(value * 100)}%`;
5357
+ var splitEventsByLifecycle = (events) => {
5358
+ const groupedEvents = events.reduce(
5359
+ (grouped, event) => {
5360
+ const lifecycle = resolveEventLifecycle(event);
5361
+ if (lifecycle === "ignore") return grouped;
5362
+ grouped[lifecycle].push(event);
5363
+ return grouped;
5364
+ },
5365
+ {
5366
+ open: [],
5367
+ upcoming: [],
5368
+ resolved: []
5369
+ }
5370
+ );
5371
+ return {
5372
+ open: sortEventsByVolumeDesc(groupedEvents.open),
5373
+ upcoming: sortEventsByVolumeDesc(groupedEvents.upcoming),
5374
+ resolved: sortEventsByVolumeDesc(groupedEvents.resolved)
5375
+ };
5440
5376
  };
5441
- var hasDateLabel = (outcome) => {
5442
- return !!toDate(outcome.label);
5377
+ var mapEventToEventListItemEvent = (event) => {
5378
+ if (!event.venueMarkets || event.venueMarkets.length === 0) return null;
5379
+ return event;
5443
5380
  };
5444
- var isYesLabel = (label2) => label2.trim().toLowerCase() === "yes";
5445
- var isNoLabel = (label2) => label2.trim().toLowerCase() === "no";
5446
- var hasBinaryOutcomes = (outcomes) => {
5447
- return outcomes.some((o) => isYesLabel(o.label)) && outcomes.some((o) => isNoLabel(o.label));
5381
+ var filterEventsByTabValue = (events, _tabValue) => {
5382
+ return events;
5448
5383
  };
5449
- var sortYesFirst = (outcomes) => {
5450
- return [...outcomes].sort((a, b) => {
5451
- if (isYesLabel(a.label) && !isYesLabel(b.label)) return -1;
5452
- if (!isYesLabel(a.label) && isYesLabel(b.label)) return 1;
5453
- return 0;
5384
+ var sortCategoriesForNavigation = (categories) => {
5385
+ return [...categories].sort((left, right) => {
5386
+ const leftIsOther = left.name.trim().toLowerCase() === "other";
5387
+ const rightIsOther = right.name.trim().toLowerCase() === "other";
5388
+ if (leftIsOther === rightIsOther) return 0;
5389
+ return leftIsOther ? 1 : -1;
5454
5390
  });
5455
5391
  };
5456
- var resolveYesOutcome = (market) => {
5457
- return market.venueMarketOutcomes.find((outcome) => isYesLabel(outcome.label));
5458
- };
5459
- var resolveYesOutcomeProbability = (market) => {
5392
+ var resolveCategoryIdsFromPath = (path, fallbackCategoryIds) => {
5460
5393
  var _a;
5461
- return normalizeProbability((_a = resolveYesOutcome(market)) == null ? void 0 : _a.price);
5394
+ const deepest = (_a = path[path.length - 1]) == null ? void 0 : _a.id;
5395
+ if (deepest) return [deepest];
5396
+ return fallbackCategoryIds;
5462
5397
  };
5463
- var formatMarketProbabilityPercent = (value, formatPercent = formatWholePercent) => {
5464
- const probability = normalizeProbability(value);
5465
- if (probability == null) return "-";
5466
- const formattedValue = formatPercent(probability);
5467
- if (probability > 0 && formattedValue === formatPercent(0)) {
5468
- return "<1%";
5398
+ var resolveTabVenus = (tab, visibleVenues) => {
5399
+ const applyAllowList = (venues) => {
5400
+ if (!venues) {
5401
+ return visibleVenues && visibleVenues.length > 0 ? visibleVenues : void 0;
5402
+ }
5403
+ if (!visibleVenues) return venues;
5404
+ const filtered = venues.filter((v) => visibleVenues.includes(v));
5405
+ return filtered.length > 0 ? filtered : void 0;
5406
+ };
5407
+ if (!tab) return applyAllowList(void 0);
5408
+ if (tab.venues && tab.venues.length > 0) return applyAllowList(tab.venues);
5409
+ if (import_sdk.VENUES.includes(tab.value)) {
5410
+ return applyAllowList([tab.value]);
5469
5411
  }
5470
- return formattedValue;
5471
- };
5472
- var formatPriceGapPercent = (value) => {
5473
- if (typeof value !== "number" || !Number.isFinite(value)) return void 0;
5474
- if (value < import_hooks8.MIN_PRICE_GAP_PCT) return void 0;
5475
- if (value > import_hooks8.MAX_PRICE_GAP_PCT) return void 0;
5476
- return `${Math.round(value)}%`;
5477
- };
5478
- var sortOutcomes = (outcomes) => {
5479
- if (outcomes.length <= 1) return outcomes;
5480
- if (hasBinaryOutcomes(outcomes)) {
5481
- return sortYesFirst(outcomes);
5482
- }
5483
- const now = Date.now();
5484
- if (outcomes.some(hasDateLabel)) {
5485
- return [...outcomes].sort((a, b) => {
5486
- var _a, _b, _c, _d;
5487
- const aDate = (_b = (_a = toDate(a.label)) == null ? void 0 : _a.getTime()) != null ? _b : 0;
5488
- const bDate = (_d = (_c = toDate(b.label)) == null ? void 0 : _c.getTime()) != null ? _d : 0;
5489
- return Math.abs(aDate - now) - Math.abs(bDate - now);
5490
- });
5491
- }
5492
- return [...outcomes].sort((a, b) => {
5493
- var _a, _b;
5494
- const aPrice = (_a = normalizeProbability(a.price)) != null ? _a : 0;
5495
- const bPrice = (_b = normalizeProbability(b.price)) != null ? _b : 0;
5496
- return bPrice - aPrice;
5497
- });
5498
- };
5499
- var compareVisibleOutcomeRows = (left, right) => {
5500
- var _a, _b;
5501
- const leftDate = toDate(resolveOutcomeTitle(left.outcome));
5502
- const rightDate = toDate(resolveOutcomeTitle(right.outcome));
5503
- if (leftDate && rightDate) {
5504
- return leftDate.getTime() - rightDate.getTime();
5505
- }
5506
- const leftProbability = (_a = normalizeProbability(left.outcome.price)) != null ? _a : -1;
5507
- const rightProbability = (_b = normalizeProbability(right.outcome.price)) != null ? _b : -1;
5508
- return rightProbability - leftProbability;
5509
- };
5510
- var shouldReplaceVisibleOutcome = (current, next) => {
5511
- var _a, _b;
5512
- const currentVolume = typeof current.market.volume === "number" ? current.market.volume : -1;
5513
- const nextVolume = typeof next.market.volume === "number" ? next.market.volume : -1;
5514
- if (currentVolume !== nextVolume) {
5515
- return nextVolume > currentVolume;
5516
- }
5517
- const currentProbability = (_a = normalizeProbability(current.outcome.price)) != null ? _a : -1;
5518
- const nextProbability = (_b = normalizeProbability(next.outcome.price)) != null ? _b : -1;
5519
- return nextProbability > currentProbability;
5520
- };
5521
- var resolveVisibleOutcomes = (venueMarkets) => {
5522
- const visibleOutcomesByLabel = /* @__PURE__ */ new Map();
5523
- venueMarkets.forEach((market) => {
5524
- const title2 = market.question;
5525
- const canonicalOutcome = sortOutcomes(market.venueMarketOutcomes)[0];
5526
- if (!canonicalOutcome) return;
5527
- const normalizedTitle = title2.trim().toLowerCase();
5528
- const nextVisibleOutcome = {
5529
- venue: market.venue,
5530
- market,
5531
- outcome: canonicalOutcome,
5532
- title: title2
5533
- };
5534
- const currentVisibleOutcome = visibleOutcomesByLabel.get(normalizedTitle);
5535
- if (!currentVisibleOutcome || shouldReplaceVisibleOutcome(currentVisibleOutcome, nextVisibleOutcome)) {
5536
- visibleOutcomesByLabel.set(normalizedTitle, nextVisibleOutcome);
5537
- }
5538
- });
5539
- return [...visibleOutcomesByLabel.values()].sort(compareVisibleOutcomeRows).slice(0, Math.max(1, 2));
5540
- };
5541
- var dedupeVenueMarketsById = (venueMarkets) => {
5542
- const seenClusterIds = /* @__PURE__ */ new Set();
5543
- return venueMarkets.filter((venueMarket) => {
5544
- var _a;
5545
- if (seenClusterIds.has(venueMarket.id)) {
5546
- return false;
5547
- }
5548
- seenClusterIds.add(venueMarket.id);
5549
- for (const sibling of (_a = venueMarket.matchedVenueMarkets) != null ? _a : []) {
5550
- seenClusterIds.add(sibling.id);
5551
- }
5552
- return true;
5553
- });
5554
- };
5555
- var resolveOutcomeTitle = (outcome) => {
5556
- var _a, _b;
5557
- return (_b = (_a = outcome == null ? void 0 : outcome.title) != null ? _a : outcome == null ? void 0 : outcome.label) == null ? void 0 : _b.trim();
5558
- };
5559
- var selectPrimaryVenueMarket = (venueMarkets) => {
5560
- if (venueMarkets.length === 0) return void 0;
5561
- if (venueMarkets.length === 1) return venueMarkets[0];
5562
- return [...venueMarkets].sort((a, b) => {
5563
- const aVolume = typeof a.volume === "number" ? a.volume : -1;
5564
- const bVolume = typeof b.volume === "number" ? b.volume : -1;
5565
- return bVolume - aVolume;
5566
- })[0];
5567
- };
5568
- var resolveTileImage = (event, primaryVenueMarket, imageOverride) => {
5569
- if (typeof imageOverride === "string" && imageOverride.trim()) {
5570
- return imageOverride;
5571
- }
5572
- if (typeof event.image === "string" && event.image.trim()) {
5573
- return event.image;
5574
- }
5575
- if (typeof (primaryVenueMarket == null ? void 0 : primaryVenueMarket.image) === "string" && primaryVenueMarket.image.trim()) {
5576
- return primaryVenueMarket.image;
5577
- }
5578
- return void 0;
5579
- };
5580
- var formatCountLabel = (count, singular, plural) => {
5581
- return `${count} ${count === 1 ? singular : plural}`;
5582
- };
5583
- var getVenueSummary = (venueMarkets, options) => {
5584
- const normalizedVenueMarkets = normalizeVenueMarketCluster(venueMarkets);
5585
- const tradableVenues = options == null ? void 0 : options.tradableVenues;
5586
- const isVenueTradable = (venue) => {
5587
- if (tradableVenues == null) return true;
5588
- return tradableVenues.has(venue);
5589
- };
5590
- const uniqueVenues = Array.from(
5591
- new Set(
5592
- normalizedVenueMarkets.filter((market) => isVenueTradable(market.venue)).map((market) => market.venue)
5593
- )
5594
- );
5595
- return {
5596
- marketCount: normalizedVenueMarkets.length,
5597
- venueCount: uniqueVenues.length,
5598
- singleVenue: uniqueVenues.length === 1 ? uniqueVenues[0] : void 0
5599
- };
5600
- };
5601
- var resolveVenueLabel = (venue, venueInfo, labels) => {
5602
- var _a, _b;
5603
- if (!venue) return labels.eventItem.venueSingular;
5604
- return (_b = (_a = venueInfo == null ? void 0 : venueInfo[venue]) == null ? void 0 : _a.label) != null ? _b : labels.venues[venue];
5605
- };
5606
- var resolveDisplayVolume = (eventVolume, venueMarkets) => {
5607
- if (typeof eventVolume === "number" && eventVolume > 0) return eventVolume;
5608
- const clusterMarkets = normalizeVenueMarketCluster(venueMarkets);
5609
- const marketSum = clusterMarkets.reduce(
5610
- (acc, m) => acc + (typeof m.volume === "number" ? m.volume : 0),
5611
- 0
5612
- );
5613
- if (marketSum > 0) return marketSum;
5614
- return void 0;
5615
- };
5616
-
5617
- // src/events/list/event-list.utils.ts
5618
- var filterOpenEvents = (events) => {
5619
- return events.filter((event) => {
5620
- var _a;
5621
- if (event.status && event.status !== import_hooks9.MarketStatus.open) return false;
5622
- const openMarkets = (_a = event.venueMarkets) == null ? void 0 : _a.filter(
5623
- (m) => !m.status || m.status === import_hooks9.MarketStatus.open
5624
- );
5625
- if (!openMarkets || openMarkets.length === 0) return false;
5626
- return true;
5627
- });
5628
- };
5629
- var resolveEventVolume = (event) => {
5630
- if (typeof event.volume === "number" && Number.isFinite(event.volume)) {
5631
- return event.volume;
5632
- }
5633
- return event.venueMarkets.reduce((maxVolume, market) => {
5634
- if (typeof market.volume !== "number" || !Number.isFinite(market.volume)) {
5635
- return maxVolume;
5636
- }
5637
- return Math.max(maxVolume, market.volume);
5638
- }, -1);
5639
- };
5640
- var sortEventsByVolumeDesc = (events, sortEventsBy) => {
5641
- return events.map((event, index) => ({
5642
- event,
5643
- index,
5644
- volume: resolveEventVolume(event)
5645
- })).sort((left, right) => {
5646
- if (sortEventsBy === "volume") {
5647
- if (left.volume !== right.volume) {
5648
- return right.volume - left.volume;
5649
- }
5650
- }
5651
- return left.index - right.index;
5652
- }).map(({ event }) => event);
5653
- };
5654
- var resolveEventLifecycle = (event) => {
5655
- const hasOpenMarket = event.venueMarkets.some(
5656
- (market) => !market.status || market.status === import_hooks9.MarketStatus.open
5657
- );
5658
- if (hasOpenMarket) return "open";
5659
- const hasUpcomingMarket = event.venueMarkets.some(
5660
- (market) => market.status === import_hooks9.MarketStatus.unopened
5661
- );
5662
- if (hasUpcomingMarket) return "upcoming";
5663
- const hasResolvedMarket = event.venueMarkets.some(
5664
- (market) => market.status === import_hooks9.MarketStatus.resolved
5665
- );
5666
- if (hasResolvedMarket) return "resolved";
5667
- if (event.status === import_hooks9.MarketStatus.open) return "open";
5668
- if (event.status === import_hooks9.MarketStatus.unopened) return "upcoming";
5669
- if (event.status === import_hooks9.MarketStatus.resolved) return "resolved";
5670
- return "ignore";
5671
- };
5672
- var splitEventsByLifecycle = (events) => {
5673
- const groupedEvents = events.reduce(
5674
- (grouped, event) => {
5675
- const lifecycle = resolveEventLifecycle(event);
5676
- if (lifecycle === "ignore") return grouped;
5677
- grouped[lifecycle].push(event);
5678
- return grouped;
5679
- },
5680
- {
5681
- open: [],
5682
- upcoming: [],
5683
- resolved: []
5684
- }
5685
- );
5686
- return {
5687
- open: sortEventsByVolumeDesc(groupedEvents.open),
5688
- upcoming: sortEventsByVolumeDesc(groupedEvents.upcoming),
5689
- resolved: sortEventsByVolumeDesc(groupedEvents.resolved)
5690
- };
5691
- };
5692
- var mapEventToEventListItemEvent = (event) => {
5693
- if (!event.venueMarkets || event.venueMarkets.length === 0) return null;
5694
- return event;
5695
- };
5696
- var filterEventsByTabValue = (events, _tabValue) => {
5697
- return events;
5698
- };
5699
- var sortMarketsByYesOddsDesc = (markets) => {
5700
- return markets.map((market, index) => ({
5701
- market,
5702
- index,
5703
- yesProbability: resolveYesOutcomeProbability(market)
5704
- })).sort((left, right) => {
5705
- const leftHasYesProbability = left.yesProbability != null;
5706
- const rightHasYesProbability = right.yesProbability != null;
5707
- if (leftHasYesProbability !== rightHasYesProbability) {
5708
- return leftHasYesProbability ? -1 : 1;
5709
- }
5710
- if (left.yesProbability != null && right.yesProbability != null) {
5711
- if (left.yesProbability !== right.yesProbability) {
5712
- return right.yesProbability - left.yesProbability;
5713
- }
5714
- }
5715
- return left.index - right.index;
5716
- }).map(({ market }) => market);
5717
- };
5718
- var resolveMarketVolume = (market) => {
5719
- if (typeof market.volume !== "number") return 0;
5720
- if (!Number.isFinite(market.volume)) return 0;
5721
- return market.volume;
5722
- };
5723
- var sortMarketsByVolumeDesc = (markets) => {
5724
- return markets.map((market, index) => ({
5725
- market,
5726
- index,
5727
- volume: resolveMarketVolume(market)
5728
- })).sort((left, right) => {
5729
- if (left.volume !== right.volume) {
5730
- return right.volume - left.volume;
5731
- }
5732
- return left.index - right.index;
5733
- }).map(({ market }) => market);
5734
- };
5735
- var sortCategoriesForNavigation = (categories) => {
5736
- return [...categories].sort((left, right) => {
5737
- const leftIsOther = left.name.trim().toLowerCase() === "other";
5738
- const rightIsOther = right.name.trim().toLowerCase() === "other";
5739
- if (leftIsOther === rightIsOther) return 0;
5740
- return leftIsOther ? 1 : -1;
5741
- });
5742
- };
5743
- var resolveCategoryIdsFromPath = (path, fallbackCategoryIds) => {
5744
- var _a;
5745
- const deepest = (_a = path[path.length - 1]) == null ? void 0 : _a.id;
5746
- if (deepest) return [deepest];
5747
- return fallbackCategoryIds;
5748
- };
5749
- var resolveTabVenus = (tab, visibleVenues) => {
5750
- const applyAllowList = (venues) => {
5751
- if (!venues) {
5752
- return visibleVenues && visibleVenues.length > 0 ? visibleVenues : void 0;
5753
- }
5754
- if (!visibleVenues) return venues;
5755
- const filtered = venues.filter((v) => visibleVenues.includes(v));
5756
- return filtered.length > 0 ? filtered : void 0;
5757
- };
5758
- if (!tab) return applyAllowList(void 0);
5759
- if (tab.venues && tab.venues.length > 0) return applyAllowList(tab.venues);
5760
- if (import_sdk.VENUES.includes(tab.value)) {
5761
- return applyAllowList([tab.value]);
5762
- }
5763
- return applyAllowList(void 0);
5412
+ return applyAllowList(void 0);
5764
5413
  };
5765
5414
 
5766
5415
  // src/primitives/remote-image/index.tsx
5767
- var import_hooks11 = require("@agg-build/hooks");
5416
+ var import_hooks10 = require("@agg-build/hooks");
5768
5417
  var import_react8 = require("react");
5769
5418
 
5770
5419
  // src/primitives/skeleton/skeleton-block.tsx
5771
- var import_hooks10 = require("@agg-build/hooks");
5420
+ var import_hooks9 = require("@agg-build/hooks");
5772
5421
  var import_jsx_runtime96 = require("react/jsx-runtime");
5773
5422
  var SkeletonBlock = ({ className }) => {
5774
5423
  const {
5775
5424
  features: { enableAnimations }
5776
- } = (0, import_hooks10.useSdkUiConfig)();
5425
+ } = (0, import_hooks9.useSdkUiConfig)();
5777
5426
  return /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(
5778
5427
  "div",
5779
5428
  {
@@ -5817,7 +5466,7 @@ var RemoteImage = ({
5817
5466
  }) => {
5818
5467
  const {
5819
5468
  general: { theme }
5820
- } = (0, import_hooks11.useSdkUiConfig)();
5469
+ } = (0, import_hooks10.useSdkUiConfig)();
5821
5470
  const isDarkTheme = theme === "dark";
5822
5471
  const [status, setStatus] = (0, import_react8.useState)(
5823
5472
  () => resolveRemoteImageStatusFromSrc(src)
@@ -5891,17 +5540,17 @@ var RemoteImage = ({
5891
5540
  RemoteImage.displayName = "RemoteImage";
5892
5541
 
5893
5542
  // src/primitives/skeleton/views/event-list-skeleton-view.tsx
5894
- var import_hooks13 = require("@agg-build/hooks");
5543
+ var import_hooks12 = require("@agg-build/hooks");
5895
5544
 
5896
5545
  // src/primitives/skeleton/views/event-list-item-skeleton-view.tsx
5897
- var import_hooks12 = require("@agg-build/hooks");
5546
+ var import_hooks11 = require("@agg-build/hooks");
5898
5547
  var import_jsx_runtime98 = require("react/jsx-runtime");
5899
5548
  var EventListItemSkeletonView = ({
5900
5549
  className,
5901
5550
  ariaLabel,
5902
5551
  isStandalone = false
5903
5552
  }) => {
5904
- const labels = (0, import_hooks12.useLabels)();
5553
+ const labels = (0, import_hooks11.useLabels)();
5905
5554
  const outcomeTitleWidths = ["max-w-40", "max-w-[200px]"];
5906
5555
  return /* @__PURE__ */ (0, import_jsx_runtime98.jsxs)(
5907
5556
  Card,
@@ -5967,7 +5616,7 @@ var EventListSkeletonView = ({
5967
5616
  ariaLabel,
5968
5617
  withSidebar
5969
5618
  }) => {
5970
- const labels = (0, import_hooks13.useLabels)();
5619
+ const labels = (0, import_hooks12.useLabels)();
5971
5620
  return /* @__PURE__ */ (0, import_jsx_runtime99.jsxs)(
5972
5621
  "section",
5973
5622
  {
@@ -6006,7 +5655,7 @@ var EventListSkeletonView = ({
6006
5655
  EventListSkeletonView.displayName = "EventListSkeletonView";
6007
5656
 
6008
5657
  // src/primitives/skeleton/views/event-list-item-details-skeleton-view.tsx
6009
- var import_hooks14 = require("@agg-build/hooks");
5658
+ var import_hooks13 = require("@agg-build/hooks");
6010
5659
 
6011
5660
  // src/events/item-details/event-list-item-details.constants.ts
6012
5661
  var detailsBaseCardClassName = "w-full gap-6 p-5 md:gap-8";
@@ -6017,7 +5666,7 @@ var EventListItemDetailsSkeletonView = ({
6017
5666
  className,
6018
5667
  ariaLabel
6019
5668
  }) => {
6020
- const labels = (0, import_hooks14.useLabels)();
5669
+ const labels = (0, import_hooks13.useLabels)();
6021
5670
  return /* @__PURE__ */ (0, import_jsx_runtime100.jsxs)(
6022
5671
  Card,
6023
5672
  {
@@ -6054,7 +5703,7 @@ var EventListItemDetailsSkeletonView = ({
6054
5703
  EventListItemDetailsSkeletonView.displayName = "EventListItemDetailsSkeletonView";
6055
5704
 
6056
5705
  // src/primitives/skeleton/views/market-details-skeleton-view.tsx
6057
- var import_hooks15 = require("@agg-build/hooks");
5706
+ var import_hooks14 = require("@agg-build/hooks");
6058
5707
 
6059
5708
  // src/events/market-details/market-details.constants.ts
6060
5709
  var marketDetailsBaseCardClassName = "w-full overflow-hidden rounded-agg-lg border border-agg-separator bg-agg-secondary text-agg-foreground shadow-none hover:shadow-none";
@@ -6150,7 +5799,7 @@ var MarketDetailsSkeletonView = ({
6150
5799
  ariaLabel,
6151
5800
  isDetailed
6152
5801
  }) => {
6153
- const labels = (0, import_hooks15.useLabels)();
5802
+ const labels = (0, import_hooks14.useLabels)();
6154
5803
  return /* @__PURE__ */ (0, import_jsx_runtime101.jsxs)(
6155
5804
  Card,
6156
5805
  {
@@ -6251,7 +5900,7 @@ var PlaceOrderSkeletonView = ({
6251
5900
  PlaceOrderSkeletonView.displayName = "PlaceOrderSkeletonView";
6252
5901
 
6253
5902
  // src/primitives/skeleton/views/search-skeleton-view.tsx
6254
- var import_hooks16 = require("@agg-build/hooks");
5903
+ var import_hooks15 = require("@agg-build/hooks");
6255
5904
  var import_jsx_runtime103 = require("react/jsx-runtime");
6256
5905
  var SearchSkeletonRow = () => {
6257
5906
  return /* @__PURE__ */ (0, import_jsx_runtime103.jsxs)("div", { className: "flex w-full items-center gap-6 px-5 py-4", children: [
@@ -6277,7 +5926,7 @@ var SearchSkeletonRow = () => {
6277
5926
  ] });
6278
5927
  };
6279
5928
  var SearchSkeletonView = ({ className, ariaLabel }) => {
6280
- const labels = (0, import_hooks16.useLabels)();
5929
+ const labels = (0, import_hooks15.useLabels)();
6281
5930
  return /* @__PURE__ */ (0, import_jsx_runtime103.jsxs)(
6282
5931
  "div",
6283
5932
  {
@@ -6299,13 +5948,13 @@ var SearchSkeletonView = ({ className, ariaLabel }) => {
6299
5948
  SearchSkeletonView.displayName = "SearchSkeletonView";
6300
5949
 
6301
5950
  // src/primitives/skeleton/views/settlement-skeleton-view.tsx
6302
- var import_hooks17 = require("@agg-build/hooks");
5951
+ var import_hooks16 = require("@agg-build/hooks");
6303
5952
  var import_jsx_runtime104 = require("react/jsx-runtime");
6304
5953
  var SettlementSkeletonView = ({
6305
5954
  className,
6306
5955
  ariaLabel
6307
5956
  }) => {
6308
- const labels = (0, import_hooks17.useLabels)();
5957
+ const labels = (0, import_hooks16.useLabels)();
6309
5958
  return /* @__PURE__ */ (0, import_jsx_runtime104.jsxs)(
6310
5959
  Card,
6311
5960
  {
@@ -6519,7 +6168,7 @@ var Skeleton = ({
6519
6168
  Skeleton.displayName = "Skeleton";
6520
6169
 
6521
6170
  // src/primitives/venue-logo/index.tsx
6522
- var import_hooks26 = require("@agg-build/hooks");
6171
+ var import_hooks25 = require("@agg-build/hooks");
6523
6172
 
6524
6173
  // src/primitives/venue-logo/venue-logo.constants.ts
6525
6174
  var import_sdk10 = require("@agg-build/sdk");
@@ -6572,7 +6221,7 @@ var DefaultVenueIcon = (_a) => {
6572
6221
  };
6573
6222
 
6574
6223
  // src/primitives/venue-logo/svg/logo-hyperliquid.tsx
6575
- var import_hooks18 = require("@agg-build/hooks");
6224
+ var import_hooks17 = require("@agg-build/hooks");
6576
6225
  var import_sdk2 = require("@agg-build/sdk");
6577
6226
  var import_jsx_runtime109 = require("react/jsx-runtime");
6578
6227
  var LogoHyperliquidIcon = (_a) => {
@@ -6590,7 +6239,7 @@ var LogoHyperliquidIcon = (_a) => {
6590
6239
  var _a2;
6591
6240
  const {
6592
6241
  general: { theme }
6593
- } = (0, import_hooks18.useAggUiConfig)();
6242
+ } = (0, import_hooks17.useAggUiConfig)();
6594
6243
  const isDarkTheme = theme === "dark";
6595
6244
  const primaryColor = resolveLogoPrimaryColor({
6596
6245
  brandColor: (_a2 = resolveVenueLineColor(import_sdk2.Venue.hyperliquid, isDarkTheme)) != null ? _a2 : "#97FCE4",
@@ -6620,7 +6269,7 @@ var LogoHyperliquidIcon = (_a) => {
6620
6269
  LogoHyperliquidIcon.displayName = "LogoHyperliquidIcon";
6621
6270
 
6622
6271
  // src/primitives/venue-logo/svg/logo-kalshi.tsx
6623
- var import_hooks19 = require("@agg-build/hooks");
6272
+ var import_hooks18 = require("@agg-build/hooks");
6624
6273
  var import_sdk3 = require("@agg-build/sdk");
6625
6274
  var import_jsx_runtime110 = require("react/jsx-runtime");
6626
6275
  var LogoKalshiIcon = (_a) => {
@@ -6638,7 +6287,7 @@ var LogoKalshiIcon = (_a) => {
6638
6287
  var _a2;
6639
6288
  const {
6640
6289
  general: { theme }
6641
- } = (0, import_hooks19.useAggUiConfig)();
6290
+ } = (0, import_hooks18.useAggUiConfig)();
6642
6291
  const isDarkTheme = theme === "dark";
6643
6292
  const primaryColor = resolveLogoPrimaryColor({
6644
6293
  brandColor: (_a2 = resolveVenueLineColor(import_sdk3.Venue.kalshi, isDarkTheme)) != null ? _a2 : "#18C590",
@@ -6668,7 +6317,7 @@ var LogoKalshiIcon = (_a) => {
6668
6317
  LogoKalshiIcon.displayName = "LogoKalshiIcon";
6669
6318
 
6670
6319
  // src/primitives/venue-logo/svg/logo-limitless.tsx
6671
- var import_hooks20 = require("@agg-build/hooks");
6320
+ var import_hooks19 = require("@agg-build/hooks");
6672
6321
  var import_sdk4 = require("@agg-build/sdk");
6673
6322
  var import_jsx_runtime111 = require("react/jsx-runtime");
6674
6323
  var LogoLimitlessIcon = (_a) => {
@@ -6686,7 +6335,7 @@ var LogoLimitlessIcon = (_a) => {
6686
6335
  var _a2;
6687
6336
  const {
6688
6337
  general: { theme }
6689
- } = (0, import_hooks20.useAggUiConfig)();
6338
+ } = (0, import_hooks19.useAggUiConfig)();
6690
6339
  const isDarkTheme = theme === "dark";
6691
6340
  const primaryColor = resolveLogoPrimaryColor({
6692
6341
  brandColor: (_a2 = resolveVenueLineColor(import_sdk4.Venue.limitless, isDarkTheme)) != null ? _a2 : "#c4fe00",
@@ -6716,7 +6365,7 @@ var LogoLimitlessIcon = (_a) => {
6716
6365
  LogoLimitlessIcon.displayName = "LogoLimitlessIcon";
6717
6366
 
6718
6367
  // src/primitives/venue-logo/svg/logo-myriad.tsx
6719
- var import_hooks21 = require("@agg-build/hooks");
6368
+ var import_hooks20 = require("@agg-build/hooks");
6720
6369
  var import_sdk5 = require("@agg-build/sdk");
6721
6370
  var import_jsx_runtime112 = require("react/jsx-runtime");
6722
6371
  var LogoMyriadIcon = (_a) => {
@@ -6734,7 +6383,7 @@ var LogoMyriadIcon = (_a) => {
6734
6383
  var _a2;
6735
6384
  const {
6736
6385
  general: { theme }
6737
- } = (0, import_hooks21.useAggUiConfig)();
6386
+ } = (0, import_hooks20.useAggUiConfig)();
6738
6387
  const isDarkTheme = theme === "dark";
6739
6388
  const primaryColor = resolveLogoPrimaryColor({
6740
6389
  brandColor: (_a2 = resolveVenueLineColor(import_sdk5.Venue.myriad, isDarkTheme)) != null ? _a2 : "#2E5CFF",
@@ -6764,7 +6413,7 @@ var LogoMyriadIcon = (_a) => {
6764
6413
  LogoMyriadIcon.displayName = "LogoMyriadIcon";
6765
6414
 
6766
6415
  // src/primitives/venue-logo/svg/logo-opinion.tsx
6767
- var import_hooks22 = require("@agg-build/hooks");
6416
+ var import_hooks21 = require("@agg-build/hooks");
6768
6417
  var import_sdk6 = require("@agg-build/sdk");
6769
6418
  var import_jsx_runtime113 = require("react/jsx-runtime");
6770
6419
  var LogoOpinionIcon = (_a) => {
@@ -6782,7 +6431,7 @@ var LogoOpinionIcon = (_a) => {
6782
6431
  var _a2;
6783
6432
  const {
6784
6433
  general: { theme }
6785
- } = (0, import_hooks22.useAggUiConfig)();
6434
+ } = (0, import_hooks21.useAggUiConfig)();
6786
6435
  const isDarkTheme = theme === "dark";
6787
6436
  const primaryColor = resolveLogoPrimaryColor({
6788
6437
  brandColor: (_a2 = resolveVenueLineColor(import_sdk6.Venue.opinion, isDarkTheme)) != null ? _a2 : "#ec5e26",
@@ -6812,7 +6461,7 @@ var LogoOpinionIcon = (_a) => {
6812
6461
  LogoOpinionIcon.displayName = "LogoOpinionIcon";
6813
6462
 
6814
6463
  // src/primitives/venue-logo/svg/logo-polymarket.tsx
6815
- var import_hooks23 = require("@agg-build/hooks");
6464
+ var import_hooks22 = require("@agg-build/hooks");
6816
6465
  var import_sdk7 = require("@agg-build/sdk");
6817
6466
  var import_jsx_runtime114 = require("react/jsx-runtime");
6818
6467
  var LogoPolymarketIcon = (_a) => {
@@ -6830,7 +6479,7 @@ var LogoPolymarketIcon = (_a) => {
6830
6479
  var _a2;
6831
6480
  const {
6832
6481
  general: { theme }
6833
- } = (0, import_hooks23.useAggUiConfig)();
6482
+ } = (0, import_hooks22.useAggUiConfig)();
6834
6483
  const isDarkTheme = theme === "dark";
6835
6484
  const primaryColor = resolveLogoPrimaryColor({
6836
6485
  brandColor: (_a2 = resolveVenueLineColor(import_sdk7.Venue.polymarket, isDarkTheme)) != null ? _a2 : "#2E5CFF",
@@ -6860,7 +6509,7 @@ var LogoPolymarketIcon = (_a) => {
6860
6509
  LogoPolymarketIcon.displayName = "LogoPolymarketIcon";
6861
6510
 
6862
6511
  // src/primitives/venue-logo/svg/logo-predict.tsx
6863
- var import_hooks24 = require("@agg-build/hooks");
6512
+ var import_hooks23 = require("@agg-build/hooks");
6864
6513
  var import_sdk8 = require("@agg-build/sdk");
6865
6514
  var import_jsx_runtime115 = require("react/jsx-runtime");
6866
6515
  var LogoPredictIcon = (_a) => {
@@ -6878,7 +6527,7 @@ var LogoPredictIcon = (_a) => {
6878
6527
  var _a2;
6879
6528
  const {
6880
6529
  general: { theme }
6881
- } = (0, import_hooks24.useAggUiConfig)();
6530
+ } = (0, import_hooks23.useAggUiConfig)();
6882
6531
  const isDarkTheme = theme === "dark";
6883
6532
  const primaryColor = resolveLogoPrimaryColor({
6884
6533
  brandColor: (_a2 = resolveVenueLineColor(import_sdk8.Venue.predict, isDarkTheme)) != null ? _a2 : "#705bf6",
@@ -6910,7 +6559,7 @@ var LogoPredictIcon = (_a) => {
6910
6559
  LogoPredictIcon.displayName = "LogoPredictIcon";
6911
6560
 
6912
6561
  // src/primitives/venue-logo/svg/logo-probable.tsx
6913
- var import_hooks25 = require("@agg-build/hooks");
6562
+ var import_hooks24 = require("@agg-build/hooks");
6914
6563
  var import_sdk9 = require("@agg-build/sdk");
6915
6564
  var import_jsx_runtime116 = require("react/jsx-runtime");
6916
6565
  var LogoProbableIcon = (_a) => {
@@ -6928,7 +6577,7 @@ var LogoProbableIcon = (_a) => {
6928
6577
  var _a2;
6929
6578
  const {
6930
6579
  general: { theme }
6931
- } = (0, import_hooks25.useAggUiConfig)();
6580
+ } = (0, import_hooks24.useAggUiConfig)();
6932
6581
  const isDarkTheme = theme === "dark";
6933
6582
  const primaryColor = resolveLogoPrimaryColor({
6934
6583
  brandColor: (_a2 = resolveVenueLineColor(import_sdk9.Venue.probable, isDarkTheme)) != null ? _a2 : "#EC4899",
@@ -6987,144 +6636,455 @@ var venueLogoUrlRegistry = {
6987
6636
  [import_sdk10.Venue.myriad]: `${VENUE_LOGO_BASE_URL}/myriad.png`,
6988
6637
  [import_sdk10.Venue.hyperliquid]: `${VENUE_LOGO_BASE_URL}/hyperliquid.png`
6989
6638
  };
6990
- var venueLogoLabels = {
6991
- [import_sdk10.Venue.kalshi]: "Kalshi",
6992
- [import_sdk10.Venue.limitless]: "Limitless",
6993
- [import_sdk10.Venue.opinion]: "Opinion",
6994
- [import_sdk10.Venue.polymarket]: "Polymarket",
6995
- [import_sdk10.Venue.predict]: "Predict",
6996
- [import_sdk10.Venue.probable]: "Probable",
6997
- [import_sdk10.Venue.myriad]: "Myriad",
6998
- [import_sdk10.Venue.hyperliquid]: "Hyperliquid"
6639
+ var venueLogoLabels = {
6640
+ [import_sdk10.Venue.kalshi]: "Kalshi",
6641
+ [import_sdk10.Venue.limitless]: "Limitless",
6642
+ [import_sdk10.Venue.opinion]: "Opinion",
6643
+ [import_sdk10.Venue.polymarket]: "Polymarket",
6644
+ [import_sdk10.Venue.predict]: "Predict",
6645
+ [import_sdk10.Venue.probable]: "Probable",
6646
+ [import_sdk10.Venue.myriad]: "Myriad",
6647
+ [import_sdk10.Venue.hyperliquid]: "Hyperliquid"
6648
+ };
6649
+ var DEFAULT_VENUE_LABEL = "Market";
6650
+ var DEFAULT_VENUE_LOGO_URL = `${VENUE_LOGO_BASE_URL}/default.png`;
6651
+ var venueLogoNames = Object.keys(venueLogoRegistry);
6652
+ var sizeClasses2 = {
6653
+ small: "h-4 w-4",
6654
+ medium: "h-6 w-6",
6655
+ large: "h-8 w-8"
6656
+ };
6657
+ var lineColorByVenue = {
6658
+ light: {
6659
+ [import_sdk10.Venue.kalshi]: "#00D295",
6660
+ [import_sdk10.Venue.limitless]: "#000000",
6661
+ [import_sdk10.Venue.opinion]: "#000000",
6662
+ [import_sdk10.Venue.polymarket]: "#2E5CFF",
6663
+ [import_sdk10.Venue.predict]: "#6D57F8",
6664
+ [import_sdk10.Venue.probable]: "#F05923",
6665
+ [import_sdk10.Venue.myriad]: "#000000",
6666
+ [import_sdk10.Venue.hyperliquid]: "#97FCE4"
6667
+ },
6668
+ dark: {
6669
+ [import_sdk10.Venue.kalshi]: "#00D295",
6670
+ [import_sdk10.Venue.limitless]: "#FFFFFF",
6671
+ [import_sdk10.Venue.opinion]: "#FFFFFF",
6672
+ [import_sdk10.Venue.polymarket]: "#2E5CFF",
6673
+ [import_sdk10.Venue.predict]: "#6D57F8",
6674
+ [import_sdk10.Venue.probable]: "#F05923",
6675
+ [import_sdk10.Venue.myriad]: "#FFFFFF",
6676
+ [import_sdk10.Venue.hyperliquid]: "#97FCE4"
6677
+ }
6678
+ };
6679
+ var resolveVenueLineColor = (venue, isDarkTheme) => {
6680
+ return lineColorByVenue[isDarkTheme ? "dark" : "light"][venue];
6681
+ };
6682
+ var DEFAULT_VENUE_COLOR = "#94a3b8";
6683
+ var fallbackLineColors = [
6684
+ DEFAULT_VENUE_COLOR,
6685
+ "#7AF2D3",
6686
+ "#C14BFF",
6687
+ "#FFB703",
6688
+ "#3A86FF",
6689
+ "#8AC926",
6690
+ "#FF6F61",
6691
+ "#6A4C93",
6692
+ "#00BBF9",
6693
+ "#F15BB5",
6694
+ "#2EC4B6"
6695
+ ];
6696
+
6697
+ // src/primitives/venue-logo/venue-logo.utils.ts
6698
+ var resolveVenueLogoLabel = ({
6699
+ ariaLabel,
6700
+ labels,
6701
+ venue,
6702
+ venueFallbackLabels
6703
+ }) => {
6704
+ var _a;
6705
+ return (_a = ariaLabel != null ? ariaLabel : labels.venues[venue]) != null ? _a : venueFallbackLabels[venue];
6706
+ };
6707
+ var resolveVenueLogoIsColor = ({
6708
+ isColor,
6709
+ isMonochromatic
6710
+ }) => {
6711
+ return isMonochromatic ? false : isColor;
6712
+ };
6713
+
6714
+ // src/primitives/venue-logo/index.tsx
6715
+ var import_jsx_runtime117 = require("react/jsx-runtime");
6716
+ var VenueLogo = ({
6717
+ venue,
6718
+ variant = "icon",
6719
+ isColor = true,
6720
+ isMonochromatic = false,
6721
+ color,
6722
+ size = "medium",
6723
+ className,
6724
+ ariaLabel,
6725
+ title: title2
6726
+ }) => {
6727
+ var _a, _b;
6728
+ const labels = (0, import_hooks25.useLabels)();
6729
+ const sizeClass = sizeClasses2[size];
6730
+ const resolvedLabel = resolveVenueLogoLabel({
6731
+ ariaLabel,
6732
+ labels,
6733
+ venue,
6734
+ venueFallbackLabels: venueLogoLabels
6735
+ });
6736
+ const isUnknownVenue = !(venue in venueLogoRegistry);
6737
+ if (isUnknownVenue && process.env.NODE_ENV === "development") {
6738
+ console.warn(`[AggUI] Unknown venue "${venue}" \u2014 using default logo`);
6739
+ }
6740
+ if (variant === "logo") {
6741
+ return /* @__PURE__ */ (0, import_jsx_runtime117.jsx)(
6742
+ RemoteImage,
6743
+ {
6744
+ src: (_a = venueLogoUrlRegistry[venue]) != null ? _a : DEFAULT_VENUE_LOGO_URL,
6745
+ alt: resolvedLabel || DEFAULT_VENUE_LABEL,
6746
+ title: title2,
6747
+ className: cn("shrink-0 rounded-agg-lg object-cover", sizeClass, className)
6748
+ }
6749
+ );
6750
+ }
6751
+ const Component2 = (_b = venueLogoRegistry[venue]) != null ? _b : DefaultVenueIcon;
6752
+ const resolvedIsColor = resolveVenueLogoIsColor({
6753
+ isColor,
6754
+ isMonochromatic
6755
+ });
6756
+ return /* @__PURE__ */ (0, import_jsx_runtime117.jsx)(
6757
+ Component2,
6758
+ {
6759
+ className: cn("group/agg-venue-logo", "shrink-0", sizeClass, className),
6760
+ isColor: resolvedIsColor,
6761
+ color,
6762
+ "aria-label": resolvedLabel || DEFAULT_VENUE_LABEL,
6763
+ title: title2
6764
+ }
6765
+ );
6766
+ };
6767
+ VenueLogo.displayName = "VenueLogo";
6768
+
6769
+ // src/primitives/search/search.constants.ts
6770
+ var DEFAULT_SEARCH_LIMIT = 5;
6771
+ var MIN_SEARCH_LENGTH = 3;
6772
+ var SEARCH_DEBOUNCE_MS = 300;
6773
+
6774
+ // src/primitives/search/search.utils.ts
6775
+ var import_sdk11 = require("@agg-build/sdk");
6776
+ var import_dayjs2 = __toESM(require("dayjs"));
6777
+
6778
+ // src/events/item/event-list-item.utils.ts
6779
+ var import_hooks26 = require("@agg-build/hooks");
6780
+
6781
+ // src/events/shared/venue-market-cluster.ts
6782
+ var toNonEmptyString = (value) => {
6783
+ if (typeof value !== "string") return void 0;
6784
+ const trimmedValue = value.trim();
6785
+ return trimmedValue ? trimmedValue : void 0;
6786
+ };
6787
+ var addGraphEdge = (adjacencyById, fromMarketId, toMarketId) => {
6788
+ var _a, _b;
6789
+ if (fromMarketId === toMarketId) return;
6790
+ const fromNeighbors = (_a = adjacencyById.get(fromMarketId)) != null ? _a : /* @__PURE__ */ new Set();
6791
+ fromNeighbors.add(toMarketId);
6792
+ adjacencyById.set(fromMarketId, fromNeighbors);
6793
+ const toNeighbors = (_b = adjacencyById.get(toMarketId)) != null ? _b : /* @__PURE__ */ new Set();
6794
+ toNeighbors.add(fromMarketId);
6795
+ adjacencyById.set(toMarketId, toNeighbors);
6796
+ };
6797
+ var dedupeSourceMarketsById = (markets) => {
6798
+ const seenMarketIds = /* @__PURE__ */ new Set();
6799
+ return markets.filter((market) => {
6800
+ if (seenMarketIds.has(market.id)) {
6801
+ return false;
6802
+ }
6803
+ seenMarketIds.add(market.id);
6804
+ return true;
6805
+ });
6806
+ };
6807
+ var collectDirectRelationMarkets = (market) => {
6808
+ var _a, _b, _c;
6809
+ const relationMarkets = [];
6810
+ const seenRelationIds = /* @__PURE__ */ new Set();
6811
+ const addRelationMarket = (relationMarket) => {
6812
+ if (!relationMarket) return;
6813
+ if (seenRelationIds.has(relationMarket.id)) return;
6814
+ seenRelationIds.add(relationMarket.id);
6815
+ relationMarkets.push(relationMarket);
6816
+ };
6817
+ for (const matchedVenueMarket of (_a = market.matchedVenueMarkets) != null ? _a : []) {
6818
+ addRelationMarket(matchedVenueMarket);
6819
+ }
6820
+ addRelationMarket(
6821
+ (_c = (_b = market.matchEntry) == null ? void 0 : _b.targetVenueMarket) != null ? _c : void 0
6822
+ );
6823
+ return relationMarkets;
6824
+ };
6825
+ var collectUniqueRelatedMarkets = (markets, sourceMarketsById) => {
6826
+ const relatedMarketsById = /* @__PURE__ */ new Map();
6827
+ for (const market of markets) {
6828
+ for (const relatedMarket of collectDirectRelationMarkets(market)) {
6829
+ if (sourceMarketsById.has(relatedMarket.id) || relatedMarketsById.has(relatedMarket.id)) {
6830
+ continue;
6831
+ }
6832
+ relatedMarketsById.set(relatedMarket.id, relatedMarket);
6833
+ }
6834
+ }
6835
+ return Array.from(relatedMarketsById.values());
6836
+ };
6837
+ var normalizeVenueMarketCluster = (markets, selectedMarketId) => {
6838
+ var _a, _b;
6839
+ if (markets.length === 0) return [];
6840
+ const orderedSourceMarkets = dedupeSourceMarketsById(markets);
6841
+ const sourceMarketsById = new Map(orderedSourceMarkets.map((market) => [market.id, market]));
6842
+ const orderedRelatedMarkets = collectUniqueRelatedMarkets(
6843
+ orderedSourceMarkets,
6844
+ sourceMarketsById
6845
+ );
6846
+ const relatedMarketsById = new Map(orderedRelatedMarkets.map((market) => [market.id, market]));
6847
+ const resolvedSelectedMarketId = toNonEmptyString(selectedMarketId);
6848
+ if (!resolvedSelectedMarketId) {
6849
+ return [...orderedSourceMarkets, ...orderedRelatedMarkets];
6850
+ }
6851
+ const adjacencyById = /* @__PURE__ */ new Map();
6852
+ for (const market of orderedSourceMarkets) {
6853
+ for (const relatedMarket of collectDirectRelationMarkets(market)) {
6854
+ addGraphEdge(adjacencyById, market.id, relatedMarket.id);
6855
+ }
6856
+ const targetVenueMarketId = toNonEmptyString((_a = market.matchEntry) == null ? void 0 : _a.targetVenueMarketId);
6857
+ if (targetVenueMarketId) {
6858
+ addGraphEdge(adjacencyById, market.id, targetVenueMarketId);
6859
+ }
6860
+ }
6861
+ if (!sourceMarketsById.has(resolvedSelectedMarketId) && !relatedMarketsById.has(resolvedSelectedMarketId)) {
6862
+ return [];
6863
+ }
6864
+ const visitedMarketIds = /* @__PURE__ */ new Set();
6865
+ const queue = [resolvedSelectedMarketId];
6866
+ while (queue.length > 0) {
6867
+ const currentMarketId = queue.shift();
6868
+ if (!currentMarketId || visitedMarketIds.has(currentMarketId)) {
6869
+ continue;
6870
+ }
6871
+ visitedMarketIds.add(currentMarketId);
6872
+ const neighborMarketIds = adjacencyById.get(currentMarketId);
6873
+ for (const neighborMarketId of Array.from(neighborMarketIds != null ? neighborMarketIds : /* @__PURE__ */ new Set())) {
6874
+ if (!visitedMarketIds.has(neighborMarketId)) {
6875
+ queue.push(neighborMarketId);
6876
+ }
6877
+ }
6878
+ }
6879
+ const orderedClusterMarkets = [];
6880
+ const appendedMarketIds = /* @__PURE__ */ new Set();
6881
+ const appendMarket = (market) => {
6882
+ if (!market) return;
6883
+ if (!visitedMarketIds.has(market.id)) return;
6884
+ if (appendedMarketIds.has(market.id)) return;
6885
+ appendedMarketIds.add(market.id);
6886
+ orderedClusterMarkets.push(market);
6887
+ };
6888
+ appendMarket(
6889
+ (_b = sourceMarketsById.get(resolvedSelectedMarketId)) != null ? _b : relatedMarketsById.get(resolvedSelectedMarketId)
6890
+ );
6891
+ for (const market of orderedSourceMarkets) {
6892
+ appendMarket(market);
6893
+ }
6894
+ for (const market of orderedRelatedMarkets) {
6895
+ appendMarket(market);
6896
+ }
6897
+ return orderedClusterMarkets;
6898
+ };
6899
+
6900
+ // src/events/item/event-list-item.utils.ts
6901
+ var resolveEventListItemEvent = (fetchedEvent) => {
6902
+ if (!fetchedEvent) return void 0;
6903
+ if (!fetchedEvent.venueMarkets || fetchedEvent.venueMarkets.length === 0) return void 0;
6904
+ return fetchedEvent;
6905
+ };
6906
+ var normalizeProbability = (value) => {
6907
+ if (typeof value !== "number" || !Number.isFinite(value)) return void 0;
6908
+ if (value < 0) return 0;
6909
+ if (value > 1) return 1;
6910
+ return value;
6911
+ };
6912
+ var formatWholePercent = (value) => {
6913
+ return `${Math.round(value * 100)}%`;
6914
+ };
6915
+ var hasDateLabel = (outcome) => {
6916
+ return !!toDate(outcome.label);
6917
+ };
6918
+ var isYesLabel = (label2) => label2.trim().toLowerCase() === "yes";
6919
+ var isNoLabel = (label2) => label2.trim().toLowerCase() === "no";
6920
+ var hasBinaryOutcomes = (outcomes) => {
6921
+ return outcomes.some((o) => isYesLabel(o.label)) && outcomes.some((o) => isNoLabel(o.label));
6922
+ };
6923
+ var sortYesFirst = (outcomes) => {
6924
+ return [...outcomes].sort((a, b) => {
6925
+ if (isYesLabel(a.label) && !isYesLabel(b.label)) return -1;
6926
+ if (!isYesLabel(a.label) && isYesLabel(b.label)) return 1;
6927
+ return 0;
6928
+ });
6929
+ };
6930
+ var resolveYesOutcome = (market) => {
6931
+ return market.venueMarketOutcomes.find((outcome) => isYesLabel(outcome.label));
6932
+ };
6933
+ var formatMarketProbabilityPercent = (value, formatPercent = formatWholePercent) => {
6934
+ const probability = normalizeProbability(value);
6935
+ if (probability == null) return "-";
6936
+ const formattedValue = formatPercent(probability);
6937
+ if (probability > 0 && formattedValue === formatPercent(0)) {
6938
+ return "<1%";
6939
+ }
6940
+ return formattedValue;
6941
+ };
6942
+ var formatPriceGapPercent = (value) => {
6943
+ if (typeof value !== "number" || !Number.isFinite(value)) return void 0;
6944
+ if (value < import_hooks26.MIN_PRICE_GAP_PCT) return void 0;
6945
+ if (value > import_hooks26.MAX_PRICE_GAP_PCT) return void 0;
6946
+ return `${Math.round(value)}%`;
6999
6947
  };
7000
- var DEFAULT_VENUE_LABEL = "Market";
7001
- var DEFAULT_VENUE_LOGO_URL = `${VENUE_LOGO_BASE_URL}/default.png`;
7002
- var venueLogoNames = Object.keys(venueLogoRegistry);
7003
- var sizeClasses2 = {
7004
- small: "h-4 w-4",
7005
- medium: "h-6 w-6",
7006
- large: "h-8 w-8"
6948
+ var sortOutcomes = (outcomes) => {
6949
+ if (outcomes.length <= 1) return outcomes;
6950
+ if (hasBinaryOutcomes(outcomes)) {
6951
+ return sortYesFirst(outcomes);
6952
+ }
6953
+ const now = Date.now();
6954
+ if (outcomes.some(hasDateLabel)) {
6955
+ return [...outcomes].sort((a, b) => {
6956
+ var _a, _b, _c, _d;
6957
+ const aDate = (_b = (_a = toDate(a.label)) == null ? void 0 : _a.getTime()) != null ? _b : 0;
6958
+ const bDate = (_d = (_c = toDate(b.label)) == null ? void 0 : _c.getTime()) != null ? _d : 0;
6959
+ return Math.abs(aDate - now) - Math.abs(bDate - now);
6960
+ });
6961
+ }
6962
+ return [...outcomes].sort((a, b) => {
6963
+ var _a, _b;
6964
+ const aPrice = (_a = normalizeProbability(a.price)) != null ? _a : 0;
6965
+ const bPrice = (_b = normalizeProbability(b.price)) != null ? _b : 0;
6966
+ return bPrice - aPrice;
6967
+ });
7007
6968
  };
7008
- var lineColorByVenue = {
7009
- light: {
7010
- [import_sdk10.Venue.kalshi]: "#00D295",
7011
- [import_sdk10.Venue.limitless]: "#000000",
7012
- [import_sdk10.Venue.opinion]: "#000000",
7013
- [import_sdk10.Venue.polymarket]: "#2E5CFF",
7014
- [import_sdk10.Venue.predict]: "#6D57F8",
7015
- [import_sdk10.Venue.probable]: "#F05923",
7016
- [import_sdk10.Venue.myriad]: "#000000",
7017
- [import_sdk10.Venue.hyperliquid]: "#97FCE4"
7018
- },
7019
- dark: {
7020
- [import_sdk10.Venue.kalshi]: "#00D295",
7021
- [import_sdk10.Venue.limitless]: "#FFFFFF",
7022
- [import_sdk10.Venue.opinion]: "#FFFFFF",
7023
- [import_sdk10.Venue.polymarket]: "#2E5CFF",
7024
- [import_sdk10.Venue.predict]: "#6D57F8",
7025
- [import_sdk10.Venue.probable]: "#F05923",
7026
- [import_sdk10.Venue.myriad]: "#FFFFFF",
7027
- [import_sdk10.Venue.hyperliquid]: "#97FCE4"
6969
+ var compareVisibleOutcomeRows = (left, right) => {
6970
+ var _a, _b;
6971
+ const leftDate = toDate(resolveOutcomeTitle(left.outcome));
6972
+ const rightDate = toDate(resolveOutcomeTitle(right.outcome));
6973
+ if (leftDate && rightDate) {
6974
+ return leftDate.getTime() - rightDate.getTime();
7028
6975
  }
6976
+ const leftProbability = (_a = normalizeProbability(left.outcome.price)) != null ? _a : -1;
6977
+ const rightProbability = (_b = normalizeProbability(right.outcome.price)) != null ? _b : -1;
6978
+ return rightProbability - leftProbability;
7029
6979
  };
7030
- var resolveVenueLineColor = (venue, isDarkTheme) => {
7031
- return lineColorByVenue[isDarkTheme ? "dark" : "light"][venue];
6980
+ var shouldReplaceVisibleOutcome = (current, next) => {
6981
+ var _a, _b;
6982
+ const currentVolume = typeof current.market.volume === "number" ? current.market.volume : -1;
6983
+ const nextVolume = typeof next.market.volume === "number" ? next.market.volume : -1;
6984
+ if (currentVolume !== nextVolume) {
6985
+ return nextVolume > currentVolume;
6986
+ }
6987
+ const currentProbability = (_a = normalizeProbability(current.outcome.price)) != null ? _a : -1;
6988
+ const nextProbability = (_b = normalizeProbability(next.outcome.price)) != null ? _b : -1;
6989
+ return nextProbability > currentProbability;
7032
6990
  };
7033
- var DEFAULT_VENUE_COLOR = "#94a3b8";
7034
- var fallbackLineColors = [
7035
- DEFAULT_VENUE_COLOR,
7036
- "#7AF2D3",
7037
- "#C14BFF",
7038
- "#FFB703",
7039
- "#3A86FF",
7040
- "#8AC926",
7041
- "#FF6F61",
7042
- "#6A4C93",
7043
- "#00BBF9",
7044
- "#F15BB5",
7045
- "#2EC4B6"
7046
- ];
7047
-
7048
- // src/primitives/venue-logo/venue-logo.utils.ts
7049
- var resolveVenueLogoLabel = ({
7050
- ariaLabel,
7051
- labels,
7052
- venue,
7053
- venueFallbackLabels
7054
- }) => {
7055
- var _a;
7056
- return (_a = ariaLabel != null ? ariaLabel : labels.venues[venue]) != null ? _a : venueFallbackLabels[venue];
6991
+ var resolveVisibleOutcomes = (venueMarkets) => {
6992
+ const visibleOutcomesByLabel = /* @__PURE__ */ new Map();
6993
+ venueMarkets.forEach((market) => {
6994
+ const title2 = market.question;
6995
+ const canonicalOutcome = sortOutcomes(market.venueMarketOutcomes)[0];
6996
+ if (!canonicalOutcome) return;
6997
+ const normalizedTitle = title2.trim().toLowerCase();
6998
+ const nextVisibleOutcome = {
6999
+ venue: market.venue,
7000
+ market,
7001
+ outcome: canonicalOutcome,
7002
+ title: title2
7003
+ };
7004
+ const currentVisibleOutcome = visibleOutcomesByLabel.get(normalizedTitle);
7005
+ if (!currentVisibleOutcome || shouldReplaceVisibleOutcome(currentVisibleOutcome, nextVisibleOutcome)) {
7006
+ visibleOutcomesByLabel.set(normalizedTitle, nextVisibleOutcome);
7007
+ }
7008
+ });
7009
+ return [...visibleOutcomesByLabel.values()].sort(compareVisibleOutcomeRows).slice(0, Math.max(1, 2));
7057
7010
  };
7058
- var resolveVenueLogoIsColor = ({
7059
- isColor,
7060
- isMonochromatic
7061
- }) => {
7062
- return isMonochromatic ? false : isColor;
7011
+ var dedupeVenueMarketsById = (venueMarkets) => {
7012
+ const seenClusterIds = /* @__PURE__ */ new Set();
7013
+ return venueMarkets.filter((venueMarket) => {
7014
+ var _a;
7015
+ if (seenClusterIds.has(venueMarket.id)) {
7016
+ return false;
7017
+ }
7018
+ seenClusterIds.add(venueMarket.id);
7019
+ for (const sibling of (_a = venueMarket.matchedVenueMarkets) != null ? _a : []) {
7020
+ seenClusterIds.add(sibling.id);
7021
+ }
7022
+ return true;
7023
+ });
7063
7024
  };
7064
-
7065
- // src/primitives/venue-logo/index.tsx
7066
- var import_jsx_runtime117 = require("react/jsx-runtime");
7067
- var VenueLogo = ({
7068
- venue,
7069
- variant = "icon",
7070
- isColor = true,
7071
- isMonochromatic = false,
7072
- color,
7073
- size = "medium",
7074
- className,
7075
- ariaLabel,
7076
- title: title2
7077
- }) => {
7025
+ var resolveOutcomeTitle = (outcome) => {
7078
7026
  var _a, _b;
7079
- const labels = (0, import_hooks26.useLabels)();
7080
- const sizeClass = sizeClasses2[size];
7081
- const resolvedLabel = resolveVenueLogoLabel({
7082
- ariaLabel,
7083
- labels,
7084
- venue,
7085
- venueFallbackLabels: venueLogoLabels
7086
- });
7087
- const isUnknownVenue = !(venue in venueLogoRegistry);
7088
- if (isUnknownVenue && process.env.NODE_ENV === "development") {
7089
- console.warn(`[AggUI] Unknown venue "${venue}" \u2014 using default logo`);
7027
+ return (_b = (_a = outcome == null ? void 0 : outcome.title) != null ? _a : outcome == null ? void 0 : outcome.label) == null ? void 0 : _b.trim();
7028
+ };
7029
+ var selectPrimaryVenueMarket = (venueMarkets) => {
7030
+ if (venueMarkets.length === 0) return void 0;
7031
+ if (venueMarkets.length === 1) return venueMarkets[0];
7032
+ return [...venueMarkets].sort((a, b) => {
7033
+ const aVolume = typeof a.volume === "number" ? a.volume : -1;
7034
+ const bVolume = typeof b.volume === "number" ? b.volume : -1;
7035
+ return bVolume - aVolume;
7036
+ })[0];
7037
+ };
7038
+ var resolveTileImage = (event, primaryVenueMarket, imageOverride) => {
7039
+ if (typeof imageOverride === "string" && imageOverride.trim()) {
7040
+ return imageOverride;
7090
7041
  }
7091
- if (variant === "logo") {
7092
- return /* @__PURE__ */ (0, import_jsx_runtime117.jsx)(
7093
- RemoteImage,
7094
- {
7095
- src: (_a = venueLogoUrlRegistry[venue]) != null ? _a : DEFAULT_VENUE_LOGO_URL,
7096
- alt: resolvedLabel || DEFAULT_VENUE_LABEL,
7097
- title: title2,
7098
- className: cn("shrink-0 rounded-agg-lg object-cover", sizeClass, className)
7099
- }
7100
- );
7042
+ if (typeof event.image === "string" && event.image.trim()) {
7043
+ return event.image;
7101
7044
  }
7102
- const Component2 = (_b = venueLogoRegistry[venue]) != null ? _b : DefaultVenueIcon;
7103
- const resolvedIsColor = resolveVenueLogoIsColor({
7104
- isColor,
7105
- isMonochromatic
7106
- });
7107
- return /* @__PURE__ */ (0, import_jsx_runtime117.jsx)(
7108
- Component2,
7109
- {
7110
- className: cn("group/agg-venue-logo", "shrink-0", sizeClass, className),
7111
- isColor: resolvedIsColor,
7112
- color,
7113
- "aria-label": resolvedLabel || DEFAULT_VENUE_LABEL,
7114
- title: title2
7115
- }
7045
+ if (typeof (primaryVenueMarket == null ? void 0 : primaryVenueMarket.image) === "string" && primaryVenueMarket.image.trim()) {
7046
+ return primaryVenueMarket.image;
7047
+ }
7048
+ return void 0;
7049
+ };
7050
+ var formatCountLabel = (count, singular, plural) => {
7051
+ return `${count} ${count === 1 ? singular : plural}`;
7052
+ };
7053
+ var getVenueSummary = (venueMarkets, options) => {
7054
+ const normalizedVenueMarkets = normalizeVenueMarketCluster(venueMarkets);
7055
+ const tradableVenues = options == null ? void 0 : options.tradableVenues;
7056
+ const isVenueTradable = (venue) => {
7057
+ if (tradableVenues == null) return true;
7058
+ return tradableVenues.has(venue);
7059
+ };
7060
+ const uniqueVenues = Array.from(
7061
+ new Set(
7062
+ normalizedVenueMarkets.filter((market) => isVenueTradable(market.venue)).map((market) => market.venue)
7063
+ )
7116
7064
  );
7065
+ return {
7066
+ marketCount: normalizedVenueMarkets.length,
7067
+ venueCount: uniqueVenues.length,
7068
+ singleVenue: uniqueVenues.length === 1 ? uniqueVenues[0] : void 0
7069
+ };
7070
+ };
7071
+ var resolveVenueLabel = (venue, venueInfo, labels) => {
7072
+ var _a, _b;
7073
+ if (!venue) return labels.eventItem.venueSingular;
7074
+ return (_b = (_a = venueInfo == null ? void 0 : venueInfo[venue]) == null ? void 0 : _a.label) != null ? _b : labels.venues[venue];
7075
+ };
7076
+ var resolveDisplayVolume = (eventVolume, venueMarkets) => {
7077
+ if (typeof eventVolume === "number" && eventVolume > 0) return eventVolume;
7078
+ const clusterMarkets = normalizeVenueMarketCluster(venueMarkets);
7079
+ const marketSum = clusterMarkets.reduce(
7080
+ (acc, m) => acc + (typeof m.volume === "number" ? m.volume : 0),
7081
+ 0
7082
+ );
7083
+ if (marketSum > 0) return marketSum;
7084
+ return void 0;
7117
7085
  };
7118
- VenueLogo.displayName = "VenueLogo";
7119
-
7120
- // src/primitives/search/search.constants.ts
7121
- var DEFAULT_SEARCH_LIMIT = 5;
7122
- var MIN_SEARCH_LENGTH = 3;
7123
- var SEARCH_DEBOUNCE_MS = 300;
7124
7086
 
7125
7087
  // src/primitives/search/search.utils.ts
7126
- var import_sdk11 = require("@agg-build/sdk");
7127
- var import_dayjs2 = __toESM(require("dayjs"));
7128
7088
  var formatSearchContextLabel = (value) => {
7129
7089
  if (!(0, import_dayjs2.default)(value).isValid()) return value;
7130
7090
  return (0, import_dayjs2.default)(value).format("MMMM D, YYYY");
@@ -10843,7 +10803,7 @@ var resolveOutcomeRows = ({
10843
10803
  outcome
10844
10804
  }));
10845
10805
  }
10846
- return sortMarketsByYesOddsDesc(venueMarkets).map((market) => {
10806
+ return venueMarkets.map((market) => {
10847
10807
  const outcome = resolveDisplayOutcome(market);
10848
10808
  if (!outcome) return void 0;
10849
10809
  return {
@@ -14231,13 +14191,12 @@ var EventListItemDetailsContent = ({
14231
14191
  () => resolvedEventTradingState.displayMarkets,
14232
14192
  [resolvedEventTradingState.displayMarkets]
14233
14193
  );
14234
- const sortedVenueMarkets = (0, import_react23.useMemo)(() => sortMarketsByVolumeDesc(venueMarkets), [venueMarkets]);
14235
14194
  const marketOptions = (0, import_react23.useMemo)(
14236
- () => sortedVenueMarkets.map((vm) => ({
14195
+ () => venueMarkets.map((vm) => ({
14237
14196
  value: vm.id,
14238
14197
  label: vm.question
14239
14198
  })),
14240
- [sortedVenueMarkets]
14199
+ [venueMarkets]
14241
14200
  );
14242
14201
  const volumeLabel = (0, import_react23.useMemo)(() => {
14243
14202
  const resolvedVolume = resolveDisplayVolume(event.volume, venueMarkets);
@@ -16334,8 +16293,7 @@ var MarketDetailsList = ({
16334
16293
  return resolveIsResolvedEvent(sourceMarkets, eventTradingState);
16335
16294
  }, [eventTradingState, sourceMarkets]);
16336
16295
  const groupedMarkets = (0, import_react26.useMemo)(() => {
16337
- const sortedMarkets = sortMarketsByVolumeDesc(sourceMarkets);
16338
- if (sortedMarkets.length === 0) {
16296
+ if (sourceMarkets.length === 0) {
16339
16297
  return {
16340
16298
  primary: [],
16341
16299
  closed: [],
@@ -16344,9 +16302,9 @@ var MarketDetailsList = ({
16344
16302
  };
16345
16303
  }
16346
16304
  if (isResolvedEvent) {
16347
- const winnerMarketId = resolveResolvedWinnerMarketId(sortedMarkets, eventTradingState);
16305
+ const winnerMarketId = resolveResolvedWinnerMarketId(sourceMarkets, eventTradingState);
16348
16306
  return {
16349
- primary: moveMarketToFront(sortedMarkets, winnerMarketId),
16307
+ primary: moveMarketToFront(sourceMarkets, winnerMarketId),
16350
16308
  upcoming: [],
16351
16309
  resolved: []
16352
16310
  };
@@ -16355,7 +16313,7 @@ var MarketDetailsList = ({
16355
16313
  const upcoming = [];
16356
16314
  const resolved = [];
16357
16315
  const closed = [];
16358
- sortedMarkets.forEach((market) => {
16316
+ sourceMarkets.forEach((market) => {
16359
16317
  const marketStateKind = (0, import_hooks50.resolveMarketTradingState)(market).kind;
16360
16318
  if (marketStateKind === "resolved") {
16361
16319
  resolved.push(market);
@@ -21914,19 +21872,14 @@ var EventMarketPageContent = ({
21914
21872
  stickyOrderPanel,
21915
21873
  resolvedClaim
21916
21874
  }) => {
21917
- const sortedEvent = (0, import_react33.useMemo)(() => {
21918
- return __spreadProps(__spreadValues({}, event), {
21919
- venueMarkets: sortMarketsByVolumeDesc(event.venueMarkets)
21920
- });
21921
- }, [event]);
21922
- const eventTradingState = (0, import_react33.useMemo)(() => (0, import_hooks57.resolveEventTradingState)(sortedEvent), [sortedEvent]);
21875
+ const eventTradingState = (0, import_react33.useMemo)(() => (0, import_hooks57.resolveEventTradingState)(event), [event]);
21923
21876
  const stickyOrderPanelState = resolveEventMarketPageStickyState({
21924
21877
  stickyOrderPanel
21925
21878
  });
21926
21879
  const [isMobileTradeOpen, setIsMobileTradeOpen] = (0, import_react33.useState)(false);
21927
21880
  const isMobileViewport = useIsMobileEventMarketViewport();
21928
21881
  const tradingContext = (0, import_hooks57.useEventTradingContext)();
21929
- const midpointsResult = (0, import_hooks57.useMidpoints)(sortedEvent.venueMarkets);
21882
+ const midpointsResult = (0, import_hooks57.useMidpoints)(event.venueMarkets);
21930
21883
  const setTradeSideRef = (0, import_react33.useRef)(tradingContext == null ? void 0 : tradingContext.setTradeSide);
21931
21884
  setTradeSideRef.current = tradingContext == null ? void 0 : tradingContext.setTradeSide;
21932
21885
  (0, import_react33.useEffect)(() => {
@@ -21935,7 +21888,7 @@ var EventMarketPageContent = ({
21935
21888
  (_a = setTradeSideRef.current) == null ? void 0 : _a.call(setTradeSideRef, import_hooks57.TradeSide.Buy);
21936
21889
  };
21937
21890
  }, []);
21938
- if (!sortedEvent.venueMarkets.length) {
21891
+ if (!event.venueMarkets.length) {
21939
21892
  return /* @__PURE__ */ (0, import_jsx_runtime153.jsx)(EventMarketPageUnavailableState, { ariaLabel });
21940
21893
  }
21941
21894
  return /* @__PURE__ */ (0, import_jsx_runtime153.jsxs)(
@@ -21946,7 +21899,7 @@ var EventMarketPageContent = ({
21946
21899
  "w-full mx-auto max-w-[1360px] px-6 lg:px-10 pb-10",
21947
21900
  classNames == null ? void 0 : classNames.root
21948
21901
  ),
21949
- "aria-label": ariaLabel != null ? ariaLabel : sortedEvent.title,
21902
+ "aria-label": ariaLabel != null ? ariaLabel : event.title,
21950
21903
  children: [
21951
21904
  /* @__PURE__ */ (0, import_jsx_runtime153.jsxs)(
21952
21905
  "div",
@@ -21971,7 +21924,7 @@ var EventMarketPageContent = ({
21971
21924
  /* @__PURE__ */ (0, import_jsx_runtime153.jsx)(
21972
21925
  EventListItemDetails,
21973
21926
  {
21974
- event: sortedEvent,
21927
+ event,
21975
21928
  defaultMarketId,
21976
21929
  defaultOutcomeId,
21977
21930
  eventTradingState,
@@ -21984,7 +21937,7 @@ var EventMarketPageContent = ({
21984
21937
  /* @__PURE__ */ (0, import_jsx_runtime153.jsx)(
21985
21938
  MarketDetailsList,
21986
21939
  {
21987
- eventId: sortedEvent.id,
21940
+ eventId: event.id,
21988
21941
  markets: eventTradingState.displayMarkets,
21989
21942
  eventTradingState,
21990
21943
  live: true,
@@ -22012,7 +21965,7 @@ var EventMarketPageContent = ({
22012
21965
  classNames: resolveMobileTradePlaceOrderClassNames(classNames)
22013
21966
  }
22014
21967
  ) }) : null,
22015
- /* @__PURE__ */ (0, import_jsx_runtime153.jsx)(SettlementDetails, { eventId: sortedEvent.id, className: classNames == null ? void 0 : classNames.settlement })
21968
+ /* @__PURE__ */ (0, import_jsx_runtime153.jsx)(SettlementDetails, { eventId: event.id, className: classNames == null ? void 0 : classNames.settlement })
22016
21969
  ]
22017
21970
  }
22018
21971
  ),