@sensiblestats/widget-react 0.94.0 → 0.95.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # @sensiblestats/widget-react
2
2
 
3
+ ## 0.95.1
4
+
5
+ ### Patch Changes
6
+
7
+ - d7807c3: NBA line score shows OT columns only once a game reaches overtime, and dashes quarters not yet played instead of the feed's 0.
8
+
9
+ ## 0.95.0
10
+
11
+ ### Minor Changes
12
+
13
+ - NBA matchup, quarter ladder and settle recap cards, behind the nba_insight_v2 capability.
14
+ - Malformed matchup, quarter ladder and settle recap cards are dropped instead of crashing the widget; a card of an unknown kind renders nothing.
15
+
16
+ ### Patch Changes
17
+
18
+ - Updated dependencies
19
+ - @sensiblestats/widget-sdk@0.64.0
20
+
3
21
  ## 0.94.0
4
22
 
5
23
  ### Minor Changes
package/dist/index.cjs CHANGED
@@ -57,6 +57,8 @@ var NBA_STAT_EN = { points: "Points", rebounds: "Rebounds", assists: "Assists",
57
57
  var NBA_STAT_TR = { points: "Say\u0131", rebounds: "Ribaund", assists: "Asist", threes: "\xDC\xE7l\xFCk", steals: "Top \xE7alma", blocks: "Blok" };
58
58
  var NBA_STAT_SHORT_EN = { points: "PTS", rebounds: "REB", assists: "AST", threes: "3PM" };
59
59
  var NBA_STAT_SHORT_TR = { points: "SAY", rebounds: "RIB", assists: "AST", threes: "3SY" };
60
+ var NBA_POSITION_EN = { G: "guards", F: "forwards", C: "centers" };
61
+ var NBA_POSITION_TR = { G: "guard", F: "forvet", C: "pivot" };
60
62
  var NBA_STATUS_TR = { Out: "Oynamayacak", Doubtful: "\u015E\xFCpheli", Questionable: "Belirsiz", Probable: "Muhtemel" };
61
63
  var signed = (line) => line.replace(/^-/, "\u2212");
62
64
  var GROUP_NOUN_EN = { G: "goalkeepers", D: "defenders", M: "midfielders", F: "forwards" };
@@ -372,7 +374,26 @@ var STRINGS = {
372
374
  propsLast5: "Last 5 games",
373
375
  propsLadderOnly: "Ladder only",
374
376
  propsMarkets: (n) => `${n} markets`,
375
- propsStatShort: (stat) => NBA_STAT_SHORT_EN[stat] ?? stat
377
+ propsStatShort: (stat) => NBA_STAT_SHORT_EN[stat] ?? stat,
378
+ matchupPace: "Pace",
379
+ matchupOffRating: "Offensive rating",
380
+ matchupDefRating: "Defensive rating",
381
+ rankOf: (r, n) => `rank ${r} of ${n}`,
382
+ daysRest: (d) => `${d} ${d === 1 ? "day" : "days"} rest`,
383
+ backToBack: "Back-to-back",
384
+ allowsToPosition: (team, v, stat, pos, avg) => `${team} allows ${v} ${(NBA_STAT_EN[stat] ?? stat).toLowerCase()} per game to ${NBA_POSITION_EN[pos] ?? pos} (league average ${avg})`,
385
+ quarterWindow1q: "First quarter",
386
+ quarterWindowFirst3: "First 3 min",
387
+ hitsOf: (h, n) => `${h} of ${n}`,
388
+ settled: "Settled",
389
+ actual: "Actual",
390
+ resultOver: "Over",
391
+ resultUnder: "Under",
392
+ resultPush: "Push",
393
+ resultVoid: "Void",
394
+ lastLineBeforeTip: "Last line before tip",
395
+ morePlayers: (n) => `+${n} more players`,
396
+ smallSample: "Small sample"
376
397
  },
377
398
  games: {
378
399
  lang: "en",
@@ -882,7 +903,26 @@ var STRINGS = {
882
903
  propsLast5: "Son 5 ma\xE7",
883
904
  propsLadderOnly: "Sadece alternatif",
884
905
  propsMarkets: (n) => `${n} market`,
885
- propsStatShort: (stat) => NBA_STAT_SHORT_TR[stat] ?? stat
906
+ propsStatShort: (stat) => NBA_STAT_SHORT_TR[stat] ?? stat,
907
+ matchupPace: "Tempo",
908
+ matchupOffRating: "H\xFCcum reytingi",
909
+ matchupDefRating: "Savunma reytingi",
910
+ rankOf: (r, n) => `${n} tak\u0131mda ${r}. s\u0131ra`,
911
+ daysRest: (d) => `${d} g\xFCn dinlenme`,
912
+ backToBack: "Arka arkaya ma\xE7",
913
+ allowsToPosition: (team, v, stat, pos, avg) => `${team}, ${NBA_POSITION_TR[pos] ?? pos} oyunculara ma\xE7 ba\u015F\u0131na ${v} ${(NBA_STAT_TR[stat] ?? stat).toLocaleLowerCase("tr-TR")} veriyor (lig ortalamas\u0131 ${avg})`,
914
+ quarterWindow1q: "\u0130lk \xE7eyrek",
915
+ quarterWindowFirst3: "\u0130lk 3 dakika",
916
+ hitsOf: (h, n) => `${n} ma\xE7ta ${h}`,
917
+ settled: "Sonu\xE7land\u0131",
918
+ actual: "Ger\xE7ek",
919
+ resultOver: "\xDCst",
920
+ resultUnder: "Alt",
921
+ resultPush: "\u0130ade",
922
+ resultVoid: "\u0130ptal",
923
+ lastLineBeforeTip: "Ma\xE7 \xF6ncesi son baraj",
924
+ morePlayers: (n) => `+${n} oyuncu daha`,
925
+ smallSample: "Az ma\xE7"
886
926
  },
887
927
  games: {
888
928
  lang: "tr",
@@ -1097,7 +1137,7 @@ function isEnglishLocale(locale) {
1097
1137
  }
1098
1138
 
1099
1139
  // src/version.generated.ts
1100
- var WIDGET_REACT_VERSION = "0.94.0";
1140
+ var WIDGET_REACT_VERSION = "0.95.1";
1101
1141
 
1102
1142
  // src/config.ts
1103
1143
  function normalizeUi(cfg) {
@@ -1692,6 +1732,27 @@ function comboLegToSlipSelection(leg, conversationId) {
1692
1732
  if (conversationId !== void 0) selection.conversationId = conversationId;
1693
1733
  return selection;
1694
1734
  }
1735
+ var isNum = (v) => typeof v === "number" && Number.isFinite(v);
1736
+ var isObj = (v) => typeof v === "object" && v !== null;
1737
+ var numOrNull = (v) => v === null || v === void 0 || isNum(v);
1738
+ function validMatchupTeam(t) {
1739
+ return isObj(t) && typeof t.name === "string" && typeof t.abbr === "string" && isNum(t.pace) && isNum(t.offRating) && isNum(t.defRating) && isNum(t.n) && isNum(t.teamsRanked) && numOrNull(t.daysRest) && numOrNull(t.paceRank) && numOrNull(t.offRatingRank) && numOrNull(t.defRatingRank);
1740
+ }
1741
+ function validMatchupPosition(p) {
1742
+ return isObj(p) && typeof p.defendingTeamAbbr === "string" && typeof p.position === "string" && typeof p.stat === "string" && isNum(p.allowedPerGame) && isNum(p.leagueAvg) && isNum(p.rank) && isNum(p.teamsRanked) && isNum(p.n);
1743
+ }
1744
+ function sanitizeMatchup(m) {
1745
+ if (!m || !Array.isArray(m.teams) || m.teams.length !== 2 || !m.teams.every(validMatchupTeam)) return null;
1746
+ const teams = m.teams.map((t) => ({ ...t, daysRest: t.daysRest ?? null, paceRank: t.paceRank ?? null, offRatingRank: t.offRatingRank ?? null, defRatingRank: t.defRatingRank ?? null }));
1747
+ return { teams, position: validMatchupPosition(m.position) ? m.position : null };
1748
+ }
1749
+ function validQuarterLadder(q) {
1750
+ return !!q && (q.window === "1q" || q.window === "first3min") && Array.isArray(q.stats) && q.stats.every((st) => isObj(st) && Array.isArray(st.rungs) && st.rungs.every((r) => isObj(r) && typeof r.at === "string" && isNum(r.hits) && isNum(r.n)));
1751
+ }
1752
+ var SETTLE_RESULTS = ["over", "under", "push", "void"];
1753
+ function validSettleRecap(sr) {
1754
+ return !!sr && isObj(sr.summary) && isNum(sr.summary.over) && isNum(sr.summary.under) && isNum(sr.summary.pushes) && isNum(sr.summary.voids) && Array.isArray(sr.players) && sr.players.every((p) => isObj(p) && Array.isArray(p.lines) && p.lines.every((l) => isObj(l) && typeof l.line === "string" && (l.actual === null || typeof l.actual === "string") && SETTLE_RESULTS.includes(l.result)));
1755
+ }
1695
1756
  function nbaEvidence(insight) {
1696
1757
  switch (insight.kind) {
1697
1758
  case "prop_reason":
@@ -1704,6 +1765,14 @@ function nbaEvidence(insight) {
1704
1765
  return insight.coHit && insight.coHit.legs.length === 2 ? { kind: "co_hit", coHit: insight.coHit } : null;
1705
1766
  case "ladder":
1706
1767
  return insight.ladder ? { kind: "ladder", ladder: insight.ladder } : null;
1768
+ case "matchup": {
1769
+ const matchup = sanitizeMatchup(insight.matchup);
1770
+ return matchup ? { kind: "matchup", matchup } : null;
1771
+ }
1772
+ case "quarter_ladder":
1773
+ return validQuarterLadder(insight.quarterLadder) ? { kind: "quarter_ladder", quarterLadder: insight.quarterLadder } : null;
1774
+ case "settle_recap":
1775
+ return validSettleRecap(insight.settleRecap) ? { kind: "settle_recap", settleRecap: insight.settleRecap } : null;
1707
1776
  default:
1708
1777
  return null;
1709
1778
  }
@@ -2650,7 +2719,7 @@ function clearConversation(storageKey) {
2650
2719
  }
2651
2720
 
2652
2721
  // src/presets.ts
2653
- var CLIENT_CAPABILITIES = ["price_presets", "price_presets_open", "limit_notice", "nba_insight"];
2722
+ var CLIENT_CAPABILITIES = ["price_presets", "price_presets_open", "limit_notice", "nba_insight", "nba_insight_v2"];
2654
2723
  var PRICE_TILE_PREFIX = "goal-preset-";
2655
2724
  function isPriceTile(tile) {
2656
2725
  const id = tile.signal?.entityId;
@@ -5091,19 +5160,23 @@ function NbaPrice({ vm, selectionKey, label, ui, slip }) {
5091
5160
  function Head({ vm, chip, ui, monitor }) {
5092
5161
  const fixture = vm.homeTeamName && vm.awayTeamName ? `${vm.homeTeamName} vs ${vm.awayTeamName}` : vm.competition;
5093
5162
  const meta = [fixture, vm.kickoffLabel].filter(Boolean).join(" \xB7 ");
5163
+ const pinnable = monitor?.enabled === true && vm.evidence.kind !== "settle_recap";
5094
5164
  return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "ss-w-nba-head", children: [
5095
5165
  /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "ss-w-nba-head-l", children: [
5096
5166
  meta ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { className: "ss-w-nba-meta", children: meta }) : null,
5097
5167
  /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { className: "ss-w-nba-title", children: vm.title })
5098
5168
  ] }),
5099
- chip || monitor?.enabled ? /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("span", { className: "ss-w-bi-meta-right", children: [
5169
+ chip || pinnable ? /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("span", { className: "ss-w-bi-meta-right", children: [
5100
5170
  chip ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-nba-chip", children: chip }) : null,
5101
- monitor?.enabled ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(PinToggle, { ui, monitor, pin: { kind: "match", matchId: vm.matchId, sport: "basketball" } }) : null
5171
+ pinnable && monitor ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(PinToggle, { ui, monitor, pin: { kind: "match", matchId: vm.matchId, sport: "basketball" } }) : null
5102
5172
  ] }) : null
5103
5173
  ] });
5104
5174
  }
5105
5175
  function Foot({ vm, ui, lines }) {
5106
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "ss-w-nba-foot", children: [...lines, ui.nba.quoted(clock(vm.quotedAtUtc)), ...vm.disclaimer ? [vm.disclaimer] : []].join(" ") });
5176
+ const quoted = Object.keys(vm.selections).length > 0 ? [ui.nba.quoted(clock(vm.quotedAtUtc))] : [];
5177
+ const parts = [...lines, ...quoted, ...vm.disclaimer ? [vm.disclaimer] : []];
5178
+ if (parts.length === 0) return null;
5179
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "ss-w-nba-foot", children: parts.join(" ") });
5107
5180
  }
5108
5181
  function PropReason({ vm, pr, ui, slip }) {
5109
5182
  const nba = ui.nba;
@@ -5172,6 +5245,117 @@ function Ladder({ vm, ld, ui, slip }) {
5172
5245
  ] })
