@agg-market/ui 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. package/dist/badge.d.mts +26 -0
  2. package/dist/badge.d.ts +26 -0
  3. package/dist/badge.js +70 -0
  4. package/dist/badge.mjs +9 -0
  5. package/dist/button.d.mts +20 -0
  6. package/dist/button.d.ts +20 -0
  7. package/dist/button.js +197 -0
  8. package/dist/button.mjs +8 -0
  9. package/dist/card.d.mts +8 -0
  10. package/dist/card.d.ts +8 -0
  11. package/dist/card.js +84 -0
  12. package/dist/card.mjs +7 -0
  13. package/dist/chart.d.mts +40 -0
  14. package/dist/chart.d.ts +40 -0
  15. package/dist/chart.js +418 -0
  16. package/dist/chart.mjs +8 -0
  17. package/dist/chunk-2PGUPOXY.mjs +285 -0
  18. package/dist/chunk-3DV3D2LH.mjs +155 -0
  19. package/dist/chunk-44UEI6KD.mjs +280 -0
  20. package/dist/chunk-4ADCXJE6.mjs +297 -0
  21. package/dist/chunk-4GSXVVSA.mjs +64 -0
  22. package/dist/chunk-4NK2FNAG.mjs +581 -0
  23. package/dist/chunk-4XWCYUV3.mjs +355 -0
  24. package/dist/chunk-5MN6ZNFA.mjs +355 -0
  25. package/dist/chunk-6RRBINER.mjs +50 -0
  26. package/dist/chunk-765JPQDG.mjs +280 -0
  27. package/dist/chunk-7CD7GIZC.mjs +850 -0
  28. package/dist/chunk-7XRKA6XF.mjs +462 -0
  29. package/dist/chunk-AOFP74IB.mjs +850 -0
  30. package/dist/chunk-BNDFQPHF.mjs +9 -0
  31. package/dist/chunk-C4OI72SM.mjs +14 -0
  32. package/dist/chunk-CB2MLGCJ.mjs +279 -0
  33. package/dist/chunk-CKTAVEW2.mjs +212 -0
  34. package/dist/chunk-DA6KZWSK.mjs +807 -0
  35. package/dist/chunk-DBD5GHHD.mjs +147 -0
  36. package/dist/chunk-DQ6XFBYJ.mjs +37 -0
  37. package/dist/chunk-FACIYUNK.mjs +217 -0
  38. package/dist/chunk-FUJQIYOF.mjs +37 -0
  39. package/dist/chunk-FZTAHWOS.mjs +82 -0
  40. package/dist/chunk-GC3QIIH7.mjs +112 -0
  41. package/dist/chunk-GPBLZGJ2.mjs +136 -0
  42. package/dist/chunk-H4LELROL.mjs +262 -0
  43. package/dist/chunk-H7P6DIX4.mjs +262 -0
  44. package/dist/chunk-H7YEBGYY.mjs +42 -0
  45. package/dist/chunk-HJOBAMDU.mjs +142 -0
  46. package/dist/chunk-IJG5I642.mjs +462 -0
  47. package/dist/chunk-IY2AA3OL.mjs +50 -0
  48. package/dist/chunk-J6L5BLKX.mjs +136 -0
  49. package/dist/chunk-J7OETCZ7.mjs +147 -0
  50. package/dist/chunk-JLLMIPIX.mjs +42 -0
  51. package/dist/chunk-KBRLFTJT.mjs +741 -0
  52. package/dist/chunk-KDBYDMYV.mjs +64 -0
  53. package/dist/chunk-L6E6Q4C4.mjs +217 -0
  54. package/dist/chunk-LY6474C4.mjs +297 -0
  55. package/dist/chunk-M23S2DVV.mjs +581 -0
  56. package/dist/chunk-MG243DSX.mjs +44 -0
  57. package/dist/chunk-MRHSN2B7.mjs +279 -0
  58. package/dist/chunk-MXWRCVRJ.mjs +285 -0
  59. package/dist/chunk-NFYS557L.mjs +481 -0
  60. package/dist/chunk-NNSY462N.mjs +212 -0
  61. package/dist/chunk-OUOIDPGX.mjs +25 -0
  62. package/dist/chunk-P5PFQX75.mjs +31 -0
  63. package/dist/chunk-P674XRDY.mjs +481 -0
  64. package/dist/chunk-PAQ542ER.mjs +170 -0
  65. package/dist/chunk-QE46DVJG.mjs +323 -0
  66. package/dist/chunk-QXFDXXDB.mjs +792 -0
  67. package/dist/chunk-R3DRVI4J.mjs +741 -0
  68. package/dist/chunk-TTOR7JCT.mjs +155 -0
  69. package/dist/chunk-V5WIYMKS.mjs +25 -0
  70. package/dist/chunk-VAZE267Q.mjs +82 -0
  71. package/dist/chunk-VLIJ7PQK.mjs +792 -0
  72. package/dist/chunk-VYNVBJK6.mjs +44 -0
  73. package/dist/chunk-WIWJ6DIE.mjs +323 -0
  74. package/dist/chunk-XDAEEJYR.mjs +142 -0
  75. package/dist/chunk-YUIZZ6XE.mjs +31 -0
  76. package/dist/connect-button.d.mts +40 -0
  77. package/dist/connect-button.d.ts +40 -0
  78. package/dist/connect-button.js +1815 -0
  79. package/dist/connect-button.mjs +14 -0
  80. package/dist/event-list-item-details.d.mts +11 -0
  81. package/dist/event-list-item-details.d.ts +11 -0
  82. package/dist/event-list-item-details.js +2140 -0
  83. package/dist/event-list-item-details.mjs +19 -0
  84. package/dist/event-list-item-details.types-CMbXOrT-.d.ts +53 -0
  85. package/dist/event-list-item-details.types-CxWr4Qn1.d.ts +53 -0
  86. package/dist/event-list-item-details.types-DRi99PZq.d.mts +53 -0
  87. package/dist/event-list-item-details.types-DekJKeMD.d.mts +53 -0
  88. package/dist/event-list-item.d.mts +10 -0
  89. package/dist/event-list-item.d.ts +10 -0
  90. package/dist/event-list-item.js +2097 -0
  91. package/dist/event-list-item.mjs +17 -0
  92. package/dist/event-list-item.types-B1490EQm.d.mts +46 -0
  93. package/dist/event-list-item.types-B1490EQm.d.ts +46 -0
  94. package/dist/event-list-item.types-Y6IeJ4e4.d.mts +46 -0
  95. package/dist/event-list-item.types-Y6IeJ4e4.d.ts +46 -0
  96. package/dist/event-list.d.mts +9 -0
  97. package/dist/event-list.d.ts +9 -0
  98. package/dist/event-list.js +3151 -0
  99. package/dist/event-list.mjs +20 -0
  100. package/dist/event-list.types-Bpp6Vn-t.d.mts +13 -0
  101. package/dist/event-list.types-Bpp6Vn-t.d.ts +13 -0
  102. package/dist/event-list.types-CkAAUqwW.d.mts +13 -0
  103. package/dist/event-list.types-CkAAUqwW.d.ts +13 -0
  104. package/dist/event-market-page.d.mts +52 -0
  105. package/dist/event-market-page.d.ts +52 -0
  106. package/dist/event-market-page.js +5369 -0
  107. package/dist/event-market-page.mjs +29 -0
  108. package/dist/hello-world.d.mts +8 -0
  109. package/dist/hello-world.d.ts +8 -0
  110. package/dist/hello-world.js +80 -0
  111. package/dist/hello-world.mjs +8 -0
  112. package/dist/home-page.d.mts +51 -0
  113. package/dist/home-page.d.ts +51 -0
  114. package/dist/home-page.js +3415 -0
  115. package/dist/home-page.mjs +21 -0
  116. package/dist/icon.d.mts +123 -0
  117. package/dist/icon.d.ts +123 -0
  118. package/dist/icon.js +922 -0
  119. package/dist/icon.mjs +57 -0
  120. package/dist/index.d.mts +70 -0
  121. package/dist/index.d.ts +70 -0
  122. package/dist/index.js +8184 -0
  123. package/dist/index.mjs +307 -0
  124. package/dist/loading-icon.d.mts +14 -0
  125. package/dist/loading-icon.d.ts +14 -0
  126. package/dist/loading-icon.js +115 -0
  127. package/dist/loading-icon.mjs +8 -0
  128. package/dist/market-details.d.mts +73 -0
  129. package/dist/market-details.d.ts +73 -0
  130. package/dist/market-details.js +3923 -0
  131. package/dist/market-details.mjs +22 -0
  132. package/dist/modal.d.mts +66 -0
  133. package/dist/modal.d.ts +66 -0
  134. package/dist/modal.js +317 -0
  135. package/dist/modal.mjs +9 -0
  136. package/dist/number-value.d.mts +14 -0
  137. package/dist/number-value.d.ts +14 -0
  138. package/dist/number-value.js +67 -0
  139. package/dist/number-value.mjs +7 -0
  140. package/dist/onboarding-modal.d.mts +88 -0
  141. package/dist/onboarding-modal.d.ts +88 -0
  142. package/dist/onboarding-modal.js +2242 -0
  143. package/dist/onboarding-modal.mjs +24 -0
  144. package/dist/place-order.d.mts +20 -0
  145. package/dist/place-order.d.ts +20 -0
  146. package/dist/place-order.js +2916 -0
  147. package/dist/place-order.mjs +18 -0
  148. package/dist/registry-CVn79H3I.d.mts +106 -0
  149. package/dist/registry-CVn79H3I.d.ts +106 -0
  150. package/dist/search.d.mts +69 -0
  151. package/dist/search.d.ts +69 -0
  152. package/dist/search.js +1465 -0
  153. package/dist/search.mjs +12 -0
  154. package/dist/select.d.mts +19 -0
  155. package/dist/select.d.ts +19 -0
  156. package/dist/select.js +920 -0
  157. package/dist/select.mjs +11 -0
  158. package/dist/settlement.d.mts +16 -0
  159. package/dist/settlement.d.ts +16 -0
  160. package/dist/settlement.js +1769 -0
  161. package/dist/settlement.mjs +15 -0
  162. package/dist/skeleton.d.mts +22 -0
  163. package/dist/skeleton.d.ts +22 -0
  164. package/dist/skeleton.js +523 -0
  165. package/dist/skeleton.mjs +10 -0
  166. package/dist/styles.css +2 -0
  167. package/dist/switch-button.d.mts +21 -0
  168. package/dist/switch-button.d.ts +21 -0
  169. package/dist/switch-button.js +184 -0
  170. package/dist/switch-button.mjs +7 -0
  171. package/dist/tabs.d.mts +27 -0
  172. package/dist/tabs.d.ts +27 -0
  173. package/dist/tabs.js +1708 -0
  174. package/dist/tabs.mjs +12 -0
  175. package/dist/tailwind.css +2 -0
  176. package/dist/types-8VUuQVZq.d.mts +387 -0
  177. package/dist/types-8VUuQVZq.d.ts +387 -0
  178. package/dist/types-CayJ8tWA.d.mts +3 -0
  179. package/dist/types-CayJ8tWA.d.ts +3 -0
  180. package/dist/typography.d.mts +16 -0
  181. package/dist/typography.d.ts +16 -0
  182. package/dist/typography.js +62 -0
  183. package/dist/typography.mjs +7 -0
  184. package/dist/venue-logo.d.mts +12 -0
  185. package/dist/venue-logo.d.ts +12 -0
  186. package/dist/venue-logo.js +350 -0
  187. package/dist/venue-logo.mjs +10 -0
  188. package/dist/venue-logo.types-4hmCg3D3.d.ts +17 -0
  189. package/dist/venue-logo.types-B1iPJgiD.d.mts +17 -0
  190. package/dist/venue-logo.types-Bg8eXtGp.d.ts +17 -0
  191. package/dist/venue-logo.types-QNDwiQ77.d.mts +17 -0
  192. package/package.json +195 -0
