@agg-build/ui 1.3.0 → 2.1.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 (44) hide show
  1. package/dist/{chunk-ONVP7YWS.mjs → chunk-3OI2ZLLT.mjs} +94 -39
  2. package/dist/{chunk-UFC7L74C.mjs → chunk-C5M2OOM3.mjs} +1 -1
  3. package/dist/{chunk-QUZWA34R.mjs → chunk-DXF2LMNN.mjs} +512 -503
  4. package/dist/{chunk-5ALBEKAT.mjs → chunk-R6FBYAY5.mjs} +246 -194
  5. package/dist/{chunk-6PQ6O6M5.mjs → chunk-Y6PVXAUQ.mjs} +34 -90
  6. package/dist/{chunk-YWJIYEJV.mjs → chunk-YAEA6EDG.mjs} +31 -18
  7. package/dist/{chunk-55ODXLOS.mjs → chunk-YMVD6Q2A.mjs} +1 -1
  8. package/dist/events.js +894 -903
  9. package/dist/events.mjs +3 -3
  10. package/dist/index.js +2609 -2530
  11. package/dist/index.mjs +9 -7
  12. package/dist/modals.js +278 -171
  13. package/dist/modals.mjs +5 -3
  14. package/dist/pages.js +2014 -1991
  15. package/dist/pages.mjs +6 -6
  16. package/dist/primitives.js +526 -475
  17. package/dist/primitives.mjs +1 -1
  18. package/dist/styles.css +1 -1
  19. package/dist/tailwind.css +1 -1
  20. package/dist/trading.js +28 -15
  21. package/dist/trading.mjs +4 -4
  22. package/dist/types/events/list/category-sidebar.d.mts +33 -0
  23. package/dist/types/events/list/category-sidebar.d.ts +33 -0
  24. package/dist/types/events/list/event-list-tabs.d.mts +2 -0
  25. package/dist/types/events/list/event-list-tabs.d.ts +2 -0
  26. package/dist/types/events/list/event-list.utils.d.mts +0 -4
  27. package/dist/types/events/list/event-list.utils.d.ts +0 -4
  28. package/dist/types/events/list/index.d.mts +1 -0
  29. package/dist/types/events/list/index.d.ts +1 -0
  30. package/dist/types/pages/event-market/event-market.types.d.mts +1 -0
  31. package/dist/types/pages/event-market/event-market.types.d.ts +1 -0
  32. package/dist/types/pages/user-profile/index.d.mts +1 -1
  33. package/dist/types/pages/user-profile/index.d.ts +1 -1
  34. package/dist/types/pages/user-profile/user-profile.types.d.mts +1 -0
  35. package/dist/types/pages/user-profile/user-profile.types.d.ts +1 -0
  36. package/dist/types/shared/use-horizontal-scroll-state.d.mts +15 -0
  37. package/dist/types/shared/use-horizontal-scroll-state.d.ts +15 -0
  38. package/dist/types/withdraw/index.d.mts +9 -1
  39. package/dist/types/withdraw/index.d.ts +9 -1
  40. package/dist/types/withdraw/steps/withdraw-amount.d.mts +10 -1
  41. package/dist/types/withdraw/steps/withdraw-amount.d.ts +10 -1
  42. package/dist/types/withdraw/withdraw-modal.types.d.mts +8 -0
  43. package/dist/types/withdraw/withdraw-modal.types.d.ts +8 -0
  44. package/package.json +3 -3
