@kenz1117/dsh-ui-usage-billing 0.9.19 → 1.0.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/lib/client.js CHANGED
@@ -31,18 +31,25 @@ window.__ModuleLoader__.load({
31
31
  };
32
32
  /** localStorage key(与 budget store 的 `dsh.ui-usage-billing.*` 命名空间一致)。 */
33
33
  const FLOAT_WINDOW_STORAGE_KEY = "dsh.ui-usage-billing.float";
34
- /** 读取浮窗偏好(含损坏/缺失回退到默认)。仅在浏览器半区调用。 */
34
+ /** 读取浮窗偏好(含损坏/缺失回退到默认)。仅在浏览器半区调用。
35
+ * 返回全新对象(含 targets 数组拷贝),避免调用方就地修改污染共享默认值。 */
35
36
  function loadFloatWindowPrefs() {
36
37
  try {
37
38
  const raw = localStorage.getItem(FLOAT_WINDOW_STORAGE_KEY);
38
- if (raw === null) return DEFAULT_FLOAT_WINDOW_PREFS;
39
+ if (raw === null) return {
40
+ ...DEFAULT_FLOAT_WINDOW_PREFS,
41
+ targets: [...DEFAULT_FLOAT_WINDOW_PREFS.targets]
42
+ };
39
43
  const parsed = JSON.parse(raw);
40
44
  return {
41
45
  mode: parsed.mode === "subscription" ? "subscription" : "combined",
42
46
  targets: Array.isArray(parsed.targets) ? parsed.targets.filter((entry) => typeof entry === "string") : []
43
47
  };
44
48
  } catch {
45
- return DEFAULT_FLOAT_WINDOW_PREFS;
49
+ return {
50
+ ...DEFAULT_FLOAT_WINDOW_PREFS,
51
+ targets: [...DEFAULT_FLOAT_WINDOW_PREFS.targets]
52
+ };
46
53
  }
47
54
  }
48
55
  /** 写入浮窗偏好。失败静默(展示偏好非关键)。 */
@@ -53,7 +60,7 @@ window.__ModuleLoader__.load({
53
60
  }
54
61
  //#endregion
55
62
  //#region \0dsh-css:/Users/ken/deepseek-harness/packages/client/ui-usage-billing/src/client/UsageBilling.module.css.mjs
56
- const css = ".VWh0dG_railButton{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);width:36px;height:36px;color:var(--dsw-alias-label-secondary);cursor:pointer;border-radius:8px;flex:none;justify-content:center;align-items:center;padding:0;transition:border-color .16s,color .16s;display:flex}.VWh0dG_railButton:hover,.VWh0dG_railButton:focus-visible{border-color:var(--dsw-static-blue-500);color:var(--dsw-static-blue-500);outline:none}.VWh0dG_railButton svg{stroke-width:2px;width:18px;height:18px}.VWh0dG_trigger{border:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 82%, transparent);background:color-mix(in srgb, var(--dsw-alias-bg-layer-2) 78%, transparent);-webkit-backdrop-filter:blur(10px)saturate(1.2);width:100%;min-width:0;box-shadow:inset 0 1px 0 color-mix(in srgb, var(--dsw-alias-label-primary) 7%, transparent);color:var(--dsw-alias-label-primary);cursor:pointer;text-align:left;border-radius:14px;align-items:center;gap:10px;padding:9px 12px;transition:border-color .16s,transform .16s,box-shadow .16s;display:flex;position:relative;overflow:hidden}.VWh0dG_trigger:hover,.VWh0dG_trigger:focus-visible{border-color:var(--dsw-static-blue-500);box-shadow:inset 0 1px 0 color-mix(in srgb, var(--dsw-alias-label-primary) 10%, transparent), 0 6px 18px -6px color-mix(in srgb, var(--dsw-static-blue-500) 45%, transparent);outline:none;transform:translateY(-1px)}.VWh0dG_triggerIcon{background:linear-gradient(135deg, var(--dsw-static-blue-500), var(--dsw-static-blue-400));width:30px;height:30px;color:var(--dsw-static-neutral-bluish-00);box-shadow:0 3px 10px -3px color-mix(in srgb, var(--dsw-static-blue-500) 60%, transparent), inset 0 1px 0 color-mix(in srgb, var(--dsw-static-neutral-bluish-00) 22%, transparent);border-radius:10px;flex:none;justify-content:center;align-items:center;display:inline-flex}.VWh0dG_triggerIcon svg{stroke-width:2px;width:16px;height:16px}.VWh0dG_triggerBody{flex-direction:column;flex:1;gap:1px;min-width:0;display:flex}.VWh0dG_triggerRow{align-items:baseline;gap:5px;min-width:0;display:inline-flex}.VWh0dG_triggerAmount{color:var(--dsw-alias-label-primary);letter-spacing:-.02em;font-variant-numeric:tabular-nums;white-space:nowrap;text-overflow:ellipsis;min-width:0;font-size:17px;font-weight:700;line-height:21px;overflow:hidden}.VWh0dG_triggerSub{color:var(--dsw-alias-label-tertiary);white-space:nowrap;text-overflow:ellipsis;font-size:10px;line-height:14px;overflow:hidden}.VWh0dG_triggerMeta{color:var(--dsw-alias-label-tertiary);white-space:nowrap;letter-spacing:.02em;text-transform:uppercase;text-overflow:ellipsis;min-width:0;font-size:9.5px;font-weight:600;line-height:12px;overflow:hidden}.VWh0dG_triggerSpark{flex:none;align-items:flex-end;gap:2px;height:20px;display:flex}.VWh0dG_triggerSparkBar,.VWh0dG_triggerSparkHot{background:var(--dsw-static-blue-500);opacity:.6;border-radius:1px 1px 0 0;width:3px}.VWh0dG_triggerSparkHot{opacity:1}.VWh0dG_triggerWrap{flex:auto;width:100%;min-width:0;display:block;position:relative;container:VWh0dG_billing-trigger/inline-size}@container VWh0dG_billing-trigger (width<=280px){.VWh0dG_trigger{gap:6px;padding:8px 10px}.VWh0dG_triggerSpark{display:none}}@container VWh0dG_billing-trigger (width<=230px){.VWh0dG_triggerSub{display:none}.VWh0dG_triggerMeta{letter-spacing:0}}@container VWh0dG_billing-trigger (width<=120px){.VWh0dG_triggerIcon,.VWh0dG_triggerSpark,.VWh0dG_triggerSub,.VWh0dG_triggerMeta{display:none}.VWh0dG_trigger{justify-content:center;padding:8px 6px}}.VWh0dG_triggerPop{border:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 80%, transparent);background:color-mix(in srgb, var(--dsw-alias-bg-layer-2) 72%, transparent);-webkit-backdrop-filter:blur(14px)saturate(1.3);box-shadow:0 12px 32px #00000029, inset 0 1px 0 color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent);opacity:0;pointer-events:none;z-index:10;border-radius:14px;flex-direction:column;gap:5px;padding:10px 12px;transition:opacity .16s,transform .16s;display:flex;position:absolute;bottom:calc(100% + 8px);left:0;right:0;overflow:hidden;transform:translateY(4px)}.VWh0dG_triggerPop:before{content:\"\";background:linear-gradient(90deg, transparent 0%, var(--dsw-static-amber-500) 30%, var(--dsw-alias-label-primary) 50%, var(--dsw-static-amber-500) 70%, transparent 100%);opacity:.9;pointer-events:none;background-size:200% 100%;height:1.5px;animation:4s ease-in-out infinite VWh0dG_subscriptionGoldFlow;position:absolute;top:0;left:0;right:0}.VWh0dG_triggerWrap:hover .VWh0dG_triggerPop,.VWh0dG_triggerWrap:focus-within .VWh0dG_triggerPop{opacity:1;transform:translateY(0)}.VWh0dG_triggerPopRow{white-space:nowrap;justify-content:space-between;align-items:baseline;gap:12px;display:flex}.VWh0dG_triggerPopLabel{letter-spacing:.01em;color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;font-size:10.5px;line-height:16px}.VWh0dG_triggerPopValue{min-width:0;color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;justify-content:flex-end;align-items:baseline;gap:8px;font-size:12.5px;font-weight:600;line-height:17px;display:inline-flex}.VWh0dG_triggerPopName{text-overflow:ellipsis;white-space:nowrap;max-width:110px;color:var(--dsw-alias-label-secondary);font-size:12px;font-weight:500;overflow:hidden}.VWh0dG_triggerPopTitle{color:var(--dsw-alias-label-primary);white-space:nowrap;align-items:baseline;gap:8px;font-size:12px;font-weight:700;display:flex}.VWh0dG_triggerPopTitleMonth{color:var(--dsw-alias-label-tertiary);font-size:11px;font-weight:500}.VWh0dG_triggerPopStrong{color:var(--dsw-alias-label-primary);margin-left:8px;font-size:12.5px;font-weight:700}.VWh0dG_triggerPopAlert{color:var(--dsw-static-red-500);white-space:nowrap;font-size:11px;line-height:16px}.VWh0dG_triggerPopValueStack{flex-direction:column;align-items:flex-end;gap:2px;display:flex}.VWh0dG_triggerPopMuted{color:var(--dsw-alias-label-tertiary);font-weight:500}.VWh0dG_triggerPopHead{justify-content:space-between;align-items:baseline;gap:10px;display:flex}.VWh0dG_triggerPopUpdated{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:10px}.VWh0dG_triggerPopMetrics{grid-template-columns:1fr 1fr;gap:7px 12px;display:grid}.VWh0dG_triggerPopMetric{flex-direction:column;align-items:flex-start;gap:1px;display:flex}.VWh0dG_triggerPopMetricLabel{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:10px}.VWh0dG_triggerPopMetricValue{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:14px;font-weight:700;line-height:18px}.VWh0dG_triggerPopMetricHighlight{color:var(--dsw-static-amber-500)}.VWh0dG_triggerPopFoot{border-top:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 70%, transparent);flex-direction:column;gap:4px;padding-top:6px;display:flex}.VWh0dG_triggerPopFootTitle{text-align:center;letter-spacing:.05em;color:var(--dsw-alias-label-tertiary);border-bottom:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 70%, transparent);padding-bottom:4px;font-size:10px;font-weight:600}.VWh0dG_triggerPopFootNotes{flex-direction:column;gap:1px;min-width:0;display:flex}.VWh0dG_triggerPopFootNote{align-items:baseline;gap:4px;min-width:0;display:flex}.VWh0dG_triggerPopFootName{color:var(--dsw-alias-label-tertiary);white-space:nowrap;text-overflow:ellipsis;font-size:10px;overflow:hidden}.VWh0dG_triggerPopBadge{white-space:nowrap;border-radius:5px;flex:none;padding:1px 6px;font-size:9.5px;font-weight:600;line-height:14px}.VWh0dG_triggerPopBadgeDirect{background:color-mix(in srgb, var(--dsw-alias-label-primary) 12%, transparent);color:var(--dsw-alias-label-primary)}.VWh0dG_triggerPopBadgeSub{background:color-mix(in srgb, var(--dsw-static-amber-500) 18%, transparent);color:var(--dsw-static-amber-500)}.VWh0dG_triggerPopFootStrong{color:var(--dsw-alias-label-secondary);font-weight:600}.VWh0dG_triggerPopFootStatus{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:14px;font-weight:700;line-height:18px}.VWh0dG_triggerPopFootStatusLow{color:var(--dsw-static-red-500)}.VWh0dG_triggerPopOpenBtn{pointer-events:auto;border:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 80%, transparent);color:var(--dsw-alias-label-primary);background:color-mix(in srgb, var(--dsw-alias-bg-layer-3) 70%, transparent);cursor:pointer;border-radius:999px;flex:none;padding:5px 11px;font-size:11px;font-weight:600;transition:border-color .16s,background-color .16s}.VWh0dG_triggerPopOpenBtn:hover{border-color:var(--dsw-static-blue-500);background:color-mix(in srgb, var(--dsw-static-blue-500) 12%, var(--dsw-alias-bg-layer-3))}.VWh0dG_triggerPopBars{border-top:1px solid var(--dsw-alias-border-l1);align-items:flex-end;gap:4px;height:22px;margin-top:4px;padding-top:8px;display:flex}.VWh0dG_triggerPopBar{background:var(--dsw-static-blue-500);border-radius:2px;flex:1;transition:height .2s}.VWh0dG_dashboardModal{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);width:min(760px,100vw - 48px);max-height:min(760px,88vh);box-shadow:var(--dsw-shadow-lv3);animation:.18s ease-out VWh0dG_dashboardIn}@keyframes VWh0dG_dashboardIn{0%{opacity:0;transform:translateY(8px)scale(.98)}to{opacity:1;transform:none}}div[role=presentation]:has(>.dsh-billing-modal)>div[aria-hidden=true]:first-child{backdrop-filter:blur(8px)saturate(1.25)}.VWh0dG_dashboard{flex-direction:column;width:100%;max-height:min(760px,88vh);display:flex}.VWh0dG_dashboardHead{border-bottom:1px solid var(--dsw-alias-border-l1);justify-content:space-between;align-items:flex-start;gap:12px;padding:20px 24px 14px;display:flex}.VWh0dG_dashboardTitle{color:var(--dsw-alias-label-primary);margin:0;font-size:17px;font-weight:600;line-height:24px}.VWh0dG_dashboardSubtitle{color:var(--dsw-alias-label-caption);margin:3px 0 0;font-size:12px;line-height:17px}.VWh0dG_closeButton{width:30px;height:30px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:none;border-radius:8px;flex:none;justify-content:center;align-items:center;transition:background-color .14s;display:inline-flex}.VWh0dG_closeButton:hover{background:var(--dsw-alias-interactive-bg-hover)}.VWh0dG_closeButton svg{stroke-width:2px;width:16px;height:16px}.VWh0dG_dashboardBody{flex-direction:column;gap:14px;padding:16px 24px 24px;display:flex;overflow-y:auto}.VWh0dG_tabNav{border-bottom:1px solid var(--dsw-alias-border-l1);align-items:center;gap:4px;padding:10px 24px;display:flex}.VWh0dG_tabButton{color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:999px;padding:5px 14px;font-size:12.5px;font-weight:500;line-height:18px;transition:background-color .16s,color .16s,box-shadow .16s}.VWh0dG_tabButton:hover,.VWh0dG_tabButton:focus-visible{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-interactive-bg-hover);outline:none}.VWh0dG_tabButtonActive,.VWh0dG_tabButtonActive:hover,.VWh0dG_tabButtonActive:focus-visible{background:var(--dsw-static-blue-500);color:var(--dsw-static-neutral-bluish-00);font-weight:600}.VWh0dG_tabPanel{flex-direction:column;gap:14px;animation:.14s ease-out VWh0dG_tabPanelIn;display:flex}@keyframes VWh0dG_tabPanelIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}.VWh0dG_reconcileNotice{border:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 78%, transparent);background:color-mix(in srgb, var(--dsw-alias-bg-layer-2) 62%, transparent);color:var(--dsw-alias-label-secondary);border-radius:10px;align-items:flex-start;gap:10px;padding:10px 12px;font-size:12px;line-height:1.55;display:flex}.VWh0dG_reconcileIcon{color:var(--dsw-alias-label-tertiary);flex:none;margin-top:1px;display:inline-flex}.VWh0dG_reconcileText{flex:1}.VWh0dG_reconcileDismiss{color:var(--dsw-alias-label-tertiary);cursor:pointer;white-space:nowrap;background:0 0;border:none;border-radius:6px;flex:none;padding:2px 8px;font-size:12px;line-height:1.4;transition:color .15s,background-color .15s}.VWh0dG_reconcileDismiss:hover{color:var(--dsw-alias-label-primary);background:color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent)}.VWh0dG_hero{border:1px solid var(--dsw-alias-border-l1);background:linear-gradient(180deg, var(--dsw-alias-bg-layer-2), var(--dsw-alias-bg-layer-1));box-shadow:inset 0 1px 0 color-mix(in srgb, var(--dsw-static-neutral-bluish-00) 30%, transparent);border-radius:16px;flex-direction:column;gap:18px;padding:22px 24px;display:flex;position:relative;overflow:hidden}.VWh0dG_heroTop{justify-content:space-between;align-items:center;gap:24px;display:flex}.VWh0dG_heroMain{flex-direction:column;gap:2px;min-width:0;display:flex}.VWh0dG_heroLabel{color:var(--dsw-alias-label-tertiary);text-transform:uppercase;letter-spacing:.08em;white-space:nowrap;font-size:11px;line-height:16px}.VWh0dG_heroReadout{align-items:baseline;gap:4px;display:flex}.VWh0dG_heroCurrency{letter-spacing:-.01em;color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;font-size:20px;font-weight:600;line-height:30px}.VWh0dG_heroValue{letter-spacing:-.03em;font-variant-numeric:tabular-nums;white-space:nowrap;color:var(--dsw-alias-label-primary);font-size:56px;font-weight:700;line-height:64px}.VWh0dG_heroMeta{color:var(--dsw-alias-label-caption);white-space:nowrap;margin-top:4px;font-size:12px;line-height:17px}.VWh0dG_heroGauge{flex:none;width:96px;height:96px;position:relative}.VWh0dG_heroGaugeSvg{width:100%;height:100%;display:block;transform:rotate(-90deg)}.VWh0dG_heroGaugeTrack{fill:none;stroke:var(--dsw-alias-bg-module-platform);stroke-width:9px}.VWh0dG_heroGaugeArc{fill:none;stroke:var(--dsw-static-blue-500);stroke-width:9px;stroke-linecap:round;transition:stroke-dasharray .26s}.VWh0dG_heroGaugeArcOver{stroke:var(--dsw-static-red-500)}.VWh0dG_heroGaugeCenter{flex-direction:column;justify-content:center;align-items:center;gap:1px;display:flex;position:absolute;inset:0}.VWh0dG_heroGaugePct{letter-spacing:-.02em;font-variant-numeric:tabular-nums;color:var(--dsw-alias-label-primary);font-size:18px;font-weight:700;line-height:22px}.VWh0dG_heroGaugePctOver{color:var(--dsw-static-red-500)}.VWh0dG_heroGaugeLabel{color:var(--dsw-alias-label-tertiary);font-size:10px;line-height:14px}.VWh0dG_heroSide{border-top:1px solid var(--dsw-alias-border-l1);align-items:stretch;padding-top:14px;display:flex}.VWh0dG_heroSideItem{flex-direction:column;flex:1;gap:3px;min-width:0;padding-left:16px;display:flex}.VWh0dG_heroSideItem:first-child{padding-left:0}.VWh0dG_heroSideLabel{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:11px;line-height:15px}.VWh0dG_heroSideValue{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;letter-spacing:-.01em;white-space:nowrap;align-items:baseline;gap:6px;font-size:18px;font-weight:600;line-height:24px;display:inline-flex}.VWh0dG_heroSideSpacer{flex:1;display:block}.VWh0dG_delta{align-items:center;gap:2px;margin-left:4px;font-size:11px;font-weight:600;line-height:17px;display:inline-flex}.VWh0dG_deltaUp{color:var(--dsw-static-green-500)}.VWh0dG_deltaDown{color:var(--dsw-static-red-500)}.VWh0dG_unpricedHint{border:1px solid color-mix(in srgb, var(--dsw-static-amber-500) 30%, transparent);background:color-mix(in srgb, var(--dsw-static-amber-500) 8%, transparent);color:var(--dsw-static-amber-500);border-radius:8px;align-items:center;padding:8px 12px;font-size:11.5px;font-weight:500;line-height:17px;display:flex}.VWh0dG_kpiGrid{grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;display:grid}.VWh0dG_kpiTile{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:14px;flex-direction:column;gap:3px;padding:14px 15px;transition:border-color .16s;display:flex;position:relative;overflow:hidden}.VWh0dG_kpiTile:hover{border-color:var(--dsw-alias-border-l2)}.VWh0dG_kpiLabel{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:15px}.VWh0dG_kpiValue{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;letter-spacing:-.01em;font-size:22px;font-weight:600;line-height:28px}.VWh0dG_kpiGreen{color:var(--dsw-static-green-500)}.VWh0dG_kpiDetail{color:var(--dsw-alias-label-caption);white-space:nowrap;text-overflow:ellipsis;font-size:11px;line-height:15px;overflow:hidden}.VWh0dG_panel{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:16px;flex-direction:column;gap:10px;padding:16px 18px;transition:border-color .16s;display:flex}.VWh0dG_panelHead{justify-content:space-between;align-items:baseline;gap:10px;display:flex}.VWh0dG_panelTitle{letter-spacing:-.005em;color:var(--dsw-alias-label-primary);margin:0;font-size:14px;font-weight:600;line-height:20px}.VWh0dG_panelHint{color:var(--dsw-alias-label-caption);white-space:nowrap;font-size:11px;line-height:16px}.VWh0dG_pricingTip{color:var(--dsw-alias-label-caption);margin:0 0 2px;font-size:11px;line-height:16px}.VWh0dG_rangeToggle{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:8px;gap:2px;padding:2px;display:inline-flex}.VWh0dG_rangeButton{color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:6px;padding:2px 8px;font-size:11px;line-height:16px;transition:background-color .14s,color .14s}.VWh0dG_rangeButtonActive{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary);font-weight:600}.VWh0dG_exportBar{justify-content:flex-end;align-items:center;gap:8px;display:flex}.VWh0dG_exportLabel{color:var(--dsw-alias-label-caption);font-size:11px;line-height:16px}.VWh0dG_exportButton{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-secondary);cursor:pointer;border-radius:999px;padding:4px 12px;font-size:11.5px;line-height:16px;transition:border-color .16s,color .16s,background-color .16s}.VWh0dG_exportButton:hover,.VWh0dG_exportButton:focus-visible{border-color:var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);outline:none}.VWh0dG_shareTrack{background:var(--dsw-alias-bg-module-platform);border-radius:999px;height:10px;display:flex;overflow:hidden}.VWh0dG_shareSeg{height:100%;transition:width .2s}.VWh0dG_shareSegPeak{background:var(--dsw-static-blue-500)}.VWh0dG_shareSegOff{background:color-mix(in srgb, var(--dsw-static-blue-500) 25%, var(--dsw-alias-bg-module-platform))}.VWh0dG_shareSegUser{background:var(--dsw-static-blue-500)}.VWh0dG_shareSegAssistant{background:var(--dsw-static-green-500)}.VWh0dG_shareSegTool{background:var(--dsw-static-amber-500)}.VWh0dG_shareLegend{align-items:center;gap:16px;display:flex}.VWh0dG_shareItem{color:var(--dsw-alias-label-secondary);align-items:baseline;gap:6px;font-size:12px;line-height:17px;display:inline-flex}.VWh0dG_bucketCost{align-items:baseline;gap:3px;display:inline-flex}.VWh0dG_bucketOfficial{color:var(--dsw-static-blue-500);font-weight:600}.VWh0dG_bucketSep{color:var(--dsw-alias-label-dimmed)}.VWh0dG_bucketThird{color:var(--dsw-alias-label-secondary)}.VWh0dG_bucketSummary{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;display:grid}.VWh0dG_bucketStat{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:12px;flex-direction:column;gap:4px;padding:12px 14px;display:flex}.VWh0dG_bucketStatLabel{color:var(--dsw-alias-label-tertiary);text-transform:uppercase;letter-spacing:.05em;font-size:11px;line-height:15px}.VWh0dG_bucketStatValue{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;letter-spacing:-.01em;font-size:20px;font-weight:700;line-height:26px}.VWh0dG_bucketStatSub{color:var(--dsw-alias-label-caption);font-variant-numeric:tabular-nums;font-size:11px;line-height:16px}.VWh0dG_shareDot{border-radius:50%;flex:none;align-self:center;width:8px;height:8px}.VWh0dG_shareValue{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-weight:600}.VWh0dG_budget{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:14px;flex-direction:column;gap:8px;padding:12px 16px;display:flex}.VWh0dG_budgetHead{justify-content:space-between;align-items:baseline;gap:10px;display:flex}.VWh0dG_budgetLabel{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:600}.VWh0dG_budgetValue{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:12px;line-height:17px}.VWh0dG_budgetControls{align-items:center;gap:8px;min-width:0;display:inline-flex}.VWh0dG_budgetInputWrap{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:6px;align-items:center;gap:2px;padding:2px 6px;display:inline-flex}.VWh0dG_budgetInputWrap:focus-within{border-color:var(--dsw-alias-border-l3)}.VWh0dG_budgetUnit{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}.VWh0dG_budgetInput{width:64px;color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;text-align:right;background:0 0;border:none;padding:0;font-size:12px;line-height:16px}.VWh0dG_budgetInput:focus-visible{outline:none}.VWh0dG_switch{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-module-platform);cursor:pointer;border-radius:999px;flex:none;width:30px;height:17px;padding:0;transition:background-color .16s,border-color .16s;position:relative}.VWh0dG_switchOn{border-color:var(--dsw-alias-border-l1);background:var(--dsw-alias-label-primary)}.VWh0dG_switchKnob{background:var(--dsw-static-neutral-bluish-00);border-radius:50%;width:11px;height:11px;transition:transform .16s;position:absolute;top:2px;left:2px}.VWh0dG_switchOn .VWh0dG_switchKnob{transform:translate(13px)}.VWh0dG_budgetTrack{background:var(--dsw-alias-bg-module-platform);border-radius:999px;height:6px;overflow:hidden}.VWh0dG_budgetFill{background:var(--dsw-static-blue-500);border-radius:999px;height:100%;transition:width .2s}.VWh0dG_budgetFillWarn{background:var(--dsw-static-amber-500)}.VWh0dG_budgetFillOver{background:var(--dsw-static-red-500);animation:1.6s ease-in-out infinite VWh0dG_budgetOverPulse}@keyframes VWh0dG_budgetOverPulse{50%{opacity:.55}}.VWh0dG_chartWrap{width:100%;position:relative}.VWh0dG_chartSvg{width:100%;height:auto;display:block}.VWh0dG_chartEmpty{height:140px;color:var(--dsw-alias-label-caption);justify-content:center;align-items:center;font-size:13px;display:flex}.VWh0dG_emptyRow{text-align:center;color:var(--dsw-alias-label-caption);padding:28px 0;font-size:13px}.VWh0dG_chartGrid{stroke:var(--dsw-alias-border-l1);stroke-width:1px}.VWh0dG_chartAxisLabel{fill:var(--dsw-alias-label-tertiary);font-size:10px}.VWh0dG_chartBar{fill:var(--dsw-static-blue-500);opacity:.7}.VWh0dG_chartBar:hover{opacity:1}.VWh0dG_chartStack{stroke:var(--dsw-alias-bg-layer-1);stroke-width:.75px}.VWh0dG_chartStack:hover{opacity:.9}.VWh0dG_chartLine{stroke:var(--dsw-static-blue-500);stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.VWh0dG_chartCrosshair{stroke:var(--dsw-alias-label-dimmed);stroke-width:1px;stroke-dasharray:3 3}.VWh0dG_chartDot{fill:var(--dsw-static-neutral-bluish-00);stroke:var(--dsw-static-blue-500);stroke-width:2px}.VWh0dG_chartTooltip{pointer-events:none;z-index:2;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);box-shadow:none;white-space:nowrap;border-radius:8px;padding:8px 10px;position:absolute;transform:translate(-50%,calc(-100% - 10px))}.VWh0dG_chartTooltipDate{color:var(--dsw-alias-label-primary);margin-bottom:3px;font-size:11px;font-weight:600}.VWh0dG_chartTooltipRow{color:var(--dsw-alias-label-secondary);align-items:center;gap:5px;font-size:11px;line-height:17px;display:flex}.VWh0dG_chartTooltipRow strong{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-weight:600}.VWh0dG_chartBarPlaceholder{fill:color-mix(in srgb, var(--dsw-alias-label-secondary) 30%, transparent)}.VWh0dG_chartLegendLine{background:var(--dsw-static-blue-500);border-radius:2px;width:10px;height:3px;display:inline-block}.VWh0dG_chartLegendBar{background:var(--dsw-static-blue-500);opacity:.5;border-radius:2px;width:7px;height:7px;display:inline-block}.VWh0dG_chartTooltipSwatch{border-radius:3px;flex:none;width:8px;height:8px;display:inline-block}.VWh0dG_chartLegend{color:var(--dsw-alias-label-tertiary);justify-content:flex-end;gap:14px;margin-top:2px;font-size:11px;display:flex}.VWh0dG_chartLegend span{align-items:center;gap:5px;display:inline-flex}.VWh0dG_tableScroll{border:1px solid var(--dsw-alias-border-l1);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);border-radius:12px;overflow:auto}.VWh0dG_modelTable,.VWh0dG_pricingTable{border-collapse:collapse;width:100%;font-size:12.5px}.VWh0dG_modelTable th,.VWh0dG_modelTable td,.VWh0dG_pricingTable th,.VWh0dG_pricingTable td{border-bottom:1px solid var(--dsw-alias-border-l1);text-align:left;white-space:nowrap;padding:9px 12px}.VWh0dG_modelTable tbody tr:last-child td,.VWh0dG_pricingTable tbody tr:last-child td{border-bottom:0}.VWh0dG_modelTable thead th,.VWh0dG_pricingTable thead th{color:var(--dsw-alias-label-tertiary);text-transform:uppercase;letter-spacing:.05em;background:0 0;font-size:11px;font-weight:600}.VWh0dG_modelTable tbody tr,.VWh0dG_pricingTable tbody tr{transition:background-color .12s}.VWh0dG_modelTable tbody tr:hover,.VWh0dG_pricingTable tbody tr:hover{background:0 0}.VWh0dG_numCol{text-align:right;font-variant-numeric:tabular-nums}.VWh0dG_costCol{color:var(--dsw-alias-label-primary);font-weight:600}.VWh0dG_na{color:var(--dsw-alias-label-dimmed)}.VWh0dG_modelCell{align-items:center;gap:8px;display:inline-flex}.VWh0dG_modelDot{border-radius:50%;flex:none;width:9px;height:9px}.VWh0dG_modelName{color:var(--dsw-alias-label-primary);font-weight:500;line-height:16px;display:block}.VWh0dG_modelProvider{color:var(--dsw-alias-label-caption);font-size:10.5px;line-height:14px;display:block}.VWh0dG_pricingToggle{cursor:pointer;text-align:left;background:0 0;border:none;justify-content:space-between;align-items:center;gap:10px;width:100%;padding:0;display:flex}.VWh0dG_pricingToggle:hover .VWh0dG_panelTitle,.VWh0dG_pricingToggle:focus-visible .VWh0dG_panelTitle{color:var(--dsw-alias-label-primary)}.VWh0dG_rateBadge{vertical-align:1px;white-space:nowrap;border-radius:999px;align-items:center;margin-left:6px;padding:1px 6px;font-size:10px;font-weight:500;line-height:14px;display:inline-flex}.VWh0dG_rateBadgeLive{color:var(--dsw-static-green-500);background:var(--dsw-alias-bg-layer-2)}.VWh0dG_siteRow{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:10px;justify-content:space-between;align-items:center;gap:12px;padding:8px 10px;display:flex}.VWh0dG_siteRowName{align-items:center;gap:8px;min-width:0;display:inline-flex}.VWh0dG_siteKindTag{white-space:nowrap;border-radius:999px;flex:none;align-items:center;padding:1px 7px;font-size:10.5px;font-weight:600;line-height:16px;display:inline-flex}.VWh0dG_siteKindSite{color:var(--dsw-static-blue-500);background:color-mix(in srgb, var(--dsw-static-blue-500) 14%, transparent)}.VWh0dG_siteKindDirect{color:var(--dsw-static-green-500);background:color-mix(in srgb, var(--dsw-static-green-500) 14%, transparent)}.VWh0dG_siteKindUnknown{color:var(--dsw-static-red-500);background:color-mix(in srgb, var(--dsw-static-red-500) 14%, transparent)}.VWh0dG_siteRowTitle{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;font-weight:600;line-height:18px;overflow:hidden}.VWh0dG_siteRowMeta{flex:none;align-items:center;gap:10px;display:inline-flex}.VWh0dG_siteRowCost{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-size:12.5px;font-weight:700;line-height:18px}.VWh0dG_siteRowCalls{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;font-size:11.5px;line-height:17px}.VWh0dG_siteRowCallsLow{color:var(--dsw-static-red-500)}.VWh0dG_rateBadgeBuiltin{color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-layer-2)}.VWh0dG_pricingToggleText{align-items:baseline;gap:10px;min-width:0;display:flex}.VWh0dG_pricingChevron{width:16px;height:16px;color:var(--dsw-alias-label-tertiary);flex:none;transition:transform .16s}.VWh0dG_pricingChevronOpen{transform:rotate(180deg)}.VWh0dG_bandPrice{align-items:baseline;gap:6px;display:inline-flex}.VWh0dG_bandPriceOff{color:var(--dsw-alias-label-caption)}.VWh0dG_bandPriceOff:before{content:\"/\";color:var(--dsw-alias-label-dimmed);margin-right:4px}.VWh0dG_bandTag{color:var(--dsw-alias-label-secondary);flex-direction:column;gap:1px;font-size:10.5px;line-height:14px;display:inline-flex}.VWh0dG_bandTagOff{color:var(--dsw-static-green-500);font-weight:600}.VWh0dG_bandTag>span:first-child{color:var(--dsw-alias-label-primary);font-weight:500}.VWh0dG_flatTag{color:var(--dsw-alias-label-caption);font-size:10.5px;line-height:14px}.VWh0dG_healthDot{border-radius:50%;flex:none;width:8px;height:8px;display:inline-block}.VWh0dG_healthOk{background:var(--dsw-static-green-500)}.VWh0dG_healthBad{background:var(--dsw-static-red-500)}.VWh0dG_healthIdle{background:var(--dsw-static-neutral-bluish-400)}.VWh0dG_dashboardRight{align-items:center;gap:8px;min-width:0;display:flex}.VWh0dG_healthBadge{white-space:nowrap;border-radius:999px;align-items:center;gap:6px;padding:3px 9px;font-size:11px;line-height:16px;display:inline-flex}.VWh0dG_healthBadgeOk{color:var(--dsw-static-green-500);background:var(--dsw-alias-bg-layer-2)}.VWh0dG_healthBadgeBad{color:var(--dsw-static-red-500);background:var(--dsw-alias-bg-layer-2)}.VWh0dG_planTag{color:var(--dsw-static-green-500);background:var(--dsw-alias-bg-layer-2);border-radius:999px;align-items:center;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px;display:inline-flex}.VWh0dG_uncataloguedTag{vertical-align:1px;color:var(--dsw-static-amber-500);background:var(--dsw-alias-bg-layer-2);border-radius:999px;margin-left:6px;padding:0 6px;font-size:10px;font-weight:600;line-height:16px;display:inline-block}.VWh0dG_estimatedTag{vertical-align:1px;color:var(--dsw-static-blue-500);background:var(--dsw-alias-bg-layer-2);border-radius:999px;margin-left:6px;padding:0 6px;font-size:10px;font-weight:600;line-height:16px;display:inline-block}.VWh0dG_liveCostBar{color:var(--dsw-static-neutral-400);font-variant-numeric:tabular-nums;align-items:center;gap:6px;font-size:11px;line-height:16px;display:inline-flex}.VWh0dG_liveCostItem{white-space:nowrap}.VWh0dG_liveCostSep{color:var(--dsw-static-neutral-300)}.VWh0dG_liveTierPeak{color:var(--dsw-static-blue-500);font-weight:600}.VWh0dG_liveTierOff{color:var(--dsw-static-green-500);font-weight:600}.VWh0dG_liveQuotaWarn{color:var(--dsw-static-amber-500);font-weight:600}.VWh0dG_liveQuotaCrit{color:var(--dsw-static-red-500);font-weight:600}.VWh0dG_balanceCell{align-items:center;gap:6px;display:inline-flex;position:relative}.VWh0dG_balanceDays{color:var(--dsw-alias-label-caption);white-space:nowrap;font-size:10.5px;line-height:14px}.VWh0dG_balanceDaysLow{color:var(--dsw-static-red-500);font-weight:600}.VWh0dG_balanceDaysBadge{border:1px solid var(--dsw-alias-label-caption);background:color-mix(in srgb, var(--dsw-alias-label-caption) 10%, transparent);min-width:24px;height:24px;color:var(--dsw-alias-label-secondary);cursor:pointer;border-radius:12px;justify-content:center;align-items:center;padding:0 6px;font-size:10.5px;font-weight:600;line-height:1;display:inline-flex}.VWh0dG_balanceDaysBadge:hover{border-color:var(--dsw-alias-label-secondary);background:color-mix(in srgb, var(--dsw-alias-label-caption) 18%, transparent)}.VWh0dG_balanceDaysBadgeLow{color:var(--dsw-static-red-500);border-color:var(--dsw-static-red-500);background:color-mix(in srgb, var(--dsw-static-red-500) 10%, transparent)}.VWh0dG_balanceDetailPop{z-index:20;background:var(--dsw-alias-bg-layer-3);border:1px solid var(--dsw-alias-label-caption);white-space:nowrap;border-radius:8px;flex-direction:column;gap:6px;min-width:180px;padding:8px 10px;display:inline-flex;position:absolute;top:calc(100% + 6px);right:0;box-shadow:0 6px 20px #0000002e}.VWh0dG_balanceDetailHead{justify-content:space-between;align-items:center;gap:12px;display:flex}.VWh0dG_balanceDetailTitle{color:var(--dsw-alias-label-primary);font-size:12px;font-weight:600}.VWh0dG_balanceDetailClose{cursor:pointer;color:var(--dsw-alias-label-caption);background:0 0;border:none;font-size:14px;line-height:1}.VWh0dG_balanceDetailClose:hover{color:var(--dsw-alias-label-primary)}.VWh0dG_balanceDetailGrid{flex-direction:column;gap:4px;display:inline-flex}.VWh0dG_balanceDetailRow{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;justify-content:space-between;gap:16px;font-size:11px;line-height:15px;display:flex}.VWh0dG_balanceDetailLabel{color:var(--dsw-alias-label-caption)}.VWh0dG_balanceDetailValue{color:var(--dsw-alias-label-primary);font-weight:500}body[data-zine-mode] .VWh0dG_trigger,body[data-zine-mode] .VWh0dG_triggerPop,body[data-zine-mode] .VWh0dG_railButton{display:none}body[data-zine-mode] .VWh0dG_dashboardHead{background:#000;border-bottom:2px solid #e8ff00}body[data-zine-mode] .VWh0dG_headTitleRow{align-items:center;gap:8px;margin-top:4px;display:flex}body[data-zine-mode] .VWh0dG_dashboardTitle{color:#e8ff00;letter-spacing:.04em;text-transform:uppercase;text-shadow:0 0 8px #e8ff0066;font-weight:900}body[data-zine-mode] .VWh0dG_dashboardSubtitle{color:#c9d98a;letter-spacing:.08em;text-transform:uppercase;font-size:10px}body[data-zine-mode] .VWh0dG_closeButton{color:#0a0a05;background:#ff2d95;border:1.5px solid #ff2d95;border-radius:0;box-shadow:0 0 10px #ff2d9573}body[data-zine-mode] .VWh0dG_hero{background:#000;border:2.5px solid #e8ff00;border-radius:0;position:relative;box-shadow:0 0 0 1px #0009,0 0 24px #e8ff002e}body[data-zine-mode] .VWh0dG_heroLabel{color:#c9d98a;letter-spacing:.12em;text-transform:uppercase;font-size:10px;font-weight:900}body[data-zine-mode] .VWh0dG_heroValue{color:#e8ff00;letter-spacing:-.02em;text-shadow:0 0 12px #e8ff0073;-webkit-text-fill-color:#e8ff00;background:0 0;font-size:38px;font-weight:900}body[data-zine-mode] .VWh0dG_heroMeta{color:#c9d98a;letter-spacing:.06em;text-transform:uppercase;font-size:10.5px}body[data-zine-mode] .VWh0dG_heroSideLabel{color:#c9d98a;letter-spacing:.1em;text-transform:uppercase;font-size:10px;font-weight:900}body[data-zine-mode] .VWh0dG_heroSideValue{color:#e8ff00;text-shadow:0 0 6px #e8ff0059}body[data-zine-mode] .VWh0dG_delta{font-weight:900}body[data-zine-mode] .VWh0dG_deltaUp{color:#ff2d95}body[data-zine-mode] .VWh0dG_deltaDown{color:#c9d98a}body[data-zine-mode] .VWh0dG_tabNav{background:#000;border-bottom:2px solid #e8ff00}body[data-zine-mode] .VWh0dG_tabButton{color:#c9d98a;letter-spacing:.08em;text-transform:uppercase;border-radius:0;font-size:10.5px;font-weight:900}body[data-zine-mode] .VWh0dG_tabButton:hover,body[data-zine-mode] .VWh0dG_tabButton:focus-visible{color:#e8ff00;background:#e8ff001f}body[data-zine-mode] .VWh0dG_tabButtonActive,body[data-zine-mode] .VWh0dG_tabButtonActive:hover,body[data-zine-mode] .VWh0dG_tabButtonActive:focus-visible{color:#0a0a05;background:#e8ff00;box-shadow:0 0 10px #e8ff0073}body[data-zine-mode] .VWh0dG_panel{background:#000;border:2px solid #e8ff00;border-radius:0}body[data-zine-mode] .VWh0dG_trendPanel{position:relative}body[data-zine-mode] .VWh0dG_panelTitle{color:#e8ff00;letter-spacing:.06em;text-transform:uppercase;text-shadow:0 0 6px #e8ff0066;font-weight:900}body[data-zine-mode] .VWh0dG_panelHint{color:#c9d98a;letter-spacing:.08em;text-transform:uppercase;font-size:10px;font-weight:900}body[data-zine-mode] .VWh0dG_modelTableScroll{background:#000;border:1.5px solid #e8ff0080;border-radius:0}.VWh0dG_currencyToggle{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:6px;align-items:center;gap:2px;margin-right:8px;padding:2px;display:inline-flex}.VWh0dG_currencyButton{color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:4px;padding:4px 7px;font-size:11px;font-weight:700;line-height:1}.VWh0dG_currencyButtonActive{background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary)}.VWh0dG_subscriptionGrid{grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:10px;margin-top:10px;display:grid}.VWh0dG_subscriptionCard{border:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 75%, transparent);background:color-mix(in srgb, var(--dsw-alias-bg-layer-2) 62%, transparent);-webkit-backdrop-filter:blur(12px)saturate(1.3);border-radius:12px;padding:12px 14px;transition:border-color .2s,box-shadow .2s;position:relative;overflow:hidden;box-shadow:0 8px 24px #0000001a}.VWh0dG_subscriptionCard:before{content:\"\";background:linear-gradient(90deg, transparent 0%, var(--dsw-static-amber-500) 30%, var(--dsw-alias-label-primary) 50%, var(--dsw-static-amber-500) 70%, transparent 100%);opacity:.9;pointer-events:none;background-size:200% 100%;height:1.5px;animation:3.6s ease-in-out infinite VWh0dG_subscriptionGoldFlow;position:absolute;top:0;left:0;right:0}@keyframes VWh0dG_subscriptionGoldFlow{0%{background-position:200% 0}to{background-position:-200% 0}}.VWh0dG_subscriptionCard:hover{border-color:color-mix(in srgb, var(--dsw-static-amber-500) 55%, var(--dsw-alias-border-l1));box-shadow:0 10px 30px #00000029}.VWh0dG_subscriptionHead{flex-wrap:wrap;align-items:baseline;gap:6px;margin-bottom:8px;display:flex}.VWh0dG_subscriptionName{font-size:13px;font-weight:700}.VWh0dG_subscriptionPlan{color:var(--dsw-alias-label-secondary);font-size:11px}.VWh0dG_subscriptionPlan[data-kind=code],.VWh0dG_subscriptionPlan[data-kind=token]{color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-3);border-radius:999px;padding:1px 8px;font-weight:500}.VWh0dG_subscriptionTier{color:var(--dsw-alias-label-secondary);margin-left:6px}.VWh0dG_subscriptionAuto{color:var(--dsw-static-blue-500);background:color-mix(in srgb, var(--dsw-static-blue-500) 14%, var(--dsw-alias-bg-layer-2));border-radius:999px;margin-left:6px;padding:1px 6px;font-size:10px}.VWh0dG_subscriptionStatus{color:var(--dsw-alias-label-secondary);margin-bottom:6px;font-size:11px}.VWh0dG_subscriptionWindow{align-items:center;gap:10px;margin-top:8px;font-size:11px;display:flex}.VWh0dG_subscriptionWindowLabel{color:var(--dsw-alias-label-secondary);flex:0 0 44px}.VWh0dG_subscriptionTrack{background:var(--dsw-alias-bg-layer-3);border-radius:3px;flex:1;height:6px;overflow:hidden}.VWh0dG_subscriptionFill{background:var(--dsw-static-blue-500);border-radius:3px;height:100%;transition:width .2s;display:block}.VWh0dG_subscriptionFillWarn{background:var(--dsw-static-amber-500)}.VWh0dG_subscriptionFillOver{background:var(--dsw-static-red-500)}.VWh0dG_subscriptionMeta{flex-direction:column;flex:none;align-items:flex-end;gap:2px;display:flex}.VWh0dG_subscriptionPct{text-align:right;font-variant-numeric:tabular-nums;flex:none;min-width:52px}.VWh0dG_subscriptionExhausted{color:var(--dsw-static-red-500);min-width:52px;font-weight:600}.VWh0dG_subscriptionReset{color:var(--dsw-alias-label-caption);white-space:nowrap;flex:none;font-size:10px}.VWh0dG_providerGroupList{flex-direction:column;gap:10px;display:flex}.VWh0dG_providerGroup{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:12px;padding:12px 14px}.VWh0dG_providerGroupHead{justify-content:space-between;align-items:baseline;gap:12px;display:flex}.VWh0dG_providerGroupTitle{align-items:center;gap:7px;min-width:0;display:inline-flex}.VWh0dG_providerGroupName{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:600;line-height:18px}.VWh0dG_providerGroupMeta{flex:none;align-items:center;gap:10px;display:inline-flex}.VWh0dG_providerGroupBadge{color:var(--dsw-static-green-500);background:var(--dsw-alias-bg-layer-2);border-radius:999px;align-items:center;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px;display:inline-flex}.VWh0dG_providerGroupBalance{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;white-space:nowrap;align-items:baseline;gap:6px;font-size:12px;line-height:17px;display:inline-flex}.VWh0dG_providerGroupBalanceLabel{color:var(--dsw-alias-label-caption);font-size:11px;line-height:17px}.VWh0dG_roundsFlagBadge{color:var(--dsw-static-neutral-bluish-00);background:var(--dsw-static-red-500);border-radius:999px;margin-left:8px;padding:1px 7px;font-size:10px;font-weight:800}.VWh0dG_rounds{margin-top:10px}.VWh0dG_roundsBars{align-items:flex-end;gap:3px;height:124px;padding:16px 2px 0;display:flex;overflow-x:auto}.VWh0dG_roundsBarCol{border-radius:5px 5px 0 0;flex-direction:column;flex:1 0 28px;justify-content:flex-end;align-items:stretch;height:100%;display:flex;position:relative}.VWh0dG_roundsBarColPeak{background:color-mix(in srgb, var(--dsw-static-amber-500) 16%, transparent)}.VWh0dG_roundsBarColOff{background:var(--dsw-alias-bg-module-platform)}.VWh0dG_roundsBarLabel{text-align:center;color:var(--dsw-alias-label-secondary);white-space:nowrap;text-overflow:ellipsis;max-width:100%;font-size:9px;line-height:1.2;position:absolute;bottom:0;left:0;right:0;overflow:hidden;transform:translateY(-100%)}.VWh0dG_roundsBarWrap{flex:1;align-items:flex-end;min-height:0;display:flex}.VWh0dG_roundsBar{background:var(--dsw-static-blue-500);border-radius:2px 2px 0 0;width:100%;min-height:2px;position:relative}.VWh0dG_roundsBarFlagged{background:var(--dsw-static-red-500);border-radius:2px 2px 0 0;width:100%;min-height:2px;position:relative}.VWh0dG_roundsFlagMark{background:var(--dsw-static-red-500);border-radius:50%;width:7px;height:7px;position:absolute;top:-3px;right:-3px}.VWh0dG_roundsAxis{color:var(--dsw-alias-label-secondary);justify-content:space-between;margin-top:6px;font-size:10px;display:flex}.VWh0dG_roundsEmpty{color:var(--dsw-alias-label-secondary);margin-top:10px;font-size:12px}.VWh0dG_heatmap{margin-top:10px}.VWh0dG_heatmapGrid{grid-template-columns:repeat(7,minmax(0,1fr));gap:8px;display:grid}.VWh0dG_heatmapCellEmpty{background:var(--dsw-alias-bg-layer-1);height:30px;color:var(--dsw-alias-label-dimmed);font-variant-numeric:tabular-nums;border-radius:8px;justify-content:center;align-items:center;font-size:11px;display:flex}.VWh0dG_heatmapCell{font-variant-numeric:tabular-nums;cursor:pointer;border:0;border-radius:8px;justify-content:center;align-items:center;height:30px;padding:0;font-size:11px;display:flex}.VWh0dG_heatmapCell[data-level=\"0\"],.VWh0dG_heatmapCell[data-level=\"1\"],.VWh0dG_heatmapCell[data-level=\"2\"]{color:var(--dsw-alias-label-primary)}.VWh0dG_heatmapCell[data-level=\"3\"],.VWh0dG_heatmapCell[data-level=\"4\"]{color:var(--dsw-static-neutral-bluish-00)}.VWh0dG_heatmapFooter{color:var(--dsw-alias-label-secondary);align-items:center;gap:8px;margin-top:10px;font-size:10px;display:flex}.VWh0dG_heatmapLegend{gap:3px;display:inline-flex}.VWh0dG_heatmapLegend i{border-radius:4px;width:14px;height:14px;display:block}.VWh0dG_heatmapHover{font-variant-numeric:tabular-nums;margin-left:auto}.VWh0dG_heatmapRangeSwitch{gap:4px;margin-left:auto;display:inline-flex}.VWh0dG_heatmapRangeButton{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-text-secondary);cursor:pointer;background:0 0;border-radius:6px;padding:2px 8px;font-size:11px;line-height:1.4}.VWh0dG_heatmapRangeButtonActive{color:var(--dsw-alias-text-primary);border-color:currentColor;font-weight:600}.VWh0dG_heatmapYear{flex-direction:column;gap:6px;display:flex}.VWh0dG_heatmapYearBody{align-items:flex-start;gap:6px;display:flex}.VWh0dG_heatmapYearWeekdays{color:var(--dsw-alias-text-tertiary);flex:none;grid-template-rows:repeat(7,11px);gap:3px;padding-top:12px;font-size:9px;line-height:11px;display:grid}.VWh0dG_heatmapYearWeekday{white-space:nowrap;text-align:right;height:11px}.VWh0dG_heatmapYearMonths{min-width:max-content;color:var(--dsw-alias-text-tertiary);grid-template-columns:repeat(52,11px);gap:3px;font-size:9px;line-height:12px;display:grid;overflow:visible}.VWh0dG_heatmapYearMonth{white-space:nowrap;overflow:visible}.VWh0dG_heatmapYearScroll{padding-bottom:2px;overflow-x:auto}.VWh0dG_heatmapYearGrid{grid-template-rows:repeat(7,11px);grid-auto-flow:column;gap:3px;min-width:max-content;display:grid}.VWh0dG_heatmapYearCell{cursor:pointer;border:0;border-radius:2px;width:11px;height:11px;padding:0}.VWh0dG_triggerPopSubscription{width:auto;left:0;right:0}.VWh0dG_floatSub{flex-direction:column;gap:6px;min-width:0;display:flex}.VWh0dG_floatSubHead{flex-wrap:wrap;align-items:baseline;gap:6px;min-width:0;display:flex}.VWh0dG_floatSubName{color:var(--dsw-alias-label-primary);font-size:12px;font-weight:700}.VWh0dG_floatSubPlan{color:var(--dsw-alias-label-secondary);font-size:10px}.VWh0dG_floatSub .VWh0dG_subscriptionWindow{flex-wrap:wrap;gap:4px 10px}.VWh0dG_floatSub .VWh0dG_subscriptionWindowLabel{flex:none}.VWh0dG_floatSub .VWh0dG_subscriptionMeta{min-width:0;max-width:100%}.VWh0dG_floatSub .VWh0dG_subscriptionPct{min-width:0}.VWh0dG_floatSub .VWh0dG_subscriptionReset{white-space:normal;overflow-wrap:anywhere}.VWh0dG_triggerPopEmpty{color:var(--dsw-alias-label-tertiary);padding:2px 0;font-size:11px;line-height:1.5}.VWh0dG_triggerPopSwitcher{justify-content:flex-end;align-items:center;gap:8px;margin-top:2px;display:flex}.VWh0dG_triggerPopSwitchBtn{color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:6px;padding:2px 4px;font-size:14px;line-height:1}.VWh0dG_triggerPopSwitchBtn:hover{color:var(--dsw-alias-label-primary);background:color-mix(in srgb, var(--dsw-alias-border-l1) 45%, transparent)}.VWh0dG_triggerPopSwitchCount{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;font-size:10px}.VWh0dG_floatModeRow{gap:8px;margin-bottom:8px;display:flex}.VWh0dG_floatModeBtn{border:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 75%, transparent);background:color-mix(in srgb, var(--dsw-alias-bg-layer-2) 60%, transparent);color:var(--dsw-alias-label-secondary);cursor:pointer;border-radius:10px;flex:1;padding:7px 10px;font-size:12px}.VWh0dG_floatModeBtnOn{border-color:var(--dsw-static-blue-500);color:var(--dsw-alias-label-primary);background:color-mix(in srgb, var(--dsw-static-blue-500) 16%, transparent)}.VWh0dG_floatTargets{flex-wrap:wrap;gap:6px;margin-bottom:8px;display:flex}.VWh0dG_floatTarget{color:var(--dsw-alias-label-secondary);cursor:pointer;align-items:center;gap:5px;font-size:12px;display:inline-flex}.VWh0dG_floatTargetLabel{color:var(--dsw-alias-label-secondary)}.VWh0dG_staleNotice{color:var(--dsw-static-amber-500);background:color-mix(in srgb, var(--dsw-static-amber-500) 12%, transparent);border:1px solid color-mix(in srgb, var(--dsw-static-amber-500) 30%, transparent);border-radius:10px;align-items:center;gap:6px;margin:0 0 10px;padding:8px 10px;font-size:11px;display:flex}.VWh0dG_pluginInfo{flex-direction:column;gap:8px;margin-top:10px;display:flex}.VWh0dG_pluginInfoRow{align-items:baseline;gap:12px;font-size:12px;display:flex}.VWh0dG_pluginInfoLabel{color:var(--dsw-alias-label-secondary);flex:0 0 72px}.VWh0dG_pluginInfoValue{color:var(--dsw-alias-label-primary);word-break:break-all}.VWh0dG_pluginInfoLink{color:var(--dsw-static-blue-500);word-break:break-all;text-decoration:none}.VWh0dG_pluginInfoLink:hover{text-decoration:underline}.VWh0dG_tokenPanel{flex-direction:column;gap:14px;display:flex}.VWh0dG_tokenModelBar{background:var(--dsw-alias-bg-layer-2);border-radius:999px;height:8px;overflow:hidden}.VWh0dG_tokenModelParts{height:100%;display:flex}.VWh0dG_tokenModelPartIn{background:var(--dsw-static-blue-500)}.VWh0dG_tokenModelPartOut{background:var(--dsw-static-amber-500)}.VWh0dG_tokenModelShareRow{align-items:center;gap:6px;display:inline-flex}@media (width<=640px){.VWh0dG_kpiGrid{grid-template-columns:repeat(2,minmax(0,1fr))}.VWh0dG_hero{gap:14px}.VWh0dG_heroTop{flex-direction:column;align-items:flex-start;gap:12px}.VWh0dG_heroGauge{width:72px;height:72px}.VWh0dG_heroSide{gap:12px}.VWh0dG_heroSideSpacer{display:none}}.VWh0dG_peakAlert{z-index:2000;border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:12px;align-items:center;gap:12px;min-width:300px;max-width:460px;padding:10px 12px;animation:.2s VWh0dG_peakAlertIn;display:flex;position:fixed;box-shadow:0 4px 16px #00000014}.VWh0dG_peakAlertCorner{bottom:18px;right:18px}.VWh0dG_peakAlertCenter{top:20%;left:50%;transform:translate(-50%)}.VWh0dG_peakAlertTag{letter-spacing:.01em;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-3);white-space:nowrap;border-radius:999px;flex:none;align-items:center;gap:6px;padding:3px 9px;font-size:11px;font-weight:650;display:inline-flex}.VWh0dG_peakAlertTag:before{content:\"\";background:currentColor;border-radius:50%;width:6px;height:6px}.VWh0dG_peakAlertPeak .VWh0dG_peakAlertTag{color:var(--dsw-static-amber-500)}.VWh0dG_peakAlertOff .VWh0dG_peakAlertTag{color:var(--dsw-static-blue-500)}.VWh0dG_peakAlertCountdown{font-variant-numeric:tabular-nums;color:var(--dsw-alias-label-primary);flex:none;font-size:18px;font-weight:700;line-height:1}.VWh0dG_peakAlertText{min-width:0;color:var(--dsw-alias-label-secondary);flex:1;font-size:12px;line-height:18px}.VWh0dG_peakAlertClose{width:20px;height:20px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:6px;flex:none;justify-content:center;align-items:center;font-size:15px;line-height:1;transition:background-color .14s,color .14s;display:inline-flex}.VWh0dG_peakAlertClose:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2)}@keyframes VWh0dG_peakAlertIn{0%{opacity:0}to{opacity:1}}.VWh0dG_peakAlertPanel{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:16px;flex-direction:column;gap:10px;padding:14px 16px;display:flex}.VWh0dG_peakAlertPanelHead{justify-content:space-between;align-items:center;gap:10px;display:flex}.VWh0dG_peakAlertPanelLabel{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:600}.VWh0dG_peakAlertPanelBody{flex-wrap:wrap;align-items:center;gap:12px 16px;display:flex}.VWh0dG_peakAlertField{color:var(--dsw-alias-label-secondary);align-items:center;gap:8px;font-size:12px;display:inline-flex}.VWh0dG_peakAlertNum{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);width:56px;color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;border-radius:6px;padding:4px 6px}.VWh0dG_peakAlertSelect{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);border-radius:6px;padding:4px 6px;font-size:12px}.VWh0dG_peakAlertCheck{color:var(--dsw-alias-label-secondary);align-items:center;gap:6px;font-size:12px;display:inline-flex}.VWh0dG_peakAlertPreview{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:6px;padding:5px 10px;font-size:12px}.VWh0dG_peakAlertPreview:hover{background:var(--dsw-alias-bg-layer-3)}.VWh0dG_settingsHead{flex-direction:column;gap:4px;margin-bottom:2px;display:flex}.VWh0dG_settingsTitle{letter-spacing:-.005em;color:var(--dsw-alias-label-primary);margin:0;font-size:15px;font-weight:650;line-height:22px}.VWh0dG_settingsHint{color:var(--dsw-alias-label-caption);margin:0;font-size:11px;line-height:16px}.VWh0dG_budgetHint,.VWh0dG_peakAlertHint{color:var(--dsw-alias-label-caption);margin:6px 0 0;font-size:11px;line-height:16px}";
63
+ const css = ".VWh0dG_railButton{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);width:36px;height:36px;color:var(--dsw-alias-label-secondary);cursor:pointer;border-radius:8px;flex:none;justify-content:center;align-items:center;padding:0;transition:border-color .16s,color .16s;display:flex}.VWh0dG_railButton:hover,.VWh0dG_railButton:focus-visible{border-color:var(--dsw-static-blue-500);color:var(--dsw-static-blue-500);outline:none}.VWh0dG_railButton svg{stroke-width:2px;width:18px;height:18px}.VWh0dG_trigger{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);width:100%;min-width:0;color:var(--dsw-alias-label-primary);cursor:pointer;text-align:left;border-radius:14px;align-items:center;gap:10px;padding:9px 12px;transition:border-color .16s,transform .16s,box-shadow .16s;display:flex;position:relative;overflow:hidden;box-shadow:0 1px 2px #0000000a}.VWh0dG_trigger:hover,.VWh0dG_trigger:focus-visible{border-color:var(--dsw-static-blue-500);box-shadow:0 6px 18px -8px color-mix(in srgb, var(--dsw-static-blue-500) 45%, transparent);outline:none;transform:translateY(-1px)}.VWh0dG_triggerIcon{border:1px solid var(--dsw-alias-border-l1);width:32px;height:32px;color:var(--dsw-alias-label-secondary);opacity:.8;border-radius:8px;flex:none;justify-content:center;align-items:center;display:inline-flex}.VWh0dG_triggerIcon svg{stroke-width:2px;width:16px;height:16px}.VWh0dG_triggerMain{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.VWh0dG_triggerPrimary{align-items:baseline;gap:5px;min-width:0;display:inline-flex}.VWh0dG_triggerLabel{color:var(--dsw-alias-label-tertiary);white-space:nowrap;text-overflow:ellipsis;min-width:0;font-size:11px;line-height:15px;overflow:hidden}.VWh0dG_triggerYen{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;font-size:12px;font-weight:600;line-height:16px}.VWh0dG_triggerMetric{color:var(--dsw-alias-label-primary);letter-spacing:-.02em;font-variant-numeric:tabular-nums;white-space:nowrap;text-overflow:ellipsis;min-width:0;font-size:20px;font-weight:700;line-height:24px;overflow:hidden}.VWh0dG_triggerSub{color:var(--dsw-alias-label-tertiary);white-space:nowrap;text-overflow:ellipsis;font-size:10px;line-height:14px;overflow:hidden}.VWh0dG_triggerSpark{flex:none;align-items:flex-end;gap:2px;height:20px;display:flex}.VWh0dG_triggerSparkBar,.VWh0dG_triggerSparkHot{background:var(--dsw-static-blue-500);opacity:.6;border-radius:1px 1px 0 0;width:3px}.VWh0dG_triggerSparkHot{opacity:1}.VWh0dG_triggerWrap{flex:auto;width:100%;min-width:0;display:block;position:relative;container:VWh0dG_billing-trigger/inline-size}@container VWh0dG_billing-trigger (width<=200px){.VWh0dG_trigger{gap:6px;padding:8px 10px}.VWh0dG_triggerSpark{display:none}}@container VWh0dG_billing-trigger (width<=170px){.VWh0dG_triggerSub,.VWh0dG_triggerLabel{display:none}}@container VWh0dG_billing-trigger (width<=110px){.VWh0dG_triggerIcon,.VWh0dG_triggerSpark,.VWh0dG_triggerSub,.VWh0dG_triggerLabel{display:none}.VWh0dG_trigger{justify-content:center;padding:8px 6px}}.VWh0dG_triggerPop{border:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 80%, transparent);background:color-mix(in srgb, var(--dsw-alias-bg-layer-2) 72%, transparent);-webkit-backdrop-filter:blur(14px)saturate(1.3);box-shadow:0 12px 32px #00000029, inset 0 1px 0 color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent);opacity:0;pointer-events:none;z-index:10;border-radius:14px;flex-direction:column;gap:5px;padding:10px 12px;transition:opacity .16s,transform .16s;display:flex;position:absolute;bottom:calc(100% + 8px);left:0;right:0;overflow:hidden;transform:translateY(4px)}.VWh0dG_triggerPop:before{content:\"\";background:linear-gradient(90deg, transparent 0%, var(--dsw-static-amber-500) 30%, var(--dsw-alias-label-primary) 50%, var(--dsw-static-amber-500) 70%, transparent 100%);opacity:.9;pointer-events:none;background-size:200% 100%;height:1.5px;animation:4s ease-in-out infinite VWh0dG_subscriptionGoldFlow;position:absolute;top:0;left:0;right:0}.VWh0dG_triggerWrap:hover .VWh0dG_triggerPop,.VWh0dG_triggerWrap:focus-within .VWh0dG_triggerPop{opacity:1;transform:translateY(0)}.VWh0dG_popHead{justify-content:space-between;align-items:baseline;gap:8px;display:flex}.VWh0dG_popTitle{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:700;line-height:18px}.VWh0dG_metricGrid{grid-template-columns:repeat(3,1fr);gap:10px 8px;display:grid}.VWh0dG_metricCell{flex-direction:column;gap:2px;min-width:0;display:flex}.VWh0dG_metricLabel{color:var(--dsw-alias-label-tertiary);font-size:10px;line-height:14px}.VWh0dG_metricValue{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:12px;font-weight:700;line-height:16px}.VWh0dG_metricValuePrimary{color:var(--dsw-static-amber-500)}.VWh0dG_metricValueSuccess{color:var(--dsw-static-green-500)}.VWh0dG_popModel{border-top:1px solid var(--dsw-alias-border-l1);flex-direction:column;gap:6px;padding-top:10px;display:flex}.VWh0dG_popModelLabel{color:var(--dsw-alias-label-tertiary);font-size:10px;line-height:14px}.VWh0dG_popModelRow{align-items:center;gap:8px;min-width:0;display:flex}.VWh0dG_popDot{border-radius:999px;flex:none;width:6px;height:6px}.VWh0dG_popDotDirect{background:var(--dsw-static-green-500)}.VWh0dG_popDotSub{background:var(--dsw-static-amber-500)}.VWh0dG_popDotNeutral{background:var(--dsw-alias-label-tertiary)}.VWh0dG_popTagPrimary,.VWh0dG_popTagSub{white-space:nowrap;border-radius:5px;flex:none;align-items:center;height:18px;padding:0 6px;font-size:10px;font-weight:600;line-height:14px;display:inline-flex}.VWh0dG_popTagPrimary{background:color-mix(in srgb, var(--dsw-static-blue-500) 14%, transparent);color:var(--dsw-static-blue-500)}.VWh0dG_popTagSub{background:color-mix(in srgb, var(--dsw-static-amber-500) 18%, transparent);color:var(--dsw-static-amber-500)}.VWh0dG_popModelName{color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;font-size:11px;font-weight:500;line-height:16px;overflow:hidden}.VWh0dG_popModelStatus{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;white-space:nowrap;margin-left:auto;font-size:11px;font-weight:600;line-height:16px}.VWh0dG_popModelStatusLow{color:var(--dsw-static-red-500)}.VWh0dG_triggerPopRow{white-space:nowrap;justify-content:space-between;align-items:baseline;gap:12px;display:flex}.VWh0dG_triggerPopLabel{letter-spacing:.01em;color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;font-size:10.5px;line-height:16px}.VWh0dG_triggerPopValue{min-width:0;color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;justify-content:flex-end;align-items:baseline;gap:8px;font-size:12.5px;font-weight:600;line-height:17px;display:inline-flex}.VWh0dG_triggerPopName{text-overflow:ellipsis;white-space:nowrap;max-width:110px;color:var(--dsw-alias-label-secondary);font-size:12px;font-weight:500;overflow:hidden}.VWh0dG_triggerPopTitle{color:var(--dsw-alias-label-primary);white-space:nowrap;align-items:baseline;gap:8px;font-size:12px;font-weight:700;display:flex}.VWh0dG_triggerPopTitleMonth{color:var(--dsw-alias-label-tertiary);font-size:11px;font-weight:500}.VWh0dG_triggerPopStrong{color:var(--dsw-alias-label-primary);margin-left:8px;font-size:12.5px;font-weight:700}.VWh0dG_triggerPopAlert{color:var(--dsw-static-red-500);white-space:nowrap;font-size:11px;line-height:16px}.VWh0dG_triggerPopValueStack{flex-direction:column;align-items:flex-end;gap:2px;display:flex}.VWh0dG_triggerPopMuted{color:var(--dsw-alias-label-tertiary);font-weight:500}.VWh0dG_triggerPopHead{justify-content:space-between;align-items:baseline;gap:10px;display:flex}.VWh0dG_triggerPopUpdated{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:10px}.VWh0dG_triggerPopMetrics{grid-template-columns:1fr 1fr;gap:7px 12px;display:grid}.VWh0dG_triggerPopMetric{flex-direction:column;align-items:flex-start;gap:1px;display:flex}.VWh0dG_triggerPopMetricLabel{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:10px}.VWh0dG_triggerPopMetricValue{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:14px;font-weight:700;line-height:18px}.VWh0dG_triggerPopMetricHighlight{color:var(--dsw-static-amber-500)}.VWh0dG_triggerPopFoot{border-top:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 70%, transparent);flex-direction:column;gap:4px;padding-top:6px;display:flex}.VWh0dG_triggerPopFootTitle{text-align:center;letter-spacing:.05em;color:var(--dsw-alias-label-tertiary);border-bottom:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 70%, transparent);padding-bottom:4px;font-size:10px;font-weight:600}.VWh0dG_triggerPopFootNotes{flex-direction:column;gap:1px;min-width:0;display:flex}.VWh0dG_triggerPopFootNote{align-items:baseline;gap:4px;min-width:0;display:flex}.VWh0dG_triggerPopFootName{color:var(--dsw-alias-label-tertiary);white-space:nowrap;text-overflow:ellipsis;font-size:10px;overflow:hidden}.VWh0dG_triggerPopBadge{white-space:nowrap;border-radius:5px;flex:none;padding:1px 6px;font-size:9.5px;font-weight:600;line-height:14px}.VWh0dG_triggerPopBadgeDirect{background:color-mix(in srgb, var(--dsw-alias-label-primary) 12%, transparent);color:var(--dsw-alias-label-primary)}.VWh0dG_triggerPopBadgeSub{background:color-mix(in srgb, var(--dsw-static-amber-500) 18%, transparent);color:var(--dsw-static-amber-500)}.VWh0dG_triggerPopFootStrong{color:var(--dsw-alias-label-secondary);font-weight:600}.VWh0dG_triggerPopFootStatus{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:14px;font-weight:700;line-height:18px}.VWh0dG_triggerPopFootStatusLow{color:var(--dsw-static-red-500)}.VWh0dG_triggerPopOpenBtn{pointer-events:auto;border:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 80%, transparent);color:var(--dsw-alias-label-primary);background:color-mix(in srgb, var(--dsw-alias-bg-layer-3) 70%, transparent);cursor:pointer;border-radius:999px;flex:none;padding:5px 11px;font-size:11px;font-weight:600;transition:border-color .16s,background-color .16s}.VWh0dG_triggerPopOpenBtn:hover{border-color:var(--dsw-static-blue-500);background:color-mix(in srgb, var(--dsw-static-blue-500) 12%, var(--dsw-alias-bg-layer-3))}.VWh0dG_triggerPopBars{border-top:1px solid var(--dsw-alias-border-l1);align-items:flex-end;gap:4px;height:22px;margin-top:4px;padding-top:8px;display:flex}.VWh0dG_triggerPopBar{background:var(--dsw-static-blue-500);border-radius:2px;flex:1;transition:height .2s}.VWh0dG_dashboardModal{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:16px;width:min(760px,100vw - 48px);max-height:min(760px,88vh);animation:.18s ease-out VWh0dG_dashboardIn;box-shadow:0 12px 32px -12px #0000002e,0 2px 8px #0000000f}@keyframes VWh0dG_dashboardIn{0%{opacity:0;transform:translateY(8px)scale(.98)}to{opacity:1;transform:none}}div[role=presentation]:has(>.dsh-billing-modal)>div[aria-hidden=true]:first-child{backdrop-filter:blur(8px)saturate(1.25)}.VWh0dG_dashboard{flex-direction:column;width:100%;max-height:min(760px,88vh);display:flex}.VWh0dG_dashboardHead{border-bottom:1px solid var(--dsw-alias-border-l1);justify-content:space-between;align-items:center;gap:12px;padding:20px 24px;display:flex}.VWh0dG_dashboardTitle{color:var(--dsw-alias-label-primary);margin:0;font-size:16px;font-weight:600;line-height:24px}.VWh0dG_dashboardSubtitle{color:var(--dsw-alias-label-caption);margin:2px 0 0;font-size:11px;line-height:16px}.VWh0dG_closeButton{border:1px solid var(--dsw-alias-border-l1);width:32px;height:32px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border-radius:8px;flex:none;justify-content:center;align-items:center;transition:background-color .14s,color .14s;display:inline-flex}.VWh0dG_closeButton:hover{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary)}.VWh0dG_closeButton svg{stroke-width:2px;width:16px;height:16px}.VWh0dG_dashboardBody{flex-direction:column;gap:14px;padding:16px 24px 24px;display:flex;overflow-y:auto}.VWh0dG_modalFooter{border-top:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-tertiary);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:16px;padding:12px 24px;font-size:11px;line-height:16px;display:flex}.VWh0dG_tabNav{border-bottom:1px solid var(--dsw-alias-border-l1);align-items:center;gap:4px;padding:0 24px;display:flex}.VWh0dG_tabButton{color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:8px;margin:8px 0;padding:6px 12px;font-size:13px;font-weight:500;line-height:20px;transition:background-color .16s,color .16s}.VWh0dG_tabButton:hover,.VWh0dG_tabButton:focus-visible{color:var(--dsw-alias-label-primary);background:color-mix(in srgb, var(--dsw-alias-bg-layer-3) 62%, transparent);outline:none}.VWh0dG_tabButtonActive,.VWh0dG_tabButtonActive:hover,.VWh0dG_tabButtonActive:focus-visible{background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-primary);font-weight:600}.VWh0dG_tabPanel{flex-direction:column;gap:14px;animation:.14s ease-out VWh0dG_tabPanelIn;display:flex}@keyframes VWh0dG_tabPanelIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}.VWh0dG_reconcileNotice{border:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 78%, transparent);background:color-mix(in srgb, var(--dsw-alias-bg-layer-2) 62%, transparent);color:var(--dsw-alias-label-secondary);border-radius:10px;align-items:flex-start;gap:10px;padding:10px 12px;font-size:12px;line-height:1.55;display:flex}.VWh0dG_reconcileIcon{color:var(--dsw-alias-label-tertiary);flex:none;margin-top:1px;display:inline-flex}.VWh0dG_reconcileText{flex:1}.VWh0dG_reconcileDismiss{color:var(--dsw-alias-label-tertiary);cursor:pointer;white-space:nowrap;background:0 0;border:none;border-radius:6px;flex:none;padding:2px 8px;font-size:12px;line-height:1.4;transition:color .15s,background-color .15s}.VWh0dG_reconcileDismiss:hover{color:var(--dsw-alias-label-primary);background:color-mix(in srgb, var(--dsw-alias-label-primary) 8%, transparent)}.VWh0dG_hero{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:12px;flex-direction:column;gap:18px;padding:24px;display:flex;position:relative;overflow:hidden}.VWh0dG_heroTop{justify-content:space-between;align-items:center;gap:24px;display:flex}.VWh0dG_heroMain{flex-direction:column;gap:2px;min-width:0;display:flex}.VWh0dG_heroLabel{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:11px;line-height:16px}.VWh0dG_heroReadout{align-items:baseline;gap:4px;display:flex}.VWh0dG_heroCurrency{letter-spacing:-.01em;color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;font-size:22px;font-weight:600;line-height:28px}.VWh0dG_heroValue{letter-spacing:-.02em;font-variant-numeric:tabular-nums;white-space:nowrap;color:var(--dsw-alias-label-primary);font-size:40px;font-weight:700;line-height:48px}.VWh0dG_heroMeta{color:var(--dsw-alias-label-caption);white-space:nowrap;margin-top:4px;font-size:12px;line-height:17px}.VWh0dG_heroGauge{flex:none;width:96px;height:96px;position:relative}.VWh0dG_heroGaugeSvg{width:100%;height:100%;display:block;transform:rotate(-90deg)}.VWh0dG_heroGaugeTrack{fill:none;stroke:var(--dsw-alias-bg-module-platform);stroke-width:9px}.VWh0dG_heroGaugeArc{fill:none;stroke:var(--dsw-static-blue-500);stroke-width:9px;stroke-linecap:round;transition:stroke-dasharray .26s}.VWh0dG_heroGaugeArcOver{stroke:var(--dsw-static-red-500)}.VWh0dG_heroGaugeCenter{flex-direction:column;justify-content:center;align-items:center;gap:1px;display:flex;position:absolute;inset:0}.VWh0dG_heroGaugePct{letter-spacing:-.02em;font-variant-numeric:tabular-nums;color:var(--dsw-alias-label-primary);font-size:18px;font-weight:700;line-height:22px}.VWh0dG_heroGaugePctOver{color:var(--dsw-static-red-500)}.VWh0dG_heroGaugeLabel{color:var(--dsw-alias-label-tertiary);font-size:10px;line-height:14px}.VWh0dG_heroBudget{border-top:1px solid var(--dsw-alias-border-l1);align-items:center;gap:14px;padding-top:14px;display:flex}.VWh0dG_heroBudgetLabel{color:var(--dsw-alias-label-secondary);white-space:nowrap;flex:none;font-size:11px;line-height:16px}.VWh0dG_heroBudgetTrack{background:var(--dsw-alias-border-l1);border-radius:999px;flex:1;min-width:0;height:6px;overflow:hidden}.VWh0dG_heroBudgetFill{background:var(--dsw-static-blue-500);border-radius:999px;height:100%;transition:width .22s}.VWh0dG_heroBudgetFillOver{background:var(--dsw-static-red-500)}.VWh0dG_heroBudgetValue{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;white-space:nowrap;flex:none;font-size:11px;line-height:16px}.VWh0dG_heroSide{border-top:1px solid var(--dsw-alias-border-l1);align-items:stretch;padding-top:14px;display:flex}.VWh0dG_heroSideItem{border-left:1px solid var(--dsw-alias-border-l1);flex-direction:column;flex:1;gap:3px;min-width:0;padding-left:16px;display:flex}.VWh0dG_heroSideItem:first-child{border-left:none;padding-left:0}.VWh0dG_heroSideLabel{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:11px;line-height:15px}.VWh0dG_heroSideValue{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;letter-spacing:-.01em;white-space:nowrap;align-items:baseline;gap:6px;font-size:18px;font-weight:600;line-height:24px;display:inline-flex}.VWh0dG_heroSideSpacer{flex:1;display:block}.VWh0dG_delta{align-items:center;gap:2px;margin-left:4px;font-size:11px;font-weight:600;line-height:17px;display:inline-flex}.VWh0dG_deltaUp{color:var(--dsw-static-green-500)}.VWh0dG_deltaDown{color:var(--dsw-static-red-500)}.VWh0dG_unpricedHint{border:1px solid color-mix(in srgb, var(--dsw-static-amber-500) 30%, transparent);background:color-mix(in srgb, var(--dsw-static-amber-500) 8%, transparent);color:var(--dsw-static-amber-500);border-radius:8px;align-items:center;padding:8px 12px;font-size:11.5px;font-weight:500;line-height:17px;display:flex}.VWh0dG_kpiGrid{grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;display:grid}.VWh0dG_kpiTile{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:12px;flex-direction:column;gap:3px;padding:16px;transition:border-color .16s;display:flex;position:relative;overflow:hidden}.VWh0dG_kpiTile:hover{border-color:var(--dsw-alias-border-l2)}.VWh0dG_kpiLabel{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:15px}.VWh0dG_kpiValue{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;letter-spacing:-.01em;font-size:24px;font-weight:600;line-height:32px}.VWh0dG_kpiGreen{color:var(--dsw-static-green-500)}.VWh0dG_kpiDetail{color:var(--dsw-alias-label-caption);white-space:nowrap;text-overflow:ellipsis;font-size:11px;line-height:15px;overflow:hidden}.VWh0dG_panel{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:12px;flex-direction:column;gap:10px;padding:16px 18px;transition:border-color .16s;display:flex}.VWh0dG_panelHead{justify-content:space-between;align-items:baseline;gap:10px;display:flex}.VWh0dG_panelTitle{letter-spacing:-.005em;color:var(--dsw-alias-label-primary);margin:0;font-size:14px;font-weight:600;line-height:20px}.VWh0dG_panelHint{color:var(--dsw-alias-label-caption);white-space:nowrap;font-size:11px;line-height:16px}.VWh0dG_pricingTip{color:var(--dsw-alias-label-caption);margin:0 0 2px;font-size:11px;line-height:16px}.VWh0dG_rangeToggle{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:8px;gap:2px;padding:2px;display:inline-flex}.VWh0dG_rangeButton{color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:none;border-radius:6px;padding:2px 8px;font-size:11px;line-height:16px;transition:background-color .14s,color .14s}.VWh0dG_rangeButtonActive{background:var(--dsw-alias-interactive-bg-hover);color:var(--dsw-alias-label-primary);font-weight:600}.VWh0dG_exportBar{justify-content:flex-end;align-items:center;gap:8px;display:flex}.VWh0dG_exportLabel{color:var(--dsw-alias-label-caption);font-size:11px;line-height:16px}.VWh0dG_exportButton{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-secondary);cursor:pointer;border-radius:999px;padding:4px 12px;font-size:11.5px;line-height:16px;transition:border-color .16s,color .16s,background-color .16s}.VWh0dG_exportButton:hover,.VWh0dG_exportButton:focus-visible{border-color:var(--dsw-alias-border-l2);color:var(--dsw-alias-label-primary);outline:none}.VWh0dG_shareTrack{background:var(--dsw-alias-bg-module-platform);border-radius:999px;height:10px;display:flex;overflow:hidden}.VWh0dG_shareSeg{height:100%;transition:width .2s}.VWh0dG_shareSegPeak{background:var(--dsw-static-blue-500)}.VWh0dG_shareSegOff{background:color-mix(in srgb, var(--dsw-static-blue-500) 25%, var(--dsw-alias-bg-module-platform))}.VWh0dG_shareSegUser{background:var(--dsw-static-blue-500)}.VWh0dG_shareSegAssistant{background:var(--dsw-static-green-500)}.VWh0dG_shareSegTool{background:var(--dsw-static-amber-500)}.VWh0dG_shareLegend{align-items:center;gap:16px;display:flex}.VWh0dG_shareItem{color:var(--dsw-alias-label-secondary);align-items:baseline;gap:6px;font-size:12px;line-height:17px;display:inline-flex}.VWh0dG_bucketCost{align-items:baseline;gap:3px;display:inline-flex}.VWh0dG_bucketOfficial{color:var(--dsw-static-blue-500);font-weight:600}.VWh0dG_bucketSep{color:var(--dsw-alias-label-dimmed)}.VWh0dG_bucketThird{color:var(--dsw-alias-label-secondary)}.VWh0dG_bucketSummary{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;display:grid}.VWh0dG_bucketStat{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:12px;flex-direction:column;gap:4px;padding:12px 14px;display:flex}.VWh0dG_bucketStatLabel{color:var(--dsw-alias-label-tertiary);text-transform:uppercase;letter-spacing:.05em;font-size:11px;line-height:15px}.VWh0dG_bucketStatValue{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;letter-spacing:-.01em;font-size:20px;font-weight:700;line-height:26px}.VWh0dG_bucketStatSub{color:var(--dsw-alias-label-caption);font-variant-numeric:tabular-nums;font-size:11px;line-height:16px}.VWh0dG_shareDot{border-radius:50%;flex:none;align-self:center;width:8px;height:8px}.VWh0dG_shareValue{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-weight:600}.VWh0dG_budget{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:14px;flex-direction:column;gap:8px;padding:12px 16px;display:flex}.VWh0dG_budgetHead{justify-content:space-between;align-items:baseline;gap:10px;display:flex}.VWh0dG_budgetLabel{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:600}.VWh0dG_budgetValue{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:12px;line-height:17px}.VWh0dG_budgetControls{align-items:center;gap:8px;min-width:0;display:inline-flex}.VWh0dG_budgetInputWrap{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:6px;align-items:center;gap:2px;padding:2px 6px;display:inline-flex}.VWh0dG_budgetInputWrap:focus-within{border-color:var(--dsw-alias-border-l3)}.VWh0dG_budgetUnit{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}.VWh0dG_budgetInput{width:64px;color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;text-align:right;background:0 0;border:none;padding:0;font-size:12px;line-height:16px}.VWh0dG_budgetInput:focus-visible{outline:none}.VWh0dG_switch{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-module-platform);cursor:pointer;border-radius:999px;flex:none;width:30px;height:17px;padding:0;transition:background-color .16s,border-color .16s;position:relative}.VWh0dG_switchOn{border-color:var(--dsw-alias-border-l1);background:var(--dsw-alias-label-primary)}.VWh0dG_switchKnob{background:var(--dsw-static-neutral-bluish-00);border-radius:50%;width:11px;height:11px;transition:transform .16s;position:absolute;top:2px;left:2px}.VWh0dG_switchOn .VWh0dG_switchKnob{transform:translate(13px)}.VWh0dG_budgetTrack{background:var(--dsw-alias-bg-module-platform);border-radius:999px;height:6px;overflow:hidden}.VWh0dG_budgetFill{background:var(--dsw-static-blue-500);border-radius:999px;height:100%;transition:width .2s}.VWh0dG_budgetFillWarn{background:var(--dsw-static-amber-500)}.VWh0dG_budgetFillOver{background:var(--dsw-static-red-500);animation:1.6s ease-in-out infinite VWh0dG_budgetOverPulse}@keyframes VWh0dG_budgetOverPulse{50%{opacity:.55}}.VWh0dG_chartWrap{width:100%;position:relative}.VWh0dG_chartSvg{width:100%;height:auto;display:block}.VWh0dG_chartEmpty{height:140px;color:var(--dsw-alias-label-caption);justify-content:center;align-items:center;font-size:13px;display:flex}.VWh0dG_emptyRow{text-align:center;color:var(--dsw-alias-label-caption);padding:28px 0;font-size:13px}.VWh0dG_chartGrid{stroke:var(--dsw-alias-border-l1);stroke-width:1px}.VWh0dG_chartAxisLabel{fill:var(--dsw-alias-label-tertiary);font-size:10px}.VWh0dG_chartBar{fill:var(--dsw-static-blue-500);opacity:.7}.VWh0dG_chartBar:hover{opacity:1}.VWh0dG_chartStack{stroke:var(--dsw-alias-bg-layer-1);stroke-width:.75px}.VWh0dG_chartStack:hover{opacity:.9}.VWh0dG_chartLine{stroke:var(--dsw-static-blue-500);stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.VWh0dG_chartCrosshair{stroke:var(--dsw-alias-label-dimmed);stroke-width:1px;stroke-dasharray:3 3}.VWh0dG_chartDot{fill:var(--dsw-static-neutral-bluish-00);stroke:var(--dsw-static-blue-500);stroke-width:2px}.VWh0dG_chartTooltip{pointer-events:none;z-index:2;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);box-shadow:none;white-space:nowrap;border-radius:8px;padding:8px 10px;position:absolute;transform:translate(-50%,calc(-100% - 10px))}.VWh0dG_chartTooltipDate{color:var(--dsw-alias-label-primary);margin-bottom:3px;font-size:11px;font-weight:600}.VWh0dG_chartTooltipRow{color:var(--dsw-alias-label-secondary);align-items:center;gap:5px;font-size:11px;line-height:17px;display:flex}.VWh0dG_chartTooltipRow strong{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-weight:600}.VWh0dG_chartBarPlaceholder{fill:color-mix(in srgb, var(--dsw-alias-label-secondary) 30%, transparent)}.VWh0dG_chartLegendLine{background:var(--dsw-static-blue-500);border-radius:2px;width:10px;height:3px;display:inline-block}.VWh0dG_chartLegendBar{background:var(--dsw-static-blue-500);opacity:.5;border-radius:2px;width:7px;height:7px;display:inline-block}.VWh0dG_chartTooltipSwatch{border-radius:3px;flex:none;width:8px;height:8px;display:inline-block}.VWh0dG_chartLegend{color:var(--dsw-alias-label-tertiary);justify-content:flex-end;gap:14px;margin-top:2px;font-size:11px;display:flex}.VWh0dG_chartLegend span{align-items:center;gap:5px;display:inline-flex}.VWh0dG_tableScroll{border:1px solid var(--dsw-alias-border-l1);--dsh-scrollbar-thumb:var(--dsw-alias-scrollbar-bg-l2);--dsh-scrollbar-thumb-hover:var(--dsw-alias-scrollbar-hover-l2);border-radius:12px;overflow:auto}.VWh0dG_ubAlert{border:1px solid color-mix(in srgb, var(--dsw-static-blue-500) 30%, transparent);background:color-mix(in srgb, var(--dsw-static-blue-500) 8%, transparent);border-radius:10px;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;padding:10px 14px;font-size:12px;line-height:17px;display:flex}.VWh0dG_ubAlertLeft{align-items:center;gap:8px;display:inline-flex}.VWh0dG_ubRate{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-weight:600}.VWh0dG_ubAlertNote{color:var(--dsw-alias-label-secondary);margin:0}.VWh0dG_ubTag,.VWh0dG_ubTagSuccess,.VWh0dG_ubTagNeutral,.VWh0dG_ubTagAlert{white-space:nowrap;border-radius:999px;align-items:center;height:18px;padding:0 7px;font-size:10px;font-weight:600;line-height:14px;display:inline-flex}.VWh0dG_ubTagSuccess{background:color-mix(in srgb, var(--dsw-static-green-500) 14%, transparent);color:var(--dsw-static-green-500)}.VWh0dG_ubTagNeutral{background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-secondary)}.VWh0dG_ubTagAlert{background:color-mix(in srgb, var(--dsw-static-amber-500) 16%, transparent);color:var(--dsw-static-amber-500)}.VWh0dG_ubCard{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:12px;flex-direction:column;gap:12px;padding:16px 18px;display:flex}.VWh0dG_ubCardHead{justify-content:space-between;align-items:baseline;gap:12px;display:flex}.VWh0dG_ubCardTitle{color:var(--dsw-alias-label-primary);margin:0;font-size:13px;font-weight:600;line-height:18px}.VWh0dG_ubCardSub{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}.VWh0dG_ubTablewrap{border:1px solid var(--dsw-alias-border-l1);border-radius:10px;overflow:auto}.VWh0dG_ubTable{border-collapse:collapse;white-space:nowrap;width:100%;font-size:12.5px}.VWh0dG_ubTable th,.VWh0dG_ubTable td{border-bottom:1px solid var(--dsw-alias-border-l1);text-align:left;padding:9px 12px}.VWh0dG_ubTable tbody tr:last-child td{border-bottom:0}.VWh0dG_ubTable thead th{color:var(--dsw-alias-label-tertiary);text-transform:uppercase;letter-spacing:.05em;font-size:11px;font-weight:600}.VWh0dG_ubModel{align-items:center;gap:8px;display:inline-flex}.VWh0dG_ubModelDot{border-radius:50%;flex:none;width:9px;height:9px}.VWh0dG_ubModelName{color:var(--dsw-alias-label-primary);align-items:center;gap:6px;font-weight:500;display:inline-flex}.VWh0dG_ubPricepair{flex-wrap:wrap;gap:6px;display:inline-flex}.VWh0dG_ubChipPeak,.VWh0dG_ubChipOff{font-variant-numeric:tabular-nums;border-radius:999px;align-items:center;gap:5px;height:20px;padding:0 8px;font-size:11px;line-height:16px;display:inline-flex}.VWh0dG_ubChipLabel{font-size:10px;font-weight:600}.VWh0dG_ubChipPeak{background:color-mix(in srgb, var(--dsw-static-blue-500) 14%, transparent);color:var(--dsw-static-blue-500)}.VWh0dG_ubChipOff{background:color-mix(in srgb, var(--dsw-static-green-500) 14%, transparent);color:var(--dsw-static-green-500)}.VWh0dG_ubNotes{flex-direction:column;gap:8px;margin:0;padding:0;list-style:none;display:flex}.VWh0dG_ubNotesItem{align-items:baseline;gap:10px;display:flex}.VWh0dG_ubNotesTerm{color:var(--dsw-alias-label-primary);flex:0 0 72px;font-size:12px;font-weight:500}.VWh0dG_ubNotesDesc{min-width:0;color:var(--dsw-alias-label-secondary);flex:1;font-size:12px;line-height:17px}.VWh0dG_ubCardControlGroup{flex-wrap:wrap;align-items:center;gap:8px;display:inline-flex}.VWh0dG_ubTagError{white-space:nowrap;background:color-mix(in srgb, var(--dsw-static-red-500) 14%, transparent);height:18px;color:var(--dsw-static-red-500);border-radius:999px;align-items:center;padding:0 7px;font-size:10px;font-weight:600;line-height:14px;display:inline-flex}.VWh0dG_ubStatGrid{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;display:grid}.VWh0dG_ubStatCard{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:12px;flex-direction:column;gap:4px;padding:14px 16px;display:flex}.VWh0dG_ubStatLabel{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}.VWh0dG_ubStatValue{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;letter-spacing:-.01em;font-size:22px;font-weight:700;line-height:28px}.VWh0dG_ubStatDetail{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;font-size:11px;line-height:16px}.VWh0dG_rowlist{flex-direction:column;gap:4px;margin:0;padding:0;list-style:none;display:flex}.VWh0dG_rowline{width:100%;min-width:0;color:var(--dsw-alias-label-primary);text-align:left;cursor:pointer;background:0 0;border:1px solid #0000;border-radius:10px;justify-content:space-between;align-items:center;gap:12px;padding:9px 12px;transition:background-color .14s,border-color .14s;display:flex}.VWh0dG_rowline:hover{background:color-mix(in srgb, var(--dsw-alias-bg-layer-3) 60%, transparent);border-color:var(--dsw-alias-border-l1)}.VWh0dG_rowlineName{min-width:0;color:var(--dsw-alias-label-primary);white-space:nowrap;text-overflow:ellipsis;flex:1;font-size:12.5px;font-weight:500;overflow:hidden}.VWh0dG_rowlineRight{font-variant-numeric:tabular-nums;flex:none;align-items:baseline;gap:8px;display:inline-flex}.VWh0dG_rowlineMuted{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}.VWh0dG_rowlineChev{color:var(--dsw-alias-label-tertiary);font-size:14px}.VWh0dG_rowlineDrillWrap{padding-left:12px}.VWh0dG_rowlineDrill{border-left:1px solid var(--dsw-alias-border-l1);justify-content:space-between;align-items:center;gap:12px;padding:6px 12px;font-size:12px;display:flex}.VWh0dG_modelTable,.VWh0dG_pricingTable{border-collapse:collapse;width:100%;font-size:12.5px}.VWh0dG_modelTable th,.VWh0dG_modelTable td,.VWh0dG_pricingTable th,.VWh0dG_pricingTable td{border-bottom:1px solid var(--dsw-alias-border-l1);text-align:left;white-space:nowrap;padding:9px 12px}.VWh0dG_modelTable tbody tr:last-child td,.VWh0dG_pricingTable tbody tr:last-child td{border-bottom:0}.VWh0dG_modelTable thead th,.VWh0dG_pricingTable thead th{color:var(--dsw-alias-label-tertiary);text-transform:uppercase;letter-spacing:.05em;background:0 0;font-size:11px;font-weight:600}.VWh0dG_modelTable tbody tr,.VWh0dG_pricingTable tbody tr{transition:background-color .12s}.VWh0dG_modelTable tbody tr:hover,.VWh0dG_pricingTable tbody tr:hover{background:0 0}.VWh0dG_numCol{text-align:right;font-variant-numeric:tabular-nums}.VWh0dG_costCol{color:var(--dsw-alias-label-primary);font-weight:600}.VWh0dG_na{color:var(--dsw-alias-label-dimmed)}.VWh0dG_modelCell{align-items:center;gap:8px;display:inline-flex}.VWh0dG_modelDot{border-radius:50%;flex:none;width:9px;height:9px}.VWh0dG_modelName{color:var(--dsw-alias-label-primary);font-weight:500;line-height:16px;display:block}.VWh0dG_modelProvider{color:var(--dsw-alias-label-caption);font-size:10.5px;line-height:14px;display:block}.VWh0dG_pricingToggle{cursor:pointer;text-align:left;background:0 0;border:none;justify-content:space-between;align-items:center;gap:10px;width:100%;padding:0;display:flex}.VWh0dG_pricingToggle:hover .VWh0dG_panelTitle,.VWh0dG_pricingToggle:focus-visible .VWh0dG_panelTitle{color:var(--dsw-alias-label-primary)}.VWh0dG_rateBadge{vertical-align:1px;white-space:nowrap;border-radius:999px;align-items:center;margin-left:6px;padding:1px 6px;font-size:10px;font-weight:500;line-height:14px;display:inline-flex}.VWh0dG_rateBadgeLive{color:var(--dsw-static-green-500);background:var(--dsw-alias-bg-layer-2)}.VWh0dG_siteRow{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:10px;justify-content:space-between;align-items:center;gap:12px;padding:8px 10px;display:flex}.VWh0dG_siteRowName{align-items:center;gap:8px;min-width:0;display:inline-flex}.VWh0dG_siteKindTag{white-space:nowrap;border-radius:999px;flex:none;align-items:center;padding:1px 7px;font-size:10.5px;font-weight:600;line-height:16px;display:inline-flex}.VWh0dG_siteKindSite{color:var(--dsw-static-blue-500);background:color-mix(in srgb, var(--dsw-static-blue-500) 14%, transparent)}.VWh0dG_siteKindDirect{color:var(--dsw-static-green-500);background:color-mix(in srgb, var(--dsw-static-green-500) 14%, transparent)}.VWh0dG_siteKindUnknown{color:var(--dsw-static-red-500);background:color-mix(in srgb, var(--dsw-static-red-500) 14%, transparent)}.VWh0dG_siteRowTitle{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;font-weight:600;line-height:18px;overflow:hidden}.VWh0dG_siteRowMeta{flex:none;align-items:center;gap:10px;display:inline-flex}.VWh0dG_siteRowCost{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-size:12.5px;font-weight:700;line-height:18px}.VWh0dG_siteRowCalls{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;font-size:11.5px;line-height:17px}.VWh0dG_siteRowCallsLow{color:var(--dsw-static-red-500)}.VWh0dG_rateBadgeBuiltin{color:var(--dsw-alias-label-tertiary);background:var(--dsw-alias-bg-layer-2)}.VWh0dG_pricingToggleText{align-items:baseline;gap:10px;min-width:0;display:flex}.VWh0dG_pricingChevron{width:16px;height:16px;color:var(--dsw-alias-label-tertiary);flex:none;transition:transform .16s}.VWh0dG_pricingChevronOpen{transform:rotate(180deg)}.VWh0dG_bandPrice{align-items:baseline;gap:6px;display:inline-flex}.VWh0dG_bandPriceOff{color:var(--dsw-alias-label-caption)}.VWh0dG_bandPriceOff:before{content:\"/\";color:var(--dsw-alias-label-dimmed);margin-right:4px}.VWh0dG_bandTag{color:var(--dsw-alias-label-secondary);flex-direction:column;gap:1px;font-size:10.5px;line-height:14px;display:inline-flex}.VWh0dG_bandTagOff{color:var(--dsw-static-green-500);font-weight:600}.VWh0dG_bandTag>span:first-child{color:var(--dsw-alias-label-primary);font-weight:500}.VWh0dG_flatTag{color:var(--dsw-alias-label-caption);font-size:10.5px;line-height:14px}.VWh0dG_healthDot{border-radius:50%;flex:none;width:8px;height:8px;display:inline-block}.VWh0dG_healthOk{background:var(--dsw-static-green-500)}.VWh0dG_healthBad{background:var(--dsw-static-red-500)}.VWh0dG_healthIdle{background:var(--dsw-static-neutral-bluish-400)}.VWh0dG_dashboardRight{align-items:center;gap:8px;min-width:0;display:flex}.VWh0dG_healthBadge{white-space:nowrap;border-radius:999px;align-items:center;gap:6px;padding:3px 9px;font-size:11px;line-height:16px;display:inline-flex}.VWh0dG_healthBadgeOk{color:var(--dsw-static-green-500);background:var(--dsw-alias-bg-layer-2)}.VWh0dG_healthBadgeBad{color:var(--dsw-static-red-500);background:var(--dsw-alias-bg-layer-2)}.VWh0dG_planTag{color:var(--dsw-static-green-500);background:var(--dsw-alias-bg-layer-2);border-radius:999px;align-items:center;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px;display:inline-flex}.VWh0dG_uncataloguedTag{vertical-align:1px;color:var(--dsw-static-amber-500);background:var(--dsw-alias-bg-layer-2);border-radius:999px;margin-left:6px;padding:0 6px;font-size:10px;font-weight:600;line-height:16px;display:inline-block}.VWh0dG_estimatedTag{vertical-align:1px;color:var(--dsw-static-blue-500);background:var(--dsw-alias-bg-layer-2);border-radius:999px;margin-left:6px;padding:0 6px;font-size:10px;font-weight:600;line-height:16px;display:inline-block}.VWh0dG_feeBar{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;border-radius:999px;flex-wrap:wrap;align-items:center;gap:8px;padding:6px 12px;font-size:11px;line-height:16px;display:inline-flex}.VWh0dG_feeCount{color:var(--dsw-alias-label-primary);font-weight:600}.VWh0dG_feeSuffix{color:var(--dsw-alias-label-tertiary)}.VWh0dG_feeItem{color:var(--dsw-alias-label-secondary);white-space:nowrap}.VWh0dG_feeNum{color:var(--dsw-alias-label-primary)}.VWh0dG_feeSep{color:var(--dsw-alias-label-tertiary)}.VWh0dG_feeChipPrimary,.VWh0dG_feeChipOff,.VWh0dG_feeChipAlert,.VWh0dG_feeChipError{font-variant-numeric:tabular-nums;white-space:nowrap;border-radius:999px;align-items:center;height:20px;padding:0 8px;font-size:10px;font-weight:600;line-height:14px;display:inline-flex}.VWh0dG_feeChipPrimary{background:color-mix(in srgb, var(--dsw-static-blue-500) 14%, transparent);color:var(--dsw-static-blue-500)}.VWh0dG_feeChipOff{background:color-mix(in srgb, var(--dsw-static-green-500) 14%, transparent);color:var(--dsw-static-green-500)}.VWh0dG_feeChipAlert{background:color-mix(in srgb, var(--dsw-static-amber-500) 16%, transparent);color:var(--dsw-static-amber-500)}.VWh0dG_feeChipError{background:color-mix(in srgb, var(--dsw-static-red-500) 14%, transparent);color:var(--dsw-static-red-500)}.VWh0dG_balanceCell{align-items:center;gap:6px;display:inline-flex;position:relative}.VWh0dG_balanceDays{color:var(--dsw-alias-label-caption);white-space:nowrap;font-size:10.5px;line-height:14px}.VWh0dG_balanceDaysLow{color:var(--dsw-static-red-500);font-weight:600}.VWh0dG_balanceDaysBadge{border:1px solid var(--dsw-alias-label-caption);background:color-mix(in srgb, var(--dsw-alias-label-caption) 10%, transparent);min-width:24px;height:24px;color:var(--dsw-alias-label-secondary);cursor:pointer;border-radius:12px;justify-content:center;align-items:center;padding:0 6px;font-size:10.5px;font-weight:600;line-height:1;display:inline-flex}.VWh0dG_balanceDaysBadge:hover{border-color:var(--dsw-alias-label-secondary);background:color-mix(in srgb, var(--dsw-alias-label-caption) 18%, transparent)}.VWh0dG_balanceDaysBadgeLow{color:var(--dsw-static-red-500);border-color:var(--dsw-static-red-500);background:color-mix(in srgb, var(--dsw-static-red-500) 10%, transparent)}.VWh0dG_balanceDetailPop{z-index:20;background:var(--dsw-alias-bg-layer-3);border:1px solid var(--dsw-alias-label-caption);white-space:nowrap;border-radius:8px;flex-direction:column;gap:6px;min-width:180px;padding:8px 10px;display:inline-flex;position:absolute;top:calc(100% + 6px);right:0;box-shadow:0 6px 20px #0000002e}.VWh0dG_balanceDetailHead{justify-content:space-between;align-items:center;gap:12px;display:flex}.VWh0dG_balanceDetailTitle{color:var(--dsw-alias-label-primary);font-size:12px;font-weight:600}.VWh0dG_balanceDetailClose{cursor:pointer;color:var(--dsw-alias-label-caption);background:0 0;border:none;font-size:14px;line-height:1}.VWh0dG_balanceDetailClose:hover{color:var(--dsw-alias-label-primary)}.VWh0dG_balanceDetailGrid{flex-direction:column;gap:4px;display:inline-flex}.VWh0dG_balanceDetailRow{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;justify-content:space-between;gap:16px;font-size:11px;line-height:15px;display:flex}.VWh0dG_balanceDetailLabel{color:var(--dsw-alias-label-caption)}.VWh0dG_balanceDetailValue{color:var(--dsw-alias-label-primary);font-weight:500}body[data-zine-mode] .VWh0dG_trigger,body[data-zine-mode] .VWh0dG_triggerPop,body[data-zine-mode] .VWh0dG_railButton{display:none}body[data-zine-mode] .VWh0dG_dashboardHead{background:#000;border-bottom:2px solid #e8ff00}body[data-zine-mode] .VWh0dG_headTitleRow{align-items:center;gap:8px;margin-top:4px;display:flex}body[data-zine-mode] .VWh0dG_dashboardTitle{color:#e8ff00;letter-spacing:.04em;text-transform:uppercase;text-shadow:0 0 8px #e8ff0066;font-weight:900}body[data-zine-mode] .VWh0dG_dashboardSubtitle{color:#c9d98a;letter-spacing:.08em;text-transform:uppercase;font-size:10px}body[data-zine-mode] .VWh0dG_closeButton{color:#0a0a05;background:#ff2d95;border:1.5px solid #ff2d95;border-radius:0;box-shadow:0 0 10px #ff2d9573}body[data-zine-mode] .VWh0dG_hero{background:#000;border:2.5px solid #e8ff00;border-radius:0;position:relative;box-shadow:0 0 0 1px #0009,0 0 24px #e8ff002e}body[data-zine-mode] .VWh0dG_heroLabel{color:#c9d98a;letter-spacing:.12em;text-transform:uppercase;font-size:10px;font-weight:900}body[data-zine-mode] .VWh0dG_heroValue{color:#e8ff00;letter-spacing:-.02em;text-shadow:0 0 12px #e8ff0073;-webkit-text-fill-color:#e8ff00;background:0 0;font-size:38px;font-weight:900}body[data-zine-mode] .VWh0dG_heroMeta{color:#c9d98a;letter-spacing:.06em;text-transform:uppercase;font-size:10.5px}body[data-zine-mode] .VWh0dG_heroSideLabel{color:#c9d98a;letter-spacing:.1em;text-transform:uppercase;font-size:10px;font-weight:900}body[data-zine-mode] .VWh0dG_heroSideValue{color:#e8ff00;text-shadow:0 0 6px #e8ff0059}body[data-zine-mode] .VWh0dG_delta{font-weight:900}body[data-zine-mode] .VWh0dG_deltaUp{color:#ff2d95}body[data-zine-mode] .VWh0dG_deltaDown{color:#c9d98a}body[data-zine-mode] .VWh0dG_tabNav{background:#000;border-bottom:2px solid #e8ff00}body[data-zine-mode] .VWh0dG_tabButton{color:#c9d98a;letter-spacing:.08em;text-transform:uppercase;border-radius:0;font-size:10.5px;font-weight:900}body[data-zine-mode] .VWh0dG_tabButton:hover,body[data-zine-mode] .VWh0dG_tabButton:focus-visible{color:#e8ff00;background:#e8ff001f}body[data-zine-mode] .VWh0dG_tabButtonActive,body[data-zine-mode] .VWh0dG_tabButtonActive:hover,body[data-zine-mode] .VWh0dG_tabButtonActive:focus-visible{color:#0a0a05;background:#e8ff00;box-shadow:0 0 10px #e8ff0073}body[data-zine-mode] .VWh0dG_panel{background:#000;border:2px solid #e8ff00;border-radius:0}body[data-zine-mode] .VWh0dG_trendPanel{position:relative}body[data-zine-mode] .VWh0dG_panelTitle{color:#e8ff00;letter-spacing:.06em;text-transform:uppercase;text-shadow:0 0 6px #e8ff0066;font-weight:900}body[data-zine-mode] .VWh0dG_panelHint{color:#c9d98a;letter-spacing:.08em;text-transform:uppercase;font-size:10px;font-weight:900}body[data-zine-mode] .VWh0dG_modelTableScroll{background:#000;border:1.5px solid #e8ff0080;border-radius:0}.VWh0dG_currencyToggle{background:var(--dsw-alias-bg-layer-3);border:none;border-radius:8px;align-items:center;gap:2px;margin-right:8px;padding:2px;display:inline-flex}.VWh0dG_currencyButton{color:var(--dsw-alias-label-secondary);white-space:nowrap;cursor:pointer;background:0 0;border:0;border-radius:6px;padding:4px 8px;font-size:11px;font-weight:700;line-height:1}.VWh0dG_currencyButtonActive{background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary)}.VWh0dG_subscriptionGrid{grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:10px;margin-top:10px;display:grid}.VWh0dG_subscriptionCard{border:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 75%, transparent);background:color-mix(in srgb, var(--dsw-alias-bg-layer-2) 62%, transparent);-webkit-backdrop-filter:blur(12px)saturate(1.3);border-radius:12px;padding:12px 14px;transition:border-color .2s,box-shadow .2s;position:relative;overflow:hidden;box-shadow:0 8px 24px #0000001a}.VWh0dG_subscriptionCard:before{content:\"\";background:linear-gradient(90deg, transparent 0%, var(--dsw-static-amber-500) 30%, var(--dsw-alias-label-primary) 50%, var(--dsw-static-amber-500) 70%, transparent 100%);opacity:.9;pointer-events:none;background-size:200% 100%;height:1.5px;animation:3.6s ease-in-out infinite VWh0dG_subscriptionGoldFlow;position:absolute;top:0;left:0;right:0}@keyframes VWh0dG_subscriptionGoldFlow{0%{background-position:200% 0}to{background-position:-200% 0}}.VWh0dG_subscriptionCard:hover{border-color:color-mix(in srgb, var(--dsw-static-amber-500) 55%, var(--dsw-alias-border-l1));box-shadow:0 10px 30px #00000029}.VWh0dG_subscriptionHead{flex-wrap:wrap;align-items:baseline;gap:6px;margin-bottom:8px;display:flex}.VWh0dG_subscriptionName{font-size:13px;font-weight:700}.VWh0dG_subscriptionPlan{color:var(--dsw-alias-label-secondary);font-size:11px}.VWh0dG_subscriptionPlan[data-kind=code],.VWh0dG_subscriptionPlan[data-kind=token]{color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-3);border-radius:999px;padding:1px 8px;font-weight:500}.VWh0dG_subscriptionTier{color:var(--dsw-alias-label-secondary);margin-left:6px}.VWh0dG_subscriptionAuto{color:var(--dsw-static-blue-500);background:color-mix(in srgb, var(--dsw-static-blue-500) 14%, var(--dsw-alias-bg-layer-2));border-radius:999px;margin-left:6px;padding:1px 6px;font-size:10px}.VWh0dG_subscriptionStatus{color:var(--dsw-alias-label-secondary);margin-bottom:6px;font-size:11px}.VWh0dG_subscriptionWindow{align-items:center;gap:10px;margin-top:8px;font-size:11px;display:flex}.VWh0dG_subscriptionWindowLabel{color:var(--dsw-alias-label-secondary);flex:0 0 44px}.VWh0dG_subscriptionTrack{background:var(--dsw-alias-bg-layer-3);border-radius:3px;flex:1;height:6px;overflow:hidden}.VWh0dG_subscriptionFill{background:var(--dsw-static-blue-500);border-radius:3px;height:100%;transition:width .2s;display:block}.VWh0dG_subscriptionFillWarn{background:var(--dsw-static-amber-500)}.VWh0dG_subscriptionFillOver{background:var(--dsw-static-red-500)}.VWh0dG_subscriptionMeta{flex-direction:column;flex:none;align-items:flex-end;gap:2px;display:flex}.VWh0dG_subscriptionPct{text-align:right;font-variant-numeric:tabular-nums;flex:none;min-width:52px}.VWh0dG_subscriptionExhausted{color:var(--dsw-static-red-500);min-width:52px;font-weight:600}.VWh0dG_subscriptionReset{color:var(--dsw-alias-label-caption);white-space:nowrap;flex:none;font-size:10px}.VWh0dG_providerGroupList{flex-direction:column;gap:10px;display:flex}.VWh0dG_providerGroup{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:12px;padding:12px 14px}.VWh0dG_providerGroupHead{justify-content:space-between;align-items:baseline;gap:12px;display:flex}.VWh0dG_providerGroupTitle{align-items:center;gap:7px;min-width:0;display:inline-flex}.VWh0dG_providerGroupName{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:600;line-height:18px}.VWh0dG_providerGroupMeta{flex:none;align-items:center;gap:10px;display:inline-flex}.VWh0dG_providerGroupBadge{color:var(--dsw-static-green-500);background:var(--dsw-alias-bg-layer-2);border-radius:999px;align-items:center;padding:1px 8px;font-size:11px;font-weight:500;line-height:17px;display:inline-flex}.VWh0dG_providerGroupBalance{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;white-space:nowrap;align-items:baseline;gap:6px;font-size:12px;line-height:17px;display:inline-flex}.VWh0dG_providerGroupBalanceLabel{color:var(--dsw-alias-label-caption);font-size:11px;line-height:17px}.VWh0dG_roundsFlagBadge{color:var(--dsw-static-neutral-bluish-00);background:var(--dsw-static-red-500);border-radius:999px;margin-left:8px;padding:1px 7px;font-size:10px;font-weight:800}.VWh0dG_rounds{margin-top:10px}.VWh0dG_roundsBars{align-items:flex-end;gap:3px;height:124px;padding:16px 2px 0;display:flex;overflow-x:auto}.VWh0dG_roundsBarCol{border-radius:5px 5px 0 0;flex-direction:column;flex:1 0 28px;justify-content:flex-end;align-items:stretch;height:100%;display:flex;position:relative}.VWh0dG_roundsBarColPeak{background:color-mix(in srgb, var(--dsw-static-amber-500) 16%, transparent)}.VWh0dG_roundsBarColOff{background:var(--dsw-alias-bg-module-platform)}.VWh0dG_roundsBarLabel{text-align:center;color:var(--dsw-alias-label-secondary);white-space:nowrap;text-overflow:ellipsis;max-width:100%;font-size:9px;line-height:1.2;position:absolute;bottom:0;left:0;right:0;overflow:hidden;transform:translateY(-100%)}.VWh0dG_roundsBarWrap{flex:1;align-items:flex-end;min-height:0;display:flex}.VWh0dG_roundsBar{background:var(--dsw-static-blue-500);border-radius:2px 2px 0 0;width:100%;min-height:2px;position:relative}.VWh0dG_roundsBarFlagged{background:var(--dsw-static-red-500);border-radius:2px 2px 0 0;width:100%;min-height:2px;position:relative}.VWh0dG_roundsFlagMark{background:var(--dsw-static-red-500);border-radius:50%;width:7px;height:7px;position:absolute;top:-3px;right:-3px}.VWh0dG_roundsAxis{color:var(--dsw-alias-label-secondary);justify-content:space-between;margin-top:6px;font-size:10px;display:flex}.VWh0dG_roundsEmpty{color:var(--dsw-alias-label-secondary);margin-top:10px;font-size:12px}.VWh0dG_heatmap{margin-top:10px}.VWh0dG_heatmapGrid{grid-template-columns:repeat(7,minmax(0,1fr));gap:8px;display:grid}.VWh0dG_heatmapCellEmpty{background:var(--dsw-alias-bg-layer-1);height:30px;color:var(--dsw-alias-label-dimmed);font-variant-numeric:tabular-nums;border-radius:8px;justify-content:center;align-items:center;font-size:11px;display:flex}.VWh0dG_heatmapCell{font-variant-numeric:tabular-nums;cursor:pointer;border:0;border-radius:8px;justify-content:center;align-items:center;height:30px;padding:0;font-size:11px;display:flex}.VWh0dG_heatmapCell[data-level=\"0\"],.VWh0dG_heatmapCell[data-level=\"1\"],.VWh0dG_heatmapCell[data-level=\"2\"]{color:var(--dsw-alias-label-primary)}.VWh0dG_heatmapCell[data-level=\"3\"],.VWh0dG_heatmapCell[data-level=\"4\"]{color:var(--dsw-static-neutral-bluish-00)}.VWh0dG_heatmapFooter{color:var(--dsw-alias-label-secondary);align-items:center;gap:8px;margin-top:10px;font-size:10px;display:flex}.VWh0dG_heatmapLegend{gap:3px;display:inline-flex}.VWh0dG_heatmapLegend i{border-radius:4px;width:14px;height:14px;display:block}.VWh0dG_heatmapHover{font-variant-numeric:tabular-nums;margin-left:auto}.VWh0dG_heatmapRangeSwitch{gap:4px;margin-left:auto;display:inline-flex}.VWh0dG_heatmapRangeButton{border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-text-secondary);cursor:pointer;background:0 0;border-radius:6px;padding:2px 8px;font-size:11px;line-height:1.4}.VWh0dG_heatmapRangeButtonActive{color:var(--dsw-alias-text-primary);border-color:currentColor;font-weight:600}.VWh0dG_heatmapYear{flex-direction:column;gap:6px;display:flex}.VWh0dG_heatmapYearBody{align-items:flex-start;gap:6px;display:flex}.VWh0dG_heatmapYearWeekdays{color:var(--dsw-alias-text-tertiary);flex:none;grid-template-rows:repeat(7,11px);gap:3px;padding-top:12px;font-size:9px;line-height:11px;display:grid}.VWh0dG_heatmapYearWeekday{white-space:nowrap;text-align:right;height:11px}.VWh0dG_heatmapYearMonths{min-width:max-content;color:var(--dsw-alias-text-tertiary);grid-template-columns:repeat(52,11px);gap:3px;font-size:9px;line-height:12px;display:grid;overflow:visible}.VWh0dG_heatmapYearMonth{white-space:nowrap;overflow:visible}.VWh0dG_heatmapYearScroll{padding-bottom:2px;overflow-x:auto}.VWh0dG_heatmapYearGrid{grid-template-rows:repeat(7,11px);grid-auto-flow:column;gap:3px;min-width:max-content;display:grid}.VWh0dG_heatmapYearCell{cursor:pointer;border:0;border-radius:2px;width:11px;height:11px;padding:0}.VWh0dG_triggerPopSubscription{width:auto;left:0;right:0}.VWh0dG_floatSub{flex-direction:column;gap:6px;min-width:0;display:flex}.VWh0dG_floatSubHead{flex-wrap:wrap;align-items:baseline;gap:6px;min-width:0;display:flex}.VWh0dG_floatSubName{color:var(--dsw-alias-label-primary);font-size:12px;font-weight:700}.VWh0dG_floatSubPlan{color:var(--dsw-alias-label-secondary);font-size:10px}.VWh0dG_floatSub .VWh0dG_subscriptionWindow{flex-wrap:wrap;gap:4px 10px}.VWh0dG_floatSub .VWh0dG_subscriptionWindowLabel{flex:none}.VWh0dG_floatSub .VWh0dG_subscriptionMeta{min-width:0;max-width:100%}.VWh0dG_floatSub .VWh0dG_subscriptionPct{min-width:0}.VWh0dG_floatSub .VWh0dG_subscriptionReset{white-space:normal;overflow-wrap:anywhere}.VWh0dG_triggerPopEmpty{color:var(--dsw-alias-label-tertiary);padding:2px 0;font-size:11px;line-height:1.5}.VWh0dG_triggerPopSwitcher{justify-content:flex-end;align-items:center;gap:8px;margin-top:2px;display:flex}.VWh0dG_triggerPopSwitchBtn{color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:6px;padding:2px 4px;font-size:14px;line-height:1}.VWh0dG_triggerPopSwitchBtn:hover{color:var(--dsw-alias-label-primary);background:color-mix(in srgb, var(--dsw-alias-border-l1) 45%, transparent)}.VWh0dG_triggerPopSwitchCount{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;font-size:10px}.VWh0dG_floatModeRow{gap:8px;margin-bottom:8px;display:flex}.VWh0dG_floatModeBtn{border:1px solid color-mix(in srgb, var(--dsw-alias-border-l1) 75%, transparent);background:color-mix(in srgb, var(--dsw-alias-bg-layer-2) 60%, transparent);color:var(--dsw-alias-label-secondary);white-space:nowrap;cursor:pointer;border-radius:10px;flex:1;padding:7px 10px;font-size:12px}.VWh0dG_floatModeBtnOn{border-color:var(--dsw-static-blue-500);color:var(--dsw-alias-label-primary);background:color-mix(in srgb, var(--dsw-static-blue-500) 16%, transparent)}.VWh0dG_floatTargets{flex-wrap:wrap;gap:6px;margin-bottom:8px;display:flex}.VWh0dG_floatTarget{color:var(--dsw-alias-label-secondary);cursor:pointer;align-items:center;gap:5px;font-size:12px;display:inline-flex}.VWh0dG_floatTargetLabel{color:var(--dsw-alias-label-secondary)}.VWh0dG_staleNotice{color:var(--dsw-static-amber-500);background:color-mix(in srgb, var(--dsw-static-amber-500) 12%, transparent);border:1px solid color-mix(in srgb, var(--dsw-static-amber-500) 30%, transparent);border-radius:10px;align-items:center;gap:6px;margin:0 0 10px;padding:8px 10px;font-size:11px;display:flex}.VWh0dG_plgHead{align-items:flex-start;gap:12px;display:flex}.VWh0dG_plgIcon{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);width:40px;height:40px;color:var(--dsw-alias-label-secondary);border-radius:10px;flex:none;justify-content:center;align-items:center;display:inline-flex}.VWh0dG_plgTitle{flex-direction:column;gap:4px;min-width:0;display:flex}.VWh0dG_plgNameRow{align-items:center;gap:8px;display:flex}.VWh0dG_plgName{color:var(--dsw-alias-label-primary);margin:0;font-size:13px;font-weight:600;line-height:18px}.VWh0dG_plgTag{height:18px;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-3);white-space:nowrap;border-radius:5px;align-items:center;padding:0 6px;font-size:10px;font-weight:600;display:inline-flex}.VWh0dG_plgDesc{color:var(--dsw-alias-label-secondary);margin:0;font-size:11px;line-height:16px}.VWh0dG_plgGrid{border-top:1px solid var(--dsw-alias-border-l1);grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;padding-top:12px;display:grid}.VWh0dG_plgItem{flex-direction:column;gap:2px;min-width:0;display:flex}.VWh0dG_plgLabel{color:var(--dsw-alias-label-tertiary);font-size:10px;line-height:14px}.VWh0dG_plgVal{color:var(--dsw-alias-label-primary);word-break:break-all;font-size:12px;line-height:17px}.VWh0dG_plgLink{color:var(--dsw-static-blue-500);word-break:break-all;font-size:12px;line-height:17px;text-decoration:none}.VWh0dG_plgLink:hover{text-decoration:underline}.VWh0dG_pluginInfo{flex-direction:column;gap:8px;margin-top:10px;display:flex}.VWh0dG_pluginInfoRow{align-items:baseline;gap:12px;font-size:12px;display:flex}.VWh0dG_pluginInfoLabel{color:var(--dsw-alias-label-secondary);flex:0 0 72px}.VWh0dG_pluginInfoValue{color:var(--dsw-alias-label-primary);word-break:break-all}.VWh0dG_pluginInfoLink{color:var(--dsw-static-blue-500);word-break:break-all;text-decoration:none}.VWh0dG_pluginInfoLink:hover{text-decoration:underline}.VWh0dG_tokenPanel{flex-direction:column;gap:14px;display:flex}.VWh0dG_tokenModelBar{background:var(--dsw-alias-bg-layer-2);border-radius:999px;height:8px;overflow:hidden}.VWh0dG_tokenModelParts{height:100%;display:flex}.VWh0dG_tokenModelPartIn{background:var(--dsw-static-blue-500)}.VWh0dG_tokenModelPartOut{background:var(--dsw-static-amber-500)}.VWh0dG_tokenModelShareRow{align-items:center;gap:6px;display:inline-flex}@media (width<=640px){.VWh0dG_kpiGrid{grid-template-columns:repeat(2,minmax(0,1fr))}.VWh0dG_hero{gap:14px}.VWh0dG_heroTop{flex-direction:column;align-items:flex-start;gap:12px}.VWh0dG_heroGauge{width:72px;height:72px}.VWh0dG_heroSide{gap:12px}.VWh0dG_heroSideSpacer{display:none}}.VWh0dG_peakCard{z-index:2000;border:1px solid var(--dsw-alias-border-l1);background:color-mix(in srgb, var(--dsw-alias-bg-layer-2) 82%, transparent);-webkit-backdrop-filter:blur(12px)saturate(1.2);border-radius:12px;flex-direction:column;gap:8px;min-width:280px;max-width:380px;padding:16px;animation:.2s VWh0dG_peakAlertIn;display:flex;position:fixed;box-shadow:0 4px 16px #00000014}.VWh0dG_peakCardCorner{bottom:18px;right:18px}.VWh0dG_peakCardCenter{top:20%;left:50%;transform:translate(-50%)}.VWh0dG_peakCardPeak{color:var(--dsw-static-blue-500)}.VWh0dG_peakCardOff{color:var(--dsw-static-green-500)}.VWh0dG_peakHead{justify-content:space-between;align-items:center;gap:8px;display:flex}.VWh0dG_peakTag{white-space:nowrap;border-radius:6px;align-items:center;gap:6px;height:20px;padding:0 8px;font-size:11px;font-weight:600;line-height:14px;display:inline-flex}.VWh0dG_peakTagPrimary{background:var(--dsw-alias-bg-layer-3);color:var(--dsw-static-blue-500)}.VWh0dG_peakTagSuccess{background:var(--dsw-alias-bg-layer-3);color:var(--dsw-static-green-500)}.VWh0dG_peakDot{border-radius:999px;flex:none;width:6px;height:6px}.VWh0dG_peakDotPrimary{background:var(--dsw-static-blue-500)}.VWh0dG_peakDotSuccess{background:var(--dsw-static-green-500)}.VWh0dG_peakClose{width:24px;height:24px;color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:6px;justify-content:center;align-items:center;font-size:15px;line-height:1;transition:background-color .14s,color .14s;display:inline-flex}.VWh0dG_peakClose:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2)}.VWh0dG_peakCount{font-variant-numeric:tabular-nums;font-size:28px;font-weight:700;line-height:34px}.VWh0dG_peakCountPrimary{color:var(--dsw-static-blue-500)}.VWh0dG_peakCountSuccess{color:var(--dsw-static-green-500)}.VWh0dG_peakDesc{color:var(--dsw-alias-label-secondary);margin:0;font-size:12px;line-height:18px}@keyframes VWh0dG_peakAlertIn{0%{opacity:0}to{opacity:1}}.VWh0dG_peakAlertPanel{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:16px;flex-direction:column;gap:10px;padding:14px 16px;display:flex}.VWh0dG_peakAlertPanelHead{justify-content:space-between;align-items:center;gap:10px;display:flex}.VWh0dG_peakAlertPanelLabel{color:var(--dsw-alias-label-primary);font-size:13px;font-weight:600}.VWh0dG_peakAlertPanelBody{flex-wrap:wrap;align-items:center;gap:12px 16px;display:flex}.VWh0dG_peakAlertField{color:var(--dsw-alias-label-secondary);align-items:center;gap:8px;font-size:12px;display:inline-flex}.VWh0dG_peakAlertNum{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);width:56px;color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;border-radius:6px;padding:4px 6px}.VWh0dG_peakAlertSelect{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);border-radius:6px;padding:4px 6px;font-size:12px}.VWh0dG_peakAlertCheck{color:var(--dsw-alias-label-secondary);align-items:center;gap:6px;font-size:12px;display:inline-flex}.VWh0dG_peakAlertPreview{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:6px;padding:5px 10px;font-size:12px}.VWh0dG_peakAlertPreview:hover{background:var(--dsw-alias-bg-layer-3)}.VWh0dG_setCard{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:12px;flex-direction:column;gap:12px;padding:16px 18px;display:flex}.VWh0dG_setCardHead{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.VWh0dG_setCardMeta{flex-direction:column;gap:4px;min-width:0;display:flex}.VWh0dG_setCardTitle{color:var(--dsw-alias-label-primary);margin:0;font-size:13px;font-weight:600;line-height:18px}.VWh0dG_setCardDesc{color:var(--dsw-alias-label-secondary);margin:0;font-size:11px;line-height:16px}.VWh0dG_ctlCol{flex-direction:column;gap:10px;padding-top:2px;display:flex}.VWh0dG_ctlRow{align-items:center;gap:12px;min-height:28px;display:flex}.VWh0dG_ctlRowStretch{display:flex}.VWh0dG_ctlLabel{color:var(--dsw-alias-label-secondary);flex:0 0 96px;font-size:11px;line-height:16px}.VWh0dG_ctlGroup{flex-wrap:wrap;align-items:center;gap:8px;display:inline-flex}.VWh0dG_rdo{color:var(--dsw-alias-label-secondary);cursor:pointer;white-space:nowrap;align-items:center;gap:6px;font-size:12px;line-height:16px;display:inline-flex}.VWh0dG_rdo input{opacity:0;pointer-events:none;position:absolute}.VWh0dG_rdoDot{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);border-radius:50%;flex:none;width:14px;height:14px;position:relative}.VWh0dG_rdo input:checked+.VWh0dG_rdoDot{border-color:var(--dsw-static-blue-500)}.VWh0dG_rdo input:checked+.VWh0dG_rdoDot:after{content:\"\";background:var(--dsw-static-blue-500);border-radius:50%;position:absolute;inset:3px}.VWh0dG_inp{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:6px;align-items:center;gap:4px;padding:2px 6px;display:inline-flex}.VWh0dG_affix{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}.VWh0dG_sel{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);border-radius:6px;padding:3px 8px;font-size:12px;line-height:16px}.VWh0dG_prog{background:var(--dsw-alias-bg-module-platform);border-radius:999px;flex:1;min-width:0;height:6px;overflow:hidden}.VWh0dG_progFill{background:var(--dsw-static-blue-500);border-radius:999px;height:100%;transition:width .2s}.VWh0dG_btn{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);height:28px;color:var(--dsw-alias-label-secondary);cursor:pointer;border-radius:999px;align-items:center;gap:6px;padding:0 12px;font-size:12px;line-height:16px;transition:border-color .16s,color .16s,background-color .16s;display:inline-flex}.VWh0dG_btn:hover{border-color:var(--dsw-static-blue-500);color:var(--dsw-alias-label-primary);background:color-mix(in srgb, var(--dsw-static-blue-500) 12%, var(--dsw-alias-bg-layer-1))}.VWh0dG_settingsHead{flex-direction:column;gap:4px;margin-bottom:2px;display:flex}.VWh0dG_settingsTitle{letter-spacing:-.005em;color:var(--dsw-alias-label-primary);margin:0;font-size:15px;font-weight:650;line-height:22px}.VWh0dG_settingsHint{color:var(--dsw-alias-label-caption);margin:0;font-size:11px;line-height:16px}.VWh0dG_budgetHint,.VWh0dG_peakAlertHint{color:var(--dsw-alias-label-caption);margin:6px 0 0;font-size:11px;line-height:16px}";
57
64
  const tagId = "@kenz1117/dsh-ui-usage-billing/UsageBilling.module.css";
58
65
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
59
66
  const tag = document.createElement("style");
@@ -63,347 +70,456 @@ window.__ModuleLoader__.load({
63
70
  document.head.appendChild(tag);
64
71
  }
65
72
  var UsageBilling_module_css_default = {
66
- "panel": "VWh0dG_panel",
67
- "triggerPopSwitchBtn": "VWh0dG_triggerPopSwitchBtn",
68
- "bucketStatValue": "VWh0dG_bucketStatValue",
69
- "chartTooltipSwatch": "VWh0dG_chartTooltipSwatch",
70
- "panelHead": "VWh0dG_panelHead",
73
+ "tabPanel": "VWh0dG_tabPanel",
74
+ "tabButton": "VWh0dG_tabButton",
75
+ "subscriptionReset": "VWh0dG_subscriptionReset",
76
+ "triggerPopTitleMonth": "VWh0dG_triggerPopTitleMonth",
77
+ "peakAlertPanelLabel": "VWh0dG_peakAlertPanelLabel",
78
+ "triggerPopStrong": "VWh0dG_triggerPopStrong",
79
+ "peakDotSuccess": "VWh0dG_peakDotSuccess",
80
+ "subscriptionPlan": "VWh0dG_subscriptionPlan",
81
+ "triggerPopMetricLabel": "VWh0dG_triggerPopMetricLabel",
82
+ "rowlineChev": "VWh0dG_rowlineChev",
83
+ "peakCardOff": "VWh0dG_peakCardOff",
84
+ "ubStatLabel": "VWh0dG_ubStatLabel",
85
+ "peakAlertCheck": "VWh0dG_peakAlertCheck",
86
+ "triggerIcon": "VWh0dG_triggerIcon",
87
+ "heatmapCell": "VWh0dG_heatmapCell",
88
+ "ubCardTitle": "VWh0dG_ubCardTitle",
89
+ "currencyButtonActive": "VWh0dG_currencyButtonActive",
90
+ "shareItem": "VWh0dG_shareItem",
91
+ "rounds": "VWh0dG_rounds",
92
+ "heatmapFooter": "VWh0dG_heatmapFooter",
71
93
  "roundsBarLabel": "VWh0dG_roundsBarLabel",
94
+ "progFill": "VWh0dG_progFill",
95
+ "healthBad": "VWh0dG_healthBad",
96
+ "trigger": "VWh0dG_trigger",
97
+ "chartTooltip": "VWh0dG_chartTooltip",
98
+ "subscriptionFill": "VWh0dG_subscriptionFill",
99
+ "pluginInfoLink": "VWh0dG_pluginInfoLink",
100
+ "peakCardCorner": "VWh0dG_peakCardCorner",
101
+ "peakAlertPanelHead": "VWh0dG_peakAlertPanelHead",
102
+ "triggerPopBadgeDirect": "VWh0dG_triggerPopBadgeDirect",
103
+ "peakTagPrimary": "VWh0dG_peakTagPrimary",
104
+ "peakAlertPanelBody": "VWh0dG_peakAlertPanelBody",
105
+ "currencyToggle": "VWh0dG_currencyToggle",
106
+ "bucketStat": "VWh0dG_bucketStat",
107
+ "rowlist": "VWh0dG_rowlist",
108
+ "rangeToggle": "VWh0dG_rangeToggle",
109
+ "setCardMeta": "VWh0dG_setCardMeta",
110
+ "bucketStatLabel": "VWh0dG_bucketStatLabel",
111
+ "costCol": "VWh0dG_costCol",
72
112
  "chartSvg": "VWh0dG_chartSvg",
73
- "heatmapLegend": "VWh0dG_heatmapLegend",
74
113
  "triggerPopMetric": "VWh0dG_triggerPopMetric",
75
- "siteRowMeta": "VWh0dG_siteRowMeta",
76
- "balanceDetailGrid": "VWh0dG_balanceDetailGrid",
77
- "subscriptionWindowLabel": "VWh0dG_subscriptionWindowLabel",
78
- "liveCostSep": "VWh0dG_liveCostSep",
79
- "pricingChevron": "VWh0dG_pricingChevron",
80
- "roundsBarCol": "VWh0dG_roundsBarCol",
81
- "heatmap": "VWh0dG_heatmap",
82
- "hero": "VWh0dG_hero",
83
- "triggerPopFootName": "VWh0dG_triggerPopFootName",
84
- "balanceDetailLabel": "VWh0dG_balanceDetailLabel",
114
+ "rowlineDrillWrap": "VWh0dG_rowlineDrillWrap",
115
+ "popTagSub": "VWh0dG_popTagSub",
116
+ "ubTable": "VWh0dG_ubTable",
117
+ "heatmapYearScroll": "VWh0dG_heatmapYearScroll",
118
+ "heroGaugePctOver": "VWh0dG_heroGaugePctOver",
119
+ "tokenModelShareRow": "VWh0dG_tokenModelShareRow",
120
+ "peakDesc": "VWh0dG_peakDesc",
121
+ "subscriptionTier": "VWh0dG_subscriptionTier",
122
+ "providerGroup": "VWh0dG_providerGroup",
123
+ "rowlineDrill": "VWh0dG_rowlineDrill",
124
+ "feeBar": "VWh0dG_feeBar",
125
+ "budgetControls": "VWh0dG_budgetControls",
85
126
  "heatmapYearCell": "VWh0dG_heatmapYearCell",
86
- "tabNav": "VWh0dG_tabNav",
87
- "roundsBarWrap": "VWh0dG_roundsBarWrap",
88
- "peakAlertTag": "VWh0dG_peakAlertTag",
89
- "dashboardModal": "VWh0dG_dashboardModal",
90
- "rateBadgeBuiltin": "VWh0dG_rateBadgeBuiltin",
91
- "heroGaugeLabel": "VWh0dG_heroGaugeLabel",
92
- "kpiLabel": "VWh0dG_kpiLabel",
93
- "rateBadge": "VWh0dG_rateBadge",
94
- "deltaDown": "VWh0dG_deltaDown",
95
- "pricingTip": "VWh0dG_pricingTip",
96
- "exportButton": "VWh0dG_exportButton",
97
- "siteRowName": "VWh0dG_siteRowName",
98
- "bucketThird": "VWh0dG_bucketThird",
99
- "chartLine": "VWh0dG_chartLine",
100
- "siteKindDirect": "VWh0dG_siteKindDirect",
101
- "planTag": "VWh0dG_planTag",
102
- "balanceDaysBadgeLow": "VWh0dG_balanceDaysBadgeLow",
103
- "subscriptionStatus": "VWh0dG_subscriptionStatus",
127
+ "plgNameRow": "VWh0dG_plgNameRow",
128
+ "bucketCost": "VWh0dG_bucketCost",
129
+ "triggerPopName": "VWh0dG_triggerPopName",
130
+ "popModelName": "VWh0dG_popModelName",
131
+ "unpricedHint": "VWh0dG_unpricedHint",
132
+ "bandTag": "VWh0dG_bandTag",
133
+ "peakDotPrimary": "VWh0dG_peakDotPrimary",
134
+ "setCardDesc": "VWh0dG_setCardDesc",
135
+ "balanceDetailValue": "VWh0dG_balanceDetailValue",
136
+ "triggerYen": "VWh0dG_triggerYen",
137
+ "heroGaugeArcOver": "VWh0dG_heroGaugeArcOver",
104
138
  "heatmapYearMonths": "VWh0dG_heatmapYearMonths",
105
- "floatSub": "VWh0dG_floatSub",
106
- "pluginInfoRow": "VWh0dG_pluginInfoRow",
107
- "kpiValue": "VWh0dG_kpiValue",
108
- "floatSubPlan": "VWh0dG_floatSubPlan",
109
- "triggerPopFootNotes": "VWh0dG_triggerPopFootNotes",
110
- "triggerPopMuted": "VWh0dG_triggerPopMuted",
139
+ "subscriptionWindow": "VWh0dG_subscriptionWindow",
140
+ "floatTarget": "VWh0dG_floatTarget",
141
+ "prog": "VWh0dG_prog",
142
+ "ubModel": "VWh0dG_ubModel",
143
+ "popTagPrimary": "VWh0dG_popTagPrimary",
144
+ "triggerPopBars": "VWh0dG_triggerPopBars",
145
+ "heroSideItem": "VWh0dG_heroSideItem",
146
+ "providerGroupBadge": "VWh0dG_providerGroupBadge",
147
+ "deltaDown": "VWh0dG_deltaDown",
148
+ "triggerPopBadgeSub": "VWh0dG_triggerPopBadgeSub",
149
+ "triggerPopMetricHighlight": "VWh0dG_triggerPopMetricHighlight",
150
+ "floatModeRow": "VWh0dG_floatModeRow",
151
+ "popHead": "VWh0dG_popHead",
152
+ "pricingTable": "VWh0dG_pricingTable",
153
+ "panel": "VWh0dG_panel",
154
+ "budgetValue": "VWh0dG_budgetValue",
155
+ "peakAlertPanel": "VWh0dG_peakAlertPanel",
156
+ "reconcileIcon": "VWh0dG_reconcileIcon",
157
+ "siteRowCost": "VWh0dG_siteRowCost",
158
+ "staleNotice": "VWh0dG_staleNotice",
159
+ "peakTagSuccess": "VWh0dG_peakTagSuccess",
160
+ "popDotNeutral": "VWh0dG_popDotNeutral",
161
+ "triggerPopFootStrong": "VWh0dG_triggerPopFootStrong",
162
+ "rateBadgeLive": "VWh0dG_rateBadgeLive",
163
+ "metricCell": "VWh0dG_metricCell",
164
+ "siteKindSite": "VWh0dG_siteKindSite",
165
+ "hero": "VWh0dG_hero",
166
+ "ubTagSuccess": "VWh0dG_ubTagSuccess",
167
+ "ctlRow": "VWh0dG_ctlRow",
168
+ "ctlCol": "VWh0dG_ctlCol",
169
+ "rdo": "VWh0dG_rdo",
170
+ "budgetOverPulse": "VWh0dG_budgetOverPulse",
171
+ "plgTag": "VWh0dG_plgTag",
111
172
  "heroSideSpacer": "VWh0dG_heroSideSpacer",
112
- "providerGroupMeta": "VWh0dG_providerGroupMeta",
113
- "bucketSep": "VWh0dG_bucketSep",
114
- "heatmapFooter": "VWh0dG_heatmapFooter",
115
- "shareLegend": "VWh0dG_shareLegend",
116
- "flatTag": "VWh0dG_flatTag",
117
- "balanceDetailHead": "VWh0dG_balanceDetailHead",
118
- "triggerWrap": "VWh0dG_triggerWrap",
119
- "reconcileNotice": "VWh0dG_reconcileNotice",
120
- "dashboardRight": "VWh0dG_dashboardRight",
121
- "triggerPopFoot": "VWh0dG_triggerPopFoot",
122
- "heroSideLabel": "VWh0dG_heroSideLabel",
123
- "heroGauge": "VWh0dG_heroGauge",
124
- "budgetLabel": "VWh0dG_budgetLabel",
125
- "budgetUnit": "VWh0dG_budgetUnit",
126
- "balanceDays": "VWh0dG_balanceDays",
127
- "shareTrack": "VWh0dG_shareTrack",
128
- "switch": "VWh0dG_switch",
129
- "subscriptionFillOver": "VWh0dG_subscriptionFillOver",
130
- "roundsBars": "VWh0dG_roundsBars",
131
- "unpricedHint": "VWh0dG_unpricedHint",
132
- "heatmapYearGrid": "VWh0dG_heatmapYearGrid",
133
- "balanceCell": "VWh0dG_balanceCell",
134
- "triggerIcon": "VWh0dG_triggerIcon",
135
- "tableScroll": "VWh0dG_tableScroll",
136
- "budgetInputWrap": "VWh0dG_budgetInputWrap",
173
+ "chartBarPlaceholder": "VWh0dG_chartBarPlaceholder",
137
174
  "rangeButtonActive": "VWh0dG_rangeButtonActive",
138
- "heroMeta": "VWh0dG_heroMeta",
139
- "heroGaugeTrack": "VWh0dG_heroGaugeTrack",
140
- "shareSegTool": "VWh0dG_shareSegTool",
141
- "budgetFillWarn": "VWh0dG_budgetFillWarn",
142
- "currencyButtonActive": "VWh0dG_currencyButtonActive",
143
- "bucketStatLabel": "VWh0dG_bucketStatLabel",
144
- "dashboardHead": "VWh0dG_dashboardHead",
145
- "chartTooltipRow": "VWh0dG_chartTooltipRow",
146
- "heatmapGrid": "VWh0dG_heatmapGrid",
147
- "panelHint": "VWh0dG_panelHint",
148
- "siteRow": "VWh0dG_siteRow",
149
- "triggerPopUpdated": "VWh0dG_triggerPopUpdated",
150
- "shareSegAssistant": "VWh0dG_shareSegAssistant",
151
- "heatmapCell": "VWh0dG_heatmapCell",
152
- "floatModeRow": "VWh0dG_floatModeRow",
153
- "pluginInfo": "VWh0dG_pluginInfo",
154
- "dashboardBody": "VWh0dG_dashboardBody",
155
- "peakAlert": "VWh0dG_peakAlert",
156
- "settingsHint": "VWh0dG_settingsHint",
175
+ "rowlineName": "VWh0dG_rowlineName",
176
+ "peakAlertHint": "VWh0dG_peakAlertHint",
177
+ "switchKnob": "VWh0dG_switchKnob",
178
+ "siteKindTag": "VWh0dG_siteKindTag",
179
+ "tokenModelPartIn": "VWh0dG_tokenModelPartIn",
157
180
  "healthOk": "VWh0dG_healthOk",
158
- "settingsHead": "VWh0dG_settingsHead",
159
- "budget": "VWh0dG_budget",
160
- "dashboardTitle": "VWh0dG_dashboardTitle",
161
- "budgetControls": "VWh0dG_budgetControls",
162
- "triggerPopLabel": "VWh0dG_triggerPopLabel",
163
- "floatModeBtnOn": "VWh0dG_floatModeBtnOn",
164
- "peakAlertPanelHead": "VWh0dG_peakAlertPanelHead",
181
+ "tabButtonActive": "VWh0dG_tabButtonActive",
182
+ "bucketStatValue": "VWh0dG_bucketStatValue",
183
+ "heatmapYear": "VWh0dG_heatmapYear",
184
+ "kpiTile": "VWh0dG_kpiTile",
185
+ "dashboard": "VWh0dG_dashboard",
186
+ "providerGroupBalanceLabel": "VWh0dG_providerGroupBalanceLabel",
187
+ "ctlLabel": "VWh0dG_ctlLabel",
188
+ "balanceDetailLabel": "VWh0dG_balanceDetailLabel",
189
+ "pricingToggleText": "VWh0dG_pricingToggleText",
190
+ "popModel": "VWh0dG_popModel",
191
+ "roundsFlagMark": "VWh0dG_roundsFlagMark",
192
+ "plgLabel": "VWh0dG_plgLabel",
193
+ "chartTooltipSwatch": "VWh0dG_chartTooltipSwatch",
194
+ "modelTable": "VWh0dG_modelTable",
195
+ "bucketOfficial": "VWh0dG_bucketOfficial",
196
+ "sel": "VWh0dG_sel",
165
197
  "siteRowCallsLow": "VWh0dG_siteRowCallsLow",
166
- "shareSegPeak": "VWh0dG_shareSegPeak",
167
- "siteRowCost": "VWh0dG_siteRowCost",
168
- "bucketStat": "VWh0dG_bucketStat",
169
- "shareItem": "VWh0dG_shareItem",
170
- "liveTierOff": "VWh0dG_liveTierOff",
171
- "subscriptionAuto": "VWh0dG_subscriptionAuto",
172
- "triggerPopFootStrong": "VWh0dG_triggerPopFootStrong",
173
- "subscriptionGoldFlow": "VWh0dG_subscriptionGoldFlow",
174
- "reconcileIcon": "VWh0dG_reconcileIcon",
175
- "kpiDetail": "VWh0dG_kpiDetail",
176
- "floatTargets": "VWh0dG_floatTargets",
177
- "peakAlertNum": "VWh0dG_peakAlertNum",
178
- "railButton": "VWh0dG_railButton",
179
- "heroGaugeSvg": "VWh0dG_heroGaugeSvg",
180
- "pluginInfoValue": "VWh0dG_pluginInfoValue",
181
- "staleNotice": "VWh0dG_staleNotice",
182
- "bucketStatSub": "VWh0dG_bucketStatSub",
183
- "heatmapRangeButton": "VWh0dG_heatmapRangeButton",
184
- "triggerPopValueStack": "VWh0dG_triggerPopValueStack",
185
- "triggerPopTitle": "VWh0dG_triggerPopTitle",
186
- "triggerSub": "VWh0dG_triggerSub",
187
- "triggerRow": "VWh0dG_triggerRow",
188
- "heroGaugeArcOver": "VWh0dG_heroGaugeArcOver",
189
- "roundsEmpty": "VWh0dG_roundsEmpty",
190
- "subscriptionName": "VWh0dG_subscriptionName",
191
- "triggerPopBars": "VWh0dG_triggerPopBars",
192
- "shareDot": "VWh0dG_shareDot",
193
- "dashboardIn": "VWh0dG_dashboardIn",
194
- "budgetFillOver": "VWh0dG_budgetFillOver",
195
- "subscriptionTier": "VWh0dG_subscriptionTier",
196
- "heroGaugeArc": "VWh0dG_heroGaugeArc",
197
198
  "uncataloguedTag": "VWh0dG_uncataloguedTag",
198
- "subscriptionExhausted": "VWh0dG_subscriptionExhausted",
199
- "heroGaugeCenter": "VWh0dG_heroGaugeCenter",
200
- "emptyRow": "VWh0dG_emptyRow",
201
- "providerGroupBalance": "VWh0dG_providerGroupBalance",
202
- "roundsFlagMark": "VWh0dG_roundsFlagMark",
199
+ "heroBudgetLabel": "VWh0dG_heroBudgetLabel",
200
+ "heroGaugeTrack": "VWh0dG_heroGaugeTrack",
201
+ "popTitle": "VWh0dG_popTitle",
202
+ "popModelStatusLow": "VWh0dG_popModelStatusLow",
203
+ "triggerPopValue": "VWh0dG_triggerPopValue",
204
+ "triggerPopMetrics": "VWh0dG_triggerPopMetrics",
203
205
  "panelTitle": "VWh0dG_panelTitle",
204
- "pricingToggle": "VWh0dG_pricingToggle",
205
- "dashboard": "VWh0dG_dashboard",
206
- "roundsAxis": "VWh0dG_roundsAxis",
207
- "liveQuotaCrit": "VWh0dG_liveQuotaCrit",
208
- "triggerPopStrong": "VWh0dG_triggerPopStrong",
209
- "pricingToggleText": "VWh0dG_pricingToggleText",
210
- "healthBad": "VWh0dG_healthBad",
211
- "triggerPopMetricValue": "VWh0dG_triggerPopMetricValue",
212
- "balanceDetailTitle": "VWh0dG_balanceDetailTitle",
213
- "roundsBarColPeak": "VWh0dG_roundsBarColPeak",
214
- "shareSegOff": "VWh0dG_shareSegOff",
215
- "heatmapYearWeekdays": "VWh0dG_heatmapYearWeekdays",
216
- "triggerPopSubscription": "VWh0dG_triggerPopSubscription",
217
- "peakAlertOff": "VWh0dG_peakAlertOff",
218
- "providerGroupBalanceLabel": "VWh0dG_providerGroupBalanceLabel",
206
+ "ubModelName": "VWh0dG_ubModelName",
207
+ "pricingTip": "VWh0dG_pricingTip",
219
208
  "balanceDaysLow": "VWh0dG_balanceDaysLow",
220
- "chartLegendLine": "VWh0dG_chartLegendLine",
221
- "peakAlertPeak": "VWh0dG_peakAlertPeak",
222
- "triggerPopName": "VWh0dG_triggerPopName",
223
- "heroSideItem": "VWh0dG_heroSideItem",
224
- "peakAlertPanelLabel": "VWh0dG_peakAlertPanelLabel",
225
- "estimatedTag": "VWh0dG_estimatedTag",
226
- "budgetOverPulse": "VWh0dG_budgetOverPulse",
227
- "chartStack": "VWh0dG_chartStack",
228
- "switchOn": "VWh0dG_switchOn",
229
- "balanceDetailValue": "VWh0dG_balanceDetailValue",
230
- "budgetHead": "VWh0dG_budgetHead",
231
- "heatmapYearScroll": "VWh0dG_heatmapYearScroll",
232
- "budgetValue": "VWh0dG_budgetValue",
233
- "providerGroupTitle": "VWh0dG_providerGroupTitle",
234
- "roundsBarColOff": "VWh0dG_roundsBarColOff",
235
- "floatSubName": "VWh0dG_floatSubName",
236
- "peakAlertPanelBody": "VWh0dG_peakAlertPanelBody",
237
- "deltaUp": "VWh0dG_deltaUp",
238
- "siteKindSite": "VWh0dG_siteKindSite",
239
- "peakAlertPanel": "VWh0dG_peakAlertPanel",
240
- "peakAlertPreview": "VWh0dG_peakAlertPreview",
241
- "rangeToggle": "VWh0dG_rangeToggle",
242
- "balanceDetailClose": "VWh0dG_balanceDetailClose",
243
- "peakAlertCheck": "VWh0dG_peakAlertCheck",
244
- "budgetHint": "VWh0dG_budgetHint",
245
- "triggerPopAlert": "VWh0dG_triggerPopAlert",
246
- "peakAlertHint": "VWh0dG_peakAlertHint",
247
- "subscriptionTrack": "VWh0dG_subscriptionTrack",
209
+ "siteRow": "VWh0dG_siteRow",
210
+ "setCard": "VWh0dG_setCard",
211
+ "subscriptionExhausted": "VWh0dG_subscriptionExhausted",
212
+ "heatmapYearBody": "VWh0dG_heatmapYearBody",
213
+ "balanceDetailHead": "VWh0dG_balanceDetailHead",
214
+ "tableScroll": "VWh0dG_tableScroll",
215
+ "delta": "VWh0dG_delta",
216
+ "tokenModelPartOut": "VWh0dG_tokenModelPartOut",
217
+ "healthIdle": "VWh0dG_healthIdle",
218
+ "settingsTitle": "VWh0dG_settingsTitle",
219
+ "heatmapGrid": "VWh0dG_heatmapGrid",
220
+ "headTitleRow": "VWh0dG_headTitleRow",
221
+ "kpiLabel": "VWh0dG_kpiLabel",
222
+ "peakCountSuccess": "VWh0dG_peakCountSuccess",
223
+ "peakAlertSelect": "VWh0dG_peakAlertSelect",
224
+ "exportButton": "VWh0dG_exportButton",
225
+ "heroBudgetTrack": "VWh0dG_heroBudgetTrack",
248
226
  "shareSeg": "VWh0dG_shareSeg",
249
- "balanceDetailPop": "VWh0dG_balanceDetailPop",
250
- "peakAlertCountdown": "VWh0dG_peakAlertCountdown",
251
- "subscriptionWindow": "VWh0dG_subscriptionWindow",
252
- "trendPanel": "VWh0dG_trendPanel",
253
- "liveCostItem": "VWh0dG_liveCostItem",
254
- "triggerPopBadgeDirect": "VWh0dG_triggerPopBadgeDirect",
227
+ "triggerWrap": "VWh0dG_triggerWrap",
255
228
  "heroMain": "VWh0dG_heroMain",
256
- "chartTooltip": "VWh0dG_chartTooltip",
257
- "roundsBarFlagged": "VWh0dG_roundsBarFlagged",
258
- "triggerPopMetricLabel": "VWh0dG_triggerPopMetricLabel",
229
+ "roundsEmpty": "VWh0dG_roundsEmpty",
230
+ "ubPricepair": "VWh0dG_ubPricepair",
231
+ "subscriptionFillOver": "VWh0dG_subscriptionFillOver",
232
+ "popModelStatus": "VWh0dG_popModelStatus",
233
+ "setCardHead": "VWh0dG_setCardHead",
234
+ "heroLabel": "VWh0dG_heroLabel",
235
+ "heroTop": "VWh0dG_heroTop",
236
+ "heroValue": "VWh0dG_heroValue",
237
+ "roundsFlagBadge": "VWh0dG_roundsFlagBadge",
238
+ "roundsBarColPeak": "VWh0dG_roundsBarColPeak",
239
+ "heroBudgetFillOver": "VWh0dG_heroBudgetFillOver",
240
+ "budgetFillOver": "VWh0dG_budgetFillOver",
241
+ "plgGrid": "VWh0dG_plgGrid",
242
+ "ubAlertLeft": "VWh0dG_ubAlertLeft",
243
+ "providerGroupList": "VWh0dG_providerGroupList",
244
+ "peakClose": "VWh0dG_peakClose",
245
+ "subscriptionGoldFlow": "VWh0dG_subscriptionGoldFlow",
246
+ "heroGaugeCenter": "VWh0dG_heroGaugeCenter",
247
+ "chartLegend": "VWh0dG_chartLegend",
248
+ "ubStatValue": "VWh0dG_ubStatValue",
249
+ "roundsBarCol": "VWh0dG_roundsBarCol",
259
250
  "bucketSummary": "VWh0dG_bucketSummary",
260
- "costCol": "VWh0dG_costCol",
261
- "chartEmpty": "VWh0dG_chartEmpty",
251
+ "bandPriceOff": "VWh0dG_bandPriceOff",
252
+ "currencyButton": "VWh0dG_currencyButton",
253
+ "kpiDetail": "VWh0dG_kpiDetail",
254
+ "panelHint": "VWh0dG_panelHint",
255
+ "ubModelDot": "VWh0dG_ubModelDot",
262
256
  "providerGroupName": "VWh0dG_providerGroupName",
263
- "peakAlertIn": "VWh0dG_peakAlertIn",
264
- "triggerSparkBar": "VWh0dG_triggerSparkBar",
265
- "triggerPopBadgeSub": "VWh0dG_triggerPopBadgeSub",
266
- "subscriptionFill": "VWh0dG_subscriptionFill",
267
- "providerGroupHead": "VWh0dG_providerGroupHead",
268
- "heatmapHover": "VWh0dG_heatmapHover",
269
- "triggerPopOpenBtn": "VWh0dG_triggerPopOpenBtn",
270
- "heroReadout": "VWh0dG_heroReadout",
271
- "roundsFlagBadge": "VWh0dG_roundsFlagBadge",
257
+ "heatmapYearMonth": "VWh0dG_heatmapYearMonth",
258
+ "settingsHead": "VWh0dG_settingsHead",
259
+ "subscriptionAuto": "VWh0dG_subscriptionAuto",
260
+ "providerGroupTitle": "VWh0dG_providerGroupTitle",
261
+ "ubChipLabel": "VWh0dG_ubChipLabel",
262
+ "ubStatGrid": "VWh0dG_ubStatGrid",
263
+ "rateBadgeBuiltin": "VWh0dG_rateBadgeBuiltin",
264
+ "healthBadgeOk": "VWh0dG_healthBadgeOk",
265
+ "roundsBars": "VWh0dG_roundsBars",
266
+ "peakCardPeak": "VWh0dG_peakCardPeak",
272
267
  "triggerSparkHot": "VWh0dG_triggerSparkHot",
273
- "chartBarPlaceholder": "VWh0dG_chartBarPlaceholder",
274
- "chartCrosshair": "VWh0dG_chartCrosshair",
275
- "heroTop": "VWh0dG_heroTop",
276
- "tokenModelBar": "VWh0dG_tokenModelBar",
277
- "triggerPopRow": "VWh0dG_triggerPopRow",
278
- "modelProvider": "VWh0dG_modelProvider",
279
- "triggerPopBar": "VWh0dG_triggerPopBar",
280
- "healthBadgeBad": "VWh0dG_healthBadgeBad",
281
- "trigger": "VWh0dG_trigger",
282
- "reconcileText": "VWh0dG_reconcileText",
283
- "billing-trigger": "VWh0dG_billing-trigger",
284
- "exportLabel": "VWh0dG_exportLabel",
285
- "siteRowTitle": "VWh0dG_siteRowTitle",
286
- "rangeButton": "VWh0dG_rangeButton",
287
- "currencyToggle": "VWh0dG_currencyToggle",
288
- "triggerMeta": "VWh0dG_triggerMeta",
268
+ "triggerPopTitle": "VWh0dG_triggerPopTitle",
269
+ "pluginInfoLabel": "VWh0dG_pluginInfoLabel",
270
+ "triggerPopSubscription": "VWh0dG_triggerPopSubscription",
271
+ "triggerPopSwitchBtn": "VWh0dG_triggerPopSwitchBtn",
272
+ "heroGaugeSvg": "VWh0dG_heroGaugeSvg",
273
+ "budgetFill": "VWh0dG_budgetFill",
274
+ "heatmapRangeSwitch": "VWh0dG_heatmapRangeSwitch",
275
+ "settingsHint": "VWh0dG_settingsHint",
276
+ "feeChipError": "VWh0dG_feeChipError",
277
+ "plgDesc": "VWh0dG_plgDesc",
278
+ "estimatedTag": "VWh0dG_estimatedTag",
279
+ "roundsBarFlagged": "VWh0dG_roundsBarFlagged",
280
+ "floatModeBtn": "VWh0dG_floatModeBtn",
281
+ "heatmapHover": "VWh0dG_heatmapHover",
282
+ "heroSideValue": "VWh0dG_heroSideValue",
283
+ "railButton": "VWh0dG_railButton",
284
+ "feeCount": "VWh0dG_feeCount",
285
+ "budgetTrack": "VWh0dG_budgetTrack",
286
+ "bandTagOff": "VWh0dG_bandTagOff",
287
+ "dashboardBody": "VWh0dG_dashboardBody",
288
+ "shareLegend": "VWh0dG_shareLegend",
289
+ "balanceDetailTitle": "VWh0dG_balanceDetailTitle",
290
+ "peakCountPrimary": "VWh0dG_peakCountPrimary",
291
+ "peakAlertPreview": "VWh0dG_peakAlertPreview",
292
+ "heatmapYearWeekday": "VWh0dG_heatmapYearWeekday",
293
+ "heroGauge": "VWh0dG_heroGauge",
294
+ "heroGaugeLabel": "VWh0dG_heroGaugeLabel",
295
+ "plgHead": "VWh0dG_plgHead",
296
+ "ubStatDetail": "VWh0dG_ubStatDetail",
297
+ "ubNotes": "VWh0dG_ubNotes",
298
+ "triggerPop": "VWh0dG_triggerPop",
299
+ "ubAlertNote": "VWh0dG_ubAlertNote",
300
+ "heroBudgetValue": "VWh0dG_heroBudgetValue",
301
+ "providerGroupBalance": "VWh0dG_providerGroupBalance",
302
+ "btn": "VWh0dG_btn",
303
+ "dashboardSubtitle": "VWh0dG_dashboardSubtitle",
304
+ "popDot": "VWh0dG_popDot",
305
+ "ubTagNeutral": "VWh0dG_ubTagNeutral",
306
+ "tokenModelParts": "VWh0dG_tokenModelParts",
307
+ "triggerPopHead": "VWh0dG_triggerPopHead",
308
+ "siteRowName": "VWh0dG_siteRowName",
309
+ "triggerPopMuted": "VWh0dG_triggerPopMuted",
310
+ "subscriptionPct": "VWh0dG_subscriptionPct",
311
+ "modelTableScroll": "VWh0dG_modelTableScroll",
312
+ "peakHead": "VWh0dG_peakHead",
313
+ "feeChipPrimary": "VWh0dG_feeChipPrimary",
314
+ "plgItem": "VWh0dG_plgItem",
289
315
  "shareValue": "VWh0dG_shareValue",
290
- "na": "VWh0dG_na",
291
- "floatSubHead": "VWh0dG_floatSubHead",
292
- "triggerPopMetrics": "VWh0dG_triggerPopMetrics",
293
- "heroSide": "VWh0dG_heroSide",
294
- "peakAlertCorner": "VWh0dG_peakAlertCorner",
316
+ "peakAlertIn": "VWh0dG_peakAlertIn",
317
+ "providerGroupMeta": "VWh0dG_providerGroupMeta",
318
+ "triggerPopEmpty": "VWh0dG_triggerPopEmpty",
319
+ "ubCardControlGroup": "VWh0dG_ubCardControlGroup",
320
+ "triggerPopFootNote": "VWh0dG_triggerPopFootNote",
321
+ "shareSegPeak": "VWh0dG_shareSegPeak",
322
+ "rateBadge": "VWh0dG_rateBadge",
323
+ "triggerPopLabel": "VWh0dG_triggerPopLabel",
324
+ "ubTagAlert": "VWh0dG_ubTagAlert",
295
325
  "pricingChevronOpen": "VWh0dG_pricingChevronOpen",
296
- "peakAlertField": "VWh0dG_peakAlertField",
326
+ "tabPanelIn": "VWh0dG_tabPanelIn",
327
+ "siteKindDirect": "VWh0dG_siteKindDirect",
328
+ "dashboardRight": "VWh0dG_dashboardRight",
329
+ "floatModeBtnOn": "VWh0dG_floatModeBtnOn",
330
+ "rowlineRight": "VWh0dG_rowlineRight",
331
+ "ubTag": "VWh0dG_ubTag",
297
332
  "siteRowCalls": "VWh0dG_siteRowCalls",
298
- "chartAxisLabel": "VWh0dG_chartAxisLabel",
299
- "triggerPopFootNote": "VWh0dG_triggerPopFootNote",
300
- "triggerSpark": "VWh0dG_triggerSpark",
301
- "bucketOfficial": "VWh0dG_bucketOfficial",
302
- "providerGroup": "VWh0dG_providerGroup",
303
- "floatModeBtn": "VWh0dG_floatModeBtn",
304
- "liveCostBar": "VWh0dG_liveCostBar",
305
- "siteKindUnknown": "VWh0dG_siteKindUnknown",
333
+ "feeItem": "VWh0dG_feeItem",
334
+ "heatmapRangeButtonActive": "VWh0dG_heatmapRangeButtonActive",
335
+ "feeNum": "VWh0dG_feeNum",
336
+ "heatmap": "VWh0dG_heatmap",
337
+ "dashboardHead": "VWh0dG_dashboardHead",
338
+ "ubStatCard": "VWh0dG_ubStatCard",
339
+ "triggerPopOpenBtn": "VWh0dG_triggerPopOpenBtn",
340
+ "subscriptionHead": "VWh0dG_subscriptionHead",
341
+ "budgetHint": "VWh0dG_budgetHint",
342
+ "bucketStatSub": "VWh0dG_bucketStatSub",
343
+ "ubCardHead": "VWh0dG_ubCardHead",
306
344
  "chartTooltipDate": "VWh0dG_chartTooltipDate",
345
+ "chartDot": "VWh0dG_chartDot",
346
+ "plgLink": "VWh0dG_plgLink",
347
+ "floatSub": "VWh0dG_floatSub",
348
+ "heroReadout": "VWh0dG_heroReadout",
349
+ "rowline": "VWh0dG_rowline",
350
+ "triggerLabel": "VWh0dG_triggerLabel",
351
+ "triggerPopMetricValue": "VWh0dG_triggerPopMetricValue",
352
+ "heatmapYearGrid": "VWh0dG_heatmapYearGrid",
353
+ "kpiGrid": "VWh0dG_kpiGrid",
354
+ "shareSegTool": "VWh0dG_shareSegTool",
355
+ "providerGroupHead": "VWh0dG_providerGroupHead",
356
+ "na": "VWh0dG_na",
307
357
  "subscriptionGrid": "VWh0dG_subscriptionGrid",
308
- "tokenPanel": "VWh0dG_tokenPanel",
309
- "closeButton": "VWh0dG_closeButton",
358
+ "roundsBarColOff": "VWh0dG_roundsBarColOff",
359
+ "triggerPopValueStack": "VWh0dG_triggerPopValueStack",
360
+ "triggerPopBar": "VWh0dG_triggerPopBar",
361
+ "heatmapYearWeekdays": "VWh0dG_heatmapYearWeekdays",
362
+ "popDotSub": "VWh0dG_popDotSub",
363
+ "switchOn": "VWh0dG_switchOn",
364
+ "balanceDetailRow": "VWh0dG_balanceDetailRow",
365
+ "tokenModelBar": "VWh0dG_tokenModelBar",
366
+ "triggerMain": "VWh0dG_triggerMain",
367
+ "popModelRow": "VWh0dG_popModelRow",
368
+ "triggerPopUpdated": "VWh0dG_triggerPopUpdated",
369
+ "feeChipAlert": "VWh0dG_feeChipAlert",
370
+ "healthDot": "VWh0dG_healthDot",
371
+ "plgName": "VWh0dG_plgName",
372
+ "triggerSpark": "VWh0dG_triggerSpark",
373
+ "siteKindUnknown": "VWh0dG_siteKindUnknown",
374
+ "subscriptionFillWarn": "VWh0dG_subscriptionFillWarn",
375
+ "plgIcon": "VWh0dG_plgIcon",
376
+ "budget": "VWh0dG_budget",
377
+ "subscriptionTrack": "VWh0dG_subscriptionTrack",
378
+ "feeSuffix": "VWh0dG_feeSuffix",
379
+ "chartEmpty": "VWh0dG_chartEmpty",
380
+ "ubCard": "VWh0dG_ubCard",
381
+ "floatSubName": "VWh0dG_floatSubName",
382
+ "chartAxisLabel": "VWh0dG_chartAxisLabel",
383
+ "roundsAxis": "VWh0dG_roundsAxis",
384
+ "planTag": "VWh0dG_planTag",
385
+ "triggerSparkBar": "VWh0dG_triggerSparkBar",
386
+ "flatTag": "VWh0dG_flatTag",
387
+ "metricGrid": "VWh0dG_metricGrid",
388
+ "chartLine": "VWh0dG_chartLine",
389
+ "affix": "VWh0dG_affix",
390
+ "metricLabel": "VWh0dG_metricLabel",
391
+ "modelDot": "VWh0dG_modelDot",
392
+ "shareSegAssistant": "VWh0dG_shareSegAssistant",
393
+ "heroSideLabel": "VWh0dG_heroSideLabel",
394
+ "ubCardSub": "VWh0dG_ubCardSub",
395
+ "peakCard": "VWh0dG_peakCard",
396
+ "heroGaugeArc": "VWh0dG_heroGaugeArc",
397
+ "rowlineMuted": "VWh0dG_rowlineMuted",
398
+ "heatmapLegend": "VWh0dG_heatmapLegend",
399
+ "peakCount": "VWh0dG_peakCount",
400
+ "siteRowTitle": "VWh0dG_siteRowTitle",
401
+ "dashboardModal": "VWh0dG_dashboardModal",
402
+ "triggerMetric": "VWh0dG_triggerMetric",
403
+ "modalFooter": "VWh0dG_modalFooter",
404
+ "budgetHead": "VWh0dG_budgetHead",
405
+ "ctlGroup": "VWh0dG_ctlGroup",
310
406
  "triggerPopFootStatus": "VWh0dG_triggerPopFootStatus",
311
- "triggerAmount": "VWh0dG_triggerAmount",
312
- "triggerPopTitleMonth": "VWh0dG_triggerPopTitleMonth",
313
- "liveQuotaWarn": "VWh0dG_liveQuotaWarn",
314
- "currencyButton": "VWh0dG_currencyButton",
315
- "kpiTile": "VWh0dG_kpiTile",
316
- "tokenModelPartIn": "VWh0dG_tokenModelPartIn",
317
- "tabButtonActive": "VWh0dG_tabButtonActive",
318
- "modelName": "VWh0dG_modelName",
319
- "bandPriceOff": "VWh0dG_bandPriceOff",
320
- "heroSideValue": "VWh0dG_heroSideValue",
321
- "healthIdle": "VWh0dG_healthIdle",
322
- "heroCurrency": "VWh0dG_heroCurrency",
323
- "switchKnob": "VWh0dG_switchKnob",
324
- "heroGaugePct": "VWh0dG_heroGaugePct",
325
- "heroValue": "VWh0dG_heroValue",
326
- "subscriptionPlan": "VWh0dG_subscriptionPlan",
407
+ "panelHead": "VWh0dG_panelHead",
408
+ "ubTagError": "VWh0dG_ubTagError",
409
+ "heatmapCellEmpty": "VWh0dG_heatmapCellEmpty",
410
+ "popModelLabel": "VWh0dG_popModelLabel",
411
+ "balanceDaysBadge": "VWh0dG_balanceDaysBadge",
412
+ "metricValueSuccess": "VWh0dG_metricValueSuccess",
413
+ "subscriptionMeta": "VWh0dG_subscriptionMeta",
414
+ "pricingChevron": "VWh0dG_pricingChevron",
415
+ "pluginInfo": "VWh0dG_pluginInfo",
416
+ "tabNav": "VWh0dG_tabNav",
417
+ "reconcileNotice": "VWh0dG_reconcileNotice",
418
+ "exportLabel": "VWh0dG_exportLabel",
419
+ "budgetInputWrap": "VWh0dG_budgetInputWrap",
327
420
  "exportBar": "VWh0dG_exportBar",
328
- "triggerPopHead": "VWh0dG_triggerPopHead",
329
- "triggerBody": "VWh0dG_triggerBody",
330
- "triggerPopValue": "VWh0dG_triggerPopValue",
421
+ "ubAlert": "VWh0dG_ubAlert",
422
+ "reconcileText": "VWh0dG_reconcileText",
423
+ "setCardTitle": "VWh0dG_setCardTitle",
424
+ "billing-trigger": "VWh0dG_billing-trigger",
425
+ "popDotDirect": "VWh0dG_popDotDirect",
426
+ "metricValue": "VWh0dG_metricValue",
427
+ "heroSide": "VWh0dG_heroSide",
428
+ "shareSegOff": "VWh0dG_shareSegOff",
429
+ "healthBadge": "VWh0dG_healthBadge",
430
+ "floatTargets": "VWh0dG_floatTargets",
431
+ "kpiValue": "VWh0dG_kpiValue",
432
+ "pricingToggle": "VWh0dG_pricingToggle",
433
+ "pluginInfoValue": "VWh0dG_pluginInfoValue",
434
+ "rangeButton": "VWh0dG_rangeButton",
435
+ "peakDot": "VWh0dG_peakDot",
331
436
  "chartBar": "VWh0dG_chartBar",
332
- "bandTagOff": "VWh0dG_bandTagOff",
333
- "chartGrid": "VWh0dG_chartGrid",
334
- "balanceDaysBadge": "VWh0dG_balanceDaysBadge",
335
- "liveTierPeak": "VWh0dG_liveTierPeak",
336
- "heatmapYearWeekday": "VWh0dG_heatmapYearWeekday",
337
- "kpiGrid": "VWh0dG_kpiGrid",
437
+ "kpiGreen": "VWh0dG_kpiGreen",
438
+ "budgetFillWarn": "VWh0dG_budgetFillWarn",
439
+ "dashboardIn": "VWh0dG_dashboardIn",
440
+ "trendPanel": "VWh0dG_trendPanel",
441
+ "emptyRow": "VWh0dG_emptyRow",
442
+ "feeChipOff": "VWh0dG_feeChipOff",
443
+ "peakAlertField": "VWh0dG_peakAlertField",
444
+ "switch": "VWh0dG_switch",
445
+ "chartCrosshair": "VWh0dG_chartCrosshair",
446
+ "peakCardCenter": "VWh0dG_peakCardCenter",
447
+ "balanceDetailPop": "VWh0dG_balanceDetailPop",
448
+ "numCol": "VWh0dG_numCol",
449
+ "deltaUp": "VWh0dG_deltaUp",
450
+ "heroCurrency": "VWh0dG_heroCurrency",
451
+ "inp": "VWh0dG_inp",
452
+ "heatmapRangeButton": "VWh0dG_heatmapRangeButton",
453
+ "balanceDaysBadgeLow": "VWh0dG_balanceDaysBadgeLow",
454
+ "chartTooltipRow": "VWh0dG_chartTooltipRow",
455
+ "bandPrice": "VWh0dG_bandPrice",
456
+ "triggerSub": "VWh0dG_triggerSub",
457
+ "triggerPopFoot": "VWh0dG_triggerPopFoot",
458
+ "heroBudgetFill": "VWh0dG_heroBudgetFill",
459
+ "budgetLabel": "VWh0dG_budgetLabel",
460
+ "bucketSep": "VWh0dG_bucketSep",
461
+ "budgetUnit": "VWh0dG_budgetUnit",
462
+ "reconcileDismiss": "VWh0dG_reconcileDismiss",
463
+ "subscriptionName": "VWh0dG_subscriptionName",
338
464
  "modelCell": "VWh0dG_modelCell",
339
- "roundsBar": "VWh0dG_roundsBar",
340
- "heatmapCellEmpty": "VWh0dG_heatmapCellEmpty",
341
- "heroLabel": "VWh0dG_heroLabel",
342
- "heatmapRangeButtonActive": "VWh0dG_heatmapRangeButtonActive",
343
- "tokenModelParts": "VWh0dG_tokenModelParts",
344
- "subscriptionReset": "VWh0dG_subscriptionReset",
345
- "budgetFill": "VWh0dG_budgetFill",
346
- "floatTarget": "VWh0dG_floatTarget",
465
+ "chartWrap": "VWh0dG_chartWrap",
466
+ "shareDot": "VWh0dG_shareDot",
467
+ "peakTag": "VWh0dG_peakTag",
468
+ "chartLegendBar": "VWh0dG_chartLegendBar",
347
469
  "shareSegUser": "VWh0dG_shareSegUser",
348
- "peakAlertCenter": "VWh0dG_peakAlertCenter",
349
- "pluginInfoLink": "VWh0dG_pluginInfoLink",
350
- "heatmapYear": "VWh0dG_heatmapYear",
351
- "bandPrice": "VWh0dG_bandPrice",
470
+ "ubChipOff": "VWh0dG_ubChipOff",
471
+ "heroMeta": "VWh0dG_heroMeta",
472
+ "bucketThird": "VWh0dG_bucketThird",
473
+ "triggerPopFootNotes": "VWh0dG_triggerPopFootNotes",
474
+ "ubTablewrap": "VWh0dG_ubTablewrap",
475
+ "modelProvider": "VWh0dG_modelProvider",
476
+ "chartStack": "VWh0dG_chartStack",
477
+ "ubChipPeak": "VWh0dG_ubChipPeak",
478
+ "triggerPopAlert": "VWh0dG_triggerPopAlert",
479
+ "roundsBar": "VWh0dG_roundsBar",
480
+ "ubNotesDesc": "VWh0dG_ubNotesDesc",
481
+ "balanceCell": "VWh0dG_balanceCell",
482
+ "triggerPopFootStatusLow": "VWh0dG_triggerPopFootStatusLow",
483
+ "roundsBarWrap": "VWh0dG_roundsBarWrap",
484
+ "chartGrid": "VWh0dG_chartGrid",
485
+ "feeSep": "VWh0dG_feeSep",
352
486
  "triggerPopSwitchCount": "VWh0dG_triggerPopSwitchCount",
353
- "headTitleRow": "VWh0dG_headTitleRow",
354
- "healthDot": "VWh0dG_healthDot",
355
- "tabPanel": "VWh0dG_tabPanel",
356
- "kpiGreen": "VWh0dG_kpiGreen",
357
- "triggerPopFootTitle": "VWh0dG_triggerPopFootTitle",
358
- "bandTag": "VWh0dG_bandTag",
359
- "tokenModelPartOut": "VWh0dG_tokenModelPartOut",
360
- "pluginInfoLabel": "VWh0dG_pluginInfoLabel",
361
- "balanceDetailRow": "VWh0dG_balanceDetailRow",
362
- "pricingTable": "VWh0dG_pricingTable",
363
- "siteKindTag": "VWh0dG_siteKindTag",
364
- "subscriptionHead": "VWh0dG_subscriptionHead",
365
- "delta": "VWh0dG_delta",
366
- "heatmapYearMonth": "VWh0dG_heatmapYearMonth",
367
- "dashboardSubtitle": "VWh0dG_dashboardSubtitle",
487
+ "subscriptionWindowLabel": "VWh0dG_subscriptionWindowLabel",
488
+ "plgTitle": "VWh0dG_plgTitle",
489
+ "subscriptionStatus": "VWh0dG_subscriptionStatus",
368
490
  "triggerPopSwitcher": "VWh0dG_triggerPopSwitcher",
369
- "budgetTrack": "VWh0dG_budgetTrack",
370
- "heatmapRangeSwitch": "VWh0dG_heatmapRangeSwitch",
371
- "heroGaugePctOver": "VWh0dG_heroGaugePctOver",
372
- "healthBadgeOk": "VWh0dG_healthBadgeOk",
373
- "modelTableScroll": "VWh0dG_modelTableScroll",
374
- "triggerPopBadge": "VWh0dG_triggerPopBadge",
375
- "triggerPopFootStatusLow": "VWh0dG_triggerPopFootStatusLow",
376
- "tabButton": "VWh0dG_tabButton",
377
- "chartLegend": "VWh0dG_chartLegend",
378
- "chartDot": "VWh0dG_chartDot",
379
- "heatmapYearBody": "VWh0dG_heatmapYearBody",
380
- "triggerPopEmpty": "VWh0dG_triggerPopEmpty",
381
- "peakAlertClose": "VWh0dG_peakAlertClose",
382
- "chartLegendBar": "VWh0dG_chartLegendBar",
383
- "rounds": "VWh0dG_rounds",
491
+ "metricValuePrimary": "VWh0dG_metricValuePrimary",
492
+ "heroBudget": "VWh0dG_heroBudget",
493
+ "ubRate": "VWh0dG_ubRate",
494
+ "ubNotesItem": "VWh0dG_ubNotesItem",
384
495
  "floatTargetLabel": "VWh0dG_floatTargetLabel",
385
- "peakAlertSelect": "VWh0dG_peakAlertSelect",
386
- "tokenModelShareRow": "VWh0dG_tokenModelShareRow",
387
- "peakAlertText": "VWh0dG_peakAlertText",
388
- "tabPanelIn": "VWh0dG_tabPanelIn",
389
- "reconcileDismiss": "VWh0dG_reconcileDismiss",
390
- "modelDot": "VWh0dG_modelDot",
391
- "numCol": "VWh0dG_numCol",
392
- "healthBadge": "VWh0dG_healthBadge",
393
- "providerGroupList": "VWh0dG_providerGroupList",
394
- "providerGroupBadge": "VWh0dG_providerGroupBadge",
395
- "rateBadgeLive": "VWh0dG_rateBadgeLive",
396
- "subscriptionFillWarn": "VWh0dG_subscriptionFillWarn",
397
- "triggerPop": "VWh0dG_triggerPop",
398
- "modelTable": "VWh0dG_modelTable",
496
+ "pluginInfoRow": "VWh0dG_pluginInfoRow",
497
+ "dashboardTitle": "VWh0dG_dashboardTitle",
498
+ "heroGaugePct": "VWh0dG_heroGaugePct",
499
+ "chartLegendLine": "VWh0dG_chartLegendLine",
500
+ "siteRowMeta": "VWh0dG_siteRowMeta",
501
+ "closeButton": "VWh0dG_closeButton",
502
+ "balanceDays": "VWh0dG_balanceDays",
503
+ "floatSubHead": "VWh0dG_floatSubHead",
399
504
  "budgetInput": "VWh0dG_budgetInput",
400
- "subscriptionPct": "VWh0dG_subscriptionPct",
401
- "chartWrap": "VWh0dG_chartWrap",
402
- "settingsTitle": "VWh0dG_settingsTitle",
403
- "subscriptionMeta": "VWh0dG_subscriptionMeta",
505
+ "triggerPrimary": "VWh0dG_triggerPrimary",
506
+ "triggerPopFootTitle": "VWh0dG_triggerPopFootTitle",
404
507
  "subscriptionCard": "VWh0dG_subscriptionCard",
405
- "bucketCost": "VWh0dG_bucketCost",
406
- "triggerPopMetricHighlight": "VWh0dG_triggerPopMetricHighlight"
508
+ "peakAlertNum": "VWh0dG_peakAlertNum",
509
+ "ctlRowStretch": "VWh0dG_ctlRowStretch",
510
+ "triggerPopRow": "VWh0dG_triggerPopRow",
511
+ "healthBadgeBad": "VWh0dG_healthBadgeBad",
512
+ "ubNotesTerm": "VWh0dG_ubNotesTerm",
513
+ "tokenPanel": "VWh0dG_tokenPanel",
514
+ "plgVal": "VWh0dG_plgVal",
515
+ "balanceDetailClose": "VWh0dG_balanceDetailClose",
516
+ "modelName": "VWh0dG_modelName",
517
+ "triggerPopBadge": "VWh0dG_triggerPopBadge",
518
+ "floatSubPlan": "VWh0dG_floatSubPlan",
519
+ "rdoDot": "VWh0dG_rdoDot",
520
+ "shareTrack": "VWh0dG_shareTrack",
521
+ "balanceDetailGrid": "VWh0dG_balanceDetailGrid",
522
+ "triggerPopFootName": "VWh0dG_triggerPopFootName"
407
523
  };
408
524
  //#endregion
409
525
  //#region src/client/plan-knowledge.ts
@@ -549,16 +665,6 @@ window.__ModuleLoader__.load({
549
665
  output: 10
550
666
  }
551
667
  ];
552
- //#endregion
553
- //#region src/client/pricing.ts
554
- /**
555
- * USD → CNY rate for display. Source: China Foreign Exchange Trade System
556
- * mid-rate 6.7878 on 2026-08-14; rounded to 6.79. Only applies to overseas
557
- * USD-priced models — domestic models never pass through this rate.
558
- * The node half may refresh this at boot via `/api/billing/pricing`; until a
559
- * live rate arrives the built-in value stays in force.
560
- */
561
- const USD_TO_CNY = 6.79;
562
668
  /** 运行时实时覆盖:undefined = 用内置目录与内置汇率(默认值降级)。 */
563
669
  let liveRate;
564
670
  let livePrices;
@@ -570,7 +676,7 @@ window.__ModuleLoader__.load({
570
676
  * @param pricing - the `/api/billing/pricing` response.
571
677
  */
572
678
  function applyLivePricing(pricing) {
573
- liveRate = pricing.rate;
679
+ liveRate = typeof pricing.rate === "number" && Number.isFinite(pricing.rate) && pricing.rate > 0 ? pricing.rate : void 0;
574
680
  livePrices = pricing.prices;
575
681
  liveExtraModels = pricing.extraModels;
576
682
  }
@@ -964,6 +1070,30 @@ window.__ModuleLoader__.load({
964
1070
  output: 8.4
965
1071
  }
966
1072
  },
1073
+ {
1074
+ key: "minimax-m2.7",
1075
+ name: "MiniMax-M2.7",
1076
+ provider: "MiniMax",
1077
+ colorVar: "dsw-static-amber-400",
1078
+ price: {
1079
+ currency: "CNY",
1080
+ input: 2.1,
1081
+ cacheHit: .42,
1082
+ output: 8.4
1083
+ }
1084
+ },
1085
+ {
1086
+ key: "minimax-m2.7-highspeed",
1087
+ name: "MiniMax-M2.7-highspeed",
1088
+ provider: "MiniMax",
1089
+ colorVar: "dsw-static-amber-500",
1090
+ price: {
1091
+ currency: "CNY",
1092
+ input: 4.2,
1093
+ cacheHit: .42,
1094
+ output: 16.8
1095
+ }
1096
+ },
967
1097
  {
968
1098
  key: "ernie",
969
1099
  name: "ERNIE-5.1",
@@ -1214,7 +1344,16 @@ window.__ModuleLoader__.load({
1214
1344
  "step-3.7-flash": "step",
1215
1345
  "seed-2.0-mini": "doubao-mini",
1216
1346
  "k3": "kimi-k3",
1217
- "kimi-k3": "kimi-k3"
1347
+ "kimi-k3": "kimi-k3",
1348
+ "minimax-m1": "minimax",
1349
+ "minimax-m2": "minimax",
1350
+ "minimax-m3": "minimax",
1351
+ "minimax-m2.7": "minimax-m2.7",
1352
+ "minimax-m2.7-highspeed": "minimax-m2.7-highspeed",
1353
+ "minimax-m2.7-high-speed": "minimax-m2.7-highspeed",
1354
+ "minimax-m2-7": "minimax-m2.7",
1355
+ "minimax-m2-7-highspeed": "minimax-m2.7-highspeed",
1356
+ "minimax-m2-7-high-speed": "minimax-m2.7-highspeed"
1218
1357
  };
1219
1358
  /**
1220
1359
  * 模型 id 归一化:小写、去括号附注(如 `gpt5.6 luna(go)` 只看主体)、再去所有
@@ -1327,11 +1466,9 @@ window.__ModuleLoader__.load({
1327
1466
  return MODEL_CATALOG.find((item) => item.key === aliasKey);
1328
1467
  })() !== void 0) continue;
1329
1468
  if (known.has(rawKey)) continue;
1330
- const extra = (liveExtraModels ?? []).find((item) => item.key === rawKey);
1331
- const fallbackLive = extra === void 0 ? livePriceOf(rawKey) : void 0;
1469
+ const fallbackLive = livePriceOf(rawKey);
1332
1470
  let entry;
1333
- if (extra !== void 0) entry = { ...extraEntryOf(extra) };
1334
- else if (fallbackLive !== void 0) entry = {
1471
+ if (fallbackLive !== void 0) entry = {
1335
1472
  key: rawKey,
1336
1473
  name: model.name ?? model.id,
1337
1474
  provider: model.provider,
@@ -1400,9 +1537,11 @@ window.__ModuleLoader__.load({
1400
1537
  const off = entry.price.offPeak === void 0 ? peak : priceBandCost(entry.price.offPeak, buckets, entry.price.currency);
1401
1538
  return peak * peakShare + off * (1 - peakShare);
1402
1539
  }
1403
- /** 人民币 → 美元(显示换算用):1 USD = {@link USD_TO_CNY} CNY。 */
1540
+ /** 人民币 → 美元(显示换算用):用当前生效汇率(实时优先,缺失回退内置),
1541
+ * 与计价链路的 `currentRate()` 同口径,避免实时汇率生效时 USD 显示与计价不一致。 */
1404
1542
  function cnyToUsd(cny) {
1405
- return cny / USD_TO_CNY;
1543
+ const rate = currentRate();
1544
+ return rate > 0 ? cny / rate : cny;
1406
1545
  }
1407
1546
  /**
1408
1547
  * Format an amount with adaptive precision and the given currency symbol.
@@ -2027,61 +2166,58 @@ window.__ModuleLoader__.load({
2027
2166
  //#endregion
2028
2167
  //#region src/client/PluginInfoCard.tsx
2029
2168
  /**
2030
- * PluginInfoCard: 「设置 → 插件信息」卡——展示头像/作者、GitHub 仓库、版本号、
2031
- * 许可证等插件元信息。版本号来自服务端 usage-stats 的 `pluginVersion`(读自
2032
- * 包 package.json),其余元信息静态来自 `plugin-info.ts`。无版本号时显示 em dash。
2169
+ * PluginInfoCard: 「设置 → 插件信息」卡——图标 + 插件名/版本 tag + 描述,下接
2170
+ * 元信息网格(作者 / 仓库 / npm / 许可证)。版本号来自服务端 usage-stats 的
2171
+ * `pluginVersion`(读自包 package.json),其余元信息静态来自 `plugin-info.ts`。
2172
+ * 无版本号时显示 em dash。
2033
2173
  */
2034
2174
  /** 信息卡 props:locale 函数 + 版本号(服务端下发,可为空)。 */
2035
2175
  function PluginInfoCard({ t, version }) {
2036
2176
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
2037
- className: UsageBilling_module_css_default.panel,
2177
+ className: UsageBilling_module_css_default.setCard,
2038
2178
  "data-testid": "billing-plugin-info",
2039
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
2040
- className: UsageBilling_module_css_default.panelHead,
2041
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
2042
- className: UsageBilling_module_css_default.panelTitle,
2043
- children: t("billing.pluginInfo")
2044
- })
2045
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2046
- className: UsageBilling_module_css_default.pluginInfo,
2047
- children: [
2048
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2049
- className: UsageBilling_module_css_default.pluginInfoRow,
2050
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2051
- className: UsageBilling_module_css_default.pluginInfoLabel,
2052
- children: t("billing.pluginName")
2053
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2054
- className: UsageBilling_module_css_default.pluginInfoValue,
2179
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2180
+ className: UsageBilling_module_css_default.plgHead,
2181
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2182
+ className: UsageBilling_module_css_default.plgIcon,
2183
+ "aria-hidden": "true",
2184
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
2185
+ width: "20",
2186
+ height: "20",
2187
+ viewBox: "0 0 24 24",
2188
+ fill: "none",
2189
+ stroke: "currentColor",
2190
+ strokeWidth: "2",
2191
+ strokeLinecap: "round",
2192
+ strokeLinejoin: "round",
2193
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M10 3a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v2a2 2 0 0 0 4 0V4a1 1 0 0 1 1-1h1a1 1 0 0 1 1 1v1a2 2 0 0 0 4 0 1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-1a2 2 0 0 0 0 4h1a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-1a2 2 0 0 0-4 0v1a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1v-2a2 2 0 0 0-4 0v1a1 1 0 0 1-1 1h-1a1 1 0 0 1-1-1v-1a2 2 0 0 0-4 0 1 1 0 0 1-1 1H3a1 1 0 0 1-1-1v-2a1 1 0 0 1 1-1h1a2 2 0 0 0 0-4H3a1 1 0 0 1-1-1v-2a1 1 0 0 1 1-1h1a2 2 0 0 0 4 0z" })
2194
+ })
2195
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2196
+ className: UsageBilling_module_css_default.plgTitle,
2197
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2198
+ className: UsageBilling_module_css_default.plgNameRow,
2199
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
2200
+ className: UsageBilling_module_css_default.plgName,
2055
2201
  children: PLUGIN_NAME
2056
- })]
2057
- }),
2058
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2059
- className: UsageBilling_module_css_default.pluginInfoRow,
2060
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2061
- className: UsageBilling_module_css_default.pluginInfoLabel,
2062
- children: t("billing.pluginDescription")
2063
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2064
- className: UsageBilling_module_css_default.pluginInfoValue,
2065
- children: PLUGIN_DESCRIPTION
2066
- })]
2067
- }),
2068
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2069
- className: UsageBilling_module_css_default.pluginInfoRow,
2070
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2071
- className: UsageBilling_module_css_default.pluginInfoLabel,
2072
- children: t("billing.pluginVersion")
2073
2202
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2074
- className: UsageBilling_module_css_default.pluginInfoValue,
2203
+ className: UsageBilling_module_css_default.plgTag,
2075
2204
  children: version === void 0 ? "—" : `v${version}`