@@ -0,0 +1,581 @@
1
+ import {
2
+ buildPriceHistoryGroups,
3
+ formatDateLabel,
4
+ getDefaultSelectedTimeRange,
5
+ getTimeWindowByRange,
6
+ isDateLikeLabel,
7
+ resolveDefaultOutcomeLabel,
8
+ resolveOutcomeLabels,
9
+ resolveOutcomesByVenue,
10
+ resolveSeriesColor
11
+ } from "./chunk-HJOBAMDU.mjs";
12
+ import {
13
+ normalizeProbability,
14
+ resolveEventListItemEvent,
15
+ resolveTileImage,
16
+ resolveTileTitle,
17
+ selectPrimaryVenueMarket
18
+ } from "./chunk-PAQ542ER.mjs";
19
+ import {
20
+ Badge
21
+ } from "./chunk-MG243DSX.mjs";
22
+ import {
23
+ Skeleton,
24
+ detailsBaseCardClassName,
25
+ eventListItemDetailsTimeRanges
26
+ } from "./chunk-P674XRDY.mjs";
27
+ import {
28
+ VenueLogo
29
+ } from "./chunk-4ADCXJE6.mjs";
30
+ import {
31
+ Button
32
+ } from "./chunk-GPBLZGJ2.mjs";
33
+ import {
34
+ Typography
35
+ } from "./chunk-DQ6XFBYJ.mjs";
36
+ import {
37
+ Card
38
+ } from "./chunk-P5PFQX75.mjs";
39
+ import {
40
+ LineChart
41
+ } from "./chunk-L6E6Q4C4.mjs";
42
+ import {
43
+ SwitchButton
44
+ } from "./chunk-3DV3D2LH.mjs";
45
+ import {
46
+ __objRest,
47
+ __spreadProps,
48
+ __spreadValues,
49
+ cn
50
+ } from "./chunk-GC3QIIH7.mjs";
51
+
52
+ // src/events/item-details/index.tsx
53
+ import { useEffect, useMemo, useState } from "react";
54
+ import { useEvent, useLabels, usePriceHistory, useSdkUiConfig } from "@agg/hooks";
55
+ import { jsx, jsxs } from "react/jsx-runtime";
56
+ var EventListItemDetailsLoadingState = ({
57
+ classNames,
58
+ ariaLabel
59
+ }) => {
60
+ const labels = useLabels();
61
+ return /* @__PURE__ */ jsx(
62
+ Skeleton,
63
+ {
64
+ view: "event-list-item-details",
65
+ className: classNames == null ? void 0 : classNames.root,
66
+ ariaLabel: ariaLabel != null ? ariaLabel : labels.eventItemDetails.loading
67
+ }
68
+ );
69
+ };
70
+ var EventListItemDetailsUnavailableState = ({
71
+ classNames,
72
+ ariaLabel
73
+ }) => {
74
+ const labels = useLabels();
75
+ return /* @__PURE__ */ jsx(
76
+ Card,
77
+ {
78
+ className: cn(detailsBaseCardClassName, classNames == null ? void 0 : classNames.root),
79
+ role: "status",
80
+ "aria-label": ariaLabel != null ? ariaLabel : labels.eventItemDetails.unavailableAria,
81
+ children: /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-1", classNames == null ? void 0 : classNames.header), children: [
82
+ /* @__PURE__ */ jsx(Typography, { variant: "title", className: cn("truncate", classNames == null ? void 0 : classNames.title), children: labels.eventItemDetails.unavailableTitle }),
83
+ /* @__PURE__ */ jsx(Typography, { variant: "body", className: "text-agg-muted-foreground", children: labels.eventItemDetails.unavailableDescription })
84
+ ] })
85
+ }
86
+ );
87
+ };
88
+ var EventListItemDetailsGraphSection = ({
89
+ venueMarkets,
90
+ outcomeLabels,
91
+ selectedOutcomeLabel,
92
+ onSelectedOutcomeLabelChange,
93
+ probabilityByLabel,
94
+ switchLabels,
95
+ isDateOutcomeMarket,
96
+ classNames,
97
+ showVenueLogo,
98
+ venueInfo,
99
+ formatPercent,
100
+ selectedTimeRange
101
+ }) => {
102
+ const labels = useLabels();
103
+ const isLocalOutcomeSelection = !isDateOutcomeMarket && outcomeLabels.length === 2;
104
+ const [internalSelectedOutcomeLabel, setInternalSelectedOutcomeLabel] = useState(selectedOutcomeLabel);
105
+ const [selectedBinaryOutcome, setSelectedBinaryOutcome] = useState("Yes");
106
+ useEffect(() => {
107
+ setInternalSelectedOutcomeLabel(selectedOutcomeLabel);
108
+ }, [selectedOutcomeLabel]);
109
+ const resolvedSelectedOutcomeLabel = isLocalOutcomeSelection ? internalSelectedOutcomeLabel : selectedOutcomeLabel;
110
+ const selectedOutcomesByVenue = useMemo(() => {
111
+ return resolveOutcomesByVenue(venueMarkets, resolvedSelectedOutcomeLabel);
112
+ }, [resolvedSelectedOutcomeLabel, venueMarkets]);
113
+ const segmentedDisplayItems = useMemo(() => {
114
+ var _a;
115
+ if (isDateOutcomeMarket) {
116
+ const selectedOutcomeAverageProbability = (_a = probabilityByLabel.get(resolvedSelectedOutcomeLabel)) != null ? _a : 0;
117
+ const noProbability = Math.max(0, 1 - selectedOutcomeAverageProbability);
118
+ return [
119
+ {
120
+ label: labels.eventItemDetails.yes,
121
+ display: `${labels.eventItemDetails.yes} ${formatPercent(selectedOutcomeAverageProbability)}`,
122
+ isActive: selectedBinaryOutcome === "Yes",
123
+ onSelect: () => setSelectedBinaryOutcome("Yes")
124
+ },
125
+ {
126
+ label: labels.eventItemDetails.no,
127
+ display: `${labels.eventItemDetails.no} ${formatPercent(noProbability)}`,
128
+ isActive: selectedBinaryOutcome === "No",
129
+ onSelect: () => setSelectedBinaryOutcome("No")
130
+ }
131
+ ];
132
+ }
133
+ return switchLabels.map((label) => {
134
+ const probability = probabilityByLabel.get(label);
135
+ const probabilitySuffix = probability == null ? "" : ` ${formatPercent(probability)}`;
136
+ return {
137
+ label,
138
+ display: `${label}${probabilitySuffix}`,
139
+ isActive: resolvedSelectedOutcomeLabel === label,
140
+ onSelect: () => {
141
+ if (isLocalOutcomeSelection) {
142
+ setInternalSelectedOutcomeLabel(label);
143
+ return;
144
+ }
145
+ onSelectedOutcomeLabelChange(label);
146
+ }
147
+ };
148
+ });
149
+ }, [
150
+ formatPercent,
151
+ isDateOutcomeMarket,
152
+ isLocalOutcomeSelection,
153
+ onSelectedOutcomeLabelChange,
154
+ probabilityByLabel,
155
+ resolvedSelectedOutcomeLabel,
156
+ selectedBinaryOutcome,
157
+ switchLabels
158
+ ]);
159
+ const priceHistoryGroups = useMemo(() => {
160
+ return buildPriceHistoryGroups(selectedOutcomesByVenue);
161
+ }, [selectedOutcomesByVenue]);
162
+ const timeWindow = useMemo(() => {
163
+ return getTimeWindowByRange(selectedTimeRange);
164
+ }, [selectedTimeRange]);
165
+ const { data: priceHistoryData, isLoading: isPriceHistoryLoading } = usePriceHistory(__spreadProps(__spreadValues({
166
+ groups: priceHistoryGroups
167
+ }, timeWindow), {
168
+ enabled: priceHistoryGroups.length > 0
169
+ }));
170
+ const chartSeries = useMemo(() => {
171
+ if (!(priceHistoryData == null ? void 0 : priceHistoryData.length))
172
+ return [];
173
+ return priceHistoryData.map((history, index) => {
174
+ var _a, _b;
175
+ const matchingOutcomeByVenue = (_a = selectedOutcomesByVenue.find((item) => {
176
+ return item.outcome.id === history.marketId || item.outcome.externalIdentifier === history.marketId || item.market.externalIdentifier === history.marketId;
177
+ })) != null ? _a : selectedOutcomesByVenue.find((item) => item.venue === history.venue);
178
+ const color = resolveSeriesColor((_b = matchingOutcomeByVenue == null ? void 0 : matchingOutcomeByVenue.venue) != null ? _b : history.venue, index);
179
+ return {
180
+ id: `${history.venue}-${history.marketId}-${index}`,
181
+ color,
182
+ points: history.points.map((point) => ({
183
+ time: point.timestamp,
184
+ value: point.price * 100
185
+ }))
186
+ };
187
+ }).filter((seriesItem) => seriesItem.points.length > 0);
188
+ }, [priceHistoryData, selectedOutcomesByVenue]);
189
+ return /* @__PURE__ */ jsx(
190
+ LineChart,
191
+ {
192
+ classNames: { root: classNames == null ? void 0 : classNames.chart },
193
+ series: chartSeries,
194
+ height: 300,
195
+ isLoading: isPriceHistoryLoading,
196
+ showSeriesControls: selectedOutcomesByVenue.length > 0 || segmentedDisplayItems.length > 0,
197
+ renderSeriesControls: () => {
198
+ var _a, _b, _c, _d;
199
+ return /* @__PURE__ */ jsxs(
200
+ "div",
201
+ {
202
+ className: cn("flex flex-row items-center justify-between gap-4", classNames == null ? void 0 : classNames.summary),
203
+ children: [
204
+ /* @__PURE__ */ jsx(
205
+ "div",
206
+ {
207
+ className: cn(
208
+ "flex min-w-0 gap-2 overflow-x-auto pb-1 md:flex-wrap md:overflow-visible md:pb-0",
209
+ classNames == null ? void 0 : classNames.outcomeBadges
210
+ ),
211
+ children: selectedOutcomesByVenue.map((outcomeByVenue) => {
212
+ var _a2;
213
+ const probability = normalizeProbability(outcomeByVenue.outcome.price);
214
+ const text = probability == null ? "-" : formatPercent(probability);
215
+ return /* @__PURE__ */ jsx(
216
+ Badge,
217
+ {
218
+ text,
219
+ size: "l",
220
+ prefix: showVenueLogo ? /* @__PURE__ */ jsx(
221
+ VenueLogo,
222
+ {
223
+ venue: outcomeByVenue.venue,
224
+ size: "s",
225
+ title: (_a2 = venueInfo == null ? void 0 : venueInfo[outcomeByVenue.venue]) == null ? void 0 : _a2.label
226
+ }
227
+ ) : void 0,
228
+ classNames: {
229
+ root: "h-9 shrink-0 bg-agg-secondary-hover px-4 text-agg-base leading-agg-6"
230
+ }
231
+ },
232
+ `${outcomeByVenue.market.id}-${outcomeByVenue.outcome.id}`
233
+ );
234
+ })
235
+ }
236
+ ),
237
+ /* @__PURE__ */ jsx(
238
+ SwitchButton,
239
+ {
240
+ ariaLabel: labels.eventItemDetails.outcomeSelectorAria,
241
+ className: cn("w-full md:w-fit", classNames == null ? void 0 : classNames.segmentedControl),
242
+ value: (_d = (_c = (_a = segmentedDisplayItems.find((item) => item.isActive)) == null ? void 0 : _a.label) != null ? _c : (_b = segmentedDisplayItems[0]) == null ? void 0 : _b.label) != null ? _d : "",
243
+ onValueChange: (nextValue) => {
244
+ var _a2;
245
+ (_a2 = segmentedDisplayItems.find((item) => item.label === nextValue)) == null ? void 0 : _a2.onSelect();
246
+ },
247
+ options: segmentedDisplayItems.map((segmentedItem) => ({
248
+ value: segmentedItem.label,
249
+ label: segmentedItem.display,
250
+ ariaLabel: segmentedItem.display
251
+ }))
252
+ }
253
+ )
254
+ ]
255
+ }
256
+ );
257
+ }
258
+ }
259
+ );
260
+ };
261
+ var EventListItemDetailsContent = ({
262
+ event,
263
+ title,
264
+ image,
265
+ showVenueLogo = true,
266
+ classNames,
267
+ venueInfo,
268
+ detailsStats,
269
+ ariaLabel,
270
+ defaultTimeRange
271
+ }) => {
272
+ const config = useSdkUiConfig();
273
+ const labels = useLabels();
274
+ const venueMarkets = useMemo(() => {
275
+ var _a, _b, _c;
276
+ return (_c = (_b = (_a = event.markets) == null ? void 0 : _a[0]) == null ? void 0 : _b.venueMarkets) != null ? _c : [];
277
+ }, [event.markets]);
278
+ const primaryVenueMarket = useMemo(() => {
279
+ return selectPrimaryVenueMarket(venueMarkets);
280
+ }, [venueMarkets]);
281
+ const outcomeLabels = useMemo(() => {
282
+ return resolveOutcomeLabels(venueMarkets);
283
+ }, [venueMarkets]);
284
+ const [selectedOutcomeLabel, setSelectedOutcomeLabel] = useState(() => {
285
+ return resolveDefaultOutcomeLabel(outcomeLabels);
286
+ });
287
+ const [selectedTimeRange, setSelectedTimeRange] = useState(() => {
288
+ return getDefaultSelectedTimeRange(defaultTimeRange);
289
+ });
290
+ useEffect(() => {
291
+ setSelectedTimeRange(getDefaultSelectedTimeRange(defaultTimeRange));
292
+ }, [defaultTimeRange]);
293
+ const resolvedTitle = resolveTileTitle(event, primaryVenueMarket, title);
294
+ const resolvedImage = resolveTileImage(event, primaryVenueMarket, image);
295
+ const isDateOutcomeMarket = outcomeLabels.length > 2 && outcomeLabels.every(isDateLikeLabel);
296
+ const outcomeSelectorLabels = outcomeLabels;
297
+ const probabilityByLabel = useMemo(() => {
298
+ return new Map(
299
+ outcomeLabels.map((label) => {
300
+ const outcomesByVenue = resolveOutcomesByVenue(venueMarkets, label);
301
+ const probabilities = outcomesByVenue.map((item) => normalizeProbability(item.outcome.price)).filter((value) => value != null);
302
+ if (probabilities.length === 0) {
303
+ return [label, void 0];
304
+ }
305
+ const averageProbability = probabilities.reduce((sum, value) => sum + value, 0) / probabilities.length;
306
+ return [label, averageProbability];
307
+ })
308
+ );
309
+ }, [outcomeLabels, venueMarkets]);
310
+ const mainOutcomeLabel = useMemo(() => {
311
+ if (outcomeLabels.length === 0)
312
+ return void 0;
313
+ return [...outcomeLabels].sort((left, right) => {
314
+ var _a, _b;
315
+ const leftProbability = (_a = probabilityByLabel.get(left)) != null ? _a : -1;
316
+ const rightProbability = (_b = probabilityByLabel.get(right)) != null ? _b : -1;
317
+ return rightProbability - leftProbability;
318
+ })[0];
319
+ }, [outcomeLabels, probabilityByLabel]);
320
+ useEffect(() => {
321
+ if (!outcomeLabels.length) {
322
+ setSelectedOutcomeLabel(void 0);
323
+ return;
324
+ }
325
+ if (selectedOutcomeLabel && outcomeLabels.includes(selectedOutcomeLabel)) {
326
+ return;
327
+ }
328
+ const fallbackOutcomeLabel = isDateOutcomeMarket ? resolveDefaultOutcomeLabel(outcomeLabels) : mainOutcomeLabel != null ? mainOutcomeLabel : resolveDefaultOutcomeLabel(outcomeLabels);
329
+ setSelectedOutcomeLabel(fallbackOutcomeLabel);
330
+ }, [isDateOutcomeMarket, mainOutcomeLabel, outcomeLabels, selectedOutcomeLabel]);
331
+ const switchLabels = useMemo(() => {
332
+ var _a, _b;
333
+ if (isDateOutcomeMarket) {
334
+ return [labels.eventItemDetails.yes, labels.eventItemDetails.no];
335
+ }
336
+ const sortedOutcomeLabels = [...outcomeLabels].sort((left, right) => {
337
+ var _a2, _b2;
338
+ const leftProbability = (_a2 = probabilityByLabel.get(left)) != null ? _a2 : -1;
339
+ const rightProbability = (_b2 = probabilityByLabel.get(right)) != null ? _b2 : -1;
340
+ return rightProbability - leftProbability;
341
+ });
342
+ const firstLabel = (_a = sortedOutcomeLabels[0]) != null ? _a : labels.eventItemDetails.yes;
343
+ const secondLabel = (_b = sortedOutcomeLabels.find((label) => label !== firstLabel)) != null ? _b : firstLabel;
344
+ return [firstLabel, secondLabel];
345
+ }, [
346
+ isDateOutcomeMarket,
347
+ labels.eventItemDetails.no,
348
+ labels.eventItemDetails.yes,
349
+ outcomeLabels,
350
+ probabilityByLabel
351
+ ]);
352
+ const volumeLabel = useMemo(() => {
353
+ var _a;
354
+ const resolvedVolume = typeof event.volume === "number" ? event.volume : (_a = primaryVenueMarket == null ? void 0 : primaryVenueMarket.volume) != null ? _a : void 0;
355
+ if (typeof resolvedVolume !== "number")
356
+ return "";
357
+ return `${config.formatCompactCurrency(resolvedVolume)} ${labels.eventItemDetails.volumeSuffix}`;
358
+ }, [config, event.volume, labels.eventItemDetails.volumeSuffix, primaryVenueMarket == null ? void 0 : primaryVenueMarket.volume]);
359
+ if (!primaryVenueMarket || !selectedOutcomeLabel) {
360
+ return /* @__PURE__ */ jsx(EventListItemDetailsUnavailableState, { classNames, ariaLabel });
361
+ }
362
+ return /* @__PURE__ */ jsxs(
363
+ Card,
364
+ {
365
+ className: cn(detailsBaseCardClassName, classNames == null ? void 0 : classNames.root),
366
+ "aria-label": ariaLabel != null ? ariaLabel : resolvedTitle,
367
+ children: [
368
+ /* @__PURE__ */ jsxs("div", { className: cn("flex items-start gap-3 md:gap-4", classNames == null ? void 0 : classNames.header), children: [
369
+ resolvedImage ? /* @__PURE__ */ jsx(
370
+ "img",
371
+ {
372
+ src: resolvedImage,
373
+ alt: "",
374
+ className: "size-10 rounded-agg-lg object-cover md:size-[60px]"
375
+ }
376
+ ) : null,
377
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-3", children: [
378
+ /* @__PURE__ */ jsx(
379
+ Typography,
380
+ {
381
+ variant: "value",
382
+ className: cn(
383
+ "min-w-0 text-agg-base font-agg-bold leading-agg-6 whitespace-normal [display:-webkit-box] [-webkit-box-orient:vertical] [-webkit-line-clamp:2] md:text-agg-2xl md:leading-agg-8 md:[display:block] md:truncate md:whitespace-nowrap",
384
+ classNames == null ? void 0 : classNames.title
385
+ ),
386
+ children: resolvedTitle
387
+ }
388
+ ),
389
+ outcomeSelectorLabels.length > 2 ? /* @__PURE__ */ jsx(
390
+ "div",
391
+ {
392
+ className: cn(
393
+ "flex items-center gap-2 overflow-x-auto pb-1 md:flex-wrap md:overflow-visible md:pb-0",
394
+ classNames == null ? void 0 : classNames.headerPills
395
+ ),
396
+ children: outcomeSelectorLabels.map((outcomeSelectorLabel) => {
397
+ const isActive = outcomeSelectorLabel === selectedOutcomeLabel;
398
+ const displayLabel = isDateLikeLabel(outcomeSelectorLabel) ? formatDateLabel(outcomeSelectorLabel) : outcomeSelectorLabel;
399
+ return /* @__PURE__ */ jsx(
400
+ Button,
401
+ {
402
+ size: "s",
403
+ variant: "secondary",
404
+ "aria-pressed": isActive,
405
+ className: cn(
406
+ "h-auto shrink-0 rounded-agg-full px-4 py-1.5 text-agg-sm leading-agg-5",
407
+ "border-2",
408
+ isActive ? "border-agg-primary bg-agg-secondary text-agg-foreground font-agg-bold" : "border-transparent bg-agg-secondary-hover text-agg-foreground font-agg-normal"
409
+ ),
410
+ onClick: () => setSelectedOutcomeLabel(outcomeSelectorLabel),
411
+ children: displayLabel
412
+ },
413
+ outcomeSelectorLabel
414
+ );
415
+ })
416
+ }
417
+ ) : null
418
+ ] })
419
+ ] }),
420
+ detailsStats && detailsStats.length > 0 ? /* @__PURE__ */ jsx("div", { className: cn("flex flex-wrap items-start gap-4 md:gap-6", classNames == null ? void 0 : classNames.headerStats), children: detailsStats.map((statItem) => {
421
+ const deltaClassName = statItem.deltaTone === "positive" ? "text-agg-success" : statItem.deltaTone === "negative" ? "text-agg-error" : "text-agg-muted-foreground";
422
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
423
+ /* @__PURE__ */ jsx(
424
+ Typography,
425
+ {
426
+ variant: "label",
427
+ className: "text-agg-xs leading-agg-4 tracking-agg-normal text-agg-muted-foreground",
428
+ children: statItem.label
429
+ }
430
+ ),
431
+ /* @__PURE__ */ jsxs("div", { className: "flex items-baseline gap-1", children: [
432
+ /* @__PURE__ */ jsx(
433
+ Typography,
434
+ {
435
+ variant: "body",
436
+ className: "text-agg-lg leading-agg-7 text-agg-foreground",
437
+ children: statItem.value
438
+ }
439
+ ),
440
+ statItem.delta ? /* @__PURE__ */ jsx(
441
+ Typography,
442
+ {
443
+ variant: "meta",
444
+ className: cn("text-agg-sm leading-agg-5", deltaClassName),
445
+ children: statItem.delta
446
+ }
447
+ ) : null
448
+ ] })
449
+ ] }, `${statItem.label}-${statItem.value}`);
450
+ }) }) : null,
451
+ /* @__PURE__ */ jsx(
452
+ EventListItemDetailsGraphSection,
453
+ {
454
+ venueMarkets,
455
+ outcomeLabels,
456
+ selectedOutcomeLabel,
457
+ onSelectedOutcomeLabelChange: setSelectedOutcomeLabel,
458
+ probabilityByLabel,
459
+ switchLabels,
460
+ isDateOutcomeMarket,
461
+ classNames,
462
+ showVenueLogo,
463
+ venueInfo,
464
+ formatPercent: config.formatPercent,
465
+ selectedTimeRange
466
+ }
467
+ ),
468
+ /* @__PURE__ */ jsxs("div", { className: cn("flex flex-wrap items-center justify-between gap-4", classNames == null ? void 0 : classNames.footer), children: [
469
+ /* @__PURE__ */ jsx(Typography, { variant: "meta", className: "text-agg-muted-foreground text-agg-sm leading-agg-5", children: volumeLabel || "-" }),
470
+ /* @__PURE__ */ jsx("div", { className: cn("flex items-center gap-2 md:gap-3", classNames == null ? void 0 : classNames.timeRange), children: eventListItemDetailsTimeRanges.map((timeRange) => {
471
+ const isActive = timeRange === selectedTimeRange;
472
+ return /* @__PURE__ */ jsx(
473
+ Button,
474
+ {
475
+ size: "xs",
476
+ variant: "tertiary",
477
+ className: cn(
478
+ "h-auto min-w-0 rounded-none px-0 py-0 text-agg-xs leading-agg-4 md:text-agg-sm md:leading-agg-5",
479
+ "border-0 bg-transparent shadow-none",
480
+ isActive ? "font-agg-bold text-agg-foreground" : "font-agg-normal text-agg-muted-foreground"
481
+ ),
482
+ "aria-pressed": isActive,
483
+ onClick: () => setSelectedTimeRange(timeRange),
484
+ children: timeRange === "ALL" ? labels.eventItemDetails.allTimeRange : timeRange
485
+ },
486
+ timeRange
487
+ );
488
+ }) })
489
+ ] })
490
+ ]
491
+ }
492
+ );
493
+ };
494
+ var EventListItemDetailsByEventId = (_a) => {
495
+ var _b = _a, {
496
+ eventId
497
+ } = _b, rest = __objRest(_b, [
498
+ "eventId"
499
+ ]);
500
+ const {
501
+ event: fetchedEvent,
502
+ isError,
503
+ isLoading
504
+ } = useEvent(eventId, {
505
+ enabled: !!eventId
506
+ });
507
+ const resolvedEvent = useMemo(() => {
508
+ return resolveEventListItemEvent(fetchedEvent);
509
+ }, [fetchedEvent]);
510
+ if (!eventId) {
511
+ return /* @__PURE__ */ jsx(
512
+ EventListItemDetailsUnavailableState,
513
+ {
514
+ classNames: rest.classNames,
515
+ ariaLabel: rest.ariaLabel
516
+ }
517
+ );
518
+ }
519
+ if (isLoading) {
520
+ return /* @__PURE__ */ jsx(EventListItemDetailsLoadingState, { classNames: rest.classNames, ariaLabel: rest.ariaLabel });
521
+ }
522
+ if (!resolvedEvent && !isError) {
523
+ return /* @__PURE__ */ jsx(EventListItemDetailsLoadingState, { classNames: rest.classNames, ariaLabel: rest.ariaLabel });
524
+ }
525
+ if (!resolvedEvent) {
526
+ return /* @__PURE__ */ jsx(
527
+ EventListItemDetailsUnavailableState,
528
+ {
529
+ classNames: rest.classNames,
530
+ ariaLabel: rest.ariaLabel
531
+ }
532
+ );
533
+ }
534
+ return /* @__PURE__ */ jsx(EventListItemDetailsContent, __spreadValues({ event: resolvedEvent }, rest));
535
+ };
536
+ var EventListItemDetails = (props) => {
537
+ if (props.isLoading) {
538
+ return /* @__PURE__ */ jsx(EventListItemDetailsLoadingState, { classNames: props.classNames, ariaLabel: props.ariaLabel });
539
+ }
540
+ if ("event" in props && props.event) {
541
+ const _a = props, { event } = _a, rest = __objRest(_a, ["event"]);
542
+ return /* @__PURE__ */ jsx(EventListItemDetailsContent, __spreadValues({ event }, rest));
543
+ }
544
+ if ("eventId" in props && typeof props.eventId === "string") {
545
+ const {
546
+ title: titleOverride,
547
+ image: imageOverride,
548
+ showVenueLogo: showVenueLogoOverride,
549
+ classNames,
550
+ venueInfo,
551
+ detailsStats,
552
+ ariaLabel: ariaLabelOverride,
553
+ defaultTimeRange: defaultTimeRangeOverride
554
+ } = props;
555
+ const byEventIdProps = {
556
+ eventId: props.eventId,
557
+ isLoading: false,
558
+ title: titleOverride,
559
+ image: imageOverride,
560
+ showVenueLogo: showVenueLogoOverride,
561
+ classNames,
562
+ venueInfo,
563
+ detailsStats,
564
+ ariaLabel: ariaLabelOverride,
565
+ defaultTimeRange: defaultTimeRangeOverride
566
+ };
567
+ return /* @__PURE__ */ jsx(EventListItemDetailsByEventId, __spreadValues({}, byEventIdProps));
568
+ }
569
+ return /* @__PURE__ */ jsx(
570
+ EventListItemDetailsUnavailableState,
571
+ {
572
+ classNames: props.classNames,
573
+ ariaLabel: props.ariaLabel
574
+ }
575
+ );
576
+ };
577
+ EventListItemDetails.displayName = "EventListItemDetails";
578
+
579
+ export {
580
+ EventListItemDetails
581
+ };
@@ -0,0 +1,44 @@
1
+ import {
2
+ cn
3
+ } from "./chunk-GC3QIIH7.mjs";
4
+
5
+ // src/primitives/badge/badge.constants.ts
6
+ var badgeSizes = ["xxs", "xs", "s", "m", "l", "xl", "xxl"];
7
+ var badgeSizeClasses = {
8
+ xxs: cn("h-4 px-1.5 gap-0.5", "text-agg-xs leading-agg-3"),
9
+ xs: cn("h-5 px-2 gap-1", "text-agg-xs leading-agg-4"),
10
+ s: cn("h-6 px-2.5 gap-1", "text-agg-sm leading-agg-5"),
11
+ m: cn("h-7 px-3 gap-1.5", "text-agg-sm leading-agg-5"),
12
+ l: cn("h-8 px-3.5 gap-1.5", "text-agg-base leading-agg-6"),
13
+ xl: cn("h-9 px-4 gap-2", "text-agg-lg leading-agg-7"),
14
+ xxl: cn("h-10 px-5 gap-2", "text-agg-xl leading-agg-7")
15
+ };
16
+ var baseBadgeClasses = cn(
17
+ "inline-flex items-center justify-center rounded-agg-full font-agg-sans",
18
+ "bg-agg-secondary-hover text-agg-foreground whitespace-nowrap font-agg-normal"
19
+ );
20
+
21
+ // src/primitives/badge/index.tsx
22
+ import { jsx, jsxs } from "react/jsx-runtime";
23
+ function Badge({ text, prefix, suffix, size = "m", classNames }) {
24
+ const resolvedText = `${text}`;
25
+ const resolvedAriaLabel = resolvedText.length > 0 ? resolvedText : void 0;
26
+ return /* @__PURE__ */ jsxs(
27
+ "span",
28
+ {
29
+ "aria-label": resolvedAriaLabel,
30
+ className: cn(baseBadgeClasses, badgeSizeClasses[size], classNames == null ? void 0 : classNames.root),
31
+ children: [
32
+ prefix ? /* @__PURE__ */ jsx("span", { className: classNames == null ? void 0 : classNames.prefix, children: prefix }) : null,
33
+ /* @__PURE__ */ jsx("span", { className: cn("truncate", classNames == null ? void 0 : classNames.text), children: text }),
34
+ suffix ? /* @__PURE__ */ jsx("span", { className: classNames == null ? void 0 : classNames.suffix, children: suffix }) : null
35
+ ]
36
+ }
37
+ );
38
+ }
39
+ Badge.displayName = "Badge";
40
+
41
+ export {
42
+ badgeSizes,
43
+ Badge
44
+ };