@agg-build/ui 2.1.2 → 2.1.4

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 (65) hide show
  1. package/dist/{chunk-ZOECARZW.mjs → chunk-BW7S2YR3.mjs} +798 -312
  2. package/dist/{chunk-7ZR5JYB3.mjs → chunk-FLESSOSU.mjs} +2077 -533
  3. package/dist/{chunk-5RBHMMY3.mjs → chunk-R2YNZJZ3.mjs} +69 -27
  4. package/dist/{chunk-75AMJAWR.mjs → chunk-T4YZGAYS.mjs} +22 -1
  5. package/dist/{chunk-JJDYOBVG.mjs → chunk-TBZWRUFB.mjs} +654 -560
  6. package/dist/{chunk-TBD3N4T4.mjs → chunk-VP76G6PN.mjs} +41 -41
  7. package/dist/{chunk-NRNBJPYK.mjs → chunk-XHE2VO3S.mjs} +4 -21
  8. package/dist/events.js +776 -638
  9. package/dist/events.mjs +5 -3
  10. package/dist/index.js +5665 -3867
  11. package/dist/index.mjs +112 -455
  12. package/dist/modals.mjs +3 -3
  13. package/dist/pages.js +8330 -6452
  14. package/dist/pages.mjs +6 -6
  15. package/dist/primitives.js +40 -41
  16. package/dist/primitives.mjs +1 -1
  17. package/dist/styles.css +1 -1
  18. package/dist/tailwind.css +1 -1
  19. package/dist/trading.js +652 -415
  20. package/dist/trading.mjs +4 -4
  21. package/dist/types/events/item/event-list-item.utils.d.mts +1 -25
  22. package/dist/types/events/item/event-list-item.utils.d.ts +1 -25
  23. package/dist/types/events/item-details/index.d.mts +2 -1
  24. package/dist/types/events/item-details/index.d.ts +2 -1
  25. package/dist/types/events/market-details/market-details-graph-panel.d.mts +39 -0
  26. package/dist/types/events/market-details/market-details-graph-panel.d.ts +39 -0
  27. package/dist/types/events/market-details/market-details-outcome-button.d.mts +2 -1
  28. package/dist/types/events/market-details/market-details-outcome-button.d.ts +2 -1
  29. package/dist/types/events/market-details/market-details.types.d.mts +31 -0
  30. package/dist/types/events/market-details/market-details.types.d.ts +31 -0
  31. package/dist/types/events/market-details/market-details.utils.d.mts +3 -16
  32. package/dist/types/events/market-details/market-details.utils.d.ts +3 -16
  33. package/dist/types/events/shared/format-event-title.d.mts +1 -2
  34. package/dist/types/events/shared/format-event-title.d.ts +1 -2
  35. package/dist/types/events/shared/format-sports-event-time.d.mts +2 -0
  36. package/dist/types/events/shared/format-sports-event-time.d.ts +2 -0
  37. package/dist/types/notifications/agg-notification-events-provider.d.mts +10 -1
  38. package/dist/types/notifications/agg-notification-events-provider.d.ts +10 -1
  39. package/dist/types/pages/event-market/event-market.shared.d.mts +30 -0
  40. package/dist/types/pages/event-market/event-market.shared.d.ts +30 -0
  41. package/dist/types/pages/event-market/sports-event-market-page.d.mts +8 -0
  42. package/dist/types/pages/event-market/sports-event-market-page.d.ts +8 -0
  43. package/dist/types/pages/event-market/sports-event-market.fixtures.d.mts +13 -0
  44. package/dist/types/pages/event-market/sports-event-market.fixtures.d.ts +13 -0
  45. package/dist/types/pages/event-market/sports-event-market.utils.d.mts +156 -0
  46. package/dist/types/pages/event-market/sports-event-market.utils.d.ts +156 -0
  47. package/dist/types/pages/event-market/sports-line-rail.d.mts +17 -0
  48. package/dist/types/pages/event-market/sports-line-rail.d.ts +17 -0
  49. package/dist/types/pages/event-market/sports-market-card.d.mts +22 -0
  50. package/dist/types/pages/event-market/sports-market-card.d.ts +22 -0
  51. package/dist/types/pages/event-market/sports-markets.d.mts +13 -0
  52. package/dist/types/pages/event-market/sports-markets.d.ts +13 -0
  53. package/dist/types/primitives/search/search.utils.d.mts +1 -3
  54. package/dist/types/primitives/search/search.utils.d.ts +1 -3
  55. package/dist/types/primitives/state-message/index.d.mts +1 -1
  56. package/dist/types/primitives/state-message/index.d.ts +1 -1
  57. package/dist/types/primitives/state-message/state-message.types.d.mts +1 -1
  58. package/dist/types/primitives/state-message/state-message.types.d.ts +1 -1
  59. package/dist/types/trading/place-order/index.d.mts +1 -1
  60. package/dist/types/trading/place-order/index.d.ts +1 -1
  61. package/dist/types/trading/place-order/index.place-order.types.d.mts +7 -0
  62. package/dist/types/trading/place-order/index.place-order.types.d.ts +7 -0
  63. package/dist/types/trading/settlement/settlement-text.utils.d.mts +5 -2
  64. package/dist/types/trading/settlement/settlement-text.utils.d.ts +5 -2
  65. package/package.json +3 -3
