@sensiblestats/widget-react 0.50.2 → 0.51.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
@@ -101,6 +101,13 @@ var STRINGS = {
101
101
  leaderboardOffBoard: "Outside top 50",
102
102
  leaderboardThisWeek: "This week",
103
103
  leaderboardAllTime: "All time",
104
+ leaderboardEmptyFreshTitle: "New week, blank slate",
105
+ leaderboardEmptyFreshBody: "No scores yet. The first fan to play a game takes #1.",
106
+ leaderboardEmptyColdTitle: "Be the first up",
107
+ leaderboardEmptyColdBody: "Nobody's on the board yet. Play a game and you're #1.",
108
+ leaderboardEmptyCta: "Play today's games",
109
+ leaderboardLastWeekLabel: "Last week",
110
+ leaderboardAllTimeEmpty: "The all-time board fills as fans play \u2014 nothing here yet.",
104
111
  gamePlay: "Play",
105
112
  gameResume: "Resume",
106
113
  gameLocked: "Locked",
@@ -191,6 +198,13 @@ var STRINGS = {
191
198
  leaderboardOffBoard: "\u0130lk 50 d\u0131\u015F\u0131nda",
192
199
  leaderboardThisWeek: "Bu hafta",
193
200
  leaderboardAllTime: "T\xFCm zamanlar",
201
+ leaderboardEmptyFreshTitle: "Yeni hafta, temiz sayfa",
202
+ leaderboardEmptyFreshBody: "Hen\xFCz skor yok. Oynayan ilk taraftar 1. s\u0131raya ge\xE7er.",
203
+ leaderboardEmptyColdTitle: "\u0130lk sen ol",
204
+ leaderboardEmptyColdBody: "Panoda hen\xFCz kimse yok. Bir oyun oyna, 1. s\u0131ra senin.",
205
+ leaderboardEmptyCta: "Bug\xFCn\xFCn oyunlar\u0131n\u0131 oyna",
206
+ leaderboardLastWeekLabel: "Ge\xE7en hafta",
207
+ leaderboardAllTimeEmpty: "T\xFCm zamanlar panosu taraftarlar oynad\u0131k\xE7a dolar \u2014 hen\xFCz bir \u015Fey yok.",
194
208
  gamePlay: "Oyna",
195
209
  gameResume: "Devam et",
196
210
  gameLocked: "Kilitli",
@@ -300,6 +314,13 @@ function normalizeUi(cfg) {
300
314
  leaderboardOffBoard: strings.leaderboardOffBoard,
301
315
  leaderboardThisWeek: strings.leaderboardThisWeek,
302
316
  leaderboardAllTime: strings.leaderboardAllTime,
317
+ leaderboardEmptyFreshTitle: strings.leaderboardEmptyFreshTitle,
318
+ leaderboardEmptyFreshBody: strings.leaderboardEmptyFreshBody,
319
+ leaderboardEmptyColdTitle: strings.leaderboardEmptyColdTitle,
320
+ leaderboardEmptyColdBody: strings.leaderboardEmptyColdBody,
321
+ leaderboardEmptyCta: strings.leaderboardEmptyCta,
322
+ leaderboardLastWeekLabel: strings.leaderboardLastWeekLabel,
323
+ leaderboardAllTimeEmpty: strings.leaderboardAllTimeEmpty,
303
324
  gamePlay: strings.gamePlay,
304
325
  gameResume: strings.gameResume,
305
326
  gameLocked: strings.gameLocked,
@@ -5576,18 +5597,58 @@ function LeaderboardAllTimeRow({
5576
5597
  ] });
5577
5598
  }
5578
5599
 
5579
- // src/components/Leaderboard.tsx
5600
+ // src/components/LeaderboardEmpty.tsx
5580
5601
  import { jsx as jsx68, jsxs as jsxs61 } from "react/jsx-runtime";
5602
+ function LeaderboardEmpty({
5603
+ segment,
5604
+ lastWeek,
5605
+ weeklyPrize,
5606
+ onPlay,
5607
+ ui
5608
+ }) {
5609
+ if (segment === "alltime") {
5610
+ return /* @__PURE__ */ jsxs61("div", { className: "ss-w-lb-empty ss-w-lb-empty--alltime", children: [
5611
+ /* @__PURE__ */ jsx68("div", { className: "ss-w-lb-empty-icon", "aria-hidden": "true", children: "\u{1F4CA}" }),
5612
+ /* @__PURE__ */ jsx68("p", { className: "ss-w-lb-empty-body", children: ui.leaderboardAllTimeEmpty })
5613
+ ] });
5614
+ }
5615
+ const fresh = lastWeek != null;
5616
+ const title = fresh ? ui.leaderboardEmptyFreshTitle : ui.leaderboardEmptyColdTitle;
5617
+ const body = fresh ? ui.leaderboardEmptyFreshBody : ui.leaderboardEmptyColdBody;
5618
+ return /* @__PURE__ */ jsxs61("div", { className: "ss-w-lb-empty", children: [
5619
+ weeklyPrize && /* @__PURE__ */ jsxs61("div", { className: "ss-w-prize", children: [
5620
+ /* @__PURE__ */ jsx68("span", { className: "ss-w-prize-icon", "aria-hidden": "true", children: "\u{1F3C6}" }),
5621
+ /* @__PURE__ */ jsx68("div", { className: "ss-w-prize-body", children: /* @__PURE__ */ jsx68("span", { className: "ss-w-prize-text", children: weeklyPrize }) })
5622
+ ] }),
5623
+ /* @__PURE__ */ jsxs61("div", { className: "ss-w-lb-empty-hero", children: [
5624
+ /* @__PURE__ */ jsx68("div", { className: "ss-w-lb-empty-icon", "aria-hidden": "true", children: fresh ? "\u{1F3C6}" : "\u{1F3AE}" }),
5625
+ /* @__PURE__ */ jsx68("h4", { className: "ss-w-lb-empty-title", children: title }),
5626
+ /* @__PURE__ */ jsx68("p", { className: "ss-w-lb-empty-body", children: body }),
5627
+ onPlay && /* @__PURE__ */ jsx68("button", { type: "button", className: "ss-w-lb-empty-cta", onClick: onPlay, children: ui.leaderboardEmptyCta })
5628
+ ] }),
5629
+ fresh && lastWeek && /* @__PURE__ */ jsxs61("div", { className: "ss-w-lb-last", children: [
5630
+ /* @__PURE__ */ jsx68("span", { className: "ss-w-lb-last-label", children: ui.leaderboardLastWeekLabel }),
5631
+ /* @__PURE__ */ jsx68("span", { className: "ss-w-lb-last-champ", "aria-hidden": "true", children: "\u{1F947}" }),
5632
+ /* @__PURE__ */ jsx68("span", { className: "ss-w-lb-last-handle", children: lastWeek.handle }),
5633
+ /* @__PURE__ */ jsx68("span", { className: "ss-w-lb-last-points", children: formatPoints(lastWeek.points) })
5634
+ ] })
5635
+ ] });
5636
+ }
5637
+
5638
+ // src/components/Leaderboard.tsx
5639
+ import { Fragment as Fragment16, jsx as jsx69, jsxs as jsxs62 } from "react/jsx-runtime";
5581
5640
  function Leaderboard({
5582
5641
  data,
5583
- ui
5642
+ ui,
5643
+ onPlay
5584
5644
  }) {
5585
5645
  const [segment, setSegment] = useState31("weekly");
5586
5646
  const myRow = segment === "weekly" ? data.myWeeklyRow : data.myAllTimeRow;
5587
5647
  const offBoard = myRow !== null && myRow !== void 0 && myRow.rank === -1;
5588
- return /* @__PURE__ */ jsxs61("div", { className: "ss-w-lb2", children: [
5589
- /* @__PURE__ */ jsxs61("div", { className: "ss-w-seg", children: [
5590
- /* @__PURE__ */ jsx68(
5648
+ const isEmpty = segment === "weekly" ? data.weeklyTop.length === 0 : data.allTimeTop.length === 0;
5649
+ return /* @__PURE__ */ jsxs62("div", { className: "ss-w-lb2", children: [
5650
+ /* @__PURE__ */ jsxs62("div", { className: "ss-w-seg", children: [
5651
+ /* @__PURE__ */ jsx69(
5591
5652
  "button",
5592
5653
  {
5593
5654
  type: "button",
@@ -5597,7 +5658,7 @@ function Leaderboard({
5597
5658
  children: ui.leaderboardThisWeek
5598
5659
  }
5599
5660
  ),
5600
- /* @__PURE__ */ jsx68(
5661
+ /* @__PURE__ */ jsx69(
5601
5662
  "button",
5602
5663
  {
5603
5664
  type: "button",
@@ -5608,40 +5669,60 @@ function Leaderboard({
5608
5669
  }
5609
5670
  )
5610
5671
  ] }),
5611
- /* @__PURE__ */ jsx68("div", { className: "ss-w-lb2-rows", children: segment === "weekly" ? data.weeklyTop.map((row) => /* @__PURE__ */ jsx68(
5612
- LeaderboardWeeklyRow,
5672
+ isEmpty ? /* @__PURE__ */ jsx69(
5673
+ LeaderboardEmpty,
5613
5674
  {
5614
- row,
5615
- isMe: row.operatorUserId === data.myWeeklyRow?.operatorUserId
5616
- },
5617
- row.operatorUserId
5618
- )) : data.allTimeTop.map((row) => /* @__PURE__ */ jsx68(
5619
- LeaderboardAllTimeRow,
5620
- {
5621
- row,
5622
- isMe: row.operatorUserId === data.myAllTimeRow?.operatorUserId
5623
- },
5624
- row.operatorUserId
5625
- )) }),
5626
- /* @__PURE__ */ jsx68("div", { className: "ss-w-kitline", children: "\u{1F3BD}" }),
5627
- myRow != null && (offBoard ? /* @__PURE__ */ jsx68("div", { className: "ss-w-lbgap", children: ui.leaderboardOffBoard }) : /* @__PURE__ */ jsxs61("div", { className: "ss-w-lb2-rows", children: [
5628
- segment === "weekly" && data.myWeeklyRow && /* @__PURE__ */ jsx68(LeaderboardWeeklyRow, { row: data.myWeeklyRow, isMe: true }),
5629
- segment === "alltime" && data.myAllTimeRow && /* @__PURE__ */ jsx68(LeaderboardAllTimeRow, { row: data.myAllTimeRow, isMe: true })
5630
- ] })),
5631
- segment === "alltime" && data.myAllTimeRow && !offBoard && /* @__PURE__ */ jsx68("div", { className: "ss-w-lb2-rows", children: /* @__PURE__ */ jsx68("div", { className: "ss-w-lb2-row", children: /* @__PURE__ */ jsx68("span", { className: "ss-w-lb2-handle", children: formatPoints(data.allTimeTop.reduce((s, r) => s + r.allTimePoints, 0)) }) }) })
5675
+ segment,
5676
+ lastWeek: data.lastWeek,
5677
+ weeklyPrize: data.weeklyPrize,
5678
+ onPlay,
5679
+ ui
5680
+ }
5681
+ ) : /* @__PURE__ */ jsxs62(Fragment16, { children: [
5682
+ /* @__PURE__ */ jsx69("div", { className: "ss-w-lb2-rows", children: segment === "weekly" ? data.weeklyTop.map((row) => /* @__PURE__ */ jsx69(
5683
+ LeaderboardWeeklyRow,
5684
+ {
5685
+ row,
5686
+ isMe: row.operatorUserId === data.myWeeklyRow?.operatorUserId
5687
+ },
5688
+ row.operatorUserId
5689
+ )) : data.allTimeTop.map((row) => /* @__PURE__ */ jsx69(
5690
+ LeaderboardAllTimeRow,
5691
+ {
5692
+ row,
5693
+ isMe: row.operatorUserId === data.myAllTimeRow?.operatorUserId
5694
+ },
5695
+ row.operatorUserId
5696
+ )) }),
5697
+ /* @__PURE__ */ jsx69("div", { className: "ss-w-kitline", children: "\u{1F3BD}" }),
5698
+ myRow != null && (offBoard ? /* @__PURE__ */ jsx69("div", { className: "ss-w-lbgap", children: ui.leaderboardOffBoard }) : /* @__PURE__ */ jsxs62("div", { className: "ss-w-lb2-rows", children: [
5699
+ segment === "weekly" && data.myWeeklyRow && /* @__PURE__ */ jsx69(LeaderboardWeeklyRow, { row: data.myWeeklyRow, isMe: true }),
5700
+ segment === "alltime" && data.myAllTimeRow && /* @__PURE__ */ jsx69(LeaderboardAllTimeRow, { row: data.myAllTimeRow, isMe: true })
5701
+ ] })),
5702
+ segment === "alltime" && data.myAllTimeRow && !offBoard && /* @__PURE__ */ jsx69("div", { className: "ss-w-lb2-rows", children: /* @__PURE__ */ jsx69("div", { className: "ss-w-lb2-row", children: /* @__PURE__ */ jsx69("span", { className: "ss-w-lb2-handle", children: formatPoints(data.allTimeTop.reduce((s, r) => s + r.allTimePoints, 0)) }) }) })
5703
+ ] })
5632
5704
  ] });
5633
5705
  }
5634
5706
 
5635
5707
  // src/components/LeaderboardPanel.tsx
5636
- import { jsx as jsx69 } from "react/jsx-runtime";
5637
- function LeaderboardPanel({ loggedIn, data, ui }) {
5638
- if (!loggedIn) return /* @__PURE__ */ jsx69(GamesLoginWall, { ui });
5639
- if (data === null) return /* @__PURE__ */ jsx69("div", { className: "ss-w-mon-list" });
5640
- return /* @__PURE__ */ jsx69("div", { className: "ss-w-mon-list", children: /* @__PURE__ */ jsx69(Leaderboard, { data, ui }) });
5708
+ import { jsx as jsx70 } from "react/jsx-runtime";
5709
+ var EMPTY_PAYLOAD = {
5710
+ week: "",
5711
+ weeklyTop: [],
5712
+ myWeeklyRow: null,
5713
+ allTimeTop: [],
5714
+ myAllTimeRow: null,
5715
+ weeklyPrize: null,
5716
+ lastWeek: null
5717
+ };
5718
+ function LeaderboardPanel({ loggedIn, data, loading, onPlay, ui }) {
5719
+ if (!loggedIn) return /* @__PURE__ */ jsx70(GamesLoginWall, { ui });
5720
+ if (data === null && loading) return /* @__PURE__ */ jsx70("div", { className: "ss-w-mon-list" });
5721
+ return /* @__PURE__ */ jsx70("div", { className: "ss-w-mon-list", children: /* @__PURE__ */ jsx70(Leaderboard, { data: data ?? EMPTY_PAYLOAD, ui, onPlay }) });
5641
5722
  }
5642
5723
 
5643
5724
  // src/components/ChatPanel.tsx
5644
- import { jsx as jsx70, jsxs as jsxs62 } from "react/jsx-runtime";
5725
+ import { jsx as jsx71, jsxs as jsxs63 } from "react/jsx-runtime";
5645
5726
  var FULLSCREEN_QUERY = "(max-width: 639px)";
5646
5727
  function useIsModal() {
5647
5728
  const [modal, setModal] = useState32(false);
@@ -5672,8 +5753,8 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
5672
5753
  useEffect14(() => {
5673
5754
  if (monitor && monitor.activeTab !== "chat" && state.isStreaming) monitor.markChatActivity();
5674
5755
  }, [monitor, state.isStreaming, state.messages.length]);
5675
- return /* @__PURE__ */ jsxs62("div", { className: "ss-w-panel", role: "dialog", "aria-modal": isModal, "aria-label": ui.chatDialogLabel, children: [
5676
- /* @__PURE__ */ jsx70(
5756
+ return /* @__PURE__ */ jsxs63("div", { className: "ss-w-panel", role: "dialog", "aria-modal": isModal, "aria-label": ui.chatDialogLabel, children: [
5757
+ /* @__PURE__ */ jsx71(
5677
5758
  ChatHeader,
5678
5759
  {
5679
5760
  onClose: close,
@@ -5686,7 +5767,7 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
5686
5767
  moreOptionsLabel: ui.moreOptions
5687
5768
  }
5688
5769
  ),
5689
- monitor && /* @__PURE__ */ jsx70(
5770
+ monitor && /* @__PURE__ */ jsx71(
5690
5771
  TabBar,
5691
5772
  {
5692
5773
  monitor,
@@ -5698,19 +5779,28 @@ function ChatPanel({ controller, ui, slip, onDashboardTap, monitor, discovery, g
5698
5779
  gamesEnabled: gamesResult?.enabled ?? false
5699
5780
  }
5700
5781
  ),
5701
- /* @__PURE__ */ jsx70(
5782
+ /* @__PURE__ */ jsx71(
5702
5783
  "div",
5703
5784
  {
5704
5785
  style: !monitor || monitor.activeTab === "chat" ? { display: "contents" } : { position: "absolute", inset: 0, visibility: "hidden", display: "flex", flexDirection: "column" },
5705
- children: /* @__PURE__ */ jsx70(MessageList, { controller, ui, slip, onDashboardTap, monitor })
5786
+ children: /* @__PURE__ */ jsx71(MessageList, { controller, ui, slip, onDashboardTap, monitor })
5706
5787
  }
5707
5788
  ),
5708
- monitor && discovery && monitor.activeTab === "today" && /* @__PURE__ */ jsx70(TodayPanel, { discovery, ui, monitor }),
5709
- monitor && monitor.activeTab === "following" && /* @__PURE__ */ jsx70(MatchesPanel, { monitor, ui, slip }),
5710
- monitor && monitor.activeTab === "odds" && /* @__PURE__ */ jsx70(OddsPanel, { monitor, ui, slip }),
5711
- monitor && monitor.activeTab === "games" && gamesResult && /* @__PURE__ */ jsx70(GamesPanel, { loggedIn: !!loggedIn, games: gamesResult.games, ui, conversation }),
5712
- monitor && monitor.activeTab === "leaderboard" && leaderboardResult && /* @__PURE__ */ jsx70(LeaderboardPanel, { loggedIn: !!loggedIn, data: leaderboardResult.data, ui }),
5713
- /* @__PURE__ */ jsx70(ChatInput, { placeholder: ui.placeholder, streaming: state.isStreaming, onSend: handleSend, onStop: stop, stopLabel: ui.stopResponse, sendLabel: ui.sendMessage })
5789
+ monitor && discovery && monitor.activeTab === "today" && /* @__PURE__ */ jsx71(TodayPanel, { discovery, ui, monitor }),
5790
+ monitor && monitor.activeTab === "following" && /* @__PURE__ */ jsx71(MatchesPanel, { monitor, ui, slip }),
5791
+ monitor && monitor.activeTab === "odds" && /* @__PURE__ */ jsx71(OddsPanel, { monitor, ui, slip }),
5792
+ monitor && monitor.activeTab === "games" && gamesResult && /* @__PURE__ */ jsx71(GamesPanel, { loggedIn: !!loggedIn, games: gamesResult.games, ui, conversation }),
5793
+ monitor && monitor.activeTab === "leaderboard" && leaderboardResult && /* @__PURE__ */ jsx71(
5794
+ LeaderboardPanel,
5795
+ {
5796
+ loggedIn: !!loggedIn,
5797
+ data: leaderboardResult.data,
5798
+ loading: leaderboardResult.loading,
5799
+ onPlay: () => monitor.setActiveTab("games"),
5800
+ ui
5801
+ }
5802
+ ),
5803
+ /* @__PURE__ */ jsx71(ChatInput, { placeholder: ui.placeholder, streaming: state.isStreaming, onSend: handleSend, onStop: stop, stopLabel: ui.stopResponse, sendLabel: ui.sendMessage })
5714
5804
  ] });
5715
5805
  }
5716
5806
 
@@ -6664,6 +6754,20 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
6664
6754
  /* Off-board treatment: dashed pill indicating rank is outside top N */
6665
6755
  .ss-w-lbgap { display: flex; align-items: center; justify-content: center; gap: 6px; padding: 8px 12px; font-size: 11.5px; color: var(--ss-w-faint); border: 1px dashed var(--ss-w-line); border-radius: 10px; }
6666
6756
 
6757
+ /* ---- Leaderboard empty / weekly-reset default state ---- */
6758
+ .ss-w-lb-empty { display: flex; flex-direction: column; gap: 12px; flex: 1; }
6759
+ .ss-w-lb-empty-hero { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; gap: 8px; padding: 20px 16px; border: 1px dashed color-mix(in srgb, var(--ss-w-cta) 30%, var(--ss-w-line)); border-radius: 14px; background: color-mix(in srgb, var(--ss-w-cta) 6%, var(--ss-w-panel)); }
6760
+ .ss-w-lb-empty--alltime { align-items: center; justify-content: center; text-align: center; padding: 24px 16px; }
6761
+ .ss-w-lb-empty-icon { font-size: 30px; line-height: 1; }
6762
+ .ss-w-lb-empty-title { margin: 2px 0 0; font-size: 16px; font-weight: 800; color: var(--ss-w-ink); }
6763
+ .ss-w-lb-empty-body { margin: 0; max-width: 30ch; font-size: 12.5px; line-height: 1.4; color: var(--ss-w-faint); }
6764
+ .ss-w-lb-empty-cta { margin-top: 6px; border: none; border-radius: 10px; padding: 9px 18px; font: inherit; font-size: 13px; font-weight: 700; color: var(--ss-w-cta-ink); background: var(--ss-w-cta); cursor: pointer; }
6765
+ .ss-w-lb-empty-cta:hover { filter: brightness(1.04); }
6766
+ .ss-w-lb-last { display: flex; align-items: center; gap: 7px; padding-top: 10px; border-top: 1px solid var(--ss-w-line); font-size: 11px; }
6767
+ .ss-w-lb-last-label { text-transform: uppercase; letter-spacing: .05em; font-weight: 700; color: var(--ss-w-faint); }
6768
+ .ss-w-lb-last-handle { flex: 1; min-width: 0; font-weight: 600; color: var(--ss-w-ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
6769
+ .ss-w-lb-last-points { flex: none; font-weight: 750; font-variant-numeric: tabular-nums; color: var(--ss-w-ink); }
6770
+
6667
6771
  /* ---- Mystery Tiger game screen (D3) ---- */
6668
6772
  .ss-w-gt { display: flex; flex-direction: column; gap: 10px; }
6669
6773
  /* Typeahead wrapper: relative so the dropdown can position under it */
@@ -6995,7 +7099,7 @@ var WIDGET_CSS = `.ss-w-root { all: revert; }
6995
7099
  `;
6996
7100
 
6997
7101
  // src/StatsWidget.tsx
6998
- import { jsx as jsx71 } from "react/jsx-runtime";
7102
+ import { jsx as jsx72 } from "react/jsx-runtime";
6999
7103
  function buildClient(props) {
7000
7104
  try {
7001
7105
  if ("client" in props && props.client) {
@@ -7134,7 +7238,7 @@ function StatsWidget(props) {
7134
7238
  }, [built, ui.injectStyles]);
7135
7239
  if (!built) return null;
7136
7240
  const attrs = themeAttrs(ui);
7137
- return /* @__PURE__ */ jsx71(EventLogContext.Provider, { value: logger, children: /* @__PURE__ */ jsx71("div", { ref: rootRef, className: "ss-w-root", "data-ss-w-theme": attrs["data-ss-w-theme"], "data-ss-w-pos": attrs["data-ss-w-pos"], style: attrs.style, children: controller.state.isOpen ? /* @__PURE__ */ jsx71(
7241
+ return /* @__PURE__ */ jsx72(EventLogContext.Provider, { value: logger, children: /* @__PURE__ */ jsx72("div", { ref: rootRef, className: "ss-w-root", "data-ss-w-theme": attrs["data-ss-w-theme"], "data-ss-w-pos": attrs["data-ss-w-pos"], style: attrs.style, children: controller.state.isOpen ? /* @__PURE__ */ jsx72(
7138
7242
  ChatPanel,
7139
7243
  {
7140
7244
  controller,
@@ -7148,7 +7252,7 @@ function StatsWidget(props) {
7148
7252
  loggedIn: !!operatorUserId,
7149
7253
  conversation: built?.conversation ?? null
7150
7254
  }
7151
- ) : /* @__PURE__ */ jsx71(
7255
+ ) : /* @__PURE__ */ jsx72(
7152
7256
  ChatFab,
7153
7257
  {
7154
7258
  label: ui.launcherLabel,