@kenz1117/dsh-ui-usage-billing 0.9.3 → 0.9.5

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
@@ -24,7 +24,7 @@ window.__ModuleLoader__.load({
24
24
  }
25
25
  //#endregion
26
26
  //#region \0dsh-css:/Users/ken/deepseek-harness/packages/client/ui-usage-billing/src/client/UsageBilling.module.css.mjs
27
- 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:12px;align-items:center;gap:10px;padding:9px 12px;transition:border-color .16s,background-color .16s;display:flex;position:relative;overflow:hidden}.VWh0dG_trigger:hover,.VWh0dG_trigger:focus-visible{border-color:var(--dsw-static-blue-500);outline:none}.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 2px 8px -2px color-mix(in srgb, var(--dsw-static-blue-500) 55%, 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;font-size:16px;font-weight:700;line-height:20px}.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;font-size:9.5px;font-weight:600;line-height:12px}.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}.VWh0dG_triggerPop{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);box-shadow:var(--dsw-shadow-lv2);opacity:0;pointer-events:none;z-index:10;border-radius:10px;flex-direction:column;gap:6px;padding:12px 14px;transition:opacity .16s,transform .16s;display:flex;position:absolute;bottom:calc(100% + 8px);left:0;right:0;transform:translateY(4px)}.VWh0dG_triggerWrap:hover .VWh0dG_triggerPop,.VWh0dG_triggerWrap:focus-within .VWh0dG_triggerPop{opacity:1;transform:translateY(0)}.VWh0dG_triggerPopRow{justify-content:space-between;align-items:baseline;gap:12px;display:flex}.VWh0dG_triggerPopLabel{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}.VWh0dG_triggerPopValue{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-size:13px;font-weight:600;line-height:18px}.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_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_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-tertiary);font-size:12px;line-height:17px}.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_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_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{flex-direction:column;align-items:flex-end;gap:2px;display:inline-flex}.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}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 var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:10px;padding:12px 14px}.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_subscriptionStatus{color:var(--dsw-alias-label-secondary);margin-bottom:6px;font-size:11px}.VWh0dG_subscriptionWindow{align-items:center;gap:8px;margin-top:6px;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:5px;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_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-secondary);flex:none}.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}@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}";
27
+ 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:12px;align-items:center;gap:10px;padding:9px 12px;transition:border-color .16s,background-color .16s;display:flex;position:relative;overflow:hidden}.VWh0dG_trigger:hover,.VWh0dG_trigger:focus-visible{border-color:var(--dsw-static-blue-500);outline:none}.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 2px 8px -2px color-mix(in srgb, var(--dsw-static-blue-500) 55%, 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;font-size:16px;font-weight:700;line-height:20px}.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;font-size:9.5px;font-weight:600;line-height:12px}.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}.VWh0dG_triggerPop{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);box-shadow:var(--dsw-shadow-lv2);opacity:0;pointer-events:none;z-index:10;border-radius:10px;flex-direction:column;gap:6px;padding:12px 14px;transition:opacity .16s,transform .16s;display:flex;position:absolute;bottom:calc(100% + 8px);left:0;right:0;transform:translateY(4px)}.VWh0dG_triggerWrap:hover .VWh0dG_triggerPop,.VWh0dG_triggerWrap:focus-within .VWh0dG_triggerPop{opacity:1;transform:translateY(0)}.VWh0dG_triggerPopRow{justify-content:space-between;align-items:baseline;gap:12px;display:flex}.VWh0dG_triggerPopLabel{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}.VWh0dG_triggerPopValue{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-size:13px;font-weight:600;line-height:18px}.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_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_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-tertiary);font-size:12px;line-height:17px}.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_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_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{flex-direction:column;align-items:flex-end;gap:2px;display:inline-flex}.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}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 var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:10px;padding:12px 14px}.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:8px;margin-top:6px;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:5px;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_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-secondary);flex:none}.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_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_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}@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}";
28
28
  const tagId = "@kenz1117/dsh-ui-usage-billing/UsageBilling.module.css";
29
29
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
30
30
  const tag = document.createElement("style");
