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

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}@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,341 @@ window.__ModuleLoader__.load({
34
34
  document.head.appendChild(tag);
35
35
  }
36
36
  var UsageBilling_module_css_default = {
37
- "peakAlertPanelLabel": "VWh0dG_peakAlertPanelLabel",
38
- "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",
52
- "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",
37
+ "subscriptionStatus": "VWh0dG_subscriptionStatus",
38
+ "triggerPopBar": "VWh0dG_triggerPopBar",
61
39
  "currencyButton": "VWh0dG_currencyButton",
62
- "heroGauge": "VWh0dG_heroGauge",
63
- "shareSegTool": "VWh0dG_shareSegTool",
64
- "roundsBarLabel": "VWh0dG_roundsBarLabel",
65
- "triggerMeta": "VWh0dG_triggerMeta",
66
- "tabButton": "VWh0dG_tabButton",
67
- "switch": "VWh0dG_switch",
68
- "heroGaugeArc": "VWh0dG_heroGaugeArc",
69
- "bucketStatLabel": "VWh0dG_bucketStatLabel",
70
- "chartTooltipDate": "VWh0dG_chartTooltipDate",
71
- "bucketStat": "VWh0dG_bucketStat",
72
- "budgetInput": "VWh0dG_budgetInput",
40
+ "chartSvg": "VWh0dG_chartSvg",
41
+ "heroSideSpacer": "VWh0dG_heroSideSpacer",
73
42
  "roundsBarColPeak": "VWh0dG_roundsBarColPeak",
74
- "subscriptionPct": "VWh0dG_subscriptionPct",
75
- "planTag": "VWh0dG_planTag",
76
- "exportBar": "VWh0dG_exportBar",
77
- "liveCostItem": "VWh0dG_liveCostItem",
78
- "tabNav": "VWh0dG_tabNav",
79
- "dashboardModal": "VWh0dG_dashboardModal",
80
- "heroMain": "VWh0dG_heroMain",
81
- "providerGroupBalance": "VWh0dG_providerGroupBalance",
43
+ "budgetFillWarn": "VWh0dG_budgetFillWarn",
44
+ "rangeButton": "VWh0dG_rangeButton",
45
+ "modelProvider": "VWh0dG_modelProvider",
46
+ "trigger": "VWh0dG_trigger",
47
+ "estimatedTag": "VWh0dG_estimatedTag",
48
+ "triggerIcon": "VWh0dG_triggerIcon",
82
49
  "roundsBarCol": "VWh0dG_roundsBarCol",
83
- "kpiDetail": "VWh0dG_kpiDetail",
84
- "chartLegendLine": "VWh0dG_chartLegendLine",
85
- "shareValue": "VWh0dG_shareValue",
86
- "peakAlertHint": "VWh0dG_peakAlertHint",
87
- "subscriptionWindowLabel": "VWh0dG_subscriptionWindowLabel",
88
- "heatmapLegend": "VWh0dG_heatmapLegend",
89
- "chartTooltipRow": "VWh0dG_chartTooltipRow",
50
+ "chartDot": "VWh0dG_chartDot",
51
+ "switchKnob": "VWh0dG_switchKnob",
52
+ "triggerSparkHot": "VWh0dG_triggerSparkHot",
90
53
  "switchOn": "VWh0dG_switchOn",
54
+ "kpiLabel": "VWh0dG_kpiLabel",
55
+ "bucketStatSub": "VWh0dG_bucketStatSub",
56
+ "dashboardModal": "VWh0dG_dashboardModal",
57
+ "pricingChevron": "VWh0dG_pricingChevron",
58
+ "chartLegendBar": "VWh0dG_chartLegendBar",
59
+ "bandPriceOff": "VWh0dG_bandPriceOff",
60
+ "liveQuotaCrit": "VWh0dG_liveQuotaCrit",
61
+ "triggerSpark": "VWh0dG_triggerSpark",
62
+ "na": "VWh0dG_na",
63
+ "rateBadge": "VWh0dG_rateBadge",
64
+ "budgetHead": "VWh0dG_budgetHead",
65
+ "providerGroupName": "VWh0dG_providerGroupName",
66
+ "modelName": "VWh0dG_modelName",
67
+ "budgetInput": "VWh0dG_budgetInput",
68
+ "peakAlertField": "VWh0dG_peakAlertField",
69
+ "budgetInputWrap": "VWh0dG_budgetInputWrap",
70
+ "heroGaugeCenter": "VWh0dG_heroGaugeCenter",
71
+ "budgetHint": "VWh0dG_budgetHint",
72
+ "heroLabel": "VWh0dG_heroLabel",
73
+ "tabButtonActive": "VWh0dG_tabButtonActive",
74
+ "modelTableScroll": "VWh0dG_modelTableScroll",
75
+ "tableScroll": "VWh0dG_tableScroll",
76
+ "shareSegUser": "VWh0dG_shareSegUser",
77
+ "pricingChevronOpen": "VWh0dG_pricingChevronOpen",
78
+ "peakAlert": "VWh0dG_peakAlert",
91
79
  "emptyRow": "VWh0dG_emptyRow",
92
- "heatmapCell": "VWh0dG_heatmapCell",
93
- "roundsFlagBadge": "VWh0dG_roundsFlagBadge",
94
- "balanceDaysLow": "VWh0dG_balanceDaysLow",
80
+ "rounds": "VWh0dG_rounds",
81
+ "chartCrosshair": "VWh0dG_chartCrosshair",
82
+ "heatmapGrid": "VWh0dG_heatmapGrid",
83
+ "peakAlertTag": "VWh0dG_peakAlertTag",
84
+ "kpiGrid": "VWh0dG_kpiGrid",
85
+ "deltaDown": "VWh0dG_deltaDown",
86
+ "tabPanelIn": "VWh0dG_tabPanelIn",
87
+ "heroGaugeTrack": "VWh0dG_heroGaugeTrack",
88
+ "healthBadge": "VWh0dG_healthBadge",
89
+ "chartTooltipSwatch": "VWh0dG_chartTooltipSwatch",
90
+ "triggerPopValue": "VWh0dG_triggerPopValue",
91
+ "dashboardHead": "VWh0dG_dashboardHead",
95
92
  "providerGroupTitle": "VWh0dG_providerGroupTitle",
96
- "triggerSparkBar": "VWh0dG_triggerSparkBar",
97
- "peakAlertSelect": "VWh0dG_peakAlertSelect",
98
- "shareSegPeak": "VWh0dG_shareSegPeak",
99
- "exportLabel": "VWh0dG_exportLabel",
100
93
  "heroMeta": "VWh0dG_heroMeta",
101
- "budgetOverPulse": "VWh0dG_budgetOverPulse",
102
- "chartGrid": "VWh0dG_chartGrid",
103
- "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",
94
+ "subscriptionTrack": "VWh0dG_subscriptionTrack",
95
+ "heroGaugePct": "VWh0dG_heroGaugePct",
96
+ "kpiTile": "VWh0dG_kpiTile",
97
+ "heatmapYearCell": "VWh0dG_heatmapYearCell",
98
+ "peakAlertPanelLabel": "VWh0dG_peakAlertPanelLabel",
110
99
  "heatmapFooter": "VWh0dG_heatmapFooter",
111
- "rateBadgeLive": "VWh0dG_rateBadgeLive",
112
- "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",
126
- "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",
138
- "bandPriceOff": "VWh0dG_bandPriceOff",
139
- "triggerSub": "VWh0dG_triggerSub",
140
- "heroGaugeTrack": "VWh0dG_heroGaugeTrack",
141
- "bucketOfficial": "VWh0dG_bucketOfficial",
142
- "healthBadgeBad": "VWh0dG_healthBadgeBad",
143
100
  "triggerWrap": "VWh0dG_triggerWrap",
144
- "dashboardSubtitle": "VWh0dG_dashboardSubtitle",
145
- "kpiValue": "VWh0dG_kpiValue",
101
+ "bandPrice": "VWh0dG_bandPrice",
102
+ "shareValue": "VWh0dG_shareValue",
103
+ "railButton": "VWh0dG_railButton",
104
+ "hero": "VWh0dG_hero",
105
+ "liveCostItem": "VWh0dG_liveCostItem",
106
+ "liveTierOff": "VWh0dG_liveTierOff",
107
+ "dashboard": "VWh0dG_dashboard",
108
+ "deltaUp": "VWh0dG_deltaUp",
109
+ "healthBad": "VWh0dG_healthBad",
110
+ "shareSegAssistant": "VWh0dG_shareSegAssistant",
111
+ "subscriptionFill": "VWh0dG_subscriptionFill",
146
112
  "dashboardRight": "VWh0dG_dashboardRight",
147
- "peakAlertOff": "VWh0dG_peakAlertOff",
148
- "liveQuotaWarn": "VWh0dG_liveQuotaWarn",
149
- "uncataloguedTag": "VWh0dG_uncataloguedTag",
150
- "trigger": "VWh0dG_trigger",
151
- "subscriptionFillOver": "VWh0dG_subscriptionFillOver",
152
- "subscriptionTrack": "VWh0dG_subscriptionTrack",
153
- "costCol": "VWh0dG_costCol",
154
- "budgetHint": "VWh0dG_budgetHint",
113
+ "liveCostSep": "VWh0dG_liveCostSep",
114
+ "flatTag": "VWh0dG_flatTag",
115
+ "budgetLabel": "VWh0dG_budgetLabel",
116
+ "triggerRow": "VWh0dG_triggerRow",
117
+ "pricingTable": "VWh0dG_pricingTable",
118
+ "pricingToggleText": "VWh0dG_pricingToggleText",
119
+ "peakAlertPreview": "VWh0dG_peakAlertPreview",
120
+ "heroTop": "VWh0dG_heroTop",
121
+ "heatmapHover": "VWh0dG_heatmapHover",
155
122
  "providerGroupHead": "VWh0dG_providerGroupHead",
156
- "rangeToggle": "VWh0dG_rangeToggle",
157
- "chartTooltipSwatch": "VWh0dG_chartTooltipSwatch",
158
- "roundsEmpty": "VWh0dG_roundsEmpty",
159
- "shareSegAssistant": "VWh0dG_shareSegAssistant",
160
- "chartLegendBar": "VWh0dG_chartLegendBar",
123
+ "liveQuotaWarn": "VWh0dG_liveQuotaWarn",
124
+ "tabNav": "VWh0dG_tabNav",
125
+ "heatmapYearGrid": "VWh0dG_heatmapYearGrid",
126
+ "providerGroupBalance": "VWh0dG_providerGroupBalance",
127
+ "peakAlertPanelBody": "VWh0dG_peakAlertPanelBody",
128
+ "triggerSub": "VWh0dG_triggerSub",
129
+ "peakAlertClose": "VWh0dG_peakAlertClose",
130
+ "settingsHint": "VWh0dG_settingsHint",
131
+ "healthBadgeOk": "VWh0dG_healthBadgeOk",
132
+ "peakAlertCountdown": "VWh0dG_peakAlertCountdown",
133
+ "triggerSparkBar": "VWh0dG_triggerSparkBar",
134
+ "exportLabel": "VWh0dG_exportLabel",
135
+ "chartEmpty": "VWh0dG_chartEmpty",
136
+ "subscriptionAuto": "VWh0dG_subscriptionAuto",
137
+ "budgetControls": "VWh0dG_budgetControls",
138
+ "subscriptionCard": "VWh0dG_subscriptionCard",
139
+ "healthDot": "VWh0dG_healthDot",
140
+ "heroGaugePctOver": "VWh0dG_heroGaugePctOver",
141
+ "budgetTrack": "VWh0dG_budgetTrack",
142
+ "heroSideLabel": "VWh0dG_heroSideLabel",
143
+ "providerGroupBadge": "VWh0dG_providerGroupBadge",
144
+ "shareItem": "VWh0dG_shareItem",
161
145
  "trendPanel": "VWh0dG_trendPanel",
162
- "modelCell": "VWh0dG_modelCell",
163
- "pricingToggle": "VWh0dG_pricingToggle",
164
- "healthBadge": "VWh0dG_healthBadge",
146
+ "chartTooltipDate": "VWh0dG_chartTooltipDate",
147
+ "heroGaugeSvg": "VWh0dG_heroGaugeSvg",
165
148
  "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",
176
- "panelTitle": "VWh0dG_panelTitle",
177
- "chartSvg": "VWh0dG_chartSvg",
178
- "rateBadge": "VWh0dG_rateBadge",
149
+ "roundsBar": "VWh0dG_roundsBar",
150
+ "chartWrap": "VWh0dG_chartWrap",
151
+ "rateBadgeBuiltin": "VWh0dG_rateBadgeBuiltin",
152
+ "kpiDetail": "VWh0dG_kpiDetail",
153
+ "shareDot": "VWh0dG_shareDot",
154
+ "balanceCell": "VWh0dG_balanceCell",
179
155
  "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",
191
- "rangeButtonActive": "VWh0dG_rangeButtonActive",
192
- "healthIdle": "VWh0dG_healthIdle",
193
- "kpiGrid": "VWh0dG_kpiGrid",
194
- "healthBad": "VWh0dG_healthBad",
195
- "peakAlertClose": "VWh0dG_peakAlertClose",
196
- "triggerPopBars": "VWh0dG_triggerPopBars",
156
+ "roundsEmpty": "VWh0dG_roundsEmpty",
157
+ "switch": "VWh0dG_switch",
158
+ "peakAlertIn": "VWh0dG_peakAlertIn",
197
159
  "roundsBars": "VWh0dG_roundsBars",
198
- "peakAlertCheck": "VWh0dG_peakAlertCheck",
199
- "shareSeg": "VWh0dG_shareSeg",
200
- "tabPanelIn": "VWh0dG_tabPanelIn",
201
- "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
160
  "exportButton": "VWh0dG_exportButton",
210
- "liveQuotaCrit": "VWh0dG_liveQuotaCrit",
211
- "peakAlertCountdown": "VWh0dG_peakAlertCountdown",
161
+ "subscriptionWindow": "VWh0dG_subscriptionWindow",
162
+ "closeButton": "VWh0dG_closeButton",
163
+ "exportBar": "VWh0dG_exportBar",
212
164
  "shareSegOff": "VWh0dG_shareSegOff",
213
- "bandPrice": "VWh0dG_bandPrice",
214
- "bucketThird": "VWh0dG_bucketThird",
215
- "currencyButtonActive": "VWh0dG_currencyButtonActive",
216
- "subscriptionStatus": "VWh0dG_subscriptionStatus",
217
- "subscriptionPlan": "VWh0dG_subscriptionPlan",
218
- "peakAlertPeak": "VWh0dG_peakAlertPeak",
219
- "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",
165
+ "budgetUnit": "VWh0dG_budgetUnit",
166
+ "tabPanel": "VWh0dG_tabPanel",
167
+ "heroReadout": "VWh0dG_heroReadout",
168
+ "dashboardSubtitle": "VWh0dG_dashboardSubtitle",
169
+ "healthIdle": "VWh0dG_healthIdle",
170
+ "subscriptionGrid": "VWh0dG_subscriptionGrid",
171
+ "pricingTip": "VWh0dG_pricingTip",
172
+ "rangeButtonActive": "VWh0dG_rangeButtonActive",
173
+ "bucketSummary": "VWh0dG_bucketSummary",
174
+ "bandTag": "VWh0dG_bandTag",
175
+ "delta": "VWh0dG_delta",
228
176
  "subscriptionReset": "VWh0dG_subscriptionReset",
177
+ "balanceDaysLow": "VWh0dG_balanceDaysLow",
229
178
  "roundsBarFlagged": "VWh0dG_roundsBarFlagged",
230
- "heroGaugeSvg": "VWh0dG_heroGaugeSvg",
179
+ "bucketThird": "VWh0dG_bucketThird",
180
+ "shareTrack": "VWh0dG_shareTrack",
181
+ "triggerMeta": "VWh0dG_triggerMeta",
182
+ "panelHint": "VWh0dG_panelHint",
231
183
  "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",
184
+ "bucketSep": "VWh0dG_bucketSep",
185
+ "heroValue": "VWh0dG_heroValue",
186
+ "shareSegTool": "VWh0dG_shareSegTool",
187
+ "peakAlertOff": "VWh0dG_peakAlertOff",
188
+ "subscriptionPct": "VWh0dG_subscriptionPct",
189
+ "subscriptionTier": "VWh0dG_subscriptionTier",
190
+ "providerGroupList": "VWh0dG_providerGroupList",
191
+ "heroSide": "VWh0dG_heroSide",
192
+ "chartBar": "VWh0dG_chartBar",
193
+ "peakAlertPeak": "VWh0dG_peakAlertPeak",
194
+ "modelTable": "VWh0dG_modelTable",
195
+ "tabButton": "VWh0dG_tabButton",
240
196
  "roundsBarWrap": "VWh0dG_roundsBarWrap",
241
- "tabButtonActive": "VWh0dG_tabButtonActive",
242
- "triggerPopValue": "VWh0dG_triggerPopValue",
243
- "chartDot": "VWh0dG_chartDot",
244
- "bucketStatSub": "VWh0dG_bucketStatSub",
245
- "budgetInputWrap": "VWh0dG_budgetInputWrap",
246
- "chartCrosshair": "VWh0dG_chartCrosshair",
247
- "triggerPopRow": "VWh0dG_triggerPopRow",
248
- "triggerPopLabel": "VWh0dG_triggerPopLabel",
197
+ "modelDot": "VWh0dG_modelDot",
198
+ "roundsFlagBadge": "VWh0dG_roundsFlagBadge",
199
+ "budgetFill": "VWh0dG_budgetFill",
200
+ "subscriptionPlan": "VWh0dG_subscriptionPlan",
201
+ "bucketStatValue": "VWh0dG_bucketStatValue",
202
+ "healthBadgeBad": "VWh0dG_healthBadgeBad",
203
+ "budget": "VWh0dG_budget",
204
+ "shareLegend": "VWh0dG_shareLegend",
205
+ "chartLegendLine": "VWh0dG_chartLegendLine",
206
+ "subscriptionWindowLabel": "VWh0dG_subscriptionWindowLabel",
207
+ "kpiValue": "VWh0dG_kpiValue",
208
+ "peakAlertCheck": "VWh0dG_peakAlertCheck",
209
+ "triggerPopBars": "VWh0dG_triggerPopBars",
249
210
  "subscriptionExhausted": "VWh0dG_subscriptionExhausted",
250
- "peakAlertTag": "VWh0dG_peakAlertTag",
251
- "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",
211
+ "heatmapLegend": "VWh0dG_heatmapLegend",
259
212
  "numCol": "VWh0dG_numCol",
260
- "settingsHead": "VWh0dG_settingsHead",
261
- "peakAlertNum": "VWh0dG_peakAlertNum",
262
- "roundsFlagMark": "VWh0dG_roundsFlagMark",
263
- "chartBar": "VWh0dG_chartBar",
264
- "peakAlertPanelBody": "VWh0dG_peakAlertPanelBody",
265
- "providerGroupMeta": "VWh0dG_providerGroupMeta",
213
+ "rateBadgeLive": "VWh0dG_rateBadgeLive",
214
+ "bandTagOff": "VWh0dG_bandTagOff",
215
+ "heroGaugeArcOver": "VWh0dG_heroGaugeArcOver",
216
+ "providerGroupBalanceLabel": "VWh0dG_providerGroupBalanceLabel",
217
+ "bucketStatLabel": "VWh0dG_bucketStatLabel",
218
+ "heroGaugeArc": "VWh0dG_heroGaugeArc",
219
+ "headTitleRow": "VWh0dG_headTitleRow",
220
+ "rangeToggle": "VWh0dG_rangeToggle",
221
+ "subscriptionHead": "VWh0dG_subscriptionHead",
222
+ "peakAlertCorner": "VWh0dG_peakAlertCorner",
223
+ "peakAlertSelect": "VWh0dG_peakAlertSelect",
266
224
  "budgetFillOver": "VWh0dG_budgetFillOver",
267
- "subscriptionGrid": "VWh0dG_subscriptionGrid",
268
- "pricingChevronOpen": "VWh0dG_pricingChevronOpen",
269
- "triggerIcon": "VWh0dG_triggerIcon",
270
- "triggerRow": "VWh0dG_triggerRow",
225
+ "chartStack": "VWh0dG_chartStack",
226
+ "settingsHead": "VWh0dG_settingsHead",
227
+ "currencyToggle": "VWh0dG_currencyToggle",
228
+ "heroSideValue": "VWh0dG_heroSideValue",
229
+ "modelCell": "VWh0dG_modelCell",
230
+ "peakAlertCenter": "VWh0dG_peakAlertCenter",
231
+ "peakAlertPanelHead": "VWh0dG_peakAlertPanelHead",
232
+ "triggerAmount": "VWh0dG_triggerAmount",
233
+ "roundsFlagMark": "VWh0dG_roundsFlagMark",
234
+ "heatmapCell": "VWh0dG_heatmapCell",
235
+ "dashboardBody": "VWh0dG_dashboardBody",
236
+ "uncataloguedTag": "VWh0dG_uncataloguedTag",
237
+ "peakAlertHint": "VWh0dG_peakAlertHint",
271
238
  "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",
239
+ "peakAlertPanel": "VWh0dG_peakAlertPanel",
240
+ "heroSideItem": "VWh0dG_heroSideItem",
241
+ "liveCostBar": "VWh0dG_liveCostBar",
242
+ "providerGroupMeta": "VWh0dG_providerGroupMeta",
243
+ "liveTierPeak": "VWh0dG_liveTierPeak",
244
+ "kpiGreen": "VWh0dG_kpiGreen",
245
+ "heroGauge": "VWh0dG_heroGauge",
246
+ "heatmap": "VWh0dG_heatmap",
247
+ "chartGrid": "VWh0dG_chartGrid",
248
+ "panel": "VWh0dG_panel",
249
+ "heroCurrency": "VWh0dG_heroCurrency",
250
+ "planTag": "VWh0dG_planTag",
251
+ "subscriptionName": "VWh0dG_subscriptionName",
252
+ "peakAlertText": "VWh0dG_peakAlertText",
253
+ "subscriptionFillWarn": "VWh0dG_subscriptionFillWarn",
254
+ "subscriptionFillOver": "VWh0dG_subscriptionFillOver",
255
+ "triggerPopLabel": "VWh0dG_triggerPopLabel",
256
+ "pricingToggle": "VWh0dG_pricingToggle",
257
+ "bucketOfficial": "VWh0dG_bucketOfficial",
258
+ "healthOk": "VWh0dG_healthOk",
259
+ "chartLegend": "VWh0dG_chartLegend",
260
+ "heatmapCellEmpty": "VWh0dG_heatmapCellEmpty",
261
+ "dashboardTitle": "VWh0dG_dashboardTitle",
262
+ "triggerPopRow": "VWh0dG_triggerPopRow",
263
+ "balanceDays": "VWh0dG_balanceDays",
264
+ "shareSegPeak": "VWh0dG_shareSegPeak",
265
+ "triggerPop": "VWh0dG_triggerPop",
266
+ "settingsTitle": "VWh0dG_settingsTitle",
267
+ "shareSeg": "VWh0dG_shareSeg",
268
+ "chartTooltipRow": "VWh0dG_chartTooltipRow",
269
+ "providerGroup": "VWh0dG_providerGroup",
270
+ "chartAxisLabel": "VWh0dG_chartAxisLabel",
271
+ "roundsBarLabel": "VWh0dG_roundsBarLabel",
272
+ "bucketStat": "VWh0dG_bucketStat",
273
+ "costCol": "VWh0dG_costCol",
274
+ "heatmapYearScroll": "VWh0dG_heatmapYearScroll",
275
+ "panelHead": "VWh0dG_panelHead",
276
+ "peakAlertNum": "VWh0dG_peakAlertNum",
277
+ "panelTitle": "VWh0dG_panelTitle",
278
+ "budgetOverPulse": "VWh0dG_budgetOverPulse",
279
+ "triggerBody": "VWh0dG_triggerBody",
280
+ "bucketCost": "VWh0dG_bucketCost",
281
+ "heroGaugeLabel": "VWh0dG_heroGaugeLabel",
282
+ "currencyButtonActive": "VWh0dG_currencyButtonActive",
283
+ "heroMain": "VWh0dG_heroMain",
278
284
  "chartTooltip": "VWh0dG_chartTooltip",
279
- "hero": "VWh0dG_hero",
280
- "kpiTile": "VWh0dG_kpiTile"
285
+ "dashboardIn": "VWh0dG_dashboardIn"
281
286
  };
282
287
  //#endregion
283
288
  //#region src/client/plan-knowledge.ts
289
+ /**
290
+ * 订阅/计划 provider id → plan 知识(引用 dsh-spend 的 code/token 双口径)。
291
+ * 覆盖我们实际会识别到的订阅通道;其余按量 API 不计入此表(默认 token)。
292
+ */
293
+ const PLAN_KNOWLEDGE = {
294
+ "opencode-go": {
295
+ type: "code",
296
+ subscriptionCny: 70,
297
+ tier: {
298
+ amount: 10,
299
+ currency: "USD",
300
+ periodDays: 7,
301
+ label: "周额度 $30"
302
+ }
303
+ },
304
+ opencode: {
305
+ type: "code",
306
+ subscriptionCny: 70,
307
+ tier: {
308
+ amount: 10,
309
+ currency: "USD",
310
+ periodDays: 7,
311
+ label: "周额度 $30"
312
+ }
313
+ },
314
+ "kimi-coding": {
315
+ type: "code",
316
+ subscriptionCny: 0
317
+ },
318
+ "zai-coding-cn": {
319
+ type: "code",
320
+ subscriptionCny: 0
321
+ },
322
+ "zai-coding": {
323
+ type: "code",
324
+ subscriptionCny: 0
325
+ },
326
+ "qwen-token-plan": {
327
+ type: "code",
328
+ subscriptionCny: 0
329
+ },
330
+ "qwen-token-plan-cn": {
331
+ type: "code",
332
+ subscriptionCny: 0
333
+ },
334
+ "xiaomi-token-plan-ams": {
335
+ type: "code",
336
+ subscriptionCny: 0
337
+ },
338
+ "xiaomi-token-plan-cn": {
339
+ type: "code",
340
+ subscriptionCny: 0
341
+ },
342
+ "xiaomi-token-plan-sgp": {
343
+ type: "code",
344
+ subscriptionCny: 0
345
+ },
346
+ "volcengine-token-plan": {
347
+ type: "code",
348
+ subscriptionCny: 0
349
+ },
350
+ "ark-token-plan": {
351
+ type: "code",
352
+ subscriptionCny: 0
353
+ },
354
+ "doubao-token-plan": {
355
+ type: "code",
356
+ subscriptionCny: 0
357
+ },
358
+ "minimax": {
359
+ type: "code",
360
+ subscriptionCny: 0
361
+ },
362
+ "minimax-token-plan": {
363
+ type: "code",
364
+ subscriptionCny: 0
365
+ }
366
+ };
367
+ /** 自动识别的档位月费与周期额度口径(订阅卡片展示);无档位知识返回 undefined。 */
368
+ function tierInfoOf(providerId) {
369
+ const entry = PLAN_KNOWLEDGE[providerId];
370
+ return entry?.type === "code" ? entry.tier : void 0;
371
+ }
284
372
  const FALLBACK_RATES = [
285
373
  {
286
374
  key: "deepseek-v4-flash",
@@ -1265,9 +1353,9 @@ window.__ModuleLoader__.load({
1265
1353
  * surface stays self-contained and offline.
1266
1354
  */
1267
1355
  /** Fixed viewBox; the SVG scales to its container. */
1268
- const W = 680;
1269
- const H = 220;
1270
- const PAD = {
1356
+ const W$1 = 680;
1357
+ const H$1 = 220;
1358
+ const PAD$1 = {
1271
1359
  top: 18,
1272
1360
  right: 40,
1273
1361
  bottom: 26,
@@ -1309,16 +1397,16 @@ window.__ModuleLoader__.load({
1309
1397
  const layout = (0, react.useMemo)(() => {
1310
1398
  const n = data.length;
1311
1399
  if (n === 0) return null;
1312
- const plotW = W - PAD.left - PAD.right;
1313
- const plotH = H - PAD.top - PAD.bottom;
1400
+ const plotW = W$1 - PAD$1.left - PAD$1.right;
1401
+ const plotH = H$1 - PAD$1.top - PAD$1.bottom;
1314
1402
  const inner = (i) => {
1315
- if (n === 1) return PAD.left + plotW / 2;
1316
- return PAD.left + plotW * i / (n - 1);
1403
+ if (n === 1) return PAD$1.left + plotW / 2;
1404
+ return PAD$1.left + plotW * i / (n - 1);
1317
1405
  };
1318
1406
  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;
1407
+ const yCost = (value) => PAD$1.top + plotH - value / maxCost * plotH;
1320
1408
  const maxCalls = Math.max(...data.map((d) => d.calls), 1);
1321
- const yCalls = (value) => PAD.top + plotH - value / maxCalls * plotH;
1409
+ const yCalls = (value) => PAD$1.top + plotH - value / maxCalls * plotH;
1322
1410
  const groupW = plotW / n;
1323
1411
  const barW = Math.min(18, groupW * .6);
1324
1412
  return {
@@ -1387,7 +1475,7 @@ window.__ModuleLoader__.load({
1387
1475
  className: UsageBilling_module_css_default.chartWrap,
1388
1476
  children: [
1389
1477
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
1390
- viewBox: `0 0 ${W} ${H}`,
1478
+ viewBox: `0 0 ${W$1} ${H$1}`,
1391
1479
  className: UsageBilling_module_css_default.chartSvg,
1392
1480
  role: "img",
1393
1481
  "aria-label": "Daily cost by model and total calls",
@@ -1396,7 +1484,7 @@ window.__ModuleLoader__.load({
1396
1484
  },
1397
1485
  onMouseMove: (e) => {
1398
1486
  const rect = e.currentTarget.getBoundingClientRect();
1399
- const ratio = ((e.clientX - rect.left) / rect.width * W - PAD.left) / plotW;
1487
+ const ratio = ((e.clientX - rect.left) / rect.width * W$1 - PAD$1.left) / plotW;
1400
1488
  const index = Math.round(ratio * (n - 1));
1401
1489
  setHover(Math.min(Math.max(index, 0), n - 1));
1402
1490
  },
@@ -1404,13 +1492,13 @@ window.__ModuleLoader__.load({
1404
1492
  costTicks.map((value, idx) => {
1405
1493
  const y = yCost(value);
1406
1494
  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,
1495
+ x1: PAD$1.left,
1496
+ x2: W$1 - PAD$1.right,
1409
1497
  y1: y,
1410
1498
  y2: y,
1411
1499
  className: UsageBilling_module_css_default.chartGrid
1412
1500
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("text", {
1413
- x: PAD.left - 8,
1501
+ x: PAD$1.left - 8,
1414
1502
  y: y + 3,
1415
1503
  textAnchor: "end",
1416
1504
  className: UsageBilling_module_css_default.chartAxisLabel,
@@ -1434,7 +1522,7 @@ window.__ModuleLoader__.load({
1434
1522
  callsTicks.map((value, idx) => {
1435
1523
  const y = yCalls(value);
1436
1524
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("text", {
1437
- x: W - PAD.right + 8,
1525
+ x: W$1 - PAD$1.right + 8,
1438
1526
  y: y + 3,
1439
1527
  textAnchor: "start",
1440
1528
  className: UsageBilling_module_css_default.chartAxisLabel,
@@ -1446,7 +1534,7 @@ window.__ModuleLoader__.load({
1446
1534
  if (point === void 0) return null;
1447
1535
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("text", {
1448
1536
  x: inner(i),
1449
- y: H - 6,
1537
+ y: H$1 - 6,
1450
1538
  textAnchor: "middle",
1451
1539
  className: UsageBilling_module_css_default.chartAxisLabel,
1452
1540
  children: shortDate(point.date)
@@ -1455,8 +1543,8 @@ window.__ModuleLoader__.load({
1455
1543
  hover !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("line", {
1456
1544
  x1: inner(hover),
1457
1545
  x2: inner(hover),
1458
- y1: PAD.top,
1459
- y2: PAD.top + plotH,
1546
+ y1: PAD$1.top,
1547
+ y2: PAD$1.top + plotH,
1460
1548
  className: UsageBilling_module_css_default.chartCrosshair
1461
1549
  })
1462
1550
  ]
@@ -1464,8 +1552,8 @@ window.__ModuleLoader__.load({
1464
1552
  activePoint !== void 0 && hover !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1465
1553
  className: UsageBilling_module_css_default.chartTooltip,
1466
1554
  style: {
1467
- left: `${inner(hover) / W * 100}%`,
1468
- top: `${yCost(activePoint.cost) / H * 100}%`
1555
+ left: `${inner(hover) / W$1 * 100}%`,
1556
+ top: `${yCost(activePoint.cost) / H$1 * 100}%`
1469
1557
  },
1470
1558
  children: [
1471
1559
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
@@ -1513,6 +1601,273 @@ window.__ModuleLoader__.load({
1513
1601
  });
1514
1602
  }
1515
1603
  //#endregion
1604
+ //#region src/client/PerfPanel.tsx
1605
+ /**
1606
+ * PerfPanel: per-model latency/perf table + per-hour TTFT/generation-speed curve.
1607
+ *
1608
+ * Reads the optional `perf` field of the usage-stats document (aggregated by
1609
+ * the host from session logs). Renders a per-model table of TTFT mean/P50/P90,
1610
+ * generation speed, total latency and estimated-step count, plus a small
1611
+ * dependency-free SVG twin-series hourly curve (TTFT in ms on the left axis,
1612
+ * tokens/s on the right). Absent `perf` (older snapshot or stream-less logs)
1613
+ * renders an empty state; the panel never fabricates samples.
1614
+ */
1615
+ /** Fixed viewBox for the hourly curve; the SVG scales to its container. */
1616
+ const W = 680;
1617
+ const H = 180;
1618
+ const PAD = {
1619
+ top: 14,
1620
+ right: 42,
1621
+ bottom: 22,
1622
+ left: 46
1623
+ };
1624
+ /** 最近窗口内的小时点(键升序,尾部补齐空白,最旧在前)。 */
1625
+ function sortHourPoints(byHour) {
1626
+ const keys = Object.keys(byHour).sort();
1627
+ const points = [];
1628
+ for (const key of keys.slice(-48)) {
1629
+ const data = byHour[key];
1630
+ if (data === void 0) continue;
1631
+ points.push({
1632
+ key,
1633
+ ttftMs: data.ttftAvg,
1634
+ ...data.tpsAvg === void 0 ? {} : { tps: data.tpsAvg }
1635
+ });
1636
+ }
1637
+ return points;
1638
+ }
1639
+ /** 短小时标签 `MM-DD HH`(跨天在小时键上有日期,直接截取即可辨识)。 */
1640
+ function shortHour(key) {
1641
+ return key.slice(5, 13).replace("T", " ");
1642
+ }
1643
+ /**
1644
+ * Render the performance panel.
1645
+ * @param props.perf - the optional perf doc; `undefined`/empty renders an empty state.
1646
+ * @param props.models - model legend (key/name/color) for the table swatches and curve legend.
1647
+ * @param props.t - locale function.
1648
+ */
1649
+ function PerfPanel({ perf, models, t }) {
1650
+ const colorOf = (model) => models.find((m) => m.key === model)?.color ?? "#8b95a3";
1651
+ const rows = (0, react.useMemo)(() => {
1652
+ if (perf === void 0) return [];
1653
+ return Object.entries(perf.byModel).map(([key, data]) => ({
1654
+ key,
1655
+ name: models.find((m) => m.key === key)?.name ?? key,
1656
+ color: colorOf(key),
1657
+ samples: data.samples,
1658
+ ttftAvg: data.ttftAvg,
1659
+ ttftP50: data.ttftP50,
1660
+ ttftP90: data.ttftP90,
1661
+ ...data.tpsAvg === void 0 ? {} : { tpsAvg: data.tpsAvg },
1662
+ latencyAvg: data.latencyAvg,
1663
+ estimatedSamples: data.estimatedSamples
1664
+ })).sort((a, b) => b.samples - a.samples || b.ttftP90 - a.ttftP90);
1665
+ }, [perf, models]);
1666
+ const hourLayout = (0, react.useMemo)(() => {
1667
+ const points = perf === void 0 ? [] : sortHourPoints(perf.byHour);
1668
+ if (points.length === 0) return null;
1669
+ const n = points.length;
1670
+ const plotW = W - PAD.left - PAD.right;
1671
+ const plotH = H - PAD.top - PAD.bottom;
1672
+ const inner = (i) => n === 1 ? PAD.left + plotW / 2 : PAD.left + plotW * i / (n - 1);
1673
+ const maxTtft = Math.max(...points.map((p) => p.ttftMs), 1);
1674
+ const maxTps = Math.max(...points.map((p) => p.tps ?? 0), 1);
1675
+ const yTtft = (v) => PAD.top + plotH - v / maxTtft * plotH;
1676
+ const yTps = (v) => PAD.top + plotH - v / maxTps * plotH;
1677
+ const ttftPath = points.map((p, i) => `${i === 0 ? "M" : "L"}${inner(i)} ${yTtft(p.ttftMs)}`).join(" ");
1678
+ const tpsPath = points.some((p) => p.tps !== void 0) ? points.map((p, i) => `${i === 0 ? "M" : "L"}${inner(i)} ${yTps(p.tps ?? 0)}`).join(" ") : "";
1679
+ const step = Math.max(1, Math.ceil(n / 8));
1680
+ const indices = [];
1681
+ for (let i = 0; i < n; i += step) indices.push(i);
1682
+ if (n > 0 && indices[indices.length - 1] !== n - 1) indices.push(n - 1);
1683
+ return {
1684
+ points,
1685
+ n,
1686
+ inner,
1687
+ yTtft,
1688
+ ttftPath,
1689
+ tpsPath,
1690
+ indices,
1691
+ ttftTicks: [
1692
+ 0,
1693
+ .5,
1694
+ 1
1695
+ ].map((f) => maxTtft * f).reverse(),
1696
+ maxTps
1697
+ };
1698
+ }, [perf]);
1699
+ if (perf === void 0 || rows.length === 0) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1700
+ className: UsageBilling_module_css_default.chartEmpty,
1701
+ "data-testid": "billing-perf-empty",
1702
+ children: t("billing.perfEmpty")
1703
+ });
1704
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1705
+ "data-testid": "billing-perf-panel",
1706
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1707
+ className: UsageBilling_module_css_default.tableScroll,
1708
+ "data-testid": "billing-perf-table",
1709
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("table", {
1710
+ className: UsageBilling_module_css_default.modelTable,
1711
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("thead", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("tr", { children: [
1712
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", { children: t("billing.model") }),
1713
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
1714
+ className: UsageBilling_module_css_default.numCol,
1715
+ children: t("billing.perfSamples")
1716
+ }),
1717
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
1718
+ className: UsageBilling_module_css_default.numCol,
1719
+ children: t("billing.perfTtft")
1720
+ }),
1721
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
1722
+ className: UsageBilling_module_css_default.numCol,
1723
+ children: t("billing.perfP50")
1724
+ }),
1725
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
1726
+ className: UsageBilling_module_css_default.numCol,
1727
+ children: t("billing.perfP90")
1728
+ }),
1729
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
1730
+ className: UsageBilling_module_css_default.numCol,
1731
+ children: t("billing.perfTps")
1732
+ }),
1733
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
1734
+ className: UsageBilling_module_css_default.numCol,
1735
+ children: t("billing.perfLatency")
1736
+ }),
1737
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
1738
+ className: UsageBilling_module_css_default.numCol,
1739
+ children: t("billing.perfEstimated")
1740
+ })
1741
+ ] }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("tbody", { children: rows.map((row) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("tr", { children: [
1742
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
1743
+ className: UsageBilling_module_css_default.modelCell,
1744
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1745
+ className: UsageBilling_module_css_default.modelDot,
1746
+ style: { background: row.color }
1747
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1748
+ className: UsageBilling_module_css_default.modelName,
1749
+ children: row.name
1750
+ })]
1751
+ }) }),
1752
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
1753
+ className: UsageBilling_module_css_default.numCol,
1754
+ children: row.samples.toLocaleString()
1755
+ }),
1756
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("td", {
1757
+ className: UsageBilling_module_css_default.numCol,
1758
+ children: [row.ttftAvg.toFixed(0), " ms"]
1759
+ }),
1760
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("td", {
1761
+ className: UsageBilling_module_css_default.numCol,
1762
+ children: [row.ttftP50.toFixed(0), " ms"]
1763
+ }),
1764
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("td", {
1765
+ className: UsageBilling_module_css_default.numCol,
1766
+ children: [row.ttftP90.toFixed(0), " ms"]
1767
+ }),
1768
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
1769
+ className: UsageBilling_module_css_default.numCol,
1770
+ children: row.tpsAvg === void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1771
+ className: UsageBilling_module_css_default.na,
1772
+ children: "—"
1773
+ }) : `${row.tpsAvg.toFixed(1)}`
1774
+ }),
1775
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("td", {
1776
+ className: UsageBilling_module_css_default.numCol,
1777
+ children: [row.latencyAvg.toFixed(0), " ms"]
1778
+ }),
1779
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
1780
+ className: UsageBilling_module_css_default.numCol,
1781
+ children: row.estimatedSamples > 0 ? row.estimatedSamples : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1782
+ className: UsageBilling_module_css_default.na,
1783
+ children: "—"
1784
+ })
1785
+ })
1786
+ ] }, row.key)) })]
1787
+ })
1788
+ }), hourLayout !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1789
+ className: UsageBilling_module_css_default.chartWrap,
1790
+ "data-testid": "billing-perf-hour",
1791
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
1792
+ viewBox: `0 0 ${W} ${H}`,
1793
+ className: UsageBilling_module_css_default.chartSvg,
1794
+ role: "img",
1795
+ "aria-label": "Hourly TTFT and generation speed by model",
1796
+ children: [
1797
+ hourLayout.ttftTicks.map((value, idx) => {
1798
+ const y = hourLayout.yTtft(value);
1799
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("g", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("line", {
1800
+ x1: PAD.left,
1801
+ x2: W - PAD.right,
1802
+ y1: y,
1803
+ y2: y,
1804
+ className: UsageBilling_module_css_default.chartGrid
1805
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("text", {
1806
+ x: PAD.left - 8,
1807
+ y: y + 3,
1808
+ textAnchor: "end",
1809
+ className: UsageBilling_module_css_default.chartAxisLabel,
1810
+ children: value.toFixed(0)
1811
+ })] }, `ttft-${idx}`);
1812
+ }),
1813
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
1814
+ d: hourLayout.ttftPath,
1815
+ fill: "none",
1816
+ className: UsageBilling_module_css_default.chartLine
1817
+ }),
1818
+ hourLayout.tpsPath !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
1819
+ d: hourLayout.tpsPath,
1820
+ fill: "none",
1821
+ className: UsageBilling_module_css_default.chartLine,
1822
+ style: {
1823
+ stroke: "var(--dsw-static-amber-500)",
1824
+ strokeDasharray: "4 4"
1825
+ }
1826
+ }),
1827
+ hourLayout.indices.map((i) => {
1828
+ const point = hourLayout.points[i];
1829
+ if (point === void 0) return null;
1830
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("text", {
1831
+ x: hourLayout.inner(i),
1832
+ y: H - 6,
1833
+ textAnchor: "middle",
1834
+ className: UsageBilling_module_css_default.chartAxisLabel,
1835
+ children: shortHour(point.key)
1836
+ }, point.key);
1837
+ }),
1838
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("text", {
1839
+ x: W - PAD.right + 8,
1840
+ y: PAD.top + 4,
1841
+ textAnchor: "start",
1842
+ className: UsageBilling_module_css_default.chartAxisLabel,
1843
+ children: [
1844
+ t("billing.perfTpsUnit"),
1845
+ " ",
1846
+ hourLayout.maxTps.toFixed(0)
1847
+ ]
1848
+ })
1849
+ ]
1850
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1851
+ className: UsageBilling_module_css_default.chartLegend,
1852
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [
1853
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: UsageBilling_module_css_default.chartLegendLine }),
1854
+ t("billing.perfTtft"),
1855
+ " (ms)"
1856
+ ] }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [
1857
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1858
+ className: UsageBilling_module_css_default.chartLegendLine,
1859
+ style: { background: "var(--dsw-static-amber-500)" }
1860
+ }),
1861
+ t("billing.perfTps"),
1862
+ " (",
1863
+ t("billing.perfTpsUnit"),
1864
+ ")"
1865
+ ] })]
1866
+ })]
1867
+ })]
1868
+ });
1869
+ }
1870
+ //#endregion
1516
1871
  //#region src/client/round-chart.tsx