@@ -0,0 +1,156 @@
1
+ import type { VenueEventWithMarkets, VenueMarket } from "@agg-build/hooks";
2
+ export declare const SPORTS_SECTION_TAB_KEYS: readonly ["game_lines", "halves", "exact_score", "corners", "goals", "assists", "shots", "other"];
3
+ export type SportsSectionTabKey = (typeof SPORTS_SECTION_TAB_KEYS)[number];
4
+ export declare const SPORTS_MARKET_TYPE_KEYS: readonly ["moneyline", "spread", "total", "prop", "completion", "other"];
5
+ export type SportsMarketTypeKey = (typeof SPORTS_MARKET_TYPE_KEYS)[number];
6
+ export declare const SPORTS_PERIOD_KEYS: readonly ["full", "1h", "2h", "q1", "q2", "q3", "q4", "ot", "first_inning", "second_inning", "third_inning", "first_5_innings", "other"];
7
+ export type SportsPeriodKey = (typeof SPORTS_PERIOD_KEYS)[number];
8
+ export declare const SPORTS_MARKET_CATEGORY_KEYS: readonly ["game_lines", "exact_score", "corners", "goals", "assists", "shots", "other"];
9
+ export type SportsMarketCategoryKey = (typeof SPORTS_MARKET_CATEGORY_KEYS)[number];
10
+ export declare const SPORTS_MARKET_GROUP_KEYS: readonly ["game_lines", "spreads", "totals", "period_lines", "exact_score", "team_props", "player_props", "specials", "completion", "other"];
11
+ export type SportsMarketGroupKey = (typeof SPORTS_MARKET_GROUP_KEYS)[number];
12
+ export type SportsSectionTabDefinition = {
13
+ key: SportsSectionTabKey;
14
+ /** Preferred section filter — supersedes `marketCategory`. */
15
+ marketGroup?: readonly SportsMarketGroupKey[];
16
+ /** Legacy compatibility filter (soccer prop tabs without a marketGroup). */
17
+ marketCategory?: SportsMarketCategoryKey;
18
+ sportsMarketType?: readonly SportsMarketTypeKey[];
19
+ period?: readonly SportsPeriodKey[];
20
+ };
21
+ export declare const SPORTS_SECTION_TAB_DEFINITIONS: readonly [{
22
+ readonly key: "game_lines";
23
+ readonly marketGroup: readonly ["game_lines", "spreads", "totals"];
24
+ }, {
25
+ readonly key: "exact_score";
26
+ readonly marketGroup: readonly ["exact_score"];
27
+ }, {
28
+ readonly key: "halves";
29
+ readonly marketGroup: readonly ["period_lines"];
30
+ readonly period: readonly ["1h", "2h"];
31
+ }, {
32
+ readonly key: "corners";
33
+ readonly marketCategory: "corners";
34
+ }, {
35
+ readonly key: "goals";
36
+ readonly marketCategory: "goals";
37
+ }, {
38
+ readonly key: "assists";
39
+ readonly marketCategory: "assists";
40
+ }, {
41
+ readonly key: "shots";
42
+ readonly marketCategory: "shots";
43
+ }, {
44
+ readonly key: "other";
45
+ readonly marketGroup: readonly ["other", "team_props", "player_props", "specials", "completion"];
46
+ }];
47
+ export type SportsMarketCardVariant = "outcome" | "line" | "yes_no";
48
+ export type SportsMarketDisplayGroup = {
49
+ id: string;
50
+ title: string;
51
+ questionKey: string;
52
+ sportsMarketType: SportsMarketTypeKey | null;
53
+ marketCategory: SportsMarketCategoryKey | null;
54
+ period: SportsPeriodKey;
55
+ sectionRank: number;
56
+ markets: VenueMarket[];
57
+ hasLineVariants: boolean;
58
+ };
59
+ export type SportsPeriodGroup = {
60
+ key: SportsPeriodKey;
61
+ markets: VenueMarket[];
62
+ groups: SportsMarketDisplayGroup[];
63
+ };
64
+ export declare const resolveSportsSectionDefinition: (key: SportsSectionTabKey) => SportsSectionTabDefinition;
65
+ export declare const normalizeSportsPeriod: (value: string | null | undefined) => SportsPeriodKey;
66
+ export declare const normalizeSportsMarketType: (value: string | null | undefined) => SportsMarketTypeKey | null;
67
+ export declare const normalizeSportsMarketCategory: (value: string | null | undefined) => SportsMarketCategoryKey | null;
68
+ export declare const normalizeSportsMarketGroup: (value: string | null | undefined) => SportsMarketGroupKey | null;
69
+ /**
70
+ * Map a market to the sports section tab it belongs to — marketGroup-first, with
71
+ * marketCategory as the documented compatibility fallback (see the
72
+ * sports-market-detail recipe). Returns null when a market carries no
73
+ * recognizable grouping metadata, so the page can fall back to the default,
74
+ * ungrouped market list instead of inventing an empty tab.
75
+ */
76
+ export declare const resolveMarketSectionTabKey: (market: Pick<VenueMarket, "marketGroup" | "marketCategory">) => SportsSectionTabKey | null;
77
+ export declare const resolveSportsSectionFilters: (key: SportsSectionTabKey) => {
78
+ marketGroup?: SportsMarketGroupKey[];
79
+ marketCategory?: SportsMarketCategoryKey[];
80
+ sportsMarketType?: SportsMarketTypeKey[];
81
+ period?: SportsPeriodKey[];
82
+ };
83
+ /**
84
+ * Resolve the markets a sports section tab should display and group.
85
+ *
86
+ * Section markets are fetched by `aggKey`, which intentionally spans every
87
+ * sibling venue-event for the same real-world game (so cross-venue line ladders
88
+ * and prop categories aggregate together). For the Game Lines MONEYLINE
89
+ * (match-result) group, that aggregation is wrong: it can surface duplicate
90
+ * draws sourced from sibling events, props mis-classified as `moneyline`, and —
91
+ * because a sibling's market often wins the cross-venue collapse — it can omit
92
+ * THIS event's own outcome markets entirely (e.g. show two "Draw"s and drop the
93
+ * "Australia" win).
94
+ *
95
+ * The event's own curated `venueMarkets` are the authoritative N-way result for
96
+ * this event (the same source the non-sports event page renders correctly). So
97
+ * on the Game Lines tab we take the moneyline markets from the event and keep
98
+ * only the line markets (spread/total) from the aggKey fetch. Every other tab —
99
+ * and the spread/total ladders within Game Lines — use the fetched markets
100
+ * unchanged.
101
+ */
102
+ export declare const resolveSportsSectionMarkets: ({ tabKey, eventMarkets, sectionMarkets, }: {
103
+ tabKey: SportsSectionTabKey;
104
+ eventMarkets: VenueMarket[];
105
+ sectionMarkets: VenueMarket[];
106
+ }) => VenueMarket[];
107
+ export declare const resolveSportsMarketCardVariant: (market: VenueMarket) => SportsMarketCardVariant;
108
+ export declare const isBinarySportsMoneylineMarket: (market: VenueMarket) => boolean;
109
+ export declare const buildSportsMarketDisplayGroups: (markets: VenueMarket[]) => SportsMarketDisplayGroup[];
110
+ export declare const groupSportsMarketsByPeriod: (markets: VenueMarket[]) => SportsPeriodGroup[];
111
+ export type SportsGameLineSlideKind = "moneyline" | "spread" | "total" | "other";
112
+ export type SportsGameLineSlideStop = {
113
+ /** Display value for the ladder chip, e.g. "1.5", "216.5". */
114
+ value: string;
115
+ /** Venue ids offering this line (cast to VenueLogoName at the render site). */
116
+ venues: string[];
117
+ market: VenueMarket;
118
+ };
119
+ export type SportsGameLineSlide = {
120
+ id: string;
121
+ kind: SportsGameLineSlideKind;
122
+ group: SportsMarketDisplayGroup;
123
+ /** False for moneyline / single-market groups → no line ladder. */
124
+ hasLadder: boolean;
125
+ stops: SportsGameLineSlideStop[];
126
+ /** Marquee line on first render — the highest-volume line in the group. */
127
+ defaultStopIndex: number;
128
+ };
129
+ export declare const resolveSelectedSportsLineValue: (lineValue: number | null | undefined) => string;
130
+ export declare const collectVenueNames: (market: VenueMarket) => string[];
131
+ export declare const resolveTotalGroupVolume: (markets: VenueMarket[]) => number;
132
+ export declare const resolveSportsExpandedMarkets: (markets: VenueMarket[]) => VenueMarket[];
133
+ export declare const resolveSportsExpandedMarketsVolume: (markets: VenueMarket[]) => number;
134
+ export declare const buildSportsSlideFromGroup: (group: SportsMarketDisplayGroup) => SportsGameLineSlide;
135
+ /**
136
+ * Derive the Moneyline / Spreads / Total game-line slides (in that order) from a
137
+ * flat list of venue markets. Reuses {@link buildSportsMarketDisplayGroups} so
138
+ * line variants collapse into one slide with the per-line ladder.
139
+ */
140
+ export declare const buildSportsGameLineSlides: (markets: VenueMarket[], period?: SportsPeriodKey) => SportsGameLineSlide[];
141
+ export type SportsTeam = {
142
+ name: string;
143
+ abbr: string;
144
+ };
145
+ export type SportsTeams = {
146
+ away: SportsTeam;
147
+ home: SportsTeam;
148
+ };
149
+ export declare const resolveSportsTeams: (event: Pick<VenueEventWithMarkets, "title">, moneylineMarket?: VenueMarket | null) => SportsTeams | null;
150
+ export declare const resolveSportsLeagueLabel: (event: Pick<VenueEventWithMarkets, "categories" | "aggKey">) => string | null;
151
+ export declare const isNonStandardSportsLikeEvent: (event: Pick<VenueEventWithMarkets, "categories" | "title" | "venueMarkets">) => boolean;
152
+ export declare const resolveVisibleSportsSectionTabDefinitions: (event: Pick<VenueEventWithMarkets, "categories" | "title" | "venueMarkets">) => SportsSectionTabDefinition[];
153
+ export declare const mergeSportsSectionMarketsIntoEvent: ({ event, sectionMarketsByKey, }: {
154
+ event: import("@agg-build/hooks").VenueEventWithMarkets;
155
+ sectionMarketsByKey: Partial<Record<SportsSectionTabKey, VenueMarket[]>>;
156
+ }) => import("@agg-build/hooks").VenueEventWithMarkets;
@@ -0,0 +1,156 @@
1
+ import type { VenueEventWithMarkets, VenueMarket } from "@agg-build/hooks";
2
+ export declare const SPORTS_SECTION_TAB_KEYS: readonly ["game_lines", "halves", "exact_score", "corners", "goals", "assists", "shots", "other"];
3
+ export type SportsSectionTabKey = (typeof SPORTS_SECTION_TAB_KEYS)[number];
4
+ export declare const SPORTS_MARKET_TYPE_KEYS: readonly ["moneyline", "spread", "total", "prop", "completion", "other"];
5
+ export type SportsMarketTypeKey = (typeof SPORTS_MARKET_TYPE_KEYS)[number];
6
+ export declare const SPORTS_PERIOD_KEYS: readonly ["full", "1h", "2h", "q1", "q2", "q3", "q4", "ot", "first_inning", "second_inning", "third_inning", "first_5_innings", "other"];
7
+ export type SportsPeriodKey = (typeof SPORTS_PERIOD_KEYS)[number];
8
+ export declare const SPORTS_MARKET_CATEGORY_KEYS: readonly ["game_lines", "exact_score", "corners", "goals", "assists", "shots", "other"];
9
+ export type SportsMarketCategoryKey = (typeof SPORTS_MARKET_CATEGORY_KEYS)[number];
10
+ export declare const SPORTS_MARKET_GROUP_KEYS: readonly ["game_lines", "spreads", "totals", "period_lines", "exact_score", "team_props", "player_props", "specials", "completion", "other"];
11
+ export type SportsMarketGroupKey = (typeof SPORTS_MARKET_GROUP_KEYS)[number];
12
+ export type SportsSectionTabDefinition = {
13
+ key: SportsSectionTabKey;
14
+ /** Preferred section filter — supersedes `marketCategory`. */
15
+ marketGroup?: readonly SportsMarketGroupKey[];
16
+ /** Legacy compatibility filter (soccer prop tabs without a marketGroup). */
17
+ marketCategory?: SportsMarketCategoryKey;
18
+ sportsMarketType?: readonly SportsMarketTypeKey[];
19
+ period?: readonly SportsPeriodKey[];
20
+ };
21
+ export declare const SPORTS_SECTION_TAB_DEFINITIONS: readonly [{
22
+ readonly key: "game_lines";
23
+ readonly marketGroup: readonly ["game_lines", "spreads", "totals"];
24
+ }, {
25
+ readonly key: "exact_score";
26
+ readonly marketGroup: readonly ["exact_score"];
27
+ }, {
28
+ readonly key: "halves";
29
+ readonly marketGroup: readonly ["period_lines"];
30
+ readonly period: readonly ["1h", "2h"];
31
+ }, {
32
+ readonly key: "corners";
33
+ readonly marketCategory: "corners";
34
+ }, {
35
+ readonly key: "goals";
36
+ readonly marketCategory: "goals";
37
+ }, {
38
+ readonly key: "assists";
39
+ readonly marketCategory: "assists";
40
+ }, {
41
+ readonly key: "shots";
42
+ readonly marketCategory: "shots";
43
+ }, {
44
+ readonly key: "other";
45
+ readonly marketGroup: readonly ["other", "team_props", "player_props", "specials", "completion"];
46
+ }];
47
+ export type SportsMarketCardVariant = "outcome" | "line" | "yes_no";
48
+ export type SportsMarketDisplayGroup = {
49
+ id: string;
50
+ title: string;
51
+ questionKey: string;
52
+ sportsMarketType: SportsMarketTypeKey | null;
53
+ marketCategory: SportsMarketCategoryKey | null;
54
+ period: SportsPeriodKey;
55
+ sectionRank: number;
56
+ markets: VenueMarket[];
57
+ hasLineVariants: boolean;
58
+ };
59
+ export type SportsPeriodGroup = {
60
+ key: SportsPeriodKey;
61
+ markets: VenueMarket[];
62
+ groups: SportsMarketDisplayGroup[];
63
+ };
64
+ export declare const resolveSportsSectionDefinition: (key: SportsSectionTabKey) => SportsSectionTabDefinition;
65
+ export declare const normalizeSportsPeriod: (value: string | null | undefined) => SportsPeriodKey;
66
+ export declare const normalizeSportsMarketType: (value: string | null | undefined) => SportsMarketTypeKey | null;
67
+ export declare const normalizeSportsMarketCategory: (value: string | null | undefined) => SportsMarketCategoryKey | null;
68
+ export declare const normalizeSportsMarketGroup: (value: string | null | undefined) => SportsMarketGroupKey | null;
69
+ /**
70
+ * Map a market to the sports section tab it belongs to — marketGroup-first, with
71
+ * marketCategory as the documented compatibility fallback (see the
72
+ * sports-market-detail recipe). Returns null when a market carries no
73
+ * recognizable grouping metadata, so the page can fall back to the default,
74
+ * ungrouped market list instead of inventing an empty tab.
75
+ */
76
+ export declare const resolveMarketSectionTabKey: (market: Pick<VenueMarket, "marketGroup" | "marketCategory">) => SportsSectionTabKey | null;
77
+ export declare const resolveSportsSectionFilters: (key: SportsSectionTabKey) => {
78
+ marketGroup?: SportsMarketGroupKey[];
79
+ marketCategory?: SportsMarketCategoryKey[];
80
+ sportsMarketType?: SportsMarketTypeKey[];
81
+ period?: SportsPeriodKey[];
82
+ };
83
+ /**
84
+ * Resolve the markets a sports section tab should display and group.
85
+ *
86
+ * Section markets are fetched by `aggKey`, which intentionally spans every
87
+ * sibling venue-event for the same real-world game (so cross-venue line ladders
88
+ * and prop categories aggregate together). For the Game Lines MONEYLINE
89
+ * (match-result) group, that aggregation is wrong: it can surface duplicate
90
+ * draws sourced from sibling events, props mis-classified as `moneyline`, and —
91
+ * because a sibling's market often wins the cross-venue collapse — it can omit
92
+ * THIS event's own outcome markets entirely (e.g. show two "Draw"s and drop the
93
+ * "Australia" win).
94
+ *
95
+ * The event's own curated `venueMarkets` are the authoritative N-way result for
96
+ * this event (the same source the non-sports event page renders correctly). So
97
+ * on the Game Lines tab we take the moneyline markets from the event and keep
98
+ * only the line markets (spread/total) from the aggKey fetch. Every other tab —
99
+ * and the spread/total ladders within Game Lines — use the fetched markets
100
+ * unchanged.
101
+ */
102
+ export declare const resolveSportsSectionMarkets: ({ tabKey, eventMarkets, sectionMarkets, }: {
103
+ tabKey: SportsSectionTabKey;
104
+ eventMarkets: VenueMarket[];
105
+ sectionMarkets: VenueMarket[];
106
+ }) => VenueMarket[];
107
+ export declare const resolveSportsMarketCardVariant: (market: VenueMarket) => SportsMarketCardVariant;
108
+ export declare const isBinarySportsMoneylineMarket: (market: VenueMarket) => boolean;
109
+ export declare const buildSportsMarketDisplayGroups: (markets: VenueMarket[]) => SportsMarketDisplayGroup[];
110
+ export declare const groupSportsMarketsByPeriod: (markets: VenueMarket[]) => SportsPeriodGroup[];
111
+ export type SportsGameLineSlideKind = "moneyline" | "spread" | "total" | "other";
112
+ export type SportsGameLineSlideStop = {
113
+ /** Display value for the ladder chip, e.g. "1.5", "216.5". */
114
+ value: string;
115
+ /** Venue ids offering this line (cast to VenueLogoName at the render site). */
116
+ venues: string[];
117
+ market: VenueMarket;
118
+ };
119
+ export type SportsGameLineSlide = {
120
+ id: string;
121
+ kind: SportsGameLineSlideKind;
122
+ group: SportsMarketDisplayGroup;
123
+ /** False for moneyline / single-market groups → no line ladder. */
124
+ hasLadder: boolean;
125
+ stops: SportsGameLineSlideStop[];
126
+ /** Marquee line on first render — the highest-volume line in the group. */
127
+ defaultStopIndex: number;
128
+ };
129
+ export declare const resolveSelectedSportsLineValue: (lineValue: number | null | undefined) => string;
130
+ export declare const collectVenueNames: (market: VenueMarket) => string[];
131
+ export declare const resolveTotalGroupVolume: (markets: VenueMarket[]) => number;
132
+ export declare const resolveSportsExpandedMarkets: (markets: VenueMarket[]) => VenueMarket[];
133
+ export declare const resolveSportsExpandedMarketsVolume: (markets: VenueMarket[]) => number;
134
+ export declare const buildSportsSlideFromGroup: (group: SportsMarketDisplayGroup) => SportsGameLineSlide;
135
+ /**
136
+ * Derive the Moneyline / Spreads / Total game-line slides (in that order) from a
137
+ * flat list of venue markets. Reuses {@link buildSportsMarketDisplayGroups} so
138
+ * line variants collapse into one slide with the per-line ladder.
139
+ */
140
+ export declare const buildSportsGameLineSlides: (markets: VenueMarket[], period?: SportsPeriodKey) => SportsGameLineSlide[];
141
+ export type SportsTeam = {
142
+ name: string;
143
+ abbr: string;
144
+ };
145
+ export type SportsTeams = {
146
+ away: SportsTeam;
147
+ home: SportsTeam;
148
+ };
149
+ export declare const resolveSportsTeams: (event: Pick<VenueEventWithMarkets, "title">, moneylineMarket?: VenueMarket | null) => SportsTeams | null;
150
+ export declare const resolveSportsLeagueLabel: (event: Pick<VenueEventWithMarkets, "categories" | "aggKey">) => string | null;
151
+ export declare const isNonStandardSportsLikeEvent: (event: Pick<VenueEventWithMarkets, "categories" | "title" | "venueMarkets">) => boolean;
152
+ export declare const resolveVisibleSportsSectionTabDefinitions: (event: Pick<VenueEventWithMarkets, "categories" | "title" | "venueMarkets">) => SportsSectionTabDefinition[];
153
+ export declare const mergeSportsSectionMarketsIntoEvent: ({ event, sectionMarketsByKey, }: {
154
+ event: import("@agg-build/hooks").VenueEventWithMarkets;
155
+ sectionMarketsByKey: Partial<Record<SportsSectionTabKey, VenueMarket[]>>;
156
+ }) => import("@agg-build/hooks").VenueEventWithMarkets;
@@ -0,0 +1,17 @@
1
+ export type SportsLineRailStop = {
2
+ /** Display value for the line, e.g. "1.5", "216.5". */
3
+ value: string;
4
+ /** Venue ids offering this line (small logos under the value). */
5
+ venues?: string[];
6
+ disabled?: boolean;
7
+ };
8
+ export type SportsLineRailProps = {
9
+ stops: SportsLineRailStop[];
10
+ selectedIndex: number;
11
+ onSelect: (index: number) => void;
12
+ ariaLabel?: string;
13
+ previousAriaLabel?: string;
14
+ nextAriaLabel?: string;
15
+ className?: string;
16
+ };
17
+ export declare function SportsLineRail({ stops, selectedIndex, onSelect, ariaLabel, previousAriaLabel, nextAriaLabel, className, }: SportsLineRailProps): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,17 @@
1
+ export type SportsLineRailStop = {
2
+ /** Display value for the line, e.g. "1.5", "216.5". */
3
+ value: string;
4
+ /** Venue ids offering this line (small logos under the value). */
5
+ venues?: string[];
6
+ disabled?: boolean;
7
+ };
8
+ export type SportsLineRailProps = {
9
+ stops: SportsLineRailStop[];
10
+ selectedIndex: number;
11
+ onSelect: (index: number) => void;
12
+ ariaLabel?: string;
13
+ previousAriaLabel?: string;
14
+ nextAriaLabel?: string;
15
+ className?: string;
16
+ };
17
+ export declare function SportsLineRail({ stops, selectedIndex, onSelect, ariaLabel, previousAriaLabel, nextAriaLabel, className, }: SportsLineRailProps): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,22 @@
1
+ import { type UseMidpointsResult, type VenueMarket } from "@agg-build/hooks";
2
+ import { type SportsMarketDisplayGroup } from "./sports-event-market.utils";
3
+ export type SportsMarketCardProps = {
4
+ group: SportsMarketDisplayGroup;
5
+ /** Full market set for the active section — MarketDetails resolves the active
6
+ * market's cross-venue cluster from this (matched relations, not question). */
7
+ venueMarkets: VenueMarket[];
8
+ isExpanded: boolean;
9
+ onToggle: (groupId: string, market: VenueMarket) => void;
10
+ onOutcomeSelect?: (groupId: string, selection: {
11
+ marketId: string;
12
+ outcomeId: string;
13
+ }) => void;
14
+ live?: boolean;
15
+ midpointsFallback?: Map<string, number>;
16
+ midpointsFallbackVenues?: Map<string, string>;
17
+ midpointsResult?: UseMidpointsResult;
18
+ };
19
+ export declare const SportsMarketCard: {
20
+ ({ group, venueMarkets, isExpanded, onToggle, onOutcomeSelect, live, midpointsFallback, midpointsFallbackVenues, midpointsResult, }: SportsMarketCardProps): import("react/jsx-runtime").JSX.Element | null;
21
+ displayName: string;
22
+ };
@@ -0,0 +1,22 @@
1
+ import { type UseMidpointsResult, type VenueMarket } from "@agg-build/hooks";
2
+ import { type SportsMarketDisplayGroup } from "./sports-event-market.utils";
3
+ export type SportsMarketCardProps = {
4
+ group: SportsMarketDisplayGroup;
5
+ /** Full market set for the active section — MarketDetails resolves the active
6
+ * market's cross-venue cluster from this (matched relations, not question). */
7
+ venueMarkets: VenueMarket[];
8
+ isExpanded: boolean;
9
+ onToggle: (groupId: string, market: VenueMarket) => void;
10
+ onOutcomeSelect?: (groupId: string, selection: {
11
+ marketId: string;
12
+ outcomeId: string;
13
+ }) => void;
14
+ live?: boolean;
15
+ midpointsFallback?: Map<string, number>;
16
+ midpointsFallbackVenues?: Map<string, string>;
17
+ midpointsResult?: UseMidpointsResult;
18
+ };
19
+ export declare const SportsMarketCard: {
20
+ ({ group, venueMarkets, isExpanded, onToggle, onOutcomeSelect, live, midpointsFallback, midpointsFallbackVenues, midpointsResult, }: SportsMarketCardProps): import("react/jsx-runtime").JSX.Element | null;
21
+ displayName: string;
22
+ };
@@ -0,0 +1,13 @@
1
+ import { type UseMidpointsResult, type VenueEventWithMarkets, type VenueMarket } from "@agg-build/hooks";
2
+ import { type SportsSectionTabKey } from "./sports-event-market.utils";
3
+ export type SportsMarketsProps = {
4
+ event: VenueEventWithMarkets;
5
+ onSectionMarketsChange: (tabKey: SportsSectionTabKey, markets: VenueMarket[]) => void;
6
+ onOutcomeSelect?: () => void;
7
+ live?: boolean;
8
+ midpointsResult?: UseMidpointsResult;
9
+ };
10
+ export declare const SportsMarkets: {
11
+ ({ event, onSectionMarketsChange, onOutcomeSelect, live, midpointsResult, }: SportsMarketsProps): import("react/jsx-runtime").JSX.Element;
12
+ displayName: string;
13
+ };
@@ -0,0 +1,13 @@
1
+ import { type UseMidpointsResult, type VenueEventWithMarkets, type VenueMarket } from "@agg-build/hooks";
2
+ import { type SportsSectionTabKey } from "./sports-event-market.utils";
3
+ export type SportsMarketsProps = {
4
+ event: VenueEventWithMarkets;
5
+ onSectionMarketsChange: (tabKey: SportsSectionTabKey, markets: VenueMarket[]) => void;
6
+ onOutcomeSelect?: () => void;
7
+ live?: boolean;
8
+ midpointsResult?: UseMidpointsResult;
9
+ };
10
+ export declare const SportsMarkets: {
11
+ ({ event, onSectionMarketsChange, onOutcomeSelect, live, midpointsResult, }: SportsMarketsProps): import("react/jsx-runtime").JSX.Element;
12
+ displayName: string;
13
+ };
@@ -1,6 +1,4 @@
1
1
  import type { AggUiLabels } from "@agg-build/hooks";