@@ -34,253 +34,346 @@ window.__ModuleLoader__.load({
34
34
  document.head.appendChild(tag);
35
35
  }
36
36
  var UsageBilling_module_css_default = {
37
- "peakAlertPanelLabel": "VWh0dG_peakAlertPanelLabel",
37
+ "currencyButton": "VWh0dG_currencyButton",
38
+ "providerGroupList": "VWh0dG_providerGroupList",
39
+ "pricingChevron": "VWh0dG_pricingChevron",
40
+ "peakAlertOff": "VWh0dG_peakAlertOff",
41
+ "chartLegend": "VWh0dG_chartLegend",
42
+ "closeButton": "VWh0dG_closeButton",
43
+ "subscriptionAuto": "VWh0dG_subscriptionAuto",
38
44
  "shareDot": "VWh0dG_shareDot",
39
- "shareSegUser": "VWh0dG_shareSegUser",
40
- "kpiGreen": "VWh0dG_kpiGreen",
41
- "healthOk": "VWh0dG_healthOk",
42
- "heroReadout": "VWh0dG_heroReadout",
43
- "shareItem": "VWh0dG_shareItem",
44
- "dashboardHead": "VWh0dG_dashboardHead",
45
- "dashboardTitle": "VWh0dG_dashboardTitle",
46
- "estimatedTag": "VWh0dG_estimatedTag",
47
- "providerGroup": "VWh0dG_providerGroup",
48
- "peakAlertPanel": "VWh0dG_peakAlertPanel",
49
- "budgetFill": "VWh0dG_budgetFill",
50
- "bandTagOff": "VWh0dG_bandTagOff",
51
- "heatmapGrid": "VWh0dG_heatmapGrid",
45
+ "budgetValue": "VWh0dG_budgetValue",
46
+ "subscriptionName": "VWh0dG_subscriptionName",
47
+ "roundsAxis": "VWh0dG_roundsAxis",
48
+ "chartLine": "VWh0dG_chartLine",
49
+ "rangeToggle": "VWh0dG_rangeToggle",
52
50
  "deltaUp": "VWh0dG_deltaUp",
53
- "budgetFillWarn": "VWh0dG_budgetFillWarn",
54
- "providerGroupList": "VWh0dG_providerGroupList",
55
- "budgetLabel": "VWh0dG_budgetLabel",
56
- "heroGaugePctOver": "VWh0dG_heroGaugePctOver",
57
- "roundsBar": "VWh0dG_roundsBar",
58
- "peakAlertPanelHead": "VWh0dG_peakAlertPanelHead",
59
- "modelProvider": "VWh0dG_modelProvider",
60
- "peakAlertField": "VWh0dG_peakAlertField",
61
- "currencyButton": "VWh0dG_currencyButton",
62
- "heroGauge": "VWh0dG_heroGauge",
63
- "shareSegTool": "VWh0dG_shareSegTool",
64
- "roundsBarLabel": "VWh0dG_roundsBarLabel",
51
+ "healthBad": "VWh0dG_healthBad",
52
+ "numCol": "VWh0dG_numCol",
53
+ "heroSideItem": "VWh0dG_heroSideItem",
54
+ "triggerSpark": "VWh0dG_triggerSpark",
55
+ "chartTooltipDate": "VWh0dG_chartTooltipDate",
56
+ "bucketSep": "VWh0dG_bucketSep",
57
+ "deltaDown": "VWh0dG_deltaDown",
58
+ "budgetFill": "VWh0dG_budgetFill",
59
+ "healthDot": "VWh0dG_healthDot",
60
+ "uncataloguedTag": "VWh0dG_uncataloguedTag",
61
+ "subscriptionTier": "VWh0dG_subscriptionTier",
62
+ "heroCurrency": "VWh0dG_heroCurrency",
63
+ "roundsBars": "VWh0dG_roundsBars",
64
+ "budget": "VWh0dG_budget",
65
+ "chartTooltip": "VWh0dG_chartTooltip",
66
+ "chartTooltipRow": "VWh0dG_chartTooltipRow",
67
+ "bucketCost": "VWh0dG_bucketCost",
68
+ "flatTag": "VWh0dG_flatTag",
69
+ "heatmapHover": "VWh0dG_heatmapHover",
70
+ "budgetHint": "VWh0dG_budgetHint",
71
+ "chartLegendBar": "VWh0dG_chartLegendBar",
72
+ "heroGaugeTrack": "VWh0dG_heroGaugeTrack",
73
+ "triggerSub": "VWh0dG_triggerSub",
74
+ "triggerPop": "VWh0dG_triggerPop",
65
75
  "triggerMeta": "VWh0dG_triggerMeta",
66
- "tabButton": "VWh0dG_tabButton",
76
+ "heroSideSpacer": "VWh0dG_heroSideSpacer",
77
+ "tabPanelIn": "VWh0dG_tabPanelIn",
78
+ "settingsTitle": "VWh0dG_settingsTitle",
79
+ "kpiValue": "VWh0dG_kpiValue",
67
80
  "switch": "VWh0dG_switch",
81
+ "bandTagOff": "VWh0dG_bandTagOff",
82
+ "subscriptionPct": "VWh0dG_subscriptionPct",
83
+ "budgetHead": "VWh0dG_budgetHead",
84
+ "heroMeta": "VWh0dG_heroMeta",
85
+ "dashboard": "VWh0dG_dashboard",
86
+ "pluginInfoLink": "VWh0dG_pluginInfoLink",
87
+ "roundsFlagMark": "VWh0dG_roundsFlagMark",
88
+ "chartLegendLine": "VWh0dG_chartLegendLine",
89
+ "chartTooltipSwatch": "VWh0dG_chartTooltipSwatch",
90
+ "pricingTable": "VWh0dG_pricingTable",
91
+ "bandTag": "VWh0dG_bandTag",
92
+ "liveCostItem": "VWh0dG_liveCostItem",
93
+ "kpiDetail": "VWh0dG_kpiDetail",
94
+ "estimatedTag": "VWh0dG_estimatedTag",
95
+ "chartAxisLabel": "VWh0dG_chartAxisLabel",
68
96
  "heroGaugeArc": "VWh0dG_heroGaugeArc",
69
- "bucketStatLabel": "VWh0dG_bucketStatLabel",
70
- "chartTooltipDate": "VWh0dG_chartTooltipDate",
97
+ "modelTable": "VWh0dG_modelTable",
98
+ "heroTop": "VWh0dG_heroTop",
99
+ "rateBadgeLive": "VWh0dG_rateBadgeLive",
100
+ "pluginInfoValue": "VWh0dG_pluginInfoValue",
101
+ "peakAlertNum": "VWh0dG_peakAlertNum",
102
+ "budgetControls": "VWh0dG_budgetControls",
103
+ "pluginInfo": "VWh0dG_pluginInfo",
104
+ "modelCell": "VWh0dG_modelCell",
71
105
  "bucketStat": "VWh0dG_bucketStat",
72
- "budgetInput": "VWh0dG_budgetInput",
73
- "roundsBarColPeak": "VWh0dG_roundsBarColPeak",
74
- "subscriptionPct": "VWh0dG_subscriptionPct",
75
- "planTag": "VWh0dG_planTag",
106
+ "subscriptionHead": "VWh0dG_subscriptionHead",
107
+ "kpiGrid": "VWh0dG_kpiGrid",
108
+ "dashboardBody": "VWh0dG_dashboardBody",
109
+ "providerGroupBalanceLabel": "VWh0dG_providerGroupBalanceLabel",
110
+ "costCol": "VWh0dG_costCol",
111
+ "triggerSparkHot": "VWh0dG_triggerSparkHot",
112
+ "heroGaugeCenter": "VWh0dG_heroGaugeCenter",
113
+ "modelDot": "VWh0dG_modelDot",
114
+ "peakAlertIn": "VWh0dG_peakAlertIn",
115
+ "bucketStatValue": "VWh0dG_bucketStatValue",
116
+ "heroGauge": "VWh0dG_heroGauge",
117
+ "triggerPopValue": "VWh0dG_triggerPopValue",
118
+ "shareSegTool": "VWh0dG_shareSegTool",
119
+ "triggerPopLabel": "VWh0dG_triggerPopLabel",
76
120
  "exportBar": "VWh0dG_exportBar",
77
- "liveCostItem": "VWh0dG_liveCostItem",
78
- "tabNav": "VWh0dG_tabNav",
121
+ "dashboardHead": "VWh0dG_dashboardHead",
122
+ "dashboardRight": "VWh0dG_dashboardRight",
123
+ "liveQuotaWarn": "VWh0dG_liveQuotaWarn",
124
+ "pricingTip": "VWh0dG_pricingTip",
79
125
  "dashboardModal": "VWh0dG_dashboardModal",
80
- "heroMain": "VWh0dG_heroMain",
81
- "providerGroupBalance": "VWh0dG_providerGroupBalance",
82
- "roundsBarCol": "VWh0dG_roundsBarCol",
83
- "kpiDetail": "VWh0dG_kpiDetail",
84
- "chartLegendLine": "VWh0dG_chartLegendLine",
126
+ "heatmapYearCell": "VWh0dG_heatmapYearCell",
127
+ "shareSegOff": "VWh0dG_shareSegOff",
128
+ "budgetFillOver": "VWh0dG_budgetFillOver",
129
+ "rateBadgeBuiltin": "VWh0dG_rateBadgeBuiltin",
130
+ "providerGroupTitle": "VWh0dG_providerGroupTitle",
131
+ "peakAlertPeak": "VWh0dG_peakAlertPeak",
132
+ "liveTierPeak": "VWh0dG_liveTierPeak",
133
+ "budgetInputWrap": "VWh0dG_budgetInputWrap",
85
134
  "shareValue": "VWh0dG_shareValue",
86
- "peakAlertHint": "VWh0dG_peakAlertHint",
87
- "subscriptionWindowLabel": "VWh0dG_subscriptionWindowLabel",
88
- "heatmapLegend": "VWh0dG_heatmapLegend",
89
- "chartTooltipRow": "VWh0dG_chartTooltipRow",
135
+ "heatmapGrid": "VWh0dG_heatmapGrid",
136
+ "hero": "VWh0dG_hero",
137
+ "budgetFillWarn": "VWh0dG_budgetFillWarn",
90
138
  "switchOn": "VWh0dG_switchOn",
91
139
  "emptyRow": "VWh0dG_emptyRow",
92
- "heatmapCell": "VWh0dG_heatmapCell",
93
- "roundsFlagBadge": "VWh0dG_roundsFlagBadge",
94
- "balanceDaysLow": "VWh0dG_balanceDaysLow",
95
- "providerGroupTitle": "VWh0dG_providerGroupTitle",
140
+ "rateBadge": "VWh0dG_rateBadge",
96
141
  "triggerSparkBar": "VWh0dG_triggerSparkBar",
97
- "peakAlertSelect": "VWh0dG_peakAlertSelect",
98
- "shareSegPeak": "VWh0dG_shareSegPeak",
99
- "exportLabel": "VWh0dG_exportLabel",
100
- "heroMeta": "VWh0dG_heroMeta",
101
- "budgetOverPulse": "VWh0dG_budgetOverPulse",
102
- "chartGrid": "VWh0dG_chartGrid",
103
142
  "rounds": "VWh0dG_rounds",
104
- "pricingToggleText": "VWh0dG_pricingToggleText",
105
- "liveCostSep": "VWh0dG_liveCostSep",
106
- "modelTable": "VWh0dG_modelTable",
107
- "heroSideItem": "VWh0dG_heroSideItem",
108
- "subscriptionWindow": "VWh0dG_subscriptionWindow",
109
- "panel": "VWh0dG_panel",
110
- "heatmapFooter": "VWh0dG_heatmapFooter",
111
- "rateBadgeLive": "VWh0dG_rateBadgeLive",
112
143
  "balanceDays": "VWh0dG_balanceDays",
113
- "chartAxisLabel": "VWh0dG_chartAxisLabel",
114
- "settingsTitle": "VWh0dG_settingsTitle",
115
- "closeButton": "VWh0dG_closeButton",
116
- "dashboardBody": "VWh0dG_dashboardBody",
117
- "panelHead": "VWh0dG_panelHead",
118
- "peakAlertIn": "VWh0dG_peakAlertIn",
119
- "heatmap": "VWh0dG_heatmap",
120
- "bandTag": "VWh0dG_bandTag",
121
- "shareLegend": "VWh0dG_shareLegend",
122
- "subscriptionCard": "VWh0dG_subscriptionCard",
123
- "chartStack": "VWh0dG_chartStack",
124
- "peakAlertText": "VWh0dG_peakAlertText",
125
- "rangeButton": "VWh0dG_rangeButton",
144
+ "peakAlertField": "VWh0dG_peakAlertField",
145
+ "providerGroupBalance": "VWh0dG_providerGroupBalance",
146
+ "peakAlertPanel": "VWh0dG_peakAlertPanel",
147
+ "peakAlertCheck": "VWh0dG_peakAlertCheck",
148
+ "heatmapCellEmpty": "VWh0dG_heatmapCellEmpty",
149
+ "peakAlertHint": "VWh0dG_peakAlertHint",
150
+ "bandPrice": "VWh0dG_bandPrice",
151
+ "bucketThird": "VWh0dG_bucketThird",
126
152
  "delta": "VWh0dG_delta",
127
- "heroSideSpacer": "VWh0dG_heroSideSpacer",
128
- "chartEmpty": "VWh0dG_chartEmpty",
129
- "healthBadgeOk": "VWh0dG_healthBadgeOk",
130
- "liveTierPeak": "VWh0dG_liveTierPeak",
131
- "tabPanel": "VWh0dG_tabPanel",
132
- "bucketSep": "VWh0dG_bucketSep",
133
- "modelDot": "VWh0dG_modelDot",
134
- "triggerSpark": "VWh0dG_triggerSpark",
135
- "heroSideLabel": "VWh0dG_heroSideLabel",
136
- "pricingChevron": "VWh0dG_pricingChevron",
137
- "railButton": "VWh0dG_railButton",
153
+ "chartStack": "VWh0dG_chartStack",
154
+ "pricingToggle": "VWh0dG_pricingToggle",
155
+ "subscriptionFillWarn": "VWh0dG_subscriptionFillWarn",
156
+ "heatmap": "VWh0dG_heatmap",
157
+ "chartSvg": "VWh0dG_chartSvg",
158
+ "roundsBarLabel": "VWh0dG_roundsBarLabel",
159
+ "planTag": "VWh0dG_planTag",
160
+ "providerGroup": "VWh0dG_providerGroup",
138
161
  "bandPriceOff": "VWh0dG_bandPriceOff",
139
- "triggerSub": "VWh0dG_triggerSub",
140
- "heroGaugeTrack": "VWh0dG_heroGaugeTrack",
141
- "bucketOfficial": "VWh0dG_bucketOfficial",
142
- "healthBadgeBad": "VWh0dG_healthBadgeBad",
143
- "triggerWrap": "VWh0dG_triggerWrap",
144
- "dashboardSubtitle": "VWh0dG_dashboardSubtitle",
145
- "kpiValue": "VWh0dG_kpiValue",
146
- "dashboardRight": "VWh0dG_dashboardRight",
147
- "peakAlertOff": "VWh0dG_peakAlertOff",
148
- "liveQuotaWarn": "VWh0dG_liveQuotaWarn",
149
- "uncataloguedTag": "VWh0dG_uncataloguedTag",
162
+ "tabPanel": "VWh0dG_tabPanel",
163
+ "budgetTrack": "VWh0dG_budgetTrack",
164
+ "shareSeg": "VWh0dG_shareSeg",
165
+ "kpiTile": "VWh0dG_kpiTile",
166
+ "triggerIcon": "VWh0dG_triggerIcon",
167
+ "heroGaugePctOver": "VWh0dG_heroGaugePctOver",
150
168
  "trigger": "VWh0dG_trigger",
151
- "subscriptionFillOver": "VWh0dG_subscriptionFillOver",
169
+ "budgetOverPulse": "VWh0dG_budgetOverPulse",
170
+ "peakAlertSelect": "VWh0dG_peakAlertSelect",
171
+ "budgetUnit": "VWh0dG_budgetUnit",
152
172
  "subscriptionTrack": "VWh0dG_subscriptionTrack",
153
- "costCol": "VWh0dG_costCol",
154
- "budgetHint": "VWh0dG_budgetHint",
155
- "providerGroupHead": "VWh0dG_providerGroupHead",
156
- "rangeToggle": "VWh0dG_rangeToggle",
157
- "chartTooltipSwatch": "VWh0dG_chartTooltipSwatch",
173
+ "pricingToggleText": "VWh0dG_pricingToggleText",
158
174
  "roundsEmpty": "VWh0dG_roundsEmpty",
159
- "shareSegAssistant": "VWh0dG_shareSegAssistant",
160
- "chartLegendBar": "VWh0dG_chartLegendBar",
161
- "trendPanel": "VWh0dG_trendPanel",
162
- "modelCell": "VWh0dG_modelCell",
163
- "pricingToggle": "VWh0dG_pricingToggle",
164
- "healthBadge": "VWh0dG_healthBadge",
165
- "budgetValue": "VWh0dG_budgetValue",
166
- "providerGroupBalanceLabel": "VWh0dG_providerGroupBalanceLabel",
167
- "peakAlertCorner": "VWh0dG_peakAlertCorner",
168
- "modelName": "VWh0dG_modelName",
169
- "na": "VWh0dG_na",
170
- "heroValue": "VWh0dG_heroValue",
171
- "budgetUnit": "VWh0dG_budgetUnit",
172
- "dashboardIn": "VWh0dG_dashboardIn",
173
- "kpiLabel": "VWh0dG_kpiLabel",
174
- "switchKnob": "VWh0dG_switchKnob",
175
- "peakAlertCenter": "VWh0dG_peakAlertCenter",
175
+ "settingsHead": "VWh0dG_settingsHead",
176
+ "subscriptionWindowLabel": "VWh0dG_subscriptionWindowLabel",
177
+ "dashboardSubtitle": "VWh0dG_dashboardSubtitle",
178
+ "shareSegUser": "VWh0dG_shareSegUser",
179
+ "peakAlertPanelLabel": "VWh0dG_peakAlertPanelLabel",
176
180
  "panelTitle": "VWh0dG_panelTitle",
177
- "chartSvg": "VWh0dG_chartSvg",
178
- "rateBadge": "VWh0dG_rateBadge",
179
- "roundsAxis": "VWh0dG_roundsAxis",
180
- "bucketSummary": "VWh0dG_bucketSummary",
181
- "tableScroll": "VWh0dG_tableScroll",
182
- "heroGaugeLabel": "VWh0dG_heroGaugeLabel",
183
- "triggerPop": "VWh0dG_triggerPop",
184
- "liveCostBar": "VWh0dG_liveCostBar",
185
- "subscriptionFill": "VWh0dG_subscriptionFill",
186
- "subscriptionFillWarn": "VWh0dG_subscriptionFillWarn",
187
- "peakAlertPreview": "VWh0dG_peakAlertPreview",
188
- "heroCurrency": "VWh0dG_heroCurrency",
189
- "triggerPopBar": "VWh0dG_triggerPopBar",
190
- "deltaDown": "VWh0dG_deltaDown",
181
+ "providerGroupBadge": "VWh0dG_providerGroupBadge",
182
+ "peakAlertPanelHead": "VWh0dG_peakAlertPanelHead",
183
+ "settingsHint": "VWh0dG_settingsHint",
184
+ "heatmapYearGrid": "VWh0dG_heatmapYearGrid",
185
+ "bucketStatSub": "VWh0dG_bucketStatSub",
186
+ "shareSegPeak": "VWh0dG_shareSegPeak",
191
187
  "rangeButtonActive": "VWh0dG_rangeButtonActive",
192
- "healthIdle": "VWh0dG_healthIdle",
193
- "kpiGrid": "VWh0dG_kpiGrid",
194
- "healthBad": "VWh0dG_healthBad",
195
- "peakAlertClose": "VWh0dG_peakAlertClose",
196
- "triggerPopBars": "VWh0dG_triggerPopBars",
197
- "roundsBars": "VWh0dG_roundsBars",
198
- "peakAlertCheck": "VWh0dG_peakAlertCheck",
199
- "shareSeg": "VWh0dG_shareSeg",
200
- "tabPanelIn": "VWh0dG_tabPanelIn",
188
+ "bucketOfficial": "VWh0dG_bucketOfficial",
201
189
  "chartWrap": "VWh0dG_chartWrap",
202
- "heatmapCellEmpty": "VWh0dG_heatmapCellEmpty",
203
- "subscriptionHead": "VWh0dG_subscriptionHead",
204
- "bucketStatValue": "VWh0dG_bucketStatValue",
205
- "chartLegend": "VWh0dG_chartLegend",
206
- "dashboard": "VWh0dG_dashboard",
207
- "currencyToggle": "VWh0dG_currencyToggle",
208
- "providerGroupName": "VWh0dG_providerGroupName",
209
- "exportButton": "VWh0dG_exportButton",
210
- "liveQuotaCrit": "VWh0dG_liveQuotaCrit",
190
+ "healthBadgeBad": "VWh0dG_healthBadgeBad",
191
+ "panelHint": "VWh0dG_panelHint",
192
+ "subscriptionWindow": "VWh0dG_subscriptionWindow",
193
+ "heatmapYearScroll": "VWh0dG_heatmapYearScroll",
194
+ "shareLegend": "VWh0dG_shareLegend",
195
+ "kpiGreen": "VWh0dG_kpiGreen",
196
+ "dashboardTitle": "VWh0dG_dashboardTitle",
197
+ "liveTierOff": "VWh0dG_liveTierOff",
198
+ "subscriptionFill": "VWh0dG_subscriptionFill",
199
+ "healthIdle": "VWh0dG_healthIdle",
200
+ "heroGaugeLabel": "VWh0dG_heroGaugeLabel",
201
+ "peakAlertPanelBody": "VWh0dG_peakAlertPanelBody",
202
+ "triggerRow": "VWh0dG_triggerRow",
203
+ "healthBadgeOk": "VWh0dG_healthBadgeOk",
211
204
  "peakAlertCountdown": "VWh0dG_peakAlertCountdown",
212
- "shareSegOff": "VWh0dG_shareSegOff",
213
- "bandPrice": "VWh0dG_bandPrice",
214
- "bucketThird": "VWh0dG_bucketThird",
205
+ "chartBar": "VWh0dG_chartBar",
206
+ "triggerPopBars": "VWh0dG_triggerPopBars",
207
+ "providerGroupHead": "VWh0dG_providerGroupHead",
208
+ "budgetInput": "VWh0dG_budgetInput",
209
+ "triggerAmount": "VWh0dG_triggerAmount",
210
+ "heroSideValue": "VWh0dG_heroSideValue",
211
+ "bucketSummary": "VWh0dG_bucketSummary",
215
212
  "currencyButtonActive": "VWh0dG_currencyButtonActive",
216
- "subscriptionStatus": "VWh0dG_subscriptionStatus",
217
- "subscriptionPlan": "VWh0dG_subscriptionPlan",
218
- "peakAlertPeak": "VWh0dG_peakAlertPeak",
213
+ "healthBadge": "VWh0dG_healthBadge",
214
+ "rangeButton": "VWh0dG_rangeButton",
215
+ "subscriptionExhausted": "VWh0dG_subscriptionExhausted",
216
+ "dashboardIn": "VWh0dG_dashboardIn",
217
+ "subscriptionFillOver": "VWh0dG_subscriptionFillOver",
218
+ "heatmapFooter": "VWh0dG_heatmapFooter",
219
+ "balanceCell": "VWh0dG_balanceCell",
220
+ "heroGaugeArcOver": "VWh0dG_heroGaugeArcOver",
221
+ "pricingChevronOpen": "VWh0dG_pricingChevronOpen",
222
+ "tabNav": "VWh0dG_tabNav",
223
+ "heroSideLabel": "VWh0dG_heroSideLabel",
224
+ "tableScroll": "VWh0dG_tableScroll",
225
+ "heatmapLegend": "VWh0dG_heatmapLegend",
219
226
  "headTitleRow": "VWh0dG_headTitleRow",
220
- "rateBadgeBuiltin": "VWh0dG_rateBadgeBuiltin",
221
- "healthDot": "VWh0dG_healthDot",
222
- "peakAlert": "VWh0dG_peakAlert",
223
- "heroTop": "VWh0dG_heroTop",
224
- "shareTrack": "VWh0dG_shareTrack",
225
- "triggerBody": "VWh0dG_triggerBody",
226
- "triggerAmount": "VWh0dG_triggerAmount",
227
- "heroLabel": "VWh0dG_heroLabel",
228
- "subscriptionReset": "VWh0dG_subscriptionReset",
227
+ "subscriptionPlan": "VWh0dG_subscriptionPlan",
228
+ "roundsBar": "VWh0dG_roundsBar",
229
229
  "roundsBarFlagged": "VWh0dG_roundsBarFlagged",
230
- "heroGaugeSvg": "VWh0dG_heroGaugeSvg",
231
- "chartLine": "VWh0dG_chartLine",
232
- "flatTag": "VWh0dG_flatTag",
233
- "budgetControls": "VWh0dG_budgetControls",
234
- "subscriptionName": "VWh0dG_subscriptionName",
235
- "heatmapHover": "VWh0dG_heatmapHover",
236
- "heroGaugeArcOver": "VWh0dG_heroGaugeArcOver",
237
- "bucketCost": "VWh0dG_bucketCost",
238
- "liveTierOff": "VWh0dG_liveTierOff",
239
- "heroSideValue": "VWh0dG_heroSideValue",
240
- "roundsBarWrap": "VWh0dG_roundsBarWrap",
241
- "tabButtonActive": "VWh0dG_tabButtonActive",
242
- "triggerPopValue": "VWh0dG_triggerPopValue",
230
+ "railButton": "VWh0dG_railButton",
231
+ "triggerPopBar": "VWh0dG_triggerPopBar",
232
+ "panel": "VWh0dG_panel",
233
+ "switchKnob": "VWh0dG_switchKnob",
234
+ "healthOk": "VWh0dG_healthOk",
235
+ "liveCostSep": "VWh0dG_liveCostSep",
236
+ "subscriptionStatus": "VWh0dG_subscriptionStatus",
237
+ "triggerWrap": "VWh0dG_triggerWrap",
238
+ "budgetLabel": "VWh0dG_budgetLabel",
243
239
  "chartDot": "VWh0dG_chartDot",
244
- "bucketStatSub": "VWh0dG_bucketStatSub",
245
- "budgetInputWrap": "VWh0dG_budgetInputWrap",
246
- "chartCrosshair": "VWh0dG_chartCrosshair",
240
+ "roundsBarColPeak": "VWh0dG_roundsBarColPeak",
241
+ "heroLabel": "VWh0dG_heroLabel",
247
242
  "triggerPopRow": "VWh0dG_triggerPopRow",
248
- "triggerPopLabel": "VWh0dG_triggerPopLabel",
249
- "subscriptionExhausted": "VWh0dG_subscriptionExhausted",
243
+ "tabButton": "VWh0dG_tabButton",
244
+ "kpiLabel": "VWh0dG_kpiLabel",
245
+ "na": "VWh0dG_na",
246
+ "modelTableScroll": "VWh0dG_modelTableScroll",
247
+ "peakAlertClose": "VWh0dG_peakAlertClose",
248
+ "tabButtonActive": "VWh0dG_tabButtonActive",
249
+ "roundsFlagBadge": "VWh0dG_roundsFlagBadge",
250
+ "pluginInfoLabel": "VWh0dG_pluginInfoLabel",
251
+ "exportButton": "VWh0dG_exportButton",
250
252
  "peakAlertTag": "VWh0dG_peakAlertTag",
253
+ "panelHead": "VWh0dG_panelHead",
254
+ "subscriptionReset": "VWh0dG_subscriptionReset",
255
+ "shareItem": "VWh0dG_shareItem",
256
+ "shareTrack": "VWh0dG_shareTrack",
257
+ "roundsBarCol": "VWh0dG_roundsBarCol",
258
+ "heroGaugeSvg": "VWh0dG_heroGaugeSvg",
251
259
  "heroGaugePct": "VWh0dG_heroGaugePct",
252
- "balanceCell": "VWh0dG_balanceCell",
253
- "triggerSparkHot": "VWh0dG_triggerSparkHot",
254
- "budgetTrack": "VWh0dG_budgetTrack",
255
- "modelTableScroll": "VWh0dG_modelTableScroll",
256
- "providerGroupBadge": "VWh0dG_providerGroupBadge",
257
- "heroGaugeCenter": "VWh0dG_heroGaugeCenter",
258
- "pricingTable": "VWh0dG_pricingTable",
259
- "numCol": "VWh0dG_numCol",
260
- "settingsHead": "VWh0dG_settingsHead",
261
- "peakAlertNum": "VWh0dG_peakAlertNum",
262
- "roundsFlagMark": "VWh0dG_roundsFlagMark",
263
- "chartBar": "VWh0dG_chartBar",
264
- "peakAlertPanelBody": "VWh0dG_peakAlertPanelBody",
260
+ "liveQuotaCrit": "VWh0dG_liveQuotaCrit",
261
+ "peakAlert": "VWh0dG_peakAlert",
262
+ "peakAlertText": "VWh0dG_peakAlertText",
263
+ "peakAlertPreview": "VWh0dG_peakAlertPreview",
265
264
  "providerGroupMeta": "VWh0dG_providerGroupMeta",
266
- "budgetFillOver": "VWh0dG_budgetFillOver",
265
+ "roundsBarColOff": "VWh0dG_roundsBarColOff",
266
+ "balanceDaysLow": "VWh0dG_balanceDaysLow",
267
+ "shareSegAssistant": "VWh0dG_shareSegAssistant",
268
+ "heroSide": "VWh0dG_heroSide",
269
+ "peakAlertCenter": "VWh0dG_peakAlertCenter",
270
+ "subscriptionCard": "VWh0dG_subscriptionCard",
271
+ "chartCrosshair": "VWh0dG_chartCrosshair",
272
+ "roundsBarWrap": "VWh0dG_roundsBarWrap",
273
+ "triggerBody": "VWh0dG_triggerBody",
274
+ "pluginInfoRow": "VWh0dG_pluginInfoRow",
275
+ "heroMain": "VWh0dG_heroMain",
276
+ "modelProvider": "VWh0dG_modelProvider",
277
+ "exportLabel": "VWh0dG_exportLabel",
278
+ "providerGroupName": "VWh0dG_providerGroupName",
279
+ "bucketStatLabel": "VWh0dG_bucketStatLabel",
280
+ "chartEmpty": "VWh0dG_chartEmpty",
281
+ "currencyToggle": "VWh0dG_currencyToggle",
282
+ "chartGrid": "VWh0dG_chartGrid",
267
283
  "subscriptionGrid": "VWh0dG_subscriptionGrid",
268
- "pricingChevronOpen": "VWh0dG_pricingChevronOpen",
269
- "triggerIcon": "VWh0dG_triggerIcon",
270
- "triggerRow": "VWh0dG_triggerRow",
271
- "roundsBarColOff": "VWh0dG_roundsBarColOff",
272
- "pricingTip": "VWh0dG_pricingTip",
273
- "budget": "VWh0dG_budget",
274
- "heroSide": "VWh0dG_heroSide",
275
- "panelHint": "VWh0dG_panelHint",
276
- "budgetHead": "VWh0dG_budgetHead",
277
- "settingsHint": "VWh0dG_settingsHint",
278
- "chartTooltip": "VWh0dG_chartTooltip",
279
- "hero": "VWh0dG_hero",
280
- "kpiTile": "VWh0dG_kpiTile"
284
+ "heroValue": "VWh0dG_heroValue",
285
+ "modelName": "VWh0dG_modelName",
286
+ "liveCostBar": "VWh0dG_liveCostBar",
287
+ "peakAlertCorner": "VWh0dG_peakAlertCorner",
288
+ "trendPanel": "VWh0dG_trendPanel",
289
+ "heatmapCell": "VWh0dG_heatmapCell",
290
+ "heroReadout": "VWh0dG_heroReadout"
281
291
  };
282
292
  //#endregion
283
293
  //#region src/client/plan-knowledge.ts
294
+ /**
295
+ * 订阅/计划 provider id → plan 知识(引用 dsh-spend 的 code/token 双口径)。
296
+ * 覆盖我们实际会识别到的订阅通道;其余按量 API 不计入此表(默认 token)。
297
+ */
298
+ const PLAN_KNOWLEDGE = {
299
+ "opencode-go": {
300
+ type: "code",
301
+ subscriptionCny: 70,
302
+ tier: {
303
+ amount: 10,
304
+ currency: "USD",
305
+ periodDays: 7,
306
+ label: "周额度 $30"
307
+ }
308
+ },
309
+ opencode: {
310
+ type: "code",
311
+ subscriptionCny: 70,
312
+ tier: {
313
+ amount: 10,
314
+ currency: "USD",
315
+ periodDays: 7,
316
+ label: "周额度 $30"
317
+ }
318
+ },
319
+ "kimi-coding": {
320
+ type: "code",
321
+ subscriptionCny: 0
322
+ },
323
+ "zai-coding-cn": {
324
+ type: "code",
325
+ subscriptionCny: 0
326
+ },
327
+ "zai-coding": {
328
+ type: "code",
329
+ subscriptionCny: 0
330
+ },
331
+ "qwen-token-plan": {
332
+ type: "code",
333
+ subscriptionCny: 0
334
+ },
335
+ "qwen-token-plan-cn": {
336
+ type: "code",
337
+ subscriptionCny: 0
338
+ },
339
+ "xiaomi-token-plan-ams": {
340
+ type: "code",
341
+ subscriptionCny: 0
342
+ },
343
+ "xiaomi-token-plan-cn": {
344
+ type: "code",
345
+ subscriptionCny: 0
346
+ },
347
+ "xiaomi-token-plan-sgp": {
348
+ type: "code",
349
+ subscriptionCny: 0
350
+ },
351
+ "volcengine-token-plan": {
352
+ type: "code",
353
+ subscriptionCny: 0
354
+ },
355
+ "ark-token-plan": {
356
+ type: "code",
357
+ subscriptionCny: 0
358
+ },
359
+ "doubao-token-plan": {
360
+ type: "code",
361
+ subscriptionCny: 0
362
+ },
363
+ "minimax": {
364
+ type: "code",
365
+ subscriptionCny: 0
366
+ },
367
+ "minimax-token-plan": {
368
+ type: "code",
369
+ subscriptionCny: 0
370
+ }
371
+ };
372
+ /** 自动识别的档位月费与周期额度口径(订阅卡片展示);无档位知识返回 undefined。 */
373
+ function tierInfoOf(providerId) {
374
+ const entry = PLAN_KNOWLEDGE[providerId];
375
+ return entry?.type === "code" ? entry.tier : void 0;
376
+ }
284
377
  const FALLBACK_RATES = [
285
378
  {
286
379
  key: "deepseek-v4-flash",
@@ -453,9 +546,10 @@ window.__ModuleLoader__.load({
453
546
  nextSwitchInMs: boundaryMs - dayMs
454
547
  };
455
548
  }
549
+ const firstBoundary = TIER_BOUNDARY_MINUTES[0] ?? 0;
456
550
  return {
457
551
  tier: tierAt(nowMs),
458
- nextSwitchInMs: 864e5 - dayMs + TIER_BOUNDARY_MINUTES[0] * 6e4
552
+ nextSwitchInMs: 864e5 - dayMs + firstBoundary * 6e4
459
553
  };
460
554
  }
461
555
  /**
@@ -1265,9 +1359,9 @@ window.__ModuleLoader__.load({
1265
1359
  * surface stays self-contained and offline.
1266
1360
  */
1267
1361
  /** Fixed viewBox; the SVG scales to its container. */
1268
- const W = 680;
1269
- const H = 220;
1270
- const PAD = {
1362
+ const W$1 = 680;
1363
+ const H$1 = 220;
1364
+ const PAD$1 = {
1271
1365
  top: 18,
1272
1366
  right: 40,
1273
1367
  bottom: 26,
@@ -1309,16 +1403,16 @@ window.__ModuleLoader__.load({
1309
1403
  const layout = (0, react.useMemo)(() => {
1310
1404
  const n = data.length;
1311
1405
  if (n === 0) return null;
1312
- const plotW = W - PAD.left - PAD.right;
1313
- const plotH = H - PAD.top - PAD.bottom;
1406
+ const plotW = W$1 - PAD$1.left - PAD$1.right;
1407
+ const plotH = H$1 - PAD$1.top - PAD$1.bottom;
1314
1408
  const inner = (i) => {
1315
- if (n === 1) return PAD.left + plotW / 2;
1316
- return PAD.left + plotW * i / (n - 1);
1409
+ if (n === 1) return PAD$1.left + plotW / 2;
1410
+ return PAD$1.left + plotW * i / (n - 1);
1317
1411
  };
1318
1412
  const maxCost = Math.max(...data.map((d) => Math.max(d.cost, Object.values(d.byModel ?? {}).reduce((sum, v) => sum + v, 0))), 1e-4);
1319
- const yCost = (value) => PAD.top + plotH - value / maxCost * plotH;
1413
+ const yCost = (value) => PAD$1.top + plotH - value / maxCost * plotH;
1320
1414
  const maxCalls = Math.max(...data.map((d) => d.calls), 1);
1321
- const yCalls = (value) => PAD.top + plotH - value / maxCalls * plotH;
1415
+ const yCalls = (value) => PAD$1.top + plotH - value / maxCalls * plotH;
1322
1416
  const groupW = plotW / n;
1323
1417
  const barW = Math.min(18, groupW * .6);
1324
1418
  return {
@@ -1387,7 +1481,7 @@ window.__ModuleLoader__.load({
1387
1481
  className: UsageBilling_module_css_default.chartWrap,
1388
1482
  children: [
1389
1483
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
1390
- viewBox: `0 0 ${W} ${H}`,
1484
+ viewBox: `0 0 ${W$1} ${H$1}`,
1391
1485
  className: UsageBilling_module_css_default.chartSvg,
1392
1486
  role: "img",
1393
1487
  "aria-label": "Daily cost by model and total calls",
@@ -1396,7 +1490,7 @@ window.__ModuleLoader__.load({
1396
1490
  },
1397
1491
  onMouseMove: (e) => {
1398
1492
  const rect = e.currentTarget.getBoundingClientRect();
1399
- const ratio = ((e.clientX - rect.left) / rect.width * W - PAD.left) / plotW;
1493
+ const ratio = ((e.clientX - rect.left) / rect.width * W$1 - PAD$1.left) / plotW;
1400
1494
  const index = Math.round(ratio * (n - 1));
1401
1495
  setHover(Math.min(Math.max(index, 0), n - 1));
1402
1496
  },
@@ -1404,13 +1498,13 @@ window.__ModuleLoader__.load({
1404
1498
  costTicks.map((value, idx) => {
1405
1499
  const y = yCost(value);
1406
1500
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("g", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("line", {
1407
- x1: PAD.left,
1408
- x2: W - PAD.right,
1501
+ x1: PAD$1.left,
1502
+ x2: W$1 - PAD$1.right,
1409
1503
  y1: y,
1410
1504
  y2: y,
1411
1505
  className: UsageBilling_module_css_default.chartGrid
1412
1506
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("text", {
1413
- x: PAD.left - 8,
1507
+ x: PAD$1.left - 8,
1414
1508
  y: y + 3,
1415
1509
  textAnchor: "end",
1416
1510
  className: UsageBilling_module_css_default.chartAxisLabel,
@@ -1434,7 +1528,7 @@ window.__ModuleLoader__.load({
1434
1528
  callsTicks.map((value, idx) => {
1435
1529
  const y = yCalls(value);
1436
1530
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("text", {
1437
- x: W - PAD.right + 8,
1531
+ x: W$1 - PAD$1.right + 8,
1438
1532
  y: y + 3,
1439
1533
  textAnchor: "start",
1440
1534
  className: UsageBilling_module_css_default.chartAxisLabel,
@@ -1446,7 +1540,7 @@ window.__ModuleLoader__.load({
1446
1540
  if (point === void 0) return null;
1447
1541
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("text", {
1448
1542
  x: inner(i),
1449
- y: H - 6,
1543
+ y: H$1 - 6,
1450
1544
  textAnchor: "middle",
1451
1545
  className: UsageBilling_module_css_default.chartAxisLabel,
1452
1546
  children: shortDate(point.date)
@@ -1455,8 +1549,8 @@ window.__ModuleLoader__.load({
1455
1549
  hover !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("line", {
1456
1550
  x1: inner(hover),
1457
1551
  x2: inner(hover),
1458
- y1: PAD.top,
1459
- y2: PAD.top + plotH,
1552
+ y1: PAD$1.top,
1553
+ y2: PAD$1.top + plotH,
1460
1554
  className: UsageBilling_module_css_default.chartCrosshair
1461
1555
  })
1462
1556
  ]
@@ -1464,8 +1558,8 @@ window.__ModuleLoader__.load({
1464
1558
  activePoint !== void 0 && hover !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1465
1559
  className: UsageBilling_module_css_default.chartTooltip,
1466
1560
  style: {
1467
- left: `${inner(hover) / W * 100}%`,
1468
- top: `${yCost(activePoint.cost) / H * 100}%`
1561
+ left: `${inner(hover) / W$1 * 100}%`,
1562
+ top: `${yCost(activePoint.cost) / H$1 * 100}%`
1469
1563
  },
1470
1564
  children: [
1471
1565
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
@@ -1513,6 +1607,401 @@ window.__ModuleLoader__.load({
1513
1607
  });
1514
1608
  }
1515
1609
  //#endregion
1610
+ //#region src/client/PerfPanel.tsx
1611
+ /**
1612
+ * PerfPanel: per-model latency/perf table + per-hour TTFT/generation-speed curve.
1613
+ *
1614
+ * Reads the optional `perf` field of the usage-stats document (aggregated by
1615
+ * the host from session logs). Renders a per-model table of TTFT mean/P50/P90,
1616
+ * generation speed, total latency and estimated-step count, plus a small
1617
+ * dependency-free SVG twin-series hourly curve (TTFT in ms on the left axis,
1618
+ * tokens/s on the right). Absent `perf` (older snapshot or stream-less logs)
1619
+ * renders an empty state; the panel never fabricates samples.
1620
+ */
1621
+ /** Fixed viewBox for the hourly curve; the SVG scales to its container. */
1622
+ const W = 680;
1623
+ const H = 180;
1624
+ const PAD = {
1625
+ top: 14,
1626
+ right: 42,
1627
+ bottom: 22,
1628
+ left: 46
1629
+ };
1630
+ /** 最近窗口内的小时点(键升序,尾部补齐空白,最旧在前)。 */
1631
+ function sortHourPoints(byHour) {
1632
+ const keys = Object.keys(byHour).sort();
1633
+ const points = [];
1634
+ for (const key of keys.slice(-48)) {
1635
+ const data = byHour[key];
1636
+ if (data === void 0) continue;
1637
+ points.push({
1638
+ key,
1639
+ ttftMs: data.ttftAvg,
1640
+ ...data.tpsAvg === void 0 ? {} : { tps: data.tpsAvg }
1641
+ });
1642
+ }
1643
+ return points;
1644
+ }
1645
+ /** 短小时标签 `MM-DD HH`(跨天在小时键上有日期,直接截取即可辨识)。 */
1646
+ function shortHour(key) {
1647
+ return key.slice(5, 13).replace("T", " ");
1648
+ }
1649
+ /**
1650
+ * Render the performance panel.
1651
+ * @param props.perf - the optional perf doc; `undefined`/empty renders an empty state.
1652
+ * @param props.models - model legend (key/name/color) for the table swatches and curve legend.
1653
+ * @param props.t - locale function.
1654
+ */
1655
+ function PerfPanel({ perf, models, t }) {
1656
+ const colorOf = (model) => models.find((m) => m.key === model)?.color ?? "#8b95a3";
1657
+ const rows = (0, react.useMemo)(() => {
1658
+ if (perf === void 0) return [];
1659
+ return Object.entries(perf.byModel).map(([key, data]) => ({
1660
+ key,
1661
+ name: models.find((m) => m.key === key)?.name ?? key,
1662
+ color: colorOf(key),
1663
+ samples: data.samples,
1664
+ ttftAvg: data.ttftAvg,
1665
+ ttftP50: data.ttftP50,
1666
+ ttftP90: data.ttftP90,
1667
+ ...data.tpsAvg === void 0 ? {} : { tpsAvg: data.tpsAvg },
1668
+ latencyAvg: data.latencyAvg,
1669
+ estimatedSamples: data.estimatedSamples
1670
+ })).sort((a, b) => b.samples - a.samples || b.ttftP90 - a.ttftP90);
1671
+ }, [perf, models]);
1672
+ const hourLayout = (0, react.useMemo)(() => {
1673
+ const points = perf === void 0 ? [] : sortHourPoints(perf.byHour);
1674
+ if (points.length === 0) return null;
1675
+ const n = points.length;
1676
+ const plotW = W - PAD.left - PAD.right;
1677
+ const plotH = H - PAD.top - PAD.bottom;
1678
+ const inner = (i) => n === 1 ? PAD.left + plotW / 2 : PAD.left + plotW * i / (n - 1);
1679
+ const maxTtft = Math.max(...points.map((p) => p.ttftMs), 1);
1680
+ const maxTps = Math.max(...points.map((p) => p.tps ?? 0), 1);
1681
+ const yTtft = (v) => PAD.top + plotH - v / maxTtft * plotH;
1682
+ const yTps = (v) => PAD.top + plotH - v / maxTps * plotH;
1683
+ const ttftPath = points.map((p, i) => `${i === 0 ? "M" : "L"}${inner(i)} ${yTtft(p.ttftMs)}`).join(" ");
1684
+ const tpsPath = points.some((p) => p.tps !== void 0) ? points.map((p, i) => `${i === 0 ? "M" : "L"}${inner(i)} ${yTps(p.tps ?? 0)}`).join(" ") : "";
1685
+ const step = Math.max(1, Math.ceil(n / 8));
1686
+ const indices = [];
1687
+ for (let i = 0; i < n; i += step) indices.push(i);
1688
+ if (n > 0 && indices[indices.length - 1] !== n - 1) indices.push(n - 1);
1689
+ return {
1690
+ points,
1691
+ n,
1692
+ inner,
1693
+ yTtft,
1694
+ ttftPath,
1695
+ tpsPath,
1696
+ indices,
1697
+ ttftTicks: [
1698
+ 0,
1699
+ .5,
1700
+ 1
1701
+ ].map((f) => maxTtft * f).reverse(),
1702
+ maxTps
1703
+ };
1704
+ }, [perf]);
1705
+ if (perf === void 0 || rows.length === 0) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1706
+ className: UsageBilling_module_css_default.chartEmpty,
1707
+ "data-testid": "billing-perf-empty",
1708
+ children: t("billing.perfEmpty")
1709
+ });
1710
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1711
+ "data-testid": "billing-perf-panel",
1712
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1713
+ className: UsageBilling_module_css_default.tableScroll,
1714
+ "data-testid": "billing-perf-table",
1715
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("table", {
1716
+ className: UsageBilling_module_css_default.modelTable,
1717
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("thead", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("tr", { children: [
1718
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", { children: t("billing.model") }),
1719
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
1720
+ className: UsageBilling_module_css_default.numCol,
1721
+ children: t("billing.perfSamples")
1722
+ }),
1723
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
1724
+ className: UsageBilling_module_css_default.numCol,
1725
+ children: t("billing.perfTtft")
1726
+ }),
1727
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
1728
+ className: UsageBilling_module_css_default.numCol,
1729
+ children: t("billing.perfP50")
1730
+ }),
1731
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
1732
+ className: UsageBilling_module_css_default.numCol,
1733
+ children: t("billing.perfP90")
1734
+ }),
1735
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
1736
+ className: UsageBilling_module_css_default.numCol,
1737
+ children: t("billing.perfTps")
1738
+ }),
1739
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
1740
+ className: UsageBilling_module_css_default.numCol,
1741
+ children: t("billing.perfLatency")
1742
+ }),
1743
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
1744
+ className: UsageBilling_module_css_default.numCol,
1745
+ children: t("billing.perfEstimated")
1746
+ })
1747
+ ] }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("tbody", { children: rows.map((row) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("tr", { children: [
1748
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
1749
+ className: UsageBilling_module_css_default.modelCell,
1750
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1751
+ className: UsageBilling_module_css_default.modelDot,
1752
+ style: { background: row.color }
1753
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1754
+ className: UsageBilling_module_css_default.modelName,
1755
+ children: row.name
1756
+ })]
1757
+ }) }),
1758
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
1759
+ className: UsageBilling_module_css_default.numCol,
1760
+ children: row.samples.toLocaleString()
1761
+ }),
1762
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("td", {
1763
+ className: UsageBilling_module_css_default.numCol,
1764
+ children: [row.ttftAvg.toFixed(0), " ms"]
1765
+ }),
1766
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("td", {
1767
+ className: UsageBilling_module_css_default.numCol,
1768
+ children: [row.ttftP50.toFixed(0), " ms"]
1769
+ }),
1770
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("td", {
1771
+ className: UsageBilling_module_css_default.numCol,
1772
+ children: [row.ttftP90.toFixed(0), " ms"]
1773
+ }),
1774
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
1775
+ className: UsageBilling_module_css_default.numCol,
1776
+ children: row.tpsAvg === void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1777
+ className: UsageBilling_module_css_default.na,
1778
+ children: "—"
1779
+ }) : `${row.tpsAvg.toFixed(1)}`
1780
+ }),
1781
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("td", {
1782
+ className: UsageBilling_module_css_default.numCol,
1783
+ children: [row.latencyAvg.toFixed(0), " ms"]
1784
+ }),
1785
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
1786
+ className: UsageBilling_module_css_default.numCol,
1787
+ children: row.estimatedSamples > 0 ? row.estimatedSamples : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1788
+ className: UsageBilling_module_css_default.na,
1789
+ children: "—"
1790
+ })
1791
+ })
1792
+ ] }, row.key)) })]
1793
+ })
1794
+ }), hourLayout !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1795
+ className: UsageBilling_module_css_default.chartWrap,
1796
+ "data-testid": "billing-perf-hour",
1797
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
1798
+ viewBox: `0 0 ${W} ${H}`,
1799
+ className: UsageBilling_module_css_default.chartSvg,
1800
+ role: "img",
1801
+ "aria-label": "Hourly TTFT and generation speed by model",
1802
+ children: [
1803
+ hourLayout.ttftTicks.map((value, idx) => {
1804
+ const y = hourLayout.yTtft(value);
1805
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("g", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("line", {
1806
+ x1: PAD.left,
1807
+ x2: W - PAD.right,
1808
+ y1: y,
1809
+ y2: y,
1810
+ className: UsageBilling_module_css_default.chartGrid
1811
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("text", {
1812
+ x: PAD.left - 8,
1813
+ y: y + 3,
1814
+ textAnchor: "end",
1815
+ className: UsageBilling_module_css_default.chartAxisLabel,
1816
+ children: value.toFixed(0)
1817
+ })] }, `ttft-${idx}`);
1818
+ }),
1819
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
1820
+ d: hourLayout.ttftPath,
1821
+ fill: "none",
1822
+ className: UsageBilling_module_css_default.chartLine
1823
+ }),
1824
+ hourLayout.tpsPath !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
1825
+ d: hourLayout.tpsPath,
1826
+ fill: "none",
1827
+ className: UsageBilling_module_css_default.chartLine,
1828
+ style: {
1829
+ stroke: "var(--dsw-static-amber-500)",
1830
+ strokeDasharray: "4 4"
1831
+ }
1832
+ }),
1833
+ hourLayout.indices.map((i) => {
1834
+ const point = hourLayout.points[i];
1835
+ if (point === void 0) return null;
1836
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("text", {
1837
+ x: hourLayout.inner(i),
1838
+ y: H - 6,
1839
+ textAnchor: "middle",
1840
+ className: UsageBilling_module_css_default.chartAxisLabel,
1841
+ children: shortHour(point.key)
1842
+ }, point.key);
1843
+ }),
1844
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("text", {
1845
+ x: W - PAD.right + 8,
1846
+ y: PAD.top + 4,
1847
+ textAnchor: "start",
1848
+ className: UsageBilling_module_css_default.chartAxisLabel,
1849
+ children: [
1850
+ t("billing.perfTpsUnit"),
1851
+ " ",
1852
+ hourLayout.maxTps.toFixed(0)
1853
+ ]
1854
+ })
1855
+ ]
1856
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1857
+ className: UsageBilling_module_css_default.chartLegend,
1858
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [
1859
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: UsageBilling_module_css_default.chartLegendLine }),
1860
+ t("billing.perfTtft"),
1861
+ " (ms)"
1862
+ ] }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [
1863
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1864
+ className: UsageBilling_module_css_default.chartLegendLine,
1865
+ style: { background: "var(--dsw-static-amber-500)" }
1866
+ }),
1867
+ t("billing.perfTps"),
1868
+ " (",
1869
+ t("billing.perfTpsUnit"),
1870
+ ")"
1871
+ ] })]
1872
+ })]
1873
+ })]
1874
+ });
1875
+ }
1876
+ //#endregion
1877
+ //#region src/client/plugin-info.ts
1878
+ /**
1879
+ * 插件元信息(「设置 → 插件信息卡」展示):名称 / 描述 / 作者 / 仓库 / 许可证。
1880
+ * 版本号不含在此——由服务端从自身 package.json 读取(pluginVersion),
1881
+ * 这样发布版版本与源码单一来源,不会两处不同步。
1882
+ */
1883
+ /** npm 包名。 */
1884
+ const PLUGIN_NAME = "@kenz1117/dsh-ui-usage-billing";
1885
+ /** 一句话描述。 */
1886
+ const PLUGIN_DESCRIPTION = "Usage billing dashboard for DeepSeek Harness";
1887
+ /** 作者显示名。 */
1888
+ const PLUGIN_AUTHOR_NAME = "KenZ";
1889
+ /** 作者 GitHub 账号(仓库/作者页链接)。 */
1890
+ const PLUGIN_AUTHOR_HANDLE = "kenz1117";
1891
+ /** 源码仓库(可点击)。 */
1892
+ const PLUGIN_REPOSITORY = "https://github.com/kenz1117/dsh-ui-usage-billing";
1893
+ /** npm 包主页(可点击)。 */
1894
+ const PLUGIN_NPM_URL = "https://www.npmjs.com/package/@kenz1117/dsh-ui-usage-billing";
1895
+ //#endregion
1896
+ //#region src/client/PluginInfoCard.tsx
1897
+ /**
1898
+ * PluginInfoCard: 「设置 → 插件信息」卡——展示头像/作者、GitHub 仓库、版本号、
1899
+ * 许可证等插件元信息。版本号来自服务端 usage-stats 的 `pluginVersion`(读自
1900
+ * 包 package.json),其余元信息静态来自 `plugin-info.ts`。无版本号时显示 em dash。
1901
+ */
1902
+ /** 信息卡 props:locale 函数 + 版本号(服务端下发,可为空)。 */
1903
+ function PluginInfoCard({ t, version }) {
1904
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
1905
+ className: UsageBilling_module_css_default.panel,
1906
+ "data-testid": "billing-plugin-info",
1907
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1908
+ className: UsageBilling_module_css_default.panelHead,
1909
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
1910
+ className: UsageBilling_module_css_default.panelTitle,
1911
+ children: t("billing.pluginInfo")
1912
+ })
1913
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1914
+ className: UsageBilling_module_css_default.pluginInfo,
1915
+ children: [
1916
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1917
+ className: UsageBilling_module_css_default.pluginInfoRow,
1918
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1919
+ className: UsageBilling_module_css_default.pluginInfoLabel,
1920
+ children: t("billing.pluginName")
1921
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1922
+ className: UsageBilling_module_css_default.pluginInfoValue,
1923
+ children: PLUGIN_NAME
1924
+ })]
1925
+ }),
1926
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1927
+ className: UsageBilling_module_css_default.pluginInfoRow,
1928
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1929
+ className: UsageBilling_module_css_default.pluginInfoLabel,
1930
+ children: t("billing.pluginDescription")
1931
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1932
+ className: UsageBilling_module_css_default.pluginInfoValue,
1933
+ children: PLUGIN_DESCRIPTION
1934
+ })]
1935
+ }),
1936
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1937
+ className: UsageBilling_module_css_default.pluginInfoRow,
1938
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1939
+ className: UsageBilling_module_css_default.pluginInfoLabel,
1940
+ children: t("billing.pluginVersion")
1941
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1942
+ className: UsageBilling_module_css_default.pluginInfoValue,
1943
+ children: version === void 0 ? "—" : `v${version}`
1944
+ })]
1945
+ }),
1946
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1947
+ className: UsageBilling_module_css_default.pluginInfoRow,
1948
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1949
+ className: UsageBilling_module_css_default.pluginInfoLabel,
1950
+ children: t("billing.pluginAuthor")
1951
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("a", {
1952
+ className: UsageBilling_module_css_default.pluginInfoLink,
1953
+ href: `https://github.com/${PLUGIN_AUTHOR_HANDLE}`,
1954
+ target: "_blank",
1955
+ rel: "noreferrer",
1956
+ children: [
1957
+ PLUGIN_AUTHOR_NAME,
1958
+ " (",
1959
+ PLUGIN_AUTHOR_HANDLE,
1960
+ ")"
1961
+ ]
1962
+ })]
1963
+ }),
1964
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1965
+ className: UsageBilling_module_css_default.pluginInfoRow,
1966
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1967
+ className: UsageBilling_module_css_default.pluginInfoLabel,
1968
+ children: t("billing.pluginRepository")
1969
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
1970
+ className: UsageBilling_module_css_default.pluginInfoLink,
1971
+ href: PLUGIN_REPOSITORY,
1972
+ target: "_blank",
1973
+ rel: "noreferrer",
1974
+ children: PLUGIN_REPOSITORY
1975
+ })]
1976
+ }),
1977
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1978
+ className: UsageBilling_module_css_default.pluginInfoRow,
1979
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1980
+ className: UsageBilling_module_css_default.pluginInfoLabel,
1981
+ children: t("billing.pluginNpm")
1982
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
1983
+ className: UsageBilling_module_css_default.pluginInfoLink,
1984
+ href: PLUGIN_NPM_URL,
1985
+ target: "_blank",
1986
+ rel: "noreferrer",
1987
+ children: PLUGIN_NAME
1988
+ })]
1989
+ }),
1990
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1991
+ className: UsageBilling_module_css_default.pluginInfoRow,
1992
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1993
+ className: UsageBilling_module_css_default.pluginInfoLabel,
1994
+ children: t("billing.pluginLicense")
1995
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1996
+ className: UsageBilling_module_css_default.pluginInfoValue,
1997
+ children: "MIT"
1998
+ })]
1999
+ })
2000
+ ]
2001
+ })]
2002
+ });
2003
+ }
2004
+ //#endregion
1516
2005
  //#region src/client/round-chart.tsx
