@agg-build/ui 1.3.0 → 2.0.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.
@@ -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",
@@ -6641,131 +6363,409 @@ var venueLogoUrlRegistry = {
6641
6363
  [import_sdk10.Venue.myriad]: `${VENUE_LOGO_BASE_URL}/myriad.png`,
6642
6364
  [import_sdk10.Venue.hyperliquid]: `${VENUE_LOGO_BASE_URL}/hyperliquid.png`
6643
6365
  };
6644
- var venueLogoLabels = {
6645
- [import_sdk10.Venue.kalshi]: "Kalshi",
6646
- [import_sdk10.Venue.limitless]: "Limitless",
6647
- [import_sdk10.Venue.opinion]: "Opinion",
6648
- [import_sdk10.Venue.polymarket]: "Polymarket",
6649
- [import_sdk10.Venue.predict]: "Predict",
6650
- [import_sdk10.Venue.probable]: "Probable",
6651
- [import_sdk10.Venue.myriad]: "Myriad",
6652
- [import_sdk10.Venue.hyperliquid]: "Hyperliquid"
6366
+ var venueLogoLabels = {
6367
+ [import_sdk10.Venue.kalshi]: "Kalshi",
6368
+ [import_sdk10.Venue.limitless]: "Limitless",
6369
+ [import_sdk10.Venue.opinion]: "Opinion",
6370
+ [import_sdk10.Venue.polymarket]: "Polymarket",
6371
+ [import_sdk10.Venue.predict]: "Predict",
6372
+ [import_sdk10.Venue.probable]: "Probable",
6373
+ [import_sdk10.Venue.myriad]: "Myriad",
6374
+ [import_sdk10.Venue.hyperliquid]: "Hyperliquid"
6375
+ };
6376
+ var DEFAULT_VENUE_LABEL = "Market";
6377
+ var DEFAULT_VENUE_LOGO_URL = `${VENUE_LOGO_BASE_URL}/default.png`;
6378
+ var venueLogoNames = Object.keys(venueLogoRegistry);
6379
+ var sizeClasses2 = {
6380
+ small: "h-4 w-4",
6381
+ medium: "h-6 w-6",
6382
+ large: "h-8 w-8"
6383
+ };
6384
+ var lineColorByVenue = {
6385
+ light: {
6386
+ [import_sdk10.Venue.kalshi]: "#00D295",
6387
+ [import_sdk10.Venue.limitless]: "#000000",
6388
+ [import_sdk10.Venue.opinion]: "#000000",
6389
+ [import_sdk10.Venue.polymarket]: "#2E5CFF",
6390
+ [import_sdk10.Venue.predict]: "#6D57F8",
6391
+ [import_sdk10.Venue.probable]: "#F05923",
6392
+ [import_sdk10.Venue.myriad]: "#000000",
6393
+ [import_sdk10.Venue.hyperliquid]: "#97FCE4"
6394
+ },
6395
+ dark: {
6396
+ [import_sdk10.Venue.kalshi]: "#00D295",
6397
+ [import_sdk10.Venue.limitless]: "#FFFFFF",
6398
+ [import_sdk10.Venue.opinion]: "#FFFFFF",
6399
+ [import_sdk10.Venue.polymarket]: "#2E5CFF",
6400
+ [import_sdk10.Venue.predict]: "#6D57F8",
6401
+ [import_sdk10.Venue.probable]: "#F05923",
6402
+ [import_sdk10.Venue.myriad]: "#FFFFFF",
6403
+ [import_sdk10.Venue.hyperliquid]: "#97FCE4"
6404
+ }
6405
+ };
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;
6653
6620
  };
6654
- var DEFAULT_VENUE_LABEL = "Market";
6655
- var DEFAULT_VENUE_LOGO_URL = `${VENUE_LOGO_BASE_URL}/default.png`;
6656
- var venueLogoNames = Object.keys(venueLogoRegistry);
6657
- var sizeClasses2 = {
6658
- small: "h-4 w-4",
6659
- medium: "h-6 w-6",
6660
- large: "h-8 w-8"
6621
+ var formatWholePercent = (value) => {
6622
+ return `${Math.round(value * 100)}%`;
6661
6623
  };
6662
- var lineColorByVenue = {
6663
- light: {
6664
- [import_sdk10.Venue.kalshi]: "#00D295",
6665
- [import_sdk10.Venue.limitless]: "#000000",
6666
- [import_sdk10.Venue.opinion]: "#000000",
6667
- [import_sdk10.Venue.polymarket]: "#2E5CFF",
6668
- [import_sdk10.Venue.predict]: "#6D57F8",
6669
- [import_sdk10.Venue.probable]: "#F05923",
6670
- [import_sdk10.Venue.myriad]: "#000000",
6671
- [import_sdk10.Venue.hyperliquid]: "#97FCE4"
6672
- },
6673
- dark: {
6674
- [import_sdk10.Venue.kalshi]: "#00D295",
6675
- [import_sdk10.Venue.limitless]: "#FFFFFF",
6676
- [import_sdk10.Venue.opinion]: "#FFFFFF",
6677
- [import_sdk10.Venue.polymarket]: "#2E5CFF",
6678
- [import_sdk10.Venue.predict]: "#6D57F8",
6679
- [import_sdk10.Venue.probable]: "#F05923",
6680
- [import_sdk10.Venue.myriad]: "#FFFFFF",
6681
- [import_sdk10.Venue.hyperliquid]: "#97FCE4"
6682
- }
6624
+ var hasDateLabel = (outcome) => {
6625
+ return !!toDate(outcome.label);
6683
6626
  };
6684
- var resolveVenueLineColor = (venue, isDarkTheme) => {
6685
- return lineColorByVenue[isDarkTheme ? "dark" : "light"][venue];
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));
6686
6631
  };
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];
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
+ });
6698
6638
  };
6699
- var resolveVenueLogoIsColor = ({
6700
- isColor,
6701
- isMonochromatic
6702
- }) => {
6703
- return isMonochromatic ? false : isColor;
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;
6704
6647
  };
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
- }) => {
6719
- 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`);
6648
+ var sortOutcomes = (outcomes) => {
6649
+ if (outcomes.length <= 1) return outcomes;
6650
+ if (hasBinaryOutcomes(outcomes)) {
6651
+ return sortYesFirst(outcomes);
6731
6652
  }
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
- );
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
+ });
6742
6661
  }
6743
- const Component2 = (_b = venueLogoRegistry[venue]) != null ? _b : DefaultVenueIcon;
6744
- const resolvedIsColor = resolveVenueLogoIsColor({
6745
- isColor,
6746
- isMonochromatic
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;
6747
6667
  });
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,
6668
+ };
6669
+ var compareVisibleOutcomeRows = (left, right) => {
6670
+ var _a, _b;
6671
+ const leftDate = toDate(resolveOutcomeTitle(left.outcome));
6672
+ const rightDate = toDate(resolveOutcomeTitle(right.outcome));
6673
+ if (leftDate && rightDate) {
6674
+ return leftDate.getTime() - rightDate.getTime();
6675
+ }
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;
6686
+ }
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");