2076
2205
  })]
2077
- }),
2206
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
2207
+ className: UsageBilling_module_css_default.plgDesc,
2208
+ children: PLUGIN_DESCRIPTION
2209
+ })]
2210
+ })]
2211
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2212
+ className: UsageBilling_module_css_default.plgGrid,
2213
+ children: [
2078
2214
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2079
- className: UsageBilling_module_css_default.pluginInfoRow,
2215
+ className: UsageBilling_module_css_default.plgItem,
2080
2216
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2081
- className: UsageBilling_module_css_default.pluginInfoLabel,
2217
+ className: UsageBilling_module_css_default.plgLabel,
2082
2218
  children: t("billing.pluginAuthor")
2083
2219
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("a", {
2084
- className: UsageBilling_module_css_default.pluginInfoLink,
2220
+ className: UsageBilling_module_css_default.plgLink,
2085
2221
  href: `https://github.com/${PLUGIN_AUTHOR_HANDLE}`,
2086
2222
  target: "_blank",
2087
2223
  rel: "noreferrer",
@@ -2094,25 +2230,25 @@ window.__ModuleLoader__.load({
2094
2230
  })]
2095
2231
  }),
2096
2232
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2097
- className: UsageBilling_module_css_default.pluginInfoRow,
2233
+ className: UsageBilling_module_css_default.plgItem,
2098
2234
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2099
- className: UsageBilling_module_css_default.pluginInfoLabel,
2235
+ className: UsageBilling_module_css_default.plgLabel,
2100
2236
  children: t("billing.pluginRepository")