1517
2006
  /**
1518
2007
  * RoundCostChart: dependency-free per-turn cost bars with spike markers.
@@ -1686,23 +2175,106 @@ window.__ModuleLoader__.load({
1686
2175
  return weeks;
1687
2176
  }
1688
2177
  /**
1689
- * Render the month heatmap.
2178
+ * Build the GitHub-style year cells (column = week, row = Sunday..Saturday),
2179
+ * covering the last 52 weeks up to the current week. Future days render as
2180
+ * level-0 gray; the column-flow grid lays each week's 7 cells vertically.
2181
+ */
2182
+ function buildYearWeeks(days, now) {
2183
+ const byDate = /* @__PURE__ */ new Map();
2184
+ for (const day of days) byDate.set(day.date, day.value);
2185
+ let max = 0;
2186
+ for (const value of byDate.values()) if (value > max) max = value;
2187
+ const today = dayStamp(now);
2188
+ const thisSunday = new Date(now);
2189
+ thisSunday.setHours(0, 0, 0, 0);
2190
+ thisSunday.setDate(thisSunday.getDate() - thisSunday.getDay());
2191
+ const firstSunday = new Date(thisSunday);
2192
+ firstSunday.setDate(thisSunday.getDate() - 357);
2193
+ const weeks = [];
2194
+ for (let week = 0; week < 52; week += 1) {
2195
+ const row = [];
2196
+ for (let dow = 0; dow < 7; dow += 1) {
2197
+ const date = new Date(firstSunday);
2198
+ date.setDate(firstSunday.getDate() + week * 7 + dow);
2199
+ const iso = dayStamp(date);
2200
+ const future = iso > today;
2201
+ const value = future ? 0 : byDate.get(iso) ?? 0;
2202
+ let level = 0;
2203
+ if (!future && value > 0 && max > 0) {
2204
+ const scaled = Math.ceil(value / max * 4);
2205
+ level = Math.min(4, Math.max(1, scaled));
2206
+ }
2207
+ row.push({
2208
+ date: iso,
2209
+ dayNum: date.getDate(),
2210
+ value,
2211
+ level,
2212
+ placeholder: future
2213
+ });
2214
+ }
2215
+ weeks.push(row);
2216
+ }
2217
+ return weeks;
2218
+ }
2219
+ /**
2220
+ * Render the month or year heatmap.
1690
2221
  * @param props.days - daily cost rows (keys are `YYYY-MM-DD`).
1691
2222
  * @param props.currency - display currency for the hover amount.
1692
2223
  * @param props.now - anchor date (defaults to today); injectable for tests.
1693
2224
  * @param props.t - locale function (used for the legend labels).
2225
+ * @param props.range - `month` (calendar month) or `year` (last 52 weeks, GitHub style).
1694
2226
  */
