@agg-market/ui 10.0.0 → 12.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/README.md +1 -0
  2. package/dist/chunk-AKR2ZSBQ.mjs +1645 -0
  3. package/dist/{chunk-55YYUTBK.mjs → chunk-TA74OXPL.mjs} +206 -118
  4. package/dist/{chunk-5G4T5R2H.mjs → chunk-VMJGQKKU.mjs} +29 -47
  5. package/dist/{chunk-GYOCLZGH.mjs → chunk-VOYSFL6U.mjs} +227 -401
  6. package/dist/{chunk-XP7DREIX.mjs → chunk-XUML4ZJQ.mjs} +1626 -791
  7. package/dist/events.js +1451 -1306
  8. package/dist/events.mjs +2 -2
  9. package/dist/index.js +4293 -3202
  10. package/dist/index.mjs +20 -8
  11. package/dist/modals.js +1045 -872
  12. package/dist/modals.mjs +2 -2
  13. package/dist/pages.js +3488 -2226
  14. package/dist/pages.mjs +4 -4
  15. package/dist/primitives.js +1593 -765
  16. package/dist/primitives.mjs +11 -1
  17. package/dist/styles.css +2 -2
  18. package/dist/tailwind.css +2 -2
  19. package/dist/trading.js +864 -676
  20. package/dist/trading.mjs +2 -2
  21. package/dist/types/events/list/event-list.types.d.mts +1 -1
  22. package/dist/types/events/list/event-list.types.d.ts +1 -1
  23. package/dist/types/events/market-details/index.d.mts +2 -2
  24. package/dist/types/events/market-details/index.d.ts +2 -2
  25. package/dist/types/events/market-details/market-details.types.d.mts +1 -5
  26. package/dist/types/events/market-details/market-details.types.d.ts +1 -5
  27. package/dist/types/pages/home/index.d.mts +1 -1
  28. package/dist/types/pages/home/index.d.ts +1 -1
  29. package/dist/types/pages/user-profile/components/available-balance-card.d.mts +17 -0
  30. package/dist/types/pages/user-profile/components/available-balance-card.d.ts +17 -0
  31. package/dist/types/pages/user-profile/components/balance-display.d.mts +3 -5
  32. package/dist/types/pages/user-profile/components/balance-display.d.ts +3 -5
  33. package/dist/types/pages/user-profile/components/positions-activity.d.mts +11 -1
  34. package/dist/types/pages/user-profile/components/positions-activity.d.ts +11 -1
  35. package/dist/types/pages/user-profile/components/positions-value-card.d.mts +10 -0
  36. package/dist/types/pages/user-profile/components/positions-value-card.d.ts +10 -0
  37. package/dist/types/pages/user-profile/components/user-info-card.d.mts +3 -1
  38. package/dist/types/pages/user-profile/components/user-info-card.d.ts +3 -1
  39. package/dist/types/pages/user-profile/index.d.mts +2 -2
  40. package/dist/types/pages/user-profile/index.d.ts +2 -2
  41. package/dist/types/pages/user-profile/user-profile.constants.d.mts +1 -2
  42. package/dist/types/pages/user-profile/user-profile.constants.d.ts +1 -2
  43. package/dist/types/pages/user-profile/user-profile.types.d.mts +29 -16
  44. package/dist/types/pages/user-profile/user-profile.types.d.ts +29 -16
  45. package/dist/types/primitives/agg-logo/index.d.mts +6 -0
  46. package/dist/types/primitives/agg-logo/index.d.ts +6 -0
  47. package/dist/types/primitives/header/agg-logo.d.mts +2 -0
  48. package/dist/types/primitives/header/agg-logo.d.ts +2 -0
  49. package/dist/types/primitives/header/header.constants.d.mts +3 -0
  50. package/dist/types/primitives/header/header.constants.d.ts +3 -0
  51. package/dist/types/primitives/header/header.types.d.mts +28 -0
  52. package/dist/types/primitives/header/header.types.d.ts +28 -0
  53. package/dist/types/primitives/header/index.d.mts +7 -0
  54. package/dist/types/primitives/header/index.d.ts +7 -0
  55. package/dist/types/primitives/icon/index.d.mts +3 -1
  56. package/dist/types/primitives/icon/index.d.ts +3 -1
  57. package/dist/types/primitives/icon/registry.d.mts +8 -0
  58. package/dist/types/primitives/icon/registry.d.ts +8 -0
  59. package/dist/types/primitives/icon/svg/bnb.d.mts +5 -0
  60. package/dist/types/primitives/icon/svg/bnb.d.ts +5 -0
  61. package/dist/types/primitives/icon/svg/polygon.d.mts +5 -0
  62. package/dist/types/primitives/icon/svg/polygon.d.ts +5 -0
  63. package/dist/types/primitives/index.d.mts +3 -0
  64. package/dist/types/primitives/index.d.ts +3 -0
  65. package/dist/types/primitives/search/index.d.mts +1 -1
  66. package/dist/types/primitives/search/index.d.ts +1 -1
  67. package/dist/types/primitives/search/search.types.d.mts +9 -59
  68. package/dist/types/primitives/search/search.types.d.ts +9 -59
  69. package/dist/types/primitives/search/search.utils.d.mts +4 -0
  70. package/dist/types/primitives/search/search.utils.d.ts +4 -0
  71. package/dist/types/primitives/skeleton/skeleton.types.d.mts +3 -0
  72. package/dist/types/primitives/skeleton/skeleton.types.d.ts +3 -0
  73. package/dist/types/primitives/skeleton/views/search-skeleton-view.d.mts +5 -0
  74. package/dist/types/primitives/skeleton/views/search-skeleton-view.d.ts +5 -0
  75. package/dist/types/primitives/skeleton/views/user-profile-overview-skeleton-view.d.mts +5 -0
  76. package/dist/types/primitives/skeleton/views/user-profile-overview-skeleton-view.d.ts +5 -0
  77. package/dist/types/primitives/skeleton/views/user-profile-positions-activity-skeleton-view.d.mts +5 -0
  78. package/dist/types/primitives/skeleton/views/user-profile-positions-activity-skeleton-view.d.ts +5 -0
  79. package/dist/types/primitives/tooltip/index.d.mts +6 -0
  80. package/dist/types/primitives/tooltip/index.d.ts +6 -0
  81. package/dist/types/primitives/tooltip/tooltip.constants.d.mts +2 -0
  82. package/dist/types/primitives/tooltip/tooltip.constants.d.ts +2 -0
  83. package/dist/types/primitives/tooltip/tooltip.types.d.mts +27 -0
  84. package/dist/types/primitives/tooltip/tooltip.types.d.ts +27 -0
  85. package/dist/types/profile/tabs/about-tab.d.mts +1 -1
  86. package/dist/types/profile/tabs/about-tab.d.ts +1 -1
  87. package/dist/types/profile/tabs/accounts-wallets-tab.d.mts +1 -1
  88. package/dist/types/profile/tabs/accounts-wallets-tab.d.ts +1 -1
  89. package/dist/types/trading/types.d.mts +2 -2
  90. package/dist/types/trading/types.d.ts +2 -2
  91. package/package.json +4 -3
  92. package/dist/chunk-RYQSVETG.mjs +0 -1246
@@ -20,14 +20,24 @@ import {
20
20
  detailsBaseCardClassName,
21
21
  eventListItemDetailsTimeRanges,
22
22
  fallbackLineColors,
23
+ formatCountLabel,
23
24
  getMarketDetailsTabs,
24
25
  getMotionClassName,
26
+ getVenueSummary,
25
27
  lineColorByVenue,
26
28
  marketDetailsBaseCardClassName,
27
29
  marketDetailsDefaultIsOpened,
30
+ normalizeProbability,
28
31
  orderBookRowLimitDefault,
29
- toDate
30
- } from "./chunk-XP7DREIX.mjs";
32
+ resolveEventListItemEvent,
33
+ resolveOutcomeTitle,
34
+ resolveTileImage,
35
+ resolveTileTitle,
36
+ resolveVenueLabel,
37
+ resolveVisibleOutcomes,
38
+ selectPrimaryVenueMarket,
39
+ sortOutcomes
40
+ } from "./chunk-XUML4ZJQ.mjs";
31
41
 
32
42
  // src/events/item/index.tsx
33
43
  import dayjs from "dayjs";