1517
1872
  /**
1518
1873
  * RoundCostChart: dependency-free per-turn cost bars with spike markers.
@@ -1686,23 +2041,106 @@ window.__ModuleLoader__.load({
1686
2041
  return weeks;
1687
2042
  }
1688
2043
  /**
1689
- * Render the month heatmap.
2044
+ * Build the GitHub-style year cells (column = week, row = Sunday..Saturday),
2045
+ * covering the last 52 weeks up to the current week. Future days render as
2046
+ * level-0 gray; the column-flow grid lays each week's 7 cells vertically.
2047
+ */
2048
+ function buildYearWeeks(days, now) {
2049
+ const byDate = /* @__PURE__ */ new Map();
2050
+ for (const day of days) byDate.set(day.date, day.value);
2051
+ let max = 0;
2052
+ for (const value of byDate.values()) if (value > max) max = value;
2053
+ const today = dayStamp(now);
2054
+ const thisSunday = new Date(now);
2055
+ thisSunday.setHours(0, 0, 0, 0);
2056
+ thisSunday.setDate(thisSunday.getDate() - thisSunday.getDay());
2057
+ const firstSunday = new Date(thisSunday);
2058
+ firstSunday.setDate(thisSunday.getDate() - 357);
2059
+ const weeks = [];
2060
+ for (let week = 0; week < 52; week += 1) {
2061
+ const row = [];
2062
+ for (let dow = 0; dow < 7; dow += 1) {
2063
+ const date = new Date(firstSunday);
2064
+ date.setDate(firstSunday.getDate() + week * 7 + dow);
2065
+ const iso = dayStamp(date);
2066
+ const future = iso > today;
2067
+ const value = future ? 0 : byDate.get(iso) ?? 0;
2068
+ let level = 0;
2069
+ if (!future && value > 0 && max > 0) {
2070
+ const scaled = Math.ceil(value / max * 4);
2071
+ level = Math.min(4, Math.max(1, scaled));
2072
+ }
2073
+ row.push({
2074
+ date: iso,
2075
+ dayNum: date.getDate(),
2076
+ value,
2077
+ level,
2078
+ placeholder: future
2079
+ });
2080
+ }
2081
+ weeks.push(row);
2082
+ }
2083
+ return weeks;
2084
+ }
2085
+ /**
2086
+ * Render the month or year heatmap.
1690
2087
  * @param props.days - daily cost rows (keys are `YYYY-MM-DD`).
1691
2088
  * @param props.currency - display currency for the hover amount.
1692
2089
  * @param props.now - anchor date (defaults to today); injectable for tests.
1693
2090
  * @param props.t - locale function (used for the legend labels).
2091
+ * @param props.range - `month` (calendar month) or `year` (last 52 weeks, GitHub style).
1694
2092
  */
