@sensiblestats/widget-react 0.72.1 → 0.73.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @sensiblestats/widget-react
2
2
 
3
+ ## 0.73.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 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".
8
+
9
+ ## 0.72.2
10
+
11
+ ### Patch Changes
12
+
13
+ - 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.
14
+
3
15
  ## 0.72.1
4
16
 
5
17
  ### Patch Changes
package/dist/index.cjs CHANGED
@@ -167,7 +167,10 @@ var STRINGS = {
167
167
  dialName: "Set the numbers and Build a combo",
168
168
  maxPriceRow: "{count} picks, max {price}",
169
169
  minPriceRow: "Picks from {price} up",
170
- comboRow: "A combo of {legs} matches priced at about {total}",
170
+ comboRow: "Combo of {legs} paying {total}",
171
+ bigComboRow: "Total {total} with {legs} matches",
172
+ readyCount: (n) => `${n} ready`,
173
+ readyAt: (total) => `ready at ${total.toFixed(2)}`,
171
174
  maxPriceDisplay: (count, price) => `${count} picks, max ${price.toFixed(2)}`,
172
175
  maxPriceMessage: (count, price) => `Show me ${count} picks priced at ${price.toFixed(2)} or less.`,
173
176
  minPriceDisplay: (count, price) => `${count} picks from ${price.toFixed(2)} up`,
@@ -181,7 +184,9 @@ var STRINGS = {
181
184
  matchesLabel: "Matches",
182
185
  fewerMatches: "Fewer matches",
183
186
  moreMatches: "More matches",
184
- changeNumber: (value) => `${value}, tap to change`,
187
+ maxPriceName: "Max price",
188
+ minPriceName: "Lowest price",
189
+ notToday: " \xB7 not today",
185
190
  changeCombo: "Change total or matches"
186
191
  },
187
192
  games: {
@@ -497,6 +502,9 @@ var STRINGS = {
497
502
  maxPriceRow: "{count} se\xE7im, en fazla {price}",
498
503
  minPriceRow: "{price} ve \xFCzeri se\xE7imler",
499
504
  comboRow: "Yakla\u015F\u0131k {total} oranl\u0131 {legs} ma\xE7l\u0131k kombin",
505
+ bigComboRow: "{legs} ma\xE7la toplam {total}",
506
+ readyCount: (n) => `${n} haz\u0131r`,
507
+ readyAt: (total) => `${total.toFixed(2)} ile haz\u0131r`,
500
508
  maxPriceDisplay: (count, price) => `${count} se\xE7im, en fazla ${price.toFixed(2)}`,
501
509
  maxPriceMessage: (count, price) => `${price.toFixed(2)} veya alt\u0131 oranl\u0131 ${count} se\xE7im g\xF6ster.`,
502
510
  minPriceDisplay: (count, price) => `${count} se\xE7im, ${price.toFixed(2)} ve \xFCzeri`,
@@ -510,7 +518,9 @@ var STRINGS = {
510
518
  matchesLabel: "Ma\xE7 say\u0131s\u0131",
511
519
  fewerMatches: "Daha az ma\xE7",
512
520
  moreMatches: "Daha fazla ma\xE7",
513
- changeNumber: (value) => `${value}, de\u011Fi\u015Ftirmek i\xE7in dokun`,
521
+ maxPriceName: "En y\xFCksek oran",
522
+ minPriceName: "En d\xFC\u015F\xFCk oran",
523
+ notToday: " \xB7 bug\xFCn yok",
514
524
  changeCombo: "Toplam\u0131 veya ma\xE7lar\u0131 de\u011Fi\u015Ftir"
515
525
  },
516
526
  games: {
@@ -2883,11 +2893,6 @@ function comboLegChoices(grid) {
2883
2893
  for (let n = MIN_COMBO_LEGS; n <= max; n++) out.push(n);
2884
2894
  return out;
2885
2895
  }
2886
- function cycle(values, current) {
2887
- if (values.length === 0) return current;
2888
- const i = values.findIndex((v) => samePrice(v, current));
2889
- return values[(i + 1) % values.length] ?? current;
2890
- }
2891
2896
  function startValue(values, preferred) {
2892
2897
  return values.find((v) => samePrice(v, preferred)) ?? values[0] ?? preferred;
2893
2898
  }
@@ -8715,8 +8720,15 @@ function fillTemplate(template, slots) {
8715
8720
  return /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(import_react51.Fragment, { children: key !== void 0 && key in slots ? slots[key] : part }, i);
8716
8721
  });
8717
8722
  }
8718
- function NumberButton({ value, label, onCycle }) {
8719
- return /* @__PURE__ */ (0, import_jsx_runtime90.jsx)("button", { type: "button", className: "ss-w-tool-num", "aria-label": label, onClick: onCycle, children: value });
8723
+ function NumberSelect({ current, choices: choices2, label, notToday, lockEmpty = true, onChoose }) {
8724
+ const selected = Math.max(0, choices2.findIndex((c) => c.text === current));
8725
+ return /* @__PURE__ */ (0, import_jsx_runtime90.jsxs)("span", { className: "ss-w-tool-num", children: [
8726
+ /* @__PURE__ */ (0, import_jsx_runtime90.jsx)("span", { className: "ss-w-tool-num-size", "aria-hidden": "true", children: current }),
8727
+ /* @__PURE__ */ (0, import_jsx_runtime90.jsx)("select", { className: "ss-w-tool-num-select", "aria-label": label, value: String(selected), onChange: (e) => {
8728
+ const c = choices2[Number(e.target.value)];
8729
+ if (c) onChoose(c.value);
8730
+ }, children: choices2.map((c, i) => /* @__PURE__ */ (0, import_jsx_runtime90.jsx)("option", { value: String(i), disabled: lockEmpty && !c.available && i !== selected, children: c.available ? c.text : `${c.text}${notToday}` }, i)) })
8731
+ ] });
8720
8732
  }
8721
8733
  function SendButton({ label, display, disabled, onClick }) {
8722
8734
  return /* @__PURE__ */ (0, import_jsx_runtime90.jsx)("button", { type: "button", className: "ss-w-tool-send", "aria-label": `${label}: ${display}`, disabled, onClick, children: label });
@@ -8747,7 +8759,21 @@ function ComboPreview({ cell, formatKickoff }) {
8747
8759
  function Unavailable({ text }) {
8748
8760
  return /* @__PURE__ */ (0, import_jsx_runtime90.jsx)("p", { className: "ss-w-tool-unavailable", children: text });
8749
8761
  }
8750
- function SetNumbersTool({ grid, strings, streaming, formatKickoff, onSend, onClose }) {
8762
+ function AskRow({ icon, ask, ready, send }) {
8763
+ return /* @__PURE__ */ (0, import_jsx_runtime90.jsxs)("section", { className: "ss-w-tool-row ss-w-tool-row--ask", children: [
8764
+ /* @__PURE__ */ (0, import_jsx_runtime90.jsx)("span", { className: "ss-w-tool-icon", "aria-hidden": "true", children: icon }),
8765
+ /* @__PURE__ */ (0, import_jsx_runtime90.jsxs)("div", { className: "ss-w-tool-main", children: [
8766
+ /* @__PURE__ */ (0, import_jsx_runtime90.jsx)("p", { className: "ss-w-tool-ask", children: ask }),
8767
+ ready ? /* @__PURE__ */ (0, import_jsx_runtime90.jsx)("span", { className: "ss-w-tool-ready", children: ready }) : null
8768
+ ] }),
8769
+ send
8770
+ ] });
8771
+ }
8772
+ function RoundSend({ label, display, disabled, onClick }) {
8773
+ return /* @__PURE__ */ (0, import_jsx_runtime90.jsx)("button", { type: "button", className: "ss-w-tool-go", "aria-label": `${label}: ${display}`, disabled, onClick, children: /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(SendIcon, {}) });
8774
+ }
8775
+ var BIG_COMBO = { total: 50, legs: 6 };
8776
+ function SetNumbersTool({ grid, strings, streaming, onSend, onClose }) {
8751
8777
  const limits = singlesLimits(grid);
8752
8778
  const floors = singlesFloors(grid);
8753
8779
  const totals = comboTotals(grid);
@@ -8758,64 +8784,106 @@ function SetNumbersTool({ grid, strings, streaming, formatKickoff, onSend, onClo
8758
8784
  const [start] = (0, import_react51.useState)(() => startCombo(grid, totals, legChoices, START.comboTotal, START.comboLegs));
8759
8785
  const [total, setTotal] = (0, import_react51.useState)(start.total);
8760
8786
  const [legs, setLegs] = (0, import_react51.useState)(start.legs);
8787
+ const [bigStart] = (0, import_react51.useState)(() => startCombo(grid, totals, legChoices, BIG_COMBO.total, BIG_COMBO.legs));
8788
+ const [bigTotal, setBigTotal] = (0, import_react51.useState)(bigStart.total);
8789
+ const [bigLegs, setBigLegs] = (0, import_react51.useState)(bigStart.legs);
8761
8790
  const [announcement, setAnnouncement] = (0, import_react51.useState)("");
8762
8791
  const maxCell = findSingles(grid.singles, maxPrice, count);
8763
8792
  const minCell = findSingles(grid.singlesFrom, minPrice, count);
8764
8793
  const comboCell = findCombo(grid, total, legs);
8794
+ const bigCell = findCombo(grid, bigTotal, bigLegs);
8765
8795
  const announce = (display, available) => setAnnouncement(available ? display : `${display}. ${strings.unavailable}`);
8766
- const nextMax = () => {
8767
- const v = cycle(limits, maxPrice);
8796
+ const chooseMax = (v) => {
8768
8797
  setMaxPrice(v);
8769
8798
  announce(strings.maxPriceDisplay(count, v), !!findSingles(grid.singles, v, count));
8770
8799
  };
8771
- const nextMin = () => {
8772
- const v = cycle(floors, minPrice);
8800
+ const chooseMin = (v) => {
8773
8801
  setMinPrice(v);
8774
8802
  announce(strings.minPriceDisplay(count, v), !!findSingles(grid.singlesFrom, v, count));
8775
8803
  };
8776
- const nextLegs = () => {
8777
- const v = cycle(legChoices, legs);
8804
+ const chooseLegs = (v) => {
8778
8805
  setLegs(v);
8779
8806
  announce(strings.comboDisplay(v, total), !!findCombo(grid, total, v));
8780
8807
  };
8781
- const nextTotal = () => {
8782
- const v = cycle(totals, total);
8808
+ const chooseTotal = (v) => {
8783
8809
  const l = legsForTotal(grid, v, legs);
8784
8810
  setTotal(v);
8785
8811
  setLegs(l);
8786
8812
  announce(strings.comboDisplay(l, v), !!findCombo(grid, v, l));
8787
8813
  };
8814
+ const chooseBigLegs = (v) => {
8815
+ setBigLegs(v);
8816
+ announce(strings.comboDisplay(v, bigTotal), !!findCombo(grid, bigTotal, v));
8817
+ };
8818
+ const chooseBigTotal = (v) => {
8819
+ const l = legsForTotal(grid, v, bigLegs);
8820
+ setBigTotal(v);
8821
+ setBigLegs(l);
8822
+ announce(strings.comboDisplay(l, v), !!findCombo(grid, v, l));
8823
+ };
8824
+ const maxChoices = limits.map((v) => ({ value: v, text: v.toFixed(2), available: !!findSingles(grid.singles, v, count) }));
8825
+ const minChoices = floors.map((v) => ({ value: v, text: v.toFixed(2), available: !!findSingles(grid.singlesFrom, v, count) }));
8826
+ const totalChoices = totals.map((v) => ({ value: v, text: v.toFixed(1), available: legChoices.some((n) => !!findCombo(grid, v, n)) }));
8827
+ const legChoicesFor = (t) => legChoices.map((n) => ({ value: n, text: String(n), available: !!findCombo(grid, t, n) }));
8828
+ const singlesReady = (cell) => cell ? strings.readyCount(cell.picks.length) : strings.unavailable;
8829
+ const comboReady = (cell) => cell ? strings.readyAt(cell.combo.total) : strings.unavailable;
8788
8830
  return /* @__PURE__ */ (0, import_jsx_runtime90.jsxs)(PresetToolModal, { title: strings.setNumbers, closeLabel: strings.close, onClose, children: [
8789
- /* @__PURE__ */ (0, import_jsx_runtime90.jsxs)("section", { className: "ss-w-tool-row", children: [
8790
- /* @__PURE__ */ (0, import_jsx_runtime90.jsx)("p", { className: "ss-w-tool-ask", children: fillTemplate(strings.maxPriceRow, {
8791
- count: String(count),
8792
- price: /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(NumberButton, { value: maxPrice.toFixed(2), label: strings.changeNumber(maxPrice.toFixed(2)), onCycle: nextMax })
8793
- }) }),
8794
- maxCell ? /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(PickList, { picks: maxCell.picks, formatKickoff }) : /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(Unavailable, { text: strings.unavailable }),
8795
- /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(SendButton, { label: strings.send, display: strings.maxPriceDisplay(count, maxPrice), disabled: !maxCell || streaming, onClick: () => {
8796
- if (maxCell) onSend(maxPriceAsk(maxCell, strings));
8797
- } })
8798
- ] }),
8799
- /* @__PURE__ */ (0, import_jsx_runtime90.jsxs)("section", { className: "ss-w-tool-row", children: [
8800
- /* @__PURE__ */ (0, import_jsx_runtime90.jsx)("p", { className: "ss-w-tool-ask", children: fillTemplate(strings.minPriceRow, {
8801
- count: String(count),
8802
- price: /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(NumberButton, { value: minPrice.toFixed(2), label: strings.changeNumber(minPrice.toFixed(2)), onCycle: nextMin })
8803
- }) }),
8804
- minCell ? /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(PickList, { picks: minCell.picks, formatKickoff }) : /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(Unavailable, { text: strings.unavailable }),
8805
- /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(SendButton, { label: strings.send, display: strings.minPriceDisplay(count, minPrice), disabled: !minCell || streaming, onClick: () => {
8806
- if (minCell) onSend(minPriceAsk(minCell, strings));
8807
- } })
8808
- ] }),
8809
- /* @__PURE__ */ (0, import_jsx_runtime90.jsxs)("section", { className: "ss-w-tool-row", children: [
8810
- /* @__PURE__ */ (0, import_jsx_runtime90.jsx)("p", { className: "ss-w-tool-ask", children: fillTemplate(strings.comboRow, {
8811
- legs: /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(NumberButton, { value: String(legs), label: strings.changeNumber(String(legs)), onCycle: nextLegs }),
8812
- total: /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(NumberButton, { value: total.toFixed(1), label: strings.changeNumber(total.toFixed(1)), onCycle: nextTotal })
8813
- }) }),
8814
- comboCell ? /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(ComboPreview, { cell: comboCell, formatKickoff }) : /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(Unavailable, { text: strings.unavailable }),
8815
- /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(SendButton, { label: strings.send, display: strings.comboDisplay(legs, total), disabled: !comboCell || streaming, onClick: () => {
8816
- if (comboCell) onSend(comboAsk(comboCell, strings));
8817
- } })
8818
- ] }),
8831
+ /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(
8832
+ AskRow,
8833
+ {
8834
+ icon: "\u{1F3AF}",
8835
+ ask: fillTemplate(strings.maxPriceRow, {
8836
+ count: String(count),
8837
+ price: /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(NumberSelect, { current: maxPrice.toFixed(2), choices: maxChoices, label: strings.maxPriceName, notToday: strings.notToday, onChoose: chooseMax })
8838
+ }),
8839
+ ready: singlesReady(maxCell),
8840
+ send: /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(RoundSend, { label: strings.send, display: strings.maxPriceDisplay(count, maxPrice), disabled: !maxCell || streaming, onClick: () => {
8841
+ if (maxCell) onSend(maxPriceAsk(maxCell, strings));
8842
+ } })
8843
+ }
8844
+ ),
8845
+ /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(
8846
+ AskRow,
8847
+ {
8848
+ icon: "\u{1F4C8}",
8849
+ ask: fillTemplate(strings.minPriceRow, {
8850
+ count: String(count),
8851
+ price: /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(NumberSelect, { current: minPrice.toFixed(2), choices: minChoices, label: strings.minPriceName, notToday: strings.notToday, onChoose: chooseMin })
8852
+ }),
8853
+ ready: singlesReady(minCell),
8854
+ send: /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(RoundSend, { label: strings.send, display: strings.minPriceDisplay(count, minPrice), disabled: !minCell || streaming, onClick: () => {
8855
+ if (minCell) onSend(minPriceAsk(minCell, strings));
8856
+ } })
8857
+ }
8858
+ ),
8859
+ /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(
8860
+ AskRow,
8861
+ {
8862
+ icon: "\u2728",
8863
+ ask: fillTemplate(strings.comboRow, {
8864
+ legs: /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(NumberSelect, { current: String(legs), choices: legChoicesFor(total), label: strings.matchesLabel, notToday: strings.notToday, lockEmpty: false, onChoose: chooseLegs }),
8865
+ total: /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(NumberSelect, { current: total.toFixed(1), choices: totalChoices, label: strings.totalLabel, notToday: strings.notToday, onChoose: chooseTotal })
8866
+ }),
8867
+ ready: comboReady(comboCell),
8868
+ send: /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(RoundSend, { label: strings.send, display: strings.comboDisplay(legs, total), disabled: !comboCell || streaming, onClick: () => {
8869
+ if (comboCell) onSend(comboAsk(comboCell, strings));
8870
+ } })
8871
+ }
8872
+ ),
8873
+ /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(
8874
+ AskRow,
8875
+ {
8876
+ icon: "\u{1F3C6}",
8877
+ ask: fillTemplate(strings.bigComboRow, {
8878
+ legs: /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(NumberSelect, { current: String(bigLegs), choices: legChoicesFor(bigTotal), label: strings.matchesLabel, notToday: strings.notToday, lockEmpty: false, onChoose: chooseBigLegs }),
8879
+ total: /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(NumberSelect, { current: bigTotal.toFixed(1), choices: totalChoices, label: strings.totalLabel, notToday: strings.notToday, onChoose: chooseBigTotal })
8880
+ }),
8881
+ ready: comboReady(bigCell),
8882
+ send: /* @__PURE__ */ (0, import_jsx_runtime90.jsx)(RoundSend, { label: strings.send, display: strings.comboDisplay(bigLegs, bigTotal), disabled: !bigCell || streaming, onClick: () => {
8883
+ if (bigCell) onSend(comboAsk(bigCell, strings));
8884
+ } })
8885
+ }
8886
+ ),
8819
8887
  /* @__PURE__ */ (0, import_jsx_runtime90.jsx)("p", { className: "ss-w-vh", "aria-live": "polite", children: announcement })
8820
8888
  ] });
8821
8889
  }
@@ -9090,7 +9158,7 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
9090
9158
  buttonRef: dialButtonRef
9091
9159
  }
9092
9160
  ) : null,
9093
- tool && presetGrid && onChatTab ? tool.kind === "numbers" ? /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(SetNumbersTool, { grid: presetGrid, strings: ui.presets, streaming: state.isStreaming, formatKickoff, onSend: sendAsk, onClose: closeTool }) : /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(BuildComboTool, { grid: presetGrid, strings: ui.presets, streaming: state.isStreaming, formatKickoff, initialTotal: tool.total, initialLegs: tool.legs, onSend: sendAsk, onClose: closeTool }) : null
9161
+ tool && presetGrid && onChatTab ? tool.kind === "numbers" ? /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(SetNumbersTool, { grid: presetGrid, strings: ui.presets, streaming: state.isStreaming, onSend: sendAsk, onClose: closeTool }) : /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(BuildComboTool, { grid: presetGrid, strings: ui.presets, streaming: state.isStreaming, formatKickoff, initialTotal: tool.total, initialLegs: tool.legs, onSend: sendAsk, onClose: closeTool }) : null
9094
9162
  ] }),
9095
9163
  monitor && discovery && monitor.activeTab === "today" && /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(TodayPanel, { discovery, ui, monitor }),
9096
9164
  monitor && monitor.activeTab === "following" && /* @__PURE__ */ (0, import_jsx_runtime91.jsx)(MatchesPanel, { monitor, ui, slip, onAsk: handleAsk }),
@@ -9581,7 +9649,13 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
9581
9649
  .ss-w-tool-foot { flex: none; padding: 10px 14px 12px; border-top: 1px solid var(--ss-w-line); }
9582
9650
  .ss-w-tool-row { display: flex; flex-direction: column; gap: 8px; padding: 10px 11px; border: 1px solid var(--ss-w-line); border-left: 3px solid var(--ss-w-accent); border-radius: 12px; }
9583
9651
  .ss-w-tool-ask { font-size: 14px; font-weight: 650; line-height: 1.7; color: var(--ss-w-ink); overflow-wrap: anywhere; }
9584
- .ss-w-tool-num { display: inline-block; min-width: 44px; min-height: 32px; margin: 0 2px; padding: 3px 8px; font: inherit; font-variant-numeric: tabular-nums; font-weight: 800; color: var(--ss-w-accent); background: color-mix(in srgb, var(--ss-w-accent) 10%, var(--ss-w-panel)); border: 1px dashed color-mix(in srgb, var(--ss-w-accent) 55%, var(--ss-w-line)); border-radius: 8px; cursor: pointer; }
9652
+ .ss-w-tool-num { position: relative; display: inline-block; vertical-align: middle; margin: 0 2px; font-variant-numeric: tabular-nums; font-weight: 800; color: var(--ss-w-accent); }
9653
+ .ss-w-tool-num-size { display: block; font-size: max(16px, 1em); user-select: none; -webkit-user-select: none; visibility: hidden; box-sizing: border-box; min-width: 44px; min-height: 32px; padding: 6px 26px 6px 10px; line-height: 1.3; white-space: pre; }
9654
+ .ss-w-tool-num-select { position: absolute; inset: 0; width: 100%; height: 100%; margin: 0; padding: 0 22px 0 10px; font: inherit; font-size: max(16px, 1em); font-variant-numeric: tabular-nums; font-weight: 800; color: var(--ss-w-accent); background-color: color-mix(in srgb, var(--ss-w-accent) 10%, var(--ss-w-panel)); border: 1.5px solid color-mix(in srgb, var(--ss-w-accent) 65%, var(--ss-w-line)); border-radius: 8px; cursor: pointer; appearance: none; -webkit-appearance: none; }
9655
+ .ss-w-tool-num::after { content: ""; position: absolute; right: 9px; top: 50%; width: 5px; height: 5px; margin-top: -4px; border-right: 2px solid currentColor; border-bottom: 2px solid currentColor; transform: rotate(45deg); pointer-events: none; }
9656
+ .ss-w-tool-num-select:focus-visible { outline: 2px solid var(--ss-w-accent); outline-offset: 2px; }
9657
+ .ss-w-tool-num-select option { font-weight: 600; color: var(--ss-w-ink); background: var(--ss-w-panel); }
9658
+ .ss-w-tool-num-select option:disabled { color: var(--ss-w-faint); }
9585
9659
  .ss-w-tool-picks { list-style: none; display: flex; flex-direction: column; gap: 4px; }
9586
9660
  .ss-w-tool-pick { display: grid; grid-template-columns: 1fr auto; column-gap: 8px; padding: 5px 8px; font-size: 12px; line-height: 1.35; background: var(--ss-w-bubble); border-radius: 8px; }
9587
9661
  .ss-w-tool-pick-match { grid-column: 1; font-weight: 650; color: var(--ss-w-ink); overflow-wrap: anywhere; }
@@ -9590,6 +9664,13 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
9590
9664
  .ss-w-tool-pick-price { grid-column: 2; grid-row: 1 / span 3; align-self: center; font-family: ui-monospace, monospace; font-variant-numeric: tabular-nums; font-size: 14px; font-weight: 800; color: var(--ss-w-accent); }
9591
9665
  .ss-w-tool-math { padding: 6px 8px; font-family: ui-monospace, monospace; font-variant-numeric: tabular-nums; font-size: 13px; font-weight: 700; text-align: right; color: var(--ss-w-ink); background: color-mix(in srgb, var(--ss-w-accent) 9%, var(--ss-w-panel)); border-radius: 8px; overflow-wrap: anywhere; }
9592
9666
  .ss-w-tool-unavailable { padding: 6px 8px; font-size: 12px; color: var(--ss-w-faint); border: 1px dashed var(--ss-w-line); border-radius: 8px; }
9667
+ .ss-w-tool-row--ask { flex-direction: row; align-items: center; gap: 10px; border-left-width: 1px; }
9668
+ .ss-w-tool-icon { flex: none; font-size: 20px; line-height: 1; }
9669
+ .ss-w-tool-main { flex: 1; min-width: 0; display: flex; flex-direction: column; align-items: flex-start; gap: 4px; }
9670
+ .ss-w-tool-ready { padding: 2px 8px; font-size: 11.5px; font-weight: 650; color: var(--ss-w-accent); background: color-mix(in srgb, var(--ss-w-accent) 12%, transparent); border-radius: 10px; }
9671
+ .ss-w-tool-go { flex: none; width: 44px; height: 44px; display: grid; place-items: center; font-size: 17px; color: #fff; background: var(--ss-w-accent); border: none; border-radius: 50%; cursor: pointer; }
9672
+ .ss-w-tool-go:disabled { color: var(--ss-w-faint); background: var(--ss-w-bubble); cursor: not-allowed; }
9673
+ .ss-w-tool-go:focus-visible { outline: 2px solid var(--ss-w-accent); outline-offset: 2px; }
9593
9674
  .ss-w-tool-send { align-self: flex-end; min-height: 40px; padding: 8px 18px; font: inherit; font-size: 13px; font-weight: 700; color: #fff; background: var(--ss-w-accent); border: none; border-radius: 20px; cursor: pointer; }
9594
9675
  .ss-w-tool-send:disabled { color: var(--ss-w-faint); background: var(--ss-w-bubble); cursor: not-allowed; }
9595
9676
  .ss-w-tool-foot .ss-w-tool-send { width: 100%; }