5173
5246
  ] }, `${st.stat}:${si}`)) });
5174
5247
  }
5248
+ function SmallSample({ ui }) {
5249
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-nba-small", children: ui.nba.smallSample });
5250
+ }
5251
+ function NbaMatchupBody({ mu, ui }) {
5252
+ const nba = ui.nba;
5253
+ const metrics = [
5254
+ { label: nba.matchupPace, value: (t) => t.pace, rank: (t) => t.paceRank },
5255
+ { label: nba.matchupOffRating, value: (t) => t.offRating, rank: (t) => t.offRatingRank },
5256
+ { label: nba.matchupDefRating, value: (t) => t.defRating, rank: (t) => t.defRatingRank }
5257
+ ];
5258
+ const pos = mu.position;
5259
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_jsx_runtime17.Fragment, { children: [
5260
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "ss-w-nba-mu", children: [
5261
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", {}),
5262
+ mu.teams.map((t) => /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("span", { className: "ss-w-nba-mu-team", title: t.name, children: [
5263
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("b", { children: t.abbr }),
5264
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-nba-hd", children: nba.lastN(t.n) }),
5265
+ t.smallSample ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(SmallSample, { ui }) : null
5266
+ ] }, `h:${t.teamId}`)),
5267
+ metrics.map((m) => /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "ss-w-nba-row", children: [
5268
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-nba-hd", children: m.label }),
5269
+ mu.teams.map((t) => {
5270
+ const r = m.rank(t);
5271
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("span", { className: "ss-w-nba-mu-v", children: [
5272
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("b", { children: oneDecimal(m.value(t), ui) }),
5273
+ r !== null ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { children: nba.rankOf(r, t.teamsRanked) }) : null
5274
+ ] }, `${m.label}:${t.teamId}`);
5275
+ })
5276
+ ] }, m.label)),
5277
+ mu.teams.some((t) => t.daysRest !== null || t.backToBack) ? /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "ss-w-nba-row", children: [
5278
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", {}),
5279
+ mu.teams.map((t) => /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("span", { className: "ss-w-nba-mu-rest", children: [
5280
+ t.daysRest !== null ? nba.daysRest(t.daysRest) : "",
5281
+ t.daysRest !== null && t.backToBack ? " \xB7 " : "",
5282
+ t.backToBack ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-nba-b2b", children: nba.backToBack }) : null
5283
+ ] }, `rest:${t.teamId}`))
5284
+ ] }) : null
5285
+ ] }),
5286
+ pos ? /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("p", { className: "ss-w-nba-mu-pos", children: [
5287
+ nba.allowsToPosition(pos.defendingTeamAbbr, oneDecimal(pos.allowedPerGame, ui), pos.stat, pos.position, oneDecimal(pos.leagueAvg, ui)),
5288
+ " ",
5289
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-nba-note", children: nba.rankOf(pos.rank, pos.teamsRanked) }),
5290
+ pos.smallSample ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(SmallSample, { ui }) : null
5291
+ ] }) : null
5292
+ ] });
5293
+ }
5294
+ function NbaQuarterLadderBody({ vm, ql, ui, slip }) {
5295
+ const nba = ui.nba;
5296
+ const windowLabel = ql.window === "1q" ? nba.quarterWindow1q : ql.window === "first3min" ? nba.quarterWindowFirst3 : "";
5297
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_jsx_runtime17.Fragment, { children: ql.stats.map((st, si) => /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "ss-w-nba-stat", children: [
5298
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "ss-w-nba-stathd", children: [
5299
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("b", { children: nba.stat(st.stat) }),
5300
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { children: windowLabel }),
5301
+ st.rungs.some((r) => r.n < 5) ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(SmallSample, { ui }) : null
5302
+ ] }),
5303
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "ss-w-nba-ladder ss-w-nba-ladder--q", children: [
5304
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "ss-w-nba-row", children: [
5305
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-nba-hd", children: nba.line }),
5306
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", {}),
5307
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", {}),
5308
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-nba-hd ss-w-nba-n", children: nba.price })
5309
+ ] }),
5310
+ st.rungs.map((r, ri) => /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "ss-w-nba-row", children: [
5311
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-nba-at", children: nba.over(nba.lineText(r.at)) }),
5312
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-nba-meter", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { style: { width: r.n > 0 ? `${r.hits / r.n * 100}%` : "0%" } }) }),
5313
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-nba-n", children: nba.hitsOf(r.hits, r.n) }),
5314
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-nba-pcell", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(NbaPrice, { vm, selectionKey: r.selectionKey, ui, slip }) })
5315
+ ] }, `${r.selectionKey}:${ri}`))
5316
+ ] })
5317
+ ] }, `${st.stat}:${si}`)) });
5318
+ }
5319
+ function NbaSettleRecapBody({ sr, ui }) {
5320
+ const nba = ui.nba;
5321
+ const result = { over: nba.resultOver, under: nba.resultUnder, push: nba.resultPush, void: nba.resultVoid };
5322
+ const { over, under, pushes, voids } = sr.summary;
5323
+ const summary = [
5324
+ `${nba.resultOver} ${over}`,
5325
+ `${nba.resultUnder} ${under}`,
5326
+ ...pushes > 0 ? [`${nba.resultPush} ${pushes}`] : [],
5327
+ ...voids > 0 ? [`${nba.resultVoid} ${voids}`] : []
5328
+ ].join(" \xB7 ");
5329
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_jsx_runtime17.Fragment, { children: [
5330
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "ss-w-nba-stathd", children: [
5331
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("b", { children: [
5332
+ nba.settled,
5333
+ " ",
5334
+ sr.finalScore
5335
+ ] }),
5336
+ sr.lineBasis === "last_before_tip" ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { children: nba.lastLineBeforeTip }) : null
5337
+ ] }),
5338
+ sr.players.map((p) => /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "ss-w-nba-sr-player", children: [
5339
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { className: "ss-w-nba-who", children: p.playerName }),
5340
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "ss-w-nba-sr", children: [
5341
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "ss-w-nba-row", children: [
5342
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", {}),
5343
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-nba-hd ss-w-nba-n", children: nba.line }),
5344
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-nba-hd ss-w-nba-n", children: nba.actual }),
5345
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", {})
5346
+ ] }),
5347
+ p.lines.map((l, i) => /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "ss-w-nba-sr-line", children: [
5348
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { children: nba.stat(l.stat) }),
5349
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-nba-n", children: nba.lineText(l.line) }),
5350
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-nba-n", children: l.actual === null ? "\u2014" : nba.lineText(l.actual) }),
5351
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "ss-w-nba-res", "data-result": l.result, children: result[l.result] })
5352
+ ] }, `${l.stat}:${i}`))
5353
+ ] })
5354
+ ] }, p.playerId)),
5355
+ sr.morePlayers > 0 ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { className: "ss-w-nba-more", children: nba.morePlayers(sr.morePlayers) }) : null,
5356
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { className: "ss-w-nba-sr-sum", children: summary })
5357
+ ] });
5358
+ }
5175
5359
  function TeammateOut({ vm, to, ui, slip }) {
5176
5360
  const nba = ui.nba;
5177
5361
  const first = to.rows[0];
@@ -5358,6 +5542,20 @@ function NbaCard({ vm, ui, slip, monitor }) {
5358
5542
  body = /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(LineMove, { vm, lm: ev.lineMove, ui, slip });
5359
5543
  foot = [nba.lineMoveKey];
5360
5544
  break;
5545
+ case "matchup":
5546
+ body = /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(NbaMatchupBody, { mu: ev.matchup, ui });
5547
+ foot = [];
5548
+ break;
5549
+ case "quarter_ladder":
5550
+ body = /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(NbaQuarterLadderBody, { vm, ql: ev.quarterLadder, ui, slip });
5551
+ foot = [];
5552
+ break;
5553
+ case "settle_recap":
5554
+ body = /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(NbaSettleRecapBody, { sr: ev.settleRecap, ui });
5555
+ foot = [];
5556
+ break;
5557
+ default:
5558
+ return null;
5361
5559
  }
5362
5560
  return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "ss-w-nba-card", "data-kind": ev.kind, children: [
5363
5561
  /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(Head, { vm, chip, ui, monitor }),
@@ -7436,6 +7634,12 @@ function Side({ abbreviation, nickname, teamName, away }) {
7436
7634
  ] })