2101
2237
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
2102
- className: UsageBilling_module_css_default.pluginInfoLink,
2238
+ className: UsageBilling_module_css_default.plgLink,
2103
2239
  href: PLUGIN_REPOSITORY,
2104
2240
  target: "_blank",
2105
2241
  rel: "noreferrer",
2106
- children: PLUGIN_REPOSITORY
2242
+ children: "GitHub"
2107
2243
  })]
2108
2244
  }),
2109
2245
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2110
- className: UsageBilling_module_css_default.pluginInfoRow,
2246
+ className: UsageBilling_module_css_default.plgItem,
2111
2247
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2112
- className: UsageBilling_module_css_default.pluginInfoLabel,
2248
+ className: UsageBilling_module_css_default.plgLabel,
2113
2249
  children: t("billing.pluginNpm")
2114
2250
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
2115
- className: UsageBilling_module_css_default.pluginInfoLink,
2251
+ className: UsageBilling_module_css_default.plgLink,
2116
2252
  href: PLUGIN_NPM_URL,
2117
2253
  target: "_blank",
2118
2254
  rel: "noreferrer",
@@ -2120,12 +2256,12 @@ window.__ModuleLoader__.load({
2120
2256
  })]
2121
2257
  }),
2122
2258
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2123
- className: UsageBilling_module_css_default.pluginInfoRow,
2259
+ className: UsageBilling_module_css_default.plgItem,
2124
2260
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2125
- className: UsageBilling_module_css_default.pluginInfoLabel,
2261
+ className: UsageBilling_module_css_default.plgLabel,
2126
2262
  children: t("billing.pluginLicense")
