@agg-build/ui 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/README.md +1 -1
  2. package/dist/{chunk-R6DETAZ6.mjs → chunk-34L7ZKJW.mjs} +804 -776
  3. package/dist/{chunk-JDYZJKTE.mjs → chunk-5FXMHTVR.mjs} +1 -1
  4. package/dist/{chunk-IT2Y62MG.mjs → chunk-CDQZJPHQ.mjs} +589 -340
  5. package/dist/{chunk-7JEJIGG4.mjs → chunk-EGCVA2AQ.mjs} +23 -8
  6. package/dist/{chunk-OHEZGKFM.mjs → chunk-FDTLV74F.mjs} +89 -5
  7. package/dist/{chunk-F3SU7BRE.mjs → chunk-Q2BRDVBU.mjs} +1 -1
  8. package/dist/{chunk-KDMNFHPL.mjs → chunk-TBKDLNOE.mjs} +27 -16
  9. package/dist/events.js +956 -906
  10. package/dist/events.mjs +3 -3
  11. package/dist/index.js +2936 -2550
  12. package/dist/index.mjs +17 -15
  13. package/dist/modals.js +816 -792
  14. package/dist/modals.mjs +3 -3
  15. package/dist/pages.js +2214 -1830
  16. package/dist/pages.mjs +6 -6
  17. package/dist/primitives.js +799 -773
  18. package/dist/primitives.mjs +3 -1
  19. package/dist/styles.css +1 -1
  20. package/dist/tailwind.css +1 -1
  21. package/dist/trading.js +868 -639
  22. package/dist/trading.mjs +4 -4
  23. package/dist/types/events/market-details/index.d.mts +1 -1
  24. package/dist/types/events/market-details/index.d.ts +1 -1
  25. package/dist/types/events/market-details/market-details.types.d.mts +11 -0
  26. package/dist/types/events/market-details/market-details.types.d.ts +11 -0
  27. package/dist/types/pages/user-profile/position-view-model.d.mts +54 -0
  28. package/dist/types/pages/user-profile/position-view-model.d.ts +54 -0
  29. package/dist/types/pages/user-profile/user-profile.types.d.mts +22 -0
  30. package/dist/types/pages/user-profile/user-profile.types.d.ts +22 -0
  31. package/dist/types/primitives/icon/index.d.mts +2 -1
  32. package/dist/types/primitives/icon/index.d.ts +2 -1
  33. package/dist/types/primitives/icon/registry.d.mts +4 -0
  34. package/dist/types/primitives/icon/registry.d.ts +4 -0
  35. package/dist/types/primitives/icon/svg/hourglass-start.d.mts +5 -0
  36. package/dist/types/primitives/icon/svg/hourglass-start.d.ts +5 -0
  37. package/dist/types/shared/utils.d.mts +5 -1
  38. package/dist/types/shared/utils.d.ts +5 -1
  39. package/package.json +3 -3
@@ -21,7 +21,7 @@ import {
21
21
  resolveUnifiedOrderBookEntries,
22
22
  sortOutcomeSelectorOutcomes,
23
23
  useEventTradingContext
24
- } from "./chunk-KDMNFHPL.mjs";
24
+ } from "./chunk-TBKDLNOE.mjs";
25
25
  import {
26
26
  AutocompleteSelect,
27
27
  Badge,
@@ -73,7 +73,7 @@ import {
73
73
  sortMarketsByYesOddsDesc,
74
74
  sortOutcomes,
75
75
  splitEventsByLifecycle
76
- } from "./chunk-R6DETAZ6.mjs";
76
+ } from "./chunk-34L7ZKJW.mjs";
77
77
 
78
78
  // src/events/item/index.tsx