1695
- function UsageHeatmap({ days, currency, now, t }) {
2227
+ function UsageHeatmap({ days, currency, now, t, range = "month" }) {
1696
2228
  const [hover, setHover] = (0, react.useState)(null);
1697
- const weeks = (0, react.useMemo)(() => buildMonthWeeks(days, now ?? /* @__PURE__ */ new Date()), [days, now]);
1698
2229
  const money = (cny) => formatMoney(currency === "usd" ? cnyToUsd(cny) : cny, currency);
2230
+ const monthWeeks = (0, react.useMemo)(() => buildMonthWeeks(days, now ?? /* @__PURE__ */ new Date()), [days, now]);
2231
+ if (range === "year") {
2232
+ const yearWeeks = buildYearWeeks(days, now ?? /* @__PURE__ */ new Date());
2233
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2234
+ className: UsageBilling_module_css_default.heatmap,
2235
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
2236
+ className: UsageBilling_module_css_default.heatmapYearScroll,
2237
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
2238
+ className: UsageBilling_module_css_default.heatmapYearGrid,
2239
+ role: "img",
2240
+ "aria-label": "yearly cost heatmap",
2241
+ "data-testid": "heatmap-year-grid",
2242
+ children: yearWeeks.flat().map((cell) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
2243
+ type: "button",
2244
+ className: UsageBilling_module_css_default.heatmapYearCell,
2245
+ "data-testid": "heatmap-year-cell",
2246
+ "data-level": cell.level,
2247
+ style: { background: LEVEL_COLORS[cell.level] },
2248
+ title: `${cell.date} · ${money(cell.value)}`,
2249
+ "aria-label": `${cell.date}: ${money(cell.value)}`
2250
+ }, cell.date))
2251
+ })
2252
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2253
+ className: UsageBilling_module_css_default.heatmapFooter,
2254
+ children: [
2255
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2256
+ className: UsageBilling_module_css_default.heatmapLegendText,
2257
+ children: t("billing.heatmapLess")
2258
+ }),
2259
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2260
+ className: UsageBilling_module_css_default.heatmapLegend,
2261
+ children: LEVEL_COLORS.map((color, level) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("i", { style: { background: color } }, level))
2262
+ }),
2263
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2264
+ className: UsageBilling_module_css_default.heatmapLegendText,
2265
+ children: t("billing.heatmapMore")
2266
+ })
2267
+ ]
2268
+ })]
2269
+ });
2270
+ }
1699
2271
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1700
2272
  className: UsageBilling_module_css_default.heatmap,