2127
2263
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2128
- className: UsageBilling_module_css_default.pluginInfoValue,
2264
+ className: UsageBilling_module_css_default.plgVal,
2129
2265
  children: "MIT"
2130
2266
  })]
2131
2267
  })
@@ -2176,7 +2312,7 @@ window.__ModuleLoader__.load({
2176
2312
  * @param props.onTrendDays - 切换趋势窗口。
2177
2313
  */
2178
2314
  function TokenPanel(props) {
2179
- const { stats, currency: _currency, trendDays, onTrendDays, t } = props;
2315
+ const { stats, trendDays, onTrendDays, t } = props;
2180
2316
  const { byDay, byModel, total } = stats;
2181
2317
  const days = (0, react.useMemo)(() => {
2182
2318
  const out = [];
@@ -2277,7 +2413,7 @@ window.__ModuleLoader__.load({
2277
2413
  a.href = URL.createObjectURL(blob);
2278
2414
  a.download = `token-daily-${localStamp()}.csv`;
2279
2415
  a.click();
2280
- URL.revokeObjectURL(a.href);
2416
+ setTimeout(() => URL.revokeObjectURL(a.href), 0);
2281
2417
  };
2282
2418
  const exportTokenJson = () => {
2283
2419
  const blob = new Blob([JSON.stringify({
@@ -2289,7 +2425,7 @@ window.__ModuleLoader__.load({
2289
2425
  a.href = URL.createObjectURL(blob);
2290
2426
  a.download = `token-${localStamp()}.json`;
2291
2427
  a.click();
2292
- URL.revokeObjectURL(a.href);
2428
+ setTimeout(() => URL.revokeObjectURL(a.href), 0);
2293
2429
  };
2294
2430
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2295
2431
  className: UsageBilling_module_css_default.tokenPanel,
@@ -3047,12 +3183,12 @@ window.__ModuleLoader__.load({
3047
3183
  * @returns 异常标记数组(保持输入顺序)。
3048
3184
  */
3049
3185
  function flagAnomalies(rounds, options) {
3050
- const opts = {
3051
- ...DEFAULTS,
3052
- ...options
3053
- };
3186
+ const window = options?.window ?? DEFAULTS.window;
3187
+ const threshold = options?.threshold ?? DEFAULTS.threshold;
3188
+ const reasonFactor = options?.reasonFactor ?? DEFAULTS.reasonFactor;
3189
+ const reasonHitDropPp = options?.reasonHitDropPp ?? DEFAULTS.reasonHitDropPp;
3054
3190
  const flags = [];
3055
- if (opts.window <= 0 || opts.threshold <= 0) return flags;
3191
+ if (window <= 0 || threshold <= 0) return flags;
3056
3192
  const baselineCosts = [];
3057
3193
  const baselineOutputs = [];
3058
3194
  const baselineInputs = [];
@@ -3064,13 +3200,13 @@ window.__ModuleLoader__.load({
3064
3200
  const hit = cacheHitRate(round);
3065
3201
  const baselineCost = mean(baselineCosts);
3066
3202
  const reasons = [];
3067
- if (baselineCost !== null && baselineCost > 0 && round.cost > baselineCost * opts.threshold) {
3203
+ if (baselineCost !== null && baselineCost > 0 && round.cost > baselineCost * threshold) {
3068
3204
  const baselineOutput = mean(baselineOutputs);
3069
3205
  const baselineInput = mean(baselineInputs);
3070
3206
  const baselineHit = mean(baselineHits);
3071
- if (baselineOutput !== null && baselineOutput > 0 && output > baselineOutput * opts.reasonFactor) reasons.push("output-growth");
3072
- if (baselineInput !== null && baselineInput > 0 && input > baselineInput * opts.reasonFactor) reasons.push("context-bloat");
3073
- if (baselineHit !== null && hit !== null && hit < baselineHit - opts.reasonHitDropPp) reasons.push("cache-hit-drop");
3207
+ if (baselineOutput !== null && baselineOutput > 0 && output > baselineOutput * reasonFactor) reasons.push("output-growth");
3208
+ if (baselineInput !== null && baselineInput > 0 && input > baselineInput * reasonFactor) reasons.push("context-bloat");
3209
+ if (baselineHit !== null && hit !== null && hit < baselineHit - reasonHitDropPp) reasons.push("cache-hit-drop");
3074
3210
  flags.push({
3075
3211
  sessionId: round.sessionId,
3076
3212
  turn: round.turn,
@@ -3082,18 +3218,23 @@ window.__ModuleLoader__.load({
3082
3218
  baselineOutputs.push(output);
3083
3219
  baselineInputs.push(input);
3084
3220
  if (hit !== null) baselineHits.push(hit);
3085
- while (baselineCosts.length > opts.window) baselineCosts.shift();
3086
- while (baselineOutputs.length > opts.window) baselineOutputs.shift();
3087
- while (baselineInputs.length > opts.window) baselineInputs.shift();
3088
- while (baselineHits.length > opts.window) baselineHits.shift();
3221
+ while (baselineCosts.length > window) baselineCosts.shift();
3222
+ while (baselineOutputs.length > window) baselineOutputs.shift();
3223
+ while (baselineInputs.length > window) baselineInputs.shift();
3224
+ while (baselineHits.length > window) baselineHits.shift();
3089
3225
  }
3090
3226
  return flags;
3091
3227
  }
3092
3228
  //#endregion
3093
3229
  //#region src/client/export.ts
3094
- /** CSV 单元格转义:含逗号 / 引号 / 换行的值加双引号并内层引号双写。 */
3230
+ /** CSV 单元格转义:含逗号 / 引号 / 换行 / 回车的值加双引号并内层引号双写。 */
3095
3231
  function csvCell(value) {
3096
- return /[",\n]/.test(value) ? `"${value.replace(/"/g, "\"\"")}"` : value;
3232
+ return /[",\r\n]/.test(value) ? `"${value.replace(/"/g, "\"\"")}"` : value;
3233
+ }
3234
+ /** 防 CSV 公式注入:以 `=` / `+` / `-` / `@` / tab / 回车开头的值前置单引号,
3235
+ * 避免在 Excel/WPS 打开时被当作公式执行。用户/模型可控的会话标题会进 CSV。 */
3236
+ function csvSafe(value) {
3237
+ return /^[=+\-@\t\r]/.test(value) ? `'${value}` : value;
3097
3238
  }
3098
3239
  /** 金额保留两位小数字符串(导出对账用,不做千分位)。 */
3099
3240
  function money(value) {
@@ -3121,7 +3262,7 @@ window.__ModuleLoader__.load({
3121
3262
  const site = key.startsWith("site:") ? key.slice(5) : key.startsWith("direct:") ? key.slice(7) : "unknown";
3122
3263
  const kind = key.startsWith("site:") ? "site" : key.startsWith("direct:") ? "direct" : "unknown";
3123
3264
  return [
3124
- csvCell(site),
3265
+ csvCell(csvSafe(site)),
3125
3266
  kind,
3126
3267
  usage.calls,
3127
3268
  money(usage.cost)
@@ -3136,9 +3277,9 @@ window.__ModuleLoader__.load({
3136
3277
  /** 按会话 CSV:会话 id,标题,项目,调用,费用(元),最后活跃(ISO)。 */
3137
3278
  function sessionRowsCsv(rows) {
3138
3279
  return ["session_id,title,project,calls,cost_cny,last_active", ...rows.map((row) => [
3139
- csvCell(row.id),
3140
- csvCell(row.title ?? ""),
3141
- csvCell(projectOf(row.cwd)),
3280
+ csvCell(csvSafe(row.id)),
3281
+ csvCell(csvSafe(row.title ?? "")),
3282
+ csvCell(csvSafe(projectOf(row.cwd))),
3142
3283
  row.calls,
3143
3284
  money(row.cost),
3144
3285
  row.lastActive > 0 ? new Date(row.lastActive).toISOString() : ""
@@ -3158,7 +3299,7 @@ window.__ModuleLoader__.load({
3158
3299
  anchor.href = url;
3159
3300
  anchor.download = filename;
3160
3301
  anchor.click();
3161
- URL.revokeObjectURL(url);
3302
+ setTimeout(() => URL.revokeObjectURL(url), 0);
3162
3303
  }
3163
3304
  //#endregion
3164
3305
  //#region src/client/locales.ts
@@ -3188,7 +3329,10 @@ window.__ModuleLoader__.load({
3188
3329
  "billing.trendMetricTokens": "Token",
3189
3330
  "billing.trendEmpty": "暂无趋势数据",
3190
3331
  "billing.budget": "本月预算",
3332
+ "billing.budgetAmount": "预算金额",
3333
+ "billing.budgetSummary": "本月已用 {used} / {total};达到 80% 时提醒,达到 100% 时红色脉冲警示",
3191
3334
  "billing.sessions": "会话明细",
3335
+ "billing.sessionTitle": "标题",
3192
3336
  "billing.project": "项目",
3193
3337
  "billing.lastActive": "最后活跃",
3194
3338
  "billing.sessionOverflow": "仅显示花费前 {limit} 个,共 {total} 个会话",
@@ -3211,12 +3355,23 @@ window.__ModuleLoader__.load({
3211
3355
  "billing.band": "时段",
3212
3356
  "billing.openDashboard": "打开计费仪表盘",
3213
3357
  "billing.close": "关闭",
3358
+ "billing.footer": "每 30s 自动轮询 · 仅统计本机 dsh 会话",
3359
+ "billing.footerCredit": "dsh-ui-usage-billing {version} · MIT",
3214
3360
  "billing.lastUpdated": "数据更新于",
3215
3361
  "billing.noData": "暂无计费数据",
3216
3362
  "billing.todayRate": "今日汇率",
3217
3363
  "billing.rateLive": "实时",
3218
3364
  "billing.rateBuiltin": "内置",
3219
3365
  "billing.pricingTip": "DeepSeek 模型自北京时间 2026-08-23(周日)00:00 起:工作日高峰 9-12 / 14-18(×2),周末(周六 / 周日)全天低谷价;双价单元格按峰 / 谷展示,费用按调用时刻计。",
3366
+ "billing.pricingUnit": "单位:人民币 / 每百万 Token",
3367
+ "billing.pricingNotes": "计价说明",
3368
+ "billing.ubPeak": "峰",
3369
+ "billing.ubOff": "谷",
3370
+ "billing.peakBand": "峰谷分带",
3371
+ "billing.pricingSource": "数据来源",
3372
+ "billing.noteCache": "命中部分按缓存价计费,显著降低成本。",
3373
+ "billing.noteBand": "高峰与空闲时段单价不同,空闲约半价。",
3374
+ "billing.noteSource": "价格来自实时汇率 + 模型定价目录,未收录模型按 0 计并提示。",
3220
3375
  "billing.balance": "余额",
3221
3376
  "billing.balanceUnconfigured": "未配置",
3222
3377
  "billing.balanceUnauthorized": "密钥无效",
@@ -3243,8 +3398,10 @@ window.__ModuleLoader__.load({
3243
3398
  "billing.subscriptionNoApi": "该厂商暂未提供用量查询接口",
3244
3399
  "billing.floatWindow": "模型用量悬浮窗",
3245
3400
  "billing.floatModeCombined": "综合",
3246
- "billing.floatModeSubscription": "指定订阅卡",
3247
- "billing.floatWindowHint": "悬浮在左下角计费卡上的用量速览;综合=当前样式,指定订阅卡=每次展示一张订阅额度卡(可切换)。",
3401
+ "billing.floatModeSubscription": "订阅卡",
3402
+ "billing.floatMode": "展示模式",
3403
+ "billing.floatTargets": "订阅目标",
3404
+ "billing.floatWindowHint": "悬浮在左下角计费卡上的用量速览;综合=当前样式,订阅卡=每次展示一张订阅额度卡(可切换)。",
3248
3405
  "billing.floatNoTargets": "未指定订阅通道,请在设置中勾选要展示的订阅。",
3249
3406
  "billing.floatNoTargetsHint": "暂无可选的订阅通道。",
3250
3407
  "billing.floatPrev": "上一张订阅",
@@ -3257,12 +3414,17 @@ window.__ModuleLoader__.load({
3257
3414
  "billing.currencyUsd": "美元",
3258
3415
  "billing.heatmap": "用量热力图",
3259
3416
  "billing.rounds": "每轮费用",
3417
+ "billing.roundsHint": "最近 {count} 轮 · 柱顶为金额 · 底色为峰谷时段",
3260
3418
  "billing.anomaly": "成本突增",
3261
3419
  "billing.workspaces": "工作区统计",
3420
+ "billing.workspacesHint": "点击行下钻项目成本前 5 会话",
3262
3421
  "billing.plan": "套餐",
3263
3422
  "billing.remaining": "剩余",
3264
3423
  "billing.unknownModel": "未定价",
3265
3424
  "billing.model": "模型",
3425
+ "billing.thModel": "模型名称",
3426
+ "billing.thInputMiss": "输入缓存未命中",
3427
+ "billing.thInputHit": "输入缓存命中",
3266
3428
  "billing.currentRound": "当前",
3267
3429
  "billing.costAbbr": "费用",
3268
3430
  "billing.tabOverview": "概览",
@@ -3275,8 +3437,8 @@ window.__ModuleLoader__.load({
3275
3437
  "billing.settingsHint": "管理与计费相关的偏好",
3276
3438
  "billing.budgetHint": "设置月度上限,用于本月预计与超支分段提醒",
3277
3439
  "billing.peakAlertHint": "在切档前弹窗提醒,可选同步系统通知",
3278
- "billing.peakAlertDescPeak": "高峰价生效,不急的调用可稍候",
3279
- "billing.peakAlertDescOff": "价格减半省钱窗口已开启",
3440
+ "billing.peakAlertDescPeak": "即将进入高峰时段,价格将上调,请提前安排长任务",
3441
+ "billing.peakAlertDescOff": "即将进入平价时段,价格减半,适合运行大批量任务",
3280
3442
  "billing.export": "导出",
3281
3443
  "billing.exportCsvDay": "按日 CSV",
3282
3444
  "billing.exportCsvSession": "按会话 CSV",
@@ -3299,6 +3461,8 @@ window.__ModuleLoader__.load({
3299
3461
  "billing.peakAlertTitleOff": "即将进入平价",
3300
3462
  "billing.peakAlert": "峰谷切换提醒",
3301
3463
  "billing.peakAlertLeadMin": "提前量(分钟)",
3464
+ "billing.peakAlertPos": "位置",
3465
+ "billing.peakAlertMode": "提醒模式",
3302
3466
  "billing.peakAlertPosCorner": "右下角",
3303
3467
  "billing.peakAlertPosCenter": "屏幕居中",
3304
3468
  "billing.peakAlertModePeak": "仅进入峰时",
@@ -3364,10 +3528,10 @@ window.__ModuleLoader__.load({
3364
3528
  "billing.balanceDaysLong": "约可撑",
3365
3529
  "billing.balanceDaysUnit": "天",
3366
3530
  "billing.popTodayModel": "主力消耗模型余额",
3531
+ "billing.popTitle": "用量速览",
3367
3532
  "billing.popNoConsumption": "暂无消耗",
3368
3533
  "billing.popQuotaAlert": "额度提醒",
3369
3534
  "billing.popRiskNone": "余额与配额正常",
3370
- "billing.popTitle": "用量与预测",
3371
3535
  "billing.popDirectLead": "直联",
3372
3536
  "billing.popSubLead": "订阅",
3373
3537
  "billing.popBalanceNormal": "余额正常",
@@ -3416,7 +3580,10 @@ window.__ModuleLoader__.load({
3416
3580
  "billing.trendMetricTokens": "Tokens",
3417
3581
  "billing.trendEmpty": "No trend data yet",
3418
3582
  "billing.budget": "Monthly budget",
3583
+ "billing.budgetAmount": "Budget amount",
3584
+ "billing.budgetSummary": "Used {used} / {total} this month; warn at 80%, pulse red at 100%",
3419
3585
  "billing.sessions": "Sessions",
3586
+ "billing.sessionTitle": "Title",
3420
3587
  "billing.project": "Project",
3421
3588
  "billing.lastActive": "Last active",
3422
3589
  "billing.sessionOverflow": "Top {limit} of {total} sessions by cost",
@@ -3439,12 +3606,23 @@ window.__ModuleLoader__.load({
3439
3606
  "billing.band": "Band",
3440
3607
  "billing.openDashboard": "Open billing dashboard",
3441
3608
  "billing.close": "Close",
3609
+ "billing.footer": "Polls every 30s · local dsh sessions only",
3610
+ "billing.footerCredit": "dsh-ui-usage-billing {version} · MIT",
3442
3611
  "billing.lastUpdated": "Updated",
3443
3612
  "billing.noData": "No billing data yet",
3444
3613
  "billing.todayRate": "Today rate",
3445
3614
  "billing.rateLive": "Live",
3446
3615
  "billing.rateBuiltin": "Built-in",
3447
3616
  "billing.pricingTip": "DeepSeek models: from 2026-08-23 (Sun) 00:00 Beijing, weekdays peak 9-12 / 14-18 (×2), weekends (Sat/Sun) all-day off-peak; cells show peak/off-peak price, billed at call time.",
3617
+ "billing.pricingUnit": "Unit: CNY / per 1M tokens",
3618
+ "billing.pricingNotes": "Pricing notes",
3619
+ "billing.ubPeak": "Peak",
3620
+ "billing.ubOff": "Off",
3621
+ "billing.peakBand": "Peak/off-peak band",
3622
+ "billing.pricingSource": "Data source",
3623
+ "billing.noteCache": "Cache hits are billed at the cache rate, cutting cost.",
3624
+ "billing.noteBand": "Peak and off-peak prices differ; off-peak is roughly half price.",
3625
+ "billing.noteSource": "Prices come from the live rate + model catalog; unlisted models count as 0 and are flagged.",
3448
3626
  "billing.balance": "Balance",
3449
3627
  "billing.balanceUnconfigured": "Not set",
3450
3628
  "billing.balanceUnauthorized": "Bad key",
@@ -3471,7 +3649,9 @@ window.__ModuleLoader__.load({
3471
3649
  "billing.subscriptionNoApi": "Provider does not offer a usage API",
3472
3650
  "billing.floatWindow": "Model usage popover",
3473
3651
  "billing.floatModeCombined": "Combined",
3474
- "billing.floatModeSubscription": "Subscription cards",
3652
+ "billing.floatModeSubscription": "Subscription card",
3653
+ "billing.floatMode": "Display mode",
3654
+ "billing.floatTargets": "Targets",
3475
3655
  "billing.floatWindowHint": "Usage summary floating on the footer card; Combined=current style, Subscription cards=one quota card at a time (switchable).",
3476
3656
  "billing.floatNoTargets": "No subscription selected — pick some in Settings.",
3477
3657
  "billing.floatNoTargetsHint": "No subscription channel available.",
@@ -3485,12 +3665,17 @@ window.__ModuleLoader__.load({
3485
3665
  "billing.currencyUsd": "USD",
3486
3666
  "billing.heatmap": "Usage heatmap",
3487
3667
  "billing.rounds": "Cost per turn",
3668
+ "billing.roundsHint": "Last {count} rounds · bar tops show amount · fill = peak/off-peak",
3488
3669
  "billing.anomaly": "Cost spike",
3489
3670
  "billing.workspaces": "Workspaces",
3671
+ "billing.workspacesHint": "Click a row to drill into its top-5 sessions",
3490
3672
  "billing.plan": "Plan",
3491
3673
  "billing.remaining": "Left",
3492
3674
  "billing.unknownModel": "Unpriced",
3493
3675
  "billing.model": "Model",
3676
+ "billing.thModel": "Model name",
3677
+ "billing.thInputMiss": "Input (cache miss)",
3678
+ "billing.thInputHit": "Input (cache hit)",
3494
3679
  "billing.currentRound": "current",
3495
3680
  "billing.costAbbr": "cost",
3496
3681
  "billing.tabOverview": "Overview",
@@ -3503,8 +3688,8 @@ window.__ModuleLoader__.load({
3503
3688
  "billing.settingsHint": "Manage billing-related preferences",
3504
3689
  "billing.budgetHint": "Set a monthly cap for projections and tier alerts",
3505
3690
  "billing.peakAlertHint": "Alert before a tier switch, optionally via system notification",
3506
- "billing.peakAlertDescPeak": "Peak pricing active — non-urgent calls can wait",
3507
- "billing.peakAlertDescOff": "Off-peak savings window is on",
3691
+ "billing.peakAlertDescPeak": "About to enter peak hours — prices rise, plan long tasks ahead",
3692
+ "billing.peakAlertDescOff": "About to enter off-peak hours — price halves, ideal for large batches",
3508
3693
  "billing.export": "Export",
3509
3694
  "billing.exportCsvDay": "Daily CSV",
3510
3695
  "billing.exportCsvSession": "Sessions CSV",
@@ -3527,6 +3712,8 @@ window.__ModuleLoader__.load({
3527
3712
  "billing.peakAlertTitleOff": "Off-peak incoming",
3528
3713
  "billing.peakAlert": "Peak/off-peak alert",
3529
3714
  "billing.peakAlertLeadMin": "Lead time (min)",
3715
+ "billing.peakAlertPos": "Position",
3716
+ "billing.peakAlertMode": "Remind mode",
3530
3717
  "billing.peakAlertPosCorner": "Bottom-right",
3531
3718
  "billing.peakAlertPosCenter": "Center",
3532
3719
  "billing.peakAlertModePeak": "Entering peak only",
@@ -3592,10 +3779,10 @@ window.__ModuleLoader__.load({
3592
3779
  "billing.balanceDaysLong": "~days left",
3593
3780
  "billing.balanceDaysUnit": "days",
3594
3781
  "billing.popTodayModel": "Main model balance",
3782
+ "billing.popTitle": "Usage overview",
3595
3783
  "billing.popNoConsumption": "No usage yet",
3596
3784
  "billing.popQuotaAlert": "Quota alerts",
3597
3785
  "billing.popRiskNone": "Balances & quotas OK",
3598
- "billing.popTitle": "Usage & forecast",
3599
3786
  "billing.popDirectLead": "Direct",
3600
3787
  "billing.popSubLead": "Subscription",
3601
3788
  "billing.popBalanceNormal": "balance ok",
@@ -3721,8 +3908,8 @@ window.__ModuleLoader__.load({
3721
3908
  //#region src/client/PeakAlertBanner.tsx
3722
3909
  /**
3723
3910
  * 峰谷切换提醒浮层:切档前状态条(右下角或居中)。用 `position: fixed` 即可在
3724
- * 任意宿主容器内覆盖整个视口,因此不需要 portal。布局为「档位徽标 + 大号等宽
3725
- * 倒计时 + 一句说明 + 关闭」,克制冷调、无重力阴影。渲染是受控的:父组件把命中
3911
+ * 任意宿主容器内覆盖整个视口,因此不需要 portal。布局按设计 peak-card:头部
3912
+ * (档位 tag + 关闭)→ 大号等宽倒计时 → 一句说明。渲染是受控的:父组件把命中
3726
3913
  * (hit)与偏好传入,显示剩余分钟并在切换后消失。
3727
3914
  */
3728
3915
  /** 渲染一个切档前提醒状态条。 */
@@ -3732,34 +3919,47 @@ window.__ModuleLoader__.load({
3732
3919
  const timer = setInterval(() => setNowMs(Date.now()), 1e3);
3733
3920
  return () => clearInterval(timer);
3734
3921
  }, []);
3922
+ (0, react.useEffect)(() => {
3923
+ if (nowMs >= hit.atMs) onDismiss();
3924
+ }, [
3925
+ nowMs,
3926
+ hit.atMs,
3927
+ onDismiss
3928
+ ]);
3735
3929
  if (nowMs >= hit.atMs) return null;
3736
3930
  const minutes = Math.max(1, Math.round((hit.atMs - nowMs) / 6e4));
3737
3931
  const entering = hit.entering;
3738
3932
  const tag = entering === "peak" ? t("billing.tierPeak") : t("billing.tierOff");
3739
3933
  const desc = entering === "peak" ? t("billing.peakAlertDescPeak") : t("billing.peakAlertDescOff");
3934
+ const isPeak = entering === "peak";
3740
3935
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3741
- className: clsx(UsageBilling_module_css_default.peakAlert, entering === "peak" ? UsageBilling_module_css_default.peakAlertPeak : UsageBilling_module_css_default.peakAlertOff, config.position === "center" ? UsageBilling_module_css_default.peakAlertCenter : UsageBilling_module_css_default.peakAlertCorner),
3936
+ className: clsx(UsageBilling_module_css_default.peakCard, isPeak ? UsageBilling_module_css_default.peakCardPeak : UsageBilling_module_css_default.peakCardOff, config.position === "center" ? UsageBilling_module_css_default.peakCardCenter : UsageBilling_module_css_default.peakCardCorner),
3742
3937
  "data-testid": "billing-peak-alert",
3743
3938
  role: "alert",
3744
3939
  children: [
3745
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3746
- className: UsageBilling_module_css_default.peakAlertTag,
3747
- children: tag
3940
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3941
+ className: UsageBilling_module_css_default.peakHead,
3942
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
3943
+ className: clsx(UsageBilling_module_css_default.peakTag, isPeak ? UsageBilling_module_css_default.peakTagPrimary : UsageBilling_module_css_default.peakTagSuccess),
3944
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3945
+ className: clsx(UsageBilling_module_css_default.peakDot, isPeak ? UsageBilling_module_css_default.peakDotPrimary : UsageBilling_module_css_default.peakDotSuccess),
3946
+ "aria-hidden": "true"
3947
+ }), tag]
3948
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
3949
+ type: "button",
3950
+ className: UsageBilling_module_css_default.peakClose,
3951
+ onClick: onDismiss,
3952
+ "aria-label": t("billing.close"),
3953
+ children: "×"
3954
+ })]
3748
3955
  }),
3749
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
3750
- className: UsageBilling_module_css_default.peakAlertCountdown,
3751
- children: [minutes, "m"]
3956
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3957
+ className: clsx(UsageBilling_module_css_default.peakCount, isPeak ? UsageBilling_module_css_default.peakCountPrimary : UsageBilling_module_css_default.peakCountSuccess),
3958
+ children: [minutes, "min"]
3752
3959
  }),
3753
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3754
- className: UsageBilling_module_css_default.peakAlertText,
3960
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
3961
+ className: UsageBilling_module_css_default.peakDesc,
3755
3962
  children: desc
3756
- }),
3757
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
3758
- type: "button",
3759
- className: UsageBilling_module_css_default.peakAlertClose,
3760
- onClick: onDismiss,
3761
- "aria-label": t("billing.close"),
3762
- children: "×"
3763
3963
  })
3764
3964
  ]
3765
3965
  });
@@ -4210,54 +4410,60 @@ window.__ModuleLoader__.load({
4210
4410
  * fabricate.
4211
4411
  * @param attempt - current retry index (0-based).
4212
4412
  */
4413
+ /** 实时定价重试链是否已在进行:挂载/开弹窗/轮询多个调用点会并发触发 loadLivePricing,
4414
+ * 若都在 `builtin` 时各自起 setTimeout 重试链会叠加出多余请求,这里只保留一条。 */
4415
+ let livePricingRetryPending = false;
4213
4416
  async function loadLivePricing(attempt = 0) {
4214
4417
  const MAX_ATTEMPTS = 4;
4215
4418
  try {
4216
4419
  const response = await fetch(PRICING_PATH);
4217
- if (!response.ok) return;
4420
+ if (!response.ok) {
4421
+ livePricingRetryPending = false;
4422
+ return;
4423
+ }
4218
4424
  const text = await response.text();
4219
4425
  const parsed = JSON.parse(text);
4220
- if (parsed === null || typeof parsed !== "object" || !("source" in parsed)) return;
4426
+ if (parsed === null || typeof parsed !== "object" || !("source" in parsed)) {
4427
+ livePricingRetryPending = false;
4428
+ return;
4429
+ }
4221
4430
  const pricing = parsed;
4222
4431
  if (pricing.source === "builtin" && attempt < MAX_ATTEMPTS - 1) {
4432
+ if (attempt === 0) {
4433
+ if (livePricingRetryPending) return;
4434
+ livePricingRetryPending = true;
4435
+ }
4223
4436
  setTimeout(() => {
4224
4437
  loadLivePricing(attempt + 1);
4225
4438
  }, 2e3);
4226
4439
  return;
4227
4440
  }
4441
+ livePricingRetryPending = false;
4228
4442
  applyLivePricing(pricing);
4229
- } catch {}
4230
- }
4231
- /**
4232
- * 拉取各提供方账户余额(供模型计费明细表的余额列);失败返回空列表。
4233
- * @returns the balance rows, or an empty list on any failure.
4234
- */
4235
- async function fetchBalances() {
4236
- try {
4237
- const response = await fetch(BALANCE_PATH);
4238
- if (!response.ok) return [];
4239
- const text = await response.text();
4240
- const parsed = JSON.parse(text);
4241
- if (parsed !== null && typeof parsed === "object" && "balances" in parsed) return parsed.balances;
4242
- return [];
4243
4443
  } catch {
4244
- return [];
4444
+ livePricingRetryPending = false;
4245
4445
  }
4246
4446
  }
4247
4447
  /**
4248
- * 拉取官方余额差对账提示(drift 时非空),供余额面板展示;失败返回 undefined。
4249
- * @returns the reconcile notice, or undefined on any failure / no drift.
4448
+ * 一次拉取 `/api/billing/balance` 的完整响应(余额行 + 对账提示)。余额与对账
4449
+ * 提示来自同一响应体,拆成两个函数会导致每 30 秒对同一端点发两次请求,故合并
4450
+ * 为单次 fetch;失败返回空值(余额 []、对账 undefined),由调用方降级。
4451
+ * @returns the balances and reconcile notice (both degraded on any failure).
4250
4452
  */
4251
- async function fetchReconcile() {
4453
+ async function fetchBalanceDoc() {
4252
4454
  try {
4253
4455
  const response = await fetch(BALANCE_PATH);
4254
- if (!response.ok) return void 0;
4456
+ if (!response.ok) return { balances: [] };
4255
4457
  const text = await response.text();
4256
4458
  const parsed = JSON.parse(text);
4257
- if (parsed !== null && typeof parsed === "object" && "reconcile" in parsed) return parsed.reconcile;
4258
- return;
4459
+ if (parsed === null || typeof parsed !== "object") return { balances: [] };
4460
+ const doc = parsed;
4461
+ return {
4462
+ balances: Array.isArray(doc.balances) ? doc.balances : [],
4463
+ ...doc.reconcile === void 0 ? {} : { reconcile: doc.reconcile }
4464
+ };
4259
4465
  } catch {
4260
- return;
4466
+ return { balances: [] };
4261
4467
  }
4262
4468
  }
4263
4469
  /**
@@ -4273,20 +4479,16 @@ window.__ModuleLoader__.load({
4273
4479
  throw new Error("subscriptions: invalid response");
4274
4480
  }
4275
4481
  /**
4276
- * 拉取中转站额度(New API / Sub2API 的余额与滚动窗口);失败返回空列表。
4277
- * @returns the relay-site quota rows, or an empty list on any failure.
4482
+ * 拉取中转站额度(New API / Sub2API 的余额与滚动窗口);失败抛出(调用方据此保留旧快照)。
4483
+ * @returns the relay-site quota rows(成功但无中转配置时为空数组)。
4278
4484
  */
4279
4485
  async function fetchRelayQuotas() {
4280
- try {
4281
- const response = await fetch(RELAY_PATH);
4282
- if (!response.ok) return [];
4283
- const text = await response.text();
4284
- const parsed = JSON.parse(text);
4285
- if (parsed !== null && typeof parsed === "object" && "quotas" in parsed) return parsed.quotas;
4286
- return [];
4287
- } catch {
4288
- return [];
4289
- }
4486
+ const response = await fetch(RELAY_PATH);
4487
+ if (!response.ok) throw new Error(`relay-quotas HTTP ${String(response.status)}`);
4488
+ const text = await response.text();
4489
+ const parsed = JSON.parse(text);
4490
+ if (parsed !== null && typeof parsed === "object" && "quotas" in parsed) return parsed.quotas;
4491
+ throw new Error("relay-quotas: invalid response");
4290
4492
  }
4291
4493
  /**
4292
4494
  * 读取 usage_stats 工具开关当前值(插件自带接口,不依赖宿主浏览器设置白名单)。
@@ -4373,16 +4575,24 @@ window.__ModuleLoader__.load({
4373
4575
  children: cardIcon
4374
4576
  }),
4375
4577
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4376
- className: UsageBilling_module_css_default.triggerBody,
4578
+ className: UsageBilling_module_css_default.triggerMain,
4377
4579
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4378
- className: UsageBilling_module_css_default.triggerRow,
4379
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4380
- className: UsageBilling_module_css_default.triggerMeta,
4381
- children: t("billing.triggerMonth")
4382
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4383
- className: UsageBilling_module_css_default.triggerAmount,
4384
- children: formatMoney(monthCost)
4385
- })]
4580
+ className: UsageBilling_module_css_default.triggerPrimary,
4581
+ children: [
4582
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4583
+ className: UsageBilling_module_css_default.triggerLabel,
4584
+ children: t("billing.triggerMonth")
4585
+ }),
4586
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4587
+ className: UsageBilling_module_css_default.triggerYen,
4588
+ "aria-hidden": "true",
4589
+ children: formatMoney(monthCost).charAt(0)
4590
+ }),
4591
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4592
+ className: UsageBilling_module_css_default.triggerMetric,
4593
+ children: formatMoney(monthCost).slice(1)
4594
+ })
4595
+ ]
4386
4596
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4387
4597
  className: UsageBilling_module_css_default.triggerSub,
4388
4598
  "data-testid": "billing-trigger-today",
@@ -4391,7 +4601,9 @@ window.__ModuleLoader__.load({
4391
4601
  " ",
4392
4602
  formatMoney(todayCost),
4393
4603
  " · ",
4394
- weekCost > 0 ? `${t("billing.weekCost")} ${formatMoney(weekCost)}` : ""
4604
+ t("billing.weekCost"),
4605
+ " ",
4606
+ formatMoney(weekCost)
4395
4607
  ]
4396
4608
  })]
4397
4609
  }),
@@ -4454,131 +4666,148 @@ window.__ModuleLoader__.load({
4454
4666
  })
4455
4667
  ]
4456
4668
  }, window.kind);
4457
- })())]
4458
- }), targetSubs.length > 1 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4459
- className: UsageBilling_module_css_default.triggerPopSwitcher,
4460
- "data-testid": "billing-float-switcher",
4461
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4462
- className: UsageBilling_module_css_default.triggerPopSwitchCount,
4463
- children: [
4464
- effectiveSubIndex + 1,
4465
- "/",
4466
- targetSubs.length
4467
- ]
4468
- })
4469
- })] }) }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4470
- className: UsageBilling_module_css_default.triggerPopMetrics,
4471
- children: [
4472
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4473
- className: UsageBilling_module_css_default.triggerPopMetric,
4474
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4475
- className: UsageBilling_module_css_default.triggerPopMetricLabel,
4476
- children: t("billing.monthCost")
4477
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4478
- className: clsx(UsageBilling_module_css_default.triggerPopMetricValue, UsageBilling_module_css_default.triggerPopMetricHighlight),
4479
- children: formatMoney(monthCost)
4480
- })]
4481
- }),
4482
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4483
- className: UsageBilling_module_css_default.triggerPopMetric,
4484
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4485
- className: UsageBilling_module_css_default.triggerPopMetricLabel,
4486
- children: t("billing.tokenTotal")
4487
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4488
- className: UsageBilling_module_css_default.triggerPopMetricValue,
4489
- children: formatTokens(dash.totalToken)
4490
- })]
4491
- }),
4492
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4493
- className: UsageBilling_module_css_default.triggerPopMetric,
4494
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4495
- className: UsageBilling_module_css_default.triggerPopMetricLabel,
4496
- children: t("billing.input")
4497
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4498
- className: UsageBilling_module_css_default.triggerPopMetricValue,
4499
- children: formatTokens(dash.input)
4500
- })]
4501
- }),
4502
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4503
- className: UsageBilling_module_css_default.triggerPopMetric,
4504
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4505
- className: UsageBilling_module_css_default.triggerPopMetricLabel,
4506
- children: t("billing.output")
4507
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4508
- className: UsageBilling_module_css_default.triggerPopMetricValue,
4509
- children: formatTokens(dash.output)
4510
- })]
4511
- }),
4512
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4513
- className: UsageBilling_module_css_default.triggerPopMetric,
4514
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4515
- className: UsageBilling_module_css_default.triggerPopMetricLabel,
4516
- children: t("billing.cacheHit")
4517
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4518
- className: UsageBilling_module_css_default.triggerPopMetricValue,
4519
- children: formatTokens(dash.cacheRead)
4520
- })]
4521
- }),
4522
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4523
- className: UsageBilling_module_css_default.triggerPopMetric,
4524
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4525
- className: UsageBilling_module_css_default.triggerPopMetricLabel,
4526
- children: t("billing.calls")
4527
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4528
- className: UsageBilling_module_css_default.triggerPopMetricValue,
4529
- children: dash.calls.toLocaleString()
4530
- })]
4669
+ })())]
4670
+ }), targetSubs.length > 1 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4671
+ className: UsageBilling_module_css_default.triggerPopSwitcher,
4672
+ "data-testid": "billing-float-switcher",
4673
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4674
+ className: UsageBilling_module_css_default.triggerPopSwitchCount,
4675
+ children: [
4676
+ effectiveSubIndex + 1,
4677
+ "/",
4678
+ targetSubs.length
4679
+ ]
4680
+ })
4681
+ })] }) }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
4682
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4683
+ className: UsageBilling_module_css_default.popHead,
4684
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4685
+ className: UsageBilling_module_css_default.popTitle,
4686
+ children: t("billing.popTitle")
4531
4687
  })
4532
- ]
4533
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4534
- className: UsageBilling_module_css_default.triggerPopFoot,
4535
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4536
- className: UsageBilling_module_css_default.triggerPopFootTitle,
4537
- children: t("billing.popTodayModel")
4538
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4539
- className: UsageBilling_module_css_default.triggerPopFootNotes,
4688
+ }),
4689
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4690
+ className: UsageBilling_module_css_default.metricGrid,
4540
4691
  children: [
4541
- vendorStatus.direct !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4542
- className: UsageBilling_module_css_default.triggerPopFootNote,
4543
- children: [
4544
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4545
- className: clsx(UsageBilling_module_css_default.triggerPopBadge, UsageBilling_module_css_default.triggerPopBadgeDirect),
4546
- children: t("billing.popDirectLead")
4547
- }),
4548
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4549
- className: UsageBilling_module_css_default.triggerPopFootName,
4550
- children: vendorStatus.direct.name
4551
- }),
4552
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4553
- className: clsx(UsageBilling_module_css_default.triggerPopFootStatus, vendorStatus.direct.low && UsageBilling_module_css_default.triggerPopFootStatusLow),
4554
- children: vendorStatus.direct.text
4555
- })
4556
- ]
4692
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4693
+ className: UsageBilling_module_css_default.metricCell,
4694
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4695
+ className: UsageBilling_module_css_default.metricLabel,
4696
+ children: t("billing.monthCost")
4697
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4698
+ className: clsx(UsageBilling_module_css_default.metricValue, UsageBilling_module_css_default.metricValuePrimary),
4699
+ children: formatMoney(monthCost)
4700
+ })]
4557
4701
  }),
4558
- vendorStatus.sub !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4559
- className: UsageBilling_module_css_default.triggerPopFootNote,
4560
- children: [
4561
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4562
- className: clsx(UsageBilling_module_css_default.triggerPopBadge, UsageBilling_module_css_default.triggerPopBadgeSub),
4563
- children: t("billing.popSubLead")
4564
- }),
4565
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4566
- className: UsageBilling_module_css_default.triggerPopFootName,
4567
- children: vendorStatus.sub.name
4568
- }),
4569
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4570
- className: clsx(UsageBilling_module_css_default.triggerPopFootStatus, vendorStatus.sub.low && UsageBilling_module_css_default.triggerPopFootStatusLow),
4571
- children: vendorStatus.sub.text
4572
- })
4573
- ]
4702
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4703
+ className: UsageBilling_module_css_default.metricCell,
4704
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4705
+ className: UsageBilling_module_css_default.metricLabel,
4706
+ children: t("billing.tokenTotal")
4707
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4708
+ className: UsageBilling_module_css_default.metricValue,
4709
+ children: formatTokens(dash.totalToken)
4710
+ })]
4574
4711
  }),
4575
- vendorStatus.direct === void 0 && vendorStatus.sub === void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4576
- className: UsageBilling_module_css_default.triggerPopFootNote,
4577
- children: t("billing.popNoConsumption")
4712
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4713
+ className: UsageBilling_module_css_default.metricCell,
4714
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4715
+ className: UsageBilling_module_css_default.metricLabel,
4716
+ children: t("billing.input")
4717
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4718
+ className: UsageBilling_module_css_default.metricValue,
4719
+ children: formatTokens(dash.input)
4720
+ })]
4721
+ }),
4722
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4723
+ className: UsageBilling_module_css_default.metricCell,
4724
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4725
+ className: UsageBilling_module_css_default.metricLabel,
4726
+ children: t("billing.output")
4727
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4728
+ className: UsageBilling_module_css_default.metricValue,
4729
+ children: formatTokens(dash.output)
4730
+ })]
4731
+ }),
4732
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4733
+ className: UsageBilling_module_css_default.metricCell,
4734
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4735
+ className: UsageBilling_module_css_default.metricLabel,
4736
+ children: t("billing.cacheHit")
4737
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4738
+ className: clsx(UsageBilling_module_css_default.metricValue, UsageBilling_module_css_default.metricValueSuccess),
4739
+ children: formatTokens(dash.cacheRead)
4740
+ })]
4741
+ }),
4742
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4743
+ className: UsageBilling_module_css_default.metricCell,
4744
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4745
+ className: UsageBilling_module_css_default.metricLabel,
4746
+ children: t("billing.calls")
4747
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4748
+ className: UsageBilling_module_css_default.metricValue,
4749
+ children: dash.calls.toLocaleString()
4750
+ })]
4578
4751
  })
4579
4752
  ]
4580
- })]
4581
- })] })
4753
+ }),
4754
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4755
+ className: UsageBilling_module_css_default.popModel,
4756
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4757
+ className: UsageBilling_module_css_default.popModelLabel,
4758
+ children: t("billing.popTodayModel")
4759
+ }), vendorStatus.direct !== void 0 || vendorStatus.sub !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [vendorStatus.direct !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4760
+ className: UsageBilling_module_css_default.popModelRow,
4761
+ children: [
4762
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4763
+ className: clsx(UsageBilling_module_css_default.popDot, UsageBilling_module_css_default.popDotDirect),
4764
+ "aria-hidden": "true"
4765
+ }),
4766
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4767
+ className: UsageBilling_module_css_default.popTagPrimary,
4768
+ children: t("billing.popDirectLead")
4769
+ }),
4770
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4771
+ className: UsageBilling_module_css_default.popModelName,
4772
+ children: vendorStatus.direct.name
4773
+ }),
4774
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4775
+ className: clsx(UsageBilling_module_css_default.popModelStatus, vendorStatus.direct.low && UsageBilling_module_css_default.popModelStatusLow),
4776
+ children: vendorStatus.direct.text
4777
+ })
4778
+ ]
4779
+ }), vendorStatus.sub !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4780
+ className: UsageBilling_module_css_default.popModelRow,
4781
+ children: [
4782
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4783
+ className: clsx(UsageBilling_module_css_default.popDot, UsageBilling_module_css_default.popDotSub),
4784
+ "aria-hidden": "true"
4785
+ }),
4786
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4787
+ className: UsageBilling_module_css_default.popTagSub,
4788
+ children: t("billing.popSubLead")
4789
+ }),
4790
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4791
+ className: UsageBilling_module_css_default.popModelName,
4792
+ children: vendorStatus.sub.name
4793
+ }),
4794
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4795
+ className: clsx(UsageBilling_module_css_default.popModelStatus, vendorStatus.sub.low && UsageBilling_module_css_default.popModelStatusLow),
4796
+ children: vendorStatus.sub.text
4797
+ })
4798
+ ]
4799
+ })] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4800
+ className: UsageBilling_module_css_default.popModelRow,
4801
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4802
+ className: clsx(UsageBilling_module_css_default.popDot, UsageBilling_module_css_default.popDotNeutral),
4803
+ "aria-hidden": "true"
4804
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4805
+ className: UsageBilling_module_css_default.popModelStatus,
4806
+ children: t("billing.popNoConsumption")
4807
+ })]
4808
+ })]
4809
+ })
4810
+ ] })
4582
4811
  })]
4583
4812
  });
4584
4813
  }
@@ -4795,7 +5024,7 @@ window.__ModuleLoader__.load({
4795
5024
  return {
4796
5025
  pct: Number.isFinite(budgetPct) ? Math.max(0, Math.min(100, budgetPct)) : yearCost > 0 ? Math.max(0, Math.min(100, monthCost / yearCost * 100)) : 0,
4797
5026
  over: Number.isFinite(budgetPct) && budgetPct >= 100,
4798
- label: t("billing.budget")
5027
+ label: Number.isFinite(budgetPct) ? t("billing.budget") : t("billing.monthCost")
4799
5028
  };
4800
5029
  }, [
4801
5030
  budgetEnabled,
@@ -4804,6 +5033,7 @@ window.__ModuleLoader__.load({
4804
5033
  yearCost,
4805
5034
  t
4806
5035
  ]);
5036
+ const heroBudgetPct = budgetEnabled && budgetAmount > 0 ? monthCost / budgetAmount * 100 : 0;
4807
5037
  const trendDates = (0, react.useMemo)(() => {
4808
5038
  const out = [];
4809
5039
  for (let offset = trendDays - 1; offset >= 0; offset -= 1) {
@@ -4898,9 +5128,17 @@ window.__ModuleLoader__.load({
4898
5128
  else list.push(quota);
4899
5129
  }
4900
5130
  const modelsByVendor = /* @__PURE__ */ new Map();
5131
+ const vendorByNorm = /* @__PURE__ */ new Map();
5132
+ for (const vendor of subscriptionsByVendor.keys()) vendorByNorm.set(normalizeProvider(vendor), vendor);
4901
5133
  for (const row of modelRows) {
4902
- const list = modelsByVendor.get(row.provider);
4903
- if (list === void 0) modelsByVendor.set(row.provider, [row]);
5134
+ let vendorName = row.provider;
5135
+ if (row.plan === true) {
5136
+ const inferred = providerFromModelKey(row.key);
5137
+ if (inferred !== void 0) vendorName = inferred;
5138
+ }
5139
+ const key = vendorByNorm.get(normalizeProvider(vendorName)) ?? vendorName;
5140
+ const list = modelsByVendor.get(key);
5141
+ if (list === void 0) modelsByVendor.set(key, [row]);
4904
5142
  else list.push(row);
4905
5143
  }
4906
5144
  const groups = [...new Set([...modelsByVendor.keys(), ...subscriptionsByVendor.keys()])].map((name) => ({
@@ -4993,7 +5231,7 @@ window.__ModuleLoader__.load({
4993
5231
  onClick: () => {
4994
5232
  onCurrency(unit);
4995
5233
  },
4996
- children: unit === "cny" ? "¥" : "$"
5234
+ children: unit === "cny" ? "¥ CNY" : "$ USD"
4997
5235
  }, unit))
4998
5236
  }),
4999
5237
  health.checked && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
@@ -5104,20 +5342,31 @@ window.__ModuleLoader__.load({
5104
5342
  className: UsageBilling_module_css_default.heroTop,
5105
5343
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5106
5344
  className: UsageBilling_module_css_default.heroMain,
5107
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5108
- className: UsageBilling_module_css_default.heroLabel,
5109
- children: t("billing.monthCost")
5110
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5111
- className: UsageBilling_module_css_default.heroReadout,
5112
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5113
- className: UsageBilling_module_css_default.heroCurrency,
5114
- "aria-hidden": "true",
5115
- children: currency === "usd" ? "$" : "¥"
5116
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5117
- className: UsageBilling_module_css_default.heroValue,
5118
- children: money(monthCost).slice(1)
5119
- })]
5120
- })]
5345
+ children: [
5346
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5347
+ className: UsageBilling_module_css_default.heroLabel,
5348
+ children: t("billing.monthCost")
5349
+ }),
5350
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5351
+ className: UsageBilling_module_css_default.heroReadout,
5352
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5353
+ className: UsageBilling_module_css_default.heroCurrency,
5354
+ "aria-hidden": "true",
5355
+ children: currency === "usd" ? "$" : "¥"
5356
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5357
+ className: UsageBilling_module_css_default.heroValue,
5358
+ children: money(monthCost).slice(1)
5359
+ })]
5360
+ }),
5361
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5362
+ className: UsageBilling_module_css_default.heroMeta,
5363
+ children: [
5364
+ total.calls.toLocaleString(),
5365
+ " ",
5366
+ t("billing.calls")
5367
+ ]
5368
+ })
5369
+ ]
5121
5370
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5122
5371
  className: UsageBilling_module_css_default.heroGauge,
5123
5372
  "data-testid": "billing-hero-gauge",
@@ -5149,6 +5398,39 @@ window.__ModuleLoader__.load({
5149
5398
  })]
5150
5399
  })]
5151
5400
  }),
5401
+ budgetEnabled && budgetAmount > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5402
+ className: UsageBilling_module_css_default.heroBudget,
5403
+ "data-testid": "billing-hero-budget",
5404
+ children: [
5405
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5406
+ className: UsageBilling_module_css_default.heroBudgetLabel,
5407
+ children: t("billing.budget")
5408
+ }),
5409
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5410
+ className: UsageBilling_module_css_default.heroBudgetTrack,
5411
+ role: "progressbar",
5412
+ "aria-valuenow": Math.min(heroBudgetPct, 100),
5413
+ "aria-valuemin": 0,
5414
+ "aria-valuemax": 100,
5415
+ "aria-label": t("billing.budget"),
5416
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5417
+ className: clsx(UsageBilling_module_css_default.heroBudgetFill, heroBudgetPct >= 100 && UsageBilling_module_css_default.heroBudgetFillOver),
5418
+ style: { width: `${Math.min(heroBudgetPct, 100)}%` }
5419
+ })
5420
+ }),
5421
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5422
+ className: UsageBilling_module_css_default.heroBudgetValue,
5423
+ children: [
5424
+ money(monthCost),
5425
+ " / ",
5426
+ money(budgetAmount),
5427
+ " · ",
5428
+ heroBudgetPct.toFixed(1),
5429
+ "%"
5430
+ ]
5431
+ })
5432
+ ]
5433
+ }),
5152
5434
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5153
5435
  className: UsageBilling_module_css_default.heroSide,
5154
5436
  children: [
@@ -5351,136 +5633,134 @@ window.__ModuleLoader__.load({
5351
5633
  className: UsageBilling_module_css_default.tabPanel,
5352
5634
  "data-testid": "billing-tab-panel-settings",
5353
5635
  children: [
5354
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5355
- className: UsageBilling_module_css_default.settingsHead,
5356
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
5357
- className: UsageBilling_module_css_default.settingsTitle,
5358
- children: t("billing.settingsHead")
5359
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5360
- className: UsageBilling_module_css_default.settingsHint,
5361
- children: t("billing.settingsHint")
5362
- })]
5363
- }),
5364
5636
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
5365
- className: UsageBilling_module_css_default.budget,
5637
+ className: UsageBilling_module_css_default.setCard,
5366
5638
  "data-testid": "billing-budget",
5367
- children: [
5368
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5369
- className: UsageBilling_module_css_default.budgetHead,
5370
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5371
- className: UsageBilling_module_css_default.budgetLabel,
5639
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5640
+ className: UsageBilling_module_css_default.setCardHead,
5641
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5642
+ className: UsageBilling_module_css_default.setCardMeta,
5643
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
5644
+ className: UsageBilling_module_css_default.setCardTitle,
5372
5645
  children: t("billing.budget")
5373
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5374
- className: UsageBilling_module_css_default.budgetControls,
5375
- children: [
5376
- budgetEnabled && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5377
- className: UsageBilling_module_css_default.budgetInputWrap,
5378
- "data-testid": "billing-budget-input-wrap",
5379
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5380
- className: UsageBilling_module_css_default.budgetUnit,
5381
- "aria-hidden": "true",
5382
- children: "¥"
5383
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
5384
- className: UsageBilling_module_css_default.budgetInput,
5385
- "data-testid": "billing-budget-input",
5386
- type: "number",
5387
- min: 0,
5388
- step: 1,
5389
- value: budgetAmount === 0 ? "" : budgetAmount,
5390
- placeholder: stats.budget !== void 0 ? String(stats.budget) : "0",
5391
- "aria-label": `${t("billing.budget")}(${currency === "usd" ? "USD" : "CNY"})`,
5392
- title: `${t("billing.budget")}(${currency === "usd" ? "USD" : "CNY"})`,
5393
- onChange: (e) => {
5394
- onBudgetAmount(e.target.valueAsNumber);
5395
- }
5396
- })]
5397
- }),
5398
- budgetEnabled && budgetAmount > 0 && (() => {
5399
- const pct = monthCost / budgetAmount * 100;
5400
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5401
- className: UsageBilling_module_css_default.budgetValue,
5402
- "data-testid": "billing-budget-value",
5403
- children: [
5404
- money(monthCost),
5405
- " / ",
5406
- money(budgetAmount),
5407
- " · ",
5408
- pct.toFixed(1),
5409
- "%"
5410
- ]
5411
- });
5412
- })(),
5413
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5414
- type: "button",
5415
- role: "switch",
5416
- "aria-checked": budgetEnabled,
5646
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5647
+ className: UsageBilling_module_css_default.setCardDesc,
5648
+ children: t("billing.budgetHint")
5649
+ })]
5650
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5651
+ type: "button",
5652
+ role: "switch",
5653
+ "aria-checked": budgetEnabled,
5654
+ "aria-label": t("billing.budget"),
5655
+ "data-testid": "billing-budget-toggle",
5656
+ className: clsx(UsageBilling_module_css_default.switch, budgetEnabled && UsageBilling_module_css_default.switchOn),
5657
+ onClick: onToggleBudget,
5658
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: UsageBilling_module_css_default.switchKnob })
5659
+ })]
5660
+ }), budgetEnabled && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5661
+ className: UsageBilling_module_css_default.ctlCol,
5662
+ children: [
5663
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5664
+ className: UsageBilling_module_css_default.ctlRow,
5665
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5666
+ className: UsageBilling_module_css_default.ctlLabel,
5667
+ children: t("billing.budgetAmount")
5668
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5669
+ className: UsageBilling_module_css_default.inp,
5670
+ "data-testid": "billing-budget-input-wrap",
5671
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5672
+ className: UsageBilling_module_css_default.affix,
5673
+ "aria-hidden": "true",
5674
+ children: "¥"
5675
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
5676
+ className: UsageBilling_module_css_default.budgetInput,
5677
+ "data-testid": "billing-budget-input",
5678
+ type: "number",
5679
+ min: 0,
5680
+ step: 1,
5681
+ value: budgetAmount === 0 ? "" : budgetAmount,
5682
+ placeholder: stats.budget !== void 0 ? String(stats.budget) : "0",
5683
+ "aria-label": `${t("billing.budget")}(${currency === "usd" ? "USD" : "CNY"})`,
5684
+ title: `${t("billing.budget")}(${currency === "usd" ? "USD" : "CNY"})`,
5685
+ onChange: (e) => {
5686
+ onBudgetAmount(e.target.valueAsNumber);
5687
+ }
5688
+ })]
5689
+ })]
5690
+ }),
5691
+ budgetAmount > 0 && (() => {
5692
+ const pct = monthCost / budgetAmount * 100;
5693
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5694
+ className: UsageBilling_module_css_default.ctlRowStretch,
5695
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5696
+ className: UsageBilling_module_css_default.prog,
5697
+ role: "progressbar",
5698
+ "aria-valuenow": Math.min(pct, 100),
5699
+ "aria-valuemin": 0,
5700
+ "aria-valuemax": 100,
5417
5701
  "aria-label": t("billing.budget"),
5418
- "data-testid": "billing-budget-toggle",
5419
- className: clsx(UsageBilling_module_css_default.switch, budgetEnabled && UsageBilling_module_css_default.switchOn),
5420
- onClick: onToggleBudget,
5421
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: UsageBilling_module_css_default.switchKnob })
5702
+ "data-testid": "billing-budget-track",
5703
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5704
+ className: clsx(UsageBilling_module_css_default.progFill, pct >= 100 && UsageBilling_module_css_default.budgetFillOver, pct >= 80 && pct < 100 && UsageBilling_module_css_default.budgetFillWarn),
5705
+ style: { width: `${Math.min(pct, 100)}%` }
5706
+ })
5422
5707
  })