@@ -40,8 +50,7 @@ import {
40
50
 
41
51
  // src/shared/query-error.ts
42
52
  var getErrorStatus = (error) => {
43
- if (!error || typeof error !== "object")
44
- return null;
53
+ if (!error || typeof error !== "object") return null;
45
54
  const status = error.status;
46
55
  return typeof status === "number" ? status : null;
47
56
  };
@@ -49,142 +58,6 @@ var isErrorWithStatus = (error, status) => {
49
58
  return getErrorStatus(error) === status;
50
59
  };
51
60
 
52
- // src/events/item/event-list-item.utils.ts
53
- var resolveEventListItemEvent = (fetchedEvent) => {
54
- if (!fetchedEvent)
55
- return void 0;
56
- if (!fetchedEvent.venueMarkets || fetchedEvent.venueMarkets.length === 0)
57
- return void 0;
58
- return fetchedEvent;
59
- };
60
- var normalizeProbability = (value) => {
61
- if (typeof value !== "number" || !Number.isFinite(value))
62
- return void 0;
63
- if (value < 0)
64
- return 0;
65
- if (value > 1)
66
- return 1;
67
- return value;
68
- };
69
- var hasDateLabel = (outcome) => {
70
- return !!toDate(outcome.label);
71
- };
72
- var sortOutcomes = (outcomes) => {
73
- if (outcomes.length <= 1)
74
- return outcomes;
75
- const now = Date.now();
76
- if (outcomes.some(hasDateLabel)) {
77
- return [...outcomes].sort((a, b) => {
78
- var _a, _b, _c, _d;
79
- const aDate = (_b = (_a = toDate(a.label)) == null ? void 0 : _a.getTime()) != null ? _b : 0;
80
- const bDate = (_d = (_c = toDate(b.label)) == null ? void 0 : _c.getTime()) != null ? _d : 0;
81
- return Math.abs(aDate - now) - Math.abs(bDate - now);
82
- });
83
- }
84
- return [...outcomes].sort((a, b) => {
85
- var _a, _b;
86
- const aPrice = (_a = normalizeProbability(a.price)) != null ? _a : 0;
87
- const bPrice = (_b = normalizeProbability(b.price)) != null ? _b : 0;
88
- return bPrice - aPrice;
89
- });
90
- };
91
- var compareVisibleOutcomeRows = (left, right) => {
92
- var _a, _b;
93
- const leftDate = toDate(resolveOutcomeTitle(left.outcome));
94
- const rightDate = toDate(resolveOutcomeTitle(right.outcome));
95
- if (leftDate && rightDate) {
96
- return leftDate.getTime() - rightDate.getTime();
97
- }
98
- const leftProbability = (_a = normalizeProbability(left.outcome.price)) != null ? _a : -1;
99
- const rightProbability = (_b = normalizeProbability(right.outcome.price)) != null ? _b : -1;
100
- return rightProbability - leftProbability;
101
- };
102
- var shouldReplaceVisibleOutcome = (current, next) => {
103
- var _a, _b;
104
- const currentVolume = typeof current.market.volume === "number" ? current.market.volume : -1;
105
- const nextVolume = typeof next.market.volume === "number" ? next.market.volume : -1;
106
- if (currentVolume !== nextVolume) {
107
- return nextVolume > currentVolume;
108
- }
109
- const currentProbability = (_a = normalizeProbability(current.outcome.price)) != null ? _a : -1;
110
- const nextProbability = (_b = normalizeProbability(next.outcome.price)) != null ? _b : -1;
111
- return nextProbability > currentProbability;
112
- };
113
- var resolveVisibleOutcomes = (venueMarkets, maxOutcomes) => {
114
- const visibleOutcomesByLabel = /* @__PURE__ */ new Map();
115
- venueMarkets.forEach((market) => {
116
- sortOutcomes(market.venueMarketOutcomes).forEach((outcome) => {
117
- const title = resolveOutcomeTitle(outcome);
118
- const normalizedTitle = title.trim().toLowerCase();
119
- const nextVisibleOutcome = {
120
- venue: market.venue,
121
- market,
122
- outcome,
123
- title
124
- };
125
- const currentVisibleOutcome = visibleOutcomesByLabel.get(normalizedTitle);
126
- if (!currentVisibleOutcome || shouldReplaceVisibleOutcome(currentVisibleOutcome, nextVisibleOutcome)) {
127
- visibleOutcomesByLabel.set(normalizedTitle, nextVisibleOutcome);
128
- }
129
- });
130
- });
131
- return [...visibleOutcomesByLabel.values()].sort(compareVisibleOutcomeRows).slice(0, Math.max(1, maxOutcomes));
132
- };
133
- var resolveOutcomeTitle = (outcome) => {
134
- if (outcome.title && outcome.title.trim())
135
- return outcome.title;
136
- return outcome.label;
137
- };
138
- var selectPrimaryVenueMarket = (venueMarkets) => {
139
- if (venueMarkets.length === 0)
140
- return void 0;
141
- if (venueMarkets.length === 1)
142
- return venueMarkets[0];
143
- return [...venueMarkets].sort((a, b) => {
144
- const aVolume = typeof a.volume === "number" ? a.volume : -1;
145
- const bVolume = typeof b.volume === "number" ? b.volume : -1;
146
- return bVolume - aVolume;
147
- })[0];
148
- };
149
- var resolveTileTitle = (event, primaryVenueMarket, titleOverride) => {
150
- if (typeof titleOverride === "string" && titleOverride.trim()) {
151
- return titleOverride;
152
- }
153
- if (typeof (primaryVenueMarket == null ? void 0 : primaryVenueMarket.question) === "string" && primaryVenueMarket.question.trim()) {
154
- return primaryVenueMarket.question;
155
- }
156
- return event.title;
157
- };
158
- var resolveTileImage = (event, primaryVenueMarket, imageOverride) => {
159
- if (typeof imageOverride === "string" && imageOverride.trim()) {
160
- return imageOverride;
161
- }
162
- if (typeof (primaryVenueMarket == null ? void 0 : primaryVenueMarket.image) === "string" && primaryVenueMarket.image.trim()) {
163
- return primaryVenueMarket.image;
164
- }
165
- if (typeof event.image === "string" && event.image.trim()) {
166
- return event.image;
167
- }
168
- return void 0;
169
- };
170
- var formatCountLabel = (count, singular, plural) => {
171
- return `${count} ${count === 1 ? singular : plural}`;
172
- };
173
- var getVenueSummary = (venueMarkets) => {
174
- const uniqueVenues = Array.from(new Set(venueMarkets.map((market) => market.venue)));
175
- return {
176
- marketCount: venueMarkets.length,
177
- venueCount: uniqueVenues.length,
178
- singleVenue: uniqueVenues.length === 1 ? uniqueVenues[0] : void 0
179
- };
180
- };
181
- var resolveVenueLabel = (venue, venueInfo, labels) => {
182
- var _a, _b;
183
- if (!venue)
184
- return labels.eventItem.venueSingular;
185
- return (_b = (_a = venueInfo == null ? void 0 : venueInfo[venue]) == null ? void 0 : _a.label) != null ? _b : labels.venues[venue];
186
- };
187
-
188
61
  // src/events/item/index.tsx
189
62
  import { jsx, jsxs } from "react/jsx-runtime";
190
63
  var EventListItemLoadingState = ({
@@ -255,8 +128,7 @@ var EventListItemContent = ({
255
128
  return selectPrimaryVenueMarket(allVenueMarkets);
256
129
  }, [allVenueMarkets]);
257
130
  const visibleOutcomes = useMemo(() => {
258
- if (allVenueMarkets.length === 0)
259
- return [];
131
+ if (allVenueMarkets.length === 0) return [];
260
132
  return resolveVisibleOutcomes(allVenueMarkets, maxOutcomes);
261
133
  }, [allVenueMarkets, maxOutcomes]);
262
134
  const resolvedTitle = resolveTileTitle(event, primaryVenueMarket, title);
@@ -267,22 +139,19 @@ var EventListItemContent = ({
267
139
  return Array.from(new Set(allVenueMarkets.map((market) => market.venue))).slice(0, 4);
268
140
  }, [allVenueMarkets]);
269
141
  const resolvedVolume = typeof event.volume === "number" ? event.volume : (_a = primaryVenueMarket == null ? void 0 : primaryVenueMarket.volume) != null ? _a : void 0;
270
- const volumeLabel = typeof resolvedVolume === "number" ? `${config.formatCompactCurrency(resolvedVolume)} ${labels.eventItem.volumeSuffix}` : "";
142
+ const volumeLabel = typeof resolvedVolume === "number" ? `${config.formatting.formatCompactCurrency(resolvedVolume)} ${labels.eventItem.volumeSuffix}` : "";
271
143
  const handleKeyDown = (eventToHandle) => {
272
- if (!onClick)
273
- return;
144
+ if (!onClick) return;
274
145
  if ((eventToHandle == null ? void 0 : eventToHandle.key) === "Enter" || (eventToHandle == null ? void 0 : eventToHandle.key) === " ") {
275
146
  eventToHandle == null ? void 0 : eventToHandle.preventDefault();
276
147
  onClick == null ? void 0 : onClick(event);
277
148
  }
278
149
  };
279
150
  const renderArbitrage = (value) => {
280
- if (value == null)
281
- return null;
282
- if (Math.abs(value) < config.arbitrageThreshold)
283
- return null;
151
+ if (value == null) return null;
152
+ if (Math.abs(value) < config.market.arbitrageThreshold) return null;
284
153
  return /* @__PURE__ */ jsxs("div", { className: cn("flex items-center gap-1", "text-agg-success"), children: [
285
- /* @__PURE__ */ jsx(Typography, { variant: "label-strong", className: "text-agg-success", children: config.formatPercent(value) }),
154
+ /* @__PURE__ */ jsx(Typography, { variant: "label-strong", className: "text-agg-success", children: config.formatting.formatPercent(value) }),
286
155
  /* @__PURE__ */ jsx(
287
156
  Icon,
288
157
  {
@@ -353,7 +222,7 @@ var EventListItemContent = ({
353
222
  showBadge ? /* @__PURE__ */ jsx(
354
223
  Badge,
355
224
  {
356
- text: config.formatPercent(probability),
225
+ text: config.formatting.formatPercent(probability),
357
226
  prefix: /* @__PURE__ */ jsx(VenueLogo, { venue: visibleOutcome.venue, size: "small" }),
358
227
  size: "large",
359
228
  classNames: {
@@ -566,13 +435,11 @@ var normalizeLabel = (value) => {
566
435
  return value.trim().toLowerCase();
567
436
  };
568
437
  var isDateLikeLabel = (value) => {
569
- if (!value.trim())
570
- return false;
438
+ if (!value.trim()) return false;
571
439
  return dayjs2(value).isValid();
572
440
  };
573
441
  var getDefaultSelectedTimeRange = (value, fallback = "1D") => {
574
- if (!value)
575
- return fallback;
442
+ if (!value) return fallback;
576
443
  return value;
577
444
  };
578
445
  var getTimeWindowByRange = (range) => {
@@ -645,8 +512,7 @@ var resolveOutcomesByVenue = (venueMarkets, selectedOutcomeLabel) => {
645
512
  const matchedOutcome = sortOutcomes(market.venueMarketOutcomes).find((outcome) => {
646
513
  return matchOutcomeByLabel(outcome, selectedOutcomeLabel);
647
514
  });
648
- if (!matchedOutcome)
649
- return null;
515
+ if (!matchedOutcome) return null;
650
516
  return {
651
517
  venue: market.venue,
652
518
  market,
@@ -657,13 +523,11 @@ var resolveOutcomesByVenue = (venueMarkets, selectedOutcomeLabel) => {
657
523
  var resolveSeriesColor = (venue, index) => {
658
524
  var _a;
659
525
  const colorFromVenue = lineColorByVenue[venue];
660
- if (colorFromVenue)
661
- return colorFromVenue;
526
+ if (colorFromVenue) return colorFromVenue;
662
527
  return (_a = fallbackLineColors[index % fallbackLineColors.length]) != null ? _a : "#2e5cff";
663
528
  };
664
529
  var toNonEmptyString = (value) => {
665
- if (typeof value !== "string")
666
- return void 0;
530
+ if (typeof value !== "string") return void 0;
667
531
  const trimmedValue = value.trim();
668
532
  return trimmedValue ? trimmedValue : void 0;
669
533
  };
@@ -678,8 +542,7 @@ var resolveCanonicalMarketId = (venueMarkets, fallbackMarketId) => {
678
542
  return (_a = toNonEmptyString(fallbackMarketId)) != null ? _a : uniqueMarketIds[0];
679
543
  };
680
544
  var toChartDisplayValue = (value, transformProbability) => {
681
- if (value == null || !Number.isFinite(value))
682
- return void 0;
545
+ if (value == null || !Number.isFinite(value)) return void 0;
683
546
  return transformProbability(value) * 100;
684
547
  };
685
548
  var marketChartCandleToLineChartPoint = (candle, transformProbability) => {
@@ -713,8 +576,7 @@ var resolveMarketChartVenueSeries = ({
713
576
  chartData,
714
577
  transformProbability
715
578
  }) => {
716
- if (!chartData)
717
- return [];
579
+ if (!chartData) return [];
718
580
  return Object.entries(chartData.venues).map(([venue, venueData]) => ({
719
581
  venue,
720
582
  points: venueData.candles.map(
@@ -805,16 +667,13 @@ var EventListItemDetailsNotFoundState = ({
805
667
  };
806
668
  var probabilityModeOrder = ["yes", "no"];
807
669
  var clampProbability = (value) => {
808
- if (value < 0)
809
- return 0;
810
- if (value > 1)
811
- return 1;
670
+ if (value < 0) return 0;
671
+ if (value > 1) return 1;
812
672
  return value;
813
673
  };
814
674
  var resolveAverageProbability = (values) => {
815
675
  const validValues = values.filter((value) => value != null);
816
- if (validValues.length === 0)
817
- return void 0;
676
+ if (validValues.length === 0) return void 0;
818
677
  return validValues.reduce((sum, value) => sum + value, 0) / validValues.length;
819
678
  };
820
679
  var EventListItemDetailsGraphSection = ({
@@ -833,7 +692,9 @@ var EventListItemDetailsGraphSection = ({
833
692
  }) => {
834
693
  var _a, _b;
835
694
  const labels = useLabels3();
836
- const { enableLiveUpdates } = useSdkUiConfig2();
695
+ const {
696
+ features: { enableLiveUpdates }
697
+ } = useSdkUiConfig2();
837
698
  const [selectedVenue, setSelectedVenue] = useState(null);
838
699
  const [activeProbabilityMode, setActiveProbabilityMode] = useState("yes");
839
700
  const probabilityModeConfigs = useMemo3(() => {
@@ -949,8 +810,7 @@ var EventListItemDetailsGraphSection = ({
949
810
  lineStyle: "solid"
950
811
  };
951
812
  });
952
- if (!selectedVenue)
953
- return series;
813
+ if (!selectedVenue) return series;
954
814
  return series.filter((seriesItem) => seriesItem.venue === selectedVenue);
955
815
  }, [
956
816
  activeCanonicalMarketId,
@@ -999,8 +859,7 @@ var EventListItemDetailsGraphSection = ({
999
859
  };
1000
860
  const handleVenueToggle = (venue) => {
1001
861
  setSelectedVenue((currentSelectedVenue) => {
1002
- if (currentSelectedVenue === venue)
1003
- return null;
862
+ if (currentSelectedVenue === venue) return null;
1004
863
  return venue;
1005
864
  });
1006
865
  };
@@ -1135,8 +994,7 @@ var EventListItemDetailsContent = ({
1135
994
  return selectPrimaryVenueMarket(venueMarkets);
1136
995
  }, [venueMarkets]);
1137
996
  const filteredVenueMarkets = useMemo3(() => {
1138
- if (!selectedMarket)
1139
- return venueMarkets;
997
+ if (!selectedMarket) return venueMarkets;
1140
998
  return venueMarkets.filter(
1141
999
  (vm) => vm.question === (selectedMarket == null ? void 0 : selectedMarket.question)
1142
1000
  );
@@ -1147,7 +1005,7 @@ var EventListItemDetailsContent = ({
1147
1005
  const [selectedOutcomeLabel, setSelectedOutcomeLabel] = useState(() => {
1148
1006
  return resolveDefaultOutcomeLabel(outcomeLabels);
1149
1007
  });
1150
- const configTimeRange = config.defaultChartTimeRange;
1008
+ const configTimeRange = config.chart.defaultChartTimeRange;
1151
1009
  const [selectedTimeRange, setSelectedTimeRange] = useState(() => {
1152
1010
  return getDefaultSelectedTimeRange(defaultTimeRange, configTimeRange);
1153
1011
  });
@@ -1170,8 +1028,7 @@ var EventListItemDetailsContent = ({
1170
1028
  );
1171
1029
  }, [outcomeLabels, filteredVenueMarkets]);
1172
1030
  const mainOutcomeLabel = useMemo3(() => {
1173
- if (outcomeLabels.length === 0)
1174
- return void 0;
1031
+ if (outcomeLabels.length === 0) return void 0;
1175
1032
  return [...outcomeLabels].sort((left, right) => {
1176
1033
  var _a2, _b;
1177
1034
  const leftProbability = (_a2 = probabilityByLabel.get(left)) != null ? _a2 : -1;
@@ -1214,9 +1071,8 @@ var EventListItemDetailsContent = ({
1214
1071
  const volumeLabel = useMemo3(() => {
1215
1072
  var _a2;
1216
1073
  const resolvedVolume = typeof event.volume === "number" ? event.volume : (_a2 = primaryVenueMarket == null ? void 0 : primaryVenueMarket.volume) != null ? _a2 : void 0;
1217
- if (typeof resolvedVolume !== "number")
1218
- return "";
1219
- return `${config.formatCompactCurrency(resolvedVolume)} ${labels.eventItemDetails.volumeSuffix}`;
1074
+ if (typeof resolvedVolume !== "number") return "";
1075
+ return `${config.formatting.formatCompactCurrency(resolvedVolume)} ${labels.eventItemDetails.volumeSuffix}`;
1220
1076
  }, [config, event.volume, labels.eventItemDetails.volumeSuffix, primaryVenueMarket == null ? void 0 : primaryVenueMarket.volume]);
1221
1077
  if (!primaryVenueMarket || !selectedOutcomeLabel) {
1222
1078
  return /* @__PURE__ */ jsx3(
@@ -1332,7 +1188,7 @@ var EventListItemDetailsContent = ({
1332
1188
  isDateOutcomeMarket,
1333
1189
  classNames,
1334
1190
  venueInfo,
1335
- formatPercent: config.formatPercent,
1191
+ formatPercent: config.formatting.formatPercent,
1336
1192
  selectedTimeRange,
1337
1193
  selectedChartType
1338
1194
  }
@@ -1495,14 +1351,12 @@ var hasBinaryLabels = (labels) => {
1495
1351
  };
1496
1352
  var resolveInitialTab = (defaultTab) => {
1497
1353
  const parsedTab = MarketDetailsTabSchema.safeParse(defaultTab);
1498
- if (parsedTab.success)
1499
- return parsedTab.data;
1354
+ if (parsedTab.success) return parsedTab.data;
1500
1355
  return "order-book";
1501
1356
  };
1502
1357
  var resolveMarketFromVenueMarkets = (venueMarkets, marketId) => {
1503
1358
  var _a, _b;
1504
- if (!venueMarkets || venueMarkets.length === 0)
1505
- return void 0;
1359
+ if (!venueMarkets || venueMarkets.length === 0) return void 0;
1506
1360
  if (!marketId) {
1507
1361
  const primary = selectPrimaryVenueMarket(venueMarkets);
1508
1362
  const totalVolume2 = venueMarkets.reduce((sum, vm) => {
@@ -1522,8 +1376,7 @@ var resolveMarketFromVenueMarkets = (venueMarkets, marketId) => {
1522
1376
  const matchedVenueMarket = venueMarkets.find(
1523
1377
  (vm) => vm.id === marketId || vm.externalIdentifier === marketId
1524
1378
  );
1525
- if (!matchedVenueMarket)
1526
- return void 0;
1379
+ if (!matchedVenueMarket) return void 0;
1527
1380
  const siblingVenueMarkets = venueMarkets.filter(
1528
1381
  (vm) => vm.question === matchedVenueMarket.question
1529
1382
  );
@@ -1542,22 +1395,33 @@ var resolveMarketFromVenueMarkets = (venueMarkets, marketId) => {
1542
1395
  };
1543
1396
  };
1544
1397
  var resolveDisplayOutcomeLabels = (labels) => {
1545
- if (!hasBinaryLabels(labels))
1546
- return labels;
1398
+ if (!hasBinaryLabels(labels)) return labels;
1547
1399
  return ["Yes", "No"].filter(
1548
1400
  (label) => labels.some((value) => normalizeLabel2(value) === normalizeLabel2(label))
1549
1401
  );
1550
1402
  };
1403
+ var resolveMarketDetailsOutcomeLabels = (venueMarkets) => {
1404
+ var _a;
1405
+ const primaryMarket = selectPrimaryVenueMarket(venueMarkets);
1406
+ const initialLabels = ((_a = primaryMarket == null ? void 0 : primaryMarket.venueMarketOutcomes) != null ? _a : []).map((outcome) => outcome.label.trim()).filter(Boolean);
1407
+ const labels = new Set(initialLabels);
1408
+ venueMarkets.forEach((market) => {
1409
+ sortOutcomes(market.venueMarketOutcomes).forEach((outcome) => {
1410
+ const label = outcome.label.trim();
1411
+ if (!label) return;
1412
+ labels.add(label);
1413
+ });
1414
+ });
1415
+ return [...labels];
1416
+ };
1551
1417
  var resolveInitialOutcomeLabel = (labels, defaultOutcomeLabel) => {
1552
1418
  var _a;
1553
- if (labels.length === 0)
1554
- return void 0;
1419
+ if (labels.length === 0) return void 0;
1555
1420
  if (defaultOutcomeLabel) {
1556
1421
  const matchedLabel = labels.find(
1557
1422
  (label) => normalizeLabel2(label) === normalizeLabel2(defaultOutcomeLabel)
1558
1423
  );
1559
- if (matchedLabel)
1560
- return matchedLabel;
1424
+ if (matchedLabel) return matchedLabel;
1561
1425
  }
1562
1426
  if (hasBinaryLabels(labels)) {
1563
1427
  return (_a = labels.find((label) => normalizeLabel2(label) === "yes")) != null ? _a : labels[0];
@@ -1578,13 +1442,11 @@ var resolveAverageProbabilityByLabel = (venueMarkets, labels) => {
1578
1442
  );
1579
1443
  };
1580
1444
  var formatProbabilityPercent = (value) => {
1581
- if (value == null)
1582
- return "-";
1445
+ if (value == null) return "-";
1583
1446
  return `${Math.round(value * 100)}%`;
1584
1447
  };
1585
1448
  var formatProbabilityCents = (value) => {
1586
- if (value == null)
1587
- return "-";
1449
+ if (value == null) return "-";
1588
1450
  const cents = (value * 100).toFixed(1).replace(/\.0$/, "");
1589
1451
  return `${cents}\xA2`;
1590
1452
  };
@@ -1599,7 +1461,7 @@ var resolveOutcomeTone = (label, index) => {
1599
1461
  return index === 0 ? "positive" : "negative";
1600
1462
  };
1601
1463
  var resolveHeaderOutcomeItems = (venueMarkets, defaultOutcomeLabel) => {
1602
- const labels = resolveDisplayOutcomeLabels(resolveOutcomeLabels(venueMarkets));
1464
+ const labels = resolveDisplayOutcomeLabels(resolveMarketDetailsOutcomeLabels(venueMarkets));
1603
1465
  const probabilityByLabel = resolveAverageProbabilityByLabel(venueMarkets, labels);
1604
1466
  return labels.slice(0, 2).map((label, index) => {
1605
1467
  var _a;
@@ -1631,16 +1493,14 @@ var resolveOrderBookRows = ({
1631
1493
  data,
1632
1494
  side
1633
1495
  }) => {
1634
- if (!(data == null ? void 0 : data.length))
1635
- return [];
1496
+ if (!(data == null ? void 0 : data.length)) return [];
1636
1497
  const tone = side === "asks" ? "negative" : "positive";
1637
1498
  const rows = data.flatMap((result) => {
1638
1499
  var _a;
1639
1500
  return ((_a = result.orderbook[side]) != null ? _a : []).flatMap(
1640
1501
  (level, index) => {
1641
1502
  const parsedLevel = OrderBookLevelSchema.safeParse(level);
1642
- if (!parsedLevel.success)
1643
- return [];
1503
+ if (!parsedLevel.success) return [];
1644
1504
  const parsedRow = OrderBookRowSchema.safeParse({
1645
1505
  id: `${result.market.id}-${side}-${index}-${parsedLevel.data.price}`,
1646
1506
  venue: result.market.venue,
@@ -1649,15 +1509,13 @@ var resolveOrderBookRows = ({
1649
1509
  total: parsedLevel.data.price * parsedLevel.data.size,
1650
1510
  tone
1651
1511
  });
1652
- if (!parsedRow.success)
1653
- return [];
1512
+ if (!parsedRow.success) return [];
1654
1513
  return [parsedRow.data];
1655
1514
  }
1656
1515
  );
1657
1516
  });
1658
1517
  const sortedRows = [...rows].sort((left, right) => {
1659
- if (side === "asks")
1660
- return left.price - right.price;
1518
+ if (side === "asks") return left.price - right.price;
1661
1519
  return right.price - left.price;
1662
1520
  });
1663
1521
  const maxTotal = sortedRows.reduce((currentMax, row) => Math.max(currentMax, row.total), 0) || 1;
@@ -1708,11 +1566,9 @@ var buildMarketDetailsModel = ({
1708
1566
  }) => {
1709
1567
  var _a, _b;
1710
1568
  const market = resolveMarketFromVenueMarkets(venueMarkets, marketId);
1711
- if (!market)
1712
- return void 0;
1569
+ if (!market) return void 0;
1713
1570
  const primaryVenueMarket = selectPrimaryVenueMarket(market.venueMarkets);
1714
- if (!primaryVenueMarket)
1715
- return void 0;
1571
+ if (!primaryVenueMarket) return void 0;
1716
1572
  const resolvedTitle = (title == null ? void 0 : title.trim()) || primaryVenueMarket.question || market.question;
1717
1573
  const resolvedImage = (_a = typeof image === "string" && image.trim() ? image : void 0) != null ? _a : typeof primaryVenueMarket.image === "string" && primaryVenueMarket.image.trim() ? primaryVenueMarket.image : void 0;
1718
1574
  const resolvedVolume = typeof market.volume === "number" ? market.volume : (_b = primaryVenueMarket.volume) != null ? _b : void 0;
@@ -1722,7 +1578,9 @@ var buildMarketDetailsModel = ({
1722
1578
  formatCompactCurrency,
1723
1579
  labels
1724
1580
  });
1725
- const outcomeLabels = resolveDisplayOutcomeLabels(resolveOutcomeLabels(market.venueMarkets));
1581
+ const outcomeLabels = resolveDisplayOutcomeLabels(
1582
+ resolveMarketDetailsOutcomeLabels(market.venueMarkets)
1583
+ );
1726
1584
  const probabilityByLabel = resolveAverageProbabilityByLabel(market.venueMarkets, outcomeLabels);
1727
1585
  return {
1728
1586
  market,
@@ -1852,7 +1710,7 @@ var getOutcomeButtonClassName = ({
1852
1710
  const defaultStateClassName = isPositive ? "border-[#18c15c]/50 bg-[#18c15c]/5 text-agg-foreground hover:bg-[#18c15c]/10" : "border-[#e5455f]/50 bg-[#e5455f]/5 text-agg-foreground hover:bg-[#e5455f]/10";
1853
1711
  const activeStateClassName = isPositive ? "border-transparent bg-[#18c15c] text-agg-on-primary" : "border-transparent bg-[#e5455f] text-agg-on-primary";
1854
1712
  return cn(
1855
- "h-auto min-h-10 flex-1 rounded-agg-full border px-4 py-1.5 text-agg-base leading-agg-6 shadow-none md:flex-none md:min-w-[168px]",
1713
+ "h-auto flex-1 rounded-agg-full border px-4 py-1.5 text-agg-base leading-agg-6 shadow-none md:flex-none md:min-w-[168px]",
1856
1714
  getMotionClassName(enableAnimations, "transition-all duration-300 ease-in-out"),
1857
1715
  isActive ? activeStateClassName : defaultStateClassName,
1858
1716
  "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-agg-primary focus-visible:ring-offset-2 focus-visible:ring-offset-agg-secondary-hover",
@@ -1865,7 +1723,7 @@ var MarketDetailsContent = ({
1865
1723
  marketId,
1866
1724
  title,
1867
1725
  image,
1868
- isOpened: defaultIsOpened = marketDetailsDefaultIsOpened,
1726
+ isOpened: controlledIsOpened = marketDetailsDefaultIsOpened,
1869
1727
  onOpenChange,
1870
1728
  defaultTab,
1871
1729
  defaultOutcomeLabel,
@@ -1885,10 +1743,10 @@ var MarketDetailsContent = ({
1885
1743
  marketId,
1886
1744
  title,
1887
1745
  image,
1888
- formatCompactCurrency: config.formatCompactCurrency,
1746
+ formatCompactCurrency: config.formatting.formatCompactCurrency,
1889
1747
  labels
1890
1748
  });
1891
- }, [config.formatCompactCurrency, venueMarkets, image, labels, marketId, title]);
1749
+ }, [config.formatting.formatCompactCurrency, venueMarkets, image, labels, marketId, title]);
1892
1750
  const resolvedMarket = useMemo4(() => {
1893
1751
  return resolveMarketFromVenueMarkets(venueMarkets, marketId);
1894
1752
  }, [venueMarkets, marketId]);
@@ -1898,11 +1756,14 @@ var MarketDetailsContent = ({
1898
1756
  const [selectedTab, setSelectedTab] = useState2(
1899
1757
  () => resolveInitialTab(defaultTab)
1900
1758
  );
1901
- const [isOpened, setIsOpened] = useState2(defaultIsOpened);
1759
+ const [isOpened, setIsOpened] = useState2(controlledIsOpened);
1902
1760
  useEffect2(() => {
1903
1761
  setSelectedTab(resolveInitialTab(defaultTab));
1904
1762
  }, [defaultTab]);
1905
- const resolvedDefaultTimeRange = (_a = defaultTimeRange != null ? defaultTimeRange : config.defaultChartTimeRange) != null ? _a : "1D";
1763
+ useEffect2(() => {
1764
+ setIsOpened(controlledIsOpened);
1765
+ }, [controlledIsOpened]);
1766
+ const resolvedDefaultTimeRange = (_a = defaultTimeRange != null ? defaultTimeRange : config.chart.defaultChartTimeRange) != null ? _a : "1D";
1906
1767
  const [selectedTimeRange, setSelectedTimeRange] = useState2(resolvedDefaultTimeRange);
1907
1768
  const [selectedChartType, setSelectedChartType] = useState2("line");
1908
1769
  useEffect2(() => {
@@ -1922,13 +1783,11 @@ var MarketDetailsContent = ({
1922
1783
  );
1923
1784
  }, [defaultOutcomeLabel, model == null ? void 0 : model.outcomeLabels]);
1924
1785
  const headerOutcomeItems = useMemo4(() => {
1925
- if (!model)
1926
- return [];
1786
+ if (!model) return [];
1927
1787
  return resolveHeaderOutcomeItems(model.market.venueMarkets, selectedOutcomeLabel);
1928
1788
  }, [model, selectedOutcomeLabel]);
1929
1789
  const headlineProbability = useMemo4(() => {
1930
- if (!model || !selectedOutcomeLabel)
1931
- return void 0;
1790
+ if (!model || !selectedOutcomeLabel) return void 0;
1932
1791
  return model.probabilityByLabel.get(selectedOutcomeLabel);
1933
1792
  }, [model, selectedOutcomeLabel]);
1934
1793
  const outcomesByLabel = useMemo4(() => {
@@ -1946,8 +1805,7 @@ var MarketDetailsContent = ({
1946
1805
  }, [headerOutcomeItems, model]);
1947
1806
  const selectedOutcomesByVenue = useMemo4(() => {
1948
1807
  var _a2;
1949
- if (!selectedOutcomeLabel)
1950
- return [];
1808
+ if (!selectedOutcomeLabel) return [];
1951
1809
  return (_a2 = outcomesByLabel.get(selectedOutcomeLabel)) != null ? _a2 : [];
1952
1810
  }, [outcomesByLabel, selectedOutcomeLabel]);
1953
1811
  const chartEnabled = isOpened && selectedTab === "graph";
@@ -1986,12 +1844,10 @@ var MarketDetailsContent = ({
1986
1844
  }))
1987
1845
  });
1988
1846
  const orderBookData = useMemo4(() => {
1989
- if (!marketOrderbookData)
1990
- return void 0;
1847
+ if (!marketOrderbookData) return void 0;
1991
1848
  const results = selectedOutcomesByVenue.flatMap(({ market, outcome }) => {
1992
1849
  const venueOrderbook = marketOrderbookData.venueOrderbooks[market.venue];
1993
- if (!venueOrderbook)
1994
- return [];
1850
+ if (!venueOrderbook) return [];
1995
1851
  return [
1996
1852
  {
1997
1853
  market,
@@ -2037,8 +1893,7 @@ var MarketDetailsContent = ({
2037
1893
  points: seriesItem.points
2038
1894
  };
2039
1895
  });
2040
- if (!selectedGraphVenue)
2041
- return seriesForOutcomeLabel;
1896
+ if (!selectedGraphVenue) return seriesForOutcomeLabel;
2042
1897
  return seriesForOutcomeLabel.filter((seriesItem) => seriesItem.venue === selectedGraphVenue);
2043
1898
  }, [
2044
1899
  primaryVenueMarketId,
@@ -2055,8 +1910,7 @@ var MarketDetailsContent = ({
2055
1910
  });
2056
1911
  }, [marketChartData, selectedGraphVenue]);
2057
1912
  const otherRows = useMemo4(() => {
2058
- if (!model)
2059
- return [];
1913
+ if (!model) return [];
2060
1914
  return resolveOtherTabRows(model.market, labels);
2061
1915
  }, [labels, model]);
2062
1916
  const isOrderBookNotFound = orderBookError && typeof orderBookError === "object" && "status" in orderBookError && orderBookError.status === 404;
@@ -2068,8 +1922,7 @@ var MarketDetailsContent = ({
2068
1922
  if ((eventToHandle == null ? void 0 : eventToHandle.key) !== "ArrowLeft" && (eventToHandle == null ? void 0 : eventToHandle.key) !== "ArrowRight") {
2069
1923
  return;
2070
1924
  }
2071
- if (headerOutcomeItems.length <= 1)
2072
- return;
1925
+ if (headerOutcomeItems.length <= 1) return;
2073
1926
  const activeIndex = headerOutcomeItems.findIndex((item) => {
2074
1927
  return item.label === selectedOutcomeLabel;
2075
1928
  });
@@ -2078,21 +1931,17 @@ var MarketDetailsContent = ({
2078
1931
  setSelectedOutcomeLabel((_a2 = headerOutcomeItems[nextIndex]) == null ? void 0 : _a2.label);
2079
1932
  };
2080
1933
  const handleToggleExpanded = (event) => {
1934
+ if (!marketId) return;
2081
1935
  if (event && "key" in event && (event == null ? void 0 : event.key) !== "Enter" && (event == null ? void 0 : event.key) !== " ") {
2082
1936
  return;
2083
1937
  }
2084
1938
  event == null ? void 0 : event.preventDefault();
2085
1939
  event == null ? void 0 : event.stopPropagation();
2086
- setIsOpened((prev) => {
2087
- const next = !prev;
2088
- onOpenChange == null ? void 0 : onOpenChange(next);
2089
- return next;
2090
- });
1940
+ onOpenChange == null ? void 0 : onOpenChange(marketId);
2091
1941
  };
2092
1942
  const handleGraphVenueToggle = (venue) => {
2093
1943
  setSelectedGraphVenue((currentVenue) => {
2094
- if (currentVenue === venue)
2095
- return null;
1944
+ if (currentVenue === venue) return null;
2096
1945
  return venue;
2097
1946
  });
2098
1947
  };
@@ -2131,7 +1980,7 @@ var MarketDetailsContent = ({
2131
1980
  {
2132
1981
  className: cn(
2133
1982
  "cursor-pointer disabled:cursor-default",
2134
- "flex flex-wrap flex-row items-center justify-between gap-3 px-5 py-4",
1983
+ "flex flex-nowrap flex-row items-center justify-between gap-3 px-5 py-4",
2135
1984
  isOpened && "pb-3",
2136
1985
  classNames == null ? void 0 : classNames.header
2137
1986
  ),
@@ -2143,7 +1992,7 @@ var MarketDetailsContent = ({
2143
1992
  onClick: handleToggleExpanded,
2144
1993
  onKeyDown: handleToggleExpanded,
2145
1994
  children: [
2146
- /* @__PURE__ */ jsxs3("div", { className: "flex min-w-52 max-w-3/4 items-center gap-3 md:gap-4", children: [
1995
+ /* @__PURE__ */ jsxs3("div", { className: "flex min-w-0 flex-1 items-center gap-3 md:gap-4", children: [
2147
1996
  model.image ? /* @__PURE__ */ jsx4(
2148
1997
  RemoteImage,
2149
1998
  {
@@ -2157,62 +2006,64 @@ var MarketDetailsContent = ({
2157
2006
  /* @__PURE__ */ jsx4("div", { className: "flex items-center gap-3", children: /* @__PURE__ */ jsx4(Typography, { variant: "label", className: "truncate text-agg-muted-foreground", children: model.subtitle }) })
2158
2007
  ] })
2159
2008
  ] }),
2160
- /* @__PURE__ */ jsx4(Typography, { as: "div", variant: "heading", className: "shrink-0", children: formatProbabilityPercent(headlineProbability) }),
2161
- /* @__PURE__ */ jsx4(
2162
- "div",
2163
- {
2164
- className: "flex gap-2",
2165
- role: "tablist",
2166
- "aria-label": labels.marketDetails.marketOutcomesAria,
2167
- tabIndex: 0,
2168
- onKeyDown: (e) => handleOutcomeKeyDown(e),
2169
- children: headerOutcomeItems.map((item) => {
2170
- const isPositive = item.tone === "positive";
2171
- const isActiveOutcome = item.label === selectedOutcomeLabel;
2172
- return /* @__PURE__ */ jsx4(
2173
- "button",
2174
- {
2175
- type: "button",
2176
- role: "tab",
2177
- "aria-selected": isActiveOutcome,
2178
- tabIndex: isActiveOutcome ? 0 : -1,
2179
- className: getOutcomeButtonClassName({
2180
- enableAnimations: config.enableAnimations,
2181
- isPositive,
2182
- isActive: isActiveOutcome
2183
- }),
2184
- onClick: (e) => {
2185
- e.preventDefault();
2186
- e.stopPropagation();
2187
- setSelectedOutcomeLabel(item.label);
2009
+ /* @__PURE__ */ jsxs3("div", { className: "flex shrink-0 items-center gap-3", children: [
2010
+ /* @__PURE__ */ jsx4(Typography, { as: "div", variant: "heading", className: "shrink-0", children: formatProbabilityPercent(headlineProbability) }),
2011
+ /* @__PURE__ */ jsx4(
2012
+ "div",
2013
+ {
2014
+ className: "flex shrink-0 gap-2",
2015
+ role: "tablist",
2016
+ "aria-label": labels.marketDetails.marketOutcomesAria,
2017
+ tabIndex: 0,
2018
+ onKeyDown: (e) => handleOutcomeKeyDown(e),
2019
+ children: headerOutcomeItems.map((item) => {
2020
+ const isPositive = item.tone === "positive";
2021
+ const isActiveOutcome = item.label === selectedOutcomeLabel;
2022
+ return /* @__PURE__ */ jsx4(
2023
+ "button",
2024
+ {
2025
+ type: "button",
2026
+ role: "tab",
2027
+ "aria-selected": isActiveOutcome,
2028
+ tabIndex: isActiveOutcome ? 0 : -1,
2029
+ className: getOutcomeButtonClassName({
2030
+ enableAnimations: config.features.enableAnimations,
2031
+ isPositive,
2032
+ isActive: isActiveOutcome
2033
+ }),
2034
+ onClick: (e) => {
2035
+ e.preventDefault();
2036
+ e.stopPropagation();
2037
+ setSelectedOutcomeLabel(item.label);
2038
+ },
2039
+ children: /* @__PURE__ */ jsxs3("span", { className: "inline-flex items-center gap-2", children: [
2040
+ /* @__PURE__ */ jsx4(
2041
+ VenueLogo,
2042
+ {
2043
+ venue: item.venue,
2044
+ size: "small",
2045
+ color: isActiveOutcome ? "var(--agg-color-on-primary)" : void 0
2046
+ }
2047
+ ),
2048
+ /* @__PURE__ */ jsx4(
2049
+ Typography,
2050
+ {
2051
+ variant: isActiveOutcome ? "body-strong" : "body",
2052
+ className: cn(
2053
+ "text-agg-base leading-agg-6",
2054
+ isActiveOutcome ? "text-agg-on-primary" : "text-agg-foreground"
2055
+ ),
2056
+ children: `${item.label} ${formatProbabilityCents(item.probability)}`
2057
+ }
2058
+ )
2059
+ ] })
2188
2060
  },
2189
- children: /* @__PURE__ */ jsxs3("span", { className: "inline-flex items-center gap-2", children: [
2190
- /* @__PURE__ */ jsx4(
2191
- VenueLogo,
2192
- {
2193
- venue: "polymarket",
2194
- size: "small",
2195
- color: isActiveOutcome ? "var(--agg-color-on-primary)" : void 0
2196
- }
2197
- ),
2198
- /* @__PURE__ */ jsx4(
2199
- Typography,
2200
- {
2201
- variant: isActiveOutcome ? "body-strong" : "body",
2202
- className: cn(
2203
- "text-agg-base leading-agg-6",
2204
- isActiveOutcome ? "text-agg-on-primary" : "text-agg-foreground"
2205
- ),
2206
- children: `${item.label} ${formatProbabilityCents(item.probability)}`
2207
- }
2208
- )
2209
- ] })
2210
- },
2211
- item.label
2212
- );
2213
- })
2214
- }
2215
- )
2061
+ item.label
2062
+ );
2063
+ })
2064
+ }
2065
+ )
2066
+ ] })
2216
2067
  ]
2217
2068
  }
2218
2069
  ),
@@ -2222,7 +2073,10 @@ var MarketDetailsContent = ({
2222
2073
  id: detailsContentId,
2223
2074
  className: cn(
2224
2075
  "grid overflow-hidden",
2225
- getMotionClassName(config.enableAnimations, "transition-all duration-500 ease-in-out"),
2076
+ getMotionClassName(
2077
+ config.features.enableAnimations,
2078
+ "transition-all duration-500 ease-in-out"
2079
+ ),
2226
2080
  isOpened ? "grid-rows-[1fr] opacity-100" : "pointer-events-none grid-rows-[0fr] opacity-0"
2227
2081
  ),
2228
2082
  "aria-hidden": !isOpened,
@@ -2233,12 +2087,12 @@ var MarketDetailsContent = ({
2233
2087
  {
2234
2088
  className: cn(
2235
2089
  getMotionClassName(
2236
- config.enableAnimations,
2090
+ config.features.enableAnimations,
2237
2091
  "transition-all duration-500 ease-in-out"
2238
2092
  ),
2239
2093
  isOpened ? cn(
2240
2094
  "translate-y-0 opacity-100",
2241
- getMotionClassName(config.enableAnimations, "delay-100")
2095
+ getMotionClassName(config.features.enableAnimations, "delay-100")
2242
2096
  ) : "translate-y-5 opacity-0"
2243
2097
  ),
2244
2098
  children: [
@@ -2280,8 +2134,8 @@ var MarketDetailsContent = ({
2280
2134
  {
2281
2135
  rows: askRows,
2282
2136
  title: labels.marketDetails.asks,
2283
- formatNumber: config.formatNumber,
2284
- formatCurrency: config.formatCurrency,
2137
+ formatNumber: config.formatting.formatNumber,
2138
+ formatCurrency: config.formatting.formatCurrency,
2285
2139
  visibleRows: orderBookDepth
2286
2140
  }
2287
2141
  ),
@@ -2290,8 +2144,8 @@ var MarketDetailsContent = ({
2290
2144
  {
2291
2145
  rows: bidRows,
2292
2146
  title: labels.marketDetails.bids,
2293
- formatNumber: config.formatNumber,
2294
- formatCurrency: config.formatCurrency,
2147
+ formatNumber: config.formatting.formatNumber,
2148
+ formatCurrency: config.formatting.formatCurrency,
2295
2149
  visibleRows: orderBookDepth
2296
2150
  }
2297
2151
  )
@@ -2374,7 +2228,7 @@ var MarketDetailsContent = ({
2374
2228
  classNames == null ? void 0 : classNames.footer
2375
2229
  ),
2376
2230
  children: [
2377
- /* @__PURE__ */ jsx4("span", { children: typeof model.market.volume === "number" ? `${config.formatCompactCurrency(model.market.volume)} ${labels.marketDetails.meta.volumeSuffix}` : labels.marketDetails.volumeUnavailable }),
2231
+ /* @__PURE__ */ jsx4("span", { children: typeof model.market.volume === "number" ? `${config.formatting.formatCompactCurrency(model.market.volume)} ${labels.marketDetails.meta.volumeSuffix}` : labels.marketDetails.volumeUnavailable }),
2378
2232
  /* @__PURE__ */ jsxs3("div", { className: "flex flex-wrap items-center gap-3 md:gap-4", children: [
2379
2233
  /* @__PURE__ */ jsx4(
2380
2234
  ChartTypeSwitch,
@@ -2439,29 +2293,13 @@ var MarketDetailsContent = ({
2439
2293
  }
2440
2294
  );
2441
2295
  };
2442
- var MarketDetails = (props) => {
2443
- var _a;
2444
- const [uncontrolledIsOpened, setUncontrolledIsOpened] = useState2(
2445
- (_a = props.defaultIsOpened) != null ? _a : marketDetailsDefaultIsOpened
2446
- );
2447
- useEffect2(() => {
2448
- if (typeof props.isOpened !== "boolean")
2449
- return;
2450
- setUncontrolledIsOpened(props.isOpened);
2451
- }, [props.isOpened]);
2452
- const resolvedIsOpened = typeof props.isOpened === "boolean" ? props.isOpened : uncontrolledIsOpened;
2453
- const handleOpenChange = (nextIsOpened) => {
2454
- var _a2;
2455
- if (typeof props.isOpened !== "boolean") {
2456
- setUncontrolledIsOpened(nextIsOpened);
2457
- }
2458
- (_a2 = props.onOpenChange) == null ? void 0 : _a2.call(props, nextIsOpened);
2459
- };
2296
+ var MarketDetails = (_a) => {
2297
+ var _b = _a, { isOpened } = _b, props = __objRest(_b, ["isOpened"]);
2460
2298
  if (props.isLoading) {
2461
2299
  return /* @__PURE__ */ jsx4(
2462
2300
  MarketDetailsLoadingState,
2463
2301
  {
2464
- isOpened: resolvedIsOpened,
2302
+ isOpened,
2465
2303
  ariaLabel: props.ariaLabel,
2466
2304
  classNames: props.classNames
2467
2305
  }
@@ -2471,8 +2309,8 @@ var MarketDetails = (props) => {
2471
2309
  return /* @__PURE__ */ jsx4(
2472
2310
  MarketDetailsContent,
2473
2311
  __spreadProps(__spreadValues({}, props), {
2474
- isOpened: resolvedIsOpened,
2475
- onOpenChange: handleOpenChange,
2312
+ isOpened,
2313
+ onOpenChange: props.onOpenChange,
2476
2314
  venueMarkets: props.venueMarkets
2477
2315
  })
2478
2316
  );
@@ -2481,21 +2319,13 @@ var MarketDetails = (props) => {
2481
2319
  return /* @__PURE__ */ jsx4(MarketDetailsUnavailableState, { ariaLabel: fallbackAriaLabel, classNames: fallbackClassNames });
2482
2320
  };
2483
2321
  MarketDetails.displayName = "MarketDetails";
2484
- var resolveInitialExpandedId = (markets, defaultId) => {
2322
+ var resolveInitialExpandedId = (markets) => {
2485
2323
  var _a, _b;
2486
- if (!markets.length)
2487
- return null;
2488
- if (defaultId) {
2489
- const match = markets.find((m) => m.id === defaultId);
2490
- if (match)
2491
- return match.id;
2492
- }
2324
+ if (!markets.length) return null;
2493
2325
  return (_b = (_a = markets[0]) == null ? void 0 : _a.id) != null ? _b : null;
2494
2326
  };
2495
2327
  var MarketDetailsList = ({
2496
2328
  eventId,
2497
- expandedMarketId,
2498
- defaultExpandedMarketId,
2499
2329
  onExpandedMarketChange,
2500
2330
  defaultTab,
2501
2331
  defaultTimeRange,
@@ -2508,30 +2338,23 @@ var MarketDetailsList = ({
2508
2338
  venueEventId: resolvedEventId,
2509
2339
  enabled: !!resolvedEventId
2510
2340
  });
2511
- const [internalExpandedId, setInternalExpandedId] = useState2(
2512
- () => resolveInitialExpandedId(markets, defaultExpandedMarketId)
2341
+ const [expandedMarketId, setExpandedMarketId] = useState2(
2342
+ () => resolveInitialExpandedId(markets)
2513
2343
  );
2514
2344
  useEffect2(() => {
2515
- if (typeof expandedMarketId !== "undefined")
2516
- return;
2517
- setInternalExpandedId((current) => {
2518
- if (current && markets.some((m) => m.id === current))
2519
- return current;
2520
- return resolveInitialExpandedId(markets, defaultExpandedMarketId);
2345
+ setExpandedMarketId((current) => {
2346
+ if (current && markets.some((m) => m.id === current)) return current;
2347
+ return resolveInitialExpandedId(markets);
2521
2348
  });
2522
- }, [defaultExpandedMarketId, expandedMarketId, markets]);
2523
- useEffect2(() => {
2524
- if (typeof expandedMarketId === "undefined")
2349
+ }, [markets]);
2350
+ const handleToggle = (marketId) => {
2351
+ if (marketId === expandedMarketId) {
2352
+ onExpandedMarketChange == null ? void 0 : onExpandedMarketChange(null);
2353
+ setExpandedMarketId(null);
2525
2354
  return;
2526
- setInternalExpandedId(expandedMarketId);
2527
- }, [expandedMarketId]);
2528
- const resolvedExpandedId = typeof expandedMarketId === "undefined" ? internalExpandedId : expandedMarketId;
2529
- const handleToggle = (marketId, isOpened) => {
2530
- const next = isOpened ? marketId : null;
2531
- if (typeof expandedMarketId === "undefined") {
2532
- setInternalExpandedId(next);
2533
2355
  }
2534
- onExpandedMarketChange == null ? void 0 : onExpandedMarketChange(next);
2356
+ onExpandedMarketChange == null ? void 0 : onExpandedMarketChange(marketId);
2357
+ setExpandedMarketId(marketId);
2535
2358
  };
2536
2359
  if (isLoading) {
2537
2360
  return /* @__PURE__ */ jsxs3("div", { className: cn("flex flex-col gap-3", classNames == null ? void 0 : classNames.root), "aria-label": ariaLabel, children: [
@@ -2564,9 +2387,12 @@ var MarketDetailsList = ({
2564
2387
  return /* @__PURE__ */ jsx4("div", { className: cn("flex flex-col gap-3", classNames == null ? void 0 : classNames.root), "aria-label": ariaLabel, children: markets.map((market) => /* @__PURE__ */ jsx4(
2565
2388
  MarketDetails,
2566
2389
  {
2390
+ marketId: market.id,
2567
2391
  venueMarkets: [market],
2568
- isOpened: resolvedExpandedId === market.id,
2569
- onOpenChange: (nextIsOpened) => handleToggle(market.id, nextIsOpened),
2392
+ isOpened: expandedMarketId === market.id,
2393
+ onOpenChange: (marketId) => {
2394
+ handleToggle(marketId);
2395
+ },
2570
2396
  defaultTab,
2571
2397
  defaultTimeRange,
2572
2398
  ariaLabel: market.question,
@@ -2584,8 +2410,12 @@ import { useVenueEvents, useLabels as useLabels5 } from "@agg-market/hooks";
2584
2410
  // src/events/list/event-list.constants.ts
2585
2411
  var POLYMARKET_VENUE = "polymarket";
2586
2412
  var KALSHI_VENUE = "kalshi";
2413
+ var OPINION_VENUE = "opinion";
2414
+ var PROBABLE_VENUE = "probable";
2587
2415
  var POLYMARKET_VENUE_LOGO = "polymarket";
2588
2416
  var KALSHI_VENUE_LOGO = "kalshi";
2417
+ var OPINION_VENUE_LOGO = "opinion";
2418
+ var PROBABLE_VENUE_LOGO = "probable";
2589
2419
  var getDefaultEventListTabs = (labels) => {
2590
2420
  return [
2591
2421
  {
@@ -2604,25 +2434,34 @@ var getDefaultEventListTabs = (labels) => {
2604
2434
  label: labels.venues.kalshi,
2605
2435
  venueLogo: KALSHI_VENUE_LOGO,
2606
2436
  venues: [KALSHI_VENUE]
2437
+ },
2438
+ {
2439
+ value: "opinion",
2440
+ label: labels.venues.opinion,
2441
+ venueLogo: OPINION_VENUE_LOGO,
2442
+ venues: [OPINION_VENUE]
2443
+ },
2444
+ {
2445
+ value: "probable",
2446
+ label: labels.venues.probable,
2447
+ venueLogo: PROBABLE_VENUE_LOGO,
2448
+ venues: [PROBABLE_VENUE]
2607
2449
  }
2608
2450
  ];
2609
2451
  };
2610
2452
 
2611
2453
  // src/events/list/event-list.utils.ts
2612
2454
  var mapEventToEventListItemEvent = (event) => {
2613
- if (!event.venueMarkets || event.venueMarkets.length === 0)
2614
- return null;
2455
+ if (!event.venueMarkets || event.venueMarkets.length === 0) return null;
2615
2456
  return event;
2616
2457
  };
2617
2458
  var filterEventsByTabValue = (events, _tabValue) => {
2618
2459
  return events;
2619
2460
  };
2620
2461
  var resolveTabVenus = (tab) => {
2621
- if (!tab)
2622
- return void 0;
2623
- if (tab.venues && tab.venues.length > 0)
2624
- return tab.venues;
2625
- if (tab.value === "polymarket" || tab.value === "kalshi") {
2462
+ if (!tab) return void 0;
2463
+ if (tab.venues && tab.venues.length > 0) return tab.venues;
2464
+ if (tab.value === "polymarket" || tab.value === "kalshi" || tab.value === "opinion" || tab.value === "probable") {
2626
2465
  return [tab.value];
2627
2466
  }
2628
2467
  return void 0;
@@ -2634,8 +2473,7 @@ var renderTabIcon = (tab, isActive) => {
2634
2473
  if (tab.venueLogo) {
2635
2474
  return /* @__PURE__ */ jsx5(VenueLogo, { venue: tab.venueLogo, size: "small" });
2636
2475
  }
2637
- if (!tab.iconName)
2638
- return null;
2476
+ if (!tab.iconName) return null;
2639
2477
  return /* @__PURE__ */ jsx5(
2640
2478
  Icon,
2641
2479
  {
@@ -2651,18 +2489,15 @@ var TAB_ICON_AND_GAP_WIDTH = 24;
2651
2489
  var TAB_OUTER_BORDER_WIDTH = 2;
2652
2490
  var TAB_INNER_BORDER_WIDTH = 1;
2653
2491
  var measureTabLabelWidth = (label) => {
2654
- if (typeof document === "undefined")
2655
- return label.length * 9;
2492
+ if (typeof document === "undefined") return label.length * 9;
2656
2493
  const canvas = document.createElement("canvas");
2657
2494
  const context = canvas.getContext("2d");
2658
- if (!context)
2659
- return label.length * 9;
2495
+ if (!context) return label.length * 9;
2660
2496
  context.font = "700 16px Inter";
2661
2497
  return context.measureText(label).width;
2662
2498
  };
2663
2499
  var estimateTabsWidth = (items) => {
2664
- if (items.length === 0)
2665
- return 0;
2500
+ if (items.length === 0) return 0;
2666
2501
  const tabsWidth = items.reduce((sum, item) => {
2667
2502
  const textWidth = Math.ceil(measureTabLabelWidth(item.label));
2668
2503
  const iconWidth = item.icon ? TAB_ICON_AND_GAP_WIDTH : 0;
@@ -2696,13 +2531,13 @@ var EventList = ({
2696
2531
  return resolveTabVenus(activeTab);
2697
2532
  }, [activeTab]);
2698
2533
  const resolvedMaxVisibleItems = useMemo5(() => {
2699
- if (!Number.isFinite(maxVisibleItems))
2700
- return void 0;
2534
+ if (!Number.isFinite(maxVisibleItems)) return void 0;
2701
2535
  return Math.max(1, Math.floor(maxVisibleItems));
2702
2536
  }, [maxVisibleItems]);
2703
2537
  const requestLimit = resolvedMaxVisibleItems != null ? resolvedMaxVisibleItems : limit;
2704
2538
  const shouldPaginate = resolvedMaxVisibleItems == null;
2705
2539
  const { events, isLoading, isError, fetchNextPage, hasNextPage, isFetchingNextPage } = useVenueEvents({
2540
+ queryKeyScope: "event-list",
2706
2541
  venues,
2707
2542
  search,
2708
2543
  categoryIds,
@@ -2713,8 +2548,7 @@ var EventList = ({
2713
2548
  }, [events, activeTabValue]);
2714
2549
  const tileEvents = useMemo5(() => {
2715
2550
  const normalizedEvents = filteredEvents.map((event) => mapEventToEventListItemEvent(event)).filter((event) => event != null);
2716
- if (resolvedMaxVisibleItems == null)
2717
- return normalizedEvents;
2551
+ if (resolvedMaxVisibleItems == null) return normalizedEvents;
2718
2552
  return normalizedEvents.slice(0, resolvedMaxVisibleItems);
2719
2553
  }, [filteredEvents, resolvedMaxVisibleItems]);
2720
2554
  const tabsItems = useMemo5(() => {
@@ -2731,12 +2565,10 @@ var EventList = ({
2731
2565
  const headerRef = useRef(null);
2732
2566
  const titleRef = useRef(null);
2733
2567
  const updateTabsOverflowBehavior = useCallback(() => {
2734
- if (typeof window === "undefined")
2735
- return;
2568
+ if (typeof window === "undefined") return;
2736
2569
  const headerElement = headerRef.current;
2737
2570
  const titleElement = titleRef.current;
2738
- if (!headerElement || !titleElement)
2739
- return;
2571
+ if (!headerElement || !titleElement) return;
2740
2572
  const isDesktop = window.matchMedia("(min-width: 768px)").matches;
2741
2573
  if (!isDesktop) {
2742
2574
  setShouldUseSelectOverflow(false);
@@ -2753,12 +2585,10 @@ var EventList = ({
2753
2585
  updateTabsOverflowBehavior();
2754
2586
  }, [updateTabsOverflowBehavior]);
2755
2587
  useEffect3(() => {
2756
- if (typeof ResizeObserver === "undefined")
2757
- return;
2588
+ if (typeof ResizeObserver === "undefined") return;
2758
2589
  const headerElement = headerRef.current;
2759
2590
  const titleElement = titleRef.current;
2760
- if (!headerElement || !titleElement)
2761
- return;
2591
+ if (!headerElement || !titleElement) return;
2762
2592
  const resizeObserver = new ResizeObserver(() => {
2763
2593
  updateTabsOverflowBehavior();
2764
2594
  });
@@ -2773,20 +2603,15 @@ var EventList = ({
2773
2603
  const shouldRenderLoadingState = isLoading && tileEvents.length === 0;
2774
2604
  const loadMoreRef = useRef(null);
2775
2605
  useEffect3(() => {
2776
- if (!shouldPaginate)
2777
- return;
2778
- if (!hasNextPage)
2779
- return;
2606
+ if (!shouldPaginate) return;
2607
+ if (!hasNextPage) return;
2780
2608
  const target = loadMoreRef.current;
2781
- if (!target)
2782
- return;
2609
+ if (!target) return;
2783
2610
  const observer = new IntersectionObserver(
2784
2611
  (entries) => {
2785
2612
  const entry = entries[0];
2786
- if (!(entry == null ? void 0 : entry.isIntersecting))
2787
- return;
2788
- if (isLoading || isFetchingNextPage || !hasNextPage)
2789
- return;
2613
+ if (!(entry == null ? void 0 : entry.isIntersecting)) return;
2614
+ if (isLoading || isFetchingNextPage || !hasNextPage) return;
2790
2615
  void fetchNextPage();
2791
2616
  },
2792
2617
  {
@@ -2850,13 +2675,12 @@ var EventList = ({
2850
2675
  },
2851
2676
  `loading-${index}`
2852
2677
  )),
2853
- !isLoading && !isError && (tileEvents == null ? void 0 : tileEvents.length) === 0 ? /* @__PURE__ */ jsx5(Card, { className: "col-span-full overflow-hidden shadow-none hover:shadow-none", children: /* @__PURE__ */ jsx5(
2678
+ !isLoading && !isError && (tileEvents == null ? void 0 : tileEvents.length) === 0 ? /* @__PURE__ */ jsx5(Card, { className: "col-span-full overflow-hidden shadow-none hover:shadow-none p-0! border-none! bg-transparent!", children: /* @__PURE__ */ jsx5(
2854
2679
  StateMessage,
2855
2680
  {
2856
2681
  ariaLabel: labels.eventList.emptyAria,
2857
2682
  title: labels.eventList.emptyTitle,
2858
- description: labels.eventList.emptyDescription,
2859
- className: "min-h-[320px]"
2683
+ description: labels.eventList.emptyDescription
2860
2684
  }
2861
2685
  ) }) : null,
2862
2686
  isError ? /* @__PURE__ */ jsx5(
@@ -2879,5 +2703,7 @@ export {
2879
2703
  EventListItemDetails,
2880
2704
  MarketDetails,
2881
2705
  MarketDetailsList,
2706
+ getDefaultEventListTabs,
2707
+ resolveTabVenus,
2882
2708
  EventList
2883
2709
  };