@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/dist/index.js CHANGED
@@ -129,7 +129,10 @@ var STRINGS = {
129
129
  dialName: "Set the numbers and Build a combo",
130
130
  maxPriceRow: "{count} picks, max {price}",
131
131
  minPriceRow: "Picks from {price} up",
132
- comboRow: "A combo of {legs} matches priced at about {total}",
132
+ comboRow: "Combo of {legs} paying {total}",
133
+ bigComboRow: "Total {total} with {legs} matches",
134
+ readyCount: (n) => `${n} ready`,
135
+ readyAt: (total) => `ready at ${total.toFixed(2)}`,
133
136
  maxPriceDisplay: (count, price) => `${count} picks, max ${price.toFixed(2)}`,
134
137
  maxPriceMessage: (count, price) => `Show me ${count} picks priced at ${price.toFixed(2)} or less.`,
135
138
  minPriceDisplay: (count, price) => `${count} picks from ${price.toFixed(2)} up`,
@@ -143,7 +146,9 @@ var STRINGS = {
143
146
  matchesLabel: "Matches",
144
147
  fewerMatches: "Fewer matches",
145
148
  moreMatches: "More matches",
146
- changeNumber: (value) => `${value}, tap to change`,
149
+ maxPriceName: "Max price",
150
+ minPriceName: "Lowest price",
151
+ notToday: " \xB7 not today",
147
152
  changeCombo: "Change total or matches"
148
153
  },
149
154
  games: {
@@ -459,6 +464,9 @@ var STRINGS = {
459
464
  maxPriceRow: "{count} se\xE7im, en fazla {price}",
460
465
  minPriceRow: "{price} ve \xFCzeri se\xE7imler",
461
466
  comboRow: "Yakla\u015F\u0131k {total} oranl\u0131 {legs} ma\xE7l\u0131k kombin",
467
+ bigComboRow: "{legs} ma\xE7la toplam {total}",
468
+ readyCount: (n) => `${n} haz\u0131r`,
469
+ readyAt: (total) => `${total.toFixed(2)} ile haz\u0131r`,
462
470
  maxPriceDisplay: (count, price) => `${count} se\xE7im, en fazla ${price.toFixed(2)}`,
463
471
  maxPriceMessage: (count, price) => `${price.toFixed(2)} veya alt\u0131 oranl\u0131 ${count} se\xE7im g\xF6ster.`,
464
472
  minPriceDisplay: (count, price) => `${count} se\xE7im, ${price.toFixed(2)} ve \xFCzeri`,
@@ -472,7 +480,9 @@ var STRINGS = {
472
480
  matchesLabel: "Ma\xE7 say\u0131s\u0131",
473
481
  fewerMatches: "Daha az ma\xE7",
474
482
  moreMatches: "Daha fazla ma\xE7",
475
- changeNumber: (value) => `${value}, de\u011Fi\u015Ftirmek i\xE7in dokun`,
483
+ maxPriceName: "En y\xFCksek oran",
484
+ minPriceName: "En d\xFC\u015F\xFCk oran",
485
+ notToday: " \xB7 bug\xFCn yok",
476
486
  changeCombo: "Toplam\u0131 veya ma\xE7lar\u0131 de\u011Fi\u015Ftir"
477
487
  },
478
488
  games: {
@@ -2845,11 +2855,6 @@ function comboLegChoices(grid) {
2845
2855
  for (let n = MIN_COMBO_LEGS; n <= max; n++) out.push(n);
2846
2856
  return out;
2847
2857
  }
2848
- function cycle(values, current) {
2849
- if (values.length === 0) return current;
2850
- const i = values.findIndex((v) => samePrice(v, current));
2851
- return values[(i + 1) % values.length] ?? current;
2852
- }
2853
2858
  function startValue(values, preferred) {
2854
2859
  return values.find((v) => samePrice(v, preferred)) ?? values[0] ?? preferred;
2855
2860
  }
@@ -8677,8 +8682,15 @@ function fillTemplate(template, slots) {
8677
8682
  return /* @__PURE__ */ jsx90(Fragment20, { children: key !== void 0 && key in slots ? slots[key] : part }, i);
8678
8683
  });
8679
8684
  }
8680
- function NumberButton({ value, label, onCycle }) {
8681
- return /* @__PURE__ */ jsx90("button", { type: "button", className: "ss-w-tool-num", "aria-label": label, onClick: onCycle, children: value });
8685
+ function NumberSelect({ current, choices: choices2, label, notToday, lockEmpty = true, onChoose }) {
8686
+ const selected = Math.max(0, choices2.findIndex((c) => c.text === current));
8687
+ return /* @__PURE__ */ jsxs75("span", { className: "ss-w-tool-num", children: [
8688
+ /* @__PURE__ */ jsx90("span", { className: "ss-w-tool-num-size", "aria-hidden": "true", children: current }),
8689
+ /* @__PURE__ */ jsx90("select", { className: "ss-w-tool-num-select", "aria-label": label, value: String(selected), onChange: (e) => {
8690
+ const c = choices2[Number(e.target.value)];
8691
+ if (c) onChoose(c.value);
8692
+ }, children: choices2.map((c, i) => /* @__PURE__ */ jsx90("option", { value: String(i), disabled: lockEmpty && !c.available && i !== selected, children: c.available ? c.text : `${c.text}${notToday}` }, i)) })
8693
+ ] });
8682
8694
  }
8683
8695
  function SendButton({ label, display, disabled, onClick }) {
8684
8696
  return /* @__PURE__ */ jsx90("button", { type: "button", className: "ss-w-tool-send", "aria-label": `${label}: ${display}`, disabled, onClick, children: label });
@@ -8709,7 +8721,21 @@ function ComboPreview({ cell, formatKickoff }) {
8709
8721
  function Unavailable({ text }) {
8710
8722
  return /* @__PURE__ */ jsx90("p", { className: "ss-w-tool-unavailable", children: text });
8711
8723
  }
8712
- function SetNumbersTool({ grid, strings, streaming, formatKickoff, onSend, onClose }) {
8724
+ function AskRow({ icon, ask, ready, send }) {
8725
+ return /* @__PURE__ */ jsxs75("section", { className: "ss-w-tool-row ss-w-tool-row--ask", children: [
8726
+ /* @__PURE__ */ jsx90("span", { className: "ss-w-tool-icon", "aria-hidden": "true", children: icon }),
8727
+ /* @__PURE__ */ jsxs75("div", { className: "ss-w-tool-main", children: [
8728
+ /* @__PURE__ */ jsx90("p", { className: "ss-w-tool-ask", children: ask }),
8729
+ ready ? /* @__PURE__ */ jsx90("span", { className: "ss-w-tool-ready", children: ready }) : null
8730
+ ] }),
8731
+ send
8732
+ ] });
8733
+ }
8734
+ function RoundSend({ label, display, disabled, onClick }) {
8735
+ return /* @__PURE__ */ jsx90("button", { type: "button", className: "ss-w-tool-go", "aria-label": `${label}: ${display}`, disabled, onClick, children: /* @__PURE__ */ jsx90(SendIcon, {}) });
8736
+ }
8737
+ var BIG_COMBO = { total: 50, legs: 6 };
8738
+ function SetNumbersTool({ grid, strings, streaming, onSend, onClose }) {
8713
8739
  const limits = singlesLimits(grid);
8714
8740
  const floors = singlesFloors(grid);
8715
8741
  const totals = comboTotals(grid);
@@ -8720,64 +8746,106 @@ function SetNumbersTool({ grid, strings, streaming, formatKickoff, onSend, onClo
8720
8746
  const [start] = useState41(() => startCombo(grid, totals, legChoices, START.comboTotal, START.comboLegs));
8721
8747
  const [total, setTotal] = useState41(start.total);
8722
8748
  const [legs, setLegs] = useState41(start.legs);
8749
+ const [bigStart] = useState41(() => startCombo(grid, totals, legChoices, BIG_COMBO.total, BIG_COMBO.legs));
8750
+ const [bigTotal, setBigTotal] = useState41(bigStart.total);
8751
+ const [bigLegs, setBigLegs] = useState41(bigStart.legs);
8723
8752
  const [announcement, setAnnouncement] = useState41("");
8724
8753
  const maxCell = findSingles(grid.singles, maxPrice, count);
8725
8754
  const minCell = findSingles(grid.singlesFrom, minPrice, count);
8726
8755
  const comboCell = findCombo(grid, total, legs);
8756
+ const bigCell = findCombo(grid, bigTotal, bigLegs);
8727
8757
  const announce = (display, available) => setAnnouncement(available ? display : `${display}. ${strings.unavailable}`);
8728
- const nextMax = () => {
8729
- const v = cycle(limits, maxPrice);
8758
+ const chooseMax = (v) => {
8730
8759
  setMaxPrice(v);
8731
8760
  announce(strings.maxPriceDisplay(count, v), !!findSingles(grid.singles, v, count));
8732
8761
  };
8733
- const nextMin = () => {
8734
- const v = cycle(floors, minPrice);
8762
+ const chooseMin = (v) => {
8735
8763
  setMinPrice(v);
8736
8764
  announce(strings.minPriceDisplay(count, v), !!findSingles(grid.singlesFrom, v, count));
8737
8765
  };
8738
- const nextLegs = () => {
8739
- const v = cycle(legChoices, legs);
8766
+ const chooseLegs = (v) => {
8740
8767
  setLegs(v);
8741
8768
  announce(strings.comboDisplay(v, total), !!findCombo(grid, total, v));
8742
8769
  };
8743
- const nextTotal = () => {
8744
- const v = cycle(totals, total);
8770
+ const chooseTotal = (v) => {
8745
8771
  const l = legsForTotal(grid, v, legs);
8746
8772
  setTotal(v);
8747
8773
  setLegs(l);
8748
8774
  announce(strings.comboDisplay(l, v), !!findCombo(grid, v, l));
8749
8775
  };
8776
+ const chooseBigLegs = (v) => {
8777
+ setBigLegs(v);
8778
+ announce(strings.comboDisplay(v, bigTotal), !!findCombo(grid, bigTotal, v));
8779
+ };
8780
+ const chooseBigTotal = (v) => {
8781
+ const l = legsForTotal(grid, v, bigLegs);
8782
+ setBigTotal(v);
8783
+ setBigLegs(l);
8784
+ announce(strings.comboDisplay(l, v), !!findCombo(grid, v, l));
8785
+ };
8786
+ const maxChoices = limits.map((v) => ({ value: v, text: v.toFixed(2), available: !!findSingles(grid.singles, v, count) }));
8787
+ const minChoices = floors.map((v) => ({ value: v, text: v.toFixed(2), available: !!findSingles(grid.singlesFrom, v, count) }));
8788
+ const totalChoices = totals.map((v) => ({ value: v, text: v.toFixed(1), available: legChoices.some((n) => !!findCombo(grid, v, n)) }));
8789
+ const legChoicesFor = (t) => legChoices.map((n) => ({ value: n, text: String(n), available: !!findCombo(grid, t, n) }));
8790
+ const singlesReady = (cell) => cell ? strings.readyCount(cell.picks.length) : strings.unavailable;
8791
+ const comboReady = (cell) => cell ? strings.readyAt(cell.combo.total) : strings.unavailable;
8750
8792
  return /* @__PURE__ */ jsxs75(PresetToolModal, { title: strings.setNumbers, closeLabel: strings.close, onClose, children: [
8751
- /* @__PURE__ */ jsxs75("section", { className: "ss-w-tool-row", children: [
8752
- /* @__PURE__ */ jsx90("p", { className: "ss-w-tool-ask", children: fillTemplate(strings.maxPriceRow, {
8753
- count: String(count),
8754
- price: /* @__PURE__ */ jsx90(NumberButton, { value: maxPrice.toFixed(2), label: strings.changeNumber(maxPrice.toFixed(2)), onCycle: nextMax })
8755
- }) }),
8756
- maxCell ? /* @__PURE__ */ jsx90(PickList, { picks: maxCell.picks, formatKickoff }) : /* @__PURE__ */ jsx90(Unavailable, { text: strings.unavailable }),
8757
- /* @__PURE__ */ jsx90(SendButton, { label: strings.send, display: strings.maxPriceDisplay(count, maxPrice), disabled: !maxCell || streaming, onClick: () => {
8758
- if (maxCell) onSend(maxPriceAsk(maxCell, strings));
8759
- } })
8760
- ] }),
8761
- /* @__PURE__ */ jsxs75("section", { className: "ss-w-tool-row", children: [
8762
- /* @__PURE__ */ jsx90("p", { className: "ss-w-tool-ask", children: fillTemplate(strings.minPriceRow, {
8763
- count: String(count),
8764
- price: /* @__PURE__ */ jsx90(NumberButton, { value: minPrice.toFixed(2), label: strings.changeNumber(minPrice.toFixed(2)), onCycle: nextMin })
8765
- }) }),
8766
- minCell ? /* @__PURE__ */ jsx90(PickList, { picks: minCell.picks, formatKickoff }) : /* @__PURE__ */ jsx90(Unavailable, { text: strings.unavailable }),
8767
- /* @__PURE__ */ jsx90(SendButton, { label: strings.send, display: strings.minPriceDisplay(count, minPrice), disabled: !minCell || streaming, onClick: () => {
8768
- if (minCell) onSend(minPriceAsk(minCell, strings));
8769
- } })
8770
- ] }),
8771
- /* @__PURE__ */ jsxs75("section", { className: "ss-w-tool-row", children: [
8772
- /* @__PURE__ */ jsx90("p", { className: "ss-w-tool-ask", children: fillTemplate(strings.comboRow, {
8773
- legs: /* @__PURE__ */ jsx90(NumberButton, { value: String(legs), label: strings.changeNumber(String(legs)), onCycle: nextLegs }),
8774
- total: /* @__PURE__ */ jsx90(NumberButton, { value: total.toFixed(1), label: strings.changeNumber(total.toFixed(1)), onCycle: nextTotal })
8775
- }) }),
8776
- comboCell ? /* @__PURE__ */ jsx90(ComboPreview, { cell: comboCell, formatKickoff }) : /* @__PURE__ */ jsx90(Unavailable, { text: strings.unavailable }),
8777
- /* @__PURE__ */ jsx90(SendButton, { label: strings.send, display: strings.comboDisplay(legs, total), disabled: !comboCell || streaming, onClick: () => {
8778
- if (comboCell) onSend(comboAsk(comboCell, strings));
8779
- } })
8780
- ] }),
8793
+ /* @__PURE__ */ jsx90(
8794
+ AskRow,
8795
+ {
8796
+ icon: "\u{1F3AF}",
8797
+ ask: fillTemplate(strings.maxPriceRow, {
8798
+ count: String(count),
8799
+ price: /* @__PURE__ */ jsx90(NumberSelect, { current: maxPrice.toFixed(2), choices: maxChoices, label: strings.maxPriceName, notToday: strings.notToday, onChoose: chooseMax })
8800
+ }),
8801
+ ready: singlesReady(maxCell),
8802
+ send: /* @__PURE__ */ jsx90(RoundSend, { label: strings.send, display: strings.maxPriceDisplay(count, maxPrice), disabled: !maxCell || streaming, onClick: () => {
8803
+ if (maxCell) onSend(maxPriceAsk(maxCell, strings));
8804
+ } })
8805
+ }
8806
+ ),
8807
+ /* @__PURE__ */ jsx90(
8808
+ AskRow,
8809
+ {
8810
+ icon: "\u{1F4C8}",
8811
+ ask: fillTemplate(strings.minPriceRow, {
8812
+ count: String(count),
8813
+ price: /* @__PURE__ */ jsx90(NumberSelect, { current: minPrice.toFixed(2), choices: minChoices, label: strings.minPriceName, notToday: strings.notToday, onChoose: chooseMin })
8814
+ }),
8815
+ ready: singlesReady(minCell),
8816
+ send: /* @__PURE__ */ jsx90(RoundSend, { label: strings.send, display: strings.minPriceDisplay(count, minPrice), disabled: !minCell || streaming, onClick: () => {
8817
+ if (minCell) onSend(minPriceAsk(minCell, strings));
8818
+ } })
8819
+ }
8820
+ ),
8821
+ /* @__PURE__ */ jsx90(
8822
+ AskRow,
8823
+ {
8824
+ icon: "\u2728",
8825
+ ask: fillTemplate(strings.comboRow, {
8826
+ legs: /* @__PURE__ */ jsx90(NumberSelect, { current: String(legs), choices: legChoicesFor(total), label: strings.matchesLabel, notToday: strings.notToday, lockEmpty: false, onChoose: chooseLegs }),
8827
+ total: /* @__PURE__ */ jsx90(NumberSelect, { current: total.toFixed(1), choices: totalChoices, label: strings.totalLabel, notToday: strings.notToday, onChoose: chooseTotal })
8828
+ }),
8829
+ ready: comboReady(comboCell),
8830
+ send: /* @__PURE__ */ jsx90(RoundSend, { label: strings.send, display: strings.comboDisplay(legs, total), disabled: !comboCell || streaming, onClick: () => {
8831
+ if (comboCell) onSend(comboAsk(comboCell, strings));
8832
+ } })
8833
+ }
8834
+ ),
8835
+ /* @__PURE__ */ jsx90(
8836
+ AskRow,
8837
+ {
8838
+ icon: "\u{1F3C6}",
8839
+ ask: fillTemplate(strings.bigComboRow, {
8840
+ legs: /* @__PURE__ */ jsx90(NumberSelect, { current: String(bigLegs), choices: legChoicesFor(bigTotal), label: strings.matchesLabel, notToday: strings.notToday, lockEmpty: false, onChoose: chooseBigLegs }),
8841
+ total: /* @__PURE__ */ jsx90(NumberSelect, { current: bigTotal.toFixed(1), choices: totalChoices, label: strings.totalLabel, notToday: strings.notToday, onChoose: chooseBigTotal })
8842
+ }),
8843
+ ready: comboReady(bigCell),
8844
+ send: /* @__PURE__ */ jsx90(RoundSend, { label: strings.send, display: strings.comboDisplay(bigLegs, bigTotal), disabled: !bigCell || streaming, onClick: () => {
8845
+ if (bigCell) onSend(comboAsk(bigCell, strings));
8846
+ } })
8847
+ }
8848
+ ),
8781
8849
  /* @__PURE__ */ jsx90("p", { className: "ss-w-vh", "aria-live": "polite", children: announcement })
8782
8850
  ] });
8783
8851
  }
@@ -9052,7 +9120,7 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
9052
9120
  buttonRef: dialButtonRef
9053
9121
  }
9054
9122
  ) : null,
9055
- tool && presetGrid && onChatTab ? tool.kind === "numbers" ? /* @__PURE__ */ jsx91(SetNumbersTool, { grid: presetGrid, strings: ui.presets, streaming: state.isStreaming, formatKickoff, onSend: sendAsk, onClose: closeTool }) : /* @__PURE__ */ jsx91(BuildComboTool, { grid: presetGrid, strings: ui.presets, streaming: state.isStreaming, formatKickoff, initialTotal: tool.total, initialLegs: tool.legs, onSend: sendAsk, onClose: closeTool }) : null
9123
+ tool && presetGrid && onChatTab ? tool.kind === "numbers" ? /* @__PURE__ */ jsx91(SetNumbersTool, { grid: presetGrid, strings: ui.presets, streaming: state.isStreaming, onSend: sendAsk, onClose: closeTool }) : /* @__PURE__ */ jsx91(BuildComboTool, { grid: presetGrid, strings: ui.presets, streaming: state.isStreaming, formatKickoff, initialTotal: tool.total, initialLegs: tool.legs, onSend: sendAsk, onClose: closeTool }) : null
9056
9124
  ] }),
9057
9125
  monitor && discovery && monitor.activeTab === "today" && /* @__PURE__ */ jsx91(TodayPanel, { discovery, ui, monitor }),
9058
9126
  monitor && monitor.activeTab === "following" && /* @__PURE__ */ jsx91(MatchesPanel, { monitor, ui, slip, onAsk: handleAsk }),
@@ -9543,7 +9611,13 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
9543
9611
  .ss-w-tool-foot { flex: none; padding: 10px 14px 12px; border-top: 1px solid var(--ss-w-line); }
9544
9612
  .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; }
9545
9613
  .ss-w-tool-ask { font-size: 14px; font-weight: 650; line-height: 1.7; color: var(--ss-w-ink); overflow-wrap: anywhere; }
9546
- .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; }
9614
+ .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); }
9615
+ .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; }
9616
+ .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; }
9617
+ .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; }
9618
+ .ss-w-tool-num-select:focus-visible { outline: 2px solid var(--ss-w-accent); outline-offset: 2px; }
9619
+ .ss-w-tool-num-select option { font-weight: 600; color: var(--ss-w-ink); background: var(--ss-w-panel); }
9620
+ .ss-w-tool-num-select option:disabled { color: var(--ss-w-faint); }
9547
9621
  .ss-w-tool-picks { list-style: none; display: flex; flex-direction: column; gap: 4px; }