5423
- ]
5424
- })]
5425
- }),
5426
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5427
- className: UsageBilling_module_css_default.budgetHint,
5428
- children: t("billing.budgetHint")
5429
- }),
5430
- budgetEnabled && budgetAmount > 0 && (() => {
5431
- const pct = monthCost / budgetAmount * 100;
5432
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5433
- className: UsageBilling_module_css_default.budgetTrack,
5434
- "data-testid": "billing-budget-track",
5435
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5436
- className: clsx(UsageBilling_module_css_default.budgetFill, pct >= 100 && UsageBilling_module_css_default.budgetFillOver, pct >= 80 && pct < 100 && UsageBilling_module_css_default.budgetFillWarn),
5437
- style: { width: `${Math.min(pct, 100)}%` }
5438
- })
5439
- });
5440
- })()
5441
- ]
5708
+ });
5709
+ })(),
5710
+ budgetAmount > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5711
+ className: UsageBilling_module_css_default.setCardDesc,
5712
+ "data-testid": "billing-budget-value",
5713
+ children: t("billing.budgetSummary").replace("{used}", money(monthCost)).replace("{total}", money(budgetAmount))
5714
+ })
5715
+ ]
5716
+ })]
5442
5717
  }),
5443
5718
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
5444
- className: UsageBilling_module_css_default.peakAlertPanel,
5719
+ className: UsageBilling_module_css_default.setCard,
5445
5720
  "data-testid": "billing-peak-alert-settings",
