# @sensiblestats/widget-react

## 0.88.0

### Minor Changes

- 8973968: Show team short codes in the Form & H2H block's column headers and win labels instead of repeating the full team name, falling back to the full name when no short code is known.

### Patch Changes

- Updated dependencies [8973968]
  - @sensiblestats/widget-sdk@0.58.0

## 0.87.0

### Minor Changes

- Pinned pre-match cards on the Following tab now show a collapsed Form & H2H module (last-5 form for both teams plus head-to-head record), hidden once the match goes live. Adds `formAndH2H` to the live-monitor match snapshot. widget-embed is bumped too since it depends on widget-react and widget-sdk and ships the same snapshot shape.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.57.0

## 0.86.1

### Patch Changes

- 85b742d: Fix the live-score scorers line always rendering under the away team; it now renders under whichever team actually scored, matching the match-events timeline below it.

## 0.86.0

### Minor Changes

- Club tab: full player page (photo, availability, season performance ranks, match log) and the full Stats table.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.56.0

## 0.85.0

### Minor Changes

- 3fdcc45: Add squad season stats and player detail to the Club tab.

### Patch Changes

- Updated dependencies [15439be]
  - @sensiblestats/widget-sdk@0.55.0

## 0.84.0

### Minor Changes

- Render a 2nd stat on price cards when the server sends `insights[1]`. Falls back to the single `insight` stat unchanged when a card only has one, so older payloads render exactly as before.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.54.0

## 0.83.0

### Minor Changes

- 46c5de4: Add Club tab set (Fixtures/Standings/Squad) and merge Games/Leaderboard into one segmented tab.

### Patch Changes

- Updated dependencies [ab92577]
  - @sensiblestats/widget-sdk@0.53.0

## 0.82.0

### Minor Changes

- 23f02dd: Today tab: Your/Top leagues now shows up to 3 inline fixture rows per league (capped at a 12-row
  section budget) instead of a bare tile, with an "All fixtures (N)" link into the league detail
  view. A league over the row budget, or whose only matches just went live, still falls back to a
  tile.

## 0.81.2

### Patch Changes

- Today tab search: narrow a matched group's rendered rows to only the fixture(s) whose team name matched the query, instead of every fixture in that group.

## 0.81.1

### Patch Changes

- Today tab search: searching a team name now surfaces its matched fixture as a
  tappable row grouped under its competition, instead of only the competition
  tile. Adds a clear (×) button to the search field.

## 0.81.0

### Minor Changes

- e7aa85a: Today tab redesign: live band, search, Your/Top leagues and All leagues tile grids, and a
  league-detail view with star/unstar, replacing the per-league accordion.

### Patch Changes

- Updated dependencies [e7aa85a]
  - @sensiblestats/widget-sdk@0.52.0

## 0.80.0

### Minor Changes

- Show the brand's limit message: LimitError for limit refusals, the limit_notice capability, and a status line that replaces the composer while the assistant is paused.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.51.0

## 0.79.0

### Minor Changes

- The combo card gets "Add all N to slip". It adds each leg one at a time through the same path as the leg's own button. A sign-in request, a full slip or a failed call stops the run. A suspended, closed or repriced leg is skipped. One message then says how many legs went in and names the ones that did not. It never states a slip total.

## 0.78.0

### Minor Changes

- The widget sends an entity-free `widget_open` event each time the chat panel opens (launcher, popup bubble, ask tap or a programmatic open). It is batched like the popup events, and each open is added to the user's count for the day.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.50.0

## 0.77.0

### Minor Changes

- 4420cd7: Games: Mystery Player and Career Path answer from a tap-to-pick tray of the puzzle's own pool (search still filters it), and each game screen gets its own header band coloured from the operator's theme. Squad and pool entries accept an optional `imagePath` for photo chips.

## 0.76.0

### Minor Changes

- The greeting bubble offers "3 picks, max 1.50" and "Standout matches today" ("Bugünün öne çıkan maçları") instead of the two price asks; a combo is never offered in the bubble. A tap on an ask shows the ask's own label as the user's message.

## 0.75.0

### Minor Changes

- All markets (N) under chat odds cards and an odds icon with the count on list rows; one pinned match at a time, and a pin or All markets tap opens it in Following.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.49.0

## 0.74.0

### Minor Changes

- Set the numbers: a fifth row, "BTTS picks today", with a market dropdown (BTTS, Over 2.5, Under 2.5, Double chance, Match winner), an "N ready" pill and the round send. It shows only when the server's preset grid has a `markets` section.

## 0.73.1

### Patch Changes

- Goal dashboard rows are compact cards: 60px tall with 8px corners, and a tile's badge shows as a price column on the right instead of a pill under the subtitle.

## 0.73.0

### Minor Changes

- Set the numbers: each row is now one sentence with its numbers, a "3 ready" or "ready at 4.97" line, and a round send button. The picks and combo legs no longer show inside the tool; they appear in the chat after the send. A fourth row offers a second combo that starts high ("Total 50.0 with 6 matches"). The English combo row reads "Combo of 3 paying 5.0".

## 0.72.2

### Patch Changes

- 77ecef1: Set the numbers: the numbers inside each sentence are now dropdowns instead of tap-to-cycle boxes, so it is clear they are a choice. Numbers with no picks today are marked "not today". Prices and totals with no picks cannot be chosen. A match count with no picks at the chosen total can be, and the row then says it is not available today.

## 0.72.1

### Patch Changes

- Presets: "Set the numbers" and "Build a combo" now open each row on a number that has picks. A row still starts on 1.50, 2.00, or a 3-match combo at about 5.0 when that cell exists; on a thin grid it opens on the nearest number that does, so Send is enabled instead of every row saying "Not available today." Taps, cycling and the stepper are unchanged.

  Matches: the widget no longer opens a match from any surface. Team names on insight, odds and compact odds cards, Today rows and Following cards lose the chevron and are plain text, with no button role or tab stop. `onOpenMatch` stays in the config type so hosts still compile, but it is deprecated and never called.

## 0.72.0

### Minor Changes

- Onboarding presets, stage 3: the open pick pool.

  - widget-sdk: `ComboLeg.insight` is optional and may be null; `getPricePresets` and
    `Conversation.getPricePresets(locale, { pool })` take `pool: 'open'`.
  - widget-react: a combo leg with no stat is drawn with its price and no stat line, and its slip
    selection carries no `insightId`, instead of the whole card being dropped; every chat request
    declares `price_presets_open`; the preset grid is asked with `pool=open`. Picking a combo total that exists only at another match count moves the match count to the nearest count that has it.
  - widget-embed: rebuilt against the new widget-react and widget-sdk.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.47.0

## 0.71.0

### Minor Changes

- 8fd2f53: Combo card legs now carry a match pin and no longer link to the match page: a tap on the pin adds the match to the Following tab, and the right arrow that closed the widget on a phone is gone. Adds optional `pinEnabled` to `ComboLeg`; an older server that omits it shows no pin.