7437
7635
  ] });
7438
7636
  }
7637
+ function lastScored(scores) {
7638
+ for (let i = scores.length - 1; i >= 0; i--) {
7639
+ if (typeof scores[i] === "number") return i + 1;
7640
+ }
7641
+ return 0;
7642
+ }
7439
7643
  function cell(value) {
7440
7644
  return typeof value === "number" ? String(value) : /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "ss-w-nbamon-dash", children: "\u2013" });
7441
7645
  }
@@ -7464,8 +7668,9 @@ function NbaMonitorCard({ match, monitor, ui, slip }) {
7464
7668
  const inPlay = live && !atBreak(match);
7465
7669
  const scored = live || match.phase === "fullTime";
7466
7670
  const kickoff = match.phase === "preMatch" && match.kickoffUtc ? ui.bettingKickoff(match.kickoffUtc) : void 0;
7467
- const periods = Math.max(REGULATION_PERIODS, b.homePeriods.length, b.awayPeriods.length);
7671
+ const periods = Math.max(REGULATION_PERIODS, b.period, lastScored(b.homePeriods), lastScored(b.awayPeriods));
7468
7672
  const columns = Array.from({ length: periods }, (_, i) => i);
7673
+ const played = (i) => !live || i < b.period;
7469
7674
  const timeouts = [
7470
7675
  { key: "away", value: b.awayTimeoutsLeft },
7471
7676
  { key: "home", value: b.homeTimeoutsLeft }
@@ -7512,7 +7717,7 @@ function NbaMonitorCard({ match, monitor, ui, slip }) {
7512
7717
  { abbreviation: b.homeAbbreviation, scores: b.homePeriods, total: match.homeScore }
7513
7718
  ].map((row) => /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("tr", { children: [
7514
7719
  /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("th", { scope: "row", children: row.abbreviation }),
7515
- columns.map((i) => /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("td", { className: inPlay && i === b.period - 1 ? "ss-w-nbamon-cur" : void 0, children: cell(row.scores[i]) }, i)),
7720
+ columns.map((i) => /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("td", { className: inPlay && i === b.period - 1 ? "ss-w-nbamon-cur" : void 0, children: cell(played(i) ? row.scores[i] : null) }, i)),
7516
7721
  /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("td", { className: "ss-w-nbamon-total", children: row.total ?? 0 })
7517
7722
  ] }, row.abbreviation)) })