@@ -5002,7 +5002,7 @@ var Footer = ({
5002
5002
  "div",
5003
5003
  {
5004
5004
  className: cn(
5005
- "agg-footer-inner mx-auto flex h-10 w-full max-w-[1360px] px-6 lg:px-10 items-center justify-between",
5005
+ "agg-footer-inner mx-auto flex h-10 w-full max-w-[1440px] px-6 lg:px-10 items-center justify-between",
5006
5006
  classNames == null ? void 0 : classNames.inner
5007
5007
  ),
5008
5008
  children: [
@@ -5133,292 +5133,14 @@ var import_hooks27 = require("@agg-build/hooks");
5133
5133
  var import_react9 = require("react");
5134
5134
 
5135
5135
  // src/events/list/event-list.utils.ts
5136
- var import_hooks9 = require("@agg-build/hooks");
5137
- var import_sdk = require("@agg-build/sdk");
5138
-
5139
- // src/events/item/event-list-item.utils.ts
5140
5136
  var import_hooks8 = require("@agg-build/hooks");
5141
-
5142
- // src/events/shared/venue-market-cluster.ts
5143
- var toNonEmptyString = (value) => {
5144
- if (typeof value !== "string") return void 0;
5145
- const trimmedValue = value.trim();
5146
- return trimmedValue ? trimmedValue : void 0;
5147
- };
5148
- var addGraphEdge = (adjacencyById, fromMarketId, toMarketId) => {
5149
- var _a, _b;
5150
- if (fromMarketId === toMarketId) return;
5151
- const fromNeighbors = (_a = adjacencyById.get(fromMarketId)) != null ? _a : /* @__PURE__ */ new Set();
5152
- fromNeighbors.add(toMarketId);
5153
- adjacencyById.set(fromMarketId, fromNeighbors);
5154
- const toNeighbors = (_b = adjacencyById.get(toMarketId)) != null ? _b : /* @__PURE__ */ new Set();
5155
- toNeighbors.add(fromMarketId);
5156
- adjacencyById.set(toMarketId, toNeighbors);
5157
- };
5158
- var dedupeSourceMarketsById = (markets) => {
5159
- const seenMarketIds = /* @__PURE__ */ new Set();
5160
- return markets.filter((market) => {
5161
- if (seenMarketIds.has(market.id)) {
5162
- return false;
5163
- }
5164
- seenMarketIds.add(market.id);
5165
- return true;
5166
- });
5167
- };
5168
- var collectDirectRelationMarkets = (market) => {
5169
- var _a, _b, _c;
5170
- const relationMarkets = [];
5171
- const seenRelationIds = /* @__PURE__ */ new Set();
5172
- const addRelationMarket = (relationMarket) => {
5173
- if (!relationMarket) return;
5174
- if (seenRelationIds.has(relationMarket.id)) return;
5175
- seenRelationIds.add(relationMarket.id);
5176
- relationMarkets.push(relationMarket);
5177
- };
5178
- for (const matchedVenueMarket of (_a = market.matchedVenueMarkets) != null ? _a : []) {
5179
- addRelationMarket(matchedVenueMarket);
5180
- }
5181
- addRelationMarket(
5182
- (_c = (_b = market.matchEntry) == null ? void 0 : _b.targetVenueMarket) != null ? _c : void 0
5183
- );
5184
- return relationMarkets;
5185
- };
5186
- var collectUniqueRelatedMarkets = (markets, sourceMarketsById) => {
5187
- const relatedMarketsById = /* @__PURE__ */ new Map();
5188
- for (const market of markets) {
5189
- for (const relatedMarket of collectDirectRelationMarkets(market)) {
5190
- if (sourceMarketsById.has(relatedMarket.id) || relatedMarketsById.has(relatedMarket.id)) {
5191
- continue;
5192
- }
5193
- relatedMarketsById.set(relatedMarket.id, relatedMarket);
5194
- }
5195
- }
5196
- return Array.from(relatedMarketsById.values());
5197
- };
5198
- var normalizeVenueMarketCluster = (markets, selectedMarketId) => {
5199
- var _a, _b;
5200
- if (markets.length === 0) return [];
5201
- const orderedSourceMarkets = dedupeSourceMarketsById(markets);
5202
- const sourceMarketsById = new Map(orderedSourceMarkets.map((market) => [market.id, market]));
5203
- const orderedRelatedMarkets = collectUniqueRelatedMarkets(
5204
- orderedSourceMarkets,
5205
- sourceMarketsById
5206
- );
5207
- const relatedMarketsById = new Map(orderedRelatedMarkets.map((market) => [market.id, market]));
5208
- const resolvedSelectedMarketId = toNonEmptyString(selectedMarketId);
5209
- if (!resolvedSelectedMarketId) {
5210
- return [...orderedSourceMarkets, ...orderedRelatedMarkets];
5211
- }
5212
- const adjacencyById = /* @__PURE__ */ new Map();
5213
- for (const market of orderedSourceMarkets) {
5214
- for (const relatedMarket of collectDirectRelationMarkets(market)) {
5215
- addGraphEdge(adjacencyById, market.id, relatedMarket.id);
5216
- }
5217
- const targetVenueMarketId = toNonEmptyString((_a = market.matchEntry) == null ? void 0 : _a.targetVenueMarketId);
5218
- if (targetVenueMarketId) {
5219
- addGraphEdge(adjacencyById, market.id, targetVenueMarketId);
5220
- }
5221
- }
5222
- if (!sourceMarketsById.has(resolvedSelectedMarketId) && !relatedMarketsById.has(resolvedSelectedMarketId)) {
5223
- return [];
5224
- }
5225
- const visitedMarketIds = /* @__PURE__ */ new Set();
5226
- const queue = [resolvedSelectedMarketId];
5227
- while (queue.length > 0) {
5228
- const currentMarketId = queue.shift();
5229
- if (!currentMarketId || visitedMarketIds.has(currentMarketId)) {
5230
- continue;
5231
- }
5232
- visitedMarketIds.add(currentMarketId);
5233
- const neighborMarketIds = adjacencyById.get(currentMarketId);
5234
- for (const neighborMarketId of Array.from(neighborMarketIds != null ? neighborMarketIds : /* @__PURE__ */ new Set())) {
5235
- if (!visitedMarketIds.has(neighborMarketId)) {
5236
- queue.push(neighborMarketId);
5237
- }
5238
- }
5239
- }
5240
- const orderedClusterMarkets = [];
5241
- const appendedMarketIds = /* @__PURE__ */ new Set();
5242
- const appendMarket = (market) => {
5243
- if (!market) return;
5244
- if (!visitedMarketIds.has(market.id)) return;
5245
- if (appendedMarketIds.has(market.id)) return;
5246
- appendedMarketIds.add(market.id);
5247
- orderedClusterMarkets.push(market);
5248
- };
5249
- appendMarket(
5250
- (_b = sourceMarketsById.get(resolvedSelectedMarketId)) != null ? _b : relatedMarketsById.get(resolvedSelectedMarketId)
5251
- );
5252
- for (const market of orderedSourceMarkets) {
5253
- appendMarket(market);
5254
- }
5255
- for (const market of orderedRelatedMarkets) {
5256
- appendMarket(market);
5257
- }
5258
- return orderedClusterMarkets;
5259
- };
5260
-
5261
- // src/events/item/event-list-item.utils.ts
5262
- var normalizeProbability = (value) => {
5263
- if (typeof value !== "number" || !Number.isFinite(value)) return void 0;
5264
- if (value < 0) return 0;
5265
- if (value > 1) return 1;
5266
- return value;
5267
- };
5268
- var formatWholePercent = (value) => {
5269
- return `${Math.round(value * 100)}%`;
5270
- };
5271
- var hasDateLabel = (outcome) => {
5272
- return !!toDate(outcome.label);
5273
- };
5274
- var isYesLabel = (label2) => label2.trim().toLowerCase() === "yes";
5275
- var isNoLabel = (label2) => label2.trim().toLowerCase() === "no";
5276
- var hasBinaryOutcomes = (outcomes) => {
5277
- return outcomes.some((o) => isYesLabel(o.label)) && outcomes.some((o) => isNoLabel(o.label));
5278
- };
5279
- var sortYesFirst = (outcomes) => {
5280
- return [...outcomes].sort((a, b) => {
5281
- if (isYesLabel(a.label) && !isYesLabel(b.label)) return -1;
5282
- if (!isYesLabel(a.label) && isYesLabel(b.label)) return 1;
5283
- return 0;
5284
- });
5285
- };
5286
- var formatMarketProbabilityPercent = (value, formatPercent = formatWholePercent) => {
5287
- const probability = normalizeProbability(value);
5288
- if (probability == null) return "-";
5289
- const formattedValue = formatPercent(probability);
5290
- if (probability > 0 && formattedValue === formatPercent(0)) {
5291
- return "<1%";
5292
- }
5293
- return formattedValue;
5294
- };
5295
- var sortOutcomes = (outcomes) => {
5296
- if (outcomes.length <= 1) return outcomes;
5297
- if (hasBinaryOutcomes(outcomes)) {
5298
- return sortYesFirst(outcomes);
5299
- }
5300
- const now = Date.now();
5301
- if (outcomes.some(hasDateLabel)) {
5302
- return [...outcomes].sort((a, b) => {
5303
- var _a, _b, _c, _d;
5304
- const aDate = (_b = (_a = toDate(a.label)) == null ? void 0 : _a.getTime()) != null ? _b : 0;
5305
- const bDate = (_d = (_c = toDate(b.label)) == null ? void 0 : _c.getTime()) != null ? _d : 0;
5306
- return Math.abs(aDate - now) - Math.abs(bDate - now);
5307
- });
5308
- }
5309
- return [...outcomes].sort((a, b) => {
5310
- var _a, _b;
5311
- const aPrice = (_a = normalizeProbability(a.price)) != null ? _a : 0;
5312
- const bPrice = (_b = normalizeProbability(b.price)) != null ? _b : 0;
5313
- return bPrice - aPrice;
5314
- });
5315
- };
5316
- var compareVisibleOutcomeRows = (left, right) => {
5317
- var _a, _b;
5318
- const leftDate = toDate(resolveOutcomeTitle(left.outcome));
5319
- const rightDate = toDate(resolveOutcomeTitle(right.outcome));
5320
- if (leftDate && rightDate) {
5321
- return leftDate.getTime() - rightDate.getTime();
5322
- }
5323
- const leftProbability = (_a = normalizeProbability(left.outcome.price)) != null ? _a : -1;
5324
- const rightProbability = (_b = normalizeProbability(right.outcome.price)) != null ? _b : -1;
5325
- return rightProbability - leftProbability;
5326
- };
5327
- var shouldReplaceVisibleOutcome = (current, next) => {
5328
- var _a, _b;
5329
- const currentVolume = typeof current.market.volume === "number" ? current.market.volume : -1;
5330
- const nextVolume = typeof next.market.volume === "number" ? next.market.volume : -1;
5331
- if (currentVolume !== nextVolume) {
5332
- return nextVolume > currentVolume;
5333
- }
5334
- const currentProbability = (_a = normalizeProbability(current.outcome.price)) != null ? _a : -1;
5335
- const nextProbability = (_b = normalizeProbability(next.outcome.price)) != null ? _b : -1;
5336
- return nextProbability > currentProbability;
5337
- };
5338
- var resolveVisibleOutcomes = (venueMarkets) => {
5339
- const visibleOutcomesByLabel = /* @__PURE__ */ new Map();
5340
- venueMarkets.forEach((market) => {
5341
- const title2 = market.question;
5342
- const canonicalOutcome = sortOutcomes(market.venueMarketOutcomes)[0];
5343
- if (!canonicalOutcome) return;
5344
- const normalizedTitle = title2.trim().toLowerCase();
5345
- const nextVisibleOutcome = {
5346
- venue: market.venue,
5347
- market,
5348
- outcome: canonicalOutcome,
5349
- title: title2
5350
- };
5351
- const currentVisibleOutcome = visibleOutcomesByLabel.get(normalizedTitle);
5352
- if (!currentVisibleOutcome || shouldReplaceVisibleOutcome(currentVisibleOutcome, nextVisibleOutcome)) {
5353
- visibleOutcomesByLabel.set(normalizedTitle, nextVisibleOutcome);
5354
- }
5355
- });
5356
- return [...visibleOutcomesByLabel.values()].sort(compareVisibleOutcomeRows).slice(0, Math.max(1, 2));
5357
- };
5358
- var resolveOutcomeTitle = (outcome) => {
5359
- var _a, _b;
5360
- return (_b = (_a = outcome == null ? void 0 : outcome.title) != null ? _a : outcome == null ? void 0 : outcome.label) == null ? void 0 : _b.trim();
5361
- };
5362
- var selectPrimaryVenueMarket = (venueMarkets) => {
5363
- if (venueMarkets.length === 0) return void 0;
5364
- if (venueMarkets.length === 1) return venueMarkets[0];
5365
- return [...venueMarkets].sort((a, b) => {
5366
- const aVolume = typeof a.volume === "number" ? a.volume : -1;
5367
- const bVolume = typeof b.volume === "number" ? b.volume : -1;
5368
- return bVolume - aVolume;
5369
- })[0];
5370
- };
5371
- var resolveTileImage = (event, primaryVenueMarket, imageOverride) => {
5372
- if (typeof imageOverride === "string" && imageOverride.trim()) {
5373
- return imageOverride;
5374
- }
5375
- if (typeof event.image === "string" && event.image.trim()) {
5376
- return event.image;
5377
- }
5378
- if (typeof (primaryVenueMarket == null ? void 0 : primaryVenueMarket.image) === "string" && primaryVenueMarket.image.trim()) {
5379
- return primaryVenueMarket.image;
5380
- }
5381
- return void 0;
5382
- };
5383
- var formatCountLabel = (count, singular, plural) => {
5384
- return `${count} ${count === 1 ? singular : plural}`;
5385
- };
5386
- var getVenueSummary = (venueMarkets, options) => {
5387
- const normalizedVenueMarkets = normalizeVenueMarketCluster(venueMarkets);
5388
- const tradableVenues = options == null ? void 0 : options.tradableVenues;
5389
- const isVenueTradable = (venue) => {
5390
- if (tradableVenues == null) return true;
5391
- return tradableVenues.has(venue);
5392
- };
5393
- const uniqueVenues = Array.from(
5394
- new Set(
5395
- normalizedVenueMarkets.filter((market) => isVenueTradable(market.venue)).map((market) => market.venue)
5396
- )
5397
- );
5398
- return {
5399
- marketCount: normalizedVenueMarkets.length,
5400
- venueCount: uniqueVenues.length,
5401
- singleVenue: uniqueVenues.length === 1 ? uniqueVenues[0] : void 0
5402
- };
5403
- };
5404
- var resolveDisplayVolume = (eventVolume, venueMarkets) => {
5405
- if (typeof eventVolume === "number" && eventVolume > 0) return eventVolume;
5406
- const clusterMarkets = normalizeVenueMarketCluster(venueMarkets);
5407
- const marketSum = clusterMarkets.reduce(
5408
- (acc, m) => acc + (typeof m.volume === "number" ? m.volume : 0),
5409
- 0
5410
- );
5411
- if (marketSum > 0) return marketSum;
5412
- return void 0;
5413
- };
5414
-
5415
- // src/events/list/event-list.utils.ts
5137
+ var import_sdk = require("@agg-build/sdk");
5416
5138
  var filterOpenEvents = (events) => {
5417
5139
  return events.filter((event) => {
5418
5140
  var _a;
5419
- if (event.status && event.status !== import_hooks9.MarketStatus.open) return false;
5141
+ if (event.status && event.status !== import_hooks8.MarketStatus.open) return false;
5420
5142
  const openMarkets = (_a = event.venueMarkets) == null ? void 0 : _a.filter(
5421
- (m) => !m.status || m.status === import_hooks9.MarketStatus.open
5143
+ (m) => !m.status || m.status === import_hooks8.MarketStatus.open
5422
5144
  );
5423
5145
  if (!openMarkets || openMarkets.length === 0) return false;
5424
5146
  return true;
@@ -5426,16 +5148,16 @@ var filterOpenEvents = (events) => {
5426
5148
  };
5427
5149
 
5428
5150
  // src/primitives/remote-image/index.tsx
5429
- var import_hooks11 = require("@agg-build/hooks");
5151
+ var import_hooks10 = require("@agg-build/hooks");
5430
5152
  var import_react8 = require("react");
5431
5153
 
5432
5154
  // src/primitives/skeleton/skeleton-block.tsx
5433
- var import_hooks10 = require("@agg-build/hooks");
5155
+ var import_hooks9 = require("@agg-build/hooks");
5434
5156
  var import_jsx_runtime96 = require("react/jsx-runtime");
5435
5157
  var SkeletonBlock = ({ className }) => {
5436
5158
  const {
5437
5159
  features: { enableAnimations }
5438
- } = (0, import_hooks10.useSdkUiConfig)();
5160
+ } = (0, import_hooks9.useSdkUiConfig)();
5439
5161
  return /* @__PURE__ */ (0, import_jsx_runtime96.jsx)(
5440
5162
  "div",
5441
5163
  {
@@ -5479,7 +5201,7 @@ var RemoteImage = ({
5479
5201
  }) => {
5480
5202
  const {
5481
5203
  general: { theme }
5482
- } = (0, import_hooks11.useSdkUiConfig)();
5204
+ } = (0, import_hooks10.useSdkUiConfig)();
5483
5205
  const isDarkTheme = theme === "dark";
5484
5206
  const [status, setStatus] = (0, import_react8.useState)(
5485
5207
  () => resolveRemoteImageStatusFromSrc(src)
@@ -5553,17 +5275,17 @@ var RemoteImage = ({
5553
5275
  RemoteImage.displayName = "RemoteImage";
5554
5276
 
5555
5277
  // src/primitives/skeleton/views/event-list-skeleton-view.tsx
5556
- var import_hooks13 = require("@agg-build/hooks");
5278
+ var import_hooks12 = require("@agg-build/hooks");
5557
5279
 
5558
5280
  // src/primitives/skeleton/views/event-list-item-skeleton-view.tsx
5559
- var import_hooks12 = require("@agg-build/hooks");
5281
+ var import_hooks11 = require("@agg-build/hooks");
5560
5282
  var import_jsx_runtime98 = require("react/jsx-runtime");
5561
5283
  var EventListItemSkeletonView = ({
5562
5284
  className,
5563
5285
  ariaLabel,
5564
5286
  isStandalone = false
5565
5287
  }) => {
5566
- const labels = (0, import_hooks12.useLabels)();
5288
+ const labels = (0, import_hooks11.useLabels)();
5567
5289
  const outcomeTitleWidths = ["max-w-40", "max-w-[200px]"];
5568
5290
  return /* @__PURE__ */ (0, import_jsx_runtime98.jsxs)(
5569
5291
  Card,
@@ -5629,7 +5351,7 @@ var EventListSkeletonView = ({
5629
5351
  ariaLabel,
5630
5352
  withSidebar
5631
5353
  }) => {
5632
- const labels = (0, import_hooks13.useLabels)();
5354
+ const labels = (0, import_hooks12.useLabels)();
5633
5355
  return /* @__PURE__ */ (0, import_jsx_runtime99.jsxs)(
5634
5356
  "section",
5635
5357
  {
@@ -5668,7 +5390,7 @@ var EventListSkeletonView = ({
5668
5390
  EventListSkeletonView.displayName = "EventListSkeletonView";
5669
5391
 
5670
5392
  // src/primitives/skeleton/views/event-list-item-details-skeleton-view.tsx
5671
- var import_hooks14 = require("@agg-build/hooks");
5393
+ var import_hooks13 = require("@agg-build/hooks");
5672
5394
 
5673
5395
  // src/events/item-details/event-list-item-details.constants.ts
5674
5396
  var detailsBaseCardClassName = "w-full gap-6 p-5 md:gap-8";
@@ -5679,7 +5401,7 @@ var EventListItemDetailsSkeletonView = ({
5679
5401
  className,
5680
5402
  ariaLabel
5681
5403
  }) => {
5682
- const labels = (0, import_hooks14.useLabels)();
5404
+ const labels = (0, import_hooks13.useLabels)();
5683
5405
  return /* @__PURE__ */ (0, import_jsx_runtime100.jsxs)(
5684
5406
  Card,
5685
5407
  {
@@ -5716,7 +5438,7 @@ var EventListItemDetailsSkeletonView = ({
5716
5438
  EventListItemDetailsSkeletonView.displayName = "EventListItemDetailsSkeletonView";
5717
5439
 
5718
5440
  // src/primitives/skeleton/views/market-details-skeleton-view.tsx
5719
- var import_hooks15 = require("@agg-build/hooks");
5441
+ var import_hooks14 = require("@agg-build/hooks");
5720
5442
 
5721
5443
  // src/events/market-details/market-details.constants.ts
5722
5444
  var marketDetailsBaseCardClassName = "w-full overflow-hidden rounded-agg-lg border border-agg-separator bg-agg-secondary text-agg-foreground shadow-none hover:shadow-none";
@@ -5804,7 +5526,7 @@ var MarketDetailsSkeletonView = ({
5804
5526
  ariaLabel,
5805
5527
  isDetailed
5806
5528
  }) => {
5807
- const labels = (0, import_hooks15.useLabels)();
5529
+ const labels = (0, import_hooks14.useLabels)();
5808
5530
  return /* @__PURE__ */ (0, import_jsx_runtime101.jsxs)(
5809
5531
  Card,
5810
5532
  {
@@ -5905,7 +5627,7 @@ var PlaceOrderSkeletonView = ({
5905
5627
  PlaceOrderSkeletonView.displayName = "PlaceOrderSkeletonView";
5906
5628
 
5907
5629
  // src/primitives/skeleton/views/search-skeleton-view.tsx
5908
- var import_hooks16 = require("@agg-build/hooks");
5630
+ var import_hooks15 = require("@agg-build/hooks");
5909
5631
  var import_jsx_runtime103 = require("react/jsx-runtime");
5910
5632
  var SearchSkeletonRow = () => {
5911
5633
  return /* @__PURE__ */ (0, import_jsx_runtime103.jsxs)("div", { className: "flex w-full items-center gap-6 px-5 py-4", children: [
@@ -5931,7 +5653,7 @@ var SearchSkeletonRow = () => {
5931
5653
  ] });
5932
5654
  };
5933
5655
  var SearchSkeletonView = ({ className, ariaLabel }) => {
5934
- const labels = (0, import_hooks16.useLabels)();
5656
+ const labels = (0, import_hooks15.useLabels)();
5935
5657
  return /* @__PURE__ */ (0, import_jsx_runtime103.jsxs)(
5936
5658
  "div",
5937
5659
  {
@@ -5953,13 +5675,13 @@ var SearchSkeletonView = ({ className, ariaLabel }) => {
5953
5675
  SearchSkeletonView.displayName = "SearchSkeletonView";
5954
5676
 
5955
5677
  // src/primitives/skeleton/views/settlement-skeleton-view.tsx
5956
- var import_hooks17 = require("@agg-build/hooks");
5678
+ var import_hooks16 = require("@agg-build/hooks");
5957
5679
  var import_jsx_runtime104 = require("react/jsx-runtime");
5958
5680
  var SettlementSkeletonView = ({
5959
5681
  className,
5960
5682
  ariaLabel
5961
5683
  }) => {
5962
- const labels = (0, import_hooks17.useLabels)();
5684
+ const labels = (0, import_hooks16.useLabels)();
5963
5685
  return /* @__PURE__ */ (0, import_jsx_runtime104.jsxs)(
5964
5686
  Card,
5965
5687
  {
@@ -6173,7 +5895,7 @@ var Skeleton = ({
6173
5895
  Skeleton.displayName = "Skeleton";
6174
5896
 
6175
5897
  // src/primitives/venue-logo/index.tsx
6176
- var import_hooks26 = require("@agg-build/hooks");
5898
+ var import_hooks25 = require("@agg-build/hooks");
6177
5899
 
6178
5900
  // src/primitives/venue-logo/venue-logo.constants.ts
6179
5901
  var import_sdk10 = require("@agg-build/sdk");
@@ -6226,7 +5948,7 @@ var DefaultVenueIcon = (_a) => {
6226
5948
  };
6227
5949
 
6228
5950
  // src/primitives/venue-logo/svg/logo-hyperliquid.tsx
6229
- var import_hooks18 = require("@agg-build/hooks");
5951
+ var import_hooks17 = require("@agg-build/hooks");
6230
5952
  var import_sdk2 = require("@agg-build/sdk");
6231
5953
  var import_jsx_runtime109 = require("react/jsx-runtime");
6232
5954
  var LogoHyperliquidIcon = (_a) => {
@@ -6244,7 +5966,7 @@ var LogoHyperliquidIcon = (_a) => {
6244
5966
  var _a2;
6245
5967
  const {
6246
5968
  general: { theme }
6247
- } = (0, import_hooks18.useAggUiConfig)();
5969
+ } = (0, import_hooks17.useAggUiConfig)();
6248
5970
  const isDarkTheme = theme === "dark";
6249
5971
  const primaryColor = resolveLogoPrimaryColor({
6250
5972
  brandColor: (_a2 = resolveVenueLineColor(import_sdk2.Venue.hyperliquid, isDarkTheme)) != null ? _a2 : "#97FCE4",
@@ -6274,7 +5996,7 @@ var LogoHyperliquidIcon = (_a) => {
6274
5996
  LogoHyperliquidIcon.displayName = "LogoHyperliquidIcon";
6275
5997
 
6276
5998
  // src/primitives/venue-logo/svg/logo-kalshi.tsx
6277
- var import_hooks19 = require("@agg-build/hooks");
5999
+ var import_hooks18 = require("@agg-build/hooks");
6278
6000
  var import_sdk3 = require("@agg-build/sdk");
6279
6001
  var import_jsx_runtime110 = require("react/jsx-runtime");
6280
6002
  var LogoKalshiIcon = (_a) => {
@@ -6292,7 +6014,7 @@ var LogoKalshiIcon = (_a) => {
6292
6014
  var _a2;
6293
6015
  const {
6294
6016
  general: { theme }
6295
- } = (0, import_hooks19.useAggUiConfig)();
6017
+ } = (0, import_hooks18.useAggUiConfig)();
6296
6018
  const isDarkTheme = theme === "dark";
6297
6019
  const primaryColor = resolveLogoPrimaryColor({
6298
6020
  brandColor: (_a2 = resolveVenueLineColor(import_sdk3.Venue.kalshi, isDarkTheme)) != null ? _a2 : "#18C590",
@@ -6322,7 +6044,7 @@ var LogoKalshiIcon = (_a) => {
6322
6044
  LogoKalshiIcon.displayName = "LogoKalshiIcon";
6323
6045
 
6324
6046
  // src/primitives/venue-logo/svg/logo-limitless.tsx
6325
- var import_hooks20 = require("@agg-build/hooks");
6047
+ var import_hooks19 = require("@agg-build/hooks");
6326
6048
  var import_sdk4 = require("@agg-build/sdk");
6327
6049
  var import_jsx_runtime111 = require("react/jsx-runtime");
6328
6050
  var LogoLimitlessIcon = (_a) => {
@@ -6340,7 +6062,7 @@ var LogoLimitlessIcon = (_a) => {
6340
6062
  var _a2;
6341
6063
  const {
6342
6064
  general: { theme }
6343
- } = (0, import_hooks20.useAggUiConfig)();
6065
+ } = (0, import_hooks19.useAggUiConfig)();
6344
6066
  const isDarkTheme = theme === "dark";
6345
6067
  const primaryColor = resolveLogoPrimaryColor({
6346
6068
  brandColor: (_a2 = resolveVenueLineColor(import_sdk4.Venue.limitless, isDarkTheme)) != null ? _a2 : "#c4fe00",
@@ -6370,7 +6092,7 @@ var LogoLimitlessIcon = (_a) => {
6370
6092
  LogoLimitlessIcon.displayName = "LogoLimitlessIcon";
6371
6093
 
6372
6094
  // src/primitives/venue-logo/svg/logo-myriad.tsx
6373
- var import_hooks21 = require("@agg-build/hooks");
6095
+ var import_hooks20 = require("@agg-build/hooks");
6374
6096
  var import_sdk5 = require("@agg-build/sdk");
6375
6097
  var import_jsx_runtime112 = require("react/jsx-runtime");
6376
6098
  var LogoMyriadIcon = (_a) => {
@@ -6388,7 +6110,7 @@ var LogoMyriadIcon = (_a) => {
6388
6110
  var _a2;
6389
6111
  const {
6390
6112
  general: { theme }
6391
- } = (0, import_hooks21.useAggUiConfig)();
6113
+ } = (0, import_hooks20.useAggUiConfig)();
6392
6114
  const isDarkTheme = theme === "dark";
6393
6115
  const primaryColor = resolveLogoPrimaryColor({
6394
6116
  brandColor: (_a2 = resolveVenueLineColor(import_sdk5.Venue.myriad, isDarkTheme)) != null ? _a2 : "#2E5CFF",
@@ -6418,7 +6140,7 @@ var LogoMyriadIcon = (_a) => {
6418
6140
  LogoMyriadIcon.displayName = "LogoMyriadIcon";
6419
6141
 
6420
6142
  // src/primitives/venue-logo/svg/logo-opinion.tsx
6421
- var import_hooks22 = require("@agg-build/hooks");
6143
+ var import_hooks21 = require("@agg-build/hooks");
6422
6144
  var import_sdk6 = require("@agg-build/sdk");
6423
6145
  var import_jsx_runtime113 = require("react/jsx-runtime");
6424
6146
  var LogoOpinionIcon = (_a) => {
@@ -6436,7 +6158,7 @@ var LogoOpinionIcon = (_a) => {
6436
6158
  var _a2;
6437
6159
  const {
6438
6160
  general: { theme }
6439
- } = (0, import_hooks22.useAggUiConfig)();
6161
+ } = (0, import_hooks21.useAggUiConfig)();
6440
6162
  const isDarkTheme = theme === "dark";
6441
6163
  const primaryColor = resolveLogoPrimaryColor({
6442
6164
  brandColor: (_a2 = resolveVenueLineColor(import_sdk6.Venue.opinion, isDarkTheme)) != null ? _a2 : "#ec5e26",
@@ -6466,7 +6188,7 @@ var LogoOpinionIcon = (_a) => {
6466
6188
  LogoOpinionIcon.displayName = "LogoOpinionIcon";
6467
6189
 
6468
6190
  // src/primitives/venue-logo/svg/logo-polymarket.tsx
6469
- var import_hooks23 = require("@agg-build/hooks");
6191
+ var import_hooks22 = require("@agg-build/hooks");
6470
6192
  var import_sdk7 = require("@agg-build/sdk");
6471
6193
  var import_jsx_runtime114 = require("react/jsx-runtime");
6472
6194
  var LogoPolymarketIcon = (_a) => {
@@ -6484,7 +6206,7 @@ var LogoPolymarketIcon = (_a) => {
6484
6206
  var _a2;
6485
6207
  const {
6486
6208
  general: { theme }
6487
- } = (0, import_hooks23.useAggUiConfig)();
6209
+ } = (0, import_hooks22.useAggUiConfig)();
6488
6210
  const isDarkTheme = theme === "dark";
6489
6211
  const primaryColor = resolveLogoPrimaryColor({
6490
6212
  brandColor: (_a2 = resolveVenueLineColor(import_sdk7.Venue.polymarket, isDarkTheme)) != null ? _a2 : "#2E5CFF",
@@ -6514,7 +6236,7 @@ var LogoPolymarketIcon = (_a) => {
6514
6236
  LogoPolymarketIcon.displayName = "LogoPolymarketIcon";
6515
6237
 
6516
6238
  // src/primitives/venue-logo/svg/logo-predict.tsx
6517
- var import_hooks24 = require("@agg-build/hooks");
6239
+ var import_hooks23 = require("@agg-build/hooks");
6518
6240
  var import_sdk8 = require("@agg-build/sdk");
6519
6241
  var import_jsx_runtime115 = require("react/jsx-runtime");
6520
6242
  var LogoPredictIcon = (_a) => {
@@ -6532,7 +6254,7 @@ var LogoPredictIcon = (_a) => {
6532
6254
  var _a2;
6533
6255
  const {
6534
6256
  general: { theme }
6535
- } = (0, import_hooks24.useAggUiConfig)();
6257
+ } = (0, import_hooks23.useAggUiConfig)();
6536
6258
  const isDarkTheme = theme === "dark";
6537
6259
  const primaryColor = resolveLogoPrimaryColor({
6538
6260
  brandColor: (_a2 = resolveVenueLineColor(import_sdk8.Venue.predict, isDarkTheme)) != null ? _a2 : "#705bf6",
@@ -6564,7 +6286,7 @@ var LogoPredictIcon = (_a) => {
6564
6286
  LogoPredictIcon.displayName = "LogoPredictIcon";
6565
6287
 
6566
6288
  // src/primitives/venue-logo/svg/logo-probable.tsx
6567
- var import_hooks25 = require("@agg-build/hooks");
6289
+ var import_hooks24 = require("@agg-build/hooks");
6568
6290
  var import_sdk9 = require("@agg-build/sdk");
6569
6291
  var import_jsx_runtime116 = require("react/jsx-runtime");
6570
6292
  var LogoProbableIcon = (_a) => {
@@ -6582,7 +6304,7 @@ var LogoProbableIcon = (_a) => {
6582
6304
  var _a2;
6583
6305
  const {
6584
6306
  general: { theme }
6585
- } = (0, import_hooks25.useAggUiConfig)();
6307
+ } = (0, import_hooks24.useAggUiConfig)();
6586
6308
  const isDarkTheme = theme === "dark";
6587
6309
  const primaryColor = resolveLogoPrimaryColor({
6588
6310
  brandColor: (_a2 = resolveVenueLineColor(import_sdk9.Venue.probable, isDarkTheme)) != null ? _a2 : "#EC4899",
@@ -6681,91 +6403,369 @@ var lineColorByVenue = {
6681
6403
  [import_sdk10.Venue.hyperliquid]: "#97FCE4"
6682
6404
  }
6683
6405
  };
6684
- var resolveVenueLineColor = (venue, isDarkTheme) => {
6685
- return lineColorByVenue[isDarkTheme ? "dark" : "light"][venue];
6686
- };
6687
- var DEFAULT_VENUE_COLOR = "#94a3b8";
6688
-
6689
- // src/primitives/venue-logo/venue-logo.utils.ts
6690
- var resolveVenueLogoLabel = ({
6691
- ariaLabel,
6692
- labels,
6693
- venue,
6694
- venueFallbackLabels
6695
- }) => {
6696
- var _a;
6697
- return (_a = ariaLabel != null ? ariaLabel : labels.venues[venue]) != null ? _a : venueFallbackLabels[venue];
6698
- };
6699
- var resolveVenueLogoIsColor = ({
6700
- isColor,
6701
- isMonochromatic
6702
- }) => {
6703
- return isMonochromatic ? false : isColor;
6406
+ var resolveVenueLineColor = (venue, isDarkTheme) => {
6407
+ return lineColorByVenue[isDarkTheme ? "dark" : "light"][venue];
6408
+ };
6409
+ var DEFAULT_VENUE_COLOR = "#94a3b8";
6410
+
6411
+ // src/primitives/venue-logo/venue-logo.utils.ts
6412
+ var resolveVenueLogoLabel = ({
6413
+ ariaLabel,
6414
+ labels,
6415
+ venue,
6416
+ venueFallbackLabels
6417
+ }) => {
6418
+ var _a;
6419
+ return (_a = ariaLabel != null ? ariaLabel : labels.venues[venue]) != null ? _a : venueFallbackLabels[venue];
6420
+ };
6421
+ var resolveVenueLogoIsColor = ({
6422
+ isColor,
6423
+ isMonochromatic
6424
+ }) => {
6425
+ return isMonochromatic ? false : isColor;
6426
+ };
6427
+
6428
+ // src/primitives/venue-logo/index.tsx
6429
+ var import_jsx_runtime117 = require("react/jsx-runtime");
6430
+ var VenueLogo = ({
6431
+ venue,
6432
+ variant = "icon",
6433
+ isColor = true,
6434
+ isMonochromatic = false,
6435
+ color,
6436
+ size = "medium",
6437
+ className,
6438
+ ariaLabel,
6439
+ title: title2
6440
+ }) => {
6441
+ var _a, _b;
6442
+ const labels = (0, import_hooks25.useLabels)();
6443
+ const sizeClass = sizeClasses2[size];
6444
+ const resolvedLabel = resolveVenueLogoLabel({
6445
+ ariaLabel,
6446
+ labels,
6447
+ venue,
6448
+ venueFallbackLabels: venueLogoLabels
6449
+ });
6450
+ const isUnknownVenue = !(venue in venueLogoRegistry);
6451
+ if (isUnknownVenue && process.env.NODE_ENV === "development") {
6452
+ console.warn(`[AggUI] Unknown venue "${venue}" \u2014 using default logo`);
6453
+ }
6454
+ if (variant === "logo") {
6455
+ return /* @__PURE__ */ (0, import_jsx_runtime117.jsx)(
6456
+ RemoteImage,
6457
+ {
6458
+ src: (_a = venueLogoUrlRegistry[venue]) != null ? _a : DEFAULT_VENUE_LOGO_URL,
6459
+ alt: resolvedLabel || DEFAULT_VENUE_LABEL,
6460
+ title: title2,
6461
+ className: cn("shrink-0 rounded-agg-lg object-cover", sizeClass, className)
6462
+ }
6463
+ );
6464
+ }
6465
+ const Component2 = (_b = venueLogoRegistry[venue]) != null ? _b : DefaultVenueIcon;
6466
+ const resolvedIsColor = resolveVenueLogoIsColor({
6467
+ isColor,
6468
+ isMonochromatic
6469
+ });
6470
+ return /* @__PURE__ */ (0, import_jsx_runtime117.jsx)(
6471
+ Component2,
6472
+ {
6473
+ className: cn("group/agg-venue-logo", "shrink-0", sizeClass, className),
6474
+ isColor: resolvedIsColor,
6475
+ color,
6476
+ "aria-label": resolvedLabel || DEFAULT_VENUE_LABEL,
6477
+ title: title2
6478
+ }
6479
+ );
6480
+ };
6481
+ VenueLogo.displayName = "VenueLogo";
6482
+
6483
+ // src/primitives/search/search.constants.ts
6484
+ var DEFAULT_SEARCH_LIMIT = 5;
6485
+ var MIN_SEARCH_LENGTH = 3;
6486
+ var SEARCH_DEBOUNCE_MS = 300;
6487
+
6488
+ // src/primitives/search/search.utils.ts
6489
+ var import_sdk11 = require("@agg-build/sdk");
6490
+ var import_dayjs2 = __toESM(require("dayjs"));
6491
+
6492
+ // src/events/item/event-list-item.utils.ts
6493
+ var import_hooks26 = require("@agg-build/hooks");
6494
+
6495
+ // src/events/shared/venue-market-cluster.ts
6496
+ var toNonEmptyString = (value) => {
6497
+ if (typeof value !== "string") return void 0;
6498
+ const trimmedValue = value.trim();
6499
+ return trimmedValue ? trimmedValue : void 0;
6500
+ };
6501
+ var addGraphEdge = (adjacencyById, fromMarketId, toMarketId) => {
6502
+ var _a, _b;
6503
+ if (fromMarketId === toMarketId) return;
6504
+ const fromNeighbors = (_a = adjacencyById.get(fromMarketId)) != null ? _a : /* @__PURE__ */ new Set();
6505
+ fromNeighbors.add(toMarketId);
6506
+ adjacencyById.set(fromMarketId, fromNeighbors);
6507
+ const toNeighbors = (_b = adjacencyById.get(toMarketId)) != null ? _b : /* @__PURE__ */ new Set();
6508
+ toNeighbors.add(fromMarketId);
6509
+ adjacencyById.set(toMarketId, toNeighbors);
6510
+ };
6511
+ var dedupeSourceMarketsById = (markets) => {
6512
+ const seenMarketIds = /* @__PURE__ */ new Set();
6513
+ return markets.filter((market) => {
6514
+ if (seenMarketIds.has(market.id)) {
6515
+ return false;
6516
+ }
6517
+ seenMarketIds.add(market.id);
6518
+ return true;
6519
+ });
6520
+ };
6521
+ var collectDirectRelationMarkets = (market) => {
6522
+ var _a, _b, _c;
6523
+ const relationMarkets = [];
6524
+ const seenRelationIds = /* @__PURE__ */ new Set();
6525
+ const addRelationMarket = (relationMarket) => {
6526
+ if (!relationMarket) return;
6527
+ if (seenRelationIds.has(relationMarket.id)) return;
6528
+ seenRelationIds.add(relationMarket.id);
6529
+ relationMarkets.push(relationMarket);
6530
+ };
6531
+ for (const matchedVenueMarket of (_a = market.matchedVenueMarkets) != null ? _a : []) {
6532
+ addRelationMarket(matchedVenueMarket);
6533
+ }
6534
+ addRelationMarket(
6535
+ (_c = (_b = market.matchEntry) == null ? void 0 : _b.targetVenueMarket) != null ? _c : void 0
6536
+ );
6537
+ return relationMarkets;
6538
+ };
6539
+ var collectUniqueRelatedMarkets = (markets, sourceMarketsById) => {
6540
+ const relatedMarketsById = /* @__PURE__ */ new Map();
6541
+ for (const market of markets) {
6542
+ for (const relatedMarket of collectDirectRelationMarkets(market)) {
6543
+ if (sourceMarketsById.has(relatedMarket.id) || relatedMarketsById.has(relatedMarket.id)) {
6544
+ continue;
6545
+ }
6546
+ relatedMarketsById.set(relatedMarket.id, relatedMarket);
6547
+ }
6548
+ }
6549
+ return Array.from(relatedMarketsById.values());
6550
+ };
6551
+ var normalizeVenueMarketCluster = (markets, selectedMarketId) => {
6552
+ var _a, _b;
6553
+ if (markets.length === 0) return [];
6554
+ const orderedSourceMarkets = dedupeSourceMarketsById(markets);
6555
+ const sourceMarketsById = new Map(orderedSourceMarkets.map((market) => [market.id, market]));
6556
+ const orderedRelatedMarkets = collectUniqueRelatedMarkets(
6557
+ orderedSourceMarkets,
6558
+ sourceMarketsById
6559
+ );
6560
+ const relatedMarketsById = new Map(orderedRelatedMarkets.map((market) => [market.id, market]));
6561
+ const resolvedSelectedMarketId = toNonEmptyString(selectedMarketId);
6562
+ if (!resolvedSelectedMarketId) {
6563
+ return [...orderedSourceMarkets, ...orderedRelatedMarkets];
6564
+ }
6565
+ const adjacencyById = /* @__PURE__ */ new Map();
6566
+ for (const market of orderedSourceMarkets) {
6567
+ for (const relatedMarket of collectDirectRelationMarkets(market)) {
6568
+ addGraphEdge(adjacencyById, market.id, relatedMarket.id);
6569
+ }
6570
+ const targetVenueMarketId = toNonEmptyString((_a = market.matchEntry) == null ? void 0 : _a.targetVenueMarketId);
6571
+ if (targetVenueMarketId) {
6572
+ addGraphEdge(adjacencyById, market.id, targetVenueMarketId);
6573
+ }
6574
+ }
6575
+ if (!sourceMarketsById.has(resolvedSelectedMarketId) && !relatedMarketsById.has(resolvedSelectedMarketId)) {
6576
+ return [];
6577
+ }
6578
+ const visitedMarketIds = /* @__PURE__ */ new Set();
6579
+ const queue = [resolvedSelectedMarketId];
6580
+ while (queue.length > 0) {
6581
+ const currentMarketId = queue.shift();
6582
+ if (!currentMarketId || visitedMarketIds.has(currentMarketId)) {
6583
+ continue;
6584
+ }
6585
+ visitedMarketIds.add(currentMarketId);
6586
+ const neighborMarketIds = adjacencyById.get(currentMarketId);
6587
+ for (const neighborMarketId of Array.from(neighborMarketIds != null ? neighborMarketIds : /* @__PURE__ */ new Set())) {
6588
+ if (!visitedMarketIds.has(neighborMarketId)) {
6589
+ queue.push(neighborMarketId);
6590
+ }
6591
+ }
6592
+ }
6593
+ const orderedClusterMarkets = [];
6594
+ const appendedMarketIds = /* @__PURE__ */ new Set();
6595
+ const appendMarket = (market) => {
6596
+ if (!market) return;
6597
+ if (!visitedMarketIds.has(market.id)) return;
6598
+ if (appendedMarketIds.has(market.id)) return;
6599
+ appendedMarketIds.add(market.id);
6600
+ orderedClusterMarkets.push(market);
6601
+ };
6602
+ appendMarket(
6603
+ (_b = sourceMarketsById.get(resolvedSelectedMarketId)) != null ? _b : relatedMarketsById.get(resolvedSelectedMarketId)
6604
+ );
6605
+ for (const market of orderedSourceMarkets) {
6606
+ appendMarket(market);
6607
+ }
6608
+ for (const market of orderedRelatedMarkets) {
6609
+ appendMarket(market);
6610
+ }
6611
+ return orderedClusterMarkets;
6612
+ };
6613
+
6614
+ // src/events/item/event-list-item.utils.ts
6615
+ var normalizeProbability = (value) => {
6616
+ if (typeof value !== "number" || !Number.isFinite(value)) return void 0;
6617
+ if (value < 0) return 0;
6618
+ if (value > 1) return 1;
6619
+ return value;
6620
+ };
6621
+ var formatWholePercent = (value) => {
6622
+ return `${Math.round(value * 100)}%`;
6623
+ };
6624
+ var hasDateLabel = (outcome) => {
6625
+ return !!toDate(outcome.label);
6626
+ };
6627
+ var isYesLabel = (label2) => label2.trim().toLowerCase() === "yes";
6628
+ var isNoLabel = (label2) => label2.trim().toLowerCase() === "no";
6629
+ var hasBinaryOutcomes = (outcomes) => {
6630
+ return outcomes.some((o) => isYesLabel(o.label)) && outcomes.some((o) => isNoLabel(o.label));
6631
+ };
6632
+ var sortYesFirst = (outcomes) => {
6633
+ return [...outcomes].sort((a, b) => {
6634
+ if (isYesLabel(a.label) && !isYesLabel(b.label)) return -1;
6635
+ if (!isYesLabel(a.label) && isYesLabel(b.label)) return 1;
6636
+ return 0;
6637
+ });
6638
+ };
6639
+ var formatMarketProbabilityPercent = (value, formatPercent = formatWholePercent) => {
6640
+ const probability = normalizeProbability(value);
6641
+ if (probability == null) return "-";
6642
+ const formattedValue = formatPercent(probability);
6643
+ if (probability > 0 && formattedValue === formatPercent(0)) {
6644
+ return "<1%";
6645
+ }
6646
+ return formattedValue;
6647
+ };
6648
+ var sortOutcomes = (outcomes) => {
6649
+ if (outcomes.length <= 1) return outcomes;
6650
+ if (hasBinaryOutcomes(outcomes)) {
6651
+ return sortYesFirst(outcomes);
6652
+ }
6653
+ const now = Date.now();
6654
+ if (outcomes.some(hasDateLabel)) {
6655
+ return [...outcomes].sort((a, b) => {
6656
+ var _a, _b, _c, _d;
6657
+ const aDate = (_b = (_a = toDate(a.label)) == null ? void 0 : _a.getTime()) != null ? _b : 0;
6658
+ const bDate = (_d = (_c = toDate(b.label)) == null ? void 0 : _c.getTime()) != null ? _d : 0;
6659
+ return Math.abs(aDate - now) - Math.abs(bDate - now);
6660
+ });
6661
+ }
6662
+ return [...outcomes].sort((a, b) => {
6663
+ var _a, _b;
6664
+ const aPrice = (_a = normalizeProbability(a.price)) != null ? _a : 0;
6665
+ const bPrice = (_b = normalizeProbability(b.price)) != null ? _b : 0;
6666
+ return bPrice - aPrice;
6667
+ });
6704
6668
  };
6705
-
6706
- // src/primitives/venue-logo/index.tsx
6707
- var import_jsx_runtime117 = require("react/jsx-runtime");
6708
- var VenueLogo = ({
6709
- venue,
6710
- variant = "icon",
6711
- isColor = true,
6712
- isMonochromatic = false,
6713
- color,
6714
- size = "medium",
6715
- className,
6716
- ariaLabel,
6717
- title: title2
6718
- }) => {
6669
+ var compareVisibleOutcomeRows = (left, right) => {
6719
6670
  var _a, _b;
6720
- const labels = (0, import_hooks26.useLabels)();
6721
- const sizeClass = sizeClasses2[size];
6722
- const resolvedLabel = resolveVenueLogoLabel({
6723
- ariaLabel,
6724
- labels,
6725
- venue,
6726
- venueFallbackLabels: venueLogoLabels
6727
- });
6728
- const isUnknownVenue = !(venue in venueLogoRegistry);
6729
- if (isUnknownVenue && process.env.NODE_ENV === "development") {
6730
- console.warn(`[AggUI] Unknown venue "${venue}" \u2014 using default logo`);
6671
+ const leftDate = toDate(resolveOutcomeTitle(left.outcome));
6672
+ const rightDate = toDate(resolveOutcomeTitle(right.outcome));
6673
+ if (leftDate && rightDate) {
6674
+ return leftDate.getTime() - rightDate.getTime();
6731
6675
  }
6732
- if (variant === "logo") {
6733
- return /* @__PURE__ */ (0, import_jsx_runtime117.jsx)(
6734
- RemoteImage,
6735
- {
6736
- src: (_a = venueLogoUrlRegistry[venue]) != null ? _a : DEFAULT_VENUE_LOGO_URL,
6737
- alt: resolvedLabel || DEFAULT_VENUE_LABEL,
6738
- title: title2,
6739
- className: cn("shrink-0 rounded-agg-lg object-cover", sizeClass, className)
6740
- }
6741
- );
6676
+ const leftProbability = (_a = normalizeProbability(left.outcome.price)) != null ? _a : -1;
6677
+ const rightProbability = (_b = normalizeProbability(right.outcome.price)) != null ? _b : -1;
6678
+ return rightProbability - leftProbability;
6679
+ };
6680
+ var shouldReplaceVisibleOutcome = (current, next) => {
6681
+ var _a, _b;
6682
+ const currentVolume = typeof current.market.volume === "number" ? current.market.volume : -1;
6683
+ const nextVolume = typeof next.market.volume === "number" ? next.market.volume : -1;
6684
+ if (currentVolume !== nextVolume) {
6685
+ return nextVolume > currentVolume;
6742
6686
  }
6743
- const Component2 = (_b = venueLogoRegistry[venue]) != null ? _b : DefaultVenueIcon;
6744
- const resolvedIsColor = resolveVenueLogoIsColor({
6745
- isColor,
6746
- isMonochromatic
6747
- });
6748
- return /* @__PURE__ */ (0, import_jsx_runtime117.jsx)(
6749
- Component2,
6750
- {
6751
- className: cn("group/agg-venue-logo", "shrink-0", sizeClass, className),
6752
- isColor: resolvedIsColor,
6753
- color,
6754
- "aria-label": resolvedLabel || DEFAULT_VENUE_LABEL,
6687
+ const currentProbability = (_a = normalizeProbability(current.outcome.price)) != null ? _a : -1;
6688
+ const nextProbability = (_b = normalizeProbability(next.outcome.price)) != null ? _b : -1;
6689
+ return nextProbability > currentProbability;
6690
+ };
6691
+ var resolveVisibleOutcomes = (venueMarkets) => {
6692
+ const visibleOutcomesByLabel = /* @__PURE__ */ new Map();
6693
+ venueMarkets.forEach((market) => {
6694
+ const title2 = market.question;
6695
+ const canonicalOutcome = sortOutcomes(market.venueMarketOutcomes)[0];
6696
+ if (!canonicalOutcome) return;
6697
+ const normalizedTitle = title2.trim().toLowerCase();
6698
+ const nextVisibleOutcome = {
6699
+ venue: market.venue,
6700
+ market,
6701
+ outcome: canonicalOutcome,
6755
6702
  title: title2
6703
+ };
6704
+ const currentVisibleOutcome = visibleOutcomesByLabel.get(normalizedTitle);
6705
+ if (!currentVisibleOutcome || shouldReplaceVisibleOutcome(currentVisibleOutcome, nextVisibleOutcome)) {
6706
+ visibleOutcomesByLabel.set(normalizedTitle, nextVisibleOutcome);
6756
6707
  }
6708
+ });
6709
+ return [...visibleOutcomesByLabel.values()].sort(compareVisibleOutcomeRows).slice(0, Math.max(1, 2));
6710
+ };
6711
+ var resolveOutcomeTitle = (outcome) => {
6712
+ var _a, _b;
6713
+ return (_b = (_a = outcome == null ? void 0 : outcome.title) != null ? _a : outcome == null ? void 0 : outcome.label) == null ? void 0 : _b.trim();
6714
+ };
6715
+ var selectPrimaryVenueMarket = (venueMarkets) => {
6716
+ if (venueMarkets.length === 0) return void 0;
6717
+ if (venueMarkets.length === 1) return venueMarkets[0];
6718
+ return [...venueMarkets].sort((a, b) => {
6719
+ const aVolume = typeof a.volume === "number" ? a.volume : -1;
6720
+ const bVolume = typeof b.volume === "number" ? b.volume : -1;
6721
+ return bVolume - aVolume;
6722
+ })[0];
6723
+ };
6724
+ var resolveTileImage = (event, primaryVenueMarket, imageOverride) => {
6725
+ if (typeof imageOverride === "string" && imageOverride.trim()) {
6726
+ return imageOverride;
6727
+ }
6728
+ if (typeof event.image === "string" && event.image.trim()) {
6729
+ return event.image;
6730
+ }
6731
+ if (typeof (primaryVenueMarket == null ? void 0 : primaryVenueMarket.image) === "string" && primaryVenueMarket.image.trim()) {
6732
+ return primaryVenueMarket.image;
6733
+ }
6734
+ return void 0;
6735
+ };
6736
+ var formatCountLabel = (count, singular, plural) => {
6737
+ return `${count} ${count === 1 ? singular : plural}`;
6738
+ };
6739
+ var getVenueSummary = (venueMarkets, options) => {
6740
+ const normalizedVenueMarkets = normalizeVenueMarketCluster(venueMarkets);
6741
+ const tradableVenues = options == null ? void 0 : options.tradableVenues;
6742
+ const isVenueTradable = (venue) => {
6743
+ if (tradableVenues == null) return true;
6744
+ return tradableVenues.has(venue);
6745
+ };
6746
+ const uniqueVenues = Array.from(
6747
+ new Set(
6748
+ normalizedVenueMarkets.filter((market) => isVenueTradable(market.venue)).map((market) => market.venue)
6749
+ )
6757
6750
  );
6751
+ return {
6752
+ marketCount: normalizedVenueMarkets.length,
6753
+ venueCount: uniqueVenues.length,
6754
+ singleVenue: uniqueVenues.length === 1 ? uniqueVenues[0] : void 0
6755
+ };
6756
+ };
6757
+ var resolveDisplayVolume = (eventVolume, venueMarkets) => {
6758
+ if (typeof eventVolume === "number" && eventVolume > 0) return eventVolume;
6759
+ const clusterMarkets = normalizeVenueMarketCluster(venueMarkets);
6760
+ const marketSum = clusterMarkets.reduce(
6761
+ (acc, m) => acc + (typeof m.volume === "number" ? m.volume : 0),
6762
+ 0
6763
+ );
6764
+ if (marketSum > 0) return marketSum;
6765
+ return void 0;
6758
6766
  };
6759
- VenueLogo.displayName = "VenueLogo";
6760
-
6761
- // src/primitives/search/search.constants.ts
6762
- var DEFAULT_SEARCH_LIMIT = 5;
6763
- var MIN_SEARCH_LENGTH = 3;
6764
- var SEARCH_DEBOUNCE_MS = 300;
6765
6767
 
6766
6768
  // src/primitives/search/search.utils.ts
6767
- var import_sdk11 = require("@agg-build/sdk");
6768
- var import_dayjs2 = __toESM(require("dayjs"));
6769
6769
  var formatSearchContextLabel = (value) => {
6770
6770
  if (!(0, import_dayjs2.default)(value).isValid()) return value;
6771
6771
  return (0, import_dayjs2.default)(value).format("MMMM D, YYYY");
@@ -7403,7 +7403,7 @@ var Header = ({
7403
7403
  "div",
7404
7404
  {
7405
7405
  className: cn(
7406
- "agg-header-inner mx-auto flex h-auto w-full max-w-[1360px] px-6 lg:px-10 items-center gap-2 md:gap-4 py-5",
7406
+ "agg-header-inner mx-auto flex h-auto w-full max-w-[1440px] px-6 lg:px-10 items-center gap-2 md:gap-4 py-5",
7407
7407
  classNames == null ? void 0 : classNames.inner
7408
7408
  ),
7409
7409
  children: [
@@ -8445,7 +8445,37 @@ StateMessage.displayName = "StateMessage";
8445
8445
 
8446
8446
  // src/primitives/tabs/index.tsx
8447
8447
  var import_hooks34 = require("@agg-build/hooks");
8448
+ var import_react14 = require("react");
8449
+
8450
+ // src/shared/use-horizontal-scroll-state.ts
8448
8451
  var import_react13 = require("react");
8452
+ var useHorizontalScrollState = () => {
8453
+ const containerRef = (0, import_react13.useRef)(null);
8454
+ const [canScrollLeft, setCanScrollLeft] = (0, import_react13.useState)(false);
8455
+ const [canScrollRight, setCanScrollRight] = (0, import_react13.useState)(false);
8456
+ const update = (0, import_react13.useCallback)(() => {
8457
+ const el = containerRef.current;
8458
+ if (!el) return;
8459
+ const maxScroll = el.scrollWidth - el.clientWidth;
8460
+ setCanScrollLeft(el.scrollLeft > 4);
8461
+ setCanScrollRight(maxScroll - el.scrollLeft > 4);
8462
+ }, []);
8463
+ (0, import_react13.useEffect)(() => {
8464
+ const el = containerRef.current;
8465
+ if (!el) return;
8466
+ el.addEventListener("scroll", update, { passive: true });
8467
+ return () => el.removeEventListener("scroll", update);
8468
+ }, [update]);
8469
+ (0, import_react13.useEffect)(() => {
8470
+ if (typeof ResizeObserver === "undefined") return;
8471
+ const el = containerRef.current;
8472
+ if (!el) return;
8473
+ const ro = new ResizeObserver(() => update());
8474
+ ro.observe(el);
8475
+ return () => ro.disconnect();
8476
+ }, [update]);
8477
+ return { containerRef, canScrollLeft, canScrollRight, update };
8478
+ };
8449
8479
 
8450
8480
  // src/primitives/tabs/tabs.constants.ts
8451
8481
  var MOBILE_TABS_MEDIA_QUERY = "(max-width: 736px)";
@@ -8519,8 +8549,8 @@ var Tabs = ({
8519
8549
  const {
8520
8550
  features: { enableAnimations }
8521
8551
  } = (0, import_hooks34.useSdkUiConfig)();
8522
- const buttonRefs = (0, import_react13.useRef)([]);
8523
- const dragStateRef = (0, import_react13.useRef)({
8552
+ const buttonRefs = (0, import_react14.useRef)([]);
8553
+ const dragStateRef = (0, import_react14.useRef)({
8524
8554
  isPointerDown: false,
8525
8555
  isDragging: false,
8526
8556
  pointerId: null,
@@ -8528,29 +8558,30 @@ var Tabs = ({
8528
8558
  startClientY: 0,
8529
8559
  startScrollLeft: 0
8530
8560
  });
8531
- const suppressClickRef = (0, import_react13.useRef)(false);
8561
+ const suppressClickRef = (0, import_react14.useRef)(false);
8532
8562
  const resolvedAriaLabel = ariaLabel != null ? ariaLabel : labels.common.tabsAria;
8533
- const [isMobileViewport, setIsMobileViewport] = (0, import_react13.useState)(false);
8534
- const [isDraggingTabs, setIsDraggingTabs] = (0, import_react13.useState)(false);
8535
- const [activeUnderlineStyle, setActiveUnderlineStyle] = (0, import_react13.useState)({
8563
+ const [isMobileViewport, setIsMobileViewport] = (0, import_react14.useState)(false);
8564
+ const [isDraggingTabs, setIsDraggingTabs] = (0, import_react14.useState)(false);
8565
+ const [activeUnderlineStyle, setActiveUnderlineStyle] = (0, import_react14.useState)({
8536
8566
  transform: "translateX(0px)",
8537
8567
  width: 0,
8538
8568
  opacity: 0
8539
8569
  });
8540
- const [scrollAffordanceState, setScrollAffordanceState] = (0, import_react13.useState)({
8541
- showStart: false,
8542
- showEnd: false
8543
- });
8544
- const tabListRef = (0, import_react13.useRef)(null);
8570
+ const {
8571
+ containerRef: tabListRef,
8572
+ canScrollLeft,
8573
+ canScrollRight,
8574
+ update: updateScrollState
8575
+ } = useHorizontalScrollState();
8545
8576
  const isBarVariant = variant === "bar";
8546
- const resolvedOverflowBehavior = (0, import_react13.useMemo)(() => {
8577
+ const resolvedOverflowBehavior = (0, import_react14.useMemo)(() => {
8547
8578
  if (overflowBehavior) return overflowBehavior;
8548
8579
  if (!isBarVariant) return "scroll";
8549
8580
  return isMobileViewport ? "select" : "scroll";
8550
8581
  }, [isBarVariant, isMobileViewport, overflowBehavior]);
8551
8582
  const shouldUseOverflowScroll = resolvedOverflowBehavior === "scroll";
8552
8583
  const shouldUseOverflowSelect = resolvedOverflowBehavior === "select";
8553
- (0, import_react13.useEffect)(() => {
8584
+ (0, import_react14.useEffect)(() => {
8554
8585
  if (typeof window === "undefined") return;
8555
8586
  const mediaQueryList = window.matchMedia(MOBILE_TABS_MEDIA_QUERY);
8556
8587
  const handleMediaQueryChange = (event) => {
@@ -8568,28 +8599,12 @@ var Tabs = ({
8568
8599
  mediaQueryList.removeListener(handleMediaQueryChange);
8569
8600
  };
8570
8601
  }, []);
8571
- const updateScrollAffordances = (0, import_react13.useCallback)(() => {
8572
- if (!shouldUseOverflowScroll) {
8573
- setScrollAffordanceState({
8574
- showStart: false,
8575
- showEnd: false
8576
- });
8577
- return;
8578
- }
8579
- const tabListElement = tabListRef.current;
8580
- if (!tabListElement) return;
8581
- const maxScrollLeft = tabListElement.scrollWidth - tabListElement.clientWidth;
8582
- setScrollAffordanceState({
8583
- showStart: tabListElement.scrollLeft > 4,
8584
- showEnd: maxScrollLeft - tabListElement.scrollLeft > 4
8585
- });
8586
- }, [shouldUseOverflowScroll]);
8587
- const renderedItems = (0, import_react13.useMemo)(() => {
8602
+ const renderedItems = (0, import_react14.useMemo)(() => {
8588
8603
  return items.map((item) => __spreadProps(__spreadValues({}, item), {
8589
8604
  disabled: item.disabled || item.isComingSoon
8590
8605
  }));
8591
8606
  }, [items]);
8592
- const selectItems = (0, import_react13.useMemo)(() => {
8607
+ const selectItems = (0, import_react14.useMemo)(() => {
8593
8608
  return renderedItems.map((item) => ({
8594
8609
  value: item.value,
8595
8610
  label: item.isComingSoon ? `${item.label} (soon)` : item.label,
@@ -8722,7 +8737,7 @@ var Tabs = ({
8722
8737
  event == null ? void 0 : event.stopPropagation();
8723
8738
  suppressClickRef.current = false;
8724
8739
  };
8725
- const updateActiveUnderline = (0, import_react13.useCallback)(() => {
8740
+ const updateActiveUnderline = (0, import_react14.useCallback)(() => {
8726
8741
  if (isBarVariant) {
8727
8742
  setActiveUnderlineStyle({
8728
8743
  transform: "translateX(0px)",
@@ -8745,42 +8760,39 @@ var Tabs = ({
8745
8760
  opacity: 1
8746
8761
  });
8747
8762
  }, [isBarVariant, renderedItems, value]);
8748
- (0, import_react13.useLayoutEffect)(() => {
8763
+ (0, import_react14.useLayoutEffect)(() => {
8749
8764
  updateActiveUnderline();
8750
8765
  }, [updateActiveUnderline]);
8751
- (0, import_react13.useEffect)(() => {
8766
+ (0, import_react14.useEffect)(() => {
8752
8767
  if (isBarVariant || !shouldUseOverflowScroll) return;
8753
8768
  const tabListElement = tabListRef.current;
8754
8769
  if (!tabListElement) return;
8755
8770
  const handleScroll = () => {
8756
8771
  updateActiveUnderline();
8757
- updateScrollAffordances();
8758
8772
  };
8759
8773
  tabListElement.addEventListener("scroll", handleScroll, { passive: true });
8760
- updateScrollAffordances();
8761
8774
  return () => {
8762
8775
  tabListElement.removeEventListener("scroll", handleScroll);
8763
8776
  };
8764
- }, [isBarVariant, shouldUseOverflowScroll, updateActiveUnderline, updateScrollAffordances]);
8765
- (0, import_react13.useEffect)(() => {
8777
+ }, [isBarVariant, shouldUseOverflowScroll, tabListRef, updateActiveUnderline]);
8778
+ (0, import_react14.useEffect)(() => {
8766
8779
  if (!shouldUseOverflowScroll) return;
8767
- updateScrollAffordances();
8768
- }, [renderedItems, shouldUseOverflowScroll, updateScrollAffordances, value]);
8769
- (0, import_react13.useEffect)(() => {
8770
- if (isBarVariant && !shouldUseOverflowScroll) return;
8780
+ updateScrollState();
8781
+ }, [renderedItems, shouldUseOverflowScroll, updateScrollState, value]);
8782
+ (0, import_react14.useEffect)(() => {
8783
+ if (isBarVariant || !shouldUseOverflowScroll) return;
8771
8784
  if (typeof ResizeObserver === "undefined") return;
8772
8785
  const tabListElement = tabListRef.current;
8773
8786
  if (!tabListElement) return;
8774
8787
  const resizeObserver = new ResizeObserver(() => {
8775
8788
  updateActiveUnderline();
8776
- updateScrollAffordances();
8777
8789
  });
8778
8790
  resizeObserver.observe(tabListElement);
8779
8791
  return () => {
8780
8792
  resizeObserver.disconnect();
8781
8793
  };
8782
- }, [isBarVariant, shouldUseOverflowScroll, updateActiveUnderline, updateScrollAffordances]);
8783
- (0, import_react13.useEffect)(() => {
8794
+ }, [isBarVariant, shouldUseOverflowScroll, tabListRef, updateActiveUnderline]);
8795
+ (0, import_react14.useEffect)(() => {
8784
8796
  if (!shouldUseOverflowScroll) return;
8785
8797
  const tabListElement = tabListRef.current;
8786
8798
  if (!tabListElement) return;
@@ -8927,7 +8939,7 @@ var Tabs = ({
8927
8939
  "agg-tab-scroll-start",
8928
8940
  "pointer-events-none absolute top-0 bottom-0 left-0 z-10 w-12 md:w-18 bg-linear-to-r from-agg-secondary via-agg-secondary to-transparent",
8929
8941
  getMotionClassName(enableAnimations, "transition-opacity duration-200"),
8930
- scrollAffordanceState.showStart ? "opacity-100" : "opacity-0"
8942
+ canScrollLeft ? "opacity-100" : "opacity-0"
8931
8943
  )
8932
8944
  }
8933
8945
  ),
@@ -8939,24 +8951,63 @@ var Tabs = ({
8939
8951
  "agg-tab-scroll-end",
8940
8952
  "pointer-events-none absolute top-0 right-0 bottom-0 z-10 w-12 md:w-18 bg-linear-to-l from-agg-secondary via-agg-secondary to-transparent",
8941
8953
  getMotionClassName(enableAnimations, "transition-opacity duration-200"),
8942
- scrollAffordanceState.showEnd ? "opacity-100" : "opacity-0"
8954
+ canScrollRight ? "opacity-100" : "opacity-0"
8943
8955
  )
8944
8956
  }
8945
8957
  )
8946
8958
  ] }) : null,
8947
- shouldUseOverflowScroll && isBarVariant ? /* @__PURE__ */ (0, import_jsx_runtime127.jsx)(
8948
- "span",
8949
- {
8950
- "aria-hidden": true,
8951
- className: cn(
8952
- "agg-tab-scroll-end",
8953
- "pointer-events-none absolute top-0 right-0 bottom-0 z-10 w-[120px] overflow-hidden rounded-r-[8px] bg-linear-to-l from-agg-secondary from-[20%] via-agg-secondary/85 to-transparent",
8954
- getMotionClassName(enableAnimations, "transition-opacity duration-200"),
8955
- scrollAffordanceState.showEnd ? "opacity-100" : "opacity-0"
8956
- ),
8957
- children: /* @__PURE__ */ (0, import_jsx_runtime127.jsx)("span", { className: "absolute inset-y-0 right-3 inline-flex items-center text-agg-foreground", children: /* @__PURE__ */ (0, import_jsx_runtime127.jsx)(Icon, { name: "chevron-right", size: "small", color: "currentColor" }) })
8958
- }
8959
- ) : null
8959
+ shouldUseOverflowScroll && isBarVariant ? /* @__PURE__ */ (0, import_jsx_runtime127.jsxs)(import_jsx_runtime127.Fragment, { children: [
8960
+ /* @__PURE__ */ (0, import_jsx_runtime127.jsx)(
8961
+ "button",
8962
+ {
8963
+ type: "button",
8964
+ "aria-label": labels.common.scrollTabsLeft,
8965
+ tabIndex: -1,
8966
+ className: cn(
8967
+ "agg-tab-scroll-start",
8968
+ "absolute top-0 bottom-0 left-0 z-10 w-20 rounded-l-agg-lg",
8969
+ "inline-flex items-center justify-start pl-2",
8970
+ "bg-linear-to-r from-agg-secondary from-[25%] via-agg-secondary/80 to-transparent",
8971
+ "cursor-pointer",
8972
+ getMotionClassName(enableAnimations, "transition-opacity duration-200"),
8973
+ canScrollLeft ? "opacity-100" : "opacity-0 pointer-events-none"
8974
+ ),
8975
+ onClick: () => {
8976
+ var _a;
8977
+ (_a = tabListRef.current) == null ? void 0 : _a.scrollBy({
8978
+ left: -200,
8979
+ behavior: getScrollBehavior(enableAnimations)
8980
+ });
8981
+ },
8982
+ children: /* @__PURE__ */ (0, import_jsx_runtime127.jsx)(Icon, { name: "chevron-left", size: "small", color: "currentColor" })
8983
+ }
8984
+ ),
8985
+ /* @__PURE__ */ (0, import_jsx_runtime127.jsx)(
8986
+ "button",
8987
+ {
8988
+ type: "button",
8989
+ "aria-label": labels.common.scrollTabsRight,
8990
+ tabIndex: -1,
8991
+ className: cn(
8992
+ "agg-tab-scroll-end",
8993
+ "absolute top-0 right-0 bottom-0 z-10 w-20 rounded-r-agg-lg",
8994
+ "inline-flex items-center justify-end pr-2",
8995
+ "bg-linear-to-l from-agg-secondary from-[25%] via-agg-secondary/80 to-transparent",
8996
+ "cursor-pointer",
8997
+ getMotionClassName(enableAnimations, "transition-opacity duration-200"),
8998
+ canScrollRight ? "opacity-100" : "opacity-0 pointer-events-none"
8999
+ ),
9000
+ onClick: () => {
9001
+ var _a;
9002
+ (_a = tabListRef.current) == null ? void 0 : _a.scrollBy({
9003
+ left: 200,
9004
+ behavior: getScrollBehavior(enableAnimations)
9005
+ });
9006
+ },
9007
+ children: /* @__PURE__ */ (0, import_jsx_runtime127.jsx)(Icon, { name: "chevron-right", size: "small", color: "currentColor" })
9008
+ }
9009
+ )
9010
+ ] }) : null
8960
9011
  ]
8961
9012
  }
8962
9013
  );
@@ -8965,7 +9016,7 @@ Tabs.displayName = "Tabs";
8965
9016
 
8966
9017
  // src/primitives/toast/index.tsx
8967
9018
  var RadixToast = __toESM(require("@radix-ui/react-toast"));
8968
- var import_react14 = require("react");
9019
+ var import_react15 = require("react");
8969
9020
  var import_jsx_runtime128 = require("react/jsx-runtime");
8970
9021
  var DEFAULT_DURATION_MS = 5e3;
8971
9022
  var EXIT_ANIMATION_MS = 350;
@@ -8981,7 +9032,7 @@ var TONE_ICON_NAME = {
8981
9032
  warning: "warning-filled",
8982
9033
  error: "error-filled"
8983
9034
  };
8984
- var ToastContext = (0, import_react14.createContext)(null);
9035
+ var ToastContext = (0, import_react15.createContext)(null);
8985
9036
  function ToastProvider({
8986
9037
  children,
8987
9038
  defaultDurationMs = DEFAULT_DURATION_MS,
@@ -8989,12 +9040,12 @@ function ToastProvider({
8989
9040
  swipeThreshold = 50,
8990
9041
  viewportClassName
8991
9042
  }) {
8992
- const [toasts, setToasts] = (0, import_react14.useState)([]);
8993
- const idRef = (0, import_react14.useRef)(0);
8994
- const dismiss = (0, import_react14.useCallback)((id) => {
9043
+ const [toasts, setToasts] = (0, import_react15.useState)([]);
9044
+ const idRef = (0, import_react15.useRef)(0);
9045
+ const dismiss = (0, import_react15.useCallback)((id) => {
8995
9046
  setToasts((current) => current.filter((entry) => entry.id !== id));
8996
9047
  }, []);
8997
- const toast = (0, import_react14.useCallback)(
9048
+ const toast = (0, import_react15.useCallback)(
8998
9049
  (message, options) => {
8999
9050
  const id = ++idRef.current;
9000
9051
  setToasts((current) => {
@@ -9039,31 +9090,31 @@ function ToastProvider({
9039
9090
  ] }) });
9040
9091
  }
9041
9092
  function ToastRow({ entry, onOpenChange }) {
9042
- const [isOpen, setIsOpen] = (0, import_react14.useState)(true);
9093
+ const [isOpen, setIsOpen] = (0, import_react15.useState)(true);
9043
9094
  const hasAutoDismiss = entry.durationMs > 0 && Number.isFinite(entry.durationMs);
9044
9095
  const duration = hasAutoDismiss ? entry.durationMs : Number.POSITIVE_INFINITY;
9045
- const timeoutRef = (0, import_react14.useRef)(null);
9046
- const closeTimeoutRef = (0, import_react14.useRef)(null);
9047
- const remainingMsRef = (0, import_react14.useRef)(duration);
9048
- const timerStartedAtRef = (0, import_react14.useRef)(null);
9049
- const onOpenChangeRef = (0, import_react14.useRef)(onOpenChange);
9096
+ const timeoutRef = (0, import_react15.useRef)(null);
9097
+ const closeTimeoutRef = (0, import_react15.useRef)(null);
9098
+ const remainingMsRef = (0, import_react15.useRef)(duration);
9099
+ const timerStartedAtRef = (0, import_react15.useRef)(null);
9100
+ const onOpenChangeRef = (0, import_react15.useRef)(onOpenChange);
9050
9101
  const rootStyle = {
9051
9102
  "--agg-toast-duration": `${duration}ms`
9052
9103
  };
9053
- (0, import_react14.useEffect)(() => {
9104
+ (0, import_react15.useEffect)(() => {
9054
9105
  onOpenChangeRef.current = onOpenChange;
9055
9106
  }, [onOpenChange]);
9056
- const clearDismissTimer = (0, import_react14.useCallback)(() => {
9107
+ const clearDismissTimer = (0, import_react15.useCallback)(() => {
9057
9108
  if (!timeoutRef.current) return;
9058
9109
  clearTimeout(timeoutRef.current);
9059
9110
  timeoutRef.current = null;
9060
9111
  }, []);
9061
- const clearCloseTimer = (0, import_react14.useCallback)(() => {
9112
+ const clearCloseTimer = (0, import_react15.useCallback)(() => {
9062
9113
  if (!closeTimeoutRef.current) return;
9063
9114
  clearTimeout(closeTimeoutRef.current);
9064
9115
  closeTimeoutRef.current = null;
9065
9116
  }, []);
9066
- const handleOpenChange = (0, import_react14.useCallback)(
9117
+ const handleOpenChange = (0, import_react15.useCallback)(
9067
9118
  (open) => {
9068
9119
  if (open) {
9069
9120
  clearCloseTimer();
@@ -9080,7 +9131,7 @@ function ToastRow({ entry, onOpenChange }) {
9080
9131
  },
9081
9132
  [clearCloseTimer, clearDismissTimer]
9082
9133
  );
9083
- const startDismissTimer = (0, import_react14.useCallback)(() => {
9134
+ const startDismissTimer = (0, import_react15.useCallback)(() => {
9084
9135
  if (!hasAutoDismiss) return;
9085
9136
  clearDismissTimer();
9086
9137
  timerStartedAtRef.current = Date.now();
@@ -9088,18 +9139,18 @@ function ToastRow({ entry, onOpenChange }) {
9088
9139
  handleOpenChange(false);
9089
9140
  }, remainingMsRef.current);
9090
9141
  }, [clearDismissTimer, handleOpenChange, hasAutoDismiss]);
9091
- const handlePauseDismissTimer = (0, import_react14.useCallback)(() => {
9142
+ const handlePauseDismissTimer = (0, import_react15.useCallback)(() => {
9092
9143
  if (!hasAutoDismiss || timerStartedAtRef.current === null) return;
9093
9144
  const elapsedMs = Date.now() - timerStartedAtRef.current;
9094
9145
  remainingMsRef.current = Math.max(0, remainingMsRef.current - elapsedMs);
9095
9146
  timerStartedAtRef.current = null;
9096
9147
  clearDismissTimer();
9097
9148
  }, [clearDismissTimer, hasAutoDismiss]);
9098
- const handleResumeDismissTimer = (0, import_react14.useCallback)(() => {
9149
+ const handleResumeDismissTimer = (0, import_react15.useCallback)(() => {
9099
9150
  if (!hasAutoDismiss || timerStartedAtRef.current !== null) return;
9100
9151
  startDismissTimer();
9101
9152
  }, [hasAutoDismiss, startDismissTimer]);
9102
- (0, import_react14.useEffect)(() => {
9153
+ (0, import_react15.useEffect)(() => {
9103
9154
  remainingMsRef.current = duration;
9104
9155
  startDismissTimer();
9105
9156
  return () => {
@@ -9171,20 +9222,20 @@ function ToastRow({ entry, onOpenChange }) {
9171
9222
  );
9172
9223
  }
9173
9224
  function useToast() {
9174
- const ctx = (0, import_react14.useContext)(ToastContext);
9225
+ const ctx = (0, import_react15.useContext)(ToastContext);
9175
9226
  if (!ctx) {
9176
9227
  throw new Error("useToast must be used within a <ToastProvider>");
9177
9228
  }
9178
9229
  return ctx;
9179
9230
  }
9180
9231
  function useOptionalToast() {
9181
- return (0, import_react14.useContext)(ToastContext);
9232
+ return (0, import_react15.useContext)(ToastContext);
9182
9233
  }
9183
9234
 
9184
9235
  // src/primitives/tooltip/index.tsx
9185
9236
  var import_hooks35 = require("@agg-build/hooks");
9186
9237
  var TooltipPrimitive = __toESM(require("@radix-ui/react-tooltip"));
9187
- var import_react15 = require("react");
9238
+ var import_react16 = require("react");
9188
9239
 
9189
9240
  // src/primitives/tooltip/tooltip.constants.ts
9190
9241
  var tooltipSizeClasses = {
@@ -9232,7 +9283,7 @@ var Tooltip = ({
9232
9283
  general: { rootClassName },
9233
9284
  features: { enableAnimations }
9234
9285
  } = (0, import_hooks35.useSdkUiConfig)();
9235
- const trigger = (0, import_react15.useMemo)(() => {
9286
+ const trigger = (0, import_react16.useMemo)(() => {
9236
9287
  if (children) return children;
9237
9288
  return /* @__PURE__ */ (0, import_jsx_runtime129.jsx)(
9238
9289
  "button",