1695
- function UsageHeatmap({ days, currency, now, t }) {
2093
+ function UsageHeatmap({ days, currency, now, t, range = "month" }) {
1696
2094
  const [hover, setHover] = (0, react.useState)(null);
1697
- const weeks = (0, react.useMemo)(() => buildMonthWeeks(days, now ?? /* @__PURE__ */ new Date()), [days, now]);
1698
2095
  const money = (cny) => formatMoney(currency === "usd" ? cnyToUsd(cny) : cny, currency);
2096
+ const monthWeeks = (0, react.useMemo)(() => buildMonthWeeks(days, now ?? /* @__PURE__ */ new Date()), [days, now]);
2097
+ if (range === "year") {
2098
+ const yearWeeks = buildYearWeeks(days, now ?? /* @__PURE__ */ new Date());
2099
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2100
+ className: UsageBilling_module_css_default.heatmap,
2101
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
2102
+ className: UsageBilling_module_css_default.heatmapYearScroll,
2103
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
2104
+ className: UsageBilling_module_css_default.heatmapYearGrid,
2105
+ role: "img",
2106
+ "aria-label": "yearly cost heatmap",
2107
+ "data-testid": "heatmap-year-grid",
2108
+ children: yearWeeks.flat().map((cell) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
2109
+ type: "button",
2110
+ className: UsageBilling_module_css_default.heatmapYearCell,
2111
+ "data-testid": "heatmap-year-cell",
2112
+ "data-level": cell.level,
2113
+ style: { background: LEVEL_COLORS[cell.level] },
2114
+ title: `${cell.date} · ${money(cell.value)}`,
2115
+ "aria-label": `${cell.date}: ${money(cell.value)}`
2116
+ }, cell.date))
2117
+ })
2118
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
2119
+ className: UsageBilling_module_css_default.heatmapFooter,
2120
+ children: [
2121
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2122
+ className: UsageBilling_module_css_default.heatmapLegendText,
2123
+ children: t("billing.heatmapLess")
2124
+ }),
2125
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2126
+ className: UsageBilling_module_css_default.heatmapLegend,
2127
+ children: LEVEL_COLORS.map((color, level) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("i", { style: { background: color } }, level))
2128
+ }),
2129
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2130
+ className: UsageBilling_module_css_default.heatmapLegendText,
2131
+ children: t("billing.heatmapMore")
2132
+ })
2133
+ ]
2134
+ })]
2135
+ });
2136
+ }
1699
2137
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1700
2138
  className: UsageBilling_module_css_default.heatmap,