1701
2273
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1702
2274
  className: UsageBilling_module_css_default.heatmapGrid,
1703
2275
  role: "img",
1704
2276
  "aria-label": "daily cost heatmap",
1705
- children: weeks.map((week) => week.map((cell) => {
2277
+ children: monthWeeks.map((week) => week.map((cell) => {
1706
2278
  if (cell.placeholder) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1707
2279
  className: UsageBilling_module_css_default.heatmapCellEmpty,
1708
2280
  children: cell.dayNum
@@ -2026,7 +2598,31 @@ window.__ModuleLoader__.load({
2026
2598
  "billing.official": "官方",
2027
2599
  "billing.thirdParty": "三方",
2028
2600
  "billing.officialCost": "官方费用",
2029
- "billing.thirdPartyCost": "三方费用"
2601
+ "billing.thirdPartyCost": "三方费用",
2602
+ "billing.perfSamples": "样本",
2603
+ "billing.perfTtft": "首字延时",
2604
+ "billing.perfP50": "P50",
2605
+ "billing.perfP90": "P90",
2606
+ "billing.perfTps": "生成速度",
2607
+ "billing.perfLatency": "总延迟",
2608
+ "billing.perfEstimated": "估算样本",
2609
+ "billing.perfEmpty": "暂无性能数据",
2610
+ "billing.perfTpsUnit": "tok/s",
2611
+ "billing.perfTitle": "性能",
2612
+ "billing.perfHint": "按模型与按小时聚合;估算样本为工具续写步骤",
2613
+ "billing.heatmapYear": "年",
2614
+ "billing.heatmapMonth": "月",
2615
+ "billing.activeDays": "活跃天数",
2616
+ "billing.streakDays": "连续使用",
2617
+ "billing.subscriptionAutoDetect": "自动识别",
2618
+ "billing.pluginInfo": "插件信息",
2619
+ "billing.pluginName": "插件名",
2620
+ "billing.pluginDescription": "描述",
2621
+ "billing.pluginVersion": "版本",
2622
+ "billing.pluginAuthor": "作者",
2623
+ "billing.pluginRepository": "仓库",
2624
+ "billing.pluginNpm": "npm",
2625
+ "billing.pluginLicense": "许可证"
2030
2626
  };
2031
2627
  const en = {
2032
2628
  "billing.title": "Usage",
@@ -2167,7 +2763,31 @@ window.__ModuleLoader__.load({
2167
2763
  "billing.official": "Official",
2168
2764
  "billing.thirdParty": "Third-party",
2169
2765
  "billing.officialCost": "Official cost",
2170
- "billing.thirdPartyCost": "Third-party cost"
2766
+ "billing.thirdPartyCost": "Third-party cost",
2767
+ "billing.perfSamples": "Samples",
2768
+ "billing.perfTtft": "TTFT",
2769
+ "billing.perfP50": "P50",
2770
+ "billing.perfP90": "P90",
2771
+ "billing.perfTps": "Speed",
2772
+ "billing.perfLatency": "Total latency",
2773
+ "billing.perfEstimated": "Estimated",
2774
+ "billing.perfEmpty": "No performance data yet",
2775
+ "billing.perfTpsUnit": "tok/s",
2776
+ "billing.perfTitle": "Performance",
2777
+ "billing.perfHint": "Per model & per hour; estimated samples are tool-continuation steps",
2778
+ "billing.heatmapYear": "Year",
2779
+ "billing.heatmapMonth": "Month",
2780
+ "billing.activeDays": "Active days",
2781
+ "billing.streakDays": "Streak",
2782
+ "billing.subscriptionAutoDetect": "Auto",
2783
+ "billing.pluginInfo": "Plugin info",
2784
+ "billing.pluginName": "Name",
2785
+ "billing.pluginDescription": "Description",
2786
+ "billing.pluginVersion": "Version",
2787
+ "billing.pluginAuthor": "Author",
2788
+ "billing.pluginRepository": "Repository",
2789
+ "billing.pluginNpm": "npm",
2790
+ "billing.pluginLicense": "License"
2171
2791
  };
2172
2792
  //#endregion
2173
2793
  //#region src/client/provider-display.ts
@@ -2556,6 +3176,23 @@ window.__ModuleLoader__.load({
2556
3176
  offPeak
2557
3177
  };
2558
3178
  }
3179
+ /** 近 7 天费用序列(含今天,缺日补 0):触发卡 hover 速览的迷你柱数据源。
3180
+ * 导出供测试:纯函数(日期取本地时区)。 */
3181
+ function activeDaysOf(byDay) {
3182
+ return Object.keys(byDay).length;
3183
+ }
3184
+ /** 连续使用天数:从今天往前连续「有调用记录」的天数;今天无记录则为 0。
3185
+ * 导出供测试:纯函数(日期取本地时区)。 */
3186
+ function streakDaysOf(byDay, now = Date.now()) {
3187
+ let streak = 0;
3188
+ const cursor = new Date(now);
3189
+ for (;;) {
3190
+ if (!(localDayStamp(cursor.getTime()) in byDay)) break;
3191
+ streak += 1;
3192
+ cursor.setDate(cursor.getDate() - 1);
3193
+ }
3194
+ return streak;
3195
+ }
2559
3196
  /**
2560
3197
  * 近 7 天费用序列(含今天,缺日补 0):触发卡 hover 速览的迷你柱数据源。
2561
3198
  * 导出供测试:纯函数(日期取本地时区)。
@@ -2677,7 +3314,9 @@ window.__ModuleLoader__.load({
2677
3314
  ...Array.isArray(candidate.bySession) ? { bySession: candidate.bySession } : {},
2678
3315
  ...Array.isArray(candidate.byTurn) ? { byTurn: candidate.byTurn } : {},
2679
3316
  ...Array.isArray(candidate.byWorkspace) ? { byWorkspace: candidate.byWorkspace } : {},
2680
- ...candidate.byRole !== null && typeof candidate.byRole === "object" ? { byRole: candidate.byRole } : {}
3317
+ ...candidate.byRole !== null && typeof candidate.byRole === "object" ? { byRole: candidate.byRole } : {},
3318
+ ...candidate.perf !== null && typeof candidate.perf === "object" && candidate.perf.byModel !== null && typeof candidate.perf.byModel === "object" && candidate.perf.byHour !== null && typeof candidate.perf.byHour === "object" ? { perf: candidate.perf } : {},
3319
+ ...typeof candidate.pluginVersion === "string" ? { pluginVersion: candidate.pluginVersion } : {}
2681
3320
  };
2682
3321
  } catch {
2683
3322
  return null;
@@ -2856,7 +3495,7 @@ window.__ModuleLoader__.load({
2856
3495
  className: UsageBilling_module_css_default.triggerPopBars,
2857
3496
  children: sparkHeights.map((_h, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2858
3497
  className: UsageBilling_module_css_default.triggerPopBar,
2859
- style: { height: `${sparkMax > 0 ? 4 + days[index].cost / sparkMax * 18 : 4}px` }
3498
+ style: { height: `${sparkMax > 0 ? 4 + (days[index]?.cost ?? 0) / sparkMax * 18 : 4}px` }
2860
3499
  }, days[index]?.date ?? String(index)))
2861
3500
  })
2862
3501
  ]
@@ -2871,6 +3510,7 @@ window.__ModuleLoader__.load({
2871
3510
  const { total, byModel, byDay } = stats;
2872
3511
  const [tab, setTab] = (0, react.useState)("overview");
2873
3512
  const [trendDays, setTrendDays] = (0, react.useState)(7);
3513
+ const [heatmapRange, setHeatmapRange] = (0, react.useState)("month");
2874
3514
  const rateInfo = getRateInfo();
2875
3515
  const money = (cny) => formatMoney(currency === "usd" ? cnyToUsd(cny) : cny, currency);
2876
3516
  const lang = currency === "usd" ? "en" : "zh";
@@ -2976,6 +3616,8 @@ window.__ModuleLoader__.load({
2976
3616
  date,
2977
3617
  value: day.cost
2978
3618
  })), [byDay]);
3619
+ const activeDays = activeDaysOf(byDay);
3620
+ const streakDays = streakDaysOf(byDay);
2979
3621
  const trend = (0, react.useMemo)(() => trendDates.map((date) => {
2980
3622
  const byModel = {};
2981
3623
  const dayModels = stats.byDayModels?.[date];
@@ -3410,16 +4052,47 @@ window.__ModuleLoader__.load({
3410
4052
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
3411
4053
  className: UsageBilling_module_css_default.panel,
3412
4054
  "data-testid": "billing-panel-heatmap",
3413
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4055
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3414
4056
  className: UsageBilling_module_css_default.panelHead,
3415
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
3416
- className: UsageBilling_module_css_default.panelTitle,
3417
- children: t("billing.heatmap")
3418
- })
4057
+ children: [
4058
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
4059
+ className: UsageBilling_module_css_default.panelTitle,
4060
+ children: t("billing.heatmap")
4061
+ }),
4062
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4063
+ className: UsageBilling_module_css_default.rangeToggle,
4064
+ role: "group",
4065
+ "aria-label": t("billing.heatmap"),
4066
+ children: ["month", "year"].map((range) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
4067
+ type: "button",
4068
+ className: clsx(UsageBilling_module_css_default.rangeButton, heatmapRange === range && UsageBilling_module_css_default.rangeButtonActive),
4069
+ "aria-pressed": heatmapRange === range,
4070
+ "data-testid": `billing-heatmap-${range}`,
4071
+ onClick: () => {
4072
+ setHeatmapRange(range);
4073
+ },
4074
+ children: range === "month" ? t("billing.heatmapMonth") : t("billing.heatmapYear")
4075
+ }, range))
4076
+ }),
4077
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4078
+ className: UsageBilling_module_css_default.panelHint,
4079
+ "data-testid": "billing-heatmap-summary",
4080
+ children: [
4081
+ t("billing.activeDays"),
4082
+ " ",
4083
+ activeDays,
4084
+ " · ",
4085
+ t("billing.streakDays"),
4086
+ " ",
4087
+ streakDays
4088
+ ]
4089
+ })
4090
+ ]
3419
4091
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(UsageHeatmap, {
3420
4092
  days: heatmapDays,
3421
4093
  currency,
3422
- t
4094
+ t,
4095
+ range: heatmapRange
3423
4096
  })]
3424
4097
  })
3425
4098
  ]
@@ -3638,6 +4311,10 @@ window.__ModuleLoader__.load({
3638
4311
  ]
3639
4312
  })
3640
4313
  ]
4314
+ }),
4315
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PluginInfoCard, {
4316
+ t,
4317
+ version: stats.pluginVersion
3641
4318
  })
3642
4319
  ]
3643
4320
  }),
@@ -3955,11 +4632,27 @@ window.__ModuleLoader__.load({
3955
4632
  className: UsageBilling_module_css_default.subscriptionName,
3956
4633
  children: providerName(quota.displayName)
3957
4634
  }),
3958
- quota.planType === "code" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3959
- className: UsageBilling_module_css_default.subscriptionPlan,
3960
- "data-kind": "code",
3961
- children: quota.subscriptionAmount !== void 0 && quota.subscriptionAmount > 0 ? t("billing.subscriptionFeePerMonth").replace("{amount}", money(quota.subscriptionAmount)) : t("billing.planTypeCode")
3962
- }),
4635
+ quota.planType === "code" && (() => {
4636
+ const tier = tierInfoOf(quota.provider);
4637
+ const tierFee = tier !== void 0 ? t("billing.subscriptionFeePerMonth").replace("{amount}", tier.currency === "USD" ? `$${tier.amount}` : `¥${tier.amount}`) : void 0;
4638
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4639
+ className: UsageBilling_module_css_default.subscriptionPlan,
4640
+ "data-kind": "code",
4641
+ children: [
4642
+ tierFee ?? (quota.subscriptionAmount !== void 0 && quota.subscriptionAmount > 0 ? t("billing.subscriptionFeePerMonth").replace("{amount}", money(quota.subscriptionAmount)) : t("billing.planTypeCode")),
4643
+ tier?.label !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4644
+ className: UsageBilling_module_css_default.subscriptionTier,
4645
+ "data-testid": `billing-tier-${quota.provider}`,
4646
+ children: tier.label
4647
+ }),
4648
+ tier !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4649
+ className: UsageBilling_module_css_default.subscriptionAuto,
4650
+ "data-testid": `billing-auto-${quota.provider}`,
4651
+ children: t("billing.subscriptionAutoDetect")
4652
+ })
4653
+ ]
4654
+ });
4655
+ })(),
3963
4656
  quota.planType === "token" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3964
4657
  className: UsageBilling_module_css_default.subscriptionPlan,
3965
4658
  "data-kind": "token",
@@ -4060,6 +4753,24 @@ window.__ModuleLoader__.load({
4060
4753
  })
4061
4754
  ]
4062
4755
  }),
4756
+ stats.perf !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
4757
+ className: UsageBilling_module_css_default.panel,
4758
+ "data-testid": "billing-panel-perf",
4759
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4760
+ className: UsageBilling_module_css_default.panelHead,
4761
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
4762
+ className: UsageBilling_module_css_default.panelTitle,
4763
+ children: t("billing.perfTitle")
4764
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4765
+ className: UsageBilling_module_css_default.panelHint,
4766
+ children: t("billing.perfHint")
4767
+ })]
4768
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PerfPanel, {
4769
+ perf: stats.perf,
4770
+ models: chartModels,
4771
+ t
4772
+ })]
4773
+ }),
4063
4774
  roleRows.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
4064
4775
  className: UsageBilling_module_css_default.panel,
4065
4776
  "data-testid": "billing-panel-roles",