2
2
  import type { VenueEventWithMarkets } from "../../events/item";
3
3
  import type { SearchResultItem } from "./search.types";
4
- export declare const mapVenueEventToSearchResult: (event: VenueEventWithMarkets, labels: AggUiLabels, formatPercent: (value: number) => string, formatCompactCurrency: (value: number) => string, options?: {
5
- locale?: string;
6
- }) => SearchResultItem | null;
4
+ export declare const mapVenueEventToSearchResult: (event: VenueEventWithMarkets, labels: AggUiLabels, formatPercent: (value: number) => string, formatCompactCurrency: (value: number) => string) => SearchResultItem | null;
@@ -1,6 +1,4 @@
1
1
  import type { AggUiLabels } from "@agg-build/hooks";
2
2
  import type { VenueEventWithMarkets } from "../../events/item";
3
3
  import type { SearchResultItem } from "./search.types";
4
- export declare const mapVenueEventToSearchResult: (event: VenueEventWithMarkets, labels: AggUiLabels, formatPercent: (value: number) => string, formatCompactCurrency: (value: number) => string, options?: {
5
- locale?: string;
6
- }) => SearchResultItem | null;
4
+ export declare const mapVenueEventToSearchResult: (event: VenueEventWithMarkets, labels: AggUiLabels, formatPercent: (value: number) => string, formatCompactCurrency: (value: number) => string) => SearchResultItem | null;
@@ -2,6 +2,6 @@ import type { StateMessageProps } from "./state-message.types";
2
2
  export type { StateMessageClassNames, StateMessageProps } from "./state-message.types";