5446
- children: [
5447
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5448
- className: UsageBilling_module_css_default.peakAlertPanelHead,
5449
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5450
- className: UsageBilling_module_css_default.peakAlertPanelLabel,
5721
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5722
+ className: UsageBilling_module_css_default.setCardHead,
5723
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5724
+ className: UsageBilling_module_css_default.setCardMeta,
5725
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
5726
+ className: UsageBilling_module_css_default.setCardTitle,
5451
5727
  children: t("billing.peakAlert")
5452
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5453
- type: "button",
5454
- role: "switch",
5455
- "aria-checked": peakConfig.enabled,
5456
- "aria-label": t("billing.peakAlert"),
5457
- "data-testid": "billing-peak-alert-toggle",
5458
- className: clsx(UsageBilling_module_css_default.switch, peakConfig.enabled && UsageBilling_module_css_default.switchOn),
5459
- onClick: () => {
5460
- onPeakConfig({
5461
- ...peakConfig,
5462
- enabled: !peakConfig.enabled
5463
- });
5464
- },
5465
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: UsageBilling_module_css_default.switchKnob })
5728
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5729
+ className: UsageBilling_module_css_default.setCardDesc,
5730
+ children: t("billing.peakAlertHint")
5466
5731
  })]
5467
- }),
5468
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5469
- className: UsageBilling_module_css_default.peakAlertHint,
5470
- children: t("billing.peakAlertHint")
5471
- }),
5472
- peakConfig.enabled && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5473
- className: UsageBilling_module_css_default.peakAlertPanelBody,
5474
- children: [
5475
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
5476
- className: UsageBilling_module_css_default.peakAlertField,
5477
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("billing.peakAlertLeadMin") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
5732
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5733
+ type: "button",
5734
+ role: "switch",
5735
+ "aria-checked": peakConfig.enabled,
5736
+ "aria-label": t("billing.peakAlert"),
5737
+ "data-testid": "billing-peak-alert-toggle",
5738
+ className: clsx(UsageBilling_module_css_default.switch, peakConfig.enabled && UsageBilling_module_css_default.switchOn),
5739
+ onClick: () => {
5740
+ onPeakConfig({
5741
+ ...peakConfig,
5742
+ enabled: !peakConfig.enabled
5743
+ });
5744
+ },
5745
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: UsageBilling_module_css_default.switchKnob })
5746
+ })]
5747
+ }), peakConfig.enabled && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5748
+ className: UsageBilling_module_css_default.ctlCol,
5749
+ children: [
5750
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
5751
+ className: UsageBilling_module_css_default.ctlRow,
5752
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5753
+ className: UsageBilling_module_css_default.ctlLabel,
5754
+ children: t("billing.peakAlertLeadMin")
5755
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5756
+ className: UsageBilling_module_css_default.inp,
5757
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
5478
5758
  type: "number",
5479
5759
  min: 1,
5480
5760
  max: 30,
5481
5761
  step: 1,
5482
5762
  value: peakConfig.leadMin,
5483
- className: UsageBilling_module_css_default.peakAlertNum,
5763
+ className: UsageBilling_module_css_default.budgetInput,
5484
5764
  "aria-label": t("billing.peakAlertLeadMin"),
5485
5765
  onChange: (e) => {
5486
5766
  const v = Number(e.target.valueAsNumber);
@@ -5489,169 +5769,205 @@ window.__ModuleLoader__.load({
5489
5769
  leadMin: Number.isFinite(v) ? Math.min(30, Math.max(1, Math.round(v))) : peakConfig.leadMin
5490
5770
  });
5491
5771
  }
5492
- })]
5493
- }),
5494
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
5495
- className: UsageBilling_module_css_default.peakAlertField,
5496
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("billing.peakAlertPosCorner") }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
5497
- value: peakConfig.position,
5498
- className: UsageBilling_module_css_default.peakAlertSelect,
5499
- onChange: (e) => {
5500
- onPeakConfig({
5501
- ...peakConfig,
5502
- position: e.target.value === "center" ? "center" : "bottom-right"
5503
- });
5504
- },
5505
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
5506
- value: "bottom-right",
5507
- children: t("billing.peakAlertPosCorner")
5508
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
5509
- value: "center",
5510
- children: t("billing.peakAlertPosCenter")
5511
- })]
5512
- })]
5513
- }),
5514
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
5515
- className: UsageBilling_module_css_default.peakAlertField,
5516
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("billing.peakAlert") }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
5517
- value: peakConfig.mode,
5518
- className: UsageBilling_module_css_default.peakAlertSelect,
5519
- onChange: (e) => {
5520
- const m = e.target.value;
5521
- onPeakConfig({
5522
- ...peakConfig,
5523
- mode: m === "peak" || m === "offPeak" ? m : "both"
5524
- });
5525
- },
5772
+ })
5773
+ })]
5774
+ }),
5775
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5776
+ className: UsageBilling_module_css_default.ctlRow,
5777
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5778
+ className: UsageBilling_module_css_default.ctlLabel,
5779
+ children: t("billing.peakAlertPos")
5780
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5781
+ className: UsageBilling_module_css_default.ctlGroup,
5782
+ role: "radiogroup",
5783
+ "aria-label": t("billing.peakAlertPos"),
5784
+ children: ["bottom-right", "center"].map((pos) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
5785
+ className: UsageBilling_module_css_default.rdo,
5526
5786
  children: [
5527
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
5528
- value: "both",
5529
- children: t("billing.peakAlertModeBoth")
5787
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
5788
+ type: "radio",
5789
+ name: "peak-pos",
5790
+ checked: peakConfig.position === pos,
5791
+ onChange: () => onPeakConfig({
5792
+ ...peakConfig,
5793
+ position: pos
5794
+ })
5530
5795
  }),