79
79
  import {
@@ -2960,7 +2960,7 @@ var MarketDetailsOutcomeButton = ({
2960
2960
  as: "span",
2961
2961
  variant: isSelected ? "body-strong" : "body",
2962
2962
  className: cn("whitespace-nowrap truncate", classNames.text),
2963
- children: item.label
2963
+ children: item.title
2964
2964
  }
2965
2965
  ),
2966
2966
  /* @__PURE__ */ jsx8(
@@ -3046,6 +3046,7 @@ var MarketDetailsContent = ({
3046
3046
  ariaLabel,
3047
3047
  classNames,
3048
3048
  otherContent,
3049
+ onOutcomeSelect,
3049
3050
  live,
3050
3051
  midpointsFallback,
3051
3052
  midpointsFallbackVenues
@@ -3329,10 +3330,16 @@ var MarketDetailsContent = ({
3329
3330
  const orderBookErrorDescription = isSnapshotUnavailableError ? labels.marketDetails.orderBookUnavailableDescription : typeof orderBookError === "object" && orderBookError != null && "message" in orderBookError && typeof orderBookError.message === "string" && orderBookError.message.trim().length > 0 ? orderBookError.message : labels.marketDetails.orderBookUnavailableDescription;
3330
3331
  const hasNoOrderBook = isOrderBookNotFound && !isMarketResolved || !isOrderBookLoading && !hasOrderBookError && (selectedOutcomesByVenue.length === 0 || aggregatedOrderbookRows.hasNoOrderBook);
3331
3332
  const hasChartError = !!marketChartError;
3332
- const selectHeaderOutcome = (item) => {
3333
+ const selectHeaderOutcome = ({
3334
+ item,
3335
+ shouldNotifyOutcomeSelect = false
3336
+ }) => {
3333
3337
  if (isOutcomeSelectionLocked) return;
3334
3338
  if (item == null ? void 0 : item.id) {
3335
3339
  tradingContext == null ? void 0 : tradingContext.selectOutcome(item.id);
3340
+ if (shouldNotifyOutcomeSelect && model) {
3341
+ onOutcomeSelect == null ? void 0 : onOutcomeSelect({ marketId: model.market.id, outcomeId: item.id });
3342
+ }
3336
3343
  }
3337
3344
  };
3338
3345
  const handleOutcomeKeyDown = (eventToHandle) => {
@@ -3346,16 +3353,19 @@ var MarketDetailsContent = ({
3346
3353
  return item.label === selectedOutcomeLabel;
3347
3354
  });
3348
3355
  if (eventToHandle.key === "Home") {
3349
- selectHeaderOutcome(headerOutcomeItems[0]);
3356
+ selectHeaderOutcome({ item: headerOutcomeItems[0], shouldNotifyOutcomeSelect: true });
3350
3357
  return;
3351
3358
  }
3352
3359
  if (eventToHandle.key === "End") {
3353
- selectHeaderOutcome(headerOutcomeItems[headerOutcomeItems.length - 1]);
3360
+ selectHeaderOutcome({
3361
+ item: headerOutcomeItems[headerOutcomeItems.length - 1],
3362
+ shouldNotifyOutcomeSelect: true
3363
+ });
3354
3364
  return;
3355
3365
  }
3356
3366
  const direction = eventToHandle.key === "ArrowRight" ? 1 : -1;
3357
3367
  const nextIndex = activeIndex < 0 ? 0 : (activeIndex + direction + headerOutcomeItems.length) % headerOutcomeItems.length;
3358
- selectHeaderOutcome(headerOutcomeItems[nextIndex]);
3368
+ selectHeaderOutcome({ item: headerOutcomeItems[nextIndex], shouldNotifyOutcomeSelect: true });
3359
3369
  };
3360
3370
  const handleToggleExpanded = () => {
3361
3371
  if (!marketId) return;
@@ -3585,7 +3595,10 @@ var MarketDetailsContent = ({
3585
3595
  const selectedOutcomeItem = headerOutcomeItems.find(
3586
3596
  (headerOutcomeItem) => headerOutcomeItem.label === label
3587
3597
  );
3588
- selectHeaderOutcome(selectedOutcomeItem);
3598
+ selectHeaderOutcome({
3599
+ item: selectedOutcomeItem,
3600
+ shouldNotifyOutcomeSelect: true
3601
+ });
3589
3602
  }
3590
3603
  },
3591
3604
  item.label
@@ -3899,6 +3912,7 @@ var MarketDetailsList = ({
3899
3912
  markets: providedMarkets,
3900
3913
  eventTradingState,
3901
3914
  onClick,
3915
+ onOutcomeSelect,
3902
3916
  onExpandedMarketChange,
3903
3917
  defaultTab,
3904
3918
  classNames,
@@ -4092,6 +4106,7 @@ var MarketDetailsList = ({
4092
4106
  onClick == null ? void 0 : onClick(market);
4093
4107
  handleToggle(marketId, market);
4094
4108
  },
4109
+ onOutcomeSelect,
4095
4110
  defaultTab,
4096
4111
  ariaLabel: market.question,
4097
4112
  classNames: { root: cn("agg-market-list-item", classNames == null ? void 0 : classNames.item) },
@@ -7,10 +7,10 @@ import {
7
7
  getTradingValueLabel,
8
8
  getTradingVenueLabel,
9
9
  resolveOrderEligibilityMessage
10
- } from "./chunk-KDMNFHPL.mjs";
10
+ } from "./chunk-TBKDLNOE.mjs";
11
11
  import {
12
12
  GeoBlockBanner
13
- } from "./chunk-JDYZJKTE.mjs";
13
+ } from "./chunk-5FXMHTVR.mjs";
14
14
  import {
15
15
  AGG_TERMS_OF_SERVICE_URL,
16
16
  Button,
@@ -25,6 +25,7 @@ import {
25
25
  RemoteImage,
26
26
  Skeleton,
27
27
  SuccessCheckIcon,
28
+ Tooltip,
28
29
  Typography,
29
30
  UserTrustIcon,
30
31
  VenueLogo,
@@ -36,7 +37,7 @@ import {
36
37
  getMotionClassName,
37
38
  normalizeVenueMarketCluster,
38
39
  skeletonViews
39
- } from "./chunk-R6DETAZ6.mjs";
40
+ } from "./chunk-34L7ZKJW.mjs";
40
41
 
41
42
  // src/trading/types.ts
42
43
  import { Venue, enumGuard, isFiniteNonNeg, safeParse } from "@agg-build/sdk";
@@ -547,7 +548,9 @@ var buildLiveRouteCards = ({
547
548
  isUnavailable: true
548
549
  };
549
550
  });
550
- const baseCards = primaryCard ? [primaryCard, ...soloCards] : soloCards;
551
+ const baseCards = (primaryCard ? [primaryCard, ...soloCards] : soloCards).sort(
552
+ (left, right) => right.numericValue - left.numericValue
553
+ );
551
554
  const coveredVenueStrings = new Set(
552
555
  [...baseCards, ...unavailableCards].flatMap((card) => card.venue ? [card.venue] : [])
553
556
  );
@@ -2238,7 +2241,7 @@ var PlaceOrder = ({
2238
2241
  }) => {
2239
2242
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B, _C, _D;
2240
2243
  const {
2241
- features: { enableAnimations },
2244
+ features: { enableAnimations, showFeesBreakdown },
2242
2245
  general: { locale }
2243
2246
  } = useSdkUiConfig();
2244
2247
  const labels = useLabels();
@@ -2757,6 +2760,45 @@ var PlaceOrder = ({
2757
2760
  return (_d2 = selectedRouteCard.hint) != null ? _d2 : "";
2758
2761
  }, [selectedRouteCard, tradingLabels]);
2759
2762
  const displayedToWinValue = (_B = selectedRouteCard == null ? void 0 : selectedRouteCard.numericValue) != null ? _B : 0;
2763
+ const activeFeeBreakdown = activeQuoteData == null ? void 0 : activeQuoteData.feeBreakdown;
2764
+ const estimatedFeesValue = useMemo2(() => {
2765
+ if (!activeFeeBreakdown) return null;
2766
+ const totalFees = activeFeeBreakdown.venueFees + activeFeeBreakdown.bridgeFees + activeFeeBreakdown.executionGas;
2767
+ return formatUsd(totalFees, { minimumFractionDigits: 2, maximumFractionDigits: 2 });
2768
+ }, [activeFeeBreakdown]);
2769
+ const feeBreakdownRows = useMemo2(() => {
2770
+ if (!activeFeeBreakdown) return [];
2771
+ return [
2772
+ {
2773
+ label: tradingLabels.feeBreakdownVenueFees,
2774
+ value: formatUsd(activeFeeBreakdown.venueFees, {
2775
+ minimumFractionDigits: 2,
2776
+ maximumFractionDigits: 2
2777
+ })
2778
+ },
2779
+ {
2780
+ label: tradingLabels.feeBreakdownBridgeFees,
2781
+ value: formatUsd(activeFeeBreakdown.bridgeFees, {
2782
+ minimumFractionDigits: 2,
2783
+ maximumFractionDigits: 2
2784
+ })
2785
+ },
2786
+ {
2787
+ label: tradingLabels.feeBreakdownExecutionGas,
2788
+ value: formatUsd(activeFeeBreakdown.executionGas, {
2789
+ minimumFractionDigits: 2,
2790
+ maximumFractionDigits: 2
2791
+ })
2792
+ },
2793
+ {
2794
+ label: tradingLabels.feeBreakdownTotalFees,
2795
+ value: formatUsd(
2796
+ activeFeeBreakdown.venueFees + activeFeeBreakdown.bridgeFees + activeFeeBreakdown.executionGas,
2797
+ { minimumFractionDigits: 2, maximumFractionDigits: 2 }
2798
+ )
2799
+ }
2800
+ ];
2801
+ }, [activeFeeBreakdown, tradingLabels]);
2760
2802
  const isActionLoading = isPrimaryActionLoading || executeManaged.isPending;
2761
2803
  const selectedRouteGeoBlocked = (_C = selectedRouteCard == null ? void 0 : selectedRouteCard.isUnavailable) != null ? _C : false;
2762
2804
  const geoBlockedVenuesFromWarnings = useMemo2(
@@ -3234,6 +3276,36 @@ var PlaceOrder = ({
3234
3276
  }
3235
3277
  )
3236
3278
  ] }),
3279
+ showFeesBreakdown && hasEnteredAmount && estimatedFeesValue ? /* @__PURE__ */ jsxs3("div", { className: "agg-order-fees-section flex items-center justify-between gap-4", children: [
3280
+ /* @__PURE__ */ jsxs3("div", { className: "flex items-center gap-1.5", children: [
3281
+ /* @__PURE__ */ jsx4(
3282
+ Typography,
3283
+ {
3284
+ variant: "text-sm",
3285
+ className: "text-agg-sm leading-agg-5 text-agg-muted-foreground",
3286
+ children: tradingLabels.estimatedFees
3287
+ }
3288
+ ),
3289
+ feeBreakdownRows.length > 0 ? /* @__PURE__ */ jsx4(
3290
+ Tooltip,
3291
+ {
3292
+ "aria-label": tradingLabels.estimatedFeesTooltipAria,
3293
+ content: /* @__PURE__ */ jsx4("div", { className: "flex min-w-[220px] flex-col gap-2", children: feeBreakdownRows.map((row) => /* @__PURE__ */ jsxs3(
3294
+ "div",
3295
+ {
3296
+ className: "flex items-center justify-between gap-3 text-agg-sm leading-agg-5",
3297
+ children: [
3298
+ /* @__PURE__ */ jsx4("span", { className: "text-agg-muted-foreground", children: row.label }),
3299
+ /* @__PURE__ */ jsx4("span", { className: "font-agg-bold text-agg-foreground", children: row.value })
3300
+ ]
3301
+ },
3302
+ row.label
3303
+ )) })
3304
+ }
3305
+ ) : null
3306
+ ] }),
3307
+ /* @__PURE__ */ jsx4("p", { className: "text-agg-sm font-agg-bold leading-agg-5 text-agg-foreground", children: estimatedFeesValue })
3308
+ ] }) : null,
3237
3309
  shouldShowSmartRouting ? /* @__PURE__ */ jsxs3("div", { className: "agg-route-panel flex flex-col gap-3", children: [
3238
3310
  /* @__PURE__ */ jsxs3("div", { className: "agg-route-panel-header flex items-center justify-between gap-4", children: [
3239
3311
  /* @__PURE__ */ jsx4("p", { className: "agg-route-panel-title text-agg-base font-agg-bold leading-agg-6 text-agg-foreground", children: tradingLabels.smartRouting }),
@@ -3385,6 +3457,18 @@ var PlaceOrder = ({
3385
3457
  children: actionLabel
3386
3458
  }
3387
3459
  ),
3460
+ !shouldShowGeoBlockBanner && internalTab === "buy" && showFeesBreakdown ? /* @__PURE__ */ jsxs3("div", { className: "agg-order-platform-fee mt-1 flex items-center justify-center gap-1.5 text-agg-sm leading-agg-5 text-agg-muted-foreground", children: [
3461
+ /* @__PURE__ */ jsx4(
3462
+ Icon,
3463
+ {
3464
+ name: "shield-trust",
3465
+ size: "small",
3466
+ className: "h-3.5 w-3.5 text-agg-primary",
3467
+ "aria-hidden": "true"
3468
+ }
3469
+ ),
3470
+ /* @__PURE__ */ jsx4(Typography, { variant: "text-xs-caps", className: "text-agg-primary", children: tradingLabels.platformFee })
3471
+ ] }) : null,
3388
3472
  shouldShowGeoBlockBanner ? /* @__PURE__ */ jsx4(GeoBlockBanner, { termsUrl: AGG_TERMS_OF_SERVICE_URL }) : null,
3389
3473
  !shouldShowGeoBlockBanner ? /* @__PURE__ */ jsx4("p", { className: "agg-order-disclaimer text-center text-agg-xs leading-agg-4 text-agg-muted-foreground", children: tradingLabels.disclaimer }) : null
3390
3474
  ]
@@ -40,7 +40,7 @@ import {
40
40
  getMotionClassName,
41
41
  shortenAddress,
42
42
  venueLogoLabels
43
- } from "./chunk-R6DETAZ6.mjs";
43
+ } from "./chunk-34L7ZKJW.mjs";
44
44
 
45
45
  // src/deposit/index.tsx
46
46
  import { useEffect as useEffect3, useMemo, useRef, useState as useState2 } from "react";
@@ -17,7 +17,7 @@ import {
17
17
  selectPrimaryVenueMarket,
18
18
  skeletonViews,
19
19
  sortOutcomes
20
- } from "./chunk-R6DETAZ6.mjs";
20
+ } from "./chunk-34L7ZKJW.mjs";
21
21
 
22
22
  // src/trading/trading-context/index.tsx
23
23
  import { useEventTradingContext } from "@agg-build/hooks";
@@ -805,16 +805,25 @@ var resolveDisplayOutcomeLabels = (labels) => {
805
805
  var resolveMarketDetailsOutcomeLabels = (venueMarkets) => {
806
806
  var _a;
807
807
  const primaryMarket = selectPrimaryVenueMarket(venueMarkets);
808
- const initialLabels = ((_a = primaryMarket == null ? void 0 : primaryMarket.venueMarketOutcomes) != null ? _a : []).map((outcome) => outcome.label.trim()).filter(Boolean);
809
- const labels = new Set(initialLabels);
810
- venueMarkets.forEach((market) => {
811
- sortOutcomes(market.venueMarketOutcomes).forEach((outcome) => {
812
- const label = outcome.label.trim();
813
- if (!label) return;
814
- labels.add(label);
815
- });
816
- });
817
- return [...labels];
808
+ const labels = /* @__PURE__ */ new Map();
809
+ const upsertOutcome = (outcome) => {
810
+ var _a2;
811
+ const label = outcome.label.trim();
812
+ if (!label) return;
813
+ const key = normalizeLabel2(label);
814
+ const title = ((_a2 = outcome.title) != null ? _a2 : "").trim() || label;
815
+ const existing = labels.get(key);
816
+ if (!existing) {
817
+ labels.set(key, { label, title });
818
+ return;
819
+ }
820
+ if (existing.title === existing.label && title !== label) {
821
+ labels.set(key, __spreadProps(__spreadValues({}, existing), { title }));
822
+ }
823
+ };
824
+ ((_a = primaryMarket == null ? void 0 : primaryMarket.venueMarketOutcomes) != null ? _a : []).forEach(upsertOutcome);
825
+ venueMarkets.forEach((market) => sortOutcomes(market.venueMarketOutcomes).forEach(upsertOutcome));
826
+ return [...labels.values()];
818
827
  };
819
828
  var resolveInitialOutcomeLabel = (labels, defaultOutcomeLabel) => {
820
829
  var _a;
@@ -857,13 +866,15 @@ var resolveOutcomeTone = (label, index) => {
857
866
  return index === 0 ? "positive" : "negative";
858
867
  };
859
868
  var resolveHeaderOutcomeItems = (venueMarkets) => {
860
- const labels = resolveDisplayOutcomeLabels(resolveMarketDetailsOutcomeLabels(venueMarkets));
869
+ const outcomes = resolveMarketDetailsOutcomeLabels(venueMarkets);
870
+ const labels = resolveDisplayOutcomeLabels(outcomes.map((outcome) => outcome.label));
861
871
  const probabilityByLabel = resolveAverageProbabilityByLabel(venueMarkets, labels);
862
872
  return labels.slice(0, 2).map((label, index) => {
863
- var _a, _b, _c, _d, _e, _f;
873
+ var _a, _b, _c, _d, _e, _f, _g, _h;
864
874
  return {
865
- id: (_b = (_a = resolveOutcomesByVenue(venueMarkets, label)[0]) == null ? void 0 : _a.outcome.id) != null ? _b : "",
866
- venue: (_f = (_e = (_c = resolveOutcomesByVenue(venueMarkets, label)[0]) == null ? void 0 : _c.venue) != null ? _e : (_d = venueMarkets[0]) == null ? void 0 : _d.venue) != null ? _f : "polymarket",
875
+ title: (_b = (_a = outcomes.find((outcome) => normalizeLabel2(outcome.label) === normalizeLabel2(label))) == null ? void 0 : _a.title) != null ? _b : label,
876
+ id: (_d = (_c = resolveOutcomesByVenue(venueMarkets, label)[0]) == null ? void 0 : _c.outcome.id) != null ? _d : "",
877
+ venue: (_h = (_g = (_e = resolveOutcomesByVenue(venueMarkets, label)[0]) == null ? void 0 : _e.venue) != null ? _g : (_f = venueMarkets[0]) == null ? void 0 : _f.venue) != null ? _h : "polymarket",
867
878
  label,
868
879
  probability: probabilityByLabel.get(label),
869
880
  tone: resolveOutcomeTone(label, index)
@@ -941,7 +952,7 @@ var buildMarketDetailsModel = ({
941
952
  labels
942
953
  });
943
954
  const outcomeLabels = resolveDisplayOutcomeLabels(
944
- resolveMarketDetailsOutcomeLabels(market.venueMarkets)
955
+ resolveMarketDetailsOutcomeLabels(market.venueMarkets).map((outcome) => outcome.label)
945
956
  );
946
957
  const probabilityByLabel = resolveAverageProbabilityByLabel(market.venueMarkets, outcomeLabels);
947
958
  return {