@agg-market/ui 10.0.0 → 11.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 (50) hide show
  1. package/dist/{chunk-GYOCLZGH.mjs → chunk-2KGE5AJQ.mjs} +167 -276
  2. package/dist/{chunk-55YYUTBK.mjs → chunk-5FSWOXEG.mjs} +1 -1
  3. package/dist/{chunk-RYQSVETG.mjs → chunk-HMUMJUIL.mjs} +429 -331
  4. package/dist/{chunk-XP7DREIX.mjs → chunk-IUJXJEDQ.mjs} +1300 -656
  5. package/dist/{chunk-5G4T5R2H.mjs → chunk-UONHGMFI.mjs} +7 -3
  6. package/dist/events.js +756 -670
  7. package/dist/events.mjs +2 -2
  8. package/dist/index.js +2976 -2367
  9. package/dist/index.mjs +13 -6
  10. package/dist/modals.js +26 -9
  11. package/dist/modals.mjs +2 -2
  12. package/dist/pages.js +2653 -1790
  13. package/dist/pages.mjs +4 -4
  14. package/dist/primitives.js +1277 -649
  15. package/dist/primitives.mjs +5 -1
  16. package/dist/styles.css +1 -1
  17. package/dist/tailwind.css +1 -1
  18. package/dist/trading.js +257 -189
  19. package/dist/trading.mjs +2 -2
  20. package/dist/types/events/list/event-list.types.d.mts +1 -1
  21. package/dist/types/events/list/event-list.types.d.ts +1 -1
  22. package/dist/types/events/market-details/index.d.mts +2 -2
  23. package/dist/types/events/market-details/index.d.ts +2 -2
  24. package/dist/types/events/market-details/market-details.types.d.mts +1 -5
  25. package/dist/types/events/market-details/market-details.types.d.ts +1 -5
  26. package/dist/types/primitives/agg-logo/index.d.mts +6 -0
  27. package/dist/types/primitives/agg-logo/index.d.ts +6 -0
  28. package/dist/types/primitives/header/agg-logo.d.mts +2 -0
  29. package/dist/types/primitives/header/agg-logo.d.ts +2 -0
  30. package/dist/types/primitives/header/header.constants.d.mts +3 -0
  31. package/dist/types/primitives/header/header.constants.d.ts +3 -0
  32. package/dist/types/primitives/header/header.types.d.mts +28 -0
  33. package/dist/types/primitives/header/header.types.d.ts +28 -0
  34. package/dist/types/primitives/header/index.d.mts +7 -0
  35. package/dist/types/primitives/header/index.d.ts +7 -0
  36. package/dist/types/primitives/index.d.mts +2 -0
  37. package/dist/types/primitives/index.d.ts +2 -0
  38. package/dist/types/primitives/search/index.d.mts +1 -1
  39. package/dist/types/primitives/search/index.d.ts +1 -1
  40. package/dist/types/primitives/search/search.types.d.mts +9 -59
  41. package/dist/types/primitives/search/search.types.d.ts +9 -59
  42. package/dist/types/primitives/search/search.utils.d.mts +4 -0
  43. package/dist/types/primitives/search/search.utils.d.ts +4 -0
  44. package/dist/types/primitives/skeleton/skeleton.types.d.mts +1 -0
  45. package/dist/types/primitives/skeleton/skeleton.types.d.ts +1 -0
  46. package/dist/types/primitives/skeleton/views/search-skeleton-view.d.mts +5 -0
  47. package/dist/types/primitives/skeleton/views/search-skeleton-view.d.ts +5 -0
  48. package/dist/types/trading/types.d.mts +2 -2
  49. package/dist/types/trading/types.d.ts +2 -2
  50. package/package.json +3 -3
@@ -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-IUJXJEDQ.mjs";
31
41
 
32
42
  // src/events/item/index.tsx
33
43
  import dayjs from "dayjs";
@@ -49,142 +59,6 @@ var isErrorWithStatus = (error, status) => {
49
59
  return getErrorStatus(error) === status;
50
60
  };
