@agg-build/ui 4.21.0 → 4.21.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -16558,71 +16558,39 @@ var init_event_chart_window = __esm({
16558
16558
  });
16559
16559
 
16560
16560
  // src/events/item-details/event-markets-chart.utils.ts
16561
- function resolveEventChartSelectedOutcome(markets, venue, selectedOutcomeId) {
16562
- var _a, _b;
16563
- if (!selectedOutcomeId) return null;
16564
- const allMarkets = normalizeVenueMarketCluster(markets);
16565
- const market = allMarkets.find(
16566
- (item) => item.venueMarketOutcomes.some((outcome2) => outcome2.id === selectedOutcomeId)
16567
- );
16568
- const outcome = market == null ? void 0 : market.venueMarketOutcomes.find((item) => item.id === selectedOutcomeId);
16569
- if (!market || !outcome) return null;
16570
- return (_b = (_a = collectEligibleVenueOutcomes({
16571
- venueMarkets: normalizeVenueMarketCluster(markets, market.id),
16572
- selectedOutcomeLabel: outcome.label,
16573
- selectedOutcomeId
16574
- }).find((item) => item.venue === venue)) == null ? void 0 : _a.outcomeId) != null ? _b : null;
16575
- }
16576
- function resolveEventChartPage(outcomes, selectedOutcomeId, requestedPage) {
16577
- var _a;
16578
- const pinned = outcomes.find((outcome) => outcome.id === selectedOutcomeId);
16579
- const remaining = outcomes.filter((outcome) => outcome.id !== (pinned == null ? void 0 : pinned.id));
16580
- const pageSize = EVENT_CHART_SERIES_LIMIT - (pinned ? 1 : 0);
16581
- const pageCount = Math.max(1, Math.ceil(remaining.length / pageSize));
16582
- const page = Math.max(0, Math.min(requestedPage, pageCount - 1));
16583
- return {
16584
- page,
16585
- pageCount,
16586
- pinnedId: (_a = pinned == null ? void 0 : pinned.id) != null ? _a : null,
16587
- outcomes: [
16588
- ...pinned ? [pinned] : [],
16589
- ...remaining.slice(page * pageSize, (page + 1) * pageSize)
16590
- ]
16591
- };
16592
- }
16593
- var import_hooks57, EVENT_CHART_SERIES_LIMIT, resolveEventChartOutcomes;
16561
+ var import_hooks57, EVENT_CHART_MARKET_LIMIT, marketVolume, resolveTopEventChartMarkets, resolveEventChartOutcomes;
16594
16562
  var init_event_markets_chart_utils = __esm({
16595
16563
  "src/events/item-details/event-markets-chart.utils.ts"() {
16596
16564
  "use strict";
16597
16565
  import_hooks57 = require("@agg-build/hooks");
16598
16566
  init_venue_market_cluster();
16599
- init_orderbook_aggregation();
16600
- EVENT_CHART_SERIES_LIMIT = 8;
16601
- resolveEventChartOutcomes = (markets, venue, eventEndDate) => normalizeVenueMarketCluster(markets).filter((market) => market.venue === venue).sort(
16602
- (left, right) => {
16603
- var _a, _b;
16604
- return ((_a = right.volume) != null ? _a : 0) - ((_b = left.volume) != null ? _b : 0) || left.id.localeCompare(right.id);
16605
- }
16606
- ).flatMap((market) => {
16567
+ init_event_list_item_details_utils();
16568
+ EVENT_CHART_MARKET_LIMIT = 3;
16569
+ marketVolume = (market) => {
16570
+ var _a;
16571
+ return Number.isFinite(market.volume) ? Math.max(0, (_a = market.volume) != null ? _a : 0) : 0;
16572
+ };
16573
+ resolveTopEventChartMarkets = (markets, venue) => normalizeVenueMarketCluster(markets).filter((market) => market.venue === venue && market.venueMarketOutcomes.length > 0).sort(
16574
+ (left, right) => marketVolume(right) - marketVolume(left) || left.id.localeCompare(right.id)
16575
+ ).slice(0, EVENT_CHART_MARKET_LIMIT);
16576
+ resolveEventChartOutcomes = (markets, venue, eventEndDate) => resolveTopEventChartMarkets(markets, venue).flatMap((market) => {
16607
16577
  var _a, _b, _c;
16608
16578
  const state = (0, import_hooks57.resolveMarketTradingState)(market);
16609
16579
  const hasFinalResult = state.kind === "resolved" && market.venueMarketOutcomes.some((outcome) => outcome.winner === true) && market.venueMarketOutcomes.every((outcome) => outcome.winner != null);
16610
16580
  const settledAt = Date.parse((_c = (_b = (_a = market.resolutionDate) != null ? _a : market.endDate) != null ? _b : eventEndDate) != null ? _c : "") / 1e3;
16611
- const ordered = [...market.venueMarketOutcomes].sort((a, b) => {
16612
- const rank = (label2) => label2.trim().toLowerCase() === "yes" ? 0 : label2.trim().toLowerCase() === "no" ? 1 : 2;
16613
- return rank(a.label) - rank(b.label);
16614
- });
16581
+ const ordered = sortOutcomeSelectorOutcomes(market.venueMarketOutcomes);
16615
16582
  return ordered.map((outcome) => {
16616
- var _a2;
16583
+ var _a2, _b2;
16617
16584
  return {
16618
16585
  id: outcome.id,
16619
16586
  marketId: market.id,
16620
16587
  venue: market.venue,
16621
16588
  side: outcome.label,
16589
+ outcomeLabel: ((_a2 = outcome.title) == null ? void 0 : _a2.trim()) || outcome.label,
16622
16590
  live: !state.isTradingDisabled,
16623
16591
  finalValue: hasFinalResult ? outcome.winner ? 100 : 0 : void 0,
16624
16592
  settledAt: Number.isFinite(settledAt) ? settledAt : void 0,
16625
- label: `${market.question} \xB7 ${((_a2 = outcome.title) == null ? void 0 : _a2.trim()) || outcome.label}`
16593
+ label: `${market.question} \xB7 ${((_b2 = outcome.title) == null ? void 0 : _b2.trim()) || outcome.label}`
16626
16594
  };
16627
16595
  });
16628
16596
  });
@@ -16638,8 +16606,8 @@ var init_event_markets_chart = __esm({
16638
16606
  import_react30 = require("react");
16639
16607
  import_hooks58 = require("@agg-build/hooks");
16640
16608
  init_chart();
16641
- init_button();
16642
- init_icon();
16609
+ init_badge();
16610
+ init_venue_logo();
16643
16611
  init_chart_utils();
16644
16612
  init_venue_market_cluster();
16645
16613
  init_event_list_item_details_utils();
@@ -16652,8 +16620,7 @@ var init_event_markets_chart = __esm({
16652
16620
  eventEndDate,
16653
16621
  contractWindow,
16654
16622
  range,
16655
- live,
16656
- selectedOutcomeId
16623
+ live
16657
16624
  }) => {
16658
16625
  var _a, _b, _c, _d, _e, _f, _g;
16659
16626
  const labels = (0, import_hooks58.useLabels)();
@@ -16665,31 +16632,20 @@ var init_event_markets_chart = __esm({
16665
16632
  () => [...new Set(normalizeVenueMarketCluster(markets).map((market) => market.venue))],
16666
16633
  [markets]
16667
16634
  );
16668
- const venue = venues.includes(defaultVenue) ? defaultVenue : (_a = venues[0]) != null ? _a : defaultVenue;
16669
- const outcomes = (0, import_react30.useMemo)(
16670
- () => resolveEventChartOutcomes(markets, venue, eventEndDate),
16671
- [markets, venue, eventEndDate]
16672
- );
16673
16635
  const [selection, setSelection] = (0, import_react30.useState)(() => ({
16674
- venue,
16675
- page: 0,
16636
+ defaultVenue,
16637
+ venue: defaultVenue,
16676
16638
  hidden: /* @__PURE__ */ new Set()
16677
16639
  }));
16678
- const currentSelection = (0, import_react30.useMemo)(
16679
- () => selection.venue === venue ? selection : { venue, page: 0, hidden: /* @__PURE__ */ new Set() },
16680
- [selection, venue]
16681
- );
16682
- const pinnedOutcomeId = (0, import_react30.useMemo)(
16683
- () => resolveEventChartSelectedOutcome(markets, venue, selectedOutcomeId),
16684
- [markets, venue, selectedOutcomeId]
16685
- );
16686
- const page = (0, import_react30.useMemo)(
16687
- () => resolveEventChartPage(outcomes, pinnedOutcomeId, currentSelection.page),
16688
- [outcomes, pinnedOutcomeId, currentSelection.page]
16689
- );
16690
- const activeOutcomes = page.outcomes.filter(
16691
- (outcome) => outcome.id === page.pinnedId || !currentSelection.hidden.has(outcome.id)
16640
+ const requestedVenue = selection.defaultVenue === defaultVenue ? selection.venue : defaultVenue;
16641
+ const venue = venues.includes(requestedVenue) ? requestedVenue : (_a = venues[0]) != null ? _a : defaultVenue;
16642
+ const hidden = selection.defaultVenue === defaultVenue && selection.venue === venue ? selection.hidden : /* @__PURE__ */ new Set();
16643
+ const topMarkets = (0, import_react30.useMemo)(() => resolveTopEventChartMarkets(markets, venue), [markets, venue]);
16644
+ const outcomes = (0, import_react30.useMemo)(
16645
+ () => resolveEventChartOutcomes(topMarkets, venue, eventEndDate),
16646
+ [topMarkets, venue, eventEndDate]
16692
16647
  );
16648
+ const activeOutcomes = outcomes.filter((outcome) => !hidden.has(outcome.id));
16693
16649
  const activeIds = new Set(activeOutcomes.map((outcome) => outcome.id));
16694
16650
  const rollingWindow = (0, import_hooks58.useRollingChartWindow)({
16695
16651
  range,
@@ -16722,10 +16678,10 @@ var init_event_markets_chart = __esm({
16722
16678
  live: live && !windowEnded
16723
16679
  });
16724
16680
  const stableColorIds = (0, import_react30.useMemo)(
16725
- () => [...new Set(outcomes.map((outcome) => outcome.marketId))].sort(),
16726
- [outcomes]
16681
+ () => normalizeVenueMarketCluster(markets).filter((market) => market.venue === venue).map((market) => market.id).sort(),
16682
+ [markets, venue]
16727
16683
  );
16728
- const allSeries = page.outcomes.map((outcome) => {
16684
+ const allSeries = outcomes.map((outcome) => {
16729
16685
  var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h, _i;
16730
16686
  const settledAt = outcome.settledAt == null ? void 0 : contractWindow ? Math.min(outcome.settledAt, contractWindow.to) : outcome.settledAt;
16731
16687
  const outcomeLive = outcome.live && !windowEnded;
@@ -16761,110 +16717,109 @@ var init_event_markets_chart = __esm({
16761
16717
  });
16762
16718
  const visibleSeries = allSeries.filter((series) => activeIds.has(series.id));
16763
16719
  const hasVisibleHistory = visibleSeries.some((series) => series.points.length > 0);
16764
- const volume = (0, import_react30.useMemo)(
16765
- () => normalizeVenueMarketCluster(markets).filter((market) => market.venue === venue).reduce((sum, market) => {
16720
+ const volume = topMarkets.reduce(
16721
+ (sum, market) => {
16766
16722
  var _a2;
16767
- return sum + ((_a2 = market.volume) != null ? _a2 : 0);
16768
- }, 0),
16769
- [markets, venue]
16723
+ return sum + (Number.isFinite(market.volume) ? Math.max(0, (_a2 = market.volume) != null ? _a2 : 0) : 0);
16724
+ },
16725
+ 0
16770
16726
  );
16771
16727
  const venueLabel = (_g = labels.venues[venue]) != null ? _g : venue;
16772
16728
  return /* @__PURE__ */ (0, import_jsx_runtime161.jsxs)("div", { className: "agg-event-markets-chart flex flex-col gap-3", children: [
16773
- /* @__PURE__ */ (0, import_jsx_runtime161.jsxs)("div", { className: "flex flex-wrap items-center justify-between gap-2 text-agg-sm text-agg-muted-foreground", children: [
16774
- /* @__PURE__ */ (0, import_jsx_runtime161.jsx)("span", { role: "status", children: labels.eventItemDetails.comparisonSeriesCount(activeOutcomes.length, outcomes.length) }),
16775
- page.pageCount > 1 ? /* @__PURE__ */ (0, import_jsx_runtime161.jsxs)("div", { className: "flex items-center gap-2", children: [
16776
- /* @__PURE__ */ (0, import_jsx_runtime161.jsx)(
16777
- Button,
16778
- {
16779
- variant: "tertiary",
16780
- size: "small",
16781
- disabled: page.page === 0,
16782
- onClick: (event) => {
16783
- event.stopPropagation();
16784
- setSelection(__spreadProps(__spreadValues({}, currentSelection), { page: page.page - 1 }));
16785
- },
16786
- prefix: /* @__PURE__ */ (0, import_jsx_runtime161.jsx)(Icon, { name: "chevron-left", size: "small" }),
16787
- children: labels.eventItemDetails.comparisonPreviousSeries
16788
- }
16789
- ),
16790
- /* @__PURE__ */ (0, import_jsx_runtime161.jsx)("span", { children: labels.eventItemDetails.comparisonSeriesPage(page.page + 1, page.pageCount) }),
16791
- /* @__PURE__ */ (0, import_jsx_runtime161.jsx)(
16792
- Button,
16793
- {
16794
- variant: "tertiary",
16795
- size: "small",
16796
- disabled: page.page + 1 === page.pageCount,
16797
- onClick: (event) => {
16798
- event.stopPropagation();
16799
- setSelection(__spreadProps(__spreadValues({}, currentSelection), { page: page.page + 1 }));
16800
- },
16801
- suffix: /* @__PURE__ */ (0, import_jsx_runtime161.jsx)(Icon, { name: "chevron-right", size: "small" }),
16802
- children: labels.eventItemDetails.comparisonNextSeries
16803
- }
16804
- )
16805
- ] }) : null
16806
- ] }),
16807
- outcomes.length > EVENT_CHART_SERIES_LIMIT ? /* @__PURE__ */ (0, import_jsx_runtime161.jsx)("p", { className: "text-agg-xs text-agg-muted-foreground", children: labels.eventItemDetails.comparisonSeriesBudget(EVENT_CHART_SERIES_LIMIT) }) : null,
16729
+ /* @__PURE__ */ (0, import_jsx_runtime161.jsx)("div", { className: "agg-market-badges flex min-w-0 gap-2 overflow-x-auto pb-1 md:flex-wrap", children: venues.map((item) => {
16730
+ var _a2, _b2;
16731
+ return /* @__PURE__ */ (0, import_jsx_runtime161.jsx)(
16732
+ "button",
16733
+ {
16734
+ type: "button",
16735
+ "aria-label": (_a2 = labels.venues[item]) != null ? _a2 : item,
16736
+ "aria-pressed": venue === item,
16737
+ className: "agg-market-badge cursor-pointer rounded-agg-full focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-agg-primary",
16738
+ onClick: (event) => {
16739
+ event.preventDefault();
16740
+ event.stopPropagation();
16741
+ if (item !== venue) setSelection({ defaultVenue, venue: item, hidden: /* @__PURE__ */ new Set() });
16742
+ },
16743
+ children: /* @__PURE__ */ (0, import_jsx_runtime161.jsx)(
16744
+ Badge,
16745
+ {
16746
+ text: (_b2 = labels.venues[item]) != null ? _b2 : item,
16747
+ prefix: /* @__PURE__ */ (0, import_jsx_runtime161.jsx)(VenueLogo, { venue: item, size: "small", title: item }),
16748
+ size: "large",
16749
+ isActive: venue === item,
16750
+ classNames: { root: "shrink-0 border px-4 h-8 md:h-9" }
16751
+ }
16752
+ )
16753
+ },
16754
+ item
16755
+ );
16756
+ }) }),
16808
16757
  /* @__PURE__ */ (0, import_jsx_runtime161.jsx)(
16809
16758
  "div",
16810
16759
  {
16811
16760
  role: "group",
16812
16761
  "aria-label": labels.eventItemDetails.chartLegend,
16813
- className: "flex flex-wrap gap-x-5 gap-y-2",
16814
- children: allSeries.map((series) => /* @__PURE__ */ (0, import_jsx_runtime161.jsxs)(
16815
- "button",
16816
- {
16817
- type: "button",
16818
- "data-chart-outcome-id": series.id,
16819
- "aria-pressed": activeIds.has(series.id),
16820
- disabled: series.id === page.pinnedId,
16821
- onClick: (event) => {
16822
- event.stopPropagation();
16823
- setSelection(() => {
16824
- const next = new Set(currentSelection.hidden);
16825
- if (next.has(series.id)) next.delete(series.id);
16826
- else next.add(series.id);
16827
- return __spreadProps(__spreadValues({}, currentSelection), { hidden: next });
16828
- });
16762
+ className: "flex flex-col gap-2",
16763
+ children: topMarkets.map((market) => {
16764
+ var _a2;
16765
+ return /* @__PURE__ */ (0, import_jsx_runtime161.jsxs)(
16766
+ "div",
16767
+ {
16768
+ "data-chart-market-id": market.id,
16769
+ className: "flex min-w-0 flex-wrap items-center justify-between gap-x-4 gap-y-1",
16770
+ children: [
16771
+ /* @__PURE__ */ (0, import_jsx_runtime161.jsxs)("span", { className: "flex min-w-0 items-center gap-2 text-agg-sm text-agg-foreground", children: [
16772
+ /* @__PURE__ */ (0, import_jsx_runtime161.jsx)(
16773
+ "span",
16774
+ {
16775
+ "aria-hidden": "true",
16776
+ className: "h-0 w-4 shrink-0 border-t-2",
16777
+ style: {
16778
+ borderColor: (_a2 = allSeries.find((series) => series.marketId === market.id)) == null ? void 0 : _a2.color
16779
+ }
16780
+ }
16781
+ ),
16782
+ /* @__PURE__ */ (0, import_jsx_runtime161.jsx)("span", { className: "truncate", title: market.question, children: market.question })
16783
+ ] }),
16784
+ /* @__PURE__ */ (0, import_jsx_runtime161.jsx)("div", { className: "agg-outcome-switch flex max-w-full flex-wrap gap-1 rounded-agg-full bg-agg-secondary", children: allSeries.filter((series) => series.marketId === market.id).map((series) => {
16785
+ const value = !activeIds.has(series.id) ? labels.eventItemDetails.comparisonHiddenSeries : series.pending ? labels.common.loading : series.points.length === 0 ? labels.eventItemDetails.marketHistoryUnavailable : formatDefaultChartValue(
16786
+ series.current != null ? series.current * 100 : series.points.at(-1).value
16787
+ );
16788
+ return /* @__PURE__ */ (0, import_jsx_runtime161.jsx)(
16789
+ "button",
16790
+ {
16791
+ type: "button",
16792
+ "data-chart-outcome-id": series.id,
16793
+ "aria-label": `${series.label} ${value}`,
16794
+ "aria-pressed": activeIds.has(series.id),
16795
+ title: `${series.label} ${value}`,
16796
+ className: "cursor-pointer rounded-agg-full focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-agg-primary",
16797
+ onClick: (event) => {
16798
+ event.preventDefault();
16799
+ event.stopPropagation();
16800
+ const next = new Set(hidden);
16801
+ if (next.has(series.id)) next.delete(series.id);
16802
+ else next.add(series.id);
16803
+ setSelection({ defaultVenue, venue, hidden: next });
16804
+ },
16805
+ children: /* @__PURE__ */ (0, import_jsx_runtime161.jsx)(
16806
+ Badge,
16807
+ {
16808
+ text: `${series.outcomeLabel} ${value}`,
16809
+ size: "large",
16810
+ isActive: activeIds.has(series.id),
16811
+ classNames: { root: "h-8 w-36 border px-4 tabular-nums md:h-9" }
16812
+ }
16813
+ )
16814
+ },
16815
+ series.id
16816
+ );
16817
+ }) })
16818
+ ]
16829
16819
  },
16830
- className: "flex max-w-full cursor-pointer items-center gap-2 rounded-agg-sm py-1 text-agg-sm text-agg-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-agg-primary disabled:cursor-default disabled:opacity-50",
16831
- style: { opacity: activeIds.has(series.id) ? 1 : 0.4 },
16832
- children: [
16833
- /* @__PURE__ */ (0, import_jsx_runtime161.jsx)(
16834
- "span",
16835
- {
16836
- "aria-hidden": "true",
16837
- className: "h-0 w-4 shrink-0 border-t-2",
16838
- style: {
16839
- borderColor: series.color,
16840
- borderTopStyle: series.lineStyle === "dashed" ? "dashed" : "solid"
16841
- }
16842
- }
16843
- ),
16844
- /* @__PURE__ */ (0, import_jsx_runtime161.jsx)("span", { className: "min-w-0 text-left [overflow-wrap:anywhere]", children: series.label }),
16845
- series.id === page.pinnedId ? /* @__PURE__ */ (0, import_jsx_runtime161.jsx)("span", { children: labels.eventItemDetails.comparisonSelectedSeries }) : null,
16846
- /* @__PURE__ */ (0, import_jsx_runtime161.jsxs)("span", { className: "inline-grid shrink-0 items-center font-agg-semibold tabular-nums", children: [
16847
- [
16848
- formatDefaultChartValue(100),
16849
- formatDefaultChartValue(99.9),
16850
- labels.common.loading,
16851
- labels.eventItemDetails.comparisonHiddenSeries,
16852
- labels.eventItemDetails.marketHistoryUnavailable
16853
- ].map((value, index) => /* @__PURE__ */ (0, import_jsx_runtime161.jsx)(
16854
- "span",
16855
- {
16856
- "aria-hidden": "true",
16857
- className: "invisible col-start-1 row-start-1 select-none",
16858
- children: value
16859
- },
16860
- index
16861
- )),
16862
- /* @__PURE__ */ (0, import_jsx_runtime161.jsx)("span", { className: "col-start-1 row-start-1", children: !activeIds.has(series.id) ? labels.eventItemDetails.comparisonHiddenSeries : series.pending ? labels.common.loading : series.points.length === 0 ? labels.eventItemDetails.marketHistoryUnavailable : series.current != null ? formatDefaultChartValue(series.current * 100) : formatDefaultChartValue(series.points.at(-1).value) })
16863
- ] })
16864
- ]
16865
- },
16866
- series.id
16867
- ))
16820
+ market.id
16821
+ );
16822
+ })
16868
16823
  }
16869
16824
  ),
16870
16825
  visibleSeries.length === 0 && allSeries.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime161.jsx)(
@@ -17401,7 +17356,7 @@ var init_item_details = __esm({
17401
17356
  recurringMarkets,
17402
17357
  sportsLiveState
17403
17358
  }) => {
17404
- var _a, _b, _c, _d, _e, _f, _g;
17359
+ var _a, _b, _c, _d, _e, _f;
17405
17360
  const [selectedChartType, setSelectedChartType] = (0, import_react31.useState)("line");
17406
17361
  const [chartView, setChartView] = (0, import_react31.useState)(defaultChartView);
17407
17362
  const lastAppliedEventSyncKeyRef = (0, import_react31.useRef)(null);
@@ -17729,7 +17684,6 @@ var init_item_details = __esm({
17729
17684
  {
17730
17685
  markets: event.venueMarkets,
17731
17686
  defaultVenue: event.venue,
17732
- selectedOutcomeId: (tradingContext == null ? void 0 : tradingContext.selectedEventId) === event.id ? tradingContext.selectedOutcomeId : (_f = scopedSelectedMarket == null ? void 0 : scopedSelectedMarket.venueMarketOutcomes[0]) == null ? void 0 : _f.id,
17733
17687
  eventEndDate: event.endDate,
17734
17688
  contractWindow,
17735
17689
  range: chartRangeOverride != null ? chartRangeOverride : config.chart.selectedChartTimeRange,
@@ -17744,7 +17698,7 @@ var init_item_details = __esm({
17744
17698
  selectedChartType,
17745
17699
  venueInfo,
17746
17700
  venueMarkets,
17747
- selectedMarketId: (_g = scopedSelectedMarket == null ? void 0 : scopedSelectedMarket.id) != null ? _g : null,
17701
+ selectedMarketId: (_f = scopedSelectedMarket == null ? void 0 : scopedSelectedMarket.id) != null ? _f : null,
17748
17702
  livePrices,
17749
17703
  restMidpoints,
17750
17704
  bestMidpoint,
@@ -32000,7 +31954,7 @@ var init_event_market_shared = __esm({
32000
31954
  });
32001
31955
 
32002
31956
  // src/pages/event-market/sports-event-market.utils.ts
32003
- var SPORTS_MARKET_TYPE_KEYS, SPORTS_PERIOD_KEYS, SPORTS_PERIOD_GRAMMAR_PATTERN, SPORTS_MARKET_CATEGORY_KEYS, SPORTS_MARKET_GROUP_KEYS, SPORTS_PERIOD_KEY_SET, SPORTS_MARKET_TYPE_KEY_SET, SPORTS_MARKET_CATEGORY_KEY_SET, SPORTS_MARKET_GROUP_KEY_SET, SPORTS_LEGACY_PROP_CATEGORY_KEY_SET, SPORTS_GAME_LINE_GROUPS, SPORTS_GENERIC_STAT, ESPORTS_CATEGORY_TOKENS, ESPORTS_TITLE_PATTERN, SERIES_SCOPE_PATTERN, SPORTS_PERIOD_ORDER, FIRST_N_INNINGS_PATTERN, SPORTS_MARKET_TYPE_ORDER, YES_NO_LABELS, LINE_MARKET_TYPES, PLAYER_PROP_COUNT_PATTERN, REG_TIME_TITLE_PATTERN, toTrimmedString, resolveSportsMarketAggKey, sanitizeFamilyValue, stripLineValueFromQuestion, SPORTS_PERIOD_FAMILY_ORDER, getSportsPeriodOrderIndex, getSportsMarketTypeOrderIndex, resolveSportsPeriodFamily, normalizeSportsPeriod, normalizeSportsMarketType, normalizeSportsMarketCategory, normalizeSportsMarketGroup, resolveFallbackSportsMarketCategory, resolveSportsStatToken, resolveMarketSectionTabKey, SPORTS_PERIOD_FAMILY_ALLOWED_SPORTS, PERIOD_N_FAMILY_PATTERN, isPeriodFamilyAllowedForSport, resolveEffectiveMarketSectionTabKey, resolveVisibleSportsSectionTabs, resolveSportsSectionFilters, hasTeamTitledOutcomes, isClusterRelation, isDecomposedLeg, singleEnumeratesLegs, dropDecomposedLegsMergedIntoSingle, resolveSportsSectionMarkets, resolveSportsMarketCardVariant, isBinarySportsMoneylineMarket, AGGKEY_LINE_TOKEN_PATTERN, resolveSportsLineFamilyKey, resolveSpreadFamilyKey, SPREAD_KEY_LEG_PATTERN, resolveSpreadKeyLeg, isSpreadUnderdogLeg, resolveSpreadAnchorToken, SPREAD_NON_TEAM_TITLE_PATTERN, isSpreadTeamTitle, resolveSpreadOutcomeTeamNames, resolveCombinedMoneylineLegLabel, normalizeSportsSubtypeToken, SPORTS_LEG_GROUPABLE_GROUPS, resolveDisplayGroupFamilyKey, resolveMarketOwnCardKey, LEG_GROUP_KEY_MARKER, TOTAL_STAT_UNITS, resolveTotalStatUnit, SPORTS_LEG_TITLE_OVERRIDES, SPORTS_LEG_TITLE_SMALL_WORDS, formatSportsLegTitle, resolveDisplayGroupTitle, sortMarketsByLineValue, buildSportsMarketDisplayGroups, groupSportsMarketsByPeriod, resolveSelectedSportsLineValue, collectVenueNames, resolveTotalGroupVolume, resolveSportsExpandedMarkets, resolveSportsExpandedMarketsVolume, resolveHighestVolumeIndex, resolveSportsCombinedLegs, resolveSlideKind, aggregateSportsLineStops, escapeRegExp, resolveSportsLadderTitle, buildSportsSlideFromGroup, formatSportsPeriodGrammarLabel, resolveSportsCategoryTokens, isNonStandardSportsLikeEvent, mergeSportsSectionMarketsIntoEvent;
31957
+ var SPORTS_MARKET_TYPE_KEYS, SPORTS_PERIOD_KEYS, SPORTS_PERIOD_GRAMMAR_PATTERN, SPORTS_MARKET_CATEGORY_KEYS, SPORTS_MARKET_GROUP_KEYS, SPORTS_PERIOD_KEY_SET, SPORTS_MARKET_TYPE_KEY_SET, SPORTS_MARKET_CATEGORY_KEY_SET, SPORTS_MARKET_GROUP_KEY_SET, SPORTS_LEGACY_PROP_CATEGORY_KEY_SET, SPORTS_GAME_LINE_GROUPS, SPORTS_GENERIC_STAT, ESPORTS_CATEGORY_TOKENS, ESPORTS_TITLE_PATTERN, SERIES_SCOPE_PATTERN, SPORTS_PERIOD_ORDER, FIRST_N_INNINGS_PATTERN, SPORTS_MARKET_TYPE_ORDER, YES_NO_LABELS, LINE_MARKET_TYPES, PLAYER_PROP_COUNT_PATTERN, REG_TIME_TITLE_PATTERN, toTrimmedString, resolveSportsMarketAggKey, sanitizeFamilyValue, stripLineValueFromQuestion, SPORTS_PERIOD_FAMILY_ORDER, getSportsPeriodOrderIndex, getSportsMarketTypeOrderIndex, resolveSportsPeriodFamily, normalizeSportsPeriod, normalizeSportsMarketType, normalizeSportsMarketCategory, normalizeSportsMarketGroup, resolveFallbackSportsMarketCategory, resolveSportsStatToken, resolveMarketSectionTabKey, SPORTS_PERIOD_FAMILY_ALLOWED_SPORTS, PERIOD_N_FAMILY_PATTERN, isPeriodFamilyAllowedForSport, resolveEffectiveMarketSectionTabKey, resolveVisibleSportsSectionTabs, resolveSportsSectionFilters, hasTeamTitledOutcomes, isClusterRelation, isDecomposedLeg, singleEnumeratesLegs, dropDecomposedLegsMergedIntoSingle, resolveSportsSectionMarkets, resolveSportsMarketCardVariant, isBinarySportsMoneylineMarket, AGGKEY_LINE_TOKEN_PATTERN, resolveSportsLineFamilyKey, resolveSpreadFamilyKey, SPREAD_KEY_LEG_PATTERN, resolveSpreadKeyLeg, isSpreadUnderdogLeg, resolveSpreadAnchorToken, SPREAD_NON_TEAM_TITLE_PATTERN, isSpreadTeamTitle, resolveSpreadOutcomeTeamNames, resolveCombinedMoneylineLegLabel, normalizeSportsSubtypeToken, SPORTS_LEG_GROUPABLE_GROUPS, DRAW_OUTCOME_TITLE_PATTERN, isThreeWayMoneylineHub, resolveDisplayGroupFamilyKey, resolveMarketOwnCardKey, LEG_GROUP_KEY_MARKER, TOTAL_STAT_UNITS, resolveTotalStatUnit, SPORTS_LEG_TITLE_OVERRIDES, SPORTS_LEG_TITLE_SMALL_WORDS, formatSportsLegTitle, resolveDisplayGroupTitle, sortMarketsByLineValue, buildSportsMarketDisplayGroups, groupSportsMarketsByPeriod, resolveSelectedSportsLineValue, collectVenueNames, resolveTotalGroupVolume, resolveSportsExpandedMarkets, resolveSportsExpandedMarketsVolume, resolveHighestVolumeIndex, resolveSportsCombinedLegs, resolveSlideKind, aggregateSportsLineStops, escapeRegExp, resolveSportsLadderTitle, buildSportsSlideFromGroup, formatSportsPeriodGrammarLabel, resolveSportsCategoryTokens, isNonStandardSportsLikeEvent, mergeSportsSectionMarketsIntoEvent;
32004
31958
  var init_sports_event_market_utils = __esm({
32005
31959
  "src/pages/event-market/sports-event-market.utils.ts"() {
32006
31960
  "use strict";
@@ -32411,6 +32365,7 @@ var init_sports_event_market_utils = __esm({
32411
32365
  }
32412
32366
  if (tab.kind !== "game_lines") return filteredSectionMarkets;
32413
32367
  const dedupeEventMarketsOfType = (type) => {
32368
+ var _a, _b, _c, _d;
32414
32369
  const dedupedMarkets = [];
32415
32370
  const keptIndexByKey = /* @__PURE__ */ new Map();
32416
32371
  for (const market of eventMarkets) {
@@ -32421,6 +32376,10 @@ var init_sports_event_market_utils = __esm({
32421
32376
  const keptIndex = keptIndexByKey.get(key);
32422
32377
  if (keptIndex !== void 0) {
32423
32378
  const kept = dedupedMarkets[keptIndex];
32379
+ if (hasTeamTitledOutcomes(kept) && hasTeamTitledOutcomes(market) && ((_b = (_a = kept.venueMarketOutcomes) == null ? void 0 : _a.length) != null ? _b : 0) !== ((_d = (_c = market.venueMarketOutcomes) == null ? void 0 : _c.length) != null ? _d : 0)) {
32380
+ dedupedMarkets.push(market);
32381
+ continue;
32382
+ }
32424
32383
  if (!hasTeamTitledOutcomes(kept) && hasTeamTitledOutcomes(market)) {
32425
32384
  dedupedMarkets[keptIndex] = market;
32426
32385
  }
@@ -32550,6 +32509,12 @@ var init_sports_event_market_utils = __esm({
32550
32509
  "specials",
32551
32510
  "completion"
32552
32511
  ]);
32512
+ DRAW_OUTCOME_TITLE_PATTERN = /\b(draw|tie)\b/i;
32513
+ isThreeWayMoneylineHub = (market) => {
32514
+ var _a, _b;
32515
+ const outcomes = (_a = market.venueMarketOutcomes) != null ? _a : [];
32516
+ return normalizeSportsMarketType(market.sportsMarketType) === "moneyline" && normalizeSportsMarketGroup(market.marketGroup) === "game_lines" && normalizeSportsPeriod(market.period) === "full" && outcomes.length === 3 && outcomes.filter((outcome) => DRAW_OUTCOME_TITLE_PATTERN.test(toTrimmedString(outcome.title))).length === 1 && ((_b = market.matchedVenueMarkets) != null ? _b : []).length > 0;
32517
+ };
32553
32518
  resolveDisplayGroupFamilyKey = (market, sport) => {
32554
32519
  var _a, _b, _c;
32555
32520
  const normalizedQuestion = sanitizeFamilyValue(toTrimmedString(market.question));
@@ -32559,7 +32524,7 @@ var init_sports_event_market_utils = __esm({
32559
32524
  const sportsMarketType = (_b = normalizeSportsMarketType(market.sportsMarketType)) != null ? _b : "other";
32560
32525
  const period = normalizeSportsPeriod(market.period);
32561
32526
  const marketCategory = (_c = normalizeSportsMarketCategory(market.marketCategory)) != null ? _c : "other";
32562
- if (isBinarySportsMoneylineMarket(market)) {
32527
+ if (isBinarySportsMoneylineMarket(market) || isThreeWayMoneylineHub(market)) {
32563
32528
  return `${period}|moneyline|${marketCategory}`;
32564
32529
  }
32565
32530
  if (sportsMarketType === "to_advance") {
@@ -32623,7 +32588,7 @@ var init_sports_event_market_utils = __esm({
32623
32588
  resolveDisplayGroupTitle = (market, groupMarkets = [market], sport, isCombinedLegGroup = false) => {
32624
32589
  const sportsMarketType = normalizeSportsMarketType(market.sportsMarketType);
32625
32590
  const question = toTrimmedString(market.question);
32626
- if (isBinarySportsMoneylineMarket(market)) return "Moneyline";
32591
+ if (isBinarySportsMoneylineMarket(market) || isThreeWayMoneylineHub(market)) return "Moneyline";
32627
32592
  if (sportsMarketType === "to_advance") return "Team to Advance";
32628
32593
  if (sportsMarketType === "spread") return "Spreads";
32629
32594
  if (isCombinedLegGroup) {
package/dist/index.mjs CHANGED
@@ -16,13 +16,13 @@ import {
16
16
  buildAggTxExplorerHref,
17
17
  formatShareAmount,
18
18
  useHomePageModals
19
- } from "./chunk-5PA5KLXN.mjs";
19
+ } from "./chunk-YBMDEGTJ.mjs";
20
20
  import {
21
21
  EventList,
22
22
  EventListItem,
23
23
  EventListItemV2,
24
24
  EventListVenueStrip
25
- } from "./chunk-JLO2BGSF.mjs";
25
+ } from "./chunk-LIB6TLLV.mjs";
26
26
  import {
27
27
  CARD_NETWORK_OPTIONS,
28
28
  DepositModal,
@@ -40,7 +40,7 @@ import {
40
40
  EventOpenOrdersCard,
41
41
  formatRecurringCountdown,
42
42
  useEventOpenOrders
43
- } from "./chunk-DONMO42Q.mjs";
43
+ } from "./chunk-R7ARCUYW.mjs";
44
44
  import {
45
45
  EventListItemDetails,
46
46
  MarketDetails,
@@ -55,7 +55,7 @@ import {
55
55
  orderbookRowLimitDefault,
56
56
  resolveEventDetailsSyncKey,
57
57
  useCenterOrderbookSpread
58
- } from "./chunk-DWPBGMVJ.mjs";
58
+ } from "./chunk-LTFRGJPL.mjs";
59
59
  import {
60
60
  AggNotificationEventsProvider,
61
61
  DEPOSIT_MODAL_OPEN_EVENT,