7518
7723
  ] }),
@@ -12923,6 +13128,28 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
12923
13128
  .ss-w-nba-nowrow { display: grid; grid-template-columns: minmax(0,1fr) auto auto; align-items: center; gap: 10px; font-size: 13px; }
12924
13129
  .ss-w-nba-foot{font-size:11px;color:var(--ss-w-faint);line-height:1.4;border-top:1px solid var(--ss-w-line);padding-top:10px}
12925
13130
  .ss-w-nba-card .ss-w-combo-addall { align-self: stretch; }
13131
+ /* matchup, quarter ladder and settle recap (u564 lane B): the same card, ladder grid and figures as above. */
13132
+ .ss-w-nba-ladder--q{grid-template-columns:70px minmax(0,1fr) 62px 74px}
13133
+ .ss-w-nba-mu,.ss-w-nba-sr{display:grid;align-items:start;gap:8px 6px;font-size:13px;font-variant-numeric:tabular-nums}
13134
+ .ss-w-nba-mu{grid-template-columns:minmax(0,1.1fr) minmax(0,1fr) minmax(0,1fr)}
13135
+ .ss-w-nba-mu .ss-w-nba-hd{white-space:normal}
13136
+ .ss-w-nba-mu-team { display: flex; flex-wrap: wrap; align-items: baseline; gap: 2px 6px; font-size: 14px; color: var(--ss-w-ink); }
13137
+ .ss-w-nba-mu-v { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
13138
+ .ss-w-nba-mu-v b { font-size: 15px; font-weight: 700; color: var(--ss-w-ink); }
13139
+ .ss-w-nba-mu-v span, .ss-w-nba-mu-rest { font-size: 10.5px; line-height: 1.3; color: var(--ss-w-faint); }
13140
+ .ss-w-nba-mu-rest { overflow-wrap: anywhere; }
13141
+ .ss-w-nba-b2b { white-space: nowrap; }
13142
+ .ss-w-nba-mu-pos { margin: 0; font-size: 12px; line-height: 1.45; color: var(--ss-w-ink); }
13143
+ .ss-w-nba-small { display: inline-block; font-size: 10px; font-weight: 600; line-height: 1.3; color: var(--ss-w-warn); border: 1px solid var(--ss-w-warn); border-radius: 999px; padding: 0 6px; white-space: nowrap; }
13144
+ .ss-w-nba-mu-pos .ss-w-nba-small { margin-left: 6px; }
13145
+ .ss-w-nba-sr-player { display: flex; flex-direction: column; gap: 6px; }
13146
+ .ss-w-nba-sr{grid-template-columns:minmax(0,1fr) 44px 44px 54px;align-items:center}
13147
+ .ss-w-nba-sr-line { display: contents; }
13148
+ .ss-w-nba-sr .ss-w-nba-n { text-align: right; }
13149
+ .ss-w-nba-res { justify-self: end; font-size: 11px; font-weight: 600; line-height: 1.3; color: var(--ss-w-ink); border: 1px solid var(--ss-w-line); border-radius: 999px; padding: 1px 8px; white-space: nowrap; }
13150
+ .ss-w-nba-res[data-result="push"], .ss-w-nba-res[data-result="void"] { color: var(--ss-w-faint); }
13151
+ .ss-w-nba-more, .ss-w-nba-sr-sum { margin: 0; font-size: 12px; line-height: 1.4; color: var(--ss-w-faint); }
13152
+ .ss-w-nba-sr-sum { font-weight: 600; color: var(--ss-w-ink); }
12926
13153
 
12927
13154
  /* market odds card */
12928
13155
  .ss-w-mocards { display: flex; flex-direction: column; gap: 7px; }