@agg-build/ui 2.1.1 → 2.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/dist/{chunk-XHDGSRG7.mjs → chunk-BW7S2YR3.mjs} +1139 -308
  2. package/dist/{chunk-TERG43WW.mjs → chunk-R2YNZJZ3.mjs} +69 -27
  3. package/dist/{chunk-RPXRTXCY.mjs → chunk-T4YZGAYS.mjs} +22 -1
  4. package/dist/{chunk-IQT4I5B4.mjs → chunk-TAGPAADA.mjs} +2108 -767
  5. package/dist/{chunk-NK57KMYN.mjs → chunk-TBZWRUFB.mjs} +752 -589
  6. package/dist/{chunk-YJO6LMRT.mjs → chunk-VP76G6PN.mjs} +87 -25
  7. package/dist/{chunk-WU2C3C6K.mjs → chunk-XHE2VO3S.mjs} +4 -21
  8. package/dist/events.js +1014 -760
  9. package/dist/events.mjs +5 -3
  10. package/dist/index.js +9937 -7880
  11. package/dist/index.mjs +117 -456
  12. package/dist/modals.js +1 -1
  13. package/dist/modals.mjs +3 -3
  14. package/dist/pages.js +8513 -6380
  15. package/dist/pages.mjs +6 -6
  16. package/dist/primitives.js +85 -25
  17. package/dist/primitives.mjs +1 -1
  18. package/dist/styles.css +1 -1
  19. package/dist/tailwind.css +1 -1
  20. package/dist/trading.js +979 -402
  21. package/dist/trading.mjs +10 -6
  22. package/dist/types/events/item/event-list-item.utils.d.mts +1 -25
  23. package/dist/types/events/item/event-list-item.utils.d.ts +1 -25
  24. package/dist/types/events/item-details/index.d.mts +2 -1
  25. package/dist/types/events/item-details/index.d.ts +2 -1
  26. package/dist/types/events/market-details/market-details-graph-panel.d.mts +39 -0
  27. package/dist/types/events/market-details/market-details-graph-panel.d.ts +39 -0
  28. package/dist/types/events/market-details/market-details-outcome-button.d.mts +2 -1
  29. package/dist/types/events/market-details/market-details-outcome-button.d.ts +2 -1
  30. package/dist/types/events/market-details/market-details.types.d.mts +31 -0
  31. package/dist/types/events/market-details/market-details.types.d.ts +31 -0
  32. package/dist/types/events/market-details/market-details.utils.d.mts +3 -16
  33. package/dist/types/events/market-details/market-details.utils.d.ts +3 -16
  34. package/dist/types/events/shared/format-event-title.d.mts +24 -0
  35. package/dist/types/events/shared/format-event-title.d.ts +24 -0
  36. package/dist/types/events/shared/format-sports-event-time.d.mts +2 -0
  37. package/dist/types/events/shared/format-sports-event-time.d.ts +2 -0
  38. package/dist/types/events/shared/select-best-outcome.d.mts +88 -0
  39. package/dist/types/events/shared/select-best-outcome.d.ts +88 -0
  40. package/dist/types/notifications/agg-notification-events-provider.d.mts +10 -1
  41. package/dist/types/notifications/agg-notification-events-provider.d.ts +10 -1
  42. package/dist/types/pages/event-market/event-market.shared.d.mts +30 -0
  43. package/dist/types/pages/event-market/event-market.shared.d.ts +30 -0
  44. package/dist/types/pages/event-market/event-market.types.d.mts +7 -0
  45. package/dist/types/pages/event-market/event-market.types.d.ts +7 -0
  46. package/dist/types/pages/event-market/sports-event-market-page.d.mts +8 -0
  47. package/dist/types/pages/event-market/sports-event-market-page.d.ts +8 -0
  48. package/dist/types/pages/event-market/sports-event-market.fixtures.d.mts +13 -0
  49. package/dist/types/pages/event-market/sports-event-market.fixtures.d.ts +13 -0
  50. package/dist/types/pages/event-market/sports-event-market.utils.d.mts +156 -0
  51. package/dist/types/pages/event-market/sports-event-market.utils.d.ts +156 -0
  52. package/dist/types/pages/event-market/sports-line-rail.d.mts +17 -0
  53. package/dist/types/pages/event-market/sports-line-rail.d.ts +17 -0
  54. package/dist/types/pages/event-market/sports-market-card.d.mts +22 -0
  55. package/dist/types/pages/event-market/sports-market-card.d.ts +22 -0
  56. package/dist/types/pages/event-market/sports-markets.d.mts +13 -0
  57. package/dist/types/pages/event-market/sports-markets.d.ts +13 -0
  58. package/dist/types/primitives/state-message/index.d.mts +1 -1
  59. package/dist/types/primitives/state-message/index.d.ts +1 -1
  60. package/dist/types/primitives/state-message/state-message.types.d.mts +1 -1
  61. package/dist/types/primitives/state-message/state-message.types.d.ts +1 -1
  62. package/dist/types/trading/index.d.mts +2 -0
  63. package/dist/types/trading/index.d.ts +2 -0
  64. package/dist/types/trading/place-order/index.d.mts +1 -1
  65. package/dist/types/trading/place-order/index.d.ts +1 -1
  66. package/dist/types/trading/place-order/index.place-order.types.d.mts +30 -1
  67. package/dist/types/trading/place-order/index.place-order.types.d.ts +30 -1
  68. package/dist/types/trading/settlement/settlement-text.utils.d.mts +5 -2
  69. package/dist/types/trading/settlement/settlement-text.utils.d.ts +5 -2
  70. package/dist/types/trading/use-claim-winnings.d.mts +84 -0
  71. package/dist/types/trading/use-claim-winnings.d.ts +84 -0
  72. package/dist/types/trading/use-resolved-market-claim.d.mts +26 -0
  73. package/dist/types/trading/use-resolved-market-claim.d.ts +26 -0
  74. package/package.json +3 -3
