@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,136 @@
1
+ import {
2
+ iconSizeClasses
3
+ } from "./chunk-C4OI72SM.mjs";
4
+ import {
5
+ __objRest,
6
+ __spreadProps,
7
+ __spreadValues,
8
+ cn,
9
+ getMotionClassName
10
+ } from "./chunk-GC3QIIH7.mjs";
11
+
12
+ // src/primitives/button/index.tsx
13
+ import { useSdkUiConfig } from "@agg/hooks";
14
+
15
+ // src/primitives/button/button.constants.ts
16
+ var sizeClasses = {
17
+ xxs: cn("h-6 px-2.5 gap-1", "text-agg-xs leading-agg-4"),
18
+ xs: cn("h-7 px-3 gap-1", "text-agg-xs leading-agg-4"),
19
+ s: cn("h-8 px-4 gap-1.5", "text-agg-sm leading-agg-5"),
20
+ m: cn("h-9 px-5 gap-1.5", "text-agg-sm leading-agg-5"),
21
+ l: cn("h-10 px-6 gap-2", "text-agg-base leading-agg-6"),
22
+ xl: cn("h-11 px-7 gap-2", "text-agg-base leading-agg-6"),
23
+ xxl: cn("h-12 px-8 gap-2", "text-agg-base leading-agg-6")
24
+ };
25
+ var iconSizeClasses2 = {
26
+ xxs: iconSizeClasses.xs,
27
+ xs: iconSizeClasses.xs,
28
+ s: iconSizeClasses.s,
29
+ m: iconSizeClasses.s,
30
+ l: iconSizeClasses.s,
31
+ xl: iconSizeClasses.s,
32
+ xxl: iconSizeClasses.s
33
+ };
34
+ var iconSlotClasses = {
35
+ xxs: "[&_svg]:h-3 [&_svg]:w-3",
36
+ xs: "[&_svg]:h-3 [&_svg]:w-3",
37
+ s: "[&_svg]:h-4 [&_svg]:w-4",
38
+ m: "[&_svg]:h-4 [&_svg]:w-4",
39
+ l: "[&_svg]:h-4 [&_svg]:w-4",
40
+ xl: "[&_svg]:h-4 [&_svg]:w-4",
41
+ xxl: "[&_svg]:h-4 [&_svg]:w-4"
42
+ };
43
+ var variantClasses = {
44
+ primary: cn(
45
+ "bg-agg-primary text-agg-on-primary",
46
+ "hover:bg-agg-primary-hover",
47
+ "disabled:bg-agg-separator disabled:text-agg-on-primary",
48
+ "focus-visible:ring-agg-primary-hover"
49
+ ),
50
+ secondary: cn(
51
+ "border border-agg-separator bg-agg-secondary text-agg-foreground",
52
+ "hover:bg-agg-secondary-hover",
53
+ "disabled:bg-agg-secondary disabled:text-agg-muted-foreground disabled:border-agg-separator",
54
+ "focus-visible:ring-agg-separator"
55
+ ),
56
+ tertiary: cn(
57
+ "bg-transparent text-agg-foreground",
58
+ "hover:bg-agg-secondary-hover",
59
+ "disabled:bg-transparent disabled:text-agg-muted-foreground",
60
+ "focus-visible:ring-agg-separator"
61
+ )
62
+ };
63
+ var baseButtonClasses = cn(
64
+ "cursor-pointer disabled:cursor-not-allowed",
65
+ "inline-flex items-center justify-center rounded-agg-full font-agg-sans font-agg-bold text-center",
66
+ "whitespace-nowrap",
67
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-offset-agg-secondary"
68
+ );
69
+
70
+ // src/primitives/button/index.tsx
71
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
72
+ var Button = (_a) => {
73
+ var _b = _a, {
74
+ children,
75
+ variant = "primary",
76
+ size = "m",
77
+ isLoading = false,
78
+ disabled,
79
+ prefix,
80
+ suffix,
81
+ type = "button",
82
+ className,
83
+ "aria-label": ariaLabel
84
+ } = _b, other = __objRest(_b, [
85
+ "children",
86
+ "variant",
87
+ "size",
88
+ "isLoading",
89
+ "disabled",
90
+ "prefix",
91
+ "suffix",
92
+ "type",
93
+ "className",
94
+ "aria-label"
95
+ ]);
96
+ const { enableAnimations } = useSdkUiConfig();
97
+ const isDisabled = disabled || isLoading;
98
+ return /* @__PURE__ */ jsx(
99
+ "button",
100
+ __spreadProps(__spreadValues({
101
+ type,
102
+ className: cn(
103
+ baseButtonClasses,
104
+ getMotionClassName(enableAnimations, "transition-colors"),
105
+ sizeClasses[size],
106
+ iconSlotClasses[size],
107
+ variantClasses[variant],
108
+ className
109
+ ),
110
+ disabled: isDisabled,
111
+ "aria-busy": isLoading,
112
+ "aria-label": ariaLabel
113
+ }, other), {
114
+ children: isLoading ? /* @__PURE__ */ jsx(
115
+ "span",
116
+ {
117
+ className: cn(
118
+ "inline-block rounded-agg-full border-2 border-current border-r-transparent",
119
+ getMotionClassName(enableAnimations, "animate-spin"),
120
+ iconSizeClasses2[size]
121
+ ),
122
+ "aria-hidden": "true"
123
+ }
124
+ ) : /* @__PURE__ */ jsxs(Fragment, { children: [
125
+ prefix != null ? prefix : null,
126
+ /* @__PURE__ */ jsx("span", { children }),
127
+ suffix != null ? suffix : null
128
+ ] })
129
+ })
130
+ );
131
+ };
132
+ Button.displayName = "Button";
133
+
134
+ export {
135
+ Button
136
+ };
@@ -0,0 +1,262 @@
1
+ import {
2
+ EventListItem
3
+ } from "./chunk-MRHSN2B7.mjs";
4
+ import {
5
+ Tabs
6
+ } from "./chunk-VLIJ7PQK.mjs";
7
+ import {
8
+ Skeleton
9
+ } from "./chunk-P674XRDY.mjs";
10
+ import {
11
+ VenueLogo
12
+ } from "./chunk-4ADCXJE6.mjs";
13
+ import {
14
+ Icon
15
+ } from "./chunk-DA6KZWSK.mjs";
16
+ import {
17
+ Typography
18
+ } from "./chunk-DQ6XFBYJ.mjs";
19
+ import {
20
+ __spreadProps,
21
+ __spreadValues,
22
+ cn
23
+ } from "./chunk-GC3QIIH7.mjs";
24
+
25
+ // src/events/list/index.tsx
26
+ import { useEffect, useMemo, useRef, useState } from "react";
27
+ import { useEvents, useLabels } from "@agg/hooks";
28
+
29
+ // src/events/list/event-list.constants.ts
30
+ var POLYMARKET_VENUE = "polymarket";
31
+ var KALSHI_VENUE = "kalshi";
32
+ var POLYMARKET_VENUE_LOGO = "polymarket";
33
+ var KALSHI_VENUE_LOGO = "kalshi";
34
+ var getDefaultEventListTabs = (labels) => {
35
+ return [
36
+ {
37
+ value: "matched",
38
+ label: labels.eventList.matchedTab,
39
+ iconName: "arrows-to-dot"
40
+ },
41
+ {
42
+ value: "polymarket",
43
+ label: labels.venues.polymarket,
44
+ venueLogo: POLYMARKET_VENUE_LOGO,
45
+ venues: [POLYMARKET_VENUE]
46
+ },
47
+ {
48
+ value: "kalshi",
49
+ label: labels.venues.kalshi,
50
+ venueLogo: KALSHI_VENUE_LOGO,
51
+ venues: [KALSHI_VENUE]
52
+ }
53
+ ];
54
+ };
55
+
56
+ // src/events/list/event-list.utils.ts
57
+ var mapEventToEventListItemEvent = (event) => {
58
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
59
+ const fallbackVenueEvent = event.venueEvents[0];
60
+ if (!fallbackVenueEvent)
61
+ return null;
62
+ const mergedVenueMarkets = event.markets.flatMap((m) => m.venueMarkets);
63
+ if ((mergedVenueMarkets == null ? void 0 : mergedVenueMarkets.length) === 0)
64
+ return null;
65
+ return __spreadProps(__spreadValues({}, event), {
66
+ id: event.id,
67
+ title: event.title || fallbackVenueEvent.title,
68
+ description: (_b = (_a = event.description) != null ? _a : fallbackVenueEvent.description) != null ? _b : null,
69
+ volume: (_d = (_c = event.volume) != null ? _c : fallbackVenueEvent.volume) != null ? _d : null,
70
+ startDate: (_f = (_e = event.startDate) != null ? _e : fallbackVenueEvent.startDate) != null ? _f : null,
71
+ endDate: (_h = (_g = event.endDate) != null ? _g : fallbackVenueEvent.endDate) != null ? _h : null,
72
+ creationDate: (_j = (_i = event.creationDate) != null ? _i : fallbackVenueEvent.creationDate) != null ? _j : null
73
+ });
74
+ };
75
+ var filterEventsByTabValue = (events, _tabValue) => {
76
+ return events;
77
+ };
78
+ var resolveTabVenus = (tab) => {
79
+ if (!tab)
80
+ return void 0;
81
+ if (tab.venues && tab.venues.length > 0)
82
+ return tab.venues;
83
+ if (tab.value === "polymarket" || tab.value === "kalshi") {
84
+ return tab.value === "polymarket" ? ["polymarket"] : ["kalshi"];
85
+ }
86
+ return void 0;
87
+ };
88
+
89
+ // src/events/list/index.tsx
90
+ import { jsx, jsxs } from "react/jsx-runtime";
91
+ var renderTabIcon = (tab, isActive) => {
92
+ if (tab.venueLogo) {
93
+ return /* @__PURE__ */ jsx(VenueLogo, { venue: tab.venueLogo, size: "xs" });
94
+ }
95
+ if (!tab.iconName)
96
+ return null;
97
+ return /* @__PURE__ */ jsx(
98
+ Icon,
99
+ {
100
+ name: tab.iconName,
101
+ size: "s",
102
+ color: isActive ? "var(--agg-color-primary)" : "var(--agg-color-foreground)"
103
+ }
104
+ );
105
+ };
106
+ var EventList = ({
107
+ title,
108
+ maxItemsPerRow = 3,
109
+ limit = 3,
110
+ maxVisibleItems,
111
+ showVenueLogo = true,
112
+ search,
113
+ categoryIds
114
+ }) => {
115
+ var _a, _b;
116
+ const labels = useLabels();
117
+ const defaultEventListTabs = useMemo(() => {
118
+ return getDefaultEventListTabs(labels);
119
+ }, [labels]);
120
+ const [activeTabValue, setActiveTabValue] = useState(
121
+ (_b = (_a = defaultEventListTabs[0]) == null ? void 0 : _a.value) != null ? _b : "matched"
122
+ );
123
+ const activeTab = useMemo(() => {
124
+ return defaultEventListTabs.find((tab) => tab.value === activeTabValue);
125
+ }, [activeTabValue]);
126
+ const venues = useMemo(() => {
127
+ return resolveTabVenus(activeTab);
128
+ }, [activeTab]);
129
+ const resolvedMaxVisibleItems = useMemo(() => {
130
+ if (!Number.isFinite(maxVisibleItems))
131
+ return void 0;
132
+ return Math.max(1, Math.floor(maxVisibleItems));
133
+ }, [maxVisibleItems]);
134
+ const requestLimit = resolvedMaxVisibleItems != null ? resolvedMaxVisibleItems : limit;
135
+ const shouldPaginate = resolvedMaxVisibleItems == null;
136
+ const { events, isLoading, isError, fetchNextPage, hasNextPage, isFetchingNextPage } = useEvents({
137
+ venues,
138
+ search,
139
+ categoryIds,
140
+ limit: requestLimit
141
+ });
142
+ const filteredEvents = useMemo(() => {
143
+ return filterEventsByTabValue(events, activeTabValue);
144
+ }, [events, activeTabValue]);
145
+ const tileEvents = useMemo(() => {
146
+ const normalizedEvents = filteredEvents.map((event) => mapEventToEventListItemEvent(event)).filter((event) => event != null);
147
+ if (resolvedMaxVisibleItems == null)
148
+ return normalizedEvents;
149
+ return normalizedEvents.slice(0, resolvedMaxVisibleItems);
150
+ }, [filteredEvents, resolvedMaxVisibleItems]);
151
+ const tabsItems = useMemo(() => {
152
+ return defaultEventListTabs.map((tab) => {
153
+ const isActive = tab.value === activeTabValue;
154
+ return {
155
+ value: tab.value,
156
+ label: tab.label,
157
+ icon: renderTabIcon(tab, isActive),
158
+ disabled: tab.disabled
159
+ };
160
+ });
161
+ }, [activeTabValue]);
162
+ const resolvedMaxItemsPerRow = Number.isFinite(maxItemsPerRow) ? Math.max(1, Math.floor(maxItemsPerRow)) : 1;
163
+ const loadingPlaceholderCount = isFetchingNextPage ? Math.min(resolvedMaxItemsPerRow, resolvedMaxVisibleItems != null ? resolvedMaxVisibleItems : Infinity) : 0;
164
+ const shouldRenderLoadingState = isLoading && tileEvents.length === 0;
165
+ const loadMoreRef = useRef(null);
166
+ useEffect(() => {
167
+ if (!shouldPaginate)
168
+ return;
169
+ if (!hasNextPage)
170
+ return;
171
+ const target = loadMoreRef.current;
172
+ if (!target)
173
+ return;
174
+ const observer = new IntersectionObserver(
175
+ (entries) => {
176
+ const entry = entries[0];
177
+ if (!(entry == null ? void 0 : entry.isIntersecting))
178
+ return;
179
+ if (isLoading || isFetchingNextPage || !hasNextPage)
180
+ return;
181
+ void fetchNextPage();
182
+ },
183
+ {
184
+ rootMargin: "320px 0px"
185
+ }
186
+ );
187
+ observer.observe(target);
188
+ return () => {
189
+ observer.disconnect();
190
+ };
191
+ }, [fetchNextPage, hasNextPage, isFetchingNextPage, isLoading, shouldPaginate]);
192
+ const gridStyle = {
193
+ ["--agg-event-list-columns"]: String(resolvedMaxItemsPerRow)
194
+ };
195
+ const gridClassName = cn(
196
+ "grid grid-cols-1 gap-5",
197
+ "md:[grid-template-columns:repeat(var(--agg-event-list-columns),minmax(0,1fr))]"
198
+ );
199
+ if (shouldRenderLoadingState) {
200
+ return /* @__PURE__ */ jsx(Skeleton, { view: "event-list", ariaLabel: labels.eventList.loading(title) });
201
+ }
202
+ return /* @__PURE__ */ jsxs("section", { className: "flex w-full flex-col gap-5", children: [
203
+ /* @__PURE__ */ jsxs("header", { className: "flex flex-col md:flex-row w-full flex-nowrap items-start md:items-center justify-between gap-2 md:gap-4", children: [
204
+ /* @__PURE__ */ jsx(Typography, { as: "h2", variant: "value", className: "truncate [&::first-letter]:uppercase", children: title }),
205
+ /* @__PURE__ */ jsx(
206
+ Tabs,
207
+ {
208
+ ariaLabel: labels.eventList.tabsAria(title),
209
+ className: "max-w-full",
210
+ items: tabsItems,
211
+ value: activeTabValue,
212
+ onChange: setActiveTabValue
213
+ }
214
+ )
215
+ ] }),
216
+ /* @__PURE__ */ jsxs("div", { className: gridClassName, style: gridStyle, children: [
217
+ tileEvents.map((event) => /* @__PURE__ */ jsx(
218
+ EventListItem,
219
+ {
220
+ event,
221
+ showVenueLogo,
222
+ classNames: {
223
+ root: "w-full min-w-0 max-w-none"
224
+ }
225
+ },
226
+ event.id
227
+ )),
228
+ Array.from({ length: loadingPlaceholderCount }).map((_, index) => /* @__PURE__ */ jsx(
229
+ EventListItem,
230
+ {
231
+ isLoading: true,
232
+ classNames: {
233
+ root: "w-full min-w-0 max-w-none"
234
+ }
235
+ },
236
+ `loading-${index}`
237
+ )),
238
+ !isLoading && !isError && (tileEvents == null ? void 0 : tileEvents.length) === 0 ? /* @__PURE__ */ jsx(
239
+ Typography,
240
+ {
241
+ variant: "body",
242
+ className: "w-full col-span-full flex flex-col items-center justify-center h-32",
243
+ children: labels.eventList.empty
244
+ }
245
+ ) : null,
246
+ isError ? /* @__PURE__ */ jsx(
247
+ Typography,
248
+ {
249
+ variant: "body",
250
+ className: "w-full col-span-full flex flex-col items-center justify-center h-32",
251
+ children: labels.eventList.error
252
+ }
253
+ ) : null
254
+ ] }),
255
+ shouldPaginate && hasNextPage ? /* @__PURE__ */ jsx("div", { ref: loadMoreRef, className: "h-px w-full", "aria-hidden": true }) : null
256
+ ] });
257
+ };
258
+ EventList.displayName = "EventList";
259
+
260
+ export {
261
+ EventList
262
+ };
@@ -0,0 +1,262 @@
1
+ import {
2
+ EventListItem
3
+ } from "./chunk-CB2MLGCJ.mjs";
4
+ import {
5
+ Tabs
6
+ } from "./chunk-QXFDXXDB.mjs";
7
+ import {
8
+ Skeleton
9
+ } from "./chunk-NFYS557L.mjs";
10
+ import {
11
+ VenueLogo
12
+ } from "./chunk-LY6474C4.mjs";
13
+ import {
14
+ Icon
15
+ } from "./chunk-DA6KZWSK.mjs";
16
+ import {
17
+ Typography
18
+ } from "./chunk-DQ6XFBYJ.mjs";
19
+ import {
20
+ __spreadProps,
21
+ __spreadValues,
22
+ cn
23
+ } from "./chunk-GC3QIIH7.mjs";
24
+
25
+ // src/events/list/index.tsx
26
+ import { useEffect, useMemo, useRef, useState } from "react";
27
+ import { useEvents, useLabels } from "@agg-market/hooks";
28
+
29
+ // src/events/list/event-list.constants.ts
30
+ var POLYMARKET_VENUE = "polymarket";
31
+ var KALSHI_VENUE = "kalshi";
32
+ var POLYMARKET_VENUE_LOGO = "polymarket";
33
+ var KALSHI_VENUE_LOGO = "kalshi";
34
+ var getDefaultEventListTabs = (labels) => {
35
+ return [
36
+ {
37
+ value: "matched",
38
+ label: labels.eventList.matchedTab,
39
+ iconName: "arrows-to-dot"
40
+ },
41
+ {
42
+ value: "polymarket",
43
+ label: labels.venues.polymarket,
44
+ venueLogo: POLYMARKET_VENUE_LOGO,
45
+ venues: [POLYMARKET_VENUE]
46
+ },
47
+ {
48
+ value: "kalshi",
49
+ label: labels.venues.kalshi,
50
+ venueLogo: KALSHI_VENUE_LOGO,
51
+ venues: [KALSHI_VENUE]
52
+ }
53
+ ];
54
+ };
55
+
56
+ // src/events/list/event-list.utils.ts
57
+ var mapEventToEventListItemEvent = (event) => {
58
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
59
+ const fallbackVenueEvent = event.venueEvents[0];
60
+ if (!fallbackVenueEvent)
61
+ return null;
62
+ const mergedVenueMarkets = event.markets.flatMap((m) => m.venueMarkets);
63
+ if ((mergedVenueMarkets == null ? void 0 : mergedVenueMarkets.length) === 0)
64
+ return null;
65
+ return __spreadProps(__spreadValues({}, event), {
66
+ id: event.id,
67
+ title: event.title || fallbackVenueEvent.title,
68
+ description: (_b = (_a = event.description) != null ? _a : fallbackVenueEvent.description) != null ? _b : null,
69
+ volume: (_d = (_c = event.volume) != null ? _c : fallbackVenueEvent.volume) != null ? _d : null,
70
+ startDate: (_f = (_e = event.startDate) != null ? _e : fallbackVenueEvent.startDate) != null ? _f : null,
71
+ endDate: (_h = (_g = event.endDate) != null ? _g : fallbackVenueEvent.endDate) != null ? _h : null,
72
+ creationDate: (_j = (_i = event.creationDate) != null ? _i : fallbackVenueEvent.creationDate) != null ? _j : null
73
+ });
74
+ };
75
+ var filterEventsByTabValue = (events, _tabValue) => {
76
+ return events;
77
+ };
78
+ var resolveTabVenus = (tab) => {
79
+ if (!tab)
80
+ return void 0;
81
+ if (tab.venues && tab.venues.length > 0)
82
+ return tab.venues;
83
+ if (tab.value === "polymarket" || tab.value === "kalshi") {
84
+ return [tab.value];
85
+ }
86
+ return void 0;
87
+ };
88
+
89
+ // src/events/list/index.tsx
90
+ import { jsx, jsxs } from "react/jsx-runtime";
91
+ var renderTabIcon = (tab, isActive) => {
92
+ if (tab.venueLogo) {
93
+ return /* @__PURE__ */ jsx(VenueLogo, { venue: tab.venueLogo, size: "xs" });
94
+ }
95
+ if (!tab.iconName)
96
+ return null;
97
+ return /* @__PURE__ */ jsx(
98
+ Icon,
99
+ {
100
+ name: tab.iconName,
101
+ size: "s",
102
+ color: isActive ? "var(--agg-color-primary)" : "var(--agg-color-foreground)"
103
+ }
104
+ );
105
+ };
106
+ var EventList = ({
107
+ title,
108
+ maxItemsPerRow = 3,
109
+ limit = 3,
110
+ maxVisibleItems,
111
+ showVenueLogo = true,
112
+ search,
113
+ categoryIds
114
+ }) => {
115
+ var _a, _b;
116
+ const labels = useLabels();
117
+ const defaultEventListTabs = useMemo(() => {
118
+ return getDefaultEventListTabs(labels);
119
+ }, [labels]);
120
+ const [activeTabValue, setActiveTabValue] = useState(
121
+ (_b = (_a = defaultEventListTabs[0]) == null ? void 0 : _a.value) != null ? _b : "matched"
122
+ );
123
+ const activeTab = useMemo(() => {
124
+ return defaultEventListTabs.find((tab) => tab.value === activeTabValue);
125
+ }, [activeTabValue]);
126
+ const venues = useMemo(() => {
127
+ return resolveTabVenus(activeTab);
128
+ }, [activeTab]);
129
+ const resolvedMaxVisibleItems = useMemo(() => {
130
+ if (!Number.isFinite(maxVisibleItems))
131
+ return void 0;
132
+ return Math.max(1, Math.floor(maxVisibleItems));
133
+ }, [maxVisibleItems]);
134
+ const requestLimit = resolvedMaxVisibleItems != null ? resolvedMaxVisibleItems : limit;
135
+ const shouldPaginate = resolvedMaxVisibleItems == null;
136
+ const { events, isLoading, isError, fetchNextPage, hasNextPage, isFetchingNextPage } = useEvents({
137
+ venues,
138
+ search,
139
+ categoryIds,
140
+ limit: requestLimit
141
+ });
142
+ const filteredEvents = useMemo(() => {
143
+ return filterEventsByTabValue(events, activeTabValue);
144
+ }, [events, activeTabValue]);
145
+ const tileEvents = useMemo(() => {
146
+ const normalizedEvents = filteredEvents.map((event) => mapEventToEventListItemEvent(event)).filter((event) => event != null);
147
+ if (resolvedMaxVisibleItems == null)
148
+ return normalizedEvents;
149
+ return normalizedEvents.slice(0, resolvedMaxVisibleItems);
150
+ }, [filteredEvents, resolvedMaxVisibleItems]);
151
+ const tabsItems = useMemo(() => {
152
+ return defaultEventListTabs.map((tab) => {
153
+ const isActive = tab.value === activeTabValue;
154
+ return {
155
+ value: tab.value,
156
+ label: tab.label,
157
+ icon: renderTabIcon(tab, isActive),
158
+ disabled: tab.disabled
159
+ };
160
+ });
161
+ }, [activeTabValue]);
162
+ const resolvedMaxItemsPerRow = Number.isFinite(maxItemsPerRow) ? Math.max(1, Math.floor(maxItemsPerRow)) : 1;
163
+ const loadingPlaceholderCount = isFetchingNextPage ? Math.min(resolvedMaxItemsPerRow, resolvedMaxVisibleItems != null ? resolvedMaxVisibleItems : Infinity) : 0;
164
+ const shouldRenderLoadingState = isLoading && tileEvents.length === 0;
165
+ const loadMoreRef = useRef(null);
166
+ useEffect(() => {
167
+ if (!shouldPaginate)
168
+ return;
169
+ if (!hasNextPage)
170
+ return;
171
+ const target = loadMoreRef.current;
172
+ if (!target)
173
+ return;
174
+ const observer = new IntersectionObserver(
175
+ (entries) => {
176
+ const entry = entries[0];
177
+ if (!(entry == null ? void 0 : entry.isIntersecting))
178
+ return;
179
+ if (isLoading || isFetchingNextPage || !hasNextPage)
180
+ return;
181
+ void fetchNextPage();
182
+ },
183
+ {
184
+ rootMargin: "320px 0px"
185
+ }
186
+ );
187
+ observer.observe(target);
188
+ return () => {
189
+ observer.disconnect();
190
+ };
191
+ }, [fetchNextPage, hasNextPage, isFetchingNextPage, isLoading, shouldPaginate]);
192
+ const gridStyle = {
193
+ ["--agg-event-list-columns"]: String(resolvedMaxItemsPerRow)
194
+ };
195
+ const gridClassName = cn(
196
+ "grid grid-cols-1 gap-5",
197
+ "md:[grid-template-columns:repeat(var(--agg-event-list-columns),minmax(0,1fr))]"
198
+ );
199
+ if (shouldRenderLoadingState) {
200
+ return /* @__PURE__ */ jsx(Skeleton, { view: "event-list", ariaLabel: labels.eventList.loading(title) });
201
+ }
202
+ return /* @__PURE__ */ jsxs("section", { className: "flex w-full flex-col gap-5", children: [
203
+ /* @__PURE__ */ jsxs("header", { className: "flex flex-col md:flex-row w-full flex-nowrap items-start md:items-center justify-between gap-2 md:gap-4", children: [
204
+ /* @__PURE__ */ jsx(Typography, { as: "h2", variant: "value", className: "truncate [&::first-letter]:uppercase", children: title }),
205
+ /* @__PURE__ */ jsx(
206
+ Tabs,
207
+ {
208
+ ariaLabel: labels.eventList.tabsAria(title),
209
+ className: "max-w-full",
210
+ items: tabsItems,
211
+ value: activeTabValue,
212
+ onChange: setActiveTabValue
213
+ }
214
+ )
215
+ ] }),
216
+ /* @__PURE__ */ jsxs("div", { className: gridClassName, style: gridStyle, children: [
217
+ tileEvents.map((event) => /* @__PURE__ */ jsx(
218
+ EventListItem,
219
+ {
220
+ event,
221
+ showVenueLogo,
222
+ classNames: {
223
+ root: "w-full min-w-0 max-w-none"
224
+ }
225
+ },
226
+ event.id
227
+ )),
228
+ Array.from({ length: loadingPlaceholderCount }).map((_, index) => /* @__PURE__ */ jsx(
229
+ EventListItem,
230
+ {
231
+ isLoading: true,
232
+ classNames: {
233
+ root: "w-full min-w-0 max-w-none"
234
+ }
235
+ },
236
+ `loading-${index}`
237
+ )),
238
+ !isLoading && !isError && (tileEvents == null ? void 0 : tileEvents.length) === 0 ? /* @__PURE__ */ jsx(
239
+ Typography,
240
+ {
241
+ variant: "body",
242
+ className: "w-full col-span-full flex flex-col items-center justify-center h-32",
243
+ children: labels.eventList.empty
244
+ }
245
+ ) : null,
246
+ isError ? /* @__PURE__ */ jsx(
247
+ Typography,
248
+ {
249
+ variant: "body",
250
+ className: "w-full col-span-full flex flex-col items-center justify-center h-32",
251
+ children: labels.eventList.error
252
+ }
253
+ ) : null
254
+ ] }),
255
+ shouldPaginate && hasNextPage ? /* @__PURE__ */ jsx("div", { ref: loadMoreRef, className: "h-px w-full", "aria-hidden": true }) : null
256
+ ] });
257
+ };
258
+ EventList.displayName = "EventList";
259
+
260
+ export {
261
+ EventList
262
+ };
@@ -0,0 +1,42 @@
1
+ import {
2
+ cn
3
+ } from "./chunk-GC3QIIH7.mjs";
4
+
5
+ // src/primitives/number-value.tsx
6
+ import { useMemo } from "react";
7
+ import { useSdkUiConfig } from "@agg/hooks";
8
+ import { jsx } from "react/jsx-runtime";
9
+ var NumberValue = ({
10
+ value,
11
+ format = "number",
12
+ fallback = "\u2014",
13
+ className,
14
+ ariaLabel
15
+ }) => {
16
+ const config = useSdkUiConfig();
17
+ const formatted = useMemo(() => {
18
+ if (value == null)
19
+ return fallback;
20
+ if (format === "date") {
21
+ if (value instanceof Date)
22
+ return config.formatDate(value);
23
+ return fallback;
24
+ }
25
+ if (typeof value !== "number")
26
+ return fallback;
27
+ if (format === "percent")
28
+ return config.formatPercent(value);
29
+ if (format === "currency")
30
+ return config.formatCurrency(value);
31
+ if (format === "compactCurrency") {
32
+ return config.formatCompactCurrency(value);
33
+ }
34
+ return config.formatNumber(value);
35
+ }, [config, fallback, format, value]);
36
+ return /* @__PURE__ */ jsx("span", { className: cn("font-agg-sans", className), "aria-label": ariaLabel, children: formatted });
37
+ };
38
+ NumberValue.displayName = "NumberValue";
39
+
40
+ export {
41
+ NumberValue
42
+ };