@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,355 @@
1
+ import {
2
+ defaultTradingDisclaimer,
3
+ getTradingDateLabel,
4
+ getTradingVenueLabel
5
+ } from "./chunk-KDBYDMYV.mjs";
6
+ import {
7
+ Tabs
8
+ } from "./chunk-QXFDXXDB.mjs";
9
+ import {
10
+ Skeleton,
11
+ skeletonViews
12
+ } from "./chunk-NFYS557L.mjs";
13
+ import {
14
+ VenueLogo
15
+ } from "./chunk-LY6474C4.mjs";
16
+ import {
17
+ Icon
18
+ } from "./chunk-DA6KZWSK.mjs";
19
+ import {
20
+ Button
21
+ } from "./chunk-J6L5BLKX.mjs";
22
+ import {
23
+ Card
24
+ } from "./chunk-YUIZZ6XE.mjs";
25
+ import {
26
+ cn,
27
+ getMotionClassName
28
+ } from "./chunk-GC3QIIH7.mjs";
29
+
30
+ // src/trading/place-order/index.tsx
31
+ import { useEffect, useMemo, useState } from "react";
32
+ import { useLabels, useSdkUiConfig } from "@agg-market/hooks";
33
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
34
+ var WarningFilledIcon = ({ className }) => {
35
+ return /* @__PURE__ */ jsxs(
36
+ "svg",
37
+ {
38
+ viewBox: "0 0 16 16",
39
+ fill: "none",
40
+ className: cn("text-agg-warning", className),
41
+ "aria-hidden": "true",
42
+ children: [
43
+ /* @__PURE__ */ jsx("path", { d: "M8 1.33301L15.3333 14.6663H0.666656L8 1.33301Z", fill: "currentColor" }),
44
+ /* @__PURE__ */ jsx("path", { d: "M8 5.33301V8.66634", stroke: "white", strokeWidth: "1.4", strokeLinecap: "round" }),
45
+ /* @__PURE__ */ jsx("circle", { cx: "8", cy: "11.1667", r: "0.833333", fill: "white" })
46
+ ]
47
+ }
48
+ );
49
+ };
50
+ var ErrorFilledIcon = ({ className }) => {
51
+ return /* @__PURE__ */ jsxs(
52
+ "svg",
53
+ {
54
+ viewBox: "0 0 16 16",
55
+ fill: "none",
56
+ className: cn("text-agg-error", className),
57
+ "aria-hidden": "true",
58
+ children: [
59
+ /* @__PURE__ */ jsx("circle", { cx: "8", cy: "8", r: "8", fill: "currentColor" }),
60
+ /* @__PURE__ */ jsx("path", { d: "M8 4.16699V8.50033", stroke: "white", strokeWidth: "1.4", strokeLinecap: "round" }),
61
+ /* @__PURE__ */ jsx("circle", { cx: "8", cy: "11.167", r: "0.833333", fill: "white" })
62
+ ]
63
+ }
64
+ );
65
+ };
66
+ var getPlaceOrderContainerClassName = () => {
67
+ return "overflow-hidden rounded-agg-xl border border-agg-border bg-agg-secondary shadow-none hover:shadow-none";
68
+ };
69
+ var getRoutingCardClassName = (isHighlighted) => {
70
+ if (!isHighlighted) {
71
+ return "border-agg-border bg-agg-secondary";
72
+ }
73
+ return "border-agg-trade-highlight-border bg-agg-trade-highlight-surface";
74
+ };
75
+ var getResultValueClassName = (tone) => {
76
+ if (tone === "default")
77
+ return "text-agg-foreground";
78
+ return "text-agg-success";
79
+ };
80
+ var getStatusContent = ({
81
+ placement,
82
+ status,
83
+ onStatusAction
84
+ }) => {
85
+ if (!status || status.placement !== placement)
86
+ return null;
87
+ if (status.tone === "warning") {
88
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-center gap-2", children: [
89
+ /* @__PURE__ */ jsx(WarningFilledIcon, { className: "h-4 w-4 shrink-0" }),
90
+ /* @__PURE__ */ jsx("p", { className: "text-agg-sm leading-agg-5 text-agg-foreground", children: status.message })
91
+ ] });
92
+ }
93
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 rounded-agg-lg bg-agg-status-error-surface px-3 py-2.5", children: [
94
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-2", children: [
95
+ /* @__PURE__ */ jsx(ErrorFilledIcon, { className: "h-4 w-4 shrink-0" }),
96
+ /* @__PURE__ */ jsx("p", { className: "min-w-0 flex-1 text-agg-sm leading-agg-5 text-agg-foreground", children: status.message })
97
+ ] }),
98
+ status.actionLabel ? /* @__PURE__ */ jsx(
99
+ "button",
100
+ {
101
+ type: "button",
102
+ className: "shrink-0 text-agg-sm font-agg-bold leading-agg-5 text-agg-primary",
103
+ "aria-label": status.actionLabel,
104
+ onClick: onStatusAction,
105
+ children: status.actionLabel
106
+ }
107
+ ) : null
108
+ ] });
109
+ };
110
+ var PlaceOrder = ({
111
+ title,
112
+ marketDate,
113
+ marketImageUrl,
114
+ activeTab,
115
+ buyLabel,
116
+ sellLabel,
117
+ outcomes,
118
+ selectedOutcomeId,
119
+ primaryMetric,
120
+ routing,
121
+ result,
122
+ actionLabel,
123
+ disclaimer = defaultTradingDisclaimer,
124
+ isDismissible = false,
125
+ isLoading = false,
126
+ status,
127
+ className,
128
+ isPrimaryActionDisabled = false,
129
+ isPrimaryActionLoading = false,
130
+ onClose,
131
+ onOutcomeChange,
132
+ onPrimaryAction,
133
+ onStatusAction,
134
+ onTabChange
135
+ }) => {
136
+ const { enableAnimations } = useSdkUiConfig();
137
+ const labels = useLabels();
138
+ const resolvedDisclaimer = disclaimer === defaultTradingDisclaimer ? labels.trading.disclaimer : disclaimer;
139
+ if (isLoading) {
140
+ return /* @__PURE__ */ jsx(
141
+ Skeleton,
142
+ {
143
+ ariaLabel: labels.common.loading,
144
+ className,
145
+ view: skeletonViews.placeOrder
146
+ }
147
+ );
148
+ }
149
+ const [internalTab, setInternalTab] = useState(activeTab);
150
+ const [internalOutcomeId, setInternalOutcomeId] = useState(selectedOutcomeId);
151
+ useEffect(() => {
152
+ setInternalTab(activeTab);
153
+ }, [activeTab]);
154
+ useEffect(() => {
155
+ setInternalOutcomeId(selectedOutcomeId);
156
+ }, [selectedOutcomeId]);
157
+ const resolvedTab = onTabChange ? activeTab : internalTab;
158
+ const resolvedOutcomeId = onOutcomeChange ? selectedOutcomeId : internalOutcomeId;
159
+ const hasHighlightedRouting = routing.tone === "highlighted";
160
+ const dateLabel = getTradingDateLabel(marketDate);
161
+ const tabItems = useMemo(() => {
162
+ return [
163
+ { value: "buy", label: buyLabel },
164
+ { value: "sell", label: sellLabel }
165
+ ];
166
+ }, [buyLabel, sellLabel]);
167
+ const handleTabChange = (nextTab) => {
168
+ if (!onTabChange) {
169
+ setInternalTab(nextTab);
170
+ }
171
+ onTabChange == null ? void 0 : onTabChange(nextTab);
172
+ };
173
+ const handleOutcomeChange = (nextOutcomeId) => {
174
+ if (!onOutcomeChange) {
175
+ setInternalOutcomeId(nextOutcomeId);
176
+ }
177
+ onOutcomeChange == null ? void 0 : onOutcomeChange(nextOutcomeId);
178
+ };
179
+ const actionButton = /* @__PURE__ */ jsx(
180
+ Button,
181
+ {
182
+ size: "xxl",
183
+ className: "w-full",
184
+ disabled: isPrimaryActionDisabled,
185
+ isLoading: isPrimaryActionLoading,
186
+ "aria-label": actionLabel,
187
+ onClick: onPrimaryAction,
188
+ children: actionLabel
189
+ }
190
+ );
191
+ const contentBody = /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-6 p-5", children: [
192
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
193
+ /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-5", children: [
194
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 items-center gap-3", children: [
195
+ marketImageUrl ? /* @__PURE__ */ jsx(
196
+ "img",
197
+ {
198
+ src: marketImageUrl,
199
+ alt: "",
200
+ className: "h-12 w-12 shrink-0 rounded-agg-lg object-cover"
201
+ }
202
+ ) : null,
203
+ /* @__PURE__ */ jsx("p", { className: "min-w-0 text-agg-base font-agg-bold leading-agg-6 text-agg-foreground", children: title })
204
+ ] }),
205
+ isDismissible ? /* @__PURE__ */ jsx(
206
+ "button",
207
+ {
208
+ type: "button",
209
+ "aria-label": labels.common.close,
210
+ className: "shrink-0 text-agg-foreground",
211
+ onClick: onClose,
212
+ children: /* @__PURE__ */ jsx(
213
+ Icon,
214
+ {
215
+ name: "close",
216
+ size: "m",
217
+ className: "h-6 w-6 text-agg-foreground",
218
+ color: "currentColor"
219
+ }
220
+ )
221
+ }
222
+ ) : null
223
+ ] }),
224
+ /* @__PURE__ */ jsx("p", { className: "text-agg-base leading-agg-6 text-agg-foreground", children: dateLabel })
225
+ ] }),
226
+ /* @__PURE__ */ jsx(
227
+ Tabs,
228
+ {
229
+ ariaLabel: labels.common.tabsAria,
230
+ items: tabItems,
231
+ value: resolvedTab,
232
+ onChange: handleTabChange,
233
+ variant: "underline",
234
+ size: "s",
235
+ overflowBehavior: "scroll",
236
+ className: "w-full"
237
+ }
238
+ ),
239
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4", children: [
240
+ /* @__PURE__ */ jsx("div", { className: "flex w-full gap-2", children: outcomes.map((outcome) => {
241
+ const isActive = outcome.id === resolvedOutcomeId;
242
+ return /* @__PURE__ */ jsx(
243
+ "button",
244
+ {
245
+ type: "button",
246
+ className: cn(
247
+ "flex-1 rounded-agg-full px-6 py-2.5 text-agg-base leading-agg-6",
248
+ getMotionClassName(enableAnimations, "transition-colors"),
249
+ isActive ? "bg-agg-success font-agg-bold text-agg-on-primary" : "bg-agg-secondary-hover font-agg-normal text-agg-foreground"
250
+ ),
251
+ "aria-pressed": isActive,
252
+ "aria-label": `${outcome.label} ${outcome.priceLabel}`,
253
+ onClick: () => handleOutcomeChange(outcome.id),
254
+ children: `${outcome.label} ${outcome.priceLabel}`
255
+ },
256
+ outcome.id
257
+ );
258
+ }) }),
259
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-4", children: [
260
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col", children: [
261
+ /* @__PURE__ */ jsx("p", { className: "text-agg-base font-agg-bold leading-agg-6 text-agg-foreground", children: primaryMetric.label }),
262
+ /* @__PURE__ */ jsx("p", { className: "text-agg-sm leading-agg-5 text-agg-muted-foreground", children: primaryMetric.hint })
263
+ ] }),
264
+ /* @__PURE__ */ jsx("p", { className: "text-agg-3xl font-agg-bold leading-agg-9 text-agg-foreground", children: primaryMetric.value })
265
+ ] })
266
+ ] }),
267
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
268
+ /* @__PURE__ */ jsxs(
269
+ "div",
270
+ {
271
+ className: cn(
272
+ "relative overflow-hidden rounded-agg-lg border p-3",
273
+ getRoutingCardClassName(hasHighlightedRouting)
274
+ ),
275
+ children: [
276
+ /* @__PURE__ */ jsx(
277
+ "div",
278
+ {
279
+ className: cn(
280
+ "pointer-events-none absolute inset-x-0 bottom-0 h-11 bg-gradient-to-b from-transparent to-agg-trade-highlight-glow",
281
+ hasHighlightedRouting ? "opacity-100" : "opacity-0"
282
+ )
283
+ }
284
+ ),
285
+ /* @__PURE__ */ jsxs("div", { className: "relative flex flex-col gap-3", children: [
286
+ routing.rows.map((row, index) => /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3", children: [
287
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-4", children: [
288
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [
289
+ /* @__PURE__ */ jsx(
290
+ VenueLogo,
291
+ {
292
+ venue: row.venue,
293
+ size: "s",
294
+ ariaLabel: getTradingVenueLabel(row.venue)
295
+ }
296
+ ),
297
+ /* @__PURE__ */ jsx("p", { className: "truncate text-agg-base leading-agg-6 text-agg-foreground", children: row.label })
298
+ ] }),
299
+ /* @__PURE__ */ jsx("p", { className: "shrink-0 text-agg-base leading-agg-6 text-agg-foreground", children: row.priceLabel })
300
+ ] }),
301
+ index < routing.rows.length - 1 ? /* @__PURE__ */ jsx(
302
+ "div",
303
+ {
304
+ className: cn(
305
+ "h-px w-full",
306
+ hasHighlightedRouting ? "bg-agg-trade-highlight-border" : "bg-agg-separator"
307
+ )
308
+ }
309
+ ) : null
310
+ ] }, `${row.venue}-${row.label}`)),
311
+ routing.highlightLabel ? /* @__PURE__ */ jsx("p", { className: "text-center text-agg-sm font-agg-bold leading-agg-5 uppercase text-agg-trade-highlight-accent", children: routing.highlightLabel }) : null
312
+ ] })
313
+ ]
314
+ }
315
+ ),
316
+ /* @__PURE__ */ jsx("p", { className: "text-agg-sm leading-agg-5 text-agg-muted-foreground", children: routing.helperLabel })
317
+ ] }),
318
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-4", children: [
319
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col", children: [
320
+ /* @__PURE__ */ jsx("p", { className: "text-agg-base font-agg-bold leading-agg-6 text-agg-foreground", children: result.label }),
321
+ /* @__PURE__ */ jsx("p", { className: "text-agg-sm leading-agg-5 text-agg-muted-foreground", children: result.hint })
322
+ ] }),
323
+ /* @__PURE__ */ jsx(
324
+ "p",
325
+ {
326
+ className: cn(
327
+ "text-agg-3xl font-agg-bold leading-agg-9",
328
+ getResultValueClassName(result.tone)
329
+ ),
330
+ children: result.value
331
+ }
332
+ )
333
+ ] }),
334
+ /* @__PURE__ */ jsxs(Fragment, { children: [
335
+ getStatusContent({
336
+ placement: "above-action",
337
+ status,
338
+ onStatusAction
339
+ }),
340
+ actionButton,
341
+ getStatusContent({
342
+ placement: "below-action",
343
+ status,
344
+ onStatusAction
345
+ })
346
+ ] }),
347
+ /* @__PURE__ */ jsx("p", { className: "text-center text-agg-xs leading-agg-4 text-agg-muted-foreground", children: resolvedDisclaimer })
348
+ ] });
349
+ return /* @__PURE__ */ jsx(Card, { className: cn(getPlaceOrderContainerClassName(), className), children: contentBody });
350
+ };
351
+ PlaceOrder.displayName = "PlaceOrder";
352
+
353
+ export {
354
+ PlaceOrder
355
+ };
@@ -0,0 +1,50 @@
1
+ import {
2
+ Icon
3
+ } from "./chunk-DA6KZWSK.mjs";
4
+ import {
5
+ cn,
6
+ getMotionClassName
7
+ } from "./chunk-GC3QIIH7.mjs";
8
+
9
+ // src/primitives/select/index.tsx
10
+ import { useLabels, useSdkUiConfig } from "@agg/hooks";
11
+ import { jsx, jsxs } from "react/jsx-runtime";
12
+ var Select = ({
13
+ items,
14
+ value,
15
+ onChange,
16
+ ariaLabel,
17
+ className,
18
+ disabled = false
19
+ }) => {
20
+ const labels = useLabels();
21
+ const { enableAnimations } = useSdkUiConfig();
22
+ const hasEnabledItems = items.some((item) => !item.disabled);
23
+ return /* @__PURE__ */ jsxs("label", { className: cn("relative inline-flex w-full", className), children: [
24
+ /* @__PURE__ */ jsx(
25
+ "select",
26
+ {
27
+ "aria-label": ariaLabel != null ? ariaLabel : labels.common.selectAria,
28
+ className: cn(
29
+ "w-full appearance-none rounded-agg-md border border-agg-separator bg-agg-secondary px-4 py-2 pr-10 font-agg-sans text-agg-sm leading-agg-5 text-agg-foreground outline-none",
30
+ getMotionClassName(
31
+ enableAnimations,
32
+ "transition-[border-color,box-shadow] duration-200 ease-out"
33
+ ),
34
+ "focus:border-agg-primary focus:ring-2 focus:ring-agg-primary/15",
35
+ "disabled:cursor-not-allowed disabled:opacity-60"
36
+ ),
37
+ disabled: disabled || !hasEnabledItems,
38
+ value,
39
+ onChange: (event) => onChange(event.target.value),
40
+ children: items.map((item) => /* @__PURE__ */ jsx("option", { value: item.value, disabled: item.disabled, children: item.label }, item.value))
41
+ }
42
+ ),
43
+ /* @__PURE__ */ jsx("span", { className: "pointer-events-none absolute inset-y-0 right-3 inline-flex items-center justify-center text-agg-muted-foreground", children: /* @__PURE__ */ jsx(Icon, { name: "chevron-down", size: "s", color: "currentColor" }) })
44
+ ] });
45
+ };
46
+ Select.displayName = "Select";
47
+
48
+ export {
49
+ Select
50
+ };
@@ -0,0 +1,280 @@
1
+ import {
2
+ EventList
3
+ } from "./chunk-H7P6DIX4.mjs";
4
+ import {
5
+ Tabs
6
+ } from "./chunk-QXFDXXDB.mjs";
7
+ import {
8
+ Icon
9
+ } from "./chunk-DA6KZWSK.mjs";
10
+ import {
11
+ cn
12
+ } from "./chunk-GC3QIIH7.mjs";
13
+
14
+ // src/pages/home/index.tsx
15
+ import { useEffect, useMemo, useState } from "react";
16
+ import { useCategories, useLabels } from "@agg-market/hooks";
17
+
18
+ // src/pages/home/home.constants.ts
19
+ var ALL_CATEGORIES_TAB_VALUE = "trending";
20
+ var DEFAULT_CATEGORIES_LIMIT = 100;
21
+ var DEFAULT_ALL_CATEGORY_TAB_LABEL = "Trending";
22
+ var CATEGORY_TAB_NAME_ORDER = [
23
+ "crypto",
24
+ "economy",
25
+ "entertainment",
26
+ "finance",
27
+ "geopolitics",
28
+ "health",
29
+ "mentions",
30
+ "politics",
31
+ "science",
32
+ "sports",
33
+ "technology",
34
+ "weather",
35
+ "world"
36
+ ];
37
+ var getDefaultHomePageTabs = (allCategoryTabLabel) => {
38
+ return [
39
+ {
40
+ value: ALL_CATEGORIES_TAB_VALUE,
41
+ label: allCategoryTabLabel,
42
+ iconName: "arrow-trend-up"
43
+ },
44
+ { value: "crypto", label: "crypto", categoryIds: ["crypto"] },
45
+ { value: "economy", label: "economy", categoryIds: ["economy"] },
46
+ {
47
+ value: "entertainment",
48
+ label: "entertainment",
49
+ categoryIds: ["entertainment"]
50
+ },
51
+ { value: "finance", label: "finance", categoryIds: ["finance"] },
52
+ {
53
+ value: "geopolitics",
54
+ label: "geopolitics",
55
+ categoryIds: ["geopolitics"]
56
+ },
57
+ { value: "health", label: "health", categoryIds: ["health"] },
58
+ { value: "mentions", label: "mentions", categoryIds: ["mentions"] },
59
+ { value: "politics", label: "politics", categoryIds: ["politics"] },
60
+ { value: "science", label: "science", categoryIds: ["science"] },
61
+ { value: "sports", label: "sports", categoryIds: ["sports"] },
62
+ { value: "technology", label: "technology", categoryIds: ["technology"] },
63
+ { value: "weather", label: "weather", categoryIds: ["weather"] },
64
+ { value: "world", label: "world", categoryIds: ["world"] }
65
+ ];
66
+ };
67
+ var getDefaultEventSectionItems = (labels) => {
68
+ return [
69
+ {
70
+ id: "top-markets",
71
+ title: labels.home.topMarkets,
72
+ maxItemsPerRow: 3,
73
+ limit: 3,
74
+ maxVisibleItems: 3
75
+ },
76
+ {
77
+ id: "new-markets",
78
+ title: labels.home.newMarkets,
79
+ maxItemsPerRow: 3,
80
+ limit: 3,
81
+ maxVisibleItems: 3
82
+ }
83
+ ];
84
+ };
85
+
86
+ // src/pages/home/home.utils.ts
87
+ var categoryOrderMap = CATEGORY_TAB_NAME_ORDER.reduce(
88
+ (accumulator, name, index) => {
89
+ accumulator.set(name, index);
90
+ return accumulator;
91
+ },
92
+ /* @__PURE__ */ new Map()
93
+ );
94
+ var normalizeCategoryName = (name) => {
95
+ return name.trim().toLowerCase();
96
+ };
97
+ var resolveCategoryTabs = (categories, allCategoryTabLabel) => {
98
+ const sortedCategories = [...categories].sort((left, right) => {
99
+ const leftName = normalizeCategoryName(left.name);
100
+ const rightName = normalizeCategoryName(right.name);
101
+ const leftOrder = categoryOrderMap.get(leftName);
102
+ const rightOrder = categoryOrderMap.get(rightName);
103
+ if (leftOrder != null && rightOrder != null) {
104
+ return leftOrder - rightOrder;
105
+ }
106
+ if (leftOrder != null)
107
+ return -1;
108
+ if (rightOrder != null)
109
+ return 1;
110
+ return leftName.localeCompare(rightName);
111
+ });
112
+ const seenCategoryIds = /* @__PURE__ */ new Set();
113
+ const tabs = [
114
+ {
115
+ value: ALL_CATEGORIES_TAB_VALUE,
116
+ label: allCategoryTabLabel,
117
+ iconName: "arrow-trend-up"
118
+ }
119
+ ];
120
+ for (const category of sortedCategories) {
121
+ if (seenCategoryIds.has(category.id))
122
+ continue;
123
+ seenCategoryIds.add(category.id);
124
+ tabs.push({
125
+ value: category.id,
126
+ label: normalizeCategoryName(category.name),
127
+ categoryIds: [category.id]
128
+ });
129
+ }
130
+ return tabs;
131
+ };
132
+ var resolveInitialTabValue = (tabs, defaultActiveTab) => {
133
+ var _a, _b;
134
+ if (defaultActiveTab) {
135
+ const hasDefaultTab = tabs.some((tab) => tab.value === defaultActiveTab);
136
+ if (hasDefaultTab)
137
+ return defaultActiveTab;
138
+ }
139
+ return (_b = (_a = tabs[0]) == null ? void 0 : _a.value) != null ? _b : "trending";
140
+ };
141
+
142
+ // src/pages/home/index.tsx
143
+ import { jsx, jsxs } from "react/jsx-runtime";
144
+ var HomePage = ({
145
+ tabs,
146
+ defaultActiveTab,
147
+ onTabChange,
148
+ eventSectionItems,
149
+ classNames,
150
+ useCategoriesTabs = true,
151
+ categoriesLimit = DEFAULT_CATEGORIES_LIMIT,
152
+ allCategoryTabLabel = DEFAULT_ALL_CATEGORY_TAB_LABEL
153
+ }) => {
154
+ const labels = useLabels();
155
+ const hasCustomTabs = !!tabs && tabs.length > 0;
156
+ const shouldUseCategoriesTabs = !hasCustomTabs && useCategoriesTabs;
157
+ const resolvedAllCategoryTabLabel = allCategoryTabLabel === DEFAULT_ALL_CATEGORY_TAB_LABEL ? labels.home.trending : allCategoryTabLabel;
158
+ const { categories } = useCategories({
159
+ limit: categoriesLimit,
160
+ enabled: shouldUseCategoriesTabs
161
+ });
162
+ const categoryTabs = useMemo(() => {
163
+ return resolveCategoryTabs(categories, resolvedAllCategoryTabLabel);
164
+ }, [categories, resolvedAllCategoryTabLabel]);
165
+ const resolvedTabs = useMemo(() => {
166
+ if (hasCustomTabs && tabs)
167
+ return tabs;
168
+ if (shouldUseCategoriesTabs)
169
+ return categoryTabs;
170
+ return getDefaultHomePageTabs(resolvedAllCategoryTabLabel);
171
+ }, [categoryTabs, hasCustomTabs, resolvedAllCategoryTabLabel, shouldUseCategoriesTabs, tabs]);
172
+ const resolvedEventSectionItems = eventSectionItems && eventSectionItems.length > 0 ? eventSectionItems : getDefaultEventSectionItems(labels);
173
+ const [activeTabValue, setActiveTabValue] = useState(() => {
174
+ return resolveInitialTabValue(resolvedTabs, defaultActiveTab);
175
+ });
176
+ useEffect(() => {
177
+ setActiveTabValue((currentValue) => {
178
+ const hasCurrentValue = resolvedTabs.some((tab) => tab.value === currentValue);
179
+ if (hasCurrentValue)
180
+ return currentValue;
181
+ return resolveInitialTabValue(resolvedTabs, defaultActiveTab);
182
+ });
183
+ }, [defaultActiveTab, resolvedTabs]);
184
+ const tabsItems = useMemo(() => {
185
+ return resolvedTabs.map((tab) => {
186
+ const isActive = tab.value === activeTabValue;
187
+ return {
188
+ value: tab.value,
189
+ label: tab.label,
190
+ icon: tab.iconName ? /* @__PURE__ */ jsx(
191
+ Icon,
192
+ {
193
+ name: tab.iconName,
194
+ size: "m",
195
+ color: isActive ? "var(--agg-color-primary)" : "var(--agg-color-foreground)"
196
+ }
197
+ ) : void 0,
198
+ disabled: tab.disabled
199
+ };
200
+ });
201
+ }, [activeTabValue, resolvedTabs]);
202
+ const activeTab = useMemo(() => {
203
+ return resolvedTabs.find((tab) => tab.value === activeTabValue);
204
+ }, [activeTabValue, resolvedTabs]);
205
+ const resolvedSectionItems = useMemo(() => {
206
+ var _a, _b, _c, _d, _e;
207
+ if (activeTabValue === ALL_CATEGORIES_TAB_VALUE) {
208
+ return resolvedEventSectionItems;
209
+ }
210
+ const maxItemsPerRow = (_b = (_a = resolvedEventSectionItems[0]) == null ? void 0 : _a.maxItemsPerRow) != null ? _b : 3;
211
+ const showVenueLogo = (_c = resolvedEventSectionItems[0]) == null ? void 0 : _c.showVenueLogo;
212
+ const firstSectionLimit = (_d = resolvedEventSectionItems[0]) == null ? void 0 : _d.limit;
213
+ const limit = firstSectionLimit && Number.isFinite(firstSectionLimit) ? Math.max(9, Math.floor(firstSectionLimit)) : 9;
214
+ return [
215
+ {
216
+ id: `${activeTabValue}-markets`,
217
+ title: (_e = activeTab == null ? void 0 : activeTab.label) != null ? _e : activeTabValue,
218
+ maxItemsPerRow,
219
+ limit,
220
+ maxVisibleItems: void 0,
221
+ showVenueLogo,
222
+ search: activeTab == null ? void 0 : activeTab.search,
223
+ categoryIds: activeTab == null ? void 0 : activeTab.categoryIds
224
+ }
225
+ ];
226
+ }, [activeTab, activeTabValue, resolvedEventSectionItems]);
227
+ const handleTabChange = (value) => {
228
+ setActiveTabValue(value);
229
+ onTabChange == null ? void 0 : onTabChange(value);
230
+ };
231
+ return /* @__PURE__ */ jsxs("section", { className: cn("flex w-full flex-col", classNames == null ? void 0 : classNames.root), children: [
232
+ /* @__PURE__ */ jsx(
233
+ "header",
234
+ {
235
+ className: cn("w-full bg-agg-secondary border-b border-agg-separator", classNames == null ? void 0 : classNames.header),
236
+ children: /* @__PURE__ */ jsx(
237
+ Tabs,
238
+ {
239
+ ariaLabel: labels.home.categoryTabsAria,
240
+ variant: "underline",
241
+ className: cn("w-full px-4 md:px-10", classNames == null ? void 0 : classNames.tabs),
242
+ items: tabsItems,
243
+ value: activeTabValue,
244
+ onChange: handleTabChange
245
+ }
246
+ )
247
+ }
248
+ ),
249
+ /* @__PURE__ */ jsx(
250
+ "main",
251
+ {
252
+ className: cn(
253
+ "flex w-full flex-col gap-4 md:gap-10 px-4 md:px-10 py-4 md:py-8",
254
+ classNames == null ? void 0 : classNames.sections
255
+ ),
256
+ children: resolvedSectionItems.map((eventSectionItem) => {
257
+ var _a, _b, _c;
258
+ return /* @__PURE__ */ jsx(
259
+ EventList,
260
+ {
261
+ title: eventSectionItem.title,
262
+ maxItemsPerRow: eventSectionItem.maxItemsPerRow,
263
+ limit: eventSectionItem.limit,
264
+ maxVisibleItems: eventSectionItem.maxVisibleItems,
265
+ showVenueLogo: eventSectionItem.showVenueLogo,
266
+ search: (_b = eventSectionItem.search) != null ? _b : activeTab == null ? void 0 : activeTab.search,
267
+ categoryIds: (_c = eventSectionItem.categoryIds) != null ? _c : activeTab == null ? void 0 : activeTab.categoryIds
268
+ },
269
+ (_a = eventSectionItem.id) != null ? _a : eventSectionItem.title
270
+ );
271
+ })
272
+ }
273
+ )
274
+ ] });
275
+ };
276
+ HomePage.displayName = "HomePage";
277
+
278
+ export {
279
+ HomePage
280
+ };