5531
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
5532
- value: "peak",
5533
- children: t("billing.peakAlertModePeak")
5796
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5797
+ className: UsageBilling_module_css_default.rdoDot,
5798
+ "aria-hidden": "true"
5534
5799
  }),
5535
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
5536
- value: "offPeak",
5537
- children: t("billing.peakAlertModeOff")
5538
- })
5800
+ pos === "bottom-right" ? t("billing.peakAlertPosCorner") : t("billing.peakAlertPosCenter")
5539
5801
  ]
5540
- })]
5541
- }),
5542
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
5543
- className: UsageBilling_module_css_default.peakAlertCheck,
5544
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
5545
- type: "checkbox",
5546
- checked: peakConfig.webNotify,
5547
- onChange: (e) => {
5548
- onPeakConfig({
5549
- ...peakConfig,
5550
- webNotify: e.target.checked
5551
- });
5552
- }
5553
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("billing.peakAlertWebNotify") })]
5554
- }),
5555
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5802
+ }, pos))
5803
+ })]
5804
+ }),
5805
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5806
+ className: UsageBilling_module_css_default.ctlRow,
5807
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5808
+ className: UsageBilling_module_css_default.ctlLabel,
5809
+ children: t("billing.peakAlertMode")
5810
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5811
+ className: UsageBilling_module_css_default.ctlGroup,
5812
+ role: "radiogroup",
5813
+ "aria-label": t("billing.peakAlertMode"),
5814
+ children: [
5815
+ "both",
5816
+ "peak",
5817
+ "offPeak"
5818
+ ].map((m) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
5819
+ className: UsageBilling_module_css_default.rdo,
5820
+ children: [
5821
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
5822
+ type: "radio",
5823
+ name: "peak-mode",
5824
+ checked: peakConfig.mode === m,
5825
+ onChange: () => onPeakConfig({
5826
+ ...peakConfig,
5827
+ mode: m
5828
+ })
5829
+ }),
5830
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5831
+ className: UsageBilling_module_css_default.rdoDot,
5832
+ "aria-hidden": "true"
5833
+ }),
5834
+ m === "both" ? t("billing.peakAlertModeBoth") : m === "peak" ? t("billing.peakAlertModePeak") : t("billing.peakAlertModeOff")
5835
+ ]
5836
+ }, m))
5837
+ })]
5838
+ }),
5839
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
5840
+ className: UsageBilling_module_css_default.ctlRow,
5841
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5842
+ className: UsageBilling_module_css_default.ctlLabel,
5843
+ children: t("billing.peakAlertWebNotify")
5844
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
5845
+ type: "checkbox",
5846
+ checked: peakConfig.webNotify,
5847
+ "aria-label": t("billing.peakAlertWebNotify"),
5848
+ onChange: (e) => {
5849
+ onPeakConfig({
5850
+ ...peakConfig,
5851
+ webNotify: e.target.checked
5852
+ });
5853
+ }
5854
+ })]
5855
+ }),
5856
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5857
+ className: UsageBilling_module_css_default.ctlRow,
5858
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5556
5859
  type: "button",
5557
- className: UsageBilling_module_css_default.peakAlertPreview,
5860
+ className: UsageBilling_module_css_default.btn,
5558
5861
  onClick: onPreviewPeak,
5559
5862
  children: t("billing.peakAlertPreview")
5560
5863
  })
5561
- ]
5562
- })
5563
- ]
5864
+ })
5865
+ ]
5866
+ })]
5564
5867
  }),
5565
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
5566
- className: UsageBilling_module_css_default.budget,
5868
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("section", {
5869
+ className: UsageBilling_module_css_default.setCard,
5567
5870
  "data-testid": "billing-usage-stats-tool-setting",
5568
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5569
- className: UsageBilling_module_css_default.budgetHead,
5570
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5571
- className: UsageBilling_module_css_default.budgetLabel,
5572
- children: t("billing.usageStatsTool")
5573
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5574
- className: UsageBilling_module_css_default.budgetControls,
5575
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5576
- type: "button",
5577
- role: "switch",
5578
- "aria-checked": usageStatsEnabled,
5579
- "aria-label": t("billing.usageStatsTool"),
5580
- "data-testid": "billing-usage-stats-tool-toggle",
5581
- className: clsx(UsageBilling_module_css_default.switch, usageStatsEnabled && UsageBilling_module_css_default.switchOn),
5582
- onClick: toggleUsageStats,
5583
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: UsageBilling_module_css_default.switchKnob })
5584
- })
5871
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5872
+ className: UsageBilling_module_css_default.setCardHead,
5873
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5874
+ className: UsageBilling_module_css_default.setCardMeta,
5875
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
5876
+ className: UsageBilling_module_css_default.setCardTitle,
5877
+ children: t("billing.usageStatsTool")
5878
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5879
+ className: UsageBilling_module_css_default.setCardDesc,
5880
+ children: t("billing.usageStatsToolHint")
5881
+ })]
5882
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5883
+ type: "button",
5884
+ role: "switch",
5885
+ "aria-checked": usageStatsEnabled,
5886
+ "aria-label": t("billing.usageStatsTool"),
5887
+ "data-testid": "billing-usage-stats-tool-toggle",
5888
+ className: clsx(UsageBilling_module_css_default.switch, usageStatsEnabled && UsageBilling_module_css_default.switchOn),
5889
+ onClick: toggleUsageStats,
5890
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: UsageBilling_module_css_default.switchKnob })
5585
5891
  })]
5586
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5587
- className: UsageBilling_module_css_default.budgetHint,
5588
- children: t("billing.usageStatsToolHint")
5589
- })]
5892
+ })
5590
5893
  }),
5591
5894
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
5592
- className: UsageBilling_module_css_default.budget,
5895
+ className: UsageBilling_module_css_default.setCard,
5593
5896
  "data-testid": "billing-float-setting",
5594
- children: [
5595
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5596
- className: UsageBilling_module_css_default.budgetHead,
5597
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5598
- className: UsageBilling_module_css_default.budgetLabel,
5897
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
5898
+ className: UsageBilling_module_css_default.setCardHead,
5899
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5900
+ className: UsageBilling_module_css_default.setCardMeta,
5901
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
5902
+ className: UsageBilling_module_css_default.setCardTitle,
5599
5903
  children: t("billing.floatWindow")
5600
- })
5601
- }),
5602
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5603
- className: UsageBilling_module_css_default.floatModeRow,
5604
- "data-testid": "billing-float-mode",
5605
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5606
- type: "button",
5607
- className: clsx(UsageBilling_module_css_default.floatModeBtn, floatPrefs.mode === "combined" && UsageBilling_module_css_default.floatModeBtnOn),
5608
- "data-testid": "billing-float-mode-combined",
5609
- onClick: () => onFloatPrefs({
5610
- mode: "combined",
5611
- targets: floatPrefs.targets
5612
- }),
5613
- children: t("billing.floatModeCombined")
5614
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5615
- type: "button",
5616
- className: clsx(UsageBilling_module_css_default.floatModeBtn, floatPrefs.mode === "subscription" && UsageBilling_module_css_default.floatModeBtnOn),
5617
- "data-testid": "billing-float-mode-subscription",
5618
- onClick: () => onFloatPrefs({
5619
- mode: "subscription",
5620
- targets: floatPrefs.targets
5621
- }),
5622
- children: t("billing.floatModeSubscription")
5904
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5905
+ className: UsageBilling_module_css_default.setCardDesc,
5906
+ children: t("billing.floatWindowHint")
5907
+ })]
5908
+ })
5909
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5910
+ className: UsageBilling_module_css_default.ctlCol,
5911
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5912
+ className: UsageBilling_module_css_default.ctlRow,
5913
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5914
+ className: UsageBilling_module_css_default.ctlLabel,
5915
+ children: t("billing.floatMode")
5916
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5917
+ className: UsageBilling_module_css_default.ctlGroup,
5918
+ "data-testid": "billing-float-mode",
5919
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5920
+ type: "button",
5921
+ className: clsx(UsageBilling_module_css_default.floatModeBtn, floatPrefs.mode === "combined" && UsageBilling_module_css_default.floatModeBtnOn),
5922
+ "data-testid": "billing-float-mode-combined",
5923
+ onClick: () => onFloatPrefs({
5924
+ mode: "combined",
5925
+ targets: floatPrefs.targets
5926
+ }),
5927
+ children: t("billing.floatModeCombined")
5928
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5929
+ type: "button",
5930
+ className: clsx(UsageBilling_module_css_default.floatModeBtn, floatPrefs.mode === "subscription" && UsageBilling_module_css_default.floatModeBtnOn),
5931
+ "data-testid": "billing-float-mode-subscription",
5932
+ onClick: () => onFloatPrefs({
5933
+ mode: "subscription",
5934
+ targets: floatPrefs.targets
5935
+ }),
5936
+ children: t("billing.floatModeSubscription")
5937
+ })]
5623
5938
  })]
5624
- }),
5625
- floatPrefs.mode === "subscription" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5626
- className: UsageBilling_module_css_default.floatTargets,
5627
- "data-testid": "billing-float-targets",
5628
- children: [subscriptionOptions.map((option) => {
5629
- const on = floatPrefs.targets.includes(option.id);
5630
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
5631
- className: UsageBilling_module_css_default.floatTarget,
5632
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
5633
- type: "checkbox",
5634
- checked: on,
5635
- "data-testid": `billing-float-target-${option.id}`,
5636
- onChange: () => onFloatPrefs({
5637
- mode: "subscription",
5638
- targets: on ? floatPrefs.targets.filter((id) => id !== option.id) : [...floatPrefs.targets, option.id]
5639
- })
5640
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5641
- className: UsageBilling_module_css_default.floatTargetLabel,
5642
- children: option.label
5643
- })]
5644
- }, option.id);
5645
- }), subscriptionOptions.length === 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5646
- className: UsageBilling_module_css_default.budgetHint,
5647
- children: t("billing.floatNoTargetsHint")
5939
+ }), floatPrefs.mode === "subscription" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5940
+ className: UsageBilling_module_css_default.ctlRow,
5941
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5942
+ className: UsageBilling_module_css_default.ctlLabel,
5943
+ children: t("billing.floatTargets")
5944
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5945
+ className: UsageBilling_module_css_default.ctlGroup,
5946
+ "data-testid": "billing-float-targets",
5947
+ children: [subscriptionOptions.map((option) => {
5948
+ const on = floatPrefs.targets.includes(option.id);
5949
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
5950
+ className: UsageBilling_module_css_default.floatTarget,
5951
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
5952
+ type: "checkbox",
5953
+ checked: on,
5954
+ "data-testid": `billing-float-target-${option.id}`,
5955
+ onChange: () => onFloatPrefs({
5956
+ mode: "subscription",
5957
+ targets: on ? floatPrefs.targets.filter((id) => id !== option.id) : [...floatPrefs.targets, option.id]
5958
+ })
5959
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5960
+ className: UsageBilling_module_css_default.floatTargetLabel,
5961
+ children: option.label
5962
+ })]
5963
+ }, option.id);
5964
+ }), subscriptionOptions.length === 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5965
+ className: UsageBilling_module_css_default.setCardDesc,
5966
+ children: t("billing.floatNoTargetsHint")
5967
+ })]
5648
5968
  })]
5649
- }),
5650
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
5651
- className: UsageBilling_module_css_default.budgetHint,
5652
- children: t("billing.floatWindowHint")
5653
- })
5654
- ]
5969
+ })]
5970
+ })]
5655
5971
  }),
5656
5972
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PluginInfoCard, {
5657
5973
  t,
@@ -5664,48 +5980,50 @@ window.__ModuleLoader__.load({
5664
5980
  "data-testid": "billing-tab-panel-trends",
5665
5981
  children: [
5666
5982
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
5667
- className: clsx(UsageBilling_module_css_default.panel, UsageBilling_module_css_default.trendPanel),
5983
+ className: clsx(UsageBilling_module_css_default.ubCard, UsageBilling_module_css_default.trendPanel),
5668
5984
  "data-testid": "billing-panel-trend",
5669
5985
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5670
- className: UsageBilling_module_css_default.panelHead,
5986
+ className: UsageBilling_module_css_default.ubCardHead,
5671
5987
  children: [
5672
5988
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
5673
- className: UsageBilling_module_css_default.panelTitle,
5989
+ className: UsageBilling_module_css_default.ubCardTitle,
5674
5990
  children: t("billing.trend")
5675
5991
  }),
5676
5992
  renderSlot("billing.dashboard.decor", { position: "trend" }),
5677
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5678
- className: UsageBilling_module_css_default.rangeToggle,
5679
- role: "group",
5680
- "aria-label": t("billing.trend"),
5681
- children: [7, 30].map((days) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5682
- type: "button",
5683
- className: clsx(UsageBilling_module_css_default.rangeButton, trendDays === days && UsageBilling_module_css_default.rangeButtonActive),
5684
- "aria-pressed": trendDays === days,
5685
- "data-testid": `billing-trend-${days}d`,
5686
- onClick: () => {
5687
- setTrendDays(days);
5688
- },
5689
- children: days === 7 ? t("billing.trend7d") : t("billing.trend30d")
5690
- }, days))
5691
- }),
5692
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5693
- className: UsageBilling_module_css_default.rangeToggle,
5694
- role: "group",
5695
- "aria-label": t("billing.trendMetric"),
5696
- children: ["cost", "tokens"].map((m) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
5697
- type: "button",
5698
- className: clsx(UsageBilling_module_css_default.rangeButton, trendMetric === m && UsageBilling_module_css_default.rangeButtonActive),
5699
- "aria-pressed": trendMetric === m,
5700
- "data-testid": `billing-trend-metric-${m}`,
5701
- onClick: () => {
5702
- setTrendMetric(m);
5703
- },
5704
- children: m === "cost" ? t("billing.trendMetricCost") : t("billing.trendMetricTokens")
5705
- }, m))
5993
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5994
+ className: UsageBilling_module_css_default.ubCardControlGroup,
5995
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5996
+ className: UsageBilling_module_css_default.rangeToggle,
5997
+ role: "group",
5998
+ "aria-label": t("billing.trend"),
5999
+ children: [7, 30].map((days) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
6000
+ type: "button",
6001
+ className: clsx(UsageBilling_module_css_default.rangeButton, trendDays === days && UsageBilling_module_css_default.rangeButtonActive),
6002
+ "aria-pressed": trendDays === days,
6003
+ "data-testid": `billing-trend-${days}d`,
6004
+ onClick: () => {
6005
+ setTrendDays(days);
6006
+ },
6007
+ children: days === 7 ? t("billing.trend7d") : t("billing.trend30d")
6008
+ }, days))
6009
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6010
+ className: UsageBilling_module_css_default.rangeToggle,
6011
+ role: "group",
6012
+ "aria-label": t("billing.trendMetric"),
6013
+ children: ["cost", "tokens"].map((m) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
6014
+ type: "button",
6015
+ className: clsx(UsageBilling_module_css_default.rangeButton, trendMetric === m && UsageBilling_module_css_default.rangeButtonActive),
6016
+ "aria-pressed": trendMetric === m,
6017
+ "data-testid": `billing-trend-metric-${m}`,
6018
+ onClick: () => {
6019
+ setTrendMetric(m);
6020
+ },
6021
+ children: m === "cost" ? t("billing.trendMetricCost") : t("billing.trendMetricTokens")
6022
+ }, m))
6023
+ })]
5706
6024
  }),