### Patch Changes

- Updated dependencies [8fd2f53]
  - @sensiblestats/widget-sdk@0.46.0

## 0.70.1

### Patch Changes

- The round button stays hidden when the price-presets grid has no cell in any row, so a quiet day never opens a tool where every number is unavailable. The next panel open asks again.

## 0.70.0

### Minor Changes

- Onboarding presets, stage 2.

  - widget-sdk: `PresetGrid`, `PresetSinglesCell`, `PresetComboCell`, `PresetPick`; `Conversation.getPricePresets(locale)`
    for `GET v1/{operatorId}/price-presets`; optional `ChatInput.preset` (`ChatPreset`).
  - widget-react: a round button above Send, shown on the Chat tab once the grid answers 200, fans out
    "Set the numbers" and "Build a combo"; each opens a modal tool over the chat that disables the
    composer until it closes; a tool's Send puts the ask in the chat with the `preset` field; a combo
    card gains "Change total or matches"; the composer takes `disabled` and `onType`.
  - widget-embed: rebuilt against the new widget-react and widget-sdk.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.45.0

## 0.69.0

### Minor Changes

- 43177ff: Stage 4 live card: add `MarketOddsLiveBlock` to widget-sdk and watches support to widget-react.

  widget-sdk: `MarketOddsLiveBlock` interface (Phase, scores, MinuteLabel, IsSuspended, IsSettled, AsOfUtc, ClosedReason); `live` field on `MarketOddsCard` (null on pre-match cards, present on live cards); `WatchRef` type alias exported.

  widget-react: `WatchRef` type and `watches` option on `UseLiveMonitorOptions`; the poll loop fires when `watches.length > 0` even without user pins, passing watches alongside pins in each `getLiveMonitor` call; `liveCard` i18n keys (stale, suspended, noPrice, fullTime) in EN and TR; `MarketOddsVM.live` field mapped from the card payload.

### Patch Changes

- Updated dependencies [43177ff]
  - @sensiblestats/widget-sdk@0.44.0

## 0.68.0

### Minor Changes