51
61
 
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
62
  // src/events/item/index.tsx
189
63
  import { jsx, jsxs } from "react/jsx-runtime";
190
64
  var EventListItemLoadingState = ({
@@ -267,7 +141,7 @@ var EventListItemContent = ({
267
141
  return Array.from(new Set(allVenueMarkets.map((market) => market.venue))).slice(0, 4);
268
142
  }, [allVenueMarkets]);
269
143
  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}` : "";
144
+ const volumeLabel = typeof resolvedVolume === "number" ? `${config.formatting.formatCompactCurrency(resolvedVolume)} ${labels.eventItem.volumeSuffix}` : "";
271
145
  const handleKeyDown = (eventToHandle) => {
272
146
  if (!onClick)
273
147
  return;
@@ -279,10 +153,10 @@ var EventListItemContent = ({
279
153
  const renderArbitrage = (value) => {
280
154
  if (value == null)
281
155
  return null;
282
- if (Math.abs(value) < config.arbitrageThreshold)
156
+ if (Math.abs(value) < config.market.arbitrageThreshold)
283
157
  return null;
284
158
  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) }),
159
+ /* @__PURE__ */ jsx(Typography, { variant: "label-strong", className: "text-agg-success", children: config.formatting.formatPercent(value) }),
286
160
  /* @__PURE__ */ jsx(
287
161
  Icon,
288
162
  {
@@ -353,7 +227,7 @@ var EventListItemContent = ({
353
227
  showBadge ? /* @__PURE__ */ jsx(
354
228
  Badge,
355
229
  {
356
- text: config.formatPercent(probability),
230
+ text: config.formatting.formatPercent(probability),
357
231
  prefix: /* @__PURE__ */ jsx(VenueLogo, { venue: visibleOutcome.venue, size: "small" }),
358
232
  size: "large",
359
233
  classNames: {
@@ -833,7 +707,9 @@ var EventListItemDetailsGraphSection = ({
833
707
  }) => {
834
708
  var _a, _b;
835
709
  const labels = useLabels3();
836
- const { enableLiveUpdates } = useSdkUiConfig2();
710
+ const {
711
+ features: { enableLiveUpdates }
712
+ } = useSdkUiConfig2();
837
713
  const [selectedVenue, setSelectedVenue] = useState(null);
838
714
  const [activeProbabilityMode, setActiveProbabilityMode] = useState("yes");
839
715
  const probabilityModeConfigs = useMemo3(() => {
@@ -1147,7 +1023,7 @@ var EventListItemDetailsContent = ({
1147
1023
  const [selectedOutcomeLabel, setSelectedOutcomeLabel] = useState(() => {
1148
1024
  return resolveDefaultOutcomeLabel(outcomeLabels);
1149
1025
  });
1150
- const configTimeRange = config.defaultChartTimeRange;
1026
+ const configTimeRange = config.chart.defaultChartTimeRange;
1151
1027
  const [selectedTimeRange, setSelectedTimeRange] = useState(() => {
1152
1028
  return getDefaultSelectedTimeRange(defaultTimeRange, configTimeRange);
1153
1029
  });
@@ -1216,7 +1092,7 @@ var EventListItemDetailsContent = ({
1216
1092
  const resolvedVolume = typeof event.volume === "number" ? event.volume : (_a2 = primaryVenueMarket == null ? void 0 : primaryVenueMarket.volume) != null ? _a2 : void 0;
1217
1093
  if (typeof resolvedVolume !== "number")
1218
1094
  return "";
1219
- return `${config.formatCompactCurrency(resolvedVolume)} ${labels.eventItemDetails.volumeSuffix}`;
1095
+ return `${config.formatting.formatCompactCurrency(resolvedVolume)} ${labels.eventItemDetails.volumeSuffix}`;
1220
1096
  }, [config, event.volume, labels.eventItemDetails.volumeSuffix, primaryVenueMarket == null ? void 0 : primaryVenueMarket.volume]);
1221
1097
  if (!primaryVenueMarket || !selectedOutcomeLabel) {
1222
1098
  return /* @__PURE__ */ jsx3(
@@ -1332,7 +1208,7 @@ var EventListItemDetailsContent = ({
1332
1208
  isDateOutcomeMarket,
1333
1209
  classNames,
1334
1210
  venueInfo,
1335
- formatPercent: config.formatPercent,
1211
+ formatPercent: config.formatting.formatPercent,
1336
1212
  selectedTimeRange,
1337
1213
  selectedChartType
1338
1214
  }
@@ -1548,6 +1424,21 @@ var resolveDisplayOutcomeLabels = (labels) => {
1548
1424
  (label) => labels.some((value) => normalizeLabel2(value) === normalizeLabel2(label))
1549
1425
  );
1550
1426
  };
1427
+ var resolveMarketDetailsOutcomeLabels = (venueMarkets) => {
1428
+ var _a;
1429
+ const primaryMarket = selectPrimaryVenueMarket(venueMarkets);
1430
+ const initialLabels = ((_a = primaryMarket == null ? void 0 : primaryMarket.venueMarketOutcomes) != null ? _a : []).map((outcome) => outcome.label.trim()).filter(Boolean);
1431
+ const labels = new Set(initialLabels);
1432
+ venueMarkets.forEach((market) => {
1433
+ sortOutcomes(market.venueMarketOutcomes).forEach((outcome) => {
1434
+ const label = outcome.label.trim();
1435
+ if (!label)
1436
+ return;
1437
+ labels.add(label);
1438
+ });
1439
+ });
1440
+ return [...labels];
1441
+ };
1551
1442
  var resolveInitialOutcomeLabel = (labels, defaultOutcomeLabel) => {
1552
1443
  var _a;
1553
1444
  if (labels.length === 0)
@@ -1599,7 +1490,7 @@ var resolveOutcomeTone = (label, index) => {
1599
1490
  return index === 0 ? "positive" : "negative";
1600
1491
  };
1601
1492
  var resolveHeaderOutcomeItems = (venueMarkets, defaultOutcomeLabel) => {
1602
- const labels = resolveDisplayOutcomeLabels(resolveOutcomeLabels(venueMarkets));
1493
+ const labels = resolveDisplayOutcomeLabels(resolveMarketDetailsOutcomeLabels(venueMarkets));
1603
1494
  const probabilityByLabel = resolveAverageProbabilityByLabel(venueMarkets, labels);
1604
1495
  return labels.slice(0, 2).map((label, index) => {
1605
1496
  var _a;
@@ -1722,7 +1613,9 @@ var buildMarketDetailsModel = ({
1722
1613
  formatCompactCurrency,
1723
1614
  labels
1724
1615
  });
1725
- const outcomeLabels = resolveDisplayOutcomeLabels(resolveOutcomeLabels(market.venueMarkets));
1616
+ const outcomeLabels = resolveDisplayOutcomeLabels(
1617
+ resolveMarketDetailsOutcomeLabels(market.venueMarkets)
1618
+ );
1726
1619
  const probabilityByLabel = resolveAverageProbabilityByLabel(market.venueMarkets, outcomeLabels);
1727
1620
  return {
1728
1621
  market,
@@ -1852,7 +1745,7 @@ var getOutcomeButtonClassName = ({
1852
1745
  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
1746
  const activeStateClassName = isPositive ? "border-transparent bg-[#18c15c] text-agg-on-primary" : "border-transparent bg-[#e5455f] text-agg-on-primary";
1854
1747
  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]",
1748
+ "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
1749
  getMotionClassName(enableAnimations, "transition-all duration-300 ease-in-out"),
1857
1750
  isActive ? activeStateClassName : defaultStateClassName,
1858
1751
  "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 +1758,7 @@ var MarketDetailsContent = ({
1865
1758
  marketId,
1866
1759
  title,
1867
1760
  image,
1868
- isOpened: defaultIsOpened = marketDetailsDefaultIsOpened,
1761
+ isOpened: controlledIsOpened = marketDetailsDefaultIsOpened,
1869
1762
  onOpenChange,
1870
1763
  defaultTab,
1871
1764
  defaultOutcomeLabel,
@@ -1885,10 +1778,10 @@ var MarketDetailsContent = ({
1885
1778
  marketId,
1886
1779
  title,
1887
1780
  image,
1888
- formatCompactCurrency: config.formatCompactCurrency,
1781
+ formatCompactCurrency: config.formatting.formatCompactCurrency,
1889
1782
  labels
1890
1783
  });
1891
- }, [config.formatCompactCurrency, venueMarkets, image, labels, marketId, title]);
1784
+ }, [config.formatting.formatCompactCurrency, venueMarkets, image, labels, marketId, title]);
1892
1785
  const resolvedMarket = useMemo4(() => {
1893
1786
  return resolveMarketFromVenueMarkets(venueMarkets, marketId);
1894
1787
  }, [venueMarkets, marketId]);
@@ -1898,11 +1791,14 @@ var MarketDetailsContent = ({
1898
1791
  const [selectedTab, setSelectedTab] = useState2(
1899
1792
  () => resolveInitialTab(defaultTab)
1900
1793
  );
1901
- const [isOpened, setIsOpened] = useState2(defaultIsOpened);
1794
+ const [isOpened, setIsOpened] = useState2(controlledIsOpened);
1902
1795
  useEffect2(() => {
1903
1796
  setSelectedTab(resolveInitialTab(defaultTab));
1904
1797
  }, [defaultTab]);
1905
- const resolvedDefaultTimeRange = (_a = defaultTimeRange != null ? defaultTimeRange : config.defaultChartTimeRange) != null ? _a : "1D";
1798
+ useEffect2(() => {
1799
+ setIsOpened(controlledIsOpened);
1800
+ }, [controlledIsOpened]);
1801
+ const resolvedDefaultTimeRange = (_a = defaultTimeRange != null ? defaultTimeRange : config.chart.defaultChartTimeRange) != null ? _a : "1D";
1906
1802
  const [selectedTimeRange, setSelectedTimeRange] = useState2(resolvedDefaultTimeRange);
1907
1803
  const [selectedChartType, setSelectedChartType] = useState2("line");
1908
1804
  useEffect2(() => {
@@ -2078,16 +1974,14 @@ var MarketDetailsContent = ({
2078
1974
  setSelectedOutcomeLabel((_a2 = headerOutcomeItems[nextIndex]) == null ? void 0 : _a2.label);
2079
1975
  };
2080
1976
  const handleToggleExpanded = (event) => {
1977
+ if (!marketId)
1978
+ return;
2081
1979
  if (event && "key" in event && (event == null ? void 0 : event.key) !== "Enter" && (event == null ? void 0 : event.key) !== " ") {
2082
1980
  return;
2083
1981
  }
2084
1982
  event == null ? void 0 : event.preventDefault();
2085
1983
  event == null ? void 0 : event.stopPropagation();
2086
- setIsOpened((prev) => {
2087
- const next = !prev;
2088
- onOpenChange == null ? void 0 : onOpenChange(next);
2089
- return next;
2090
- });
1984
+ onOpenChange == null ? void 0 : onOpenChange(marketId);
2091
1985
  };
2092
1986
  const handleGraphVenueToggle = (venue) => {
2093
1987
  setSelectedGraphVenue((currentVenue) => {
@@ -2131,7 +2025,7 @@ var MarketDetailsContent = ({
2131
2025
  {
2132
2026
  className: cn(
2133
2027
  "cursor-pointer disabled:cursor-default",
2134
- "flex flex-wrap flex-row items-center justify-between gap-3 px-5 py-4",
2028
+ "flex flex-nowrap flex-row items-center justify-between gap-3 px-5 py-4",
2135
2029
  isOpened && "pb-3",
2136
2030
  classNames == null ? void 0 : classNames.header
2137
2031
  ),
@@ -2143,7 +2037,7 @@ var MarketDetailsContent = ({
2143
2037
  onClick: handleToggleExpanded,
2144
2038
  onKeyDown: handleToggleExpanded,
2145
2039
  children: [
2146
- /* @__PURE__ */ jsxs3("div", { className: "flex min-w-52 max-w-3/4 items-center gap-3 md:gap-4", children: [
2040
+ /* @__PURE__ */ jsxs3("div", { className: "flex min-w-0 flex-1 items-center gap-3 md:gap-4", children: [
2147
2041
  model.image ? /* @__PURE__ */ jsx4(
2148
2042
  RemoteImage,
2149
2043
  {
@@ -2157,62 +2051,64 @@ var MarketDetailsContent = ({
2157
2051
  /* @__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
2052
  ] })
2159
2053
  ] }),
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);
2054
+ /* @__PURE__ */ jsxs3("div", { className: "flex shrink-0 items-center gap-3", children: [
2055
+ /* @__PURE__ */ jsx4(Typography, { as: "div", variant: "heading", className: "shrink-0", children: formatProbabilityPercent(headlineProbability) }),
2056
+ /* @__PURE__ */ jsx4(
2057
+ "div",
2058
+ {
2059
+ className: "flex shrink-0 gap-2",
2060
+ role: "tablist",
2061
+ "aria-label": labels.marketDetails.marketOutcomesAria,
2062
+ tabIndex: 0,
2063
+ onKeyDown: (e) => handleOutcomeKeyDown(e),
2064
+ children: headerOutcomeItems.map((item) => {
2065
+ const isPositive = item.tone === "positive";
2066
+ const isActiveOutcome = item.label === selectedOutcomeLabel;
2067
+ return /* @__PURE__ */ jsx4(
2068
+ "button",
2069
+ {
2070
+ type: "button",
2071
+ role: "tab",
2072
+ "aria-selected": isActiveOutcome,
2073
+ tabIndex: isActiveOutcome ? 0 : -1,
2074
+ className: getOutcomeButtonClassName({
2075
+ enableAnimations: config.features.enableAnimations,
2076
+ isPositive,
2077
+ isActive: isActiveOutcome
2078
+ }),
2079
+ onClick: (e) => {
2080
+ e.preventDefault();
2081
+ e.stopPropagation();
2082
+ setSelectedOutcomeLabel(item.label);
2083
+ },
2084
+ children: /* @__PURE__ */ jsxs3("span", { className: "inline-flex items-center gap-2", children: [
2085
+ /* @__PURE__ */ jsx4(
2086
+ VenueLogo,
2087
+ {
2088
+ venue: item.venue,
2089
+ size: "small",
2090
+ color: isActiveOutcome ? "var(--agg-color-on-primary)" : void 0
2091
+ }
2092
+ ),
2093
+ /* @__PURE__ */ jsx4(
2094
+ Typography,
2095
+ {
2096
+ variant: isActiveOutcome ? "body-strong" : "body",
2097
+ className: cn(
2098
+ "text-agg-base leading-agg-6",
2099
+ isActiveOutcome ? "text-agg-on-primary" : "text-agg-foreground"
2100
+ ),
2101
+ children: `${item.label} ${formatProbabilityCents(item.probability)}`
2102
+ }
2103
+ )
2104
+ ] })
2188
2105
  },
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
- )
2106
+ item.label
2107
+ );
2108
+ })
2109
+ }
2110
+ )
2111
+ ] })
2216
2112
  ]
2217
2113
  }
2218
2114
  ),
@@ -2222,7 +2118,10 @@ var MarketDetailsContent = ({
2222
2118
  id: detailsContentId,
2223
2119
  className: cn(
2224
2120
  "grid overflow-hidden",
2225
- getMotionClassName(config.enableAnimations, "transition-all duration-500 ease-in-out"),
2121
+ getMotionClassName(
2122
+ config.features.enableAnimations,
2123
+ "transition-all duration-500 ease-in-out"
2124
+ ),
2226
2125
  isOpened ? "grid-rows-[1fr] opacity-100" : "pointer-events-none grid-rows-[0fr] opacity-0"
2227
2126
  ),
2228
2127
  "aria-hidden": !isOpened,
@@ -2233,12 +2132,12 @@ var MarketDetailsContent = ({
2233
2132
  {
2234
2133
  className: cn(
2235
2134
  getMotionClassName(
2236
- config.enableAnimations,
2135
+ config.features.enableAnimations,
2237
2136
  "transition-all duration-500 ease-in-out"
2238
2137
  ),
2239
2138
  isOpened ? cn(
2240
2139
  "translate-y-0 opacity-100",
2241
- getMotionClassName(config.enableAnimations, "delay-100")
2140
+ getMotionClassName(config.features.enableAnimations, "delay-100")
2242
2141
  ) : "translate-y-5 opacity-0"
2243
2142
  ),
2244
2143
  children: [
@@ -2280,8 +2179,8 @@ var MarketDetailsContent = ({
2280
2179
  {
2281
2180
  rows: askRows,
2282
2181
  title: labels.marketDetails.asks,
2283
- formatNumber: config.formatNumber,
2284
- formatCurrency: config.formatCurrency,
2182
+ formatNumber: config.formatting.formatNumber,
2183
+ formatCurrency: config.formatting.formatCurrency,
2285
2184
  visibleRows: orderBookDepth
2286
2185
  }
2287
2186
  ),
@@ -2290,8 +2189,8 @@ var MarketDetailsContent = ({
2290
2189
  {
2291
2190
  rows: bidRows,
2292
2191
  title: labels.marketDetails.bids,
2293
- formatNumber: config.formatNumber,
2294
- formatCurrency: config.formatCurrency,
2192
+ formatNumber: config.formatting.formatNumber,
2193
+ formatCurrency: config.formatting.formatCurrency,
2295
2194
  visibleRows: orderBookDepth
2296
2195
  }
2297
2196
  )
@@ -2374,7 +2273,7 @@ var MarketDetailsContent = ({
2374
2273
  classNames == null ? void 0 : classNames.footer
2375
2274
  ),
2376
2275
  children: [
2377
- /* @__PURE__ */ jsx4("span", { children: typeof model.market.volume === "number" ? `${config.formatCompactCurrency(model.market.volume)} ${labels.marketDetails.meta.volumeSuffix}` : labels.marketDetails.volumeUnavailable }),
2276
+ /* @__PURE__ */ jsx4("span", { children: typeof model.market.volume === "number" ? `${config.formatting.formatCompactCurrency(model.market.volume)} ${labels.marketDetails.meta.volumeSuffix}` : labels.marketDetails.volumeUnavailable }),
2378
2277
  /* @__PURE__ */ jsxs3("div", { className: "flex flex-wrap items-center gap-3 md:gap-4", children: [
2379
2278
  /* @__PURE__ */ jsx4(
2380
2279
  ChartTypeSwitch,
@@ -2439,29 +2338,13 @@ var MarketDetailsContent = ({
2439
2338
  }
2440
2339
  );
2441
2340
  };
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
- };
2341
+ var MarketDetails = (_a) => {
2342
+ var _b = _a, { isOpened } = _b, props = __objRest(_b, ["isOpened"]);
2460
2343
  if (props.isLoading) {
2461
2344
  return /* @__PURE__ */ jsx4(
2462
2345
  MarketDetailsLoadingState,
2463
2346
  {
2464
- isOpened: resolvedIsOpened,
2347
+ isOpened,
2465
2348
  ariaLabel: props.ariaLabel,
2466
2349
  classNames: props.classNames
2467
2350
  }
@@ -2471,8 +2354,8 @@ var MarketDetails = (props) => {
2471
2354
  return /* @__PURE__ */ jsx4(
2472
2355
  MarketDetailsContent,
2473
2356
  __spreadProps(__spreadValues({}, props), {
2474
- isOpened: resolvedIsOpened,
2475
- onOpenChange: handleOpenChange,
2357
+ isOpened,
2358
+ onOpenChange: props.onOpenChange,
2476
2359
  venueMarkets: props.venueMarkets
2477
2360
  })
2478
2361
  );
@@ -2481,21 +2364,14 @@ var MarketDetails = (props) => {
2481
2364
  return /* @__PURE__ */ jsx4(MarketDetailsUnavailableState, { ariaLabel: fallbackAriaLabel, classNames: fallbackClassNames });
2482
2365
  };
2483
2366
  MarketDetails.displayName = "MarketDetails";
2484
- var resolveInitialExpandedId = (markets, defaultId) => {
2367
+ var resolveInitialExpandedId = (markets) => {
2485
2368
  var _a, _b;
2486
2369
  if (!markets.length)
2487
2370
  return null;
2488
- if (defaultId) {
2489
- const match = markets.find((m) => m.id === defaultId);
2490
- if (match)
2491
- return match.id;
2492
- }
2493
2371
  return (_b = (_a = markets[0]) == null ? void 0 : _a.id) != null ? _b : null;
2494
2372
  };
2495
2373
  var MarketDetailsList = ({
2496
2374
  eventId,
2497
- expandedMarketId,
2498
- defaultExpandedMarketId,
2499
2375
  onExpandedMarketChange,
2500
2376
  defaultTab,
2501
2377
  defaultTimeRange,
@@ -2508,30 +2384,24 @@ var MarketDetailsList = ({
2508
2384
  venueEventId: resolvedEventId,
2509
2385
  enabled: !!resolvedEventId
2510
2386
  });
2511
- const [internalExpandedId, setInternalExpandedId] = useState2(
2512
- () => resolveInitialExpandedId(markets, defaultExpandedMarketId)
2387
+ const [expandedMarketId, setExpandedMarketId] = useState2(
2388
+ () => resolveInitialExpandedId(markets)
2513
2389
  );
2514
2390
  useEffect2(() => {
2515
- if (typeof expandedMarketId !== "undefined")
2516
- return;
2517
- setInternalExpandedId((current) => {
2391
+ setExpandedMarketId((current) => {
2518
2392
  if (current && markets.some((m) => m.id === current))
2519
2393
  return current;
2520
- return resolveInitialExpandedId(markets, defaultExpandedMarketId);
2394
+ return resolveInitialExpandedId(markets);
2521
2395
  });
2522
- }, [defaultExpandedMarketId, expandedMarketId, markets]);
2523
- useEffect2(() => {
2524
- if (typeof expandedMarketId === "undefined")
2396
+ }, [markets]);
2397
+ const handleToggle = (marketId) => {
2398
+ if (marketId === expandedMarketId) {
2399
+ onExpandedMarketChange == null ? void 0 : onExpandedMarketChange(null);
2400
+ setExpandedMarketId(null);
2525
2401
  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
2402
  }
2534
- onExpandedMarketChange == null ? void 0 : onExpandedMarketChange(next);
2403
+ onExpandedMarketChange == null ? void 0 : onExpandedMarketChange(marketId);
2404
+ setExpandedMarketId(marketId);
2535
2405
  };
2536
2406
  if (isLoading) {
2537
2407
  return /* @__PURE__ */ jsxs3("div", { className: cn("flex flex-col gap-3", classNames == null ? void 0 : classNames.root), "aria-label": ariaLabel, children: [
@@ -2564,9 +2434,12 @@ var MarketDetailsList = ({
2564
2434
  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
2435
  MarketDetails,
2566
2436
  {
2437
+ marketId: market.id,
2567
2438
  venueMarkets: [market],
2568
- isOpened: resolvedExpandedId === market.id,
2569
- onOpenChange: (nextIsOpened) => handleToggle(market.id, nextIsOpened),
2439
+ isOpened: expandedMarketId === market.id,
2440
+ onOpenChange: (marketId) => {
2441
+ handleToggle(marketId);
2442
+ },
2570
2443
  defaultTab,
2571
2444
  defaultTimeRange,
2572
2445
  ariaLabel: market.question,
@@ -2584,8 +2457,12 @@ import { useVenueEvents, useLabels as useLabels5 } from "@agg-market/hooks";
2584
2457
  // src/events/list/event-list.constants.ts
2585
2458
  var POLYMARKET_VENUE = "polymarket";
2586
2459
  var KALSHI_VENUE = "kalshi";
2460
+ var OPINION_VENUE = "opinion";
2461
+ var PROBABLE_VENUE = "probable";
2587
2462
  var POLYMARKET_VENUE_LOGO = "polymarket";
2588
2463
  var KALSHI_VENUE_LOGO = "kalshi";
2464
+ var OPINION_VENUE_LOGO = "opinion";
2465
+ var PROBABLE_VENUE_LOGO = "probable";
2589
2466
  var getDefaultEventListTabs = (labels) => {
2590
2467
  return [
2591
2468
  {
@@ -2604,6 +2481,18 @@ var getDefaultEventListTabs = (labels) => {
2604
2481
  label: labels.venues.kalshi,
2605
2482
  venueLogo: KALSHI_VENUE_LOGO,
2606
2483
  venues: [KALSHI_VENUE]
2484
+ },
2485
+ {
2486
+ value: "opinion",
2487
+ label: labels.venues.opinion,
2488
+ venueLogo: OPINION_VENUE_LOGO,
2489
+ venues: [OPINION_VENUE]
2490
+ },
2491
+ {
2492
+ value: "probable",
2493
+ label: labels.venues.probable,
2494
+ venueLogo: PROBABLE_VENUE_LOGO,
2495
+ venues: [PROBABLE_VENUE]
2607
2496
  }
2608
2497
  ];
2609
2498
  };
@@ -2622,7 +2511,7 @@ var resolveTabVenus = (tab) => {
2622
2511
  return void 0;
2623
2512
  if (tab.venues && tab.venues.length > 0)
2624
2513
  return tab.venues;
2625
- if (tab.value === "polymarket" || tab.value === "kalshi") {
2514
+ if (tab.value === "polymarket" || tab.value === "kalshi" || tab.value === "opinion" || tab.value === "probable") {
2626
2515
  return [tab.value];
2627
2516
  }
2628
2517
  return void 0;
@@ -2703,6 +2592,7 @@ var EventList = ({
2703
2592
  const requestLimit = resolvedMaxVisibleItems != null ? resolvedMaxVisibleItems : limit;
2704
2593
  const shouldPaginate = resolvedMaxVisibleItems == null;
2705
2594
  const { events, isLoading, isError, fetchNextPage, hasNextPage, isFetchingNextPage } = useVenueEvents({
2595
+ queryKeyScope: "event-list",
2706
2596
  venues,
2707
2597
  search,
2708
2598
  categoryIds,
@@ -2850,13 +2740,12 @@ var EventList = ({
2850
2740
  },
2851
2741
  `loading-${index}`
2852
2742
  )),
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(
2743
+ !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
2744
  StateMessage,
2855
2745
  {
2856
2746
  ariaLabel: labels.eventList.emptyAria,
2857
2747
  title: labels.eventList.emptyTitle,
2858
- description: labels.eventList.emptyDescription,
2859
- className: "min-h-[320px]"
2748
+ description: labels.eventList.emptyDescription
2860
2749
  }
2861
2750
  ) }) : null,
2862
2751
  isError ? /* @__PURE__ */ jsx5(
@@ -2879,5 +2768,7 @@ export {
2879
2768
  EventListItemDetails,
2880
2769
  MarketDetails,
2881
2770
  MarketDetailsList,
2771
+ getDefaultEventListTabs,
2772
+ resolveTabVenus,
2882
2773
  EventList
2883
2774
  };