3
3
  /** Renders a centered state message surface with a caller-provided icon and optional retry action. */
4
4
  export declare const StateMessage: {
5
- ({ icon, title, description, onAction, classNames, }: StateMessageProps): JSX.Element;
5
+ ({ icon, title, description, onAction, classNames, ...rest }: StateMessageProps): JSX.Element;
6
6
  displayName: string;
7
7
  };
@@ -2,6 +2,6 @@ import type { StateMessageProps } from "./state-message.types";
2
2
  export type { StateMessageClassNames, StateMessageProps } from "./state-message.types";
3
3
  /** Renders a centered state message surface with a caller-provided icon and optional retry action. */
4
4
  export declare const StateMessage: {
5
- ({ icon, title, description, onAction, classNames, }: StateMessageProps): JSX.Element;
5
+ ({ icon, title, description, onAction, classNames, ...rest }: StateMessageProps): JSX.Element;
6
6
  displayName: string;
7
7
  };
@@ -7,7 +7,7 @@ export type StateMessageClassNames = {
7
7
  description?: string;
8
8
  action?: string;
9
9
  };
10
- export type StateMessageProps = {
10
+ export type StateMessageProps = Omit<React.HTMLAttributes<HTMLDivElement>, "title"> & {
11
11
  /** Heading shown for the state message. */
12
12
  title: string;
13
13
  /** Supporting description shown under the title. */
@@ -7,7 +7,7 @@ export type StateMessageClassNames = {
7
7
  description?: string;
8
8
  action?: string;
9
9
  };
10
- export type StateMessageProps = {
10
+ export type StateMessageProps = Omit<React.HTMLAttributes<HTMLDivElement>, "title"> & {
11
11
  /** Heading shown for the state message. */
12
12
  title: string;
13
13
  /** Supporting description shown under the title. */
@@ -5,6 +5,6 @@ export { PlaceOrderSuccessView } from "./index.place-order.success";
5
5
  export type { PlaceOrderSuccessViewProps } from "./index.place-order.success";
6
6
  export type { PlaceOrderClassNames, PlaceOrderExecutionSummary, PlaceOrderResolvedClaimSummary, PlaceOrderTradingLabels, } from "./index.place-order.types";
7
7
  export declare const PlaceOrder: {
8
- ({ className, classNames, eventTradingState, executionMode, isLoading, isPrimaryActionDisabled, isPrimaryActionLoading, chainBalancesOverride, onAmountChange, onClose, onOutcomeChange, onPrimaryAction, onBeforePrimaryAction, onTabChange, onSuccess, onError, onExecutionStateChange, resolvedClaim, midpointsResult, }: PlaceOrderProps): JSX.Element;
8
+ ({ className, classNames, eventTradingState, executionMode, isLoading, isPrimaryActionDisabled, isPrimaryActionLoading, isQuotePanelActive, chainBalancesOverride, onAmountChange, onClose, onOutcomeChange, onPrimaryAction, onBeforePrimaryAction, onTabChange, onSuccess, onError, onExecutionStateChange, resolvedClaim, midpointsResult, }: PlaceOrderProps): JSX.Element;
9
9
  displayName: string;
10
10
  };
@@ -5,6 +5,6 @@ export { PlaceOrderSuccessView } from "./index.place-order.success";
5
5
  export type { PlaceOrderSuccessViewProps } from "./index.place-order.success";
6
6
  export type { PlaceOrderClassNames, PlaceOrderExecutionSummary, PlaceOrderResolvedClaimSummary, PlaceOrderTradingLabels, } from "./index.place-order.types";
7
7
  export declare const PlaceOrder: {
8
- ({ className, classNames, eventTradingState, executionMode, isLoading, isPrimaryActionDisabled, isPrimaryActionLoading, chainBalancesOverride, onAmountChange, onClose, onOutcomeChange, onPrimaryAction, onBeforePrimaryAction, onTabChange, onSuccess, onError, onExecutionStateChange, resolvedClaim, midpointsResult, }: PlaceOrderProps): JSX.Element;
8
+ ({ className, classNames, eventTradingState, executionMode, isLoading, isPrimaryActionDisabled, isPrimaryActionLoading, isQuotePanelActive, chainBalancesOverride, onAmountChange, onClose, onOutcomeChange, onPrimaryAction, onBeforePrimaryAction, onTabChange, onSuccess, onError, onExecutionStateChange, resolvedClaim, midpointsResult, }: PlaceOrderProps): JSX.Element;
9
9
  displayName: string;
10
10
  };
@@ -16,6 +16,12 @@ export type PlaceOrderProps = {
16
16
  isPrimaryActionDisabled?: boolean;
17
17
  /** Whether the primary submit action should show a loading spinner. */
18
18
  isPrimaryActionLoading?: boolean;
19
+ /**
20
+ * Whether this place-order instance is the active, visible quote surface.
21
+ * Hidden or closed surfaces should pass false so quote polling can pause.
22
+ * Defaults to true.
23
+ */
24
+ isQuotePanelActive?: boolean;
19
25
  /** Called when the entered order amount changes. */
20
26
  onAmountChange?: (amount: number) => void;
21
27
  /** Called when the place-order panel should close. */
@@ -229,6 +235,7 @@ export type PlaceOrderSubmissionProgressState = {
229
235
  failureSummary?: PlaceOrderFailureSummary;
230
236
  orderId?: string;
231
237
  orderIds?: string[];
238
+ quoteId?: string;
232
239
  phase: PlaceOrderSubmissionProgressPhase;
233
240
  summary?: PlaceOrderExecutionSummary;
234
241
  dagProgress?: DagStepProgress | null;
@@ -16,6 +16,12 @@ export type PlaceOrderProps = {
16
16
  isPrimaryActionDisabled?: boolean;
17
17
  /** Whether the primary submit action should show a loading spinner. */
18
18
  isPrimaryActionLoading?: boolean;
19
+ /**
20
+ * Whether this place-order instance is the active, visible quote surface.
21
+ * Hidden or closed surfaces should pass false so quote polling can pause.
22
+ * Defaults to true.
23
+ */
24
+ isQuotePanelActive?: boolean;
19
25
  /** Called when the entered order amount changes. */
20
26
  onAmountChange?: (amount: number) => void;
21
27
  /** Called when the place-order panel should close. */
@@ -229,6 +235,7 @@ export type PlaceOrderSubmissionProgressState = {
229
235
  failureSummary?: PlaceOrderFailureSummary;
230
236
  orderId?: string;
231
237
  orderIds?: string[];
238
+ quoteId?: string;
232
239
  phase: PlaceOrderSubmissionProgressPhase;
233
240
  summary?: PlaceOrderExecutionSummary;
234
241
  dagProgress?: DagStepProgress | null;
@@ -30,7 +30,10 @@ export type SettlementSourceBlock = {
30
30
  };
31
31
  /**
32
32
  * Produces the ordered list of non-empty settlement blocks for the Settlement
33
- * section, dropping any source whose normalized text is identical to a block
34
- * already included.
33
+ * section, dropping any source whose normalized text is contained within
34
+ * another source's — keeping the superset. Containment (not just equality) is
35
+ * required because some venues (e.g. predict) store the same rules text on both
36
+ * the event and its markets, with the market copy adding only a trailing
37
+ * "Created At: ..." line, so the two are a prefix relationship, not identical.
35
38
  */
36
39
  export declare const dedupeSettlementSources: (sources: SettlementSourceInput) => SettlementSourceBlock[];
@@ -30,7 +30,10 @@ export type SettlementSourceBlock = {
30
30
  };
31
31
  /**
32
32
  * Produces the ordered list of non-empty settlement blocks for the Settlement
33
- * section, dropping any source whose normalized text is identical to a block
34
- * already included.
33
+ * section, dropping any source whose normalized text is contained within
34
+ * another source's — keeping the superset. Containment (not just equality) is
35
+ * required because some venues (e.g. predict) store the same rules text on both
36
+ * the event and its markets, with the market copy adding only a trailing
37
+ * "Created At: ..." line, so the two are a prefix relationship, not identical.
35
38
  */
36
39
  export declare const dedupeSettlementSources: (sources: SettlementSourceInput) => SettlementSourceBlock[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agg-build/ui",
3
- "version": "2.1.2",
3
+ "version": "2.1.4",
4
4
  "description": "Pre-built React component library for the AGG prediction market aggregator. Tailwind-based, themeable, with primitives, event surfaces, trading flows, full pages, and modals.",
5
5
  "sideEffects": false,
6
6
  "license": "MIT",
@@ -100,8 +100,8 @@
100
100
  "liveline": "^0.0.7",
101
101
  "react": "^18.0.0 || ^19.0.0",
102
102
  "react-dom": "^18.0.0 || ^19.0.0",
103
- "@agg-build/hooks": "^2.1.2",
104
- "@agg-build/sdk": "^2.1.2"
103
+ "@agg-build/hooks": "^2.1.3",
104
+ "@agg-build/sdk": "^2.1.3"
105
105
  },
106
106
  "dependencies": {
107
107
  "@number-flow/react": "^0.6.0",