- Onboarding presets, stage 1.

  - widget-sdk: `combo_card` stream event with `ComboCard`, `ComboLeg` and `ComboReplacedLeg`;
    optional `ChatInput.clientCapabilities`; `popup_ask_tap` widget event.
  - widget-react: sends `clientCapabilities: ["price_presets"]` on every chat request; draws the combo
    card (legs, prices, stats, the multiplication line, one Add to slip per leg, the server's replaced-leg note);
    a price tile's tap shows its ask as the user's bubble; the launcher bubble shows up to two price
    asks under its line.
  - widget-embed: rebuilt against the new widget-react and widget-sdk.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.43.0

## 0.67.0

### Minor Changes

- Match odds card, stage 3: a price card the server sends for the market the user bets on carries `tag: "your_market"`, and the card shows a "Your market" / "İlgilendiğin bahis" label on its market line. A card with no tag or an unknown tag shows no label.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.42.0

## 0.66.1

### Patch Changes

- Match odds card polish: a compact list price with Add to slip off has a name screen readers read, and the 1 X 2 heads are hidden from them; "Show more" moves focus to the first new row; a list price already in the slip shows a tick; the Odds tab never draws a card stat.

## 0.66.0

### Minor Changes

- Match odds card, stage 2: a price card draws its stat above the rows; a price that moved opens its history in the Odds tab instead of an odds pin; three or more price cards of one turn, one per fixture, draw as one compact list.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.41.0

## 0.65.0

### Minor Changes

- Betting insight cards show only the fact sentence. The supporting stat rows, the "This league / All comps / H2H" scope tabs and the expand/collapse arrow are gone, and the full sentence is always visible. The market accordion no longer prefixes the fact with a "Value" tag. `BettingInsight.stats`, `BettingInsight.scopes` and the `BettingInsightStat` type are removed from the SDK, and the `showStats`, `hideStats` and `accordionValueLabel` UI strings are removed; the widget no longer emits `insight_expand`.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.40.0

## 0.64.0

### Minor Changes

- Host events. `createWidgetHost()` and the `host` prop let an operator tell the widget when a slip selection is removed (`slipRemoved`), a bet is placed (`betPlaced`) and a match page is opened (`matchOpened`). `config.onOpenMatch` turns team names into links that call the operator with the match id. The "In slip" mark now belongs to the odd, so it survives closing the panel and shows on every button for that odd. New event names `slip_remove`, `bet_placed`, `match_view` and `match_open`; `match_view` is deferred and never starts a request of its own. `EventLogger.resume()` undoes `dispose()`, which stops events being dropped under React StrictMode in a development build.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.39.0

## 0.63.0

### Minor Changes

- Live match facts on the pinned live match card: the `LiveMonitorFact` type and optional `facts` on `LiveMonitorMatch`, the fact block with its odds chip and "Ask about this", and chat grounding on a tapped fact.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.38.0

## 0.62.0

### Minor Changes

- Slip events carry the pick: `slip_click` and `slip_result` now send `matchId`, `line` and `odds` from every add-to-slip call site, plus the raw `selection` label when the widget locale is English (a missing or unsupported locale counts as English). Other locales leave `selection` out because the server sends them localized labels ("2.5 Üst"); follow-up: add a raw label to the insight, odds-row and live-monitor payloads so every locale can send it. New entity-free launcher popup events (`popup_shown`, `popup_opened`, `popup_dismissed`). Dashboard tiles with `emphasis: "hero"` render as a full-width lead tile with both crests, a badge pill and the price; the badge and price text reach 4.5:1 contrast on light and dark panels, the price is announced as "Odds 1.85" in the widget language, and discovery tints skip the hero so the regular tiles keep their colour order. The live monitor no longer writes pins or polls again when a request finishes after the widget unmounts. The label-keyed `InsightMarketClicked` signal on add-to-slip is removed.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.37.0

## 0.61.3

### Patch Changes

- Guess the XI draws each line with the provider's right-to-left numbering (right back on the right). Career Path shows the player's photo once the career is solved or failed.

## 0.61.2

### Patch Changes

- Games: a provider placeholder photo (Sportmonks `placeholder.png`) now shows the player's initials or the crest shield instead of a grey silhouette.

## 0.61.1

### Patch Changes

- Beat the Grid: stat column headers show their own icon again (calendar, gloves, ball…) instead of a flag when the label is translated.

## 0.61.0

### Minor Changes

- Games: answer reveal with team crest, player photos in XI discs and quiz options, Beat the Grid header meta rendering (club crest, coach photo, country flag, full position label), comprehensive flag map additions including Congo, Kosovo, and 60+ more nationalities.

## 0.60.6

### Patch Changes

- Games: Higher/Lower buttons fit phone-width cards (icons drop and type tightens on narrow cards, stacking below 180px), and Guess the XI shows a nationality's three-letter code at a size that fits its disc when there is no flag.

## 0.60.5

### Patch Changes

- Games: send the widget language with game config, result and play requests so server-written game text (quiz questions, grid labels, stat names, hints) arrives in Turkish; Beat the Grid resolves row abbreviations and header icons from stable keys.
- Updated dependencies
  - @sensiblestats/widget-sdk@0.36.0

## 0.60.4

### Patch Changes

- Games: Higher/Lower labels stay on one line (Turkish "Daha fazla" wrapped), and the Beat the Grid board shrinks its rows so the whole grid and the search field fit on screen while the search sheet is open.

## 0.60.3

### Patch Changes

- Higher or Lower fits the widget panel: the two player cards share the available height (photos scale with them), Higher/Lower sit side by side, and a compact type scale applies on short panels, so both players and the buttons stay on screen without scrolling.

## 0.60.2

### Patch Changes

- Games hub refreshes today's points, tile status, streak and rank as soon as a fan returns from a game, instead of waiting for the 60-second poll or a tab switch.

## 0.60.1

### Patch Changes

- Localize game display names for Turkish operators; rename mystery-tiger display name to Mystery Player

## 0.60.0

### Minor Changes

- Games tab redesign: new hub (stat row, daily challenge, daily/matchday sections) and restyled game screens for all ten games. UI only; game logic and API unchanged, except that the leaderboard is also fetched when the Games tab opens (hub stat row).

## 0.59.1

### Patch Changes

- Mystery Tiger: abbreviate long position names on the comparison tiles (e.g. "Centre Forward" → "CF", "Goalkeeper" → "GK") so they fit the square, and extend the legend to explain the amber "close" tile alongside the green "match" (colour swatches).

## 0.59.0

### Minor Changes

- Games: Higher or Lower now shows a player photo (fixed 60px circle, initials fallback) in place of the ball, with Higher pinned to the top and Lower to the bottom of a full-height middle column. Mystery Tiger gains a hero card — a silhouette beside the masked profile you're hunting on, progress dots for guesses used — and reveals the mystery player's real photo (initials fallback) when the round is solved or lost. Both restyled on the `--ss-w-*` tokens; guess-and-compare mechanic unchanged.

## 0.58.0

### Minor Changes

- Fix the Daily Quiz game screen not scrolling: its root `.ss-w-dq` was omitted from the games
  scroll selector, so inside the `overflow:hidden` frame the lower questions and the Submit button
  were clipped and unreachable. It now fills and scrolls like the other game screens.

## 0.57.0

### Minor Changes

- Guess the XI now reads as a real formation: the shape is named in text (e.g. "4-3-3") and a
  position label (GK, CB, CM, ST…) sits under every flag, so the goalkeeper's end is unmistakable.
  Wrong-guess reveals show the player's surname on the pitch instead of a raw slot code.

  Games/Leaderboard tabs are now gated on the operator actually having games for the day. The games
  list endpoint returns 200 with an empty list for non-games operators (only a hard 404 means the
  feature is off), so the hook now enables the tabs from a non-empty list rather than defaulting them
  on — which had shown the tabs on every operator. Also fixes the tabs never appearing when the
  conversation initialises after first render (the one-shot fetch was dropped under StrictMode).

## 0.56.0

### Minor Changes

- Fix the daily-games layout and clarity that made them hard to play:

  - **Pinned search / input on every game.** The game screen now fills the panel with the board in an internal scroll region and the search box (or Beat the Grid's cell sheet) pinned to the bottom — no more scrolling to reach it. The typeahead menu opens upward so it is never clipped off the bottom edge.
  - **Guess the XI formation.** The goalkeeper line now sits at the bottom (football convention) so the flags read as a real formation attacking upward.
  - **Guess the XI hints on the pitch.** Earned reveals (from wrong guesses) are shown on the relevant flag — the revealed position or player name — instead of cryptic "row:col" codes like "1:1 G".
  - **Career Path & Mystery Tiger explainers.** Each now opens with a one-line "how to play"; Mystery Tiger also shows a ✓ / ▲ / ▼ key so the tiles make sense.
  - **Higher or Lower terminal.** Clearer end-of-run summary (labelled points, "correct in a row").

## 0.55.0

### Minor Changes

- ede9739: Fix the daily games resetting on the second guess, and tighten three screens to the design artifact:

  - Guard the play lifecycle against a state-losing submit response: an in-progress `postPlay` that returns no `clientStateJson` (e.g. a server-side concurrency retry) no longer wipes the board — the widget reconciles from `getGameResult` instead of rendering an empty state. (The root-cause fix is server-side; this is defence-in-depth so the board can never blank mid-game.)
  - Guess the XI pitch now reads as a football field — fixed grass-green with visible yard-lines and a halfway line, and smaller flag dots — instead of a flat dark box.
  - Mystery Tiger's first load shows one lead line above the search (no empty attribute tiles), matching the artifact; the shirt tile is labelled "Shirt" not "Kit".
  - Beat the Grid filled cells now name the placed player (compact "F. Last") above the rarity score, so the fan can see who they put where.

## 0.54.0

### Minor Changes

- c013151: Rebuild the daily game screens to match the design artifact:

  - Guess the XI now renders a real formation on the pitch (GK line at the back → forwards forward), so each flag's position is legible instead of a scatter; cut to 3 guesses.
  - Career Path wraps the club-crest sequence instead of scrolling/truncating with "+N more"; loans read as "(loan)" and years are compact.
  - Higher or Lower drops the answered-history list for the artifact's clean pair + footer chips.
  - Mystery Tiger's first load shows the five-attribute legend instead of a bare search box.

## 0.53.0

### Minor Changes

- Games data batch 2 (client surfaces):

  - Beat the Grid: the cell search now uses the club player pool carried in ConfigJson (`playerPool`), threaded through `GameScreenHost` instead of an empty list — the search box was previously always empty.
  - Mystery Tiger: each guess tile now shows the guessed player's own attribute value (e.g. "ST", a nationality flag, "22 ▲") instead of a bare glyph, falling back to the verdict glyph when no value is present.

## 0.52.0

### Minor Changes

- Club games UX batch (widget): hide the chat composer on the Games and Leaderboard tabs; show canonical game names + icons in the hub instead of the raw gameId ("beat-the-grid" → "Beat the Grid"); Higher or Lower cards no longer stretch to full height and both Higher/Lower options are neutral until picked (no pre-selected look); Career Path renders as a horizontal-scrolling strip of fixed compact crest cards instead of a wrapping squished grid; Guess the XI now renders nationality flags laid out on a pitch in formation rows with a "name the team" typeahead, replacing the raw formation-coordinate chips and the flat team-button list.

## 0.51.0

### Minor Changes

- Leaderboard: render a default state when the weekly board has no scores yet. Weekly boards reset each week, so the tab now shows a "new week, blank slate" panel (with a last-week champion strip when history exists) or a "be the first" cold-start panel, each with a CTA into the Games tab, instead of a blank screen. A configured weekly prize is shown when present. Adds optional `weeklyPrize` and `lastWeek` fields to `LeaderboardPayload` (backend populates them separately; absent = cold start).

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.35.4

## 0.50.2

### Patch Changes

- Rework the five daily game screens (Higher or Lower, Mystery Tiger, Career Path, Guess the XI, Beat the Grid) to match the design, fix unreadable answer reveals, and add the missing run-over/terminal states so a finished game no longer looks frozen.

## 0.50.1

### Patch Changes

- Fix the Games tab: opening a game now loads it. StatsWidget was not passing the conversation down to ChatPanel, so GameScreenHost had no client to fetch the game config with and every game screen was stuck on "Loading…". Thread the conversation through so drill-in, play submission, and result polling work.

## 0.50.0

### Minor Changes

- Add the four fixture-game screens to the Club Games tab — Matchday Predictor, Starting XI, Stat Ladder, and Fan MOTM — each single-submit, rendering the kickoff lock and the post-match pending/graded/voided states from the game result. Completes the 10-game widget build.

## 0.49.0

### Minor Changes

- Show every scorer on the pinned live-match card, not just the latest goal. The composer was fetching the eight most-recent events of any type, so a late run of substitutions and bookings pushed earlier goals out of the window; it now fetches the match's goals (and red cards) in full, chronologically. The scorer strip renders home and away scorers in two columns with a ⚽ between, collapses a brace onto one line ("Powell 87', 90+6'"), and marks own goals "(OG)". Adds an `ownGoal` flag to `LiveMonitorEvent` and an `ownGoalLabel` string (EN "OG", TR "KK").

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.35.3

## 0.48.10

### Patch Changes

- Drop the home/away percentage split from the live match card's momentum block — it was a share of the whole match's accumulated pressure, which reads as a verdict on the match beside a wave showing minute-by-minute swing. Follow-up question chips now left-align their text, so a question long enough to wrap no longer sets its second line ragged on both sides.

## 0.48.9

### Patch Changes

- Hide the Today tab once every match of the day has finished. Tab visibility now reads the same filtered fixture list the panel renders, so the tab can no longer open onto a blank panel.

## 0.48.8

### Patch Changes

- 324f7eb: Injuries card: order columns by home/away (home left, away right).
- Updated dependencies [324f7eb]
  - @sensiblestats/widget-sdk@0.35.2

## 0.48.7

### Patch Changes

- df7d101: Greeting discovery tiles now tint the live panel color instead of hardcoding light pastels, so an operator with a dark custom `surface` (or a dark theme) gets readable tinted-dark cards rather than near-white text on fixed light pastel backgrounds.

## 0.48.6

### Patch Changes

- Today tab: mirror the away team around the score — crest on the outer (right) edge, name right-aligned — so each fixture row reads symmetrically like a scoreboard. Applies to both the live band and the competition accordions.

## 0.48.5

### Patch Changes

- A suspended selection no longer appears in the market-odds ladder. The wire row now carries isSuspended, so the client can drop prices the bookmaker is not taking instead of offering an Add to slip button that always fails.
- Updated dependencies
  - @sensiblestats/widget-sdk@0.35.1

## 0.48.4

### Patch Changes

- A suspended market no longer appears on the live match card. The whole betting line is dropped rather than showing a price the bookmaker is not taking next to an Add to slip button that can only fail.

## 0.48.3

### Patch Changes

- A finished match now leaves the Today tab instead of showing an FT badge. The schedule endpoint already excludes terminal matches, but a cached schedule kept them on screen for the rest of the session.

## 0.48.2

### Patch Changes

- A match that finished more than three and a half hours ago now shows FT and its score instead of its kickoff time and a dash. The Today tab stopped asking about a match once a fixed window after kickoff elapsed, so on a cold load the earliest of the day's matches never had a state at all.

## 0.48.1

### Patch Changes

- A live match no longer loses its minute and drop out of the live section just because its score has not changed recently. The per-match staleness check read a last-changed timestamp as if it were a last-polled one.

## 0.48.0

### Minor Changes

- Today-tab fixture rows now read like a scoreboard: the score sits between the two teams instead of after them, a finished match shows FT (MS in Turkish) in place of its kickoff time, and a finished match no longer offers a pin unless it is already pinned.

## 0.47.2

### Patch Changes

- Hide a Today-tab competition group whose every match has been hoisted into the live band, instead of rendering an empty header with a count of 0.

## 0.47.1

### Patch Changes

- A match whose live reading has gone stale now leaves the live band as well as losing its clock,
  with the band and the competition group deciding from one shared predicate so it can never fall
  between them.

## 0.47.0

### Minor Changes

- Shows a half-time label instead of a frozen 45', ages the live minute against when the reading was
  actually taken so it no longer sits up to two minutes behind, and stops asserting a clock for a
  single match whose sync window has stalled.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.35.0

## 0.46.0

### Minor Changes

- Fixes the Today tab collapsing to blank bars: children of the monitor scroller no longer shrink,
  so the list scrolls instead of compressing 27 competition groups to fit. Also disambiguates
  same-named competitions with their country, which the schedule response now carries.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.34.0

## 0.45.0

### Minor Changes

- Adds a Today tab showing live and today's fixtures grouped by competition, and makes the tab
  strip content-driven: Chat, Today, Following and Odds each render only when they have something.
  The `tabMatches` UI string is renamed `tabFollowing`.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.33.0

## 0.44.0

### Minor Changes

- Widget interest-event logging (u354): the widget now emits explicit interaction events — pin/unpin, add-to-slip (with outcome), "more insights" expand, and dashboard tile taps — batched to the operator gateway's `/v1/{op}/events` route for personalization. Best-effort in-memory delivery with a keepalive unload flush; no behavioural change to existing pin/slip/expand actions.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.32.0

## 0.43.1

### Patch Changes

- Don't offer a tap on a suspended accordion market. Its card is unservable — the odds lookup drops every suspended/stopped row, so the detail request answers 404 and the panel lands on a tap-to-retry that can never succeed. The row stays listed and labelled; it just isn't expandable, and a market that suspends while open now collapses instead of leaving stale rows up.

## 0.43.0

### Minor Changes

- Betting cards (insight, market-odds, odds-movement) now render a server-supplied `kickoffLabel`
  in the operator's timezone and language when present, falling back to browser-zone formatting of
  `kickoffUtc` for older servers.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.31.0

## 0.42.0

### Minor Changes

- Two-tier layout for betting-insight cards so nothing truncates on a narrow panel: the competition, kickoff and match pin sit on a quiet meta line above a full-width fixture line (long club names no longer clip), and the market label gets its own line above the selection · odds · slip · pin pick row. The market-odds card's fixture line adopts the same hero weight so both card types read consistently.

## 0.41.0

### Minor Changes

- 286bdc0: Add a match pin to the chat market-odds card. The card now mirrors the two-pin betting-insight card: the header pin tracks the match, and a second pin on the market line tracks the odds. The live odds panel is unchanged — it keeps its single market pin.

## 0.40.0

### Minor Changes

- Greeting dashboard tiles can now carry an opaque `actionRef`: when the server binds a tile to a tool, a tap forwards the ref (resolved server-side, skipping the LLM planning turn) and `actionValue` stays as the fallback. Adds `actionRef` to `GreetingDashboardTile`; `MessageList` forwards it on tap when present.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.30.1

## 0.39.1

### Patch Changes

- 428171d: Fix dead scroll space below the chat: the top-anchor spacer was reserved even when a turn was first shown already-complete (panel opened after the greeting finished, or a restored/cross-tab-synced conversation), leaving a full viewport of blank scrollable space. It is now reserved only while a turn is actively streaming. Also adds `overscroll-behavior: contain` to the message list and drops the `+` icon from the "New conversation" menu item.

## 0.39.0

### Minor Changes

- a5e97e2: Move the "New conversation" header action into a kebab (⋮) overflow menu, keeping Close as a one-tap control. The menu opens on click, closes on Escape, outside-click, or selection, and manages focus for keyboard users.

## 0.38.0

### Minor Changes

- Persist the chat conversation in the browser for a sliding hour: on return within the hour the widget silently restores the prior thread (and continues the same server thread), otherwise it starts fresh. Adds a "New conversation" control to clear and start over. Client-only (localStorage); no SDK or server change. Conversations now sync live across open browser tabs (a write or "New conversation" in one tab mirrors into the others).

## 0.37.3

### Patch Changes

- Odds tab: show a single market-odds card per pin instead of a card-inside-a-card. The fixture/date is no longer duplicated — each pinned market renders one betting card (competition, fixture, market, odds) with the unpin in its own header, plus a slim live strip (score, minute, suspended/settled) shown only for in-play markets and hidden for pre-match. The unpin threads the exact stored pin key so it always removes the right pin.

## 0.37.2

### Patch Changes

- Match odds accordion: add a per-row market pin. Each accordion market row now shows the PinToggle on the right of its header (visible collapsed or expanded); tapping pins that market ({kind:'market', matchId, marketDeveloperName}) to the Odds tab, mirroring the pin on chat betting cards. The row header splits into an expand button + the pin button so the two actions stay independent.

## 0.37.1

### Patch Changes

- Match odds accordion polish: add a gap between the pinned-match card and the accordion; keep the "Add to slip" button on one line (long selection labels wrap instead); and render the expanded odds card bare inside the accordion so odds rows aren't double-bordered (the standalone market-odds card on the Odds/Chat tabs keeps its border).

## 0.37.0

### Minor Changes

- 8d25f74: Match odds accordion: pinned matches on the Matches tab now show a browsable accordion of every priced market instead of a single 1X2 card. Odds load lazily on expand and refresh live while open; each market surfaces its value insight. Adds `conversation.getMarketOdds` and `availableMarkets` on the live-monitor snapshot; removes the snapshot's `mainMarket`.

### Patch Changes

- Updated dependencies [8d25f74]
  - @sensiblestats/widget-sdk@0.30.0

## 0.36.0

### Minor Changes

- Add a `pinIcon` config option (`'pin' | 'star' | 'bookmark'`, default `'pin'`, embed `data-pin-icon`) to choose the glyph used for the match/odds save toggle. All three render as an outline when unpinned and fill on the accent circle when pinned; the default pin keeps its existing shape.

## 0.35.1

### Patch Changes

- 1210539: Add a one-shot launcher attention animation: on first load the chat icon nudges, then the greeting bubble types itself in, then everything settles. Runs once per page (a refresh replays it) and is fully suppressed under `prefers-reduced-motion`, where the greeting is shown statically. No config or API change.

## 0.35.0

### Minor Changes

- 0e4d098: Remove the "Powered by SensibleStats" attribution footer and the `attribution` config option. The footer no longer renders and `attribution` / `data-attribution` are no longer read.

## 0.34.0

### Minor Changes

- 0ecfaf5: Operator branding: the embed snippet / React props now accept `logoUrl`
  (replacing the SS mark in the header and launcher, with a fallback to the SS
  mark on a missing/broken URL), `headerTitle`, a curated brand palette
  (`cta`, `surface`, `ink` alongside the existing `accent`; a `surface`+`ink`
  pair also adapts the derived neutrals), and `attribution` (defaults to on;
  set `data-attribution="false"` to remove the "Powered by SensibleStats"
  credit).

## 0.33.3

### Patch Changes

- Club match-preview tap: render the voiced lead at regular weight (not semibold) via a greetingIsLead flag, so it reads as a sentence rather than a heading.

## 0.33.2

### Patch Changes

- 2d55861: Betting cards: drop the league name from the header when a team pair fills it. The demoted competition now shows as its crest only, with the name kept in the meta title tooltip so it stays discoverable. Frees space in the tight header; the competition-as-hero case (no team pair) still shows the name.

## 0.33.1

### Patch Changes

- c60b673: Club widget now swaps the live dashboard for the post-match dashboard when a match ends, instead of leaving the last live card frozen on screen.

## 0.33.0

### Minor Changes

- Live monitor's momentum block gets a localized "Momentum" title with the home/away pressure split (styled like the card's other stat rows), and its end-of-series marker is now an HTML overlay dot instead of an SVG `<circle>` -- the wave's `preserveAspectRatio="none"` scaling was stretching the circle into a squashed, half-clipped oval. `LiveMonitorMatch` gains an additive `momentumHomePct` field.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.29.0

## 0.32.1

### Patch Changes

- Fix market-odds and odds-movement rows doubling the line for localized selections that already embed it (e.g. TR "2.5 Üst" rendering as "2.5 Üst 2.5"). Extracts the dedupe guard already used by betting-insight cards into a shared helper so all three selection/line join sites stay in sync.

## 0.32.0

### Minor Changes

- Crest images on market-odds cards and restructured Odds-tab context line with pre-match kickoff pill layout.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.28.0

## 0.31.1

### Patch Changes

- Live monitor fixes from oleycom live testing: hide the score on not-started matches (Odds-tab context line phase guard), wrap long club names to two lines on the match card instead of truncating, and keep the context-line score/badges from wrapping on narrow screens.

## 0.31.0

### Minor Changes

- Live monitor tabs (u322): pin markets/matches from betting cards into Matches/Odds tabs with a batched live poll; pinEnabled flag on betting cards; monitor types + /live-monitor transport.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.27.0

## 0.30.0

### Minor Changes

- 9d0b409: Replace the pre-match fixture card's W/D/L letter pills with a two-column "Team form" card: each of the last five results renders as a coloured scoreline card (subject crest, score, opponent crest), oriented by which side the team played on. `FixtureCardData.homeForm`/`awayForm` change from `string[]` to a new `FormMatch[]` shape (`result`, `teamScore`, `oppScore`, `teamIsHome`, `opponentCrestUrl`).

### Patch Changes

- Updated dependencies [9d0b409]
  - @sensiblestats/widget-sdk@0.26.0

## 0.29.5

### Patch Changes

- 5ab3370: FixtureCard is now a plain DataCard on the wire (no actionLabel/actionRef/actionType/rank) — the server stopped issuing a match-preview binding for it now that the greeting chips own the compare-form/match-preview action (u318). No visual change; the type-only update keeps `@sensiblestats/widget-react` and `@sensiblestats/widget-embed` in lockstep with the SDK's contract.
- Updated dependencies [5ab3370]
  - @sensiblestats/widget-sdk@0.25.3

## 0.29.4

### Patch Changes

- 2740025: Refine three pre-match dashboard cards: the Next-up fixture card drops the DATE/VENUE labels for a single centred kickoff·venue line and no longer shows a Compare-form CTA or acts as a tap target (the greeting chips already own that action); the Last-five rows gain a team crest beside each name; and the Injuries card caps each side at three with a See-more toggle so a long list can't push the input off-screen.

## 0.29.3

### Patch Changes

- aed14de: Redesign the club post-match dashboard cards: result card now shows team crests and a big score, goals card shows per-goal icons, stats card renders split comparison bars oriented by venue, and top performer / next fixture cards get a player avatar and next-opponent teaser. Adds crest URLs and numeric stat fields to the widget-sdk post-match types backing these cards.
- Updated dependencies [aed14de]
  - @sensiblestats/widget-sdk@0.25.2

## 0.29.2

### Patch Changes

- 4eed68b: Fix the post-match "Match stats" card rendering each team's stats under the opposite team. The row values are club-first, but the card was always drawing the club value on the left while the result card above renders home-left/away-right — so when the club played away (e.g. Liverpool at Ipswich) the club's stats appeared under the home team. The card now orients by venue via a new `clubIsHome` field, matching the result card.
- Updated dependencies [4eed68b]
  - @sensiblestats/widget-sdk@0.25.1

## 0.29.1

### Patch Changes

- 33dacf8: Restore the live club dashboard cards to the approved mockup's sizing and detail: a larger 36px scoreline, 38px crests with a soft drop shadow, 15px team names and stat values, the timeline's football-style goal mark (was a plain dot), and the momentum wave's full 56px height (was vertically squashed at 50px). Also adds a `club-fandash-live` devserver scenario so the live phase can be previewed without a live match.

## 0.29.0

### Minor Changes

- f3f845c: Auto-transition the club fan dashboard from preMatch to live without a reload.

  Widget SDK: mirror the live dashboard's server contracts — `LiveScoreData` gains
  `minute`/`clockRunning`/crest URLs, `LiveEventLine` gains a typed `minute`/`type`/`side`
  (plus optional `player`/`playerOff`), `LiveStatRow` gains numeric `clubNum`/`oppNum`,
  and `LiveStatsData` gains a typed `momentum: MomentumPoint[]` series plus a
  `clubIsHome`/`homeName`/`awayName` venue signal (mirroring the existing `ClubIsHome`
  pattern on `RestingNextData`/`PostMatchNextData`).

  Widget React: adds a `useLiveClock` hook that ticks the displayed live minute forward
  once per real minute between 60s polls, so the clock doesn't look frozen. The tick is
  capped at minute+15 so a stuck `clockRunning:true` (no live→postMatch transition landed)
  holds instead of climbing past stoppage time.

  Widget React: redesigns the live score card — team crests (falling back to a coloured
  initials chip when a crest URL is missing or fails to load), a pulsing Live pill wired
  to the ticking clock, and a scorers line derived from the timeline's goal events.
  Introduces the shared `--ss-w-home`/`--ss-w-away`/`--ss-w-track` colour tokens the
  timeline and stats cards will also use.

  Widget React: redesigns the live events timeline into a compact two-sided view — each
  club's events sit on their own side of a centre spine, most-recent 3 shown with a "See
  more" toggle for the rest. Goals get a bold name and an accented minute badge, yellow/red
  cards get a coloured card mark, substitutions show both players, and unrecognised event
  types fall back to a neutral dot instead of breaking.

  Widget React: redesigns the live stats card — every row is now a home/away split bar
  (guarded against a 0/0 stat, which renders an even split rather than a NaN width) plus
  a new `MomentumWave` component that plots the per-minute momentum series as a filled
  area wave with a dashed baseline and a "now" dot, falling back to the plain-text
  momentum label when no series is available. Both the split bars and the wave now
  colour by VENUE (`--ss-w-home`/`--ss-w-away`, keyed off the new `clubIsHome` field) so
  the same team reads as the same colour across the score, timeline, and stats cards —
  club-positive momentum fills with the club's own venue colour rather than always
  painting the club as "home". The colour legend uses the real home/away team names.

  Widget React: the 60s live poll now refreshes the dashboard's greeting/lead line
  alongside its cards, so it no longer goes stale (e.g. reading "0–0" while the score
  card already shows "0–2"). A poll response without a greeting leaves the existing
  one in place rather than clearing it.

### Patch Changes

- Updated dependencies [f3f845c]
  - @sensiblestats/widget-sdk@0.25.0

## 0.28.0

### Minor Changes

- Betting-insight card redesigned to one action line: the fixture (team pair, or prose string, else competition) becomes the header hero, the competition and kickoff demote to the header-right meta, and market · selection · odds · Add-to-slip render together on a single action row.

## 0.27.0

### Minor Changes

- Entity-card stat-strip redesign: the player/team card renders as a horizontal stat strip instead of vertical stat rows, a W-D-L stat renders as a bar with the record as its label, competition scope tabs move above the strip, and the season chip is pinned to the top-right of the header.

## 0.26.2

### Patch Changes

- Fix the new-turn scroll anchor jumping to the bottom on a follow-up send after tall content (e.g. tapping a chip below a club dashboard). Reserve a viewport of space below the new turn while it streams so its start can actually reach the top of the panel, then collapse the space once the turn completes. The turn's start now stays pinned to the top through the whole reply instead of the view following the stream to the bottom.

## 0.26.1

### Patch Changes

- Keep the start of a new turn in view instead of scrolling to the bottom of the reply. When a response arrives the message list now pins the start of the turn to the top — the user's question for a normal turn, or the assistant message itself for an auto-greeting or greeting dashboard — so a long answer reads from its beginning rather than landing the reader on its last line.

## 0.26.0

### Minor Changes

- Add live (in-play) club dashboard cards (score/clock, event timeline, live stats) that self-refresh by polling every 60s.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.24.0

## 0.25.0

### Minor Changes

- 57112ca: Add resting (between-matches) club dashboard cards: next up, standings, season so far, recent form.

### Patch Changes

- Updated dependencies [57112ca]
  - @sensiblestats/widget-sdk@0.23.0

## 0.24.0

### Minor Changes

- 04c6e5b: Add post-match club dashboard cards (result, goals, stats, top performer, what's next); the three interactive cards tap through via actionRef.

### Patch Changes

- Updated dependencies [04c6e5b]
  - @sensiblestats/widget-sdk@0.22.0

## 0.23.1

### Patch Changes

- a1d4987: Fan-dashboard fixture and congested-week card taps now send the card's opaque `actionRef` alongside its `actionLabel`, so the server resolves the pre-issued action binding for that card instead of re-planning a prose command.
- Updated dependencies [a1d4987]
  - @sensiblestats/widget-sdk@0.21.0

## 0.23.0

### Minor Changes

- 008d361: Render the club fan pre-match dashboard: fixture, countdown, injuries, reason-to-bet, where-to-watch, congested-week, transfers and links cards, with the fixture/congested-week cards tappable via the existing send path. Re-bundle widget-embed for the widget-react/widget-sdk changes.
- Club fan pre-match dashboard: render server-owned localized labels only (no widget-side i18n) and restructure the cards. The SDK contract now carries every visible string (date/venue/form labels, head-to-head labels, countdown unit labels, injury empty/return labels, link labels, self-contained injuries with team names/crests). Cards are reworked — countdown leads with a state-based clock, the fixture splits into fixture/last-five/head-to-head, injuries gains team-headed columns with a divider, link tiles are filled. Re-bundle widget-embed for the widget-react/widget-sdk changes.

### Patch Changes

- Updated dependencies [008d361]
- Updated dependencies
  - @sensiblestats/widget-sdk@0.20.0

## 0.22.0

### Minor Changes

- Remove club match-day dashboard renderers and SDK types. The server no longer emits the `clubDashboard` block; the corresponding widget renderers, CSS, and SDK type union are stripped in this forward bump.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.19.0

## 0.21.0

### Minor Changes

- Match Preview card: deterministic matchPreviewCard block type (sdk) + renderer (react).

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.18.0

## 0.20.0

### Minor Changes

- Club-dashboard taps (FixtureHero CTA, MatchPreview/TeamDna facts) now send the backend's opaque `actionRef` instead of a prose command, and `useChatStream` gains a client-side fallback timeout so the panel can no longer hang forever waiting for a `turn_complete`/`error` that never arrives.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.17.0

## 0.19.0

### Minor Changes

- fc2e383: Align the betting insight and market-odds cards to one visual language: a league + kickoff header, team names and market name below, clean borderless odds, a single expand arrow for the reason/stats, monogram fallback when a crest fails to load, and a wider desktop chat panel. Drop the "Market prices" pill from the market-odds card.

## 0.18.0

### Minor Changes

- Fact-grounded club dashboard taps: per-fact renderers are now individually tappable and send their grounding back with the chat message.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.16.0

## 0.17.0

### Minor Changes

- 5fd5471: Redesign the betting insight card: crest-led three-row layout with competition logo, kickoff time and a bar-chart reasoning strip.

### Patch Changes

- Updated dependencies [5fd5471]
  - @sensiblestats/widget-sdk@0.15.0

## 0.16.0

### Minor Changes

- 399d6bf: Label market-floor betting insight cards with a distinct "Market price · not a value pick" pill, so a screenshot of one can never read as a recommendation. Older servers that never send `isMarketFloor` render cards exactly as before.

### Patch Changes

- Updated dependencies [399d6bf]
  - @sensiblestats/widget-sdk@0.14.0

## 0.15.0

### Minor Changes

- Render the Club Match-Day dashboard (typed blocks: greeting header, fixture hero, form guide, match preview, team DNA, countdown) delivered on `turn_complete.clubDashboard`.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.13.0

## 0.14.1

### Patch Changes

- 5dce658: Greeting dashboard UX refinements from design review: tile icons are now
  emoji (matching the betting mockup) rendered at a larger size instead of the
  small monochrome line glyphs; the greeting bubble text is suppressed when a
  dashboard is present so the question shows once (as the dashboard title)
  rather than twice; and the discovery full-span trends tile aligns its icon
  and title on a single row.

## 0.14.0

### Minor Changes

- Render the greeting dashboard carried on `turn_complete`: tile grid, CSS, and tap handling that turns a tile into a follow-up chat message. Older servers that never send `dashboard` render nothing new. `widget-embed` also now generates and persists a first-party anonymous visitor id (localStorage, falls back to in-memory) so greeting dashboards can be tiered for anonymous visitors.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.12.0

## 0.13.1

### Patch Changes

- Odds movement chart: drop the direction clause from the chart's `aria-label` when the price is flat. It used to read "…currently 1.44, ." — a screen reader announced the dangling punctuation on exactly the no-movement case.

## 0.13.0

### Minor Changes

- Odds movement price chart card (SP4 widget half).

  - `widget-sdk`: `odds_movement` chat event — `OddsMovementCard`, `OddsMovementPoint`, `OddsMovementEventData`.
  - `widget-react`: renders the card — a time-proportional inline SVG price chart with bookmaker, direction badge, suspended state and excluded-observation disclosure.
  - `widget-embed`: re-bundles `widget-react`, so it ships the new card too.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.11.0

## 0.12.0

### Minor Changes

- 3c93b88: Show odds movement on betting insight cards, using the same markup and neutral styling as market-odds rows.

  The movement markup moves into a shared component and its CSS classes are renamed from `ss-w-mo-move` / `ss-w-mo-prev` / `ss-w-mo-arrow` to `ss-w-move` / `ss-w-move-prev` / `ss-w-move-arrow`, since the same element is now rendered by both card types. Operator stylesheets targeting the old names need updating.

### Patch Changes

- Updated dependencies [3c93b88]
  - @sensiblestats/widget-sdk@0.10.0

## 0.11.0

### Minor Changes

- Neutral odds price-movement display on market_odds card rows.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.9.0

## 0.10.1

### Patch Changes

- Fix single-league entity-card header overflow: a long competition name (e.g. "UEFA Europa Conference League") no longer wraps the season pill onto a second line. The competition name now truncates with an ellipsis (full name kept as a `title` tooltip) while the season pill stays pinned on the same row.

## 0.10.0

### Minor Changes

- Redesign team/player entity cards and polish the betting cards.

  - Entity cards adopt an identity-hero layout: crest-led identity block beside a tabbed stats panel. Competition chips become an underline tab strip on top of the stats they switch, with the season pill (shortened to `26/27`) on that row. The W-D-L record renders as a proportional win/draw/loss form bar. Single-competition cards show a static league label; zero-scope cards fall back to a bare avatar+name row.
  - Market odds cards drop the "updated HH:MM" line.
  - Betting insight cards move the add-to-slip button beside the top-right odds box (and free its toast from the narrow column so text no longer clips), and relocate the fixture (team names) and competition under the market name, with the league on its own line.

## 0.9.0

### Minor Changes

- Entity cards now show the season and per-competition scope chips. `EntityCard`
  drops the flat `stats` field in favor of `seasonName` + `scopes` (`All` aggregate
  plus one scope per competition, each with an optional logo); the widget renders a
  season label and, for 2+ competitions, a chip row that switches the stat set
  client-side. `widget-embed` re-bundles `widget-react`, so it is republished too.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.8.0

## 0.8.0

### Minor Changes

- 8af5152: Render the new market_odds card: hero main-line rows, collapsible ladder with per-row add-to-slip, bookmaker/updated footer. Older servers simply never emit the event; older widgets ignore it.

### Patch Changes

- Updated dependencies [8af5152]
  - @sensiblestats/widget-sdk@0.7.0

## 0.7.2

### Patch Changes

- Redesign the betting insight card for clarity. The market/selection is now the visual hero, the odds token is unmistakable (legible `ODDS` label + larger value, boxed and tinted). Stats and scope chips are collapsed by default behind a `Show stats` toggle — the reason-to-bet prose carries the justification, and the numbers are one tap away. When expanded, all stat rows show at once (the old three-row `Show N more` cap is removed) and the `This League / All comps / H2H` scopes render as a segmented control. Add to slip stays visible whether stats are open or closed. Adds `showStats` / `hideStats` UI strings (en + tr) to `UiConfig`.

## 0.7.1

### Patch Changes

- Give the add-to-slip button its own CTA color token (`--ss-w-cta` / `--ss-w-cta-ink`, gold in both themes) instead of reusing the brand accent, so the primary action stands out on the betting insight card.

## 0.7.0

### Minor Changes

- Add to slip on betting insight cards.

  The operator supplies an `onAddToSlip` callback; the widget hands it one selection
  keyed by `matchOddsId` (the operator's own odds-row id) and maps the callback's
  typed result to a localized (en/tr) toast. Two server fields drive it:
  `odds.matchOddsId` and the per-operator gate `addToSlipEnabled` — the button
  renders only when the gate is true, a handler is supplied, and the insight carries
  a usable odds id. The widget never touches stake, balance, or bet placement.

  - **widget-sdk:** add `SlipSelection`, `AddToSlipResult`, `AddToSlipRejectReason`,
    and the `isAddToSlipResult` runtime guard; extend `BettingInsight` with
    `addToSlipEnabled` and `odds.matchOddsId`.
  - **widget-react:** add `AddToSlipButton` and `Toast`, the `slip.ts` result→toast
    mapping (which honours `price_changed.accepted`), en/tr copy, `conversationId`
    capture on `turn_complete`, and the `onAddToSlip` config entry. Malformed
    results, throws, and a 10s timeout all fail closed to a retryable button.
  - **widget-embed:** re-bundles widget-react, so it is republished. Add-to-slip is
    not exposed to script-tag hosts, because a callback cannot be expressed in a
    `data-*` attribute.

  This shipped to master in `dd2da0e1` (#248) but never reached npm, because the
  version was not bumped in the merged commit and the release workflow's
  `--tolerate-republish` therefore skipped every package.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.6.0

## 0.6.1

### Patch Changes

- Stop rendering generic entity cards. Any entity that isn't a team or a player
  (coach, referee, stadium, competition) previously fell through to a low-value
  "generic" card with no identity signal; those are now dropped at the reducer so
  only team and player cards render. The generic rendering path is left intact so
  a purpose-built variant can re-enable it later. widget-embed re-bundles
  widget-react, so it must be republished too.

## 0.6.0

### Minor Changes

- Show competition name on betting insight cards. This shipped to master in
  `6d629e6b` but never reached npm because the version wasn't bumped, so the
  release workflow's `--tolerate-republish` skipped every package. This changeset
  bumps all three so the change actually publishes (widget-embed re-bundles
  widget-react, so it must be republished too).

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.5.0

## 0.5.0

### Minor Changes

- Redesigned betting-insight card with scoped supporting stats.

  - **widget-sdk:** extend `BettingInsight` with `homeTeamName`, `awayTeamName`, and `scopes` (`{ key, label, stats }[]`), so consumers can type the fixture line and the per-scope stat sets (this league / all competitions / head-to-head) the server now streams.
  - **widget-react:** rebuild the betting card around the new payload — a phase-aware live/pre-match status line with the fixture, a promoted market with clearly labeled odds (and an optional bookmaker name), and scope chips that switch the supporting stats in place (shown only when ≥2 scopes are present, otherwise flat stat rows with a "show more" expander). The responsible-gambling disclaimer always renders. Type scale and spacing match the surrounding chat cards.
  - **widget-embed:** rebuild against `@sensiblestats/widget-react` so the hosted embed renders the redesigned card.

### Patch Changes

- Updated dependencies
  - @sensiblestats/widget-sdk@0.4.0

## 0.4.0

### Minor Changes

- Render `betting_insight` events as insight cards (market, selection + line, odds with an optional live badge, supporting stats, and the responsible-gambling disclaimer). **Bug fix:** the reducer previously had no case for `betting_insight` and no fallthrough, so any unmodelled event returned `undefined` and corrupted state — the next event then crashed the widget (`Cannot read properties of undefined (reading 'length')`). Unknown event types are now ignored safely and can never break the UI.

## 0.3.0

### Minor Changes

- Entity cards are no longer clickable — they render as static info cards
  (planned to return later with proper question composition). Fix iOS Safari
  zooming on input focus (textarea font-size ≥ 16px on touch). Fix the message
  list yanking the reader to the bottom when late content (suggested actions)
  arrives after they scrolled up — auto-scroll now follows only while pinned to
  the bottom. Also ships the i18n/localized labels and logo refactor from master.

## 0.2.0

### Minor Changes

- Add an auto-greeting: set `greetingMessage` (e.g. `"hello"`) and the widget silently sends it on load, surfacing the response — with suggested actions — as a dismissable launcher popup that clears when the panel opens. Also fixes two bugs: the launcher button is now hidden while the panel is open, and the mobile panel no longer pushes the text input off-screen when the keyboard/URL-bar shrinks the viewport (fills via `inset` instead of a fixed `100vh`).

## 0.1.1

### Patch Changes

- Republish with the `@sensiblestats/widget-sdk` dependency resolved to a real `^0.2.0` range. The `0.1.0` tarball shipped an unusable `workspace:^` range (npm fails with `Unsupported URL Type "workspace:"`); the release workflow now publishes via yarn, which rewrites workspace ranges to concrete versions.

## 0.1.0

### Minor Changes

- 5857cb0: First published release of `StatsWidget`, the SensibleStats embeddable chat widget for React. Streams operator chat over the widget gateway and renders rich entity cards (image, subtitle, season stats), suggested action buttons, intent chips, and markdown answers with horizontally-scrollable tables. Theme-aware (light/dark/auto), style-isolated via injected CSS, and built on `@sensiblestats/widget-sdk`.

### Patch Changes

- Updated dependencies [5857cb0]
  - @sensiblestats/widget-sdk@0.2.0