9548
9622
  .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; }
9549
9623
  .ss-w-tool-pick-match { grid-column: 1; font-weight: 650; color: var(--ss-w-ink); overflow-wrap: anywhere; }
@@ -9552,6 +9626,13 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
9552
9626
  .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); }
9553
9627
  .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; }
9554
9628
  .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; }
9629
+ .ss-w-tool-row--ask { flex-direction: row; align-items: center; gap: 10px; border-left-width: 1px; }
9630
+ .ss-w-tool-icon { flex: none; font-size: 20px; line-height: 1; }
9631
+ .ss-w-tool-main { flex: 1; min-width: 0; display: flex; flex-direction: column; align-items: flex-start; gap: 4px; }
9632
+ .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; }
9633
+ .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; }
9634
+ .ss-w-tool-go:disabled { color: var(--ss-w-faint); background: var(--ss-w-bubble); cursor: not-allowed; }
9635
+ .ss-w-tool-go:focus-visible { outline: 2px solid var(--ss-w-accent); outline-offset: 2px; }
9555
9636
  .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; }
9556
9637
  .ss-w-tool-send:disabled { color: var(--ss-w-faint); background: var(--ss-w-bubble); cursor: not-allowed; }
9557
9638
  .ss-w-tool-foot .ss-w-tool-send { width: 100%; }