package/dist/events.js CHANGED
@@ -74,6 +74,7 @@ __export(events_exports, {
74
74
  formatProbabilityCents: () => formatProbabilityCents,
75
75
  mergeVenueOutcomeOrderbooks: () => mergeVenueOutcomeOrderbooks,
76
76
  orderbookRowLimitDefault: () => orderbookRowLimitDefault,
77
+ resolveEventDetailsSyncKey: () => resolveEventDetailsSyncKey,
77
78
  resolveOrderBookRows: () => resolveOrderBookRows,
78
79
  resolveUnifiedOrderBookEntries: () => resolveUnifiedOrderBookEntries,
79
80
  useCenterOrderbookSpread: () => useCenterOrderbookSpread
@@ -5491,6 +5492,62 @@ var VenueLogo = ({
5491
5492
  };
5492
5493
  VenueLogo.displayName = "VenueLogo";
5493
5494
 
5495
+ // src/events/shared/format-sports-event-time.ts
5496
+ var import_dayjs2 = __toESM(require("dayjs"));
5497
+ var import_timezone = __toESM(require("dayjs/plugin/timezone"));
5498
+ var import_utc = __toESM(require("dayjs/plugin/utc"));
5499
+ import_dayjs2.default.extend(import_utc.default);
5500
+ import_dayjs2.default.extend(import_timezone.default);
5501
+ var SPORTS_EVENT_TIMEZONE = "America/New_York";
5502
+ var SPORTS_EVENT_TIME_FORMAT = "MMM D, h:mm A";
5503
+ var formatSportsEventTimeEt = (value) => {
5504
+ const resolvedValue = value.trim();
5505
+ if (!resolvedValue) return null;
5506
+ const parsedValue = import_dayjs2.default.utc(resolvedValue);
5507
+ if (!parsedValue.isValid()) return null;
5508
+ return `${parsedValue.tz(SPORTS_EVENT_TIMEZONE).format(SPORTS_EVENT_TIME_FORMAT)} ET`;
5509
+ };
5510
+
5511
+ // src/events/shared/format-event-title.ts
5512
+ var SPORT_CATEGORY_TOKENS = /* @__PURE__ */ new Set(["sport", "sports"]);
5513
+ var normalizeCategoryToken = (value) => {
5514
+ if (typeof value !== "string") return null;
5515
+ const normalizedValue = value.trim().toLowerCase();
5516
+ if (!normalizedValue) return null;
5517
+ return normalizedValue;
5518
+ };
5519
+ var isSportCategoryToken = (value) => {
5520
+ const normalizedValue = normalizeCategoryToken(value);
5521
+ if (!normalizedValue) return false;
5522
+ return SPORT_CATEGORY_TOKENS.has(normalizedValue);
5523
+ };
5524
+ var isSportEvent = (categories, structureType) => {
5525
+ var _a;
5526
+ if (isSportCategoryToken(structureType)) return true;
5527
+ return (_a = categories == null ? void 0 : categories.some((categoryEntry) => {
5528
+ var _a2, _b, _c, _d;
5529
+ return isSportCategoryToken(categoryEntry.id) || isSportCategoryToken((_a2 = categoryEntry.category) == null ? void 0 : _a2.id) || isSportCategoryToken((_b = categoryEntry.category) == null ? void 0 : _b.name) || isSportCategoryToken((_c = categoryEntry.category) == null ? void 0 : _c.displayName) || isSportCategoryToken((_d = categoryEntry.category) == null ? void 0 : _d.parentId);
5530
+ })) != null ? _a : false;
5531
+ };
5532
+ var formatEventTitleWithDateSuffix = ({
5533
+ title: title2,
5534
+ categories,
5535
+ structureType,
5536
+ gameStartTime,
5537
+ endDate
5538
+ }) => {
5539
+ const resolvedTitle = title2.trim();
5540
+ if (!resolvedTitle) return resolvedTitle;
5541
+ if (!isSportEvent(categories, structureType)) return resolvedTitle;
5542
+ const dateSource = gameStartTime != null ? gameStartTime : endDate;
5543
+ if (!dateSource) return resolvedTitle;
5544
+ const formattedDate = formatSportsEventTimeEt(dateSource);
5545
+ if (!formattedDate) return resolvedTitle;
5546
+ const suffix = ` - ${formattedDate}`;
5547
+ if (resolvedTitle.endsWith(suffix)) return resolvedTitle;
5548
+ return `${resolvedTitle}${suffix}`;
5549
+ };
5550
+
5494
5551
  // src/events/item/event-list-item.utils.ts
5495
5552
  var import_hooks25 = require("@agg-build/hooks");
5496
5553
 
@@ -5709,18 +5766,9 @@ var selectPrimaryVenueMarket = (venueMarkets) => {
5709
5766
  return bVolume - aVolume;
5710
5767
  })[0];
5711
5768
  };
5712
- var getVenueSummary = (venueMarkets, options) => {
5769
+ var getVenueSummary = (venueMarkets) => {
5713
5770
  const normalizedVenueMarkets = normalizeVenueMarketCluster(venueMarkets);
5714
- const tradableVenues = options == null ? void 0 : options.tradableVenues;
5715
- const isVenueTradable = (venue) => {
5716
- if (tradableVenues == null) return true;
5717
- return tradableVenues.has(venue);
5718
- };
5719
- const uniqueVenues = Array.from(
5720
- new Set(
5721
- normalizedVenueMarkets.filter((market) => isVenueTradable(market.venue)).map((market) => market.venue)
5722
- )
5723
- );
5771
+ const uniqueVenues = Array.from(new Set(normalizedVenueMarkets.map((market) => market.venue)));
5724
5772
  return {
5725
5773
  marketCount: normalizedVenueMarkets.length,
5726
5774
  venueCount: uniqueVenues.length,
@@ -6147,7 +6195,7 @@ var Select = ({
6147
6195
  disabled: item.disabled,
6148
6196
  className: cn(
6149
6197
  "agg-select-item",
6150
- "relative flex w-full items-center gap-3 rounded-[6px] px-5 py-3 text-left text-agg-sm leading-agg-5 outline-none",
6198
+ "relative flex w-full items-center gap-3 rounded-[6px] pl-3 pr-5 py-3 text-left text-agg-sm leading-agg-5 outline-none",
6151
6199
  "hover:bg-agg-secondary-hover focus-visible:bg-agg-secondary-hover",
6152
6200
  isSelected ? "bg-agg-primary/10 font-agg-normal text-agg-primary" : "font-agg-normal text-agg-foreground",
6153
6201
  item.disabled && "cursor-not-allowed opacity-60",
@@ -6332,13 +6380,20 @@ var resolveStateMessageHasAction = ({ onAction }) => {
6332
6380
 
6333
6381
  // src/primitives/state-message/index.tsx
6334
6382
  var import_jsx_runtime116 = require("react/jsx-runtime");
6335
- var StateMessage = ({
6336
- icon,
6337
- title: title2,
6338
- description,
6339
- onAction,
6340
- classNames
6341
- }) => {
6383
+ var StateMessage = (_a) => {
6384
+ var _b = _a, {
6385
+ icon,
6386
+ title: title2,
6387
+ description,
6388
+ onAction,
6389
+ classNames
6390
+ } = _b, rest = __objRest(_b, [
6391
+ "icon",
6392
+ "title",
6393
+ "description",
6394
+ "onAction",
6395
+ "classNames"
6396
+ ]);
6342
6397
  const labels = (0, import_hooks28.useLabels)();
6343
6398
  const hasAction = resolveStateMessageHasAction({ onAction });
6344
6399
  const resolvedIcon = (0, import_react6.cloneElement)(icon, {
@@ -6347,7 +6402,7 @@ var StateMessage = ({
6347
6402
  });
6348
6403
  return /* @__PURE__ */ (0, import_jsx_runtime116.jsx)(
6349
6404
  "div",
6350
- {
6405
+ __spreadProps(__spreadValues({}, rest), {
6351
6406
  className: cn(
6352
6407
  "agg-state-message",
6353
6408
  "flex min-h-[240px] w-full flex-col items-center justify-center px-5 py-10 text-center md:px-10",
@@ -6406,7 +6461,7 @@ var StateMessage = ({
6406
6461
  ]
6407
6462
  }
6408
6463
  )
6409
- }
6464
+ })
6410
6465
  );
6411
6466
  };
6412
6467
  StateMessage.displayName = "StateMessage";
@@ -7250,7 +7305,7 @@ var normalizeEventListItemV2Comparison = ({
7250
7305
  return __spreadProps(__spreadValues({}, row), {
7251
7306
  prices
7252
7307
  });
7253
- });
7308
+ }).filter((row) => row.prices.length === 0 || row.prices.some((price) => price.price > 0));
7254
7309
  const matchedVenues = collectMatchedVenues(rows);
7255
7310
  return {
7256
7311
  rows,
@@ -7371,7 +7426,13 @@ var EventListItemContent = ({
7371
7426
  const config = (0, import_hooks31.useSdkUiConfig)();
7372
7427
  const labels = (0, import_hooks31.useLabels)();
7373
7428
  const allVenueMarkets = (0, import_react10.useMemo)(() => event.venueMarkets, [event.venueMarkets]);
7374
- const resolvedTitle = event.title;
7429
+ const resolvedTitle = formatEventTitleWithDateSuffix({
7430
+ title: event.title,
7431
+ categories: event.categories,
7432
+ structureType: event.structureType,
7433
+ gameStartTime: event.gameStartTime,
7434
+ endDate: event.endDate
7435
+ });
7375
7436
  const resolvedImage = event.image;
7376
7437
  const visibleVenueLogos = (0, import_react10.useMemo)(() => {
7377
7438
  var _a2;
@@ -7397,8 +7458,10 @@ var EventListItemContent = ({
7397
7458
  } = (0, import_hooks31.useVenueMarkets)({
7398
7459
  venueEventId: event.id,
7399
7460
  enabled: shouldEnableLazyMarketLoading && isLazyMarketsQueryEnabled,
7400
- sortBy: "yesPrice",
7401
- sortDir: "desc",
7461
+ // List/tile surface: axis/dates sort by volume so the scroll tail matches
7462
+ // the volume-sorted top-3 (the detail page omits context and keeps the
7463
+ // structured threshold/date order).
7464
+ context: "list",
7402
7465
  status: marketStatus
7403
7466
  });
7404
7467
  const resolvedOutcomeMarkets = (0, import_react10.useMemo)(() => {
@@ -7984,10 +8047,10 @@ var import_hooks33 = require("@agg-build/hooks");
7984
8047
 
7985
8048
  // src/events/market-details/market-details.utils.ts
7986
8049
  var import_sdk12 = require("@agg-build/sdk");
7987
- var import_dayjs3 = __toESM(require("dayjs"));
8050
+ var import_dayjs4 = __toESM(require("dayjs"));
7988
8051
 
7989
8052
  // src/events/item-details/event-list-item-details.utils.ts
7990
- var import_dayjs2 = __toESM(require("dayjs"));
8053
+ var import_dayjs3 = __toESM(require("dayjs"));
7991
8054
  var compareOutcomeSelectorLabels = (leftLabel, rightLabel) => {
7992
8055
  const leftSemanticLabel = toSemanticLabel(leftLabel);
7993
8056
  const rightSemanticLabel = toSemanticLabel(rightLabel);
@@ -8000,8 +8063,8 @@ var compareOutcomeSelectorLabels = (leftLabel, rightLabel) => {
8000
8063
  if (leftBinaryOrder != null && rightBinaryOrder != null) {
8001
8064
  return leftBinaryOrder - rightBinaryOrder;
8002
8065
  }
8003
- const leftDate = isDateLikeLabel(leftLabel) ? (0, import_dayjs2.default)(leftLabel).valueOf() : null;
8004
- const rightDate = isDateLikeLabel(rightLabel) ? (0, import_dayjs2.default)(rightLabel).valueOf() : null;
8066
+ const leftDate = isDateLikeLabel(leftLabel) ? (0, import_dayjs3.default)(leftLabel).valueOf() : null;
8067
+ const rightDate = isDateLikeLabel(rightLabel) ? (0, import_dayjs3.default)(rightLabel).valueOf() : null;
8005
8068
  if (leftDate != null && rightDate != null && leftDate !== rightDate) {
8006
8069
  return leftDate - rightDate;
8007
8070
  }
@@ -8042,7 +8105,7 @@ var toSemanticLabel = (value) => {
8042
8105
  };
8043
8106
  var isDateLikeLabel = (value) => {
8044
8107
  if (!value.trim()) return false;
8045
- return (0, import_dayjs2.default)(value).isValid();
8108
+ return (0, import_dayjs3.default)(value).isValid();
8046
8109
  };
8047
8110
  var matchOutcomeByLabel = (outcome, selectedOutcomeLabel) => {
8048
8111
  const normalizedSelectedLabel = normalizeLabel(selectedOutcomeLabel);
@@ -8410,6 +8473,42 @@ var resolveDisplayOutcomeLabels = (labels) => {
8410
8473
  (label2) => labels.some((value) => normalizeLabel2(value) === normalizeLabel2(label2))
8411
8474
  );
8412
8475
  };
8476
+ var TRAILING_LINE_VALUE_PATTERN = /^(.*?)(\s+[+-]?\d+(?:\.\d+)?)$/;
8477
+ var resolveLineOutcomeDisplayParts = (label2, title2) => {
8478
+ var _a, _b;
8479
+ const sourceText = (title2 == null ? void 0 : title2.trim()) || label2.trim();
8480
+ const match = TRAILING_LINE_VALUE_PATTERN.exec(sourceText);
8481
+ if (!match) {
8482
+ return {
8483
+ title: (title2 == null ? void 0 : title2.trim()) || null,
8484
+ lineLabel: null
8485
+ };
8486
+ }
8487
+ const baseTitle = ((_a = match[1]) == null ? void 0 : _a.trim()) || null;
8488
+ const lineLabel = ((_b = match[2]) == null ? void 0 : _b.trim()) || null;
8489
+ return {
8490
+ title: baseTitle,
8491
+ lineLabel
8492
+ };
8493
+ };
8494
+ var formatScopedLineValue = (value) => {
8495
+ return Number.isInteger(value) ? String(value) : value.toFixed(1);
8496
+ };
8497
+ var resolveScopedMarketLineLabel = ({
8498
+ outcomeIndex,
8499
+ scopedMarket
8500
+ }) => {
8501
+ var _a;
8502
+ const lineValue = scopedMarket == null ? void 0 : scopedMarket.lineValue;
8503
+ if (lineValue == null) return null;
8504
+ const sportsMarketType = normalizeLabel2((_a = scopedMarket == null ? void 0 : scopedMarket.sportsMarketType) != null ? _a : "");
8505
+ if (sportsMarketType === "spread") {
8506
+ const directionalLineValue = outcomeIndex === 0 ? lineValue : lineValue * -1;
8507
+ const prefix = directionalLineValue > 0 ? "+" : "";
8508
+ return `${prefix}${formatScopedLineValue(directionalLineValue)}`;
8509
+ }
8510
+ return formatScopedLineValue(lineValue);
8511
+ };
8413
8512
  var resolveMarketDetailsOutcomeLabels = (venueMarkets) => {
8414
8513
  var _a;
8415
8514
  const primaryMarket = selectPrimaryVenueMarket(venueMarkets);
@@ -8462,12 +8561,12 @@ var resolveScopedSelectedOutcome = ({
8462
8561
  outcomeLabel: matchingOutcome.label
8463
8562
  };
8464
8563
  }
8465
- if (suppressFallbackWhenSelectedOutcomeOutOfScope) {
8466
- return {
8467
- outcomeId: null,
8468
- outcomeLabel: void 0
8469
- };
8470
- }
8564
+ }
8565
+ if (suppressFallbackWhenSelectedOutcomeOutOfScope) {
8566
+ return {
8567
+ outcomeId: null,
8568
+ outcomeLabel: void 0
8569
+ };
8471
8570
  }
8472
8571
  const outcomeLabels = resolveDisplayOutcomeLabels(
8473
8572
  resolveMarketDetailsOutcomeLabels(venueMarkets).map((outcome) => outcome.label)
@@ -8505,28 +8604,36 @@ var resolveOutcomeTone = (label2, index) => {
8505
8604
  }
8506
8605
  return index === 0 ? "positive" : "negative";
8507
8606
  };
8508
- var resolveHeaderOutcomeItems = (venueMarkets, scopedMarket) => {
8607
+ var resolveHeaderOutcomeItems = (venueMarkets, scopedMarket, variant) => {
8509
8608
  const outcomes = resolveMarketDetailsOutcomeLabels(venueMarkets);
8510
8609
  const labels = resolveDisplayOutcomeLabels(outcomes.map((outcome) => outcome.label));
8511
8610
  const probabilityByLabel = resolveAverageProbabilityByLabel(venueMarkets, labels);
8512
- return labels.slice(0, 2).map((label2, index) => {
8513
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
8611
+ return labels.map((label2, index) => {
8612
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
8514
8613
  const scopedOutcome = (_a = scopedMarket == null ? void 0 : scopedMarket.venueMarketOutcomes) == null ? void 0 : _a.find(
8515
8614
  (outcome) => normalizeLabel2(outcome.label) === normalizeLabel2(label2)
8516
8615
  );
8517
8616
  const scopedTitle = ((_b = scopedOutcome == null ? void 0 : scopedOutcome.title) == null ? void 0 : _b.trim()) || null;
8518
8617
  const fallbackTitle = (_d = (_c = outcomes.find((outcome) => normalizeLabel2(outcome.label) === normalizeLabel2(label2))) == null ? void 0 : _c.title) != null ? _d : null;
8519
- const title2 = scopedOutcome ? scopedTitle : fallbackTitle;
8618
+ const resolvedTitle = scopedOutcome ? scopedTitle : fallbackTitle;
8619
+ const lineDisplayParts = variant === "line" ? resolveLineOutcomeDisplayParts(label2, resolvedTitle) : { title: resolvedTitle, lineLabel: null };
8620
+ const fallbackLineLabel = variant === "line" ? resolveScopedMarketLineLabel({
8621
+ outcomeIndex: index,
8622
+ scopedMarket
8623
+ }) : null;
8624
+ const sportsMarketType = normalizeLabel2((_e = scopedMarket == null ? void 0 : scopedMarket.sportsMarketType) != null ? _e : "");
8520
8625
  const fallbackOutcomeByVenue = resolveOutcomesByVenue(venueMarkets, label2)[0];
8521
- const outcomeId = (_f = (_e = scopedOutcome == null ? void 0 : scopedOutcome.id) != null ? _e : fallbackOutcomeByVenue == null ? void 0 : fallbackOutcomeByVenue.outcome.id) != null ? _f : "";
8522
- const venue = (_j = (_i = (_g = scopedMarket == null ? void 0 : scopedMarket.venue) != null ? _g : fallbackOutcomeByVenue == null ? void 0 : fallbackOutcomeByVenue.venue) != null ? _i : (_h = venueMarkets[0]) == null ? void 0 : _h.venue) != null ? _j : "polymarket";
8626
+ const outcomeId = (_g = (_f = scopedOutcome == null ? void 0 : scopedOutcome.id) != null ? _f : fallbackOutcomeByVenue == null ? void 0 : fallbackOutcomeByVenue.outcome.id) != null ? _g : "";
8627
+ const venue = (_k = (_j = (_h = scopedMarket == null ? void 0 : scopedMarket.venue) != null ? _h : fallbackOutcomeByVenue == null ? void 0 : fallbackOutcomeByVenue.venue) != null ? _j : (_i = venueMarkets[0]) == null ? void 0 : _i.venue) != null ? _k : "polymarket";
8523
8628
  return {
8524
- title: title2,
8629
+ title: lineDisplayParts.title,
8525
8630
  id: outcomeId,
8526
8631
  venue,
8527
8632
  label: label2,
8633
+ lineLabel: sportsMarketType === "total" ? fallbackLineLabel != null ? fallbackLineLabel : lineDisplayParts.lineLabel : (_l = lineDisplayParts.lineLabel) != null ? _l : fallbackLineLabel,
8528
8634
  probability: probabilityByLabel.get(label2),
8529
- tone: resolveOutcomeTone(label2, index)
8635
+ tone: resolveOutcomeTone(label2, index),
8636
+ variant
8530
8637
  };
8531
8638
  });
8532
8639
  };
@@ -8534,10 +8641,9 @@ var resolveSubtitle = ({
8534
8641
  venueMarkets,
8535
8642
  volume,
8536
8643
  formatCompactCurrency,
8537
- labels,
8538
- tradableVenues
8644
+ labels
8539
8645
  }) => {
8540
- const { venueCount } = getVenueSummary(venueMarkets, { tradableVenues });
8646
+ const { venueCount } = getVenueSummary(venueMarkets);
8541
8647
  const parts = [
8542
8648
  `${venueCount} ${venueCount === 1 ? labels.marketDetails.meta.venueSingular : labels.marketDetails.meta.venuePlural}`
8543
8649
  ];
@@ -8556,19 +8662,19 @@ var resolveOtherTabRows = (market, labels) => {
8556
8662
  if (market.creationDate) {
8557
8663
  rows.push({
8558
8664
  label: labels.marketDetails.meta.created,
8559
- value: (0, import_dayjs3.default)(market.creationDate).format("MMM D, YYYY")
8665
+ value: (0, import_dayjs4.default)(market.creationDate).format("MMM D, YYYY")
8560
8666
  });
8561
8667
  }
8562
8668
  if (market.startDate) {
8563
8669
  rows.push({
8564
8670
  label: labels.marketDetails.meta.opens,
8565
- value: (0, import_dayjs3.default)(market.startDate).format("MMM D, YYYY")
8671
+ value: (0, import_dayjs4.default)(market.startDate).format("MMM D, YYYY")
8566
8672
  });
8567
8673
  }
8568
8674
  if (market.endDate) {
8569
8675
  rows.push({
8570
8676
  label: labels.marketDetails.meta.closes,
8571
- value: (0, import_dayjs3.default)(market.endDate).format("MMM D, YYYY")
8677
+ value: (0, import_dayjs4.default)(market.endDate).format("MMM D, YYYY")
8572
8678
  });
8573
8679
  }
8574
8680
  if (rows.length === 1) {
@@ -8585,8 +8691,7 @@ var buildMarketDetailsModel = ({
8585
8691
  title: title2,
8586
8692
  image,
8587
8693
  formatCompactCurrency,
8588
- labels,
8589
- tradableVenues
8694
+ labels
8590
8695
  }) => {
8591
8696
  var _a, _b, _c, _d;
8592
8697
  const market = resolveMarketFromVenueMarkets(venueMarkets, marketId);
@@ -8601,8 +8706,7 @@ var buildMarketDetailsModel = ({
8601
8706
  venueMarkets: market.venueMarkets,
8602
8707
  volume: resolvedVolume,
8603
8708
  formatCompactCurrency,
8604
- labels,
8605
- tradableVenues
8709
+ labels
8606
8710
  });
8607
8711
  const outcomeLabels = resolveDisplayOutcomeLabels(
8608
8712
  resolveMarketDetailsOutcomeLabels(market.venueMarkets).map((outcome) => outcome.label)
@@ -9653,7 +9757,7 @@ var import_react14 = require("react");
9653
9757
 
9654
9758
  // src/trading/utils.ts
9655
9759
  var import_hooks37 = require("@agg-build/hooks");
9656
- var import_dayjs4 = __toESM(require("dayjs"));
9760
+ var import_dayjs5 = __toESM(require("dayjs"));
9657
9761
  var defaultLabels = (0, import_hooks37.resolveAggUiLabels)("en-US");
9658
9762
  var defaultSettlementSectionLabel = defaultLabels.trading.settlementSection;
9659
9763
  var defaultTradingDisclaimer = defaultLabels.trading.disclaimer;
@@ -9695,7 +9799,6 @@ var normalizeSettlementForCompare = (input) => {
9695
9799
  };
9696
9800
  var dedupeSettlementSources = (sources) => {
9697
9801
  const order = ["eventDescription", "marketDescription", "primaryRules"];
9698
- const seen = /* @__PURE__ */ new Set();
9699
9802
  const result = [];
9700
9803
  for (const key of order) {
9701
9804
  const value = sources[key];
@@ -9704,11 +9807,13 @@ var dedupeSettlementSources = (sources) => {
9704
9807
  if (!trimmed) continue;
9705
9808
  const fingerprint = normalizeSettlementForCompare(trimmed);
9706
9809
  if (!fingerprint) continue;
9707
- if (seen.has(fingerprint)) continue;
9708
- seen.add(fingerprint);
9709
- result.push({ key, content: trimmed });
9810
+ if (result.some((block) => block.fingerprint.includes(fingerprint))) continue;
9811
+ for (let i = result.length - 1; i >= 0; i -= 1) {
9812
+ if (fingerprint.includes(result[i].fingerprint)) result.splice(i, 1);
9813
+ }
9814
+ result.push({ key, content: trimmed, fingerprint });
9710
9815
  }
9711
- return result;
9816
+ return result.map(({ key, content }) => ({ key, content }));
9712
9817
  };
9713
9818
 
9714
9819
  // src/trading/settlement/settlement-text-renderer.tsx
@@ -10504,11 +10609,20 @@ var EventListItemDetailsContent = ({
10504
10609
  if (typeof resolvedVolume !== "number") return "";
10505
10610
  return `${config.formatting.formatCompactCurrency(resolvedVolume)} ${labels.eventItemDetails.volumeSuffix}`;
10506
10611
  }, [config, event.volume, labels.eventItemDetails.volumeSuffix, venueMarkets]);
10612
+ const resolvedTitle = (0, import_react16.useMemo)(() => {
10613
+ return formatEventTitleWithDateSuffix({
10614
+ title: event.title,
10615
+ categories: event.categories,
10616
+ structureType: event.structureType,
10617
+ gameStartTime: event.gameStartTime,
10618
+ endDate: event.endDate
10619
+ });
10620
+ }, [event.categories, event.gameStartTime, event.endDate, event.structureType, event.title]);
10507
10621
  return /* @__PURE__ */ (0, import_jsx_runtime125.jsxs)(
10508
10622
  Card,
10509
10623
  {
10510
10624
  className: cn("group/agg-event-details", detailsBaseCardClassName, classNames == null ? void 0 : classNames.root),
10511
- "aria-label": ariaLabel != null ? ariaLabel : event.title,
10625
+ "aria-label": ariaLabel != null ? ariaLabel : resolvedTitle,
10512
10626
  onClick: () => {
10513
10627
  onClick == null ? void 0 : onClick(event);
10514
10628
  },
@@ -10543,7 +10657,7 @@ var EventListItemDetailsContent = ({
10543
10657
  "truncate text-wrap wrap-break-word line-clamp-2",
10544
10658
  classNames == null ? void 0 : classNames.title
10545
10659
  ),
10546
- children: event.title
10660
+ children: resolvedTitle
10547
10661
  }
10548
10662
  ),
10549
10663
  venueMarkets.length > 1 ? /* @__PURE__ */ (0, import_jsx_runtime125.jsx)(
@@ -10765,8 +10879,8 @@ var EventListItemDetails = (props) => {
10765
10879
  EventListItemDetails.displayName = "EventListItemDetails";
10766
10880
 
10767
10881
  // src/events/market-details/index.tsx
10768
- var import_hooks42 = require("@agg-build/hooks");
10769
- var import_react19 = require("react");
10882
+ var import_hooks43 = require("@agg-build/hooks");
10883
+ var import_react20 = require("react");
10770
10884
 
10771
10885
  // src/events/orderbook/index.tsx
10772
10886
  var import_hooks41 = require("@agg-build/hooks");
@@ -11241,37 +11355,71 @@ var Orderbook = ({
11241
11355
  };
11242
11356
  Orderbook.displayName = "Orderbook";
11243
11357
 
11244
- // src/events/shared/display-outcome-venue.ts
11358
+ // src/events/shared/select-best-outcome.ts
11245
11359
  var normalizeOutcomeLabel3 = (label2) => {
11246
11360
  return typeof label2 === "string" ? label2.trim().toLowerCase() : "";
11247
11361
  };
11248
- var getDisplayOutcomeVenue = ({
11249
- outcomeId,
11250
- outcomeLabel,
11251
- selection,
11252
- bestMidpointVenue,
11253
- bestVenueByOutcomeId,
11254
- bestPriceVenuesByOutcomeId,
11255
- fallbackVenue
11256
- }) => {
11257
- var _a;
11258
- if (selection && outcomeId) {
11259
- const sideVenues = bestPriceVenuesByOutcomeId == null ? void 0 : bestPriceVenuesByOutcomeId.get(outcomeId);
11260
- if (selection === "buy" && (sideVenues == null ? void 0 : sideVenues.bestAskVenue)) return sideVenues.bestAskVenue;
11261
- if (selection === "sell" && (sideVenues == null ? void 0 : sideVenues.bestBidVenue)) return sideVenues.bestBidVenue;
11362
+ var selectBestOutcomeCandidate = (args) => {
11363
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
11364
+ const { outcomeId, selection } = args;
11365
+ if (!outcomeId) return void 0;
11366
+ const resolveVenueMarketId = (venue) => {
11367
+ var _a2, _b2;
11368
+ return venue ? (_b2 = (_a2 = args.venueMarketIdByVenue) == null ? void 0 : _a2.get(venue)) != null ? _b2 : void 0 : void 0;
11369
+ };
11370
+ const make = (price, venue, source, updatedAt) => ({
11371
+ price,
11372
+ venue: venue != null ? venue : void 0,
11373
+ venueMarketId: resolveVenueMarketId(venue != null ? venue : void 0),
11374
+ outcomeId,
11375
+ source,
11376
+ updatedAt: updatedAt != null ? updatedAt : void 0
11377
+ });
11378
+ if (selection === "buy" || selection === "sell") {
11379
+ const wsSidePrice = selection === "buy" ? (_a = args.live) == null ? void 0 : _a.bestAsk : (_b = args.live) == null ? void 0 : _b.bestBid;
11380
+ const wsSideVenue = selection === "buy" ? (_c = args.live) == null ? void 0 : _c.bestAskVenue : (_d = args.live) == null ? void 0 : _d.bestBidVenue;
11381
+ if (wsSidePrice != null) {
11382
+ return make(wsSidePrice, wsSideVenue, "ws", (_e = args.live) == null ? void 0 : _e.updatedAt);
11383
+ }
11384
+ const restSidePrice = selection === "buy" ? (_f = args.restBest) == null ? void 0 : _f.bestAsk : (_g = args.restBest) == null ? void 0 : _g.bestBid;
11385
+ const restSideVenue = selection === "buy" ? (_h = args.restBestVenues) == null ? void 0 : _h.bestAskVenue : (_i = args.restBestVenues) == null ? void 0 : _i.bestBidVenue;
11386
+ if (restSidePrice != null) {
11387
+ return make(restSidePrice, restSideVenue, "rest-best", void 0);
11388
+ }
11389
+ }
11390
+ if (((_j = args.live) == null ? void 0 : _j.midpoint) != null) {
11391
+ return make(args.live.midpoint, args.live.midpointVenue, "ws", args.live.updatedAt);
11262
11392
  }
11263
- if (normalizeOutcomeLabel3(outcomeLabel) === "yes" && bestMidpointVenue) {
11264
- return bestMidpointVenue;
11393
+ if (normalizeOutcomeLabel3(args.outcomeLabel) === "yes" && args.bestMidpoint != null && args.bestMidpointVenue) {
11394
+ return make(args.bestMidpoint, args.bestMidpointVenue, "rest-midpoint", void 0);
11265
11395
  }
11266
- const bestVenue = outcomeId ? bestVenueByOutcomeId == null ? void 0 : bestVenueByOutcomeId.get(outcomeId) : void 0;
11267
- return (_a = bestVenue != null ? bestVenue : fallbackVenue) != null ? _a : void 0;
11396
+ if (args.restMidpoint != null) {
11397
+ return make(args.restMidpoint, args.restMidpointVenue, "rest-midpoint", void 0);
11398
+ }
11399
+ if (args.staticPrice != null) {
11400
+ return make(args.staticPrice, args.staticVenue, "static", void 0);
11401
+ }
11402
+ return void 0;
11403
+ };
11404
+ var buildVenueMarketIdByVenue = (venueMarkets) => {
11405
+ var _a;
11406
+ const map = /* @__PURE__ */ new Map();
11407
+ if (!(venueMarkets == null ? void 0 : venueMarkets.length)) return map;
11408
+ const visit = (vm) => {
11409
+ if (vm.venue && vm.id && !map.has(vm.venue)) map.set(vm.venue, vm.id);
11410
+ };
11411
+ for (const vm of venueMarkets) {
11412
+ visit(vm);
11413
+ for (const sibling of (_a = vm.matchedVenueMarkets) != null ? _a : []) visit(sibling);
11414
+ }
11415
+ return map;
11268
11416
  };
11269
11417
 
11270
11418
  // src/events/shared/event-trading-state.utils.ts
11271
- var import_dayjs5 = __toESM(require("dayjs"));
11419
+ var import_dayjs6 = __toESM(require("dayjs"));
11272
11420
  var formatTradingStateDate = (value) => {
11273
- if (!(0, import_dayjs5.default)(value).isValid()) return value;
11274
- return (0, import_dayjs5.default)(value).format("MMM D, YYYY");
11421
+ if (!(0, import_dayjs6.default)(value).isValid()) return value;
11422
+ return (0, import_dayjs6.default)(value).format("MMM D, YYYY");
11275
11423
  };
11276
11424
  var resolveTradingStateTimestampLabel = (labels, state) => {
11277
11425
  if (state.kind === "resolved" && state.resolvesAt) {
@@ -11375,14 +11523,17 @@ var marketDetailsOutcomeButtonToneClasses = {
11375
11523
  };
11376
11524
  var getMarketDetailsOutcomeButtonClassNames = ({
11377
11525
  enableAnimations,
11526
+ enforceFixedWidth,
11378
11527
  isSelected,
11379
- tone
11528
+ tone,
11529
+ variant
11380
11530
  }) => {
11381
11531
  const toneClasses = marketDetailsOutcomeButtonToneClasses[tone];
11532
+ const widthClassName = variant === "line" ? "w-[200px]" : variant === "outcome" ? "w-[160px]" : "w-[140px]";
11382
11533
  return {
11383
11534
  root: cn(
11384
- "w-[140px]",
11385
- "flex h-9 shrink-0 cursor-pointer select-none items-center justify-center gap-2 rounded-agg-full border px-5 py-1.5 text-left shadow-none",
11535
+ enforceFixedWidth ? widthClassName : "w-[140px]",
11536
+ "flex h-9 shrink-0 cursor-pointer select-none items-center justify-center gap-2 rounded-agg-full border px-4 py-1.5 text-left shadow-none",
11386
11537
  "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-agg-primary focus-visible:ring-offset-0 focus-visible:ring-offset-agg-secondary",
11387
11538
  "disabled:cursor-not-allowed disabled:opacity-60",
11388
11539
  getMotionClassName(
@@ -11398,6 +11549,7 @@ var getMarketDetailsOutcomeButtonClassNames = ({
11398
11549
  var MarketDetailsOutcomeButton = ({
11399
11550
  ariaControls,
11400
11551
  enableAnimations,
11552
+ enforceFixedWidth,
11401
11553
  isSelected,
11402
11554
  item,
11403
11555
  onSelect
@@ -11405,10 +11557,14 @@ var MarketDetailsOutcomeButton = ({
11405
11557
  var _a;
11406
11558
  const classNames = getMarketDetailsOutcomeButtonClassNames({
11407
11559
  enableAnimations,
11560
+ enforceFixedWidth,
11408
11561
  isSelected,
11409
- tone: item.tone
11562
+ tone: item.tone,
11563
+ variant: item.variant
11410
11564
  });
11411
- return /* @__PURE__ */ (0, import_jsx_runtime128.jsxs)(
11565
+ const itemLabel = (_a = item.title) != null ? _a : item.label;
11566
+ const isLineVariant = item.variant === "line";
11567
+ return /* @__PURE__ */ (0, import_jsx_runtime128.jsx)(
11412
11568
  "button",
11413
11569
  {
11414
11570
  type: "button",
@@ -11418,181 +11574,517 @@ var MarketDetailsOutcomeButton = ({
11418
11574
  "aria-controls": ariaControls,
11419
11575
  "aria-selected": isSelected,
11420
11576
  tabIndex: isSelected ? 0 : -1,
11421
- className: cn(classNames.root, "flex-1 md:flex-auto", "gap-1!"),
11577
+ className: cn(
11578
+ classNames.root,
11579
+ "overflow-hidden",
11580
+ enforceFixedWidth ? "flex-none" : "flex-1 md:flex-auto"
11581
+ ),
11422
11582
  onClick: () => onSelect(item.label),
11423
- children: [
11583
+ children: isLineVariant ? /* @__PURE__ */ (0, import_jsx_runtime128.jsxs)("div", { className: "flex min-w-0 max-w-full items-center justify-center gap-1.5 overflow-hidden", children: [
11424
11584
  /* @__PURE__ */ (0, import_jsx_runtime128.jsx)(VenueLogo, { venue: item.venue, size: "small" }),
11425
- /* @__PURE__ */ (0, import_jsx_runtime128.jsxs)("div", { className: "flex flex-row items-center gap-1 min-w-0", children: [
11426
- /* @__PURE__ */ (0, import_jsx_runtime128.jsx)(
11427
- Typography,
11428
- {
11429
- as: "span",
11430
- variant: isSelected ? "body-strong" : "body",
11431
- className: cn("whitespace-nowrap truncate", classNames.text),
11432
- children: (_a = item.title) != null ? _a : item.label
11433
- }
11434
- ),
11435
- /* @__PURE__ */ (0, import_jsx_runtime128.jsx)(
11436
- Typography,
11437
- {
11438
- as: "span",
11439
- variant: isSelected ? "body-strong" : "body",
11440
- className: cn(classNames.text),
11441
- children: formatProbabilityCents(item.probability)
11442
- }
11443
- )
11444
- ] })
11445
- ]
11585
+ /* @__PURE__ */ (0, import_jsx_runtime128.jsx)(
11586
+ Typography,
11587
+ {
11588
+ as: "span",
11589
+ variant: isSelected ? "body-strong" : "body",
11590
+ className: cn("min-w-0 truncate whitespace-nowrap text-center", classNames.text),
11591
+ children: itemLabel
11592
+ }
11593
+ ),
11594
+ item.lineLabel ? /* @__PURE__ */ (0, import_jsx_runtime128.jsx)(
11595
+ Typography,
11596
+ {
11597
+ as: "span",
11598
+ variant: isSelected ? "body-strong" : "body",
11599
+ className: cn("shrink-0 whitespace-nowrap", classNames.text),
11600
+ children: item.lineLabel
11601
+ }
11602
+ ) : null,
11603
+ /* @__PURE__ */ (0, import_jsx_runtime128.jsx)(
11604
+ Typography,
11605
+ {
11606
+ as: "span",
11607
+ variant: isSelected ? "body-strong" : "body",
11608
+ className: cn("shrink-0 whitespace-nowrap", classNames.text),
11609
+ children: formatProbabilityCents(item.probability)
11610
+ }
11611
+ )
11612
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime128.jsxs)("div", { className: "inline-flex max-w-full items-center justify-center gap-1.5", children: [
11613
+ /* @__PURE__ */ (0, import_jsx_runtime128.jsx)(VenueLogo, { venue: item.venue, size: "small" }),
11614
+ /* @__PURE__ */ (0, import_jsx_runtime128.jsx)(
11615
+ Typography,
11616
+ {
11617
+ as: "span",
11618
+ variant: isSelected ? "body-strong" : "body",
11619
+ className: cn("truncate whitespace-nowrap text-center", classNames.text),
11620
+ children: itemLabel
11621
+ }
11622
+ ),
11623
+ /* @__PURE__ */ (0, import_jsx_runtime128.jsx)(
11624
+ Typography,
11625
+ {
11626
+ as: "span",
11627
+ variant: isSelected ? "body-strong" : "body",
11628
+ className: cn("shrink-0 whitespace-nowrap", classNames.text),
11629
+ children: formatProbabilityCents(item.probability)
11630
+ }
11631
+ )
11632
+ ] })
11446
11633
  }
11447
11634
  );
11448
11635
  };
11449
11636
  MarketDetailsOutcomeButton.displayName = "MarketDetailsOutcomeButton";
11450
11637
 
11451
- // src/events/market-details/index.tsx
11638
+ // src/events/market-details/market-details-graph-panel.tsx
11639
+ var import_hooks42 = require("@agg-build/hooks");
11640
+ var import_react19 = require("react");
11452
11641
  var import_jsx_runtime129 = require("react/jsx-runtime");
11453
- var MarketDetailsUnavailableState = ({
11454
- ariaLabel,
11455
- classNames
11456
- }) => {
11457
- const labels = (0, import_hooks42.useLabels)();
11458
- return /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
11459
- Card,
11460
- {
11461
- className: cn(
11462
- "group/agg-market-card agg-market-card-unavailable",
11463
- marketDetailsBaseCardClassName,
11464
- classNames == null ? void 0 : classNames.root
11465
- ),
11466
- role: "status",
11467
- "aria-label": ariaLabel != null ? ariaLabel : labels.marketDetails.unavailableAria,
11468
- children: /* @__PURE__ */ (0, import_jsx_runtime129.jsxs)("div", { className: "flex flex-col gap-1 p-5", children: [
11469
- /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(Typography, { variant: "body-large-strong", children: labels.marketDetails.unavailableTitle }),
11470
- /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(Typography, { variant: "label", className: "text-agg-muted-foreground", children: labels.marketDetails.unavailableDescription })
11471
- ] })
11472
- }
11473
- );
11474
- };
11475
- var MarketDetailsNotFoundState = ({
11476
- ariaLabel: _ariaLabel,
11477
- classNames: _classNames
11478
- }) => {
11479
- const labels = (0, import_hooks42.useLabels)();
11480
- return /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
11481
- StateMessage,
11482
- {
11483
- title: labels.marketDetails.notFoundTitle,
11484
- description: labels.marketDetails.notFoundDescription,
11485
- icon: /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(SearchEmptyIcon, {}),
11486
- classNames: { root: "min-h-[280px] md:min-h-[320px]" }
11487
- }
11488
- );
11489
- };
11490
- var MarketDetailsContent = ({
11642
+ var MarketDetailsGraphPanel = ({
11491
11643
  venueMarkets,
11492
- marketId,
11493
- title: title2,
11494
- image,
11495
- isOpened: controlledIsOpened = marketDetailsDefaultIsOpened,
11496
- onOpenChange,
11497
- defaultTab,
11498
- defaultOutcomeLabel,
11499
- orderBookDepth = orderBookRowLimitDefault,
11500
- ariaLabel,
11501
- classNames,
11502
- otherContent,
11503
- onOutcomeSelect,
11644
+ selectedOutcomeLabel,
11645
+ selectedOutcomeId,
11646
+ livePrices,
11647
+ wsLivePrices,
11648
+ headerOutcomeItems,
11649
+ isResolvedMarket,
11650
+ isOutcomeSelectionLocked,
11651
+ volume,
11504
11652
  live,
11505
- midpointsFallback,
11506
- midpointsFallbackVenues,
11507
- suppressOutcomeFallbackSelection,
11508
- midpointsResult
11653
+ classNames
11509
11654
  }) => {
11510
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
11655
+ var _a, _b, _c;
11511
11656
  const config = (0, import_hooks42.useSdkUiConfig)();
11512
11657
  const {
11513
- features: { enableAnimations },
11514
- formatting: { formatPercent },
11658
+ formatting: { formatPercent, formatCompactCurrency },
11515
11659
  general: { theme }
11516
11660
  } = config;
11517
11661
  const isDarkTheme = theme === "dark";
11518
11662
  const labels = (0, import_hooks42.useLabels)();
11519
- const tradingContext = (0, import_hooks42.useEventTradingContext)();
11520
- const detailsContentId = (0, import_react19.useId)();
11521
- const tradeSide = (_a = tradingContext == null ? void 0 : tradingContext.tradeSide) != null ? _a : "buy";
11522
- const wsLivePrices = (0, import_hooks42.useLiveOutcomePrices)(venueMarkets);
11523
- const wsBestPrices = (0, import_hooks42.useLiveBestPrices)(venueMarkets);
11524
- const resolvedMarket = (0, import_react19.useMemo)(() => {
11525
- return resolveMarketFromVenueMarkets(venueMarkets, marketId);
11526
- }, [venueMarkets, marketId]);
11527
- const scopedResolvedMarket = (0, import_react19.useMemo)(() => {
11528
- var _a2, _b2;
11529
- if (!resolvedMarket) return null;
11530
- return (_b2 = (_a2 = resolvedMarket.venueMarkets.find((venueMarket) => venueMarket.id === resolvedMarket.id)) != null ? _a2 : resolvedMarket.venueMarkets[0]) != null ? _b2 : null;
11531
- }, [resolvedMarket]);
11532
- const isResolvedMarket = (0, import_hooks42.resolveMarketTradingState)(scopedResolvedMarket).kind === "resolved";
11533
- const clusterMidpointResult = midpointsResult != null ? midpointsResult : {
11534
- prices: /* @__PURE__ */ new Map(),
11535
- bestMidpointsByOutcomeId: /* @__PURE__ */ new Map(),
11536
- venueByOutcomeId: /* @__PURE__ */ new Map(),
11537
- bestPrices: /* @__PURE__ */ new Map(),
11538
- bestPriceVenuesByOutcomeId: /* @__PURE__ */ new Map(),
11539
- isLoading: false,
11540
- bestMidpoint: void 0,
11541
- bestMidpointVenue: void 0
11542
- };
11543
- const clusterMidpoints = (_b = clusterMidpointResult.bestMidpointsByOutcomeId) != null ? _b : clusterMidpointResult.prices;
11544
- const clusterBestMidpointsByOutcomeId = clusterMidpoints;
11545
- const clusterVenueByOutcomeId = clusterMidpointResult.venueByOutcomeId;
11546
- const clusterBestMidpoint = clusterMidpointResult.bestMidpoint;
11547
- const clusterBestMidpointVenue = clusterMidpointResult.bestMidpointVenue;
11548
- const clusterBestPricesRest = clusterMidpointResult.bestPrices;
11549
- const clusterBestPrices = (0, import_react19.useMemo)(
11550
- () => (0, import_hooks42.mergeBestPricesPreferringLive)(clusterBestPricesRest, wsBestPrices),
11551
- [clusterBestPricesRest, wsBestPrices]
11552
- );
11553
- const clusterBestPriceVenuesByOutcomeId = clusterMidpointResult.bestPriceVenuesByOutcomeId;
11554
- const clusterMidpointMarkets = (0, import_react19.useMemo)(() => {
11555
- var _a2;
11556
- if (!resolvedMarket) return [];
11557
- return (_a2 = resolvedMarket.venueMarkets) != null ? _a2 : [];
11558
- }, [resolvedMarket]);
11559
- const tradableVenues = (0, import_react19.useMemo)(() => {
11560
- var _a2;
11561
- if (clusterMidpointMarkets.length === 0) return null;
11562
- if (clusterMidpoints.size === 0) return null;
11563
- const set = /* @__PURE__ */ new Set();
11564
- for (const market of clusterMidpointMarkets) {
11565
- for (const outcome of (_a2 = market.venueMarketOutcomes) != null ? _a2 : []) {
11566
- if (clusterMidpoints.has(outcome.id)) {
11567
- set.add(market.venue);
11568
- break;
11569
- }
11570
- }
11571
- }
11572
- return set;
11573
- }, [clusterMidpointMarkets, clusterMidpoints]);
11574
- const model = (0, import_react19.useMemo)(() => {
11575
- return buildMarketDetailsModel({
11576
- venueMarkets,
11577
- marketId,
11578
- title: title2,
11579
- image,
11580
- formatCompactCurrency: config.formatting.formatCompactCurrency,
11581
- labels,
11582
- tradableVenues
11663
+ const selectedTimeRange = config.chart.selectedChartTimeRange;
11664
+ const setSelectedTimeRange = config.chart.setSelectedChartTimeRange;
11665
+ const [chartRangeOverride, setChartRangeOverride] = (0, import_react19.useState)(null);
11666
+ const effectiveChartTimeRange = isResolvedMarket ? "ALL" : chartRangeOverride != null ? chartRangeOverride : selectedTimeRange;
11667
+ const [selectedChartType, setSelectedChartType] = (0, import_react19.useState)("line");
11668
+ const [selectedGraphVenue, setSelectedGraphVenue] = (0, import_react19.useState)(null);
11669
+ const [chartOutcomeLabel, setChartOutcomeLabel] = (0, import_react19.useState)(selectedOutcomeLabel);
11670
+ const resolvedChartOutcomeLabel = chartOutcomeLabel != null ? chartOutcomeLabel : selectedOutcomeLabel;
11671
+ const chartSelectedOutcomeId = selectedOutcomeId && resolvedChartOutcomeLabel === selectedOutcomeLabel ? selectedOutcomeId : null;
11672
+ const chartOutcomesByVenue = (0, import_react19.useMemo)(() => {
11673
+ return resolveChartVenueOutcomes({
11674
+ eligibleVenueOutcomes: collectEligibleVenueOutcomes({
11675
+ venueMarkets,
11676
+ selectedOutcomeLabel: resolvedChartOutcomeLabel,
11677
+ selectedOutcomeId: chartSelectedOutcomeId
11678
+ }),
11679
+ livePrices
11583
11680
  });
11584
- }, [
11585
- config.formatting.formatCompactCurrency,
11586
- venueMarkets,
11587
- image,
11588
- labels,
11589
- marketId,
11590
- title2,
11591
- tradableVenues
11592
- ]);
11593
- const livePrices = (0, import_react19.useMemo)(() => {
11594
- const merged = /* @__PURE__ */ new Map();
11595
- if (midpointsFallback == null ? void 0 : midpointsFallback.size) {
11681
+ }, [livePrices, venueMarkets, resolvedChartOutcomeLabel, chartSelectedOutcomeId]);
11682
+ const rollingWindow = (0, import_hooks42.useRollingChartWindow)({ range: effectiveChartTimeRange });
11683
+ const chartPrimaryOutcomeId = (_b = (_a = chartOutcomesByVenue[0]) == null ? void 0 : _a.outcome.id) != null ? _b : null;
11684
+ const chartVenueOutcomeIds = (0, import_react19.useMemo)(() => {
11685
+ return chartOutcomesByVenue.map((item) => item.outcome.id);
11686
+ }, [chartOutcomesByVenue]);
11687
+ const {
11688
+ data: marketChartData,
11689
+ isLoading: isMarketChartLoading,
11690
+ error: marketChartError,
11691
+ refetch: refetchMarketChart
11692
+ } = (0, import_hooks42.useMarketChart)({
11693
+ marketId: chartPrimaryOutcomeId,
11694
+ venueMarketIds: chartVenueOutcomeIds,
11695
+ interval: rollingWindow.interval,
11696
+ startTs: rollingWindow.startTs * 1e3,
11697
+ endTs: rollingWindow.endTs * 1e3,
11698
+ // The panel only mounts when the chart is actually visible, so enable as
11699
+ // soon as we have an outcome to chart.
11700
+ enabled: !!chartPrimaryOutcomeId,
11701
+ live,
11702
+ refetchIntervalMs: rollingWindow.refetchIntervalMs,
11703
+ // Stable cache key per user-selected range so tab/page revisits hit cache
11704
+ // instead of refetching on every bucket-boundary rollover.
11705
+ rangeKey: rollingWindow.range
11706
+ });
11707
+ const hasAutoFallenBackRangeRef = (0, import_react19.useRef)(false);
11708
+ (0, import_react19.useEffect)(() => {
11709
+ hasAutoFallenBackRangeRef.current = false;
11710
+ setChartRangeOverride(null);
11711
+ }, [chartPrimaryOutcomeId]);
11712
+ (0, import_react19.useEffect)(() => {
11713
+ if (!shouldAutoFallbackToAllRange({
11714
+ chartData: marketChartData,
11715
+ isLoading: isMarketChartLoading,
11716
+ error: marketChartError,
11717
+ currentRange: effectiveChartTimeRange,
11718
+ hasAlreadyFallenBack: hasAutoFallenBackRangeRef.current,
11719
+ domainStartTs: rollingWindow.startTs
11720
+ })) {
11721
+ return;
11722
+ }
11723
+ hasAutoFallenBackRangeRef.current = true;
11724
+ setChartRangeOverride("ALL");
11725
+ }, [
11726
+ marketChartData,
11727
+ isMarketChartLoading,
11728
+ marketChartError,
11729
+ effectiveChartTimeRange,
11730
+ rollingWindow.startTs
11731
+ ]);
11732
+ const chartAvailableOutcomesByVenue = (0, import_react19.useMemo)(() => {
11733
+ return filterChartVenueOutcomesByRenderableVenues({
11734
+ chartData: marketChartData,
11735
+ venueOutcomes: chartOutcomesByVenue
11736
+ });
11737
+ }, [chartOutcomesByVenue, marketChartData]);
11738
+ const graphSeries = (0, import_react19.useMemo)(() => {
11739
+ var _a2, _b2, _c2, _d;
11740
+ const baseColor = resolveSeriesColor(
11741
+ (_d = (_c2 = selectedGraphVenue != null ? selectedGraphVenue : (_a2 = chartAvailableOutcomesByVenue[0]) == null ? void 0 : _a2.venue) != null ? _c2 : (_b2 = chartOutcomesByVenue[0]) == null ? void 0 : _b2.venue) != null ? _d : "polymarket",
11742
+ 0,
11743
+ isDarkTheme
11744
+ );
11745
+ const domainStartTs = rollingWindow.startTs;
11746
+ return resolveMarketChartDisplaySeries({
11747
+ chartData: marketChartData,
11748
+ selectedVenue: selectedGraphVenue,
11749
+ transformProbability: (value) => value
11750
+ }).map((seriesItem) => {
11751
+ return {
11752
+ id: `${resolvedChartOutcomeLabel != null ? resolvedChartOutcomeLabel : "graph"}-${seriesItem.venue}-${chartPrimaryOutcomeId != null ? chartPrimaryOutcomeId : "chart"}`,
11753
+ venue: selectedGraphVenue != null ? selectedGraphVenue : seriesItem.venue,
11754
+ color: seriesItem.venue === "aggregate" ? baseColor : resolveSeriesColor(seriesItem.venue, 0, isDarkTheme),
11755
+ // Constrain to the rolling [nowSec - rangeSeconds, …] domain so stale
11756
+ // bars don't bleed in across a range shrink or long mount.
11757
+ points: seriesItem.points.filter((point) => point.time >= domainStartTs)
11758
+ };
11759
+ });
11760
+ }, [
11761
+ isDarkTheme,
11762
+ chartPrimaryOutcomeId,
11763
+ marketChartData,
11764
+ rollingWindow.startTs,
11765
+ selectedGraphVenue,
11766
+ resolvedChartOutcomeLabel,
11767
+ chartAvailableOutcomesByVenue,
11768
+ chartOutcomesByVenue
11769
+ ]);
11770
+ const graphLiveState = (0, import_react19.useMemo)(() => {
11771
+ return resolveMarketChartLiveState({
11772
+ chartData: marketChartData,
11773
+ selectedVenue: selectedGraphVenue,
11774
+ transformProbability: (value) => value
11775
+ });
11776
+ }, [marketChartData, selectedGraphVenue]);
11777
+ const hasChartError = !!marketChartError;
11778
+ (0, import_react19.useEffect)(() => {
11779
+ if (!selectedGraphVenue) {
11780
+ return;
11781
+ }
11782
+ if (chartAvailableOutcomesByVenue.some((item) => item.venue === selectedGraphVenue)) {
11783
+ return;
11784
+ }
11785
+ setSelectedGraphVenue(null);
11786
+ }, [selectedGraphVenue, chartAvailableOutcomesByVenue]);
11787
+ const handleGraphVenueToggle = (venue) => {
11788
+ setSelectedGraphVenue((currentVenue) => {
11789
+ if (currentVenue === venue) return null;
11790
+ return venue;
11791
+ });
11792
+ };
11793
+ const handleRetryMarketChart = () => {
11794
+ void refetchMarketChart();
11795
+ };
11796
+ return /* @__PURE__ */ (0, import_jsx_runtime129.jsxs)("div", { className: cn("agg-price-chart flex flex-col gap-5 p-5", classNames == null ? void 0 : classNames.graph), children: [
11797
+ hasChartError ? /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
11798
+ StateMessage,
11799
+ {
11800
+ title: labels.marketDetails.chartUnavailableTitle,
11801
+ description: labels.marketDetails.chartUnavailableDescription,
11802
+ icon: /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(WarningIcon, {}),
11803
+ onAction: handleRetryMarketChart,
11804
+ classNames: { root: "min-h-[248px] px-5 py-10 md:min-h-[272px]" }
11805
+ }
11806
+ ) : /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
11807
+ LineChart,
11808
+ {
11809
+ series: graphSeries,
11810
+ height: 260,
11811
+ isLoading: isMarketChartLoading,
11812
+ chartType: selectedChartType,
11813
+ liveCandle: selectedChartType === "candlestick" ? (_c = graphLiveState.liveCandle) != null ? _c : void 0 : void 0,
11814
+ lineValue: graphLiveState.lineValue,
11815
+ classNames: { root: "agg-chart-region w-full" },
11816
+ showSeriesControls: chartAvailableOutcomesByVenue.length > 0 || headerOutcomeItems.length > 0,
11817
+ renderSeriesControls: () => {
11818
+ var _a2, _b2, _c2, _d;
11819
+ return /* @__PURE__ */ (0, import_jsx_runtime129.jsxs)("div", { className: "agg-chart-toolbar w-full flex flex-col gap-4 md:flex-row md:items-center md:justify-between", children: [
11820
+ /* @__PURE__ */ (0, import_jsx_runtime129.jsx)("div", { className: "agg-market-venues flex flex-wrap gap-2", children: chartAvailableOutcomesByVenue.map((item) => {
11821
+ var _a3;
11822
+ const probability = formatProbabilityPercent(
11823
+ (_a3 = wsLivePrices.get(item.outcome.id)) != null ? _a3 : item.outcome.price,
11824
+ formatPercent
11825
+ );
11826
+ const isActiveVenue = selectedGraphVenue === item.venue;
11827
+ return /* @__PURE__ */ (0, import_jsx_runtime129.jsxs)(
11828
+ "button",
11829
+ {
11830
+ type: "button",
11831
+ "aria-label": `${item.venue} ${probability}`,
11832
+ "aria-pressed": isActiveVenue,
11833
+ className: cn(
11834
+ "agg-market-venue",
11835
+ "cursor-pointer",
11836
+ "inline-flex items-center gap-2 rounded-agg-full border px-4 py-2",
11837
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-agg-primary focus-visible:ring-offset-0 focus-visible:ring-offset-agg-secondary-hover",
11838
+ isActiveVenue ? "border-agg-primary bg-agg-secondary" : "border-transparent bg-agg-secondary-hover"
11839
+ ),
11840
+ onClick: (e) => {
11841
+ e.preventDefault();
11842
+ e.stopPropagation();
11843
+ handleGraphVenueToggle(item.venue);
11844
+ },
11845
+ children: [
11846
+ /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(VenueLogo, { venue: item.venue, size: "small" }),
11847
+ /* @__PURE__ */ (0, import_jsx_runtime129.jsx)("span", { className: "text-agg-base leading-agg-6 text-agg-foreground", children: probability })
11848
+ ]
11849
+ },
11850
+ `${item.market.id}-${item.outcome.id}`
11851
+ );
11852
+ }) }),
11853
+ !isOutcomeSelectionLocked ? /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
11854
+ SwitchButton,
11855
+ {
11856
+ ariaLabel: labels.marketDetails.outcomeSelectorAria,
11857
+ className: "agg-outcome-switch w-full shrink-0 md:w-fit",
11858
+ value: (_d = (_c2 = (_a2 = headerOutcomeItems.find(
11859
+ (outcome) => outcome.label === resolvedChartOutcomeLabel
11860
+ )) == null ? void 0 : _a2.id) != null ? _c2 : (_b2 = headerOutcomeItems[0]) == null ? void 0 : _b2.id) != null ? _d : "",
11861
+ onValueChange: (outcomeId) => {
11862
+ const outcome = headerOutcomeItems.find(
11863
+ (headerOutcomeItem) => headerOutcomeItem.id === outcomeId
11864
+ );
11865
+ if (!outcome) return;
11866
+ setChartOutcomeLabel(outcome.label);
11867
+ },
11868
+ options: headerOutcomeItems.map((outcome) => {
11869
+ var _a3, _b3;
11870
+ const price = outcome.probability;
11871
+ return {
11872
+ value: outcome.id,
11873
+ label: `${(_a3 = outcome == null ? void 0 : outcome.title) != null ? _a3 : outcome.label} ${formatProbabilityCents(price)}`,
11874
+ ariaLabel: `${(_b3 = outcome == null ? void 0 : outcome.title) != null ? _b3 : outcome.label} ${formatProbabilityCents(price)}`
11875
+ };
11876
+ })
11877
+ }
11878
+ ) : null
11879
+ ] });
11880
+ }
11881
+ }
11882
+ ),
11883
+ /* @__PURE__ */ (0, import_jsx_runtime129.jsxs)(
11884
+ "div",
11885
+ {
11886
+ className: cn(
11887
+ "agg-chart-footer",
11888
+ "flex flex-row justify-between gap-2 text-agg-sm leading-agg-5 text-agg-muted-foreground md:flex-row md:items-center md:justify-between",
11889
+ classNames == null ? void 0 : classNames.footer
11890
+ ),
11891
+ children: [
11892
+ /* @__PURE__ */ (0, import_jsx_runtime129.jsx)("span", { children: typeof volume !== "number" ? labels.marketDetails.volumeUnavailable : volume > 0 ? `${formatCompactCurrency(volume)} ${labels.marketDetails.meta.volumeSuffix}` : "" }),
11893
+ /* @__PURE__ */ (0, import_jsx_runtime129.jsxs)("div", { className: "flex flex-wrap items-center gap-3 md:gap-4", children: [
11894
+ /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
11895
+ ChartTypeSwitch,
11896
+ {
11897
+ className: "agg-chart-type-switch shrink-0",
11898
+ value: selectedChartType,
11899
+ onValueChange: setSelectedChartType
11900
+ }
11901
+ ),
11902
+ /* @__PURE__ */ (0, import_jsx_runtime129.jsx)("span", { "aria-hidden": "true", className: "hidden h-4 w-px bg-agg-separator md:block" }),
11903
+ import_hooks42.CHART_TIME_RANGES.map((timeRange) => {
11904
+ const isActive = effectiveChartTimeRange === timeRange;
11905
+ const isDisabled = isResolvedMarket && timeRange !== "ALL";
11906
+ return /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
11907
+ "button",
11908
+ {
11909
+ type: "button",
11910
+ disabled: isDisabled,
11911
+ className: cn(
11912
+ "agg-chart-time-range-trigger",
11913
+ "cursor-pointer text-agg-sm leading-agg-5",
11914
+ isDisabled && "cursor-not-allowed opacity-50",
11915
+ isActive ? "font-agg-bold text-agg-foreground" : "font-agg-normal text-agg-muted-foreground"
11916
+ ),
11917
+ "aria-pressed": isActive,
11918
+ "aria-disabled": isDisabled,
11919
+ onClick: (e) => {
11920
+ e.preventDefault();
11921
+ e.stopPropagation();
11922
+ if (isDisabled) return;
11923
+ setChartRangeOverride(null);
11924
+ setSelectedTimeRange(timeRange);
11925
+ },
11926
+ children: timeRange === "ALL" ? labels.eventItemDetails.allTimeRange : timeRange
11927
+ },
11928
+ timeRange
11929
+ );
11930
+ })
11931
+ ] })
11932
+ ]
11933
+ }
11934
+ )
11935
+ ] });
11936
+ };
11937
+ MarketDetailsGraphPanel.displayName = "MarketDetailsGraphPanel";
11938
+
11939
+ // src/events/market-details/index.tsx
11940
+ var import_jsx_runtime130 = require("react/jsx-runtime");
11941
+ var MarketDetailsUnavailableState = ({
11942
+ marketId,
11943
+ ariaLabel,
11944
+ classNames
11945
+ }) => {
11946
+ const labels = (0, import_hooks43.useLabels)();
11947
+ return /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(
11948
+ Card,
11949
+ {
11950
+ "data-market-id": marketId || void 0,
11951
+ className: cn(
11952
+ "group/agg-market-card agg-market-card-unavailable",
11953
+ marketDetailsBaseCardClassName,
11954
+ classNames == null ? void 0 : classNames.root
11955
+ ),
11956
+ role: "status",
11957
+ "aria-label": ariaLabel != null ? ariaLabel : labels.marketDetails.unavailableAria,
11958
+ children: /* @__PURE__ */ (0, import_jsx_runtime130.jsxs)("div", { className: "flex flex-col gap-1 p-5", children: [
11959
+ /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(Typography, { variant: "body-large-strong", children: labels.marketDetails.unavailableTitle }),
11960
+ /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(Typography, { variant: "label", className: "text-agg-muted-foreground", children: labels.marketDetails.unavailableDescription })
11961
+ ] })
11962
+ }
11963
+ );
11964
+ };
11965
+ var MarketDetailsNotFoundState = ({
11966
+ marketId,
11967
+ ariaLabel: _ariaLabel,
11968
+ classNames: _classNames
11969
+ }) => {
11970
+ const labels = (0, import_hooks43.useLabels)();
11971
+ return /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(
11972
+ StateMessage,
11973
+ {
11974
+ "data-market-id": marketId || void 0,
11975
+ title: labels.marketDetails.notFoundTitle,
11976
+ description: labels.marketDetails.notFoundDescription,
11977
+ icon: /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(SearchEmptyIcon, {}),
11978
+ classNames: { root: "min-h-[280px] md:min-h-[320px]" }
11979
+ }
11980
+ );
11981
+ };
11982
+ var MarketDetailsContent = ({
11983
+ venueMarkets,
11984
+ marketId,
11985
+ title: title2,
11986
+ image,
11987
+ isOpened: controlledIsOpened = marketDetailsDefaultIsOpened,
11988
+ onOpenChange,
11989
+ defaultTab,
11990
+ defaultOutcomeLabel,
11991
+ orderBookDepth = orderBookRowLimitDefault,
11992
+ ariaLabel,
11993
+ classNames,
11994
+ otherContent,
11995
+ headerAccessory,
11996
+ compactHeader = false,
11997
+ subtitleOverride,
11998
+ headerOutcomeVariant,
11999
+ headerOutcomeItemsOverride,
12000
+ onOutcomeSelect,
12001
+ live,
12002
+ midpointsFallback,
12003
+ midpointsFallbackVenues,
12004
+ suppressOutcomeFallbackSelection,
12005
+ midpointsResult
12006
+ }) => {
12007
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i;
12008
+ const config = (0, import_hooks43.useSdkUiConfig)();
12009
+ const {
12010
+ features: { enableAnimations },
12011
+ formatting: { formatPercent }
12012
+ } = config;
12013
+ const labels = (0, import_hooks43.useLabels)();
12014
+ const tradingContext = (0, import_hooks43.useEventTradingContext)();
12015
+ const detailsContentId = (0, import_react20.useId)();
12016
+ const tradeSide = (_a = tradingContext == null ? void 0 : tradingContext.tradeSide) != null ? _a : "buy";
12017
+ const resolvedMarket = (0, import_react20.useMemo)(() => {
12018
+ return resolveMarketFromVenueMarkets(venueMarkets, marketId);
12019
+ }, [venueMarkets, marketId]);
12020
+ const clusterVenueMarkets = resolvedMarket == null ? void 0 : resolvedMarket.venueMarkets;
12021
+ const wsLivePrices = (0, import_hooks43.useLiveOutcomePrices)(clusterVenueMarkets);
12022
+ const wsBestPrices = (0, import_hooks43.useLiveBestPrices)(clusterVenueMarkets);
12023
+ const wsBestCandidates = (0, import_hooks43.useLiveBestPriceCandidates)(clusterVenueMarkets);
12024
+ const scopedResolvedMarket = (0, import_react20.useMemo)(() => {
12025
+ var _a2, _b2;
12026
+ if (!resolvedMarket) return null;
12027
+ return (_b2 = (_a2 = resolvedMarket.venueMarkets.find((venueMarket) => venueMarket.id === resolvedMarket.id)) != null ? _a2 : resolvedMarket.venueMarkets[0]) != null ? _b2 : null;
12028
+ }, [resolvedMarket]);
12029
+ const isResolvedMarket = (0, import_hooks43.resolveMarketTradingState)(scopedResolvedMarket).kind === "resolved";
12030
+ (0, import_hooks43.useEventOrderbookData)(
12031
+ isResolvedMarket ? [] : resolvedMarket == null ? void 0 : resolvedMarket.venueMarkets,
12032
+ (_b = scopedResolvedMarket == null ? void 0 : scopedResolvedMarket.id) != null ? _b : null
12033
+ );
12034
+ const clusterMidpointResult = midpointsResult != null ? midpointsResult : {
12035
+ prices: /* @__PURE__ */ new Map(),
12036
+ bestMidpointsByOutcomeId: /* @__PURE__ */ new Map(),
12037
+ venueByOutcomeId: /* @__PURE__ */ new Map(),
12038
+ bestPrices: /* @__PURE__ */ new Map(),
12039
+ bestPriceVenuesByOutcomeId: /* @__PURE__ */ new Map(),
12040
+ isLoading: false,
12041
+ bestMidpoint: void 0,
12042
+ bestMidpointVenue: void 0
12043
+ };
12044
+ const clusterMidpoints = (_c = clusterMidpointResult.bestMidpointsByOutcomeId) != null ? _c : clusterMidpointResult.prices;
12045
+ const clusterBestMidpointsByOutcomeId = clusterMidpoints;
12046
+ const clusterVenueByOutcomeId = clusterMidpointResult.venueByOutcomeId;
12047
+ const clusterBestMidpoint = clusterMidpointResult.bestMidpoint;
12048
+ const clusterBestMidpointVenue = clusterMidpointResult.bestMidpointVenue;
12049
+ const clusterBestPricesRest = clusterMidpointResult.bestPrices;
12050
+ const clusterBestPrices = (0, import_react20.useMemo)(
12051
+ () => (0, import_hooks43.mergeBestPricesPreferringLive)(clusterBestPricesRest, wsBestPrices),
12052
+ [clusterBestPricesRest, wsBestPrices]
12053
+ );
12054
+ const clusterBestPriceVenuesByOutcomeId = clusterMidpointResult.bestPriceVenuesByOutcomeId;
12055
+ const clusterMidpointMarkets = (0, import_react20.useMemo)(() => {
12056
+ var _a2;
12057
+ if (!resolvedMarket) return [];
12058
+ return (_a2 = resolvedMarket.venueMarkets) != null ? _a2 : [];
12059
+ }, [resolvedMarket]);
12060
+ const tradableVenues = (0, import_react20.useMemo)(() => {
12061
+ var _a2;
12062
+ if (clusterMidpointMarkets.length === 0) return null;
12063
+ const set = /* @__PURE__ */ new Set();
12064
+ for (const market of clusterMidpointMarkets) {
12065
+ for (const outcome of (_a2 = market.venueMarketOutcomes) != null ? _a2 : []) {
12066
+ if (clusterMidpoints.has(outcome.id)) {
12067
+ set.add(market.venue);
12068
+ break;
12069
+ }
12070
+ }
12071
+ }
12072
+ if (set.size === 0) return null;
12073
+ return set;
12074
+ }, [clusterMidpointMarkets, clusterMidpoints]);
12075
+ const model = (0, import_react20.useMemo)(() => {
12076
+ return buildMarketDetailsModel({
12077
+ venueMarkets,
12078
+ marketId,
12079
+ title: title2,
12080
+ image,
12081
+ formatCompactCurrency: config.formatting.formatCompactCurrency,
12082
+ labels
12083
+ });
12084
+ }, [config.formatting.formatCompactCurrency, venueMarkets, image, labels, marketId, title2]);
12085
+ const livePrices = (0, import_react20.useMemo)(() => {
12086
+ const merged = /* @__PURE__ */ new Map();
12087
+ if (midpointsFallback == null ? void 0 : midpointsFallback.size) {
11596
12088
  for (const [outcomeId, price] of midpointsFallback) {
11597
12089
  merged.set(outcomeId, price);
11598
12090
  }
@@ -11605,37 +12097,32 @@ var MarketDetailsContent = ({
11605
12097
  for (const [k, v] of wsLivePrices) merged.set(k, v);
11606
12098
  return merged;
11607
12099
  }, [clusterMidpoints, midpointsFallback, wsLivePrices]);
11608
- const scopedMarketForCard = (0, import_react19.useMemo)(() => {
12100
+ const scopedMarketForCard = (0, import_react20.useMemo)(() => {
11609
12101
  var _a2;
11610
12102
  if (!model) return null;
11611
12103
  return (_a2 = model.market.venueMarkets.find((venueMarket) => venueMarket.id === model.market.id)) != null ? _a2 : model.primaryVenueMarket;
11612
12104
  }, [model]);
11613
- const marketTradingState = (0, import_react19.useMemo)(() => {
11614
- return (0, import_hooks42.resolveMarketTradingState)(scopedMarketForCard);
12105
+ const marketTradingState = (0, import_react20.useMemo)(() => {
12106
+ return (0, import_hooks43.resolveMarketTradingState)(scopedMarketForCard);
11615
12107
  }, [scopedMarketForCard]);
11616
12108
  const isOutcomeSelectionLocked = marketTradingState.isTradingDisabled;
11617
12109
  const isUpcomingMarket = marketTradingState.kind === "unopened";
11618
12110
  const marketStatePresentation = resolveTradingStatePresentation(labels, marketTradingState);
11619
- const marketDetailsTabs = (0, import_react19.useMemo)(() => {
12111
+ const marketDetailsTabs = (0, import_react20.useMemo)(() => {
11620
12112
  return getMarketDetailsTabs(labels);
11621
12113
  }, [labels]);
11622
- const [selectedTab, setSelectedTab] = (0, import_react19.useState)(
12114
+ const [selectedTab, setSelectedTab] = (0, import_react20.useState)(
11623
12115
  () => resolveInitialTab(defaultTab)
11624
12116
  );
11625
- const [isOpened, setIsOpened] = (0, import_react19.useState)(controlledIsOpened);
11626
- (0, import_react19.useEffect)(() => {
12117
+ const [isOpened, setIsOpened] = (0, import_react20.useState)(controlledIsOpened);
12118
+ (0, import_react20.useEffect)(() => {
11627
12119
  setSelectedTab(resolveInitialTab(defaultTab));
11628
12120
  }, [defaultTab]);
11629
- (0, import_react19.useEffect)(() => {
12121
+ (0, import_react20.useEffect)(() => {
11630
12122
  setIsOpened(controlledIsOpened);
11631
12123
  }, [controlledIsOpened]);
11632
- const selectedTimeRange = config.chart.selectedChartTimeRange;
11633
- const setSelectedTimeRange = config.chart.setSelectedChartTimeRange;
11634
12124
  const effectiveSelectedTab = isResolvedMarket ? "graph" : selectedTab;
11635
- const [chartRangeOverride, setChartRangeOverride] = (0, import_react19.useState)(null);
11636
- const effectiveChartTimeRange = isResolvedMarket ? "ALL" : chartRangeOverride != null ? chartRangeOverride : selectedTimeRange;
11637
- const [selectedChartType, setSelectedChartType] = (0, import_react19.useState)("line");
11638
- const scopedSelectedOutcomeState = (0, import_react19.useMemo)(() => {
12125
+ const scopedSelectedOutcomeState = (0, import_react20.useMemo)(() => {
11639
12126
  if (!model) {
11640
12127
  return {
11641
12128
  outcomeId: null,
@@ -11655,17 +12142,9 @@ var MarketDetailsContent = ({
11655
12142
  tradingContext == null ? void 0 : tradingContext.selectedOutcomeId
11656
12143
  ]);
11657
12144
  const selectedOutcomeId = scopedSelectedOutcomeState.outcomeId;
11658
- const selectedOutcomeLabel = (_c = scopedSelectedOutcomeState.outcomeLabel) != null ? _c : null;
12145
+ const selectedOutcomeLabel = (_d = scopedSelectedOutcomeState.outcomeLabel) != null ? _d : null;
11659
12146
  const selectOutcome = tradingContext == null ? void 0 : tradingContext.selectOutcome;
11660
- const [selectedGraphVenue, setSelectedGraphVenue] = (0, import_react19.useState)(null);
11661
- const [chartOutcomeLabel, setChartOutcomeLabel] = (0, import_react19.useState)(selectedOutcomeLabel);
11662
- (0, import_react19.useEffect)(() => {
11663
- if (!isOpened) return;
11664
- if (selectedOutcomeLabel) {
11665
- setChartOutcomeLabel(selectedOutcomeLabel);
11666
- }
11667
- }, [isOpened]);
11668
- (0, import_react19.useEffect)(() => {
12147
+ (0, import_react20.useEffect)(() => {
11669
12148
  var _a2;
11670
12149
  if (!isOpened || !model) return;
11671
12150
  if (isOutcomeSelectionLocked) return;
@@ -11689,31 +12168,38 @@ var MarketDetailsContent = ({
11689
12168
  tradingContext == null ? void 0 : tradingContext.selectedMarketId,
11690
12169
  selectOutcome
11691
12170
  ]);
11692
- const headerOutcomeItems = (0, import_react19.useMemo)(() => {
12171
+ const venueMarketIdByVenue = (0, import_react20.useMemo)(
12172
+ () => buildVenueMarketIdByVenue(model == null ? void 0 : model.market.venueMarkets),
12173
+ [model]
12174
+ );
12175
+ const headerOutcomeItems = (0, import_react20.useMemo)(() => {
11693
12176
  if (!model) return [];
11694
- const items = resolveHeaderOutcomeItems(model.market.venueMarkets, scopedMarketForCard);
12177
+ if (headerOutcomeItemsOverride) return headerOutcomeItemsOverride;
12178
+ const items = resolveHeaderOutcomeItems(
12179
+ model.market.venueMarkets,
12180
+ scopedMarketForCard,
12181
+ headerOutcomeVariant
12182
+ );
11695
12183
  return items.map((item) => {
11696
12184
  var _a2;
11697
12185
  const fallbackPrice = midpointsFallback == null ? void 0 : midpointsFallback.get(item.id);
11698
- const bestVenue = getDisplayOutcomeVenue({
12186
+ const candidate = selectBestOutcomeCandidate({
11699
12187
  outcomeId: item.id,
11700
12188
  outcomeLabel: item.label,
11701
12189
  selection: tradeSide,
11702
- bestMidpointVenue: clusterBestMidpointVenue,
11703
- bestVenueByOutcomeId: clusterVenueByOutcomeId,
11704
- bestPriceVenuesByOutcomeId: clusterBestPriceVenuesByOutcomeId,
11705
- fallbackVenue: midpointsFallbackVenues == null ? void 0 : midpointsFallbackVenues.get(item.id)
11706
- });
11707
- const outcomeBestPrice = getDisplayOutcomePrice({
11708
- outcomeId: item.id,
11709
- outcomeLabel: item.label,
11710
- selection: tradeSide,
11711
- bestPrices: clusterBestPrices,
12190
+ live: wsBestCandidates.get(item.id),
12191
+ restBest: clusterBestPricesRest.get(item.id),
12192
+ restBestVenues: clusterBestPriceVenuesByOutcomeId.get(item.id),
12193
+ restMidpoint: clusterBestMidpointsByOutcomeId.get(item.id),
12194
+ restMidpointVenue: clusterVenueByOutcomeId.get(item.id),
11712
12195
  bestMidpoint: clusterBestMidpoint,
11713
- bestMidpointsByOutcomeId: clusterBestMidpointsByOutcomeId,
11714
- livePrices: wsLivePrices,
11715
- fallbackPrice
12196
+ bestMidpointVenue: clusterBestMidpointVenue,
12197
+ staticPrice: fallbackPrice,
12198
+ staticVenue: midpointsFallbackVenues == null ? void 0 : midpointsFallbackVenues.get(item.id),
12199
+ venueMarketIdByVenue
11716
12200
  });
12201
+ const bestVenue = candidate == null ? void 0 : candidate.venue;
12202
+ const outcomeBestPrice = candidate == null ? void 0 : candidate.price;
11717
12203
  if (isResolvedMarket) {
11718
12204
  const isWinningOutcome = item.id === ((_a2 = marketTradingState.winningOutcome) == null ? void 0 : _a2.id);
11719
12205
  return __spreadValues(__spreadProps(__spreadValues({}, item), {
@@ -11731,19 +12217,22 @@ var MarketDetailsContent = ({
11731
12217
  clusterBestMidpoint,
11732
12218
  clusterBestMidpointVenue,
11733
12219
  clusterBestMidpointsByOutcomeId,
11734
- clusterBestPrices,
12220
+ clusterBestPricesRest,
11735
12221
  clusterBestPriceVenuesByOutcomeId,
12222
+ headerOutcomeItemsOverride,
11736
12223
  model,
11737
12224
  scopedMarketForCard,
12225
+ headerOutcomeVariant,
11738
12226
  clusterVenueByOutcomeId,
11739
12227
  isResolvedMarket,
11740
- (_d = marketTradingState.winningOutcome) == null ? void 0 : _d.id,
12228
+ (_e = marketTradingState.winningOutcome) == null ? void 0 : _e.id,
11741
12229
  midpointsFallback,
11742
12230
  midpointsFallbackVenues,
11743
12231
  tradeSide,
11744
- wsLivePrices
12232
+ venueMarketIdByVenue,
12233
+ wsBestCandidates
11745
12234
  ]);
11746
- const headlineProbability = (0, import_react19.useMemo)(() => {
12235
+ const headlineProbability = (0, import_react20.useMemo)(() => {
11747
12236
  var _a2, _b2, _c2, _d2;
11748
12237
  if (!model || !scopedMarketForCard) return void 0;
11749
12238
  if (isResolvedMarket) {
@@ -11768,7 +12257,7 @@ var MarketDetailsContent = ({
11768
12257
  fallbackPrice: (_c2 = midpointsFallback == null ? void 0 : midpointsFallback.get(displayOutcome.id)) != null ? _c2 : displayOutcome.price
11769
12258
  });
11770
12259
  if (referencePrice != null) return referencePrice;
11771
- return (_d2 = (0, import_hooks42.findLivePriceById)(wsLivePrices, displayOutcome.id)) != null ? _d2 : displayOutcome.price;
12260
+ return (_d2 = (0, import_hooks43.findLivePriceById)(wsLivePrices, displayOutcome.id)) != null ? _d2 : displayOutcome.price;
11772
12261
  }, [
11773
12262
  clusterBestMidpoint,
11774
12263
  clusterBestMidpointsByOutcomeId,
@@ -11779,7 +12268,7 @@ var MarketDetailsContent = ({
11779
12268
  midpointsFallback,
11780
12269
  wsLivePrices
11781
12270
  ]);
11782
- const selectedOutcomesByVenue = (0, import_react19.useMemo)(() => {
12271
+ const selectedOutcomesByVenue = (0, import_react20.useMemo)(() => {
11783
12272
  if (!model) return [];
11784
12273
  return collectEligibleVenueOutcomes({
11785
12274
  venueMarkets: model.market.venueMarkets,
@@ -11791,74 +12280,10 @@ var MarketDetailsContent = ({
11791
12280
  selectedOutcomeId
11792
12281
  });
11793
12282
  }, [model, selectedOutcomeLabel, selectedOutcomeId]);
11794
- const resolvedChartOutcomeLabel = chartOutcomeLabel != null ? chartOutcomeLabel : selectedOutcomeLabel;
11795
- const chartSelectedOutcomeId = selectedOutcomeId && resolvedChartOutcomeLabel === selectedOutcomeLabel ? selectedOutcomeId : null;
11796
- const chartOutcomesByVenue = (0, import_react19.useMemo)(() => {
11797
- if (!model) return [];
11798
- return resolveChartVenueOutcomes({
11799
- eligibleVenueOutcomes: collectEligibleVenueOutcomes({
11800
- venueMarkets: model.market.venueMarkets,
11801
- selectedOutcomeLabel: resolvedChartOutcomeLabel,
11802
- selectedOutcomeId: chartSelectedOutcomeId
11803
- }),
11804
- livePrices
11805
- });
11806
- }, [livePrices, model, resolvedChartOutcomeLabel, chartSelectedOutcomeId]);
11807
- const chartEnabled = isOpened && effectiveSelectedTab === "graph";
11808
12283
  const orderBookEnabled = isOpened && effectiveSelectedTab === "order-book" && !marketTradingState.isTradingDisabled;
11809
- const rollingWindow = (0, import_hooks42.useRollingChartWindow)({ range: effectiveChartTimeRange });
11810
- const primaryVenueMarketId = (_f = (_e = selectedOutcomesByVenue[0]) == null ? void 0 : _e.market.id) != null ? _f : null;
11811
- const primaryOutcomeId = (_h = (_g = selectedOutcomesByVenue[0]) == null ? void 0 : _g.outcome.id) != null ? _h : null;
11812
- const chartPrimaryOutcomeId = (_j = (_i = chartOutcomesByVenue[0]) == null ? void 0 : _i.outcome.id) != null ? _j : null;
11813
- const chartVenueOutcomeIds = (0, import_react19.useMemo)(() => {
11814
- return chartOutcomesByVenue.map((item) => item.outcome.id);
11815
- }, [chartOutcomesByVenue]);
11816
- const {
11817
- data: marketChartData,
11818
- isLoading: isMarketChartLoading,
11819
- error: marketChartError,
11820
- refetch: refetchMarketChart
11821
- } = (0, import_hooks42.useMarketChart)({
11822
- marketId: chartPrimaryOutcomeId,
11823
- venueMarketIds: chartVenueOutcomeIds,
11824
- interval: rollingWindow.interval,
11825
- startTs: rollingWindow.startTs * 1e3,
11826
- endTs: rollingWindow.endTs * 1e3,
11827
- enabled: chartEnabled && !!chartPrimaryOutcomeId,
11828
- live,
11829
- refetchIntervalMs: rollingWindow.refetchIntervalMs,
11830
- // Stable cache key per user-selected range so tab/page revisits hit cache
11831
- // instead of refetching on every bucket-boundary rollover.
11832
- rangeKey: rollingWindow.range
11833
- });
11834
- const hasAutoFallenBackRangeRef = (0, import_react19.useRef)(false);
11835
- (0, import_react19.useEffect)(() => {
11836
- hasAutoFallenBackRangeRef.current = false;
11837
- setChartRangeOverride(null);
11838
- }, [chartPrimaryOutcomeId]);
11839
- (0, import_react19.useEffect)(() => {
11840
- if (!shouldAutoFallbackToAllRange({
11841
- chartData: marketChartData,
11842
- isLoading: isMarketChartLoading,
11843
- error: marketChartError,
11844
- currentRange: effectiveChartTimeRange,
11845
- hasAlreadyFallenBack: hasAutoFallenBackRangeRef.current,
11846
- // Ignore stale bars outside the rolling window — see comment on the
11847
- // matching effect in event-list-item-details.
11848
- domainStartTs: rollingWindow.startTs
11849
- })) {
11850
- return;
11851
- }
11852
- hasAutoFallenBackRangeRef.current = true;
11853
- setChartRangeOverride("ALL");
11854
- }, [
11855
- marketChartData,
11856
- isMarketChartLoading,
11857
- marketChartError,
11858
- effectiveChartTimeRange,
11859
- rollingWindow.startTs
11860
- ]);
11861
- const marketOrderbookResult = (0, import_hooks42.useMarketOrderbook)({
12284
+ const primaryVenueMarketId = (_g = (_f = selectedOutcomesByVenue[0]) == null ? void 0 : _f.market.id) != null ? _g : null;
12285
+ const primaryOutcomeId = (_i = (_h = selectedOutcomesByVenue[0]) == null ? void 0 : _h.outcome.id) != null ? _i : null;
12286
+ const marketOrderbookResult = (0, import_hooks43.useMarketOrderbook)({
11862
12287
  marketId: primaryVenueMarketId,
11863
12288
  enabled: orderBookEnabled && !!primaryVenueMarketId,
11864
12289
  venueOutcomes: selectedOutcomesByVenue.map((item) => ({
@@ -11867,14 +12292,14 @@ var MarketDetailsContent = ({
11867
12292
  })),
11868
12293
  live
11869
12294
  });
11870
- const marketOrderbookDataById = (0, import_react19.useMemo)(() => {
12295
+ const marketOrderbookDataById = (0, import_react20.useMemo)(() => {
11871
12296
  var _a2;
11872
12297
  return (_a2 = marketOrderbookResult.dataById) != null ? _a2 : {};
11873
12298
  }, [marketOrderbookResult]);
11874
12299
  const isOrderBookLoading = marketOrderbookResult.isLoading;
11875
12300
  const orderBookError = marketOrderbookResult.error;
11876
12301
  const refetchOrderBook = marketOrderbookResult.refetch;
11877
- const aggregatedOrderbookRows = (0, import_react19.useMemo)(() => {
12302
+ const aggregatedOrderbookRows = (0, import_react20.useMemo)(() => {
11878
12303
  return mergeVenueOutcomeOrderbooks({
11879
12304
  eligibleOutcomes: selectedOutcomesByVenue,
11880
12305
  orderbooksByOutcomeId: marketOrderbookDataById
@@ -11882,7 +12307,7 @@ var MarketDetailsContent = ({
11882
12307
  }, [marketOrderbookDataById, selectedOutcomesByVenue]);
11883
12308
  const askRows = aggregatedOrderbookRows.askRows;
11884
12309
  const bidRows = aggregatedOrderbookRows.bidRows;
11885
- const unifiedEntries = (0, import_react19.useMemo)(() => {
12310
+ const unifiedEntries = (0, import_react20.useMemo)(() => {
11886
12311
  return resolveUnifiedOrderBookEntries({
11887
12312
  askRows,
11888
12313
  bidRows,
@@ -11890,7 +12315,7 @@ var MarketDetailsContent = ({
11890
12315
  spread: aggregatedOrderbookRows.spread
11891
12316
  });
11892
12317
  }, [aggregatedOrderbookRows.midpoint, aggregatedOrderbookRows.spread, askRows, bidRows]);
11893
- const orderbookSnapshotKey = (0, import_react19.useMemo)(() => {
12318
+ const orderbookSnapshotKey = (0, import_react20.useMemo)(() => {
11894
12319
  if (selectedOutcomesByVenue.length === 0) return null;
11895
12320
  return selectedOutcomesByVenue.map((item) => {
11896
12321
  var _a2, _b2;
@@ -11898,52 +12323,7 @@ var MarketDetailsContent = ({
11898
12323
  return `${item.outcomeId}:${snapshotVersion}`;
11899
12324
  }).join("|");
11900
12325
  }, [marketOrderbookDataById, selectedOutcomesByVenue]);
11901
- const chartAvailableOutcomesByVenue = (0, import_react19.useMemo)(() => {
11902
- return filterChartVenueOutcomesByRenderableVenues({
11903
- chartData: marketChartData,
11904
- venueOutcomes: chartOutcomesByVenue
11905
- });
11906
- }, [chartOutcomesByVenue, marketChartData]);
11907
- const graphSeries = (0, import_react19.useMemo)(() => {
11908
- var _a2, _b2, _c2, _d2;
11909
- const baseColor = resolveSeriesColor(
11910
- (_d2 = (_c2 = selectedGraphVenue != null ? selectedGraphVenue : (_a2 = chartAvailableOutcomesByVenue[0]) == null ? void 0 : _a2.venue) != null ? _c2 : (_b2 = chartOutcomesByVenue[0]) == null ? void 0 : _b2.venue) != null ? _d2 : "polymarket",
11911
- 0,
11912
- isDarkTheme
11913
- );
11914
- const domainStartTs = rollingWindow.startTs;
11915
- return resolveMarketChartDisplaySeries({
11916
- chartData: marketChartData,
11917
- selectedVenue: selectedGraphVenue,
11918
- transformProbability: (value) => value
11919
- }).map((seriesItem) => {
11920
- return {
11921
- id: `${resolvedChartOutcomeLabel != null ? resolvedChartOutcomeLabel : "graph"}-${seriesItem.venue}-${chartPrimaryOutcomeId != null ? chartPrimaryOutcomeId : "chart"}`,
11922
- venue: selectedGraphVenue != null ? selectedGraphVenue : seriesItem.venue,
11923
- color: seriesItem.venue === "aggregate" ? baseColor : resolveSeriesColor(seriesItem.venue, 0, isDarkTheme),
11924
- // Constrain to the rolling [nowSec - rangeSeconds, …] domain so stale
11925
- // bars don't bleed in across a range shrink or long mount.
11926
- points: seriesItem.points.filter((point) => point.time >= domainStartTs)
11927
- };
11928
- });
11929
- }, [
11930
- isDarkTheme,
11931
- chartPrimaryOutcomeId,
11932
- marketChartData,
11933
- rollingWindow.startTs,
11934
- selectedGraphVenue,
11935
- resolvedChartOutcomeLabel,
11936
- chartAvailableOutcomesByVenue,
11937
- chartOutcomesByVenue
11938
- ]);
11939
- const graphLiveState = (0, import_react19.useMemo)(() => {
11940
- return resolveMarketChartLiveState({
11941
- chartData: marketChartData,
11942
- selectedVenue: selectedGraphVenue,
11943
- transformProbability: (value) => value
11944
- });
11945
- }, [marketChartData, selectedGraphVenue]);
11946
- const otherRows = (0, import_react19.useMemo)(() => {
12326
+ const otherRows = (0, import_react20.useMemo)(() => {
11947
12327
  if (!model) return [];
11948
12328
  return resolveOtherTabRows(model.market, labels);
11949
12329
  }, [labels, model]);
@@ -11953,7 +12333,6 @@ var MarketDetailsContent = ({
11953
12333
  const isSnapshotUnavailableError = typeof orderBookError === "object" && orderBookError != null && "message" in orderBookError && typeof orderBookError.message === "string" && /^snapshot unavailable for\s+\S+/i.test(orderBookError.message);
11954
12334
  const orderBookErrorDescription = isSnapshotUnavailableError ? labels.marketDetails.orderBookUnavailableDescription : typeof orderBookError === "object" && orderBookError != null && "message" in orderBookError && typeof orderBookError.message === "string" && orderBookError.message.trim().length > 0 ? orderBookError.message : labels.marketDetails.orderBookUnavailableDescription;
11955
12335
  const hasNoOrderBook = isOrderBookNotFound && !isMarketResolved || !isOrderBookLoading && !hasOrderBookError && (selectedOutcomesByVenue.length === 0 || aggregatedOrderbookRows.hasNoOrderBook);
11956
- const hasChartError = !!marketChartError;
11957
12336
  const selectHeaderOutcome = ({
11958
12337
  item,
11959
12338
  shouldNotifyOutcomeSelect = false
@@ -11961,7 +12340,7 @@ var MarketDetailsContent = ({
11961
12340
  var _a2, _b2;
11962
12341
  if (isOutcomeSelectionLocked) return;
11963
12342
  if (item == null ? void 0 : item.id) {
11964
- const targetMarket = (_a2 = model == null ? void 0 : model.market.venueMarkets.find(
12343
+ const targetMarket = (_a2 = venueMarkets.find(
11965
12344
  (venueMarket) => venueMarket.venueMarketOutcomes.some((outcome) => outcome.id === item.id)
11966
12345
  )) != null ? _a2 : null;
11967
12346
  if ((targetMarket == null ? void 0 : targetMarket.id) && targetMarket.id !== (tradingContext == null ? void 0 : tradingContext.selectedMarketId)) {
@@ -12003,23 +12382,14 @@ var MarketDetailsContent = ({
12003
12382
  if (!marketId) return;
12004
12383
  onOpenChange == null ? void 0 : onOpenChange(marketId);
12005
12384
  };
12006
- const handleGraphVenueToggle = (venue) => {
12007
- setSelectedGraphVenue((currentVenue) => {
12008
- if (currentVenue === venue) return null;
12009
- return venue;
12010
- });
12011
- };
12012
12385
  const handleRetryOrderBook = () => {
12013
12386
  void refetchOrderBook();
12014
12387
  };
12015
- const handleRetryMarketChart = () => {
12016
- void refetchMarketChart();
12017
- };
12018
12388
  const orderbookState = marketTradingState.isTradingDisabled ? {
12019
12389
  kind: "disabled",
12020
12390
  title: marketStatePresentation.title,
12021
12391
  description: marketStatePresentation.description,
12022
- icon: /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(Icon, { name: marketStatePresentation.iconName, className: "h-5 w-5", "aria-hidden": "true" })
12392
+ icon: /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(Icon, { name: marketStatePresentation.iconName, className: "h-5 w-5", "aria-hidden": "true" })
12023
12393
  } : isOrderBookLoading ? { kind: "loading" } : hasOrderBookError ? {
12024
12394
  kind: "error",
12025
12395
  title: labels.marketDetails.orderBookUnavailableTitle,
@@ -12034,22 +12404,27 @@ var MarketDetailsContent = ({
12034
12404
  title: labels.marketDetails.orderBookEmptyTitle,
12035
12405
  description: labels.marketDetails.orderBookEmptyDescription
12036
12406
  } : { kind: "data" };
12037
- (0, import_react19.useEffect)(() => {
12038
- if (!selectedGraphVenue) {
12039
- return;
12040
- }
12041
- if (chartAvailableOutcomesByVenue.some((item) => item.venue === selectedGraphVenue)) {
12042
- return;
12043
- }
12044
- setSelectedGraphVenue(null);
12045
- }, [selectedGraphVenue, chartAvailableOutcomesByVenue]);
12046
12407
  if (marketId && !resolvedMarket) {
12047
- return /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(MarketDetailsNotFoundState, { ariaLabel, classNames });
12408
+ return /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(
12409
+ MarketDetailsNotFoundState,
12410
+ {
12411
+ marketId,
12412
+ ariaLabel,
12413
+ classNames
12414
+ }
12415
+ );
12048
12416
  }
12049
12417
  if (!model) {
12050
- return /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(MarketDetailsUnavailableState, { ariaLabel, classNames });
12418
+ return /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(
12419
+ MarketDetailsUnavailableState,
12420
+ {
12421
+ marketId,
12422
+ ariaLabel,
12423
+ classNames
12424
+ }
12425
+ );
12051
12426
  }
12052
- return /* @__PURE__ */ (0, import_jsx_runtime129.jsxs)(
12427
+ return /* @__PURE__ */ (0, import_jsx_runtime130.jsxs)(
12053
12428
  Card,
12054
12429
  {
12055
12430
  className: cn(
@@ -12060,9 +12435,10 @@ var MarketDetailsContent = ({
12060
12435
  classNames == null ? void 0 : classNames.root
12061
12436
  ),
12062
12437
  children: [
12063
- /* @__PURE__ */ (0, import_jsx_runtime129.jsxs)(
12438
+ /* @__PURE__ */ (0, import_jsx_runtime130.jsxs)(
12064
12439
  "div",
12065
12440
  {
12441
+ "data-market-id": marketId || void 0,
12066
12442
  className: cn(
12067
12443
  "agg-market-card-header",
12068
12444
  "flex flex-col items-stretch gap-3 px-5 py-3 md:flex-row md:flex-nowrap md:items-center md:justify-between",
@@ -12070,7 +12446,7 @@ var MarketDetailsContent = ({
12070
12446
  classNames == null ? void 0 : classNames.header
12071
12447
  ),
12072
12448
  children: [
12073
- /* @__PURE__ */ (0, import_jsx_runtime129.jsxs)(
12449
+ /* @__PURE__ */ (0, import_jsx_runtime130.jsxs)(
12074
12450
  "button",
12075
12451
  {
12076
12452
  className: cn(
@@ -12084,17 +12460,17 @@ var MarketDetailsContent = ({
12084
12460
  "aria-controls": detailsContentId,
12085
12461
  "aria-label": isOpened ? labels.marketDetails.toggleCloseDetailsAria(model.title) : labels.marketDetails.toggleOpenDetailsAria(model.title),
12086
12462
  children: [
12087
- /* @__PURE__ */ (0, import_jsx_runtime129.jsxs)("div", { className: "agg-market-summary flex min-w-24 flex-1 items-center gap-3 md:gap-4", children: [
12088
- /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
12463
+ /* @__PURE__ */ (0, import_jsx_runtime130.jsxs)("div", { className: "agg-market-summary flex min-w-24 flex-1 items-center gap-3 md:gap-4", children: [
12464
+ !compactHeader ? /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(
12089
12465
  RemoteImage,
12090
12466
  {
12091
- src: (0, import_hooks42.optimizedImageUrl)(model.image, 60),
12467
+ src: (0, import_hooks43.optimizedImageUrl)(model.image, 60),
12092
12468
  alt: "",
12093
12469
  className: "agg-market-image size-12 rounded-agg-lg object-cover md:size-[60px]"
12094
12470
  }
12095
- ),
12096
- /* @__PURE__ */ (0, import_jsx_runtime129.jsxs)("div", { className: "flex min-w-24 flex-col", children: [
12097
- /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(Tooltip, { content: model.title, side: "top", children: /* @__PURE__ */ (0, import_jsx_runtime129.jsx)("div", { className: "min-w-0", children: /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
12471
+ ) : null,
12472
+ /* @__PURE__ */ (0, import_jsx_runtime130.jsxs)("div", { className: "flex min-w-24 flex-col", children: [
12473
+ /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(Tooltip, { content: model.title, side: "top", children: /* @__PURE__ */ (0, import_jsx_runtime130.jsx)("div", { className: "min-w-0", children: /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(
12098
12474
  Typography,
12099
12475
  {
12100
12476
  as: "h3",
@@ -12103,16 +12479,16 @@ var MarketDetailsContent = ({
12103
12479
  children: model.title
12104
12480
  }
12105
12481
  ) }) }),
12106
- /* @__PURE__ */ (0, import_jsx_runtime129.jsx)("div", { className: "flex items-center gap-3", children: /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
12482
+ /* @__PURE__ */ (0, import_jsx_runtime130.jsx)("div", { className: "flex items-center gap-3", children: /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(
12107
12483
  Typography,
12108
12484
  {
12109
12485
  variant: "label",
12110
12486
  className: "agg-market-meta truncate text-agg-muted-foreground",
12111
- children: model.subtitle
12487
+ children: subtitleOverride != null ? subtitleOverride : model.subtitle
12112
12488
  }
12113
12489
  ) }),
12114
- marketTradingState.isTradingDisabled && marketTradingState.kind !== "resolved" && !isUpcomingMarket ? /* @__PURE__ */ (0, import_jsx_runtime129.jsxs)("div", { className: "mt-2 flex flex-wrap items-center gap-2 justify-center md:justify-start", children: [
12115
- /* @__PURE__ */ (0, import_jsx_runtime129.jsxs)(
12490
+ marketTradingState.isTradingDisabled && marketTradingState.kind !== "resolved" && !isUpcomingMarket ? /* @__PURE__ */ (0, import_jsx_runtime130.jsxs)("div", { className: "mt-2 flex flex-wrap items-center gap-2 justify-center md:justify-start", children: [
12491
+ /* @__PURE__ */ (0, import_jsx_runtime130.jsxs)(
12116
12492
  "span",
12117
12493
  {
12118
12494
  className: cn(
@@ -12120,7 +12496,7 @@ var MarketDetailsContent = ({
12120
12496
  resolveTradingStateBadgeClassName(marketTradingState.kind)
12121
12497
  ),
12122
12498
  children: [
12123
- /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
12499
+ /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(
12124
12500
  Icon,
12125
12501
  {
12126
12502
  name: marketStatePresentation.iconName,
@@ -12128,20 +12504,20 @@ var MarketDetailsContent = ({
12128
12504
  className: "h-3.5 w-3.5"
12129
12505
  }
12130
12506
  ),
12131
- /* @__PURE__ */ (0, import_jsx_runtime129.jsx)("span", { children: marketStatePresentation.badgeLabel })
12507
+ /* @__PURE__ */ (0, import_jsx_runtime130.jsx)("span", { children: marketStatePresentation.badgeLabel })
12132
12508
  ]
12133
12509
  }
12134
12510
  ),
12135
- marketStatePresentation.timestampLabel ? /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(Typography, { variant: "label", className: "text-agg-muted-foreground", children: marketStatePresentation.timestampLabel }) : null,
12136
- marketStatePresentation.winningOutcomeLabel ? /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(Typography, { variant: "label", className: "text-agg-muted-foreground", children: marketStatePresentation.winningOutcomeLabel }) : null
12511
+ marketStatePresentation.timestampLabel ? /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(Typography, { variant: "label", className: "text-agg-muted-foreground", children: marketStatePresentation.timestampLabel }) : null,
12512
+ marketStatePresentation.winningOutcomeLabel ? /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(Typography, { variant: "label", className: "text-agg-muted-foreground", children: marketStatePresentation.winningOutcomeLabel }) : null
12137
12513
  ] }) : null
12138
12514
  ] })
12139
12515
  ] }),
12140
- /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(Typography, { as: "div", variant: "heading", className: "agg-market-headline shrink-0", children: formatProbabilityPercent(headlineProbability, formatPercent) })
12516
+ !compactHeader ? /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(Typography, { as: "div", variant: "heading", className: "agg-market-headline shrink-0", children: formatProbabilityPercent(headlineProbability, formatPercent) }) : null
12141
12517
  ]
12142
12518
  }
12143
12519
  ),
12144
- marketTradingState.kind === "resolved" && marketTradingState.winningOutcome ? /* @__PURE__ */ (0, import_jsx_runtime129.jsx)("div", { className: "agg-outcomes flex w-full items-center justify-end md:w-auto md:shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime129.jsxs)(
12520
+ marketTradingState.kind === "resolved" && marketTradingState.winningOutcome ? /* @__PURE__ */ (0, import_jsx_runtime130.jsx)("div", { className: "agg-outcomes flex w-full items-center justify-end md:w-auto md:shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime130.jsxs)(
12145
12521
  "span",
12146
12522
  {
12147
12523
  className: cn(
@@ -12154,7 +12530,7 @@ var MarketDetailsContent = ({
12154
12530
  "border-transparent bg-agg-secondary-hover"
12155
12531
  ),
12156
12532
  children: [
12157
- /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
12533
+ /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(
12158
12534
  Icon,
12159
12535
  {
12160
12536
  name: marketTradingState.winningOutcome.label.trim().toLowerCase() === "yes" ? "check-circle" : "cross-circle",
@@ -12165,10 +12541,10 @@ var MarketDetailsContent = ({
12165
12541
  )
12166
12542
  }
12167
12543
  ),
12168
- /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(Typography, { variant: "body", children: labels.eventMarketPage.resolvedOutcome(marketTradingState.winningOutcome.label) })
12544
+ /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(Typography, { variant: "body", children: labels.eventMarketPage.resolvedOutcome(marketTradingState.winningOutcome.label) })
12169
12545
  ]
12170
12546
  }
12171
- ) }) : isUpcomingMarket ? /* @__PURE__ */ (0, import_jsx_runtime129.jsx)("div", { className: "agg-outcomes flex w-full items-center justify-end md:w-auto md:shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime129.jsxs)(
12547
+ ) }) : isUpcomingMarket ? /* @__PURE__ */ (0, import_jsx_runtime130.jsx)("div", { className: "agg-outcomes flex w-full items-center justify-end md:w-auto md:shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime130.jsxs)(
12172
12548
  "span",
12173
12549
  {
12174
12550
  className: cn(
@@ -12177,7 +12553,7 @@ var MarketDetailsContent = ({
12177
12553
  resolveTradingStateBadgeClassName(marketTradingState.kind)
12178
12554
  ),
12179
12555
  children: [
12180
- /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
12556
+ /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(
12181
12557
  Icon,
12182
12558
  {
12183
12559
  name: marketStatePresentation.iconName,
@@ -12186,10 +12562,10 @@ var MarketDetailsContent = ({
12186
12562
  "aria-hidden": "true"
12187
12563
  }
12188
12564
  ),
12189
- /* @__PURE__ */ (0, import_jsx_runtime129.jsx)("span", { children: marketStatePresentation.badgeLabel })
12565
+ /* @__PURE__ */ (0, import_jsx_runtime130.jsx)("span", { children: marketStatePresentation.badgeLabel })
12190
12566
  ]
12191
12567
  }
12192
- ) }) : /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
12568
+ ) }) : /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(
12193
12569
  "div",
12194
12570
  {
12195
12571
  className: "agg-outcomes flex w-full flex-wrap gap-2 md:w-auto md:shrink-0 md:flex-nowrap",
@@ -12198,9 +12574,10 @@ var MarketDetailsContent = ({
12198
12574
  onKeyDown: (eventToHandle) => handleOutcomeKeyDown(eventToHandle),
12199
12575
  children: headerOutcomeItems.map((item) => {
12200
12576
  const isActiveOutcome = item.id === selectedOutcomeId;
12201
- return /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
12577
+ return /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(
12202
12578
  MarketDetailsOutcomeButton,
12203
12579
  {
12580
+ enforceFixedWidth: headerOutcomeVariant != null,
12204
12581
  item,
12205
12582
  isSelected: isActiveOutcome,
12206
12583
  enableAnimations: config.features.enableAnimations,
@@ -12224,7 +12601,8 @@ var MarketDetailsContent = ({
12224
12601
  ]
12225
12602
  }
12226
12603
  ),
12227
- /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
12604
+ headerAccessory ? /* @__PURE__ */ (0, import_jsx_runtime130.jsx)("div", { className: "agg-market-card-accessory border-t border-agg-separator", children: headerAccessory }) : null,
12605
+ /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(
12228
12606
  "div",
12229
12607
  {
12230
12608
  id: detailsContentId,
@@ -12238,9 +12616,9 @@ var MarketDetailsContent = ({
12238
12616
  isOpened ? "grid-rows-[1fr] opacity-100" : "pointer-events-none grid-rows-[0fr] opacity-0"
12239
12617
  ),
12240
12618
  "aria-hidden": !isOpened,
12241
- children: /* @__PURE__ */ (0, import_jsx_runtime129.jsxs)("div", { className: "min-h-0", children: [
12242
- /* @__PURE__ */ (0, import_jsx_runtime129.jsx)("div", { className: "h-px w-full bg-agg-separator" }),
12243
- /* @__PURE__ */ (0, import_jsx_runtime129.jsxs)(
12619
+ children: /* @__PURE__ */ (0, import_jsx_runtime130.jsxs)("div", { className: "min-h-0", children: [
12620
+ /* @__PURE__ */ (0, import_jsx_runtime130.jsx)("div", { className: "h-px w-full bg-agg-separator" }),
12621
+ /* @__PURE__ */ (0, import_jsx_runtime130.jsxs)(
12244
12622
  "div",
12245
12623
  {
12246
12624
  className: cn(
@@ -12254,8 +12632,8 @@ var MarketDetailsContent = ({
12254
12632
  ) : "translate-y-5 opacity-0"
12255
12633
  ),
12256
12634
  children: [
12257
- !isResolvedMarket ? /* @__PURE__ */ (0, import_jsx_runtime129.jsxs)(import_jsx_runtime129.Fragment, { children: [
12258
- /* @__PURE__ */ (0, import_jsx_runtime129.jsx)("div", { className: cn("block", classNames == null ? void 0 : classNames.tabs), children: /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
12635
+ !isResolvedMarket ? /* @__PURE__ */ (0, import_jsx_runtime130.jsxs)(import_jsx_runtime130.Fragment, { children: [
12636
+ /* @__PURE__ */ (0, import_jsx_runtime130.jsx)("div", { className: cn("block", classNames == null ? void 0 : classNames.tabs), children: /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(
12259
12637
  Tabs,
12260
12638
  {
12261
12639
  ariaLabel: labels.marketDetails.tabsAria,
@@ -12266,10 +12644,10 @@ var MarketDetailsContent = ({
12266
12644
  className: "agg-market-tabs w-full px-5"
12267
12645
  }
12268
12646
  ) }),
12269
- /* @__PURE__ */ (0, import_jsx_runtime129.jsx)("div", { className: "h-px w-full bg-agg-separator" })
12647
+ /* @__PURE__ */ (0, import_jsx_runtime130.jsx)("div", { className: "h-px w-full bg-agg-separator" })
12270
12648
  ] }) : null,
12271
- /* @__PURE__ */ (0, import_jsx_runtime129.jsxs)("div", { className: cn("agg-market-card-body p-0", classNames == null ? void 0 : classNames.content), children: [
12272
- effectiveSelectedTab === "order-book" ? /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
12649
+ /* @__PURE__ */ (0, import_jsx_runtime130.jsxs)("div", { className: cn("agg-market-card-body p-0", classNames == null ? void 0 : classNames.content), children: [
12650
+ effectiveSelectedTab === "order-book" ? /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(
12273
12651
  OrderbookWithStates,
12274
12652
  {
12275
12653
  state: orderbookState,
@@ -12295,159 +12673,29 @@ var MarketDetailsContent = ({
12295
12673
  wrapperClassName: classNames == null ? void 0 : classNames.orderBook
12296
12674
  }
12297
12675
  ) : null,
12298
- effectiveSelectedTab === "graph" ? /* @__PURE__ */ (0, import_jsx_runtime129.jsxs)("div", { className: cn("agg-price-chart flex flex-col gap-5 p-5", classNames == null ? void 0 : classNames.graph), children: [
12299
- hasChartError ? /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
12300
- StateMessage,
12301
- {
12302
- title: labels.marketDetails.chartUnavailableTitle,
12303
- description: labels.marketDetails.chartUnavailableDescription,
12304
- icon: /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(WarningIcon, {}),
12305
- onAction: handleRetryMarketChart,
12306
- classNames: { root: "min-h-[248px] px-5 py-10 md:min-h-[272px]" }
12307
- }
12308
- ) : /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
12309
- LineChart,
12310
- {
12311
- series: graphSeries,
12312
- height: 260,
12313
- isLoading: isMarketChartLoading,
12314
- chartType: selectedChartType,
12315
- liveCandle: selectedChartType === "candlestick" ? (_k = graphLiveState.liveCandle) != null ? _k : void 0 : void 0,
12316
- lineValue: graphLiveState.lineValue,
12317
- classNames: { root: "agg-chart-region w-full" },
12318
- showSeriesControls: chartAvailableOutcomesByVenue.length > 0 || headerOutcomeItems.length > 0,
12319
- renderSeriesControls: () => {
12320
- var _a2, _b2, _c2, _d2;
12321
- return /* @__PURE__ */ (0, import_jsx_runtime129.jsxs)("div", { className: "agg-chart-toolbar w-full flex flex-col gap-4 md:flex-row md:items-center md:justify-between", children: [
12322
- /* @__PURE__ */ (0, import_jsx_runtime129.jsx)("div", { className: "agg-market-venues flex flex-wrap gap-2", children: chartAvailableOutcomesByVenue.map((item) => {
12323
- var _a3;
12324
- const probability = formatProbabilityPercent(
12325
- (_a3 = wsLivePrices.get(item.outcome.id)) != null ? _a3 : item.outcome.price,
12326
- formatPercent
12327
- );
12328
- const isActiveVenue = selectedGraphVenue === item.venue;
12329
- return /* @__PURE__ */ (0, import_jsx_runtime129.jsxs)(
12330
- "button",
12331
- {
12332
- type: "button",
12333
- "aria-label": `${item.venue} ${probability}`,
12334
- "aria-pressed": isActiveVenue,
12335
- className: cn(
12336
- "agg-market-venue",
12337
- "cursor-pointer",
12338
- "inline-flex items-center gap-2 rounded-agg-full border px-4 py-2",
12339
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-agg-primary focus-visible:ring-offset-0 focus-visible:ring-offset-agg-secondary-hover",
12340
- isActiveVenue ? "border-agg-primary bg-agg-secondary" : "border-transparent bg-agg-secondary-hover"
12341
- ),
12342
- onClick: (e) => {
12343
- e.preventDefault();
12344
- e.stopPropagation();
12345
- handleGraphVenueToggle(item.venue);
12346
- },
12347
- children: [
12348
- /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(VenueLogo, { venue: item.venue, size: "small" }),
12349
- /* @__PURE__ */ (0, import_jsx_runtime129.jsx)("span", { className: "text-agg-base leading-agg-6 text-agg-foreground", children: probability })
12350
- ]
12351
- },
12352
- `${item.market.id}-${item.outcome.id}`
12353
- );
12354
- }) }),
12355
- !isOutcomeSelectionLocked ? /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
12356
- SwitchButton,
12357
- {
12358
- ariaLabel: labels.marketDetails.outcomeSelectorAria,
12359
- className: "agg-outcome-switch w-full shrink-0 md:w-fit",
12360
- value: (_d2 = (_c2 = (_a2 = headerOutcomeItems.find(
12361
- (outcome) => outcome.label === resolvedChartOutcomeLabel
12362
- )) == null ? void 0 : _a2.id) != null ? _c2 : (_b2 = headerOutcomeItems[0]) == null ? void 0 : _b2.id) != null ? _d2 : "",
12363
- onValueChange: (outcomeId) => {
12364
- const outcome = headerOutcomeItems.find(
12365
- (headerOutcomeItem) => headerOutcomeItem.id === outcomeId
12366
- );
12367
- if (!outcome) return;
12368
- setChartOutcomeLabel(outcome.label);
12369
- },
12370
- options: headerOutcomeItems.map((outcome) => {
12371
- var _a3, _b3;
12372
- const price = outcome.probability;
12373
- return {
12374
- value: outcome.id,
12375
- label: `${(_a3 = outcome == null ? void 0 : outcome.title) != null ? _a3 : outcome.label} ${formatProbabilityCents(price)}`,
12376
- ariaLabel: `${(_b3 = outcome == null ? void 0 : outcome.title) != null ? _b3 : outcome.label} ${formatProbabilityCents(price)}`
12377
- };
12378
- })
12379
- }
12380
- ) : null
12381
- ] });
12382
- }
12383
- }
12384
- ),
12385
- /* @__PURE__ */ (0, import_jsx_runtime129.jsxs)(
12386
- "div",
12387
- {
12388
- className: cn(
12389
- "agg-chart-footer",
12390
- "flex flex-row justify-between gap-2 text-agg-sm leading-agg-5 text-agg-muted-foreground md:flex-row md:items-center md:justify-between",
12391
- classNames == null ? void 0 : classNames.footer
12392
- ),
12393
- children: [
12394
- /* @__PURE__ */ (0, import_jsx_runtime129.jsx)("span", { children: typeof model.market.volume !== "number" ? labels.marketDetails.volumeUnavailable : model.market.volume > 0 ? `${config.formatting.formatCompactCurrency(model.market.volume)} ${labels.marketDetails.meta.volumeSuffix}` : "" }),
12395
- /* @__PURE__ */ (0, import_jsx_runtime129.jsxs)("div", { className: "flex flex-wrap items-center gap-3 md:gap-4", children: [
12396
- /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
12397
- ChartTypeSwitch,
12398
- {
12399
- className: "agg-chart-type-switch shrink-0",
12400
- value: selectedChartType,
12401
- onValueChange: setSelectedChartType
12402
- }
12403
- ),
12404
- /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
12405
- "span",
12406
- {
12407
- "aria-hidden": "true",
12408
- className: "hidden h-4 w-px bg-agg-separator md:block"
12409
- }
12410
- ),
12411
- import_hooks42.CHART_TIME_RANGES.map((timeRange) => {
12412
- const isActive = effectiveChartTimeRange === timeRange;
12413
- const isDisabled = isResolvedMarket && timeRange !== "ALL";
12414
- return /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
12415
- "button",
12416
- {
12417
- type: "button",
12418
- disabled: isDisabled,
12419
- className: cn(
12420
- "agg-chart-time-range-trigger",
12421
- "cursor-pointer text-agg-sm leading-agg-5",
12422
- isDisabled && "cursor-not-allowed opacity-50",
12423
- isActive ? "font-agg-bold text-agg-foreground" : "font-agg-normal text-agg-muted-foreground"
12424
- ),
12425
- "aria-pressed": isActive,
12426
- "aria-disabled": isDisabled,
12427
- onClick: (e) => {
12428
- e.preventDefault();
12429
- e.stopPropagation();
12430
- if (isDisabled) return;
12431
- setChartRangeOverride(null);
12432
- setSelectedTimeRange(timeRange);
12433
- },
12434
- children: timeRange === "ALL" ? labels.eventItemDetails.allTimeRange : timeRange
12435
- },
12436
- timeRange
12437
- );
12438
- })
12439
- ] })
12440
- ]
12441
- }
12442
- )
12443
- ] }) : null,
12444
- effectiveSelectedTab === "other" ? /* @__PURE__ */ (0, import_jsx_runtime129.jsx)("div", { className: "agg-market-meta flex flex-col gap-4", children: otherContent != null ? otherContent : /* @__PURE__ */ (0, import_jsx_runtime129.jsx)("div", { className: "agg-market-meta-list grid grid-cols-1 gap-3", children: otherRows.map((row) => /* @__PURE__ */ (0, import_jsx_runtime129.jsxs)(
12676
+ isOpened && effectiveSelectedTab === "graph" ? /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(
12677
+ MarketDetailsGraphPanel,
12678
+ {
12679
+ venueMarkets: model.market.venueMarkets,
12680
+ selectedOutcomeLabel,
12681
+ selectedOutcomeId,
12682
+ livePrices,
12683
+ wsLivePrices,
12684
+ headerOutcomeItems,
12685
+ isResolvedMarket,
12686
+ isOutcomeSelectionLocked,
12687
+ volume: model.market.volume,
12688
+ live,
12689
+ classNames: { graph: classNames == null ? void 0 : classNames.graph, footer: classNames == null ? void 0 : classNames.footer }
12690
+ }
12691
+ ) : null,
12692
+ effectiveSelectedTab === "other" ? /* @__PURE__ */ (0, import_jsx_runtime130.jsx)("div", { className: "agg-market-meta flex flex-col gap-4", children: otherContent != null ? otherContent : /* @__PURE__ */ (0, import_jsx_runtime130.jsx)("div", { className: "agg-market-meta-list grid grid-cols-1 gap-3", children: otherRows.map((row) => /* @__PURE__ */ (0, import_jsx_runtime130.jsxs)(
12445
12693
  "div",
12446
12694
  {
12447
12695
  className: "agg-market-meta-row flex items-center justify-between rounded-agg-xl bg-agg-secondary-hover px-4 py-3",
12448
12696
  children: [
12449
- /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(Typography, { variant: "label", className: "text-agg-muted-foreground", children: row.label }),
12450
- /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(Typography, { variant: "body", className: "text-right", children: row.value })
12697
+ /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(Typography, { variant: "label", className: "text-agg-muted-foreground", children: row.label }),
12698
+ /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(Typography, { variant: "body", className: "text-right", children: row.value })
12451
12699
  ]
12452
12700
  },
12453
12701
  row.label
@@ -12465,9 +12713,9 @@ var MarketDetailsContent = ({
12465
12713
  };
12466
12714
  var MarketDetails = (_a) => {
12467
12715
  var _b = _a, { isOpened } = _b, props = __objRest(_b, ["isOpened"]);
12468
- const labels = (0, import_hooks42.useLabels)();
12716
+ const labels = (0, import_hooks43.useLabels)();
12469
12717
  if (props.isLoading) {
12470
- return /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
12718
+ return /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(
12471
12719
  Skeleton,
12472
12720
  {
12473
12721
  view: "market-details-minified",
@@ -12477,7 +12725,7 @@ var MarketDetails = (_a) => {
12477
12725
  );
12478
12726
  }
12479
12727
  if ("venueMarkets" in props && props.venueMarkets) {
12480
- return /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
12728
+ return /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(
12481
12729
  MarketDetailsContent,
12482
12730
  __spreadProps(__spreadValues({}, props), {
12483
12731
  isOpened,
@@ -12489,7 +12737,7 @@ var MarketDetails = (_a) => {
12489
12737
  );
12490
12738
  }
12491
12739
  const { classNames: fallbackClassNames } = props;
12492
- return /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(MarketDetailsUnavailableState, { classNames: fallbackClassNames });
12740
+ return /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(MarketDetailsUnavailableState, { classNames: fallbackClassNames });
12493
12741
  };
12494
12742
  MarketDetails.displayName = "MarketDetails";
12495
12743
  var AFFIRMATIVE_WINNER_LABELS = /* @__PURE__ */ new Set(["yes", "up", "buy", "long", "true"]);
@@ -12520,13 +12768,13 @@ var resolveIsResolvedEvent = (sourceMarkets, eventTradingState) => {
12520
12768
  return eventTradingState.kind === "resolved";
12521
12769
  }
12522
12770
  if (sourceMarkets.length === 0) return false;
12523
- return sourceMarkets.every((market) => (0, import_hooks42.resolveMarketTradingState)(market).kind === "resolved");
12771
+ return sourceMarkets.every((market) => (0, import_hooks43.resolveMarketTradingState)(market).kind === "resolved");
12524
12772
  };
12525
12773
  var resolveResolvedWinnerMarketId = (sourceMarkets, eventTradingState) => {
12526
12774
  var _a, _b, _c, _d, _e;
12527
12775
  const preferredMarket = (_a = eventTradingState == null ? void 0 : eventTradingState.primaryMarket) != null ? _a : null;
12528
12776
  if (preferredMarket && sourceMarkets.some((market) => market.id === preferredMarket.id)) {
12529
- if ((0, import_hooks42.resolveMarketTradingState)(preferredMarket).kind === "resolved") {
12777
+ if ((0, import_hooks43.resolveMarketTradingState)(preferredMarket).kind === "resolved") {
12530
12778
  return preferredMarket.id;
12531
12779
  }
12532
12780
  }
@@ -12546,24 +12794,25 @@ var MarketDetailsList = ({
12546
12794
  midpointsResult
12547
12795
  }) => {
12548
12796
  var _a, _b;
12549
- const labels = (0, import_hooks42.useLabels)();
12550
- const tradingContext = (0, import_hooks42.useEventTradingContext)();
12797
+ const labels = (0, import_hooks43.useLabels)();
12798
+ const tradingContext = (0, import_hooks43.useEventTradingContext)();
12551
12799
  const selectedMarketId = (_a = tradingContext == null ? void 0 : tradingContext.selectedMarketId) != null ? _a : null;
12552
- const [expandedMarketId, setExpandedMarketId] = (0, import_react19.useState)(null);
12553
- const [areResolvedMarketsVisible, setAreResolvedMarketsVisible] = (0, import_react19.useState)(false);
12800
+ const [expandedMarketId, setExpandedMarketId] = (0, import_react20.useState)(null);
12801
+ const [areResolvedMarketsVisible, setAreResolvedMarketsVisible] = (0, import_react20.useState)(false);
12554
12802
  const resolvedEventId = eventId || "";
12555
12803
  const {
12556
12804
  markets: rawMarkets,
12557
12805
  isLoading,
12558
12806
  error
12559
- } = (0, import_hooks42.useVenueMarkets)({
12807
+ } = (0, import_hooks43.useVenueMarkets)({
12560
12808
  venueEventId: resolvedEventId,
12561
12809
  enabled: !providedMarkets && !!resolvedEventId,
12562
- status: import_hooks42.MarketStatus.open,
12563
- sortBy: "yesPrice",
12564
- sortDir: "desc"
12810
+ status: import_hooks43.MarketStatus.open
12811
+ // No explicit sortBy: event-scoped /venue-markets sorts by the event's
12812
+ // type-aware order (structureOrderBy), matching the home-card top-3 and the
12813
+ // markets-under-an-event ordering. Passing sortBy here would override it.
12565
12814
  });
12566
- const sourceMarkets = (0, import_react19.useMemo)(() => {
12815
+ const sourceMarkets = (0, import_react20.useMemo)(() => {
12567
12816
  var _a2;
12568
12817
  if ((_a2 = eventTradingState == null ? void 0 : eventTradingState.marketStates) == null ? void 0 : _a2.length) {
12569
12818
  return eventTradingState.marketStates.map((item) => item.market);
@@ -12571,10 +12820,10 @@ var MarketDetailsList = ({
12571
12820
  if (providedMarkets) return providedMarkets;
12572
12821
  return rawMarkets;
12573
12822
  }, [eventTradingState == null ? void 0 : eventTradingState.marketStates, providedMarkets, rawMarkets]);
12574
- const isResolvedEvent = (0, import_react19.useMemo)(() => {
12823
+ const isResolvedEvent = (0, import_react20.useMemo)(() => {
12575
12824
  return resolveIsResolvedEvent(sourceMarkets, eventTradingState);
12576
12825
  }, [eventTradingState, sourceMarkets]);
12577
- const groupedMarkets = (0, import_react19.useMemo)(() => {
12826
+ const groupedMarkets = (0, import_react20.useMemo)(() => {
12578
12827
  if (sourceMarkets.length === 0) {
12579
12828
  return {
12580
12829
  primary: [],
@@ -12596,7 +12845,7 @@ var MarketDetailsList = ({
12596
12845
  const resolved = [];
12597
12846
  const closed = [];
12598
12847
  sourceMarkets.forEach((market) => {
12599
- const marketStateKind = (0, import_hooks42.resolveMarketTradingState)(market).kind;
12848
+ const marketStateKind = (0, import_hooks43.resolveMarketTradingState)(market).kind;
12600
12849
  if (marketStateKind === "resolved") {
12601
12850
  resolved.push(market);
12602
12851
  return;
@@ -12614,21 +12863,21 @@ var MarketDetailsList = ({
12614
12863
  return { primary, upcoming, resolved, closed };
12615
12864
  }, [eventTradingState, isResolvedEvent, sourceMarkets]);
12616
12865
  const shouldShowResolvedToggle = !isResolvedEvent && groupedMarkets.resolved.length > 0;
12617
- const visibleResolvedMarkets = (0, import_react19.useMemo)(() => {
12866
+ const visibleResolvedMarkets = (0, import_react20.useMemo)(() => {
12618
12867
  if (isResolvedEvent || areResolvedMarketsVisible) return groupedMarkets.resolved;
12619
12868
  return [];
12620
12869
  }, [areResolvedMarketsVisible, groupedMarkets.resolved, isResolvedEvent]);
12621
- const displayedMarkets = (0, import_react19.useMemo)(() => {
12870
+ const displayedMarkets = (0, import_react20.useMemo)(() => {
12622
12871
  return [...groupedMarkets.primary, ...visibleResolvedMarkets];
12623
12872
  }, [groupedMarkets.primary, visibleResolvedMarkets]);
12624
12873
  const hasPrefetchedMarkets = !!providedMarkets || !!((_b = eventTradingState == null ? void 0 : eventTradingState.marketStates) == null ? void 0 : _b.length);
12625
- const midpointEligibleMarkets = (0, import_react19.useMemo)(() => {
12874
+ const midpointEligibleMarkets = (0, import_react20.useMemo)(() => {
12626
12875
  return displayedMarkets.filter(
12627
- (market) => (0, import_hooks42.resolveMarketTradingState)(market).kind !== "resolved"
12876
+ (market) => (0, import_hooks43.resolveMarketTradingState)(market).kind !== "resolved"
12628
12877
  );
12629
12878
  }, [displayedMarkets]);
12630
- const { prices: midpointsFallback, venueByOutcomeId: midpointsFallbackVenues } = (0, import_hooks42.useViewportMidpoints)(midpointEligibleMarkets);
12631
- (0, import_react19.useEffect)(() => {
12879
+ const { prices: midpointsFallback, venueByOutcomeId: midpointsFallbackVenues } = (0, import_hooks43.useViewportMidpoints)(midpointEligibleMarkets);
12880
+ (0, import_react20.useEffect)(() => {
12632
12881
  if (isResolvedEvent) {
12633
12882
  setAreResolvedMarketsVisible(false);
12634
12883
  return;
@@ -12637,7 +12886,7 @@ var MarketDetailsList = ({
12637
12886
  setAreResolvedMarketsVisible(false);
12638
12887
  }
12639
12888
  }, [groupedMarkets.resolved.length, isResolvedEvent]);
12640
- (0, import_react19.useEffect)(() => {
12889
+ (0, import_react20.useEffect)(() => {
12641
12890
  if (displayedMarkets.length === 0) return;
12642
12891
  if (selectedMarketId && displayedMarkets.some((market) => market.id === selectedMarketId)) {
12643
12892
  return;
@@ -12646,7 +12895,7 @@ var MarketDetailsList = ({
12646
12895
  return;
12647
12896
  }
12648
12897
  const fallbackSelectableMarket = displayedMarkets.find(
12649
- (market) => !(0, import_hooks42.resolveMarketTradingState)(market).isTradingDisabled
12898
+ (market) => !(0, import_hooks43.resolveMarketTradingState)(market).isTradingDisabled
12650
12899
  );
12651
12900
  if (!fallbackSelectableMarket) {
12652
12901
  return;
@@ -12654,7 +12903,7 @@ var MarketDetailsList = ({
12654
12903
  if (!autoSelectFallbackMarket) return;
12655
12904
  tradingContext == null ? void 0 : tradingContext.selectMarket(fallbackSelectableMarket.id, fallbackSelectableMarket);
12656
12905
  }, [autoSelectFallbackMarket, displayedMarkets, selectedMarketId, sourceMarkets, tradingContext]);
12657
- (0, import_react19.useEffect)(() => {
12906
+ (0, import_react20.useEffect)(() => {
12658
12907
  if (!expandedMarketId) return;
12659
12908
  if (displayedMarkets.some((market) => market.id === expandedMarketId)) return;
12660
12909
  setExpandedMarketId(null);
@@ -12668,11 +12917,11 @@ var MarketDetailsList = ({
12668
12917
  setExpandedMarketId(marketId);
12669
12918
  onExpandedMarketChange == null ? void 0 : onExpandedMarketChange(marketId);
12670
12919
  if (marketId === selectedMarketId) return;
12671
- if ((0, import_hooks42.resolveMarketTradingState)(market).isTradingDisabled) return;
12920
+ if ((0, import_hooks43.resolveMarketTradingState)(market).isTradingDisabled) return;
12672
12921
  tradingContext == null ? void 0 : tradingContext.selectMarket(market.id, market);
12673
12922
  };
12674
12923
  if (!hasPrefetchedMarkets && isLoading) {
12675
- return /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
12924
+ return /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(
12676
12925
  Skeleton,
12677
12926
  {
12678
12927
  view: "market-details-minified",
@@ -12682,29 +12931,29 @@ var MarketDetailsList = ({
12682
12931
  );
12683
12932
  }
12684
12933
  if (!hasPrefetchedMarkets && error) {
12685
- return /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
12934
+ return /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(
12686
12935
  StateMessage,
12687
12936
  {
12688
12937
  title: labels.marketDetails.unavailableTitle,
12689
12938
  description: labels.marketDetails.unavailableDescription,
12690
- icon: /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(SearchEmptyIcon, {}),
12939
+ icon: /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(SearchEmptyIcon, {}),
12691
12940
  classNames: { root: "min-h-[280px] md:min-h-[320px]" }
12692
12941
  }
12693
12942
  );
12694
12943
  }
12695
12944
  if (displayedMarkets.length === 0 && !shouldShowResolvedToggle) {
12696
12945
  const hasSourceMarkets = sourceMarkets.length > 0;
12697
- return /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
12946
+ return /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(
12698
12947
  StateMessage,
12699
12948
  {
12700
12949
  title: hasSourceMarkets ? isResolvedEvent ? labels.markets.emptyResolved : labels.markets.emptyNoOpen : labels.marketDetails.notFoundTitle,
12701
12950
  description: hasSourceMarkets ? void 0 : labels.marketDetails.notFoundDescription,
12702
- icon: /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(SearchEmptyIcon, {}),
12951
+ icon: /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(SearchEmptyIcon, {}),
12703
12952
  classNames: { root: "min-h-[280px] md:min-h-[320px]" }
12704
12953
  }
12705
12954
  );
12706
12955
  }
12707
- const renderMarketCard = (market) => /* @__PURE__ */ (0, import_jsx_runtime129.jsx)("div", { children: /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
12956
+ const renderMarketCard = (market) => /* @__PURE__ */ (0, import_jsx_runtime130.jsx)("div", { children: /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(
12708
12957
  MarketDetails,
12709
12958
  {
12710
12959
  marketId: market.id,
@@ -12731,9 +12980,9 @@ var MarketDetailsList = ({
12731
12980
  midpointsResult
12732
12981
  }
12733
12982
  ) }, market.id);
12734
- return /* @__PURE__ */ (0, import_jsx_runtime129.jsxs)("div", { className: cn("agg-market-list flex flex-col gap-3", classNames == null ? void 0 : classNames.root), children: [
12983
+ return /* @__PURE__ */ (0, import_jsx_runtime130.jsxs)("div", { className: cn("agg-market-list flex flex-col gap-3", classNames == null ? void 0 : classNames.root), children: [
12735
12984
  groupedMarkets.primary.map((market) => renderMarketCard(market)),
12736
- shouldShowResolvedToggle ? /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
12985
+ shouldShowResolvedToggle ? /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(
12737
12986
  Button,
12738
12987
  {
12739
12988
  variant: "tertiary",
@@ -12743,7 +12992,7 @@ var MarketDetailsList = ({
12743
12992
  setAreResolvedMarketsVisible((isVisible) => !isVisible);
12744
12993
  },
12745
12994
  "aria-expanded": areResolvedMarketsVisible,
12746
- suffix: /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
12995
+ suffix: /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(
12747
12996
  Icon,
12748
12997
  {
12749
12998
  name: areResolvedMarketsVisible ? "chevron-up" : "chevron-down",
@@ -12761,14 +13010,14 @@ var MarketDetailsList = ({
12761
13010
  MarketDetailsList.displayName = "MarketDetailsList";
12762
13011
 
12763
13012
  // src/events/list/index.tsx
12764
- var import_hooks44 = require("@agg-build/hooks");
13013
+ var import_hooks45 = require("@agg-build/hooks");
12765
13014
  var import_sdk14 = require("@agg-build/sdk");
12766
13015
  var Dialog2 = __toESM(require("@radix-ui/react-dialog"));
12767
- var import_react22 = require("react");
13016
+ var import_react23 = require("react");
12768
13017
 
12769
13018
  // src/events/list/category-sidebar.tsx
12770
- var import_react20 = require("react");
12771
- var import_jsx_runtime130 = require("react/jsx-runtime");
13019
+ var import_react21 = require("react");
13020
+ var import_jsx_runtime131 = require("react/jsx-runtime");
12772
13021
  var rowBase = cn(
12773
13022
  "flex min-h-11 w-full items-center gap-3 rounded-[6px] px-3 py-3",
12774
13023
  "text-left text-agg-sm font-agg-normal leading-agg-5",
@@ -12790,7 +13039,7 @@ var CategorySidebar = ({
12790
13039
  onToggleCategory
12791
13040
  }) => {
12792
13041
  const isDrilledIn = categoryPath.length > 0;
12793
- const sortedBaseChildren = (0, import_react20.useMemo)(() => {
13042
+ const sortedBaseChildren = (0, import_react21.useMemo)(() => {
12794
13043
  var _a;
12795
13044
  if (!baseCategoryId) return [];
12796
13045
  const children = [...(_a = childrenByParentId.get(baseCategoryId)) != null ? _a : []];
@@ -12810,7 +13059,7 @@ var CategorySidebar = ({
12810
13059
  }) => {
12811
13060
  var _a, _b;
12812
13061
  const hasKnownChildren = ((_b = (_a = childrenByParentId.get(entry.id)) == null ? void 0 : _a.length) != null ? _b : 0) > 0;
12813
- return /* @__PURE__ */ (0, import_jsx_runtime130.jsxs)(
13062
+ return /* @__PURE__ */ (0, import_jsx_runtime131.jsxs)(
12814
13063
  "button",
12815
13064
  {
12816
13065
  type: "button",
@@ -12818,8 +13067,8 @@ var CategorySidebar = ({
12818
13067
  className: isSelected ? selectedRowClassName : idleRowClassName,
12819
13068
  onClick,
12820
13069
  children: [
12821
- /* @__PURE__ */ (0, import_jsx_runtime130.jsx)("span", { className: "min-w-0 flex-1 truncate first-letter:uppercase", children: entry.label }),
12822
- hasKnownChildren ? /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(
13070
+ /* @__PURE__ */ (0, import_jsx_runtime131.jsx)("span", { className: "min-w-0 flex-1 truncate first-letter:uppercase", children: entry.label }),
13071
+ hasKnownChildren ? /* @__PURE__ */ (0, import_jsx_runtime131.jsx)(
12823
13072
  Icon,
12824
13073
  {
12825
13074
  name: isExpanded ? "chevron-up" : "chevron-down",
@@ -12827,7 +13076,7 @@ var CategorySidebar = ({
12827
13076
  color: "currentColor",
12828
13077
  className: "shrink-0 text-agg-muted-foreground"
12829
13078
  }
12830
- ) : /* @__PURE__ */ (0, import_jsx_runtime130.jsx)("span", { className: "shrink-0 text-agg-muted-foreground", children: entry.eventCount })
13079
+ ) : /* @__PURE__ */ (0, import_jsx_runtime131.jsx)("span", { className: "shrink-0 text-agg-muted-foreground", children: entry.eventCount })
12831
13080
  ]
12832
13081
  },
12833
13082
  entry.id
@@ -12845,27 +13094,27 @@ var CategorySidebar = ({
12845
13094
  const hasKnownChildren = childCategories.length > 0;
12846
13095
  const isExpanded = ((_d = categoryPath[depth]) == null ? void 0 : _d.id) === category.id && !collapsedCategoryIds.has(category.id);
12847
13096
  const isSelected = ((_e = categoryPath[depth]) == null ? void 0 : _e.id) === category.id && categoryPath.length === depth + 1;
12848
- return /* @__PURE__ */ (0, import_jsx_runtime130.jsxs)("div", { className: "flex w-full flex-col", children: [
13097
+ return /* @__PURE__ */ (0, import_jsx_runtime131.jsxs)("div", { className: "flex w-full flex-col", children: [
12849
13098
  renderRow({
12850
13099
  entry,
12851
13100
  isExpanded,
12852
13101
  isSelected,
12853
13102
  onClick: () => onToggleCategory({ entry, depth, hasKnownChildren, isExpanded, isSelected })
12854
13103
  }),
12855
- /* @__PURE__ */ (0, import_jsx_runtime130.jsx)(
13104
+ /* @__PURE__ */ (0, import_jsx_runtime131.jsx)(
12856
13105
  "div",
12857
13106
  {
12858
13107
  className: cn(
12859
13108
  "grid transition-[grid-template-rows] duration-150 ease-in-out motion-reduce:transition-none",
12860
13109
  isExpanded ? "grid-rows-[1fr]" : "grid-rows-[0fr]"
12861
13110
  ),
12862
- children: /* @__PURE__ */ (0, import_jsx_runtime130.jsx)("div", { className: "overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime130.jsx)("div", { className: "flex w-full flex-col gap-1 pl-4 pt-1", children: childCategories.map((child) => renderBranch(child, depth + 1)) }) })
13111
+ children: /* @__PURE__ */ (0, import_jsx_runtime131.jsx)("div", { className: "overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime131.jsx)("div", { className: "flex w-full flex-col gap-1 pl-4 pt-1", children: childCategories.map((child) => renderBranch(child, depth + 1)) }) })
12863
13112
  }
12864
13113
  )
12865
13114
  ] }, category.id);
12866
13115
  };
12867
- return /* @__PURE__ */ (0, import_jsx_runtime130.jsxs)("div", { className: "flex w-full flex-col gap-1", children: [
12868
- /* @__PURE__ */ (0, import_jsx_runtime130.jsxs)(
13116
+ return /* @__PURE__ */ (0, import_jsx_runtime131.jsxs)("div", { className: "flex w-full flex-col gap-1", children: [
13117
+ /* @__PURE__ */ (0, import_jsx_runtime131.jsxs)(
12869
13118
  "button",
12870
13119
  {
12871
13120
  type: "button",
@@ -12873,8 +13122,8 @@ var CategorySidebar = ({
12873
13122
  className: !isDrilledIn ? selectedRowClassName : idleRowClassName,
12874
13123
  onClick: onSelectAll,
12875
13124
  children: [
12876
- /* @__PURE__ */ (0, import_jsx_runtime130.jsx)("span", { className: "min-w-0 flex-1 truncate", children: labels.subcategoriesAll }),
12877
- /* @__PURE__ */ (0, import_jsx_runtime130.jsx)("span", { className: "shrink-0 text-agg-muted-foreground", children: totalEventCount })
13125
+ /* @__PURE__ */ (0, import_jsx_runtime131.jsx)("span", { className: "min-w-0 flex-1 truncate", children: labels.subcategoriesAll }),
13126
+ /* @__PURE__ */ (0, import_jsx_runtime131.jsx)("span", { className: "shrink-0 text-agg-muted-foreground", children: totalEventCount })
12878
13127
  ]
12879
13128
  }
12880
13129
  ),
@@ -12884,8 +13133,8 @@ var CategorySidebar = ({
12884
13133
  CategorySidebar.displayName = "CategorySidebar";
12885
13134
 
12886
13135
  // src/events/list/event-list-tabs.tsx
12887
- var import_hooks43 = require("@agg-build/hooks");
12888
- var import_react21 = require("react");
13136
+ var import_hooks44 = require("@agg-build/hooks");
13137
+ var import_react22 = require("react");
12889
13138
 
12890
13139
  // src/events/list/event-list.constants.ts
12891
13140
  var import_sdk13 = require("@agg-build/sdk");
@@ -12952,16 +13201,16 @@ var getDefaultEventListTabs = (labels) => {
12952
13201
  };
12953
13202
 
12954
13203
  // src/events/list/event-list-tabs.tsx
12955
- var import_jsx_runtime131 = require("react/jsx-runtime");
13204
+ var import_jsx_runtime132 = require("react/jsx-runtime");
12956
13205
  var renderTabIcon = (tab, isActive) => {
12957
13206
  if (tab.iconName === "warning-filled") {
12958
- return /* @__PURE__ */ (0, import_jsx_runtime131.jsx)(Icon, { name: "warning-filled", size: "small", color: "currentColor" });
13207
+ return /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(Icon, { name: "warning-filled", size: "small", color: "currentColor" });
12959
13208
  }
12960
13209
  if (tab.venueLogo) {
12961
- return /* @__PURE__ */ (0, import_jsx_runtime131.jsx)(VenueLogo, { venue: tab.venueLogo, size: "small" });
13210
+ return /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(VenueLogo, { venue: tab.venueLogo, size: "small" });
12962
13211
  }
12963
13212
  if (!tab.iconName) return null;
12964
- return /* @__PURE__ */ (0, import_jsx_runtime131.jsx)(
13213
+ return /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(
12965
13214
  Icon,
12966
13215
  {
12967
13216
  name: tab.iconName,
@@ -12971,14 +13220,14 @@ var renderTabIcon = (tab, isActive) => {
12971
13220
  );
12972
13221
  };
12973
13222
  var useEventListTabs = (tabs) => {
12974
- const labels = (0, import_hooks43.useLabels)();
12975
- const { disabledVenues } = (0, import_hooks43.useAppConfig)();
12976
- const { isLocationBlocked } = (0, import_hooks43.useGeoBlock)();
12977
- return (0, import_react21.useMemo)(() => {
13223
+ const labels = (0, import_hooks44.useLabels)();
13224
+ const { disabledVenues } = (0, import_hooks44.useAppConfig)();
13225
+ const { isLocationBlocked } = (0, import_hooks44.useGeoBlock)();
13226
+ return (0, import_react22.useMemo)(() => {
12978
13227
  const baseTabs = tabs != null ? tabs : getDefaultEventListTabs(labels);
12979
13228
  return baseTabs.flatMap((tab) => {
12980
13229
  if (!tab.venueLogo) return [tab];
12981
- const availabilityState = (0, import_hooks43.getVenueAvailabilityState)({
13230
+ const availabilityState = (0, import_hooks44.getVenueAvailabilityState)({
12982
13231
  venueId: tab.venueLogo,
12983
13232
  disabledVenues,
12984
13233
  isLocationBlocked
@@ -13003,13 +13252,13 @@ var EventListTabs = ({
13003
13252
  overflowBehavior
13004
13253
  }) => {
13005
13254
  const resolvedTabs = useEventListTabs(tabs);
13006
- (0, import_react21.useEffect)(() => {
13255
+ (0, import_react22.useEffect)(() => {
13007
13256
  const fallbackTab = resolvedTabs.find((tab) => !tab.disabled);
13008
13257
  if (!fallbackTab) return;
13009
13258
  if (resolvedTabs.some((tab) => tab.value === activeTab && !tab.disabled)) return;
13010
13259
  onTabChange(fallbackTab.value);
13011
13260
  }, [activeTab, onTabChange, resolvedTabs]);
13012
- const items = (0, import_react21.useMemo)(() => {
13261
+ const items = (0, import_react22.useMemo)(() => {
13013
13262
  return resolvedTabs.map((tab) => {
13014
13263
  const isActive = tab.value === activeTab;
13015
13264
  return {
@@ -13021,7 +13270,7 @@ var EventListTabs = ({
13021
13270
  };
13022
13271
  });
13023
13272
  }, [activeTab, resolvedTabs]);
13024
- return /* @__PURE__ */ (0, import_jsx_runtime131.jsx)(
13273
+ return /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(
13025
13274
  Tabs,
13026
13275
  {
13027
13276
  ariaLabel,
@@ -13036,7 +13285,7 @@ var EventListTabs = ({
13036
13285
  EventListTabs.displayName = "EventListTabs";
13037
13286
 
13038
13287
  // src/events/list/index.tsx
13039
- var import_jsx_runtime132 = require("react/jsx-runtime");
13288
+ var import_jsx_runtime133 = require("react/jsx-runtime");
13040
13289
  var SORT_ICON_BY_VALUE = {
13041
13290
  volume24hr: "sort-volume-24hr",
13042
13291
  topArbitrage: "sort-top-arbitrage",
@@ -13074,45 +13323,45 @@ var EventList = ({
13074
13323
  stateRef
13075
13324
  }) => {
13076
13325
  var _a, _b, _c, _d, _e;
13077
- const labels = (0, import_hooks44.useLabels)();
13078
- const { disabledVenues } = (0, import_hooks44.useAppConfig)();
13326
+ const labels = (0, import_hooks45.useLabels)();
13327
+ const { disabledVenues } = (0, import_hooks45.useAppConfig)();
13079
13328
  const {
13080
- features: { enableVenueEventDiscoveryFilters }
13081
- } = (0, import_hooks44.useSdkUiConfig)();
13329
+ features: { enableVenueEventDiscoveryFilters, showSportsMarkets }
13330
+ } = (0, import_hooks45.useSdkUiConfig)();
13082
13331
  const isDiscoveryFiltersEnabled = enableVenueEventDiscoveryFilters && !search;
13083
13332
  const resolvedTabs = useEventListTabs();
13084
- const visibleVenues = (0, import_react22.useMemo)(
13085
- () => disabledVenues.length === 0 ? void 0 : (0, import_hooks44.getVisibleVenueIdsByConfig)(import_sdk14.VENUES, disabledVenues),
13333
+ const visibleVenues = (0, import_react23.useMemo)(
13334
+ () => disabledVenues.length === 0 ? void 0 : (0, import_hooks45.getVisibleVenueIdsByConfig)(import_sdk14.VENUES, disabledVenues),
13086
13335
  [disabledVenues]
13087
13336
  );
13088
- const [activeTabValue, setActiveTabValue] = (0, import_react22.useState)(
13337
+ const [activeTabValue, setActiveTabValue] = (0, import_react23.useState)(
13089
13338
  (_b = initialVenueTab != null ? initialVenueTab : (_a = resolvedTabs[0]) == null ? void 0 : _a.value) != null ? _b : "matched"
13090
13339
  );
13091
- const [selectedSort, setSelectedSort] = (0, import_react22.useState)("volume24hr");
13092
- const [isSubcategoriesModalOpen, setIsSubcategoriesModalOpen] = (0, import_react22.useState)(false);
13093
- const [categoryPath, setCategoryPath] = (0, import_react22.useState)([]);
13094
- const [collapsedCategoryIds, setCollapsedCategoryIds] = (0, import_react22.useState)(() => /* @__PURE__ */ new Set());
13095
- const sortItems = (0, import_react22.useMemo)(() => {
13340
+ const [selectedSort, setSelectedSort] = (0, import_react23.useState)("volume24hr");
13341
+ const [isSubcategoriesModalOpen, setIsSubcategoriesModalOpen] = (0, import_react23.useState)(false);
13342
+ const [categoryPath, setCategoryPath] = (0, import_react23.useState)([]);
13343
+ const [collapsedCategoryIds, setCollapsedCategoryIds] = (0, import_react23.useState)(() => /* @__PURE__ */ new Set());
13344
+ const sortItems = (0, import_react23.useMemo)(() => {
13096
13345
  return [
13097
13346
  {
13098
13347
  value: "volume24hr",
13099
13348
  label: labels.eventList.sortBy24hVolume,
13100
- icon: /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(Icon, { name: SORT_ICON_BY_VALUE.volume24hr, size: "small", color: "currentColor" })
13349
+ icon: /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(Icon, { name: SORT_ICON_BY_VALUE.volume24hr, size: "small", color: "currentColor" })
13101
13350
  },
13102
13351
  {
13103
13352
  value: "topArbitrage",
13104
13353
  label: labels.eventList.sortByTopArbitrage,
13105
- icon: /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(Icon, { name: SORT_ICON_BY_VALUE.topArbitrage, size: "small", color: "currentColor" })
13354
+ icon: /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(Icon, { name: SORT_ICON_BY_VALUE.topArbitrage, size: "small", color: "currentColor" })
13106
13355
  },
13107
13356
  {
13108
13357
  value: "volume",
13109
13358
  label: labels.eventList.sortByTotalVolume,
13110
- icon: /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(Icon, { name: SORT_ICON_BY_VALUE.volume, size: "small", color: "currentColor" })
13359
+ icon: /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(Icon, { name: SORT_ICON_BY_VALUE.volume, size: "small", color: "currentColor" })
13111
13360
  },
13112
13361
  {
13113
13362
  value: "endDate",
13114
13363
  label: labels.eventList.sortByEndingSoon,
13115
- icon: /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(Icon, { name: SORT_ICON_BY_VALUE.endDate, size: "small", color: "currentColor" })
13364
+ icon: /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(Icon, { name: SORT_ICON_BY_VALUE.endDate, size: "small", color: "currentColor" })
13116
13365
  }
13117
13366
  ];
13118
13367
  }, [
@@ -13122,20 +13371,20 @@ var EventList = ({
13122
13371
  labels.eventList.sortByTotalVolume
13123
13372
  ]);
13124
13373
  const baseCategoryId = (_c = categoryIds == null ? void 0 : categoryIds[0]) != null ? _c : null;
13125
- (0, import_react22.useEffect)(() => {
13374
+ (0, import_react23.useEffect)(() => {
13126
13375
  if (!isDiscoveryFiltersEnabled) return;
13127
13376
  setCategoryPath([]);
13128
13377
  setCollapsedCategoryIds(/* @__PURE__ */ new Set());
13129
13378
  }, [baseCategoryId, isDiscoveryFiltersEnabled]);
13130
- const { categories: topLevelCategories } = (0, import_hooks44.useCategories)({
13379
+ const { categories: topLevelCategories } = (0, import_hooks45.useCategories)({
13131
13380
  queryKeyScope: "event-list-top-categories",
13132
13381
  enabled: isDiscoveryFiltersEnabled,
13133
13382
  limit: 100
13134
13383
  });
13135
- const sortedTopLevelCategories = (0, import_react22.useMemo)(() => {
13384
+ const sortedTopLevelCategories = (0, import_react23.useMemo)(() => {
13136
13385
  return sortCategoriesForNavigation(topLevelCategories);
13137
13386
  }, [topLevelCategories]);
13138
- const baseCategoryChildPrefetchIds = (0, import_react22.useMemo)(() => {
13387
+ const baseCategoryChildPrefetchIds = (0, import_react23.useMemo)(() => {
13139
13388
  return Array.from(
13140
13389
  /* @__PURE__ */ new Set([
13141
13390
  ...sortedTopLevelCategories.map((category) => category.id),
@@ -13143,13 +13392,13 @@ var EventList = ({
13143
13392
  ])
13144
13393
  );
13145
13394
  }, [categoryPath, sortedTopLevelCategories]);
13146
- const { childrenByParentId: baseChildrenByParentId } = (0, import_hooks44.useCategoryChildren)({
13395
+ const { childrenByParentId: baseChildrenByParentId } = (0, import_hooks45.useCategoryChildren)({
13147
13396
  queryKeyScope: "event-list-category-children",
13148
13397
  enabled: isDiscoveryFiltersEnabled,
13149
13398
  parentIds: baseCategoryChildPrefetchIds,
13150
13399
  limit: 100
13151
13400
  });
13152
- const visibleChildPrefetchIds = (0, import_react22.useMemo)(() => {
13401
+ const visibleChildPrefetchIds = (0, import_react23.useMemo)(() => {
13153
13402
  var _a2, _b2;
13154
13403
  const ids = /* @__PURE__ */ new Set();
13155
13404
  if (baseCategoryId) {
@@ -13164,13 +13413,13 @@ var EventList = ({
13164
13413
  }
13165
13414
  return Array.from(ids);
13166
13415
  }, [baseCategoryId, baseChildrenByParentId, categoryPath]);
13167
- const { childrenByParentId: visibleChildrenByParentId } = (0, import_hooks44.useCategoryChildren)({
13416
+ const { childrenByParentId: visibleChildrenByParentId } = (0, import_hooks45.useCategoryChildren)({
13168
13417
  queryKeyScope: "event-list-category-children",
13169
13418
  enabled: isDiscoveryFiltersEnabled,
13170
13419
  parentIds: visibleChildPrefetchIds,
13171
13420
  limit: 100
13172
13421
  });
13173
- const visibleGrandchildPrefetchIds = (0, import_react22.useMemo)(() => {
13422
+ const visibleGrandchildPrefetchIds = (0, import_react23.useMemo)(() => {
13174
13423
  var _a2;
13175
13424
  const ids = /* @__PURE__ */ new Set();
13176
13425
  for (const expandedCategory of categoryPath) {
@@ -13180,13 +13429,13 @@ var EventList = ({
13180
13429
  }
13181
13430
  return Array.from(ids);
13182
13431
  }, [categoryPath, visibleChildrenByParentId]);
13183
- const { childrenByParentId: visibleGrandchildrenByParentId } = (0, import_hooks44.useCategoryChildren)({
13432
+ const { childrenByParentId: visibleGrandchildrenByParentId } = (0, import_hooks45.useCategoryChildren)({
13184
13433
  queryKeyScope: "event-list-category-children",
13185
13434
  enabled: isDiscoveryFiltersEnabled,
13186
13435
  parentIds: visibleGrandchildPrefetchIds,
13187
13436
  limit: 100
13188
13437
  });
13189
- const childrenByParentId = (0, import_react22.useMemo)(() => {
13438
+ const childrenByParentId = (0, import_react23.useMemo)(() => {
13190
13439
  return new Map([
13191
13440
  ...baseChildrenByParentId,
13192
13441
  ...visibleChildrenByParentId,
@@ -13194,33 +13443,33 @@ var EventList = ({
13194
13443
  ]);
13195
13444
  }, [baseChildrenByParentId, visibleChildrenByParentId, visibleGrandchildrenByParentId]);
13196
13445
  const shouldRenderSubcategoryFilters = isDiscoveryFiltersEnabled && baseCategoryId !== null && (((_e = (_d = childrenByParentId.get(baseCategoryId)) == null ? void 0 : _d.length) != null ? _e : 0) > 0 || categoryPath.length > 0);
13197
- const baseCategoryEventCount = (0, import_react22.useMemo)(() => {
13446
+ const baseCategoryEventCount = (0, import_react23.useMemo)(() => {
13198
13447
  var _a2, _b2;
13199
13448
  return (_b2 = (_a2 = sortedTopLevelCategories.find((c) => c.id === baseCategoryId)) == null ? void 0 : _a2.eventCount) != null ? _b2 : 0;
13200
13449
  }, [baseCategoryId, sortedTopLevelCategories]);
13201
- const resolvedCategoryIds = (0, import_react22.useMemo)(() => {
13450
+ const resolvedCategoryIds = (0, import_react23.useMemo)(() => {
13202
13451
  if (!isDiscoveryFiltersEnabled) return categoryIds;
13203
13452
  return resolveCategoryIdsFromPath(categoryPath, baseCategoryId ? [baseCategoryId] : void 0);
13204
13453
  }, [baseCategoryId, categoryIds, categoryPath, isDiscoveryFiltersEnabled]);
13205
- const sortQueryParams = (0, import_react22.useMemo)(() => {
13454
+ const sortQueryParams = (0, import_react23.useMemo)(() => {
13206
13455
  return resolveSortQueryParams(selectedSort);
13207
13456
  }, [selectedSort]);
13208
- const activeTab = (0, import_react22.useMemo)(() => {
13457
+ const activeTab = (0, import_react23.useMemo)(() => {
13209
13458
  return resolvedTabs.find((tab) => tab.value === activeTabValue);
13210
13459
  }, [activeTabValue, resolvedTabs]);
13211
- const venues = (0, import_react22.useMemo)(() => {
13460
+ const venues = (0, import_react23.useMemo)(() => {
13212
13461
  return resolveTabVenus(activeTab, visibleVenues);
13213
13462
  }, [activeTab, visibleVenues]);
13214
- const matchStatus = (0, import_react22.useMemo)(() => {
13463
+ const matchStatus = (0, import_react23.useMemo)(() => {
13215
13464
  return activeTabValue === "matched" ? activeTab == null ? void 0 : activeTab.matchStatus : void 0;
13216
13465
  }, [activeTabValue, activeTab]);
13217
- const resolvedMaxVisibleItems = (0, import_react22.useMemo)(() => {
13466
+ const resolvedMaxVisibleItems = (0, import_react23.useMemo)(() => {
13218
13467
  if (!Number.isFinite(maxVisibleItems)) return void 0;
13219
13468
  return Math.max(1, Math.floor(maxVisibleItems));
13220
13469
  }, [maxVisibleItems]);
13221
13470
  const requestLimit = resolvedMaxVisibleItems != null ? resolvedMaxVisibleItems : limit;
13222
13471
  const shouldPaginate = resolvedMaxVisibleItems == null;
13223
- const endDateFrom = (0, import_react22.useMemo)(() => {
13472
+ const endDateFrom = (0, import_react23.useMemo)(() => {
13224
13473
  if (search) return void 0;
13225
13474
  const BUCKET_MINUTES = 5;
13226
13475
  const bucket = /* @__PURE__ */ new Date();
@@ -13236,34 +13485,38 @@ var EventList = ({
13236
13485
  isFetchingNextPage,
13237
13486
  isPlaceholderData,
13238
13487
  loadedPageCount
13239
- } = (0, import_hooks44.useVenueEvents)({
13488
+ } = (0, import_hooks45.useVenueEvents)({
13240
13489
  queryKeyScope: "event-list",
13241
13490
  venues,
13242
13491
  search,
13243
13492
  categoryIds: resolvedCategoryIds,
13244
13493
  matchStatus,
13245
13494
  limit: requestLimit,
13246
- status: [import_hooks44.MarketStatus.open],
13495
+ status: [import_hooks45.MarketStatus.open],
13247
13496
  sortBy: sortQueryParams.sortBy,
13248
13497
  sortDir: sortQueryParams.sortDir,
13249
13498
  endDateFrom,
13499
+ // Fold same-venue companion events into one tile per game when the sports
13500
+ // markets experience is enabled (the sports event-detail view loads the
13501
+ // folded companions via aggKey). Gated on the same flag as that view.
13502
+ grouped: showSportsMarkets,
13250
13503
  initialPages: initialLoadedPageCount
13251
13504
  });
13252
- (0, import_react22.useEffect)(() => {
13505
+ (0, import_react23.useEffect)(() => {
13253
13506
  if (stateRef) {
13254
13507
  stateRef.current = { venueTab: activeTabValue, loadedPageCount };
13255
13508
  }
13256
13509
  }, [stateRef, activeTabValue, loadedPageCount]);
13257
- const filteredEvents = (0, import_react22.useMemo)(() => {
13510
+ const filteredEvents = (0, import_react23.useMemo)(() => {
13258
13511
  return filterEventsByTabValue(events, activeTabValue);
13259
13512
  }, [events, activeTabValue]);
13260
- const groupedEvents = (0, import_react22.useMemo)(() => {
13513
+ const groupedEvents = (0, import_react23.useMemo)(() => {
13261
13514
  return splitEventsByLifecycle(filteredEvents);
13262
13515
  }, [filteredEvents]);
13263
- const orderedEvents = (0, import_react22.useMemo)(() => {
13516
+ const orderedEvents = (0, import_react23.useMemo)(() => {
13264
13517
  return groupedEvents.open;
13265
13518
  }, [groupedEvents.open]);
13266
- const tileEvents = (0, import_react22.useMemo)(() => {
13519
+ const tileEvents = (0, import_react23.useMemo)(() => {
13267
13520
  const normalizedEvents = orderedEvents.map((event) => mapEventToEventListItemEvent(event)).filter((event) => event != null);
13268
13521
  if (resolvedMaxVisibleItems == null) return normalizedEvents;
13269
13522
  return normalizedEvents.slice(0, resolvedMaxVisibleItems);
@@ -13271,8 +13524,8 @@ var EventList = ({
13271
13524
  const shouldRenderLoadingState = isLoading && !isPlaceholderData && tileEvents.length === 0;
13272
13525
  const shouldRenderEmptyState = !isLoading && !isError && tileEvents.length === 0;
13273
13526
  const shouldRenderPaginationLoadingItems = shouldPaginate && hasNextPage;
13274
- const loadMoreRef = (0, import_react22.useRef)(null);
13275
- (0, import_react22.useEffect)(() => {
13527
+ const loadMoreRef = (0, import_react23.useRef)(null);
13528
+ (0, import_react23.useEffect)(() => {
13276
13529
  if (!shouldPaginate) return;
13277
13530
  if (!hasNextPage) return;
13278
13531
  if (typeof IntersectionObserver === "undefined") return;
@@ -13323,7 +13576,7 @@ var EventList = ({
13323
13576
  onCategoryRootChange == null ? void 0 : onCategoryRootChange(baseCategoryId != null ? baseCategoryId : void 0);
13324
13577
  };
13325
13578
  if (shouldRenderLoadingState) {
13326
- return /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(
13579
+ return /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(
13327
13580
  Skeleton,
13328
13581
  {
13329
13582
  view: "event-list",
@@ -13332,8 +13585,8 @@ var EventList = ({
13332
13585
  }
13333
13586
  );
13334
13587
  }
13335
- return /* @__PURE__ */ (0, import_jsx_runtime132.jsxs)("section", { className: "agg-event-list flex w-full flex-col gap-2 md:gap-5 t", children: [
13336
- /* @__PURE__ */ (0, import_jsx_runtime132.jsxs)(
13588
+ return /* @__PURE__ */ (0, import_jsx_runtime133.jsxs)("section", { className: "agg-event-list flex w-full flex-col gap-2 md:gap-5 t", children: [
13589
+ /* @__PURE__ */ (0, import_jsx_runtime133.jsxs)(
13337
13590
  "header",
13338
13591
  {
13339
13592
  className: cn(
@@ -13342,9 +13595,9 @@ var EventList = ({
13342
13595
  "gap-2 sm:flex-row sm:items-center sm:gap-4"
13343
13596
  ),
13344
13597
  children: [
13345
- /* @__PURE__ */ (0, import_jsx_runtime132.jsx)("div", { className: "agg-event-list-title min-w-32", children: /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(Typography, { as: "h2", variant: "title", className: "truncate first-letter:uppercase", children: title2 }) }),
13346
- /* @__PURE__ */ (0, import_jsx_runtime132.jsxs)("div", { className: "hidden min-w-0 max-w-full items-center gap-3 md:flex", children: [
13347
- /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(
13598
+ /* @__PURE__ */ (0, import_jsx_runtime133.jsx)("div", { className: "agg-event-list-title min-w-32", children: /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(Typography, { as: "h2", variant: "title", className: "truncate first-letter:uppercase", children: title2 }) }),
13599
+ /* @__PURE__ */ (0, import_jsx_runtime133.jsxs)("div", { className: "hidden min-w-0 max-w-full items-center gap-3 md:flex", children: [
13600
+ /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(
13348
13601
  EventListTabs,
13349
13602
  {
13350
13603
  ariaLabel: labels.eventList.tabsAria(title2),
@@ -13354,7 +13607,7 @@ var EventList = ({
13354
13607
  overflowBehavior: "scroll"
13355
13608
  }
13356
13609
  ),
13357
- /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(
13610
+ /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(
13358
13611
  Select,
13359
13612
  {
13360
13613
  ariaLabel: labels.eventList.sortByLabel,
@@ -13370,8 +13623,8 @@ var EventList = ({
13370
13623
  ]
13371
13624
  }
13372
13625
  ),
13373
- /* @__PURE__ */ (0, import_jsx_runtime132.jsxs)("div", { className: "flex w-full gap-2 md:hidden mb-3", children: [
13374
- /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(
13626
+ /* @__PURE__ */ (0, import_jsx_runtime133.jsxs)("div", { className: "flex w-full gap-2 md:hidden mb-3", children: [
13627
+ /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(
13375
13628
  EventListTabs,
13376
13629
  {
13377
13630
  ariaLabel: labels.eventList.tabsAria(title2),
@@ -13381,7 +13634,7 @@ var EventList = ({
13381
13634
  overflowBehavior: "select"
13382
13635
  }
13383
13636
  ),
13384
- /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(
13637
+ /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(
13385
13638
  Select,
13386
13639
  {
13387
13640
  ariaLabel: labels.eventList.sortByLabel,
@@ -13392,23 +13645,23 @@ var EventList = ({
13392
13645
  contentClassName: "rounded-[12px] py-2 shadow-[0_8px_16px_rgba(0,0,0,0.1)]"
13393
13646
  }
13394
13647
  ),
13395
- shouldRenderSubcategoryFilters ? /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(
13648
+ shouldRenderSubcategoryFilters ? /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(
13396
13649
  "button",
13397
13650
  {
13398
13651
  type: "button",
13399
13652
  className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-[8px] border-2 border-agg-primary bg-agg-secondary text-agg-foreground cursor-pointer",
13400
13653
  "aria-label": labels.eventList.subcategoriesOpenAria,
13401
13654
  onClick: () => setIsSubcategoriesModalOpen(true),
13402
- children: /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(Icon, { name: "apps", size: "small", color: "currentColor" })
13655
+ children: /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(Icon, { name: "apps", size: "small", color: "currentColor" })
13403
13656
  }
13404
13657
  ) : null
13405
13658
  ] }),
13406
- /* @__PURE__ */ (0, import_jsx_runtime132.jsxs)(
13659
+ /* @__PURE__ */ (0, import_jsx_runtime133.jsxs)(
13407
13660
  "div",
13408
13661
  {
13409
13662
  className: cn("flex w-full gap-6", shouldRenderSubcategoryFilters ? "md:items-start" : ""),
13410
13663
  children: [
13411
- shouldRenderSubcategoryFilters ? /* @__PURE__ */ (0, import_jsx_runtime132.jsx)("aside", { className: "hidden w-[200px] shrink-0 md:block self-start sticky top-4", children: /* @__PURE__ */ (0, import_jsx_runtime132.jsx)("div", { className: "agg-sidebar max-h-[calc(100vh-19rem)] overflow-y-auto rounded-[8px] border border-agg-separator bg-agg-secondary p-2", children: /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(
13664
+ shouldRenderSubcategoryFilters ? /* @__PURE__ */ (0, import_jsx_runtime133.jsx)("aside", { className: "hidden w-[200px] shrink-0 md:block self-start sticky top-4", children: /* @__PURE__ */ (0, import_jsx_runtime133.jsx)("div", { className: "agg-sidebar max-h-[calc(100vh-19rem)] overflow-y-auto rounded-[8px] border border-agg-separator bg-agg-secondary p-2", children: /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(
13412
13665
  CategorySidebar,
13413
13666
  {
13414
13667
  baseCategoryId,
@@ -13421,7 +13674,7 @@ var EventList = ({
13421
13674
  onToggleCategory: handleToggleSubcategory
13422
13675
  }
13423
13676
  ) }) }) : null,
13424
- /* @__PURE__ */ (0, import_jsx_runtime132.jsxs)(
13677
+ /* @__PURE__ */ (0, import_jsx_runtime133.jsxs)(
13425
13678
  "div",
13426
13679
  {
13427
13680
  className: cn(
@@ -13432,7 +13685,7 @@ var EventList = ({
13432
13685
  gridClassName
13433
13686
  ),
13434
13687
  children: [
13435
- tileEvents.map((event) => /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(
13688
+ tileEvents.map((event) => /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(
13436
13689
  EventListItem,
13437
13690
  {
13438
13691
  event,
@@ -13443,11 +13696,11 @@ var EventList = ({
13443
13696
  onMarketClick,
13444
13697
  getMarketHref,
13445
13698
  href: getEventHref == null ? void 0 : getEventHref(event),
13446
- marketStatus: import_hooks44.MarketStatus.open
13699
+ marketStatus: import_hooks45.MarketStatus.open
13447
13700
  },
13448
13701
  event.id
13449
13702
  )),
13450
- shouldRenderPaginationLoadingItems ? Array.from({ length: 6 }).map((_, index) => /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(
13703
+ shouldRenderPaginationLoadingItems ? Array.from({ length: 6 }).map((_, index) => /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(
13451
13704
  EventListItem,
13452
13705
  {
13453
13706
  isLoading: true,
@@ -13457,20 +13710,20 @@ var EventList = ({
13457
13710
  },
13458
13711
  `loading-${index}`
13459
13712
  )) : null,
13460
- shouldRenderEmptyState ? /* @__PURE__ */ (0, import_jsx_runtime132.jsx)("div", { className: "col-span-full w-full", children: /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(
13713
+ shouldRenderEmptyState ? /* @__PURE__ */ (0, import_jsx_runtime133.jsx)("div", { className: "col-span-full w-full", children: /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(
13461
13714
  StateMessage,
13462
13715
  {
13463
13716
  title: labels.eventList.emptyTitle,
13464
13717
  description: labels.eventList.emptyDescription,
13465
- icon: /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(Icon, { name: "search-empty" })
13718
+ icon: /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(Icon, { name: "search-empty" })
13466
13719
  }
13467
13720
  ) }) : null,
13468
- isError ? /* @__PURE__ */ (0, import_jsx_runtime132.jsx)("div", { className: "col-span-full w-full", children: /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(
13721
+ isError ? /* @__PURE__ */ (0, import_jsx_runtime133.jsx)("div", { className: "col-span-full w-full", children: /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(
13469
13722
  StateMessage,
13470
13723
  {
13471
13724
  title: labels.eventList.errorTitle,
13472
13725
  description: labels.eventList.errorDescription,
13473
- icon: /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(Icon, { name: "warning" })
13726
+ icon: /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(Icon, { name: "warning" })
13474
13727
  }
13475
13728
  ) }) : null
13476
13729
  ]
@@ -13479,7 +13732,7 @@ var EventList = ({
13479
13732
  ]
13480
13733
  }
13481
13734
  ),
13482
- shouldRenderSubcategoryFilters ? /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(Modal, { open: isSubcategoriesModalOpen, onOpenChange: setIsSubcategoriesModalOpen, children: /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(
13735
+ shouldRenderSubcategoryFilters ? /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(Modal, { open: isSubcategoriesModalOpen, onOpenChange: setIsSubcategoriesModalOpen, children: /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(
13483
13736
  Modal.Container,
13484
13737
  {
13485
13738
  classNames: {
@@ -13488,20 +13741,20 @@ var EventList = ({
13488
13741
  content: "items-end p-0 pointer-events-none",
13489
13742
  container: "w-full max-w-none border-0 bg-transparent shadow-none"
13490
13743
  },
13491
- children: /* @__PURE__ */ (0, import_jsx_runtime132.jsxs)("div", { className: "pointer-events-auto w-full rounded-t-[12px] border border-agg-separator bg-agg-secondary", children: [
13492
- /* @__PURE__ */ (0, import_jsx_runtime132.jsx)("div", { className: "flex justify-center pb-1 pt-3", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime132.jsx)("div", { className: "h-1 w-10 rounded-full bg-agg-muted-foreground/30" }) }),
13493
- /* @__PURE__ */ (0, import_jsx_runtime132.jsxs)("div", { className: "flex items-center justify-between px-4 pb-2 pt-1", children: [
13494
- /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(Dialog2.Title, { className: "text-agg-sm font-agg-bold leading-agg-5 text-agg-foreground", children: labels.eventList.subcategoriesLabel }),
13495
- /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(
13744
+ children: /* @__PURE__ */ (0, import_jsx_runtime133.jsxs)("div", { className: "pointer-events-auto w-full rounded-t-[12px] border border-agg-separator bg-agg-secondary", children: [
13745
+ /* @__PURE__ */ (0, import_jsx_runtime133.jsx)("div", { className: "flex justify-center pb-1 pt-3", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime133.jsx)("div", { className: "h-1 w-10 rounded-full bg-agg-muted-foreground/30" }) }),
13746
+ /* @__PURE__ */ (0, import_jsx_runtime133.jsxs)("div", { className: "flex items-center justify-between px-4 pb-2 pt-1", children: [
13747
+ /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(Dialog2.Title, { className: "text-agg-sm font-agg-bold leading-agg-5 text-agg-foreground", children: labels.eventList.subcategoriesLabel }),
13748
+ /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(
13496
13749
  Dialog2.Close,
13497
13750
  {
13498
13751
  className: "flex cursor-pointer items-center justify-center rounded-full p-1 text-agg-muted-foreground hover:bg-agg-secondary-hover",
13499
13752
  "aria-label": labels.common.close,
13500
- children: /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(CloseIcon, { className: "h-5 w-5" })
13753
+ children: /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(CloseIcon, { className: "h-5 w-5" })
13501
13754
  }
13502
13755
  )
13503
13756
  ] }),
13504
- /* @__PURE__ */ (0, import_jsx_runtime132.jsx)("div", { className: "flex flex-col gap-1 px-4 pb-4", children: /* @__PURE__ */ (0, import_jsx_runtime132.jsx)(
13757
+ /* @__PURE__ */ (0, import_jsx_runtime133.jsx)("div", { className: "flex flex-col gap-1 px-4 pb-4", children: /* @__PURE__ */ (0, import_jsx_runtime133.jsx)(
13505
13758
  CategorySidebar,
13506
13759
  {
13507
13760
  baseCategoryId,
@@ -13517,7 +13770,7 @@ var EventList = ({
13517
13770
  ] })
13518
13771
  }
13519
13772
  ) }) : null,
13520
- shouldPaginate && hasNextPage ? /* @__PURE__ */ (0, import_jsx_runtime132.jsx)("div", { ref: loadMoreRef, className: "agg-event-list-sentinel h-px w-full", "aria-hidden": true }) : null
13773
+ shouldPaginate && hasNextPage ? /* @__PURE__ */ (0, import_jsx_runtime133.jsx)("div", { ref: loadMoreRef, className: "agg-event-list-sentinel h-px w-full", "aria-hidden": true }) : null
13521
13774
  ] });
13522
13775
  };
13523
13776
  EventList.displayName = "EventList";
@@ -13537,6 +13790,7 @@ EventList.displayName = "EventList";
13537
13790
  formatProbabilityCents,
13538
13791
  mergeVenueOutcomeOrderbooks,
13539
13792
  orderbookRowLimitDefault,
13793
+ resolveEventDetailsSyncKey,
13540
13794
  resolveOrderBookRows,
13541
13795
  resolveUnifiedOrderBookEntries,
13542
13796
  useCenterOrderbookSpread