5707
6025
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5708
- className: UsageBilling_module_css_default.panelHint,
6026
+ className: UsageBilling_module_css_default.ubCardSub,
5709
6027
  children: latestDate
5710
6028
  })
5711
6029
  ]
@@ -5717,44 +6035,51 @@ window.__ModuleLoader__.load({
5717
6035
  })]
5718
6036
  }),
5719
6037
  turns.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
5720
- className: UsageBilling_module_css_default.panel,
6038
+ className: UsageBilling_module_css_default.ubCard,
5721
6039
  "data-testid": "billing-panel-rounds",
5722
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5723
- className: UsageBilling_module_css_default.panelHead,
5724
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
5725
- className: UsageBilling_module_css_default.panelTitle,
5726
- children: t("billing.rounds")
5727
- }), roundFlags.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
5728
- className: UsageBilling_module_css_default.roundsFlagBadge,
5729
- "data-testid": "billing-rounds-flag-count",
5730
- children: [
5731
- roundFlags.length,
5732
- " ",
5733
- t("billing.anomaly")
5734
- ]
5735
- })]
5736
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RoundCostChart, {
5737
- rounds: turns,
5738
- flags: roundFlags,
5739
- currency,
5740
- t
5741
- })]
6040
+ children: [
6041
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6042
+ className: UsageBilling_module_css_default.ubCardHead,
6043
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
6044
+ className: UsageBilling_module_css_default.ubCardTitle,
6045
+ children: t("billing.rounds")
6046
+ }), roundFlags.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
6047
+ className: UsageBilling_module_css_default.ubTagError,
6048
+ "data-testid": "billing-rounds-flag-count",
6049
+ children: [
6050
+ roundFlags.length,
6051
+ " ",
6052
+ t("billing.anomaly")
6053
+ ]
6054
+ })]
6055
+ }),
6056
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6057
+ className: UsageBilling_module_css_default.ubCardSub,
6058
+ children: t("billing.roundsHint").replace("{count}", String(turns.length))
6059
+ }),
6060
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RoundCostChart, {
6061
+ rounds: turns,
6062
+ flags: roundFlags,
6063
+ currency,
6064
+ t
6065
+ })
6066
+ ]
5742
6067
  }),
5743
6068
  turns.length > 0 && (() => {
5744
6069
  const shareTotal = peakShare.peak + peakShare.offPeak;
5745
6070
  if (shareTotal <= 0) return null;
5746
6071
  const peakPct = peakShare.peak / shareTotal * 100;
5747
6072
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
5748
- className: UsageBilling_module_css_default.panel,
6073
+ className: UsageBilling_module_css_default.ubCard,
5749
6074
  "data-testid": "billing-panel-share",
5750
6075
  children: [
5751
6076
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
5752
- className: UsageBilling_module_css_default.panelHead,
6077
+ className: UsageBilling_module_css_default.ubCardHead,
5753
6078
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
5754
- className: UsageBilling_module_css_default.panelTitle,
6079
+ className: UsageBilling_module_css_default.ubCardTitle,
5755
6080
  children: t("billing.peakShare")
5756
6081
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
5757
- className: UsageBilling_module_css_default.panelHint,
6082
+ className: UsageBilling_module_css_default.ubCardSub,
5758
6083
  children: t("billing.peakShareHint").replace("{count}", String(turns.length))
5759
6084
  })]
5760
6085
  }),
@@ -6264,182 +6589,151 @@ window.__ModuleLoader__.load({
6264
6589
  })
6265
6590
  ]
6266
6591
  }),
6267
- bucketSummary !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
6268
- className: UsageBilling_module_css_default.panel,
6269
- "data-testid": "billing-panel-buckets",
6270
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6271
- className: UsageBilling_module_css_default.panelHead,
6272
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("h3", {
6273
- className: UsageBilling_module_css_default.panelTitle,
6274
- children: [
6275
- t("billing.official"),
6276
- " / ",
6277
- t("billing.thirdParty")
6278
- ]
6279
- })
6280
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6281
- className: UsageBilling_module_css_default.bucketSummary,
6592
+ bucketSummary !== void 0 && (() => {
6593
+ const totalCost = bucketSummary.officialCost + bucketSummary.thirdCost;
6594
+ const officialPct = totalCost > 0 ? bucketSummary.officialCost / totalCost * 100 : 0;
6595
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6596
+ className: UsageBilling_module_css_default.ubStatGrid,
6597
+ "data-testid": "billing-panel-buckets",
6282
6598
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6283
- className: UsageBilling_module_css_default.bucketStat,
6599
+ className: UsageBilling_module_css_default.ubStatCard,
6284
6600
  children: [
6285
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6286
- className: UsageBilling_module_css_default.bucketStatLabel,
6287
- children: t("billing.official")
6601
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
6602
+ className: UsageBilling_module_css_default.ubStatLabel,
6603
+ children: [t("billing.official"), "(=DeepSeek 直连)"]
6288
6604
  }),
6289
6605
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6290
- className: UsageBilling_module_css_default.bucketStatValue,
6606
+ className: UsageBilling_module_css_default.ubStatValue,
6291
6607
  children: money(bucketSummary.officialCost)
6292
6608
  }),
6293
6609
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
6294
- className: UsageBilling_module_css_default.bucketStatSub,
6610
+ className: UsageBilling_module_css_default.ubStatDetail,
6295
6611
  children: [
6296
6612
  bucketSummary.officialCalls,
6297
6613
  " ",
6298
- t("billing.calls")
6614
+ t("billing.calls"),
6615
+ " · ",
6616
+ officialPct.toFixed(1),
6617
+ "%"
6299
6618
  ]
6300
6619
  })
6301
6620
  ]
6302
6621
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6303
- className: UsageBilling_module_css_default.bucketStat,
6622
+ className: UsageBilling_module_css_default.ubStatCard,
6304
6623
  children: [
6305
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6306
- className: UsageBilling_module_css_default.bucketStatLabel,
6307
- children: t("billing.thirdParty")
6624
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
6625
+ className: UsageBilling_module_css_default.ubStatLabel,
6626
+ children: [t("billing.thirdParty"), "(中转)"]
6308
6627
  }),
6309
6628
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6310
- className: UsageBilling_module_css_default.bucketStatValue,
6629
+ className: UsageBilling_module_css_default.ubStatValue,
6311
6630
  children: money(bucketSummary.thirdCost)
6312
6631
  }),
6313
6632
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
6314
- className: UsageBilling_module_css_default.bucketStatSub,
6633
+ className: UsageBilling_module_css_default.ubStatDetail,
6315
6634
  children: [
6316
6635
  bucketSummary.thirdCalls,
6317
6636
  " ",
6318
- t("billing.calls")
6637
+ t("billing.calls"),
6638
+ " · ",
6639
+ (100 - officialPct).toFixed(1),
6640
+ "%"
6319
6641
  ]
6320
6642
  })
6321
6643
  ]
6322
6644
  })]
6323
- })]
6324
- }),
6645
+ });
6646
+ })(),
6325
6647
  stats.byWorkspace !== void 0 && stats.byWorkspace.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
6326
- className: UsageBilling_module_css_default.panel,
6648
+ className: UsageBilling_module_css_default.ubCard,
6327
6649
  "data-testid": "billing-panel-workspaces",
6328
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6329
- className: UsageBilling_module_css_default.panelHead,
6330
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
6331
- className: UsageBilling_module_css_default.panelTitle,
6650
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6651
+ className: UsageBilling_module_css_default.ubCardHead,
6652
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
6653
+ className: UsageBilling_module_css_default.ubCardTitle,
6332
6654
  children: t("billing.workspaces")
6333
- })
6334
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6335
- className: UsageBilling_module_css_default.tableScroll,
6336
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("table", {
6337
- className: UsageBilling_module_css_default.modelTable,
6338
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("thead", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("tr", { children: [
6339
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", { children: t("billing.project") }),
6340
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
6341
- className: UsageBilling_module_css_default.numCol,
6342
- children: t("billing.calls")
6343
- }),
6344
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
6345
- className: UsageBilling_module_css_default.numCol,
6346
- children: t("billing.inputTokens")
6347
- }),
6348
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
6349
- className: UsageBilling_module_css_default.numCol,
6350
- children: t("billing.outputTokens")
6351
- }),
6352
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
6353
- className: UsageBilling_module_css_default.numCol,
6354
- children: t("billing.actual")
6355
- }),
6356
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
6357
- className: UsageBilling_module_css_default.numCol,
6358
- children: t("billing.lastActive")
6359
- })
6360
- ] }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("tbody", { children: stats.byWorkspace.map((row) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("tr", {
6361
- onClick: () => {
6362
- setExpandedProject(expandedProject === row.name ? void 0 : row.name);
6363
- },
6364
- style: { cursor: "pointer" },
6655
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6656
+ className: UsageBilling_module_css_default.ubCardSub,
6657
+ children: t("billing.workspacesHint")
6658
+ })]
6659
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
6660
+ className: UsageBilling_module_css_default.rowlist,
6661
+ children: stats.byWorkspace.map((row) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
6662
+ type: "button",
6663
+ className: UsageBilling_module_css_default.rowline,
6664
+ "data-testid": `billing-workspace-${row.name}`,
6665
+ onClick: () => {
6666
+ setExpandedProject(expandedProject === row.name ? void 0 : row.name);
6667
+ },
6668
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6669
+ className: UsageBilling_module_css_default.rowlineName,
6670
+ children: row.name
6671
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
6672
+ className: UsageBilling_module_css_default.rowlineRight,
6365
6673
  children: [
6366
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6367
- className: UsageBilling_module_css_default.modelName,
6368
- children: row.name
6369
- }) }),
6370
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
6371
- className: UsageBilling_module_css_default.numCol,
6372
- children: row.calls.toLocaleString()
6373
- }),
6374
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
6375
- className: UsageBilling_module_css_default.numCol,
6376
- children: formatTokens(row.input)
6377
- }),
6378
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
6379
- className: UsageBilling_module_css_default.numCol,
6380
- children: formatTokens(row.output)
6381
- }),
6382
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
6383
- className: UsageBilling_module_css_default.numCol,
6674
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6675
+ className: UsageBilling_module_css_default.num,
6384
6676
  children: money(row.cost)
6385
6677
  }),
6386
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
6387
- className: UsageBilling_module_css_default.numCol,
6388
- children: row.lastActive > 0 ? `${localDayStamp(row.lastActive)}` : "—"
6678
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
6679
+ className: UsageBilling_module_css_default.rowlineMuted,
6680
+ children: [
6681
+ row.calls,
6682
+ " ",
6683
+ t("billing.calls")
6684
+ ]
6685
+ }),
6686
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6687
+ className: UsageBilling_module_css_default.rowlineChev,
6688
+ "aria-hidden": "true",
6689
+ children: "›"
6389
6690
  })
6390
6691
  ]
6391
- }), expandedProject === row.name && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("tr", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
6392
- colSpan: 6,
6393
- style: { padding: "0" },
6394
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("table", {
6395
- className: UsageBilling_module_css_default.modelTable,
6396
- style: {
6397
- margin: 0,
6398
- border: "none",
6399
- background: "var(--dsw-alias-bg-layer-1)"
6400
- },
6401
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("tbody", { children: stats.bySession?.filter((s) => projectName(s.cwd) === row.name).slice(0, 5).map((s) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("tr", { children: [
6402
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6403
- className: UsageBilling_module_css_default.modelName,
6404
- children: s.title ?? s.id.slice(0, 8)
6405
- }) }),
6406
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
6407
- className: UsageBilling_module_css_default.numCol,
6408
- children: s.calls.toLocaleString()
6409
- }),
6410
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
6411
- className: UsageBilling_module_css_default.numCol,
6412
- children: money(s.cost)
6413
- }),
6414
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
6415
- className: UsageBilling_module_css_default.numCol,
6416
- children: localDayStamp(s.lastActive)
6417
- })
6418
- ] }, s.id)) })
6419
- })
6420
- }) })] }, row.name)) })]
6421
- })
6692
+ })]
6693
+ }) }), expandedProject === row.name && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", {
6694
+ className: UsageBilling_module_css_default.rowlineDrillWrap,
6695
+ children: stats.bySession?.filter((s) => projectName(s.cwd) === row.name).slice(0, 5).map((s) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6696
+ className: UsageBilling_module_css_default.rowlineDrill,
6697
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6698
+ className: UsageBilling_module_css_default.rowlineName,
6699
+ children: s.title ?? s.id.slice(0, 8)
6700
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
6701
+ className: UsageBilling_module_css_default.rowlineRight,
6702
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6703
+ className: UsageBilling_module_css_default.num,
6704
+ children: money(s.cost)
6705
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
6706
+ className: UsageBilling_module_css_default.rowlineMuted,
6707
+ children: [
6708
+ s.calls,
6709
+ " ",
6710
+ t("billing.calls")
6711
+ ]
6712
+ })]
6713
+ })]
6714
+ }, s.id))
6715
+ })] }, row.name))
6422
6716
  })]
6423
6717
  }),
6424
6718
  stats.bySession !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
6425
- className: UsageBilling_module_css_default.panel,
6719
+ className: UsageBilling_module_css_default.ubCard,
6426
6720
  "data-testid": "billing-panel-sessions",
6427
6721
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6428
- className: UsageBilling_module_css_default.panelHead,
6722
+ className: UsageBilling_module_css_default.ubCardHead,
6429
6723
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
6430
- className: UsageBilling_module_css_default.panelTitle,
6724
+ className: UsageBilling_module_css_default.ubCardTitle,
6431
6725
  children: t("billing.sessions")
6432
6726
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6433
- className: UsageBilling_module_css_default.panelHint,
6727
+ className: UsageBilling_module_css_default.ubCardSub,
6434
6728
  children: stats.bySession.length > SESSION_DISPLAY_LIMIT ? t("billing.sessionOverflow").replace("{limit}", String(SESSION_DISPLAY_LIMIT)).replace("{total}", String(stats.bySession.length)) : `${stats.bySession.length}`
6435
6729
  })]
6436
6730
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6437
- className: UsageBilling_module_css_default.tableScroll,
6731
+ className: UsageBilling_module_css_default.ubTablewrap,
6438
6732
  "data-testid": "billing-sessions-table",
6439
6733
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("table", {
6440
- className: UsageBilling_module_css_default.modelTable,
6734
+ className: UsageBilling_module_css_default.ubTable,
6441
6735
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("thead", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("tr", { children: [
6442
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", { children: t("billing.sessions") }),
6736
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", { children: t("billing.sessionTitle") }),
6443
6737
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", { children: t("billing.project") }),
6444
6738
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
6445
6739
  className: UsageBilling_module_css_default.numCol,
@@ -6489,7 +6783,6 @@ window.__ModuleLoader__.load({
6489
6783
  "data-testid": "billing-tab-panel-token",
6490
6784
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(TokenPanel, {
6491
6785
  stats,
6492
- currency,
6493
6786
  trendDays,
6494
6787
  onTrendDays: setTrendDays,
6495
6788
  t
@@ -6512,136 +6805,202 @@ window.__ModuleLoader__.load({
6512
6805
  })]
6513
6806
  })]
6514
6807
  }),
6515
- tab === "pricing" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6808
+ tab === "pricing" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6516
6809
  className: UsageBilling_module_css_default.tabPanel,
6517
6810
  "data-testid": "billing-tab-panel-pricing",
6518
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
6519
- className: UsageBilling_module_css_default.panel,
6520
- "data-testid": "billing-panel-pricing",
6521
- children: [
6522
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6523
- className: UsageBilling_module_css_default.panelHead,
6524
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
6525
- className: UsageBilling_module_css_default.panelTitle,
6526
- children: t("billing.pricing")
6527
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
6528
- className: UsageBilling_module_css_default.panelHint,
6811
+ children: [
6812
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6813
+ className: UsageBilling_module_css_default.ubAlert,
6814
+ role: "note",
6815
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6816
+ className: UsageBilling_module_css_default.ubAlertLeft,
6817
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
6818
+ className: UsageBilling_module_css_default.ubRate,
6819
+ "data-testid": "billing-rate",
6529
6820
  children: [
6530
6821
  t("billing.todayRate"),
6531
6822
  " 1 USD = ",
6532
- formatMoney(rateInfo.rate),
6533
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6534
- className: clsx(UsageBilling_module_css_default.rateBadge, rateInfo.live ? UsageBilling_module_css_default.rateBadgeLive : UsageBilling_module_css_default.rateBadgeBuiltin),
6535
- children: rateInfo.live ? t("billing.rateLive") : t("billing.rateBuiltin")
6536
- })
6823
+ formatMoney(rateInfo.rate)
6537
6824
  ]
6825
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6826
+ className: clsx(UsageBilling_module_css_default.ubTag, rateInfo.live ? UsageBilling_module_css_default.ubTagSuccess : UsageBilling_module_css_default.ubTagNeutral),
6827
+ children: rateInfo.live ? t("billing.rateLive") : t("billing.rateBuiltin")
6538
6828
  })]
6539
- }),
6540
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6541
- className: UsageBilling_module_css_default.pricingTip,
6829
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
6830
+ className: UsageBilling_module_css_default.ubAlertNote,
6542
6831
  children: t("billing.pricingTip")
6543
- }),
6544
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6545
- className: UsageBilling_module_css_default.tableScroll,
6832
+ })]
6833
+ }),
6834
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
6835
+ className: UsageBilling_module_css_default.ubCard,
6836
+ "data-testid": "billing-panel-pricing",
6837
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
6838
+ className: UsageBilling_module_css_default.ubCardHead,
6839
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
6840
+ className: UsageBilling_module_css_default.ubCardTitle,
6841
+ children: t("billing.pricing")
6842
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6843
+ className: UsageBilling_module_css_default.ubCardSub,
6844
+ children: t("billing.pricingUnit")
6845
+ })]
6846
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6847
+ className: UsageBilling_module_css_default.ubTablewrap,
6546
6848
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("table", {
6547
- className: UsageBilling_module_css_default.pricingTable,
6849
+ className: UsageBilling_module_css_default.ubTable,
6548
6850
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("thead", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("tr", { children: [
6549
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", { children: "Model" }),
6851
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", { children: t("billing.thModel") }),
6550
6852
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
6551
6853
  className: UsageBilling_module_css_default.numCol,
6552
- children: t("billing.input")
6854
+ children: t("billing.thInputMiss")
6553
6855
  }),
6554
6856
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
6555
6857
  className: UsageBilling_module_css_default.numCol,
6556
- children: t("billing.cacheHit")
6858
+ children: t("billing.thInputHit")
6557
6859
  }),
6558
6860
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
6559
6861
  className: UsageBilling_module_css_default.numCol,
6560
6862
  children: t("billing.output")
6561
6863
  }),
6562
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", { children: t("billing.band") })
6864
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
6865
+ className: UsageBilling_module_css_default.numCol,
6866
+ children: t("billing.band")
6867
+ })
6563
6868
  ] }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("tbody", { children: catalogEntries().map((entry) => {
6564
6869
  const hasPrice = entry.price.input > 0 || entry.price.output > 0;
6565
6870
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("tr", { children: [
6566
6871
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
6567
- className: UsageBilling_module_css_default.modelCell,
6872
+ className: UsageBilling_module_css_default.ubModel,
6568
6873
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6569
- className: UsageBilling_module_css_default.modelDot,
6570
- style: { background: resolveToken(entry.colorVar) }
6571
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
6572
- className: UsageBilling_module_css_default.modelName,
6874
+ className: UsageBilling_module_css_default.ubModelDot,
6875
+ style: { background: resolveToken(entry.colorVar) },
6876
+ "aria-hidden": "true"
6877
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
6878
+ className: UsageBilling_module_css_default.ubModelName,
6573
6879
  children: [entry.name, entry.uncatalogued && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6574
- className: UsageBilling_module_css_default.uncataloguedTag,
6880
+ className: UsageBilling_module_css_default.ubTagAlert,
6575
6881
  "data-testid": "billing-price-uncatalogued",
6576
6882
  children: t("billing.uncatalogued")
6577
6883
  })]
6578
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6579
- className: UsageBilling_module_css_default.modelProvider,
6580
- children: providerName(entry.provider)
6581
- })] })]
6884
+ })]
6582
6885
  }) }),
6583
6886
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
6584
6887
  className: UsageBilling_module_css_default.numCol,
6585
- children: hasPrice ? entry.price.offPeak !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
6586
- className: UsageBilling_module_css_default.bandPrice,
6587
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: unitMoney(entry.price.input, entry.price.currency) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6588
- className: UsageBilling_module_css_default.bandPriceOff,
6589
- children: unitMoney(entry.price.offPeak.input, entry.price.currency)
6590
- })]
6591
- }) : unitMoney(entry.price.input, entry.price.currency) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6888
+ children: hasPrice ? unitMoney(entry.price.input, entry.price.currency) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6592
6889
  className: UsageBilling_module_css_default.na,
6593
6890
  children: "—"
6594
6891
  })
6595
6892
  }),
6596
6893
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
6597
6894
  className: UsageBilling_module_css_default.numCol,
6598
- children: hasPrice ? entry.price.offPeak !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
6599
- className: UsageBilling_module_css_default.bandPrice,
6600
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: unitMoney(entry.price.cacheHit, entry.price.currency) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6601
- className: UsageBilling_module_css_default.bandPriceOff,
6602
- children: unitMoney(entry.price.offPeak.cacheHit, entry.price.currency)
6603
- })]
6604
- }) : unitMoney(entry.price.cacheHit, entry.price.currency) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6895
+ children: hasPrice ? unitMoney(entry.price.cacheHit, entry.price.currency) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6605
6896
  className: UsageBilling_module_css_default.na,
6606
6897
  children: "—"
6607
6898
  })
6608
6899
  }),
6609
6900
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
6610
6901
  className: UsageBilling_module_css_default.numCol,
6611
- children: hasPrice ? entry.price.offPeak !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
6612
- className: UsageBilling_module_css_default.bandPrice,
6613
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: unitMoney(entry.price.output, entry.price.currency) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6614
- className: UsageBilling_module_css_default.bandPriceOff,
6615
- children: unitMoney(entry.price.offPeak.output, entry.price.currency)
6616
- })]
6617
- }) : unitMoney(entry.price.output, entry.price.currency) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6902
+ children: hasPrice ? unitMoney(entry.price.output, entry.price.currency) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6618
6903
  className: UsageBilling_module_css_default.na,
6619
6904
  children: "—"
6620
6905
  })
6621
6906
  }),
6622
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", { children: entry.price.offPeak !== void 0 && entry.peakHours !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
6623
- className: UsageBilling_module_css_default.bandTag,
6624
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [
6625
- t("billing.peak"),
6626
- " ",
6627
- entry.peakHours
6628
- ] }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
6629
- className: UsageBilling_module_css_default.bandTagOff,
6630
- children: [t("billing.offPeak"), " 50%"]
6631
- })]
6632
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6633
- className: UsageBilling_module_css_default.flatTag,
6634
- children: t("billing.flat")
6635
- }) })
6907
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
6908
+ className: UsageBilling_module_css_default.numCol,
6909
+ children: hasPrice && entry.price.offPeak !== void 0 && entry.peakHours !== void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
6910
+ className: UsageBilling_module_css_default.ubPricepair,
6911
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
6912
+ className: UsageBilling_module_css_default.ubChipPeak,
6913
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6914
+ className: UsageBilling_module_css_default.ubChipLabel,
6915
+ children: t("billing.ubPeak")
6916
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
6917
+ className: UsageBilling_module_css_default.num,
6918
+ children: [
6919
+ unitMoney(entry.price.input, entry.price.currency),
6920
+ " / ",
6921
+ unitMoney(entry.price.output, entry.price.currency)
6922
+ ]
6923
+ })]
6924
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
6925
+ className: UsageBilling_module_css_default.ubChipOff,
6926
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6927
+ className: UsageBilling_module_css_default.ubChipLabel,
6928
+ children: t("billing.ubOff")
6929
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
6930
+ className: UsageBilling_module_css_default.num,
6931
+ children: [
6932
+ unitMoney(entry.price.offPeak.input, entry.price.currency),
6933
+ " / ",
6934
+ unitMoney(entry.price.offPeak.output, entry.price.currency)
6935
+ ]
6936
+ })]
6937
+ })]
6938
+ }) : hasPrice ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6939
+ className: UsageBilling_module_css_default.flatTag,
6940
+ children: t("billing.flat")
6941
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6942
+ className: UsageBilling_module_css_default.na,
6943
+ children: "—"
6944
+ })
6945
+ })
6636
6946
  ] }, entry.key);
6637
6947
  }) })]
6638
6948
  })
6639
- })
6640
- ]
6641
- })
6949
+ })]
6950
+ }),
6951
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
6952
+ className: UsageBilling_module_css_default.ubCard,
6953
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6954
+ className: UsageBilling_module_css_default.ubCardHead,
6955
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
6956
+ className: UsageBilling_module_css_default.ubCardTitle,
6957
+ children: t("billing.pricingNotes")
6958
+ })
6959
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("ul", {
6960
+ className: UsageBilling_module_css_default.ubNotes,
6961
+ children: [
6962
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("li", {
6963
+ className: UsageBilling_module_css_default.ubNotesItem,
6964
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6965
+ className: UsageBilling_module_css_default.ubNotesTerm,
6966
+ children: t("billing.cacheHit")
6967
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6968
+ className: UsageBilling_module_css_default.ubNotesDesc,
6969
+ children: t("billing.noteCache")
6970
+ })]
6971
+ }),
6972
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("li", {
6973
+ className: UsageBilling_module_css_default.ubNotesItem,
6974
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6975
+ className: UsageBilling_module_css_default.ubNotesTerm,
6976
+ children: t("billing.peakBand")
6977
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6978
+ className: UsageBilling_module_css_default.ubNotesDesc,
6979
+ children: t("billing.noteBand")
6980
+ })]
6981
+ }),
6982
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("li", {
6983
+ className: UsageBilling_module_css_default.ubNotesItem,
6984
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6985
+ className: UsageBilling_module_css_default.ubNotesTerm,
6986
+ children: t("billing.pricingSource")
6987
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
6988
+ className: UsageBilling_module_css_default.ubNotesDesc,
6989
+ children: t("billing.noteSource")
6990
+ })]
6991
+ })
6992
+ ]
6993
+ })]
6994
+ })
6995
+ ]
6642
6996
  }),
6643
6997
  renderSlot("billing.dashboard.decor", { position: "footer" })
6644
6998
  ]
6999
+ }),
7000
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("footer", {
7001
+ className: UsageBilling_module_css_default.modalFooter,
7002
+ "data-testid": "billing-footer",
7003
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("billing.footer") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("billing.footerCredit").replace("{version}", stats.pluginVersion === void 0 ? "—" : `v${stats.pluginVersion}`) })]
6645
7004
  })
6646
7005
  ]
6647
7006
  })
@@ -6682,11 +7041,9 @@ window.__ModuleLoader__.load({
6682
7041
  loadUsageStats().then((data) => {
6683
7042
  if (data !== null) setStats(data);
6684
7043
  });
6685
- fetchBalances().then((list) => {
6686
- if (list.length > 0) setBalances(list);
6687
- });
6688
- fetchReconcile().then((notice) => {
6689
- setReconcile(notice);
7044
+ fetchBalanceDoc().then(({ balances, reconcile }) => {
7045
+ if (balances.length > 0) setBalances(balances);
7046
+ setReconcile(reconcile);
6690
7047
  });
6691
7048
  fetchSubscriptions().then((list) => {
6692
7049
  if (list.length > 0) {
@@ -6697,8 +7054,8 @@ window.__ModuleLoader__.load({
6697
7054
  setQuotasStale(true);
6698
7055
  });
6699
7056
  fetchRelayQuotas().then((list) => {
6700
- if (list.length > 0) setRelayQuotas(list);
6701
- });
7057
+ setRelayQuotas(list);
7058
+ }).catch(() => {});
6702
7059
  }, []);
6703
7060
  const openDashboard = (0, react.useCallback)(() => {
6704
7061
  reloadStats();
@@ -6741,6 +7098,13 @@ window.__ModuleLoader__.load({
6741
7098
  const [peakConfig, setPeakConfig] = (0, react.useState)(() => loadPeakAlertConfig());
6742
7099
  const [peakHit, setPeakHit] = (0, react.useState)(null);
6743
7100
  const [peakPreview, setPeakPreview] = (0, react.useState)(null);
7101
+ const [nowMs, setNowMs] = (0, react.useState)(() => Date.now());
7102
+ (0, react.useEffect)(() => {
7103
+ const timer = setInterval(() => setNowMs(Date.now()), STATS_REFRESH_INTERVAL_MS);
7104
+ return () => {
7105
+ clearInterval(timer);
7106
+ };
7107
+ }, []);
6744
7108
  const updatePeakConfig = (0, react.useCallback)((config) => {
6745
7109
  setPeakConfig(config);
6746
7110
  savePeakAlertConfig(config);
@@ -6779,19 +7143,20 @@ window.__ModuleLoader__.load({
6779
7143
  t
6780
7144
  ]);
6781
7145
  (0, react.useEffect)(() => {
6782
- const upcoming = computePeakAlert(Date.now(), peakConfig, lastTierSwitchAt);
7146
+ const upcoming = computePeakAlert(nowMs, peakConfig, lastTierSwitchAt);
6783
7147
  if (upcoming === null) return;
6784
7148
  actions.markTierSwitchAlerted(upcoming.atMs);
6785
7149
  setPeakHit(upcoming);
6786
7150
  if (!peakConfig.webNotify) return;
6787
7151
  if (typeof Notification === "undefined" || Notification.permission !== "granted") return;
6788
- const minutes = Math.max(1, Math.round((upcoming.atMs - Date.now()) / 6e4));
7152
+ const minutes = Math.max(1, Math.round((upcoming.atMs - nowMs) / 6e4));
6789
7153
  const title = upcoming.entering === "peak" ? t("billing.peakAlertTitlePeak") : t("billing.peakAlertTitleOff");
6790
7154
  const body = upcoming.entering === "peak" ? t("billing.tierAlertEnterPeak").replace("{minutes}", String(minutes)) : t("billing.tierAlertEnterOff").replace("{minutes}", String(minutes));
6791
7155
  try {
6792
7156
  new Notification(title, { body });
6793
7157
  } catch {}
6794
7158
  }, [
7159
+ nowMs,
6795
7160
  lastTierSwitchAt,
6796
7161
  peakConfig,
6797
7162
  actions,
@@ -6906,8 +7271,7 @@ window.__ModuleLoader__.load({
6906
7271
  input: total.input,
6907
7272
  output: total.output,
6908
7273
  cacheRead: total.cacheHit,
6909
- calls: total.calls,
6910
- updatedAt: stats.updatedAt === void 0 ? void 0 : `${localDayStamp(stats.updatedAt)} ${formatClock(stats.updatedAt)}`
7274
+ calls: total.calls
6911
7275
  };
6912
7276
  }, [stats]);
6913
7277
  (0, react.useEffect)(() => {
@@ -7122,57 +7486,66 @@ window.__ModuleLoader__.load({
7122
7486
  const money = (cny) => formatMoney(cny, "cny");
7123
7487
  if (sessionId === void 0) return null;
7124
7488
  const hasCost = sessionCost > 0 || turnCost > 0;
7489
+ const isPeak = tier.tier === "peak";
7125
7490
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
7126
- className: UsageBilling_module_css_default.liveCostBar,
7491
+ className: UsageBilling_module_css_default.feeBar,
7127
7492
  "data-testid": "billing-live-cost-bar",
7128
7493
  children: [
7129
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
7130
- className: tier.tier === "peak" ? UsageBilling_module_css_default.liveTierPeak : UsageBilling_module_css_default.liveTierOff,
7494
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7495
+ className: isPeak ? UsageBilling_module_css_default.feeChipPrimary : UsageBilling_module_css_default.feeChipOff,
7131
7496
  "data-testid": "billing-live-tier",
7132
- children: [
7133
- tier.tier === "peak" ? t("billing.tierPeak") : t("billing.tierOff"),
7134
- " · ",
7135
- formatSwitchCountdown(tier.nextSwitchInMs),
7136
- " ",
7137
- tier.tier === "peak" ? t("billing.tierToOff") : t("billing.tierToPeak")
7138
- ]
7497
+ children: isPeak ? t("billing.tierPeak") : t("billing.tierOff")
7498
+ }),
7499
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7500
+ className: UsageBilling_module_css_default.feeCount,
7501
+ children: formatSwitchCountdown(tier.nextSwitchInMs)
7502
+ }),
7503
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7504
+ className: UsageBilling_module_css_default.feeSuffix,
7505
+ children: isPeak ? t("billing.tierToOff") : t("billing.tierToPeak")
7139
7506
  }),
7140
7507
  hasCost && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
7141
7508
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7142
- className: UsageBilling_module_css_default.liveCostSep,
7509
+ className: UsageBilling_module_css_default.feeSep,
7143
7510
  "aria-hidden": "true",
7144
7511
  children: "·"
7145
7512
  }),
7146
7513
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
7147
- className: UsageBilling_module_css_default.liveCostItem,
7514
+ className: UsageBilling_module_css_default.feeItem,
7148
7515
  "data-testid": "billing-live-turn",
7149
7516
  children: [
7150
7517
  t("billing.liveTurn"),
7151
7518
  " ",
7152
- money(turnCost)
7519
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7520
+ className: UsageBilling_module_css_default.feeNum,
7521
+ children: money(turnCost)
7522
+ })
7153
7523
  ]
7154
7524
  }),
7155
7525
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7156
- className: UsageBilling_module_css_default.liveCostSep,
7526
+ className: UsageBilling_module_css_default.feeSep,
7157
7527
  "aria-hidden": "true",
7158
7528
  children: "·"
7159
7529
  }),
7160
7530
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
7161
- className: UsageBilling_module_css_default.liveCostItem,
7531
+ className: UsageBilling_module_css_default.feeItem,
7162
7532
  "data-testid": "billing-live-session",
7163
7533
  children: [
7164
7534
  t("billing.liveSession"),
7165
7535
  " ",
7166
- money(sessionCost)
7536
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7537
+ className: UsageBilling_module_css_default.feeNum,
7538
+ children: money(sessionCost)
7539
+ })
7167
7540
  ]
7168
7541
  })
7169
7542
  ] }),
7170
7543
  chips.map((chip) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7171
- className: UsageBilling_module_css_default.liveCostSep,
7544
+ className: UsageBilling_module_css_default.feeSep,
7172
7545
  "aria-hidden": "true",
7173
7546
  children: "·"
7174
7547
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
7175
- className: chip.pct <= 10 ? UsageBilling_module_css_default.liveQuotaCrit : UsageBilling_module_css_default.liveQuotaWarn,
7548
+ className: chip.pct <= 10 ? UsageBilling_module_css_default.feeChipError : UsageBilling_module_css_default.feeChipAlert,
7176
7549
  "data-testid": "billing-live-quota",
7177
7550
  children: [
7178
7551
  chip.name,
@@ -7207,7 +7580,9 @@ window.__ModuleLoader__.load({
7207
7580
  },
7208
7581
  publishCosts: (next) => {
7209
7582
  costs = next;
7210
- for (const listener of listeners) listener(next);
7583
+ for (const listener of listeners) try {
7584
+ listener(next);
7585
+ } catch {}
7211
7586
  },
7212
7587
  registerOpen: (handler) => {
7213
7588
  open = handler;
@@ -7295,11 +7670,15 @@ window.__ModuleLoader__.load({
7295
7670
  */
7296
7671
  function installCompletionNotifier(list, getConfig) {
7297
7672
  const previousFinished = /* @__PURE__ */ new Set();
7298
- let queuedTitle;
7673
+ const seen = /* @__PURE__ */ new Set();
7674
+ let closeTimer;
7299
7675
  const snapshot = list.getSnapshot();
7300
7676
  for (const id of snapshot.ids) {
7301
7677
  const summary = snapshot.byId[id];
7302
- if (summary !== void 0 && isFinished(summary)) previousFinished.add(String(id));
7678
+ if (summary !== void 0) {
7679
+ seen.add(String(id));
7680
+ if (isFinished(summary)) previousFinished.add(String(id));
7681
+ }
7303
7682
  }
7304
7683
  const notify = (title) => {
7305
7684
  const { enabled, timeout } = getConfig();
@@ -7307,14 +7686,18 @@ window.__ModuleLoader__.load({
7307
7686
  if (typeof Notification === "undefined") return;
7308
7687
  if (Notification.permission !== "granted") return;
7309
7688
  try {
7310
- new Notification(title, {
7689
+ const notification = new Notification(title, {
7311
7690
  body: title,
7312
7691
  tag: "dsh-billing-completion",
7313
7692
  requireInteraction: timeout === 0
7314
7693
  });
7694
+ if (timeout > 0) {
7695
+ if (closeTimer !== void 0) clearTimeout(closeTimer);
7696
+ closeTimer = setTimeout(() => notification.close(), timeout * 1e3);
7697
+ }
7315
7698
  } catch {}
7316
7699
  };
7317
- return list.subscribe(() => {
7700
+ const unsubscribe = list.subscribe(() => {
7318
7701
  const state = list.getSnapshot();
7319
7702
  const finishedTitles = [];
7320
7703
  for (const id of state.ids) {
@@ -7322,15 +7705,21 @@ window.__ModuleLoader__.load({
7322
7705
  if (summary === void 0) continue;
7323
7706
  const key = String(id);
7324
7707
  const finished = isFinished(summary);
7325
- if (finished && !previousFinished.has(key)) finishedTitles.push(summary.title ?? summary.id ?? key);
7708
+ const firstSeen = !seen.has(key);
7709
+ if (firstSeen) seen.add(key);
7710
+ if (finished && !firstSeen && !previousFinished.has(key)) finishedTitles.push(summary.title ?? summary.id ?? key);
7326
7711
  if (finished) previousFinished.add(key);
7327
7712
  else previousFinished.delete(key);
7328
7713
  }
7329
7714
  if (finishedTitles.length > 0) {
7330
- queuedTitle = finishedTitles.length === 1 ? finishedTitles[0] : `${finishedTitles.length} 个会话已完成`;
7331
- if (queuedTitle !== void 0) notify(queuedTitle);
7715
+ const title = finishedTitles.length === 1 ? finishedTitles[0] : `${finishedTitles.length} 个会话已完成`;
7716
+ if (title !== void 0) notify(title);
7332
7717
  }
7333
7718
  });
7719
+ return () => {
7720
+ unsubscribe();
7721
+ if (closeTimer !== void 0) clearTimeout(closeTimer);
7722
+ };
7334
7723
  }
7335
7724
  //#endregion
7336
7725
  //#region src/client/apply.ts