1701
2139
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1702
2140
  className: UsageBilling_module_css_default.heatmapGrid,
1703
2141
  role: "img",
1704
2142
  "aria-label": "daily cost heatmap",
1705
- children: weeks.map((week) => week.map((cell) => {
2143
+ children: monthWeeks.map((week) => week.map((cell) => {
1706
2144
  if (cell.placeholder) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1707
2145
  className: UsageBilling_module_css_default.heatmapCellEmpty,
1708
2146
  children: cell.dayNum
@@ -2026,7 +2464,23 @@ window.__ModuleLoader__.load({
2026
2464
  "billing.official": "官方",
2027
2465
  "billing.thirdParty": "三方",
2028
2466
  "billing.officialCost": "官方费用",
2029
- "billing.thirdPartyCost": "三方费用"
2467
+ "billing.thirdPartyCost": "三方费用",
2468
+ "billing.perfSamples": "样本",
2469
+ "billing.perfTtft": "首字延时",
2470
+ "billing.perfP50": "P50",
2471
+ "billing.perfP90": "P90",
2472
+ "billing.perfTps": "生成速度",
2473
+ "billing.perfLatency": "总延迟",
2474
+ "billing.perfEstimated": "估算样本",
2475
+ "billing.perfEmpty": "暂无性能数据",
2476
+ "billing.perfTpsUnit": "tok/s",
2477
+ "billing.perfTitle": "性能",
2478
+ "billing.perfHint": "按模型与按小时聚合;估算样本为工具续写步骤",
2479
+ "billing.heatmapYear": "年",
2480
+ "billing.heatmapMonth": "月",
2481
+ "billing.activeDays": "活跃天数",
2482
+ "billing.streakDays": "连续使用",
2483
+ "billing.subscriptionAutoDetect": "自动识别"
2030
2484
  };
2031
2485
  const en = {
2032
2486
  "billing.title": "Usage",
@@ -2167,7 +2621,23 @@ window.__ModuleLoader__.load({
2167
2621
  "billing.official": "Official",
2168
2622
  "billing.thirdParty": "Third-party",
2169
2623
  "billing.officialCost": "Official cost",
2170
- "billing.thirdPartyCost": "Third-party cost"
2624
+ "billing.thirdPartyCost": "Third-party cost",
2625
+ "billing.perfSamples": "Samples",
2626
+ "billing.perfTtft": "TTFT",
2627
+ "billing.perfP50": "P50",
2628
+ "billing.perfP90": "P90",
2629
+ "billing.perfTps": "Speed",
2630
+ "billing.perfLatency": "Total latency",
2631
+ "billing.perfEstimated": "Estimated",
2632
+ "billing.perfEmpty": "No performance data yet",
2633
+ "billing.perfTpsUnit": "tok/s",
2634
+ "billing.perfTitle": "Performance",
2635
+ "billing.perfHint": "Per model & per hour; estimated samples are tool-continuation steps",
2636
+ "billing.heatmapYear": "Year",
2637
+ "billing.heatmapMonth": "Month",
2638
+ "billing.activeDays": "Active days",
2639
+ "billing.streakDays": "Streak",
2640
+ "billing.subscriptionAutoDetect": "Auto"
2171
2641
  };
2172
2642
  //#endregion
2173
2643
  //#region src/client/provider-display.ts
@@ -2556,6 +3026,23 @@ window.__ModuleLoader__.load({
2556
3026
  offPeak
2557
3027
  };
2558
3028
  }
3029
+ /** 近 7 天费用序列(含今天,缺日补 0):触发卡 hover 速览的迷你柱数据源。
3030
+ * 导出供测试:纯函数(日期取本地时区)。 */
3031
+ function activeDaysOf(byDay) {
3032
+ return Object.keys(byDay).length;
3033
+ }
3034
+ /** 连续使用天数:从今天往前连续「有调用记录」的天数;今天无记录则为 0。
3035
+ * 导出供测试:纯函数(日期取本地时区)。 */
3036
+ function streakDaysOf(byDay, now = Date.now()) {
3037
+ let streak = 0;
3038
+ const cursor = new Date(now);
3039
+ for (;;) {
3040
+ if (!(localDayStamp(cursor.getTime()) in byDay)) break;
3041
+ streak += 1;
3042
+ cursor.setDate(cursor.getDate() - 1);
3043
+ }
3044
+ return streak;
3045
+ }
2559
3046
  /**
2560
3047
  * 近 7 天费用序列(含今天,缺日补 0):触发卡 hover 速览的迷你柱数据源。
2561
3048
  * 导出供测试:纯函数(日期取本地时区)。
@@ -2677,7 +3164,8 @@ window.__ModuleLoader__.load({
2677
3164
  ...Array.isArray(candidate.bySession) ? { bySession: candidate.bySession } : {},
2678
3165
  ...Array.isArray(candidate.byTurn) ? { byTurn: candidate.byTurn } : {},
2679
3166
  ...Array.isArray(candidate.byWorkspace) ? { byWorkspace: candidate.byWorkspace } : {},
2680
- ...candidate.byRole !== null && typeof candidate.byRole === "object" ? { byRole: candidate.byRole } : {}
3167
+ ...candidate.byRole !== null && typeof candidate.byRole === "object" ? { byRole: candidate.byRole } : {},
3168
+ ...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 } : {}
2681
3169
  };
2682
3170
  } catch {
2683
3171
  return null;
@@ -2871,6 +3359,7 @@ window.__ModuleLoader__.load({
2871
3359
  const { total, byModel, byDay } = stats;
2872
3360
  const [tab, setTab] = (0, react.useState)("overview");
2873
3361
  const [trendDays, setTrendDays] = (0, react.useState)(7);
3362
+ const [heatmapRange, setHeatmapRange] = (0, react.useState)("month");
2874
3363
  const rateInfo = getRateInfo();
2875
3364
  const money = (cny) => formatMoney(currency === "usd" ? cnyToUsd(cny) : cny, currency);
2876
3365
  const lang = currency === "usd" ? "en" : "zh";
@@ -2976,6 +3465,8 @@ window.__ModuleLoader__.load({
2976
3465
  date,
2977
3466
  value: day.cost
2978
3467
  })), [byDay]);
3468
+ const activeDays = activeDaysOf(byDay);
3469
+ const streakDays = streakDaysOf(byDay);
2979
3470
  const trend = (0, react.useMemo)(() => trendDates.map((date) => {
2980
3471
  const byModel = {};
2981
3472
  const dayModels = stats.byDayModels?.[date];
@@ -3410,16 +3901,47 @@ window.__ModuleLoader__.load({
3410
3901
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
3411
3902
  className: UsageBilling_module_css_default.panel,
3412
3903
  "data-testid": "billing-panel-heatmap",
3413
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
3904
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3414
3905
  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
- })
3906
+ children: [
3907
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
3908
+ className: UsageBilling_module_css_default.panelTitle,
3909
+ children: t("billing.heatmap")
3910
+ }),
3911
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3912
+ className: UsageBilling_module_css_default.rangeToggle,
3913
+ role: "group",
3914
+ "aria-label": t("billing.heatmap"),
3915
+ children: ["month", "year"].map((range) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
3916
+ type: "button",
3917
+ className: clsx(UsageBilling_module_css_default.rangeButton, heatmapRange === range && UsageBilling_module_css_default.rangeButtonActive),
3918
+ "aria-pressed": heatmapRange === range,
3919
+ "data-testid": `billing-heatmap-${range}`,
3920
+ onClick: () => {
3921
+ setHeatmapRange(range);
3922
+ },
3923
+ children: range === "month" ? t("billing.heatmapMonth") : t("billing.heatmapYear")
3924
+ }, range))
3925
+ }),
3926
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
3927
+ className: UsageBilling_module_css_default.panelHint,
3928
+ "data-testid": "billing-heatmap-summary",
3929
+ children: [
3930
+ t("billing.activeDays"),
3931
+ " ",
3932
+ activeDays,
3933
+ " · ",
3934
+ t("billing.streakDays"),
3935
+ " ",
3936
+ streakDays
3937
+ ]
3938
+ })
3939
+ ]
3419
3940
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(UsageHeatmap, {
3420
3941
  days: heatmapDays,
3421
3942
  currency,
3422
- t
3943
+ t,
3944
+ range: heatmapRange
3423
3945
  })]
3424
3946
  })
3425
3947
  ]
@@ -3955,11 +4477,27 @@ window.__ModuleLoader__.load({
3955
4477
  className: UsageBilling_module_css_default.subscriptionName,
3956
4478
  children: providerName(quota.displayName)
3957
4479
  }),
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
- }),
4480
+ quota.planType === "code" && (() => {
4481
+ const tier = tierInfoOf(quota.provider);
4482
+ const tierFee = tier !== void 0 ? t("billing.subscriptionFeePerMonth").replace("{amount}", tier.currency === "USD" ? `$${tier.amount}` : `¥${tier.amount}`) : void 0;
4483
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
4484
+ className: UsageBilling_module_css_default.subscriptionPlan,
4485
+ "data-kind": "code",
4486
+ children: [
4487
+ tierFee ?? (quota.subscriptionAmount !== void 0 && quota.subscriptionAmount > 0 ? t("billing.subscriptionFeePerMonth").replace("{amount}", money(quota.subscriptionAmount)) : t("billing.planTypeCode")),
4488
+ tier?.label !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4489
+ className: UsageBilling_module_css_default.subscriptionTier,
4490
+ "data-testid": `billing-tier-${quota.provider}`,
4491
+ children: tier.label
4492
+ }),
4493
+ tier !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4494
+ className: UsageBilling_module_css_default.subscriptionAuto,
4495
+ "data-testid": `billing-auto-${quota.provider}`,
4496
+ children: t("billing.subscriptionAutoDetect")
4497
+ })
4498
+ ]
4499
+ });
4500
+ })(),
3963
4501
  quota.planType === "token" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3964
4502
  className: UsageBilling_module_css_default.subscriptionPlan,
3965
4503
  "data-kind": "token",
@@ -4060,6 +4598,24 @@ window.__ModuleLoader__.load({
4060
4598
  })
4061
4599
  ]
4062
4600
  }),
4601
+ stats.perf !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
4602
+ className: UsageBilling_module_css_default.panel,
4603
+ "data-testid": "billing-panel-perf",
4604
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
4605
+ className: UsageBilling_module_css_default.panelHead,
4606
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
4607
+ className: UsageBilling_module_css_default.panelTitle,
4608
+ children: t("billing.perfTitle")
4609
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
4610
+ className: UsageBilling_module_css_default.panelHint,
4611
+ children: t("billing.perfHint")
4612
+ })]
4613
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(PerfPanel, {
4614
+ perf: stats.perf,
4615
+ models: chartModels,
4616
+ t
4617
+ })]
4618
+ }),
4063
4619
  roleRows.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
4064
4620
  className: UsageBilling_module_css_default.panel,
4065
4621
  "data-testid": "billing-panel-roles",