@shi-yangyang/dsh-token-dashboard 0.2.0 → 0.2.1

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/client/client.js CHANGED
@@ -39,10 +39,10 @@ window.__ModuleLoader__.load({
39
39
  module.exports = __toCommonJS(index_exports);
40
40
 
41
41
  // src/client/plugin.ts
42
- var import_react94 = require("react");
42
+ var import_react93 = require("react");
43
43
 
44
44
  // src/client/App.tsx
45
- var import_react93 = require("react");
45
+ var import_react92 = require("react");
46
46
 
47
47
  // src/client/components/Cards.tsx
48
48
  var import_react = require("react");
@@ -329,10 +329,10 @@ window.__ModuleLoader__.load({
329
329
  }
330
330
 
331
331
  // src/client/components/Cost.tsx
332
- var import_react57 = require("react");
332
+ var import_react56 = require("react");
333
333
 
334
334
  // src/client/components/common.tsx
335
- var import_react50 = require("react");
335
+ var import_react49 = require("react");
336
336
 
337
337
  // src/client/icons.tsx
338
338
  var import_react2 = require("react");
@@ -15869,7 +15869,7 @@ window.__ModuleLoader__.load({
15869
15869
 
15870
15870
  // src/client/beui/components/motion/morphing-modal.tsx
15871
15871
  var import_react47 = require("react");
15872
- var import_react49 = require("react");
15872
+ var import_react48 = require("react");
15873
15873
 
15874
15874
  // src/client/beui/lib/hooks/use-focus-trap.ts
15875
15875
  var import_react46 = require("react");
@@ -15935,154 +15935,6 @@ window.__ModuleLoader__.load({
15935
15935
  }, [open, panel]);
15936
15936
  }
15937
15937
 
15938
- // src/client/beui/components/motion/morphing-modal.tsx
15939
- function MorphingModal({
15940
- viewId,
15941
- onClose,
15942
- children,
15943
- placement = "bottom",
15944
- ariaLabel,
15945
- className
15946
- }) {
15947
- const open = viewId !== null;
15948
- const reduce = useReducedMotion();
15949
- const panelRef = (0, import_react49.useRef)(null);
15950
- const uid = (0, import_react49.useId)();
15951
- const [headingId, setHeadingId] = (0, import_react49.useState)();
15952
- useFocusTrap(open, panelRef, { onEscape: onClose });
15953
- const currentView = () => Array.from(
15954
- panelRef.current?.querySelectorAll("[data-view]") ?? []
15955
- ).find((element) => element.dataset.view === viewId);
15956
- (0, import_react49.useLayoutEffect)(() => {
15957
- if (!viewId || ariaLabel) return;
15958
- const heading = currentView()?.querySelector(
15959
- "h1, h2, h3, h4, h5, h6"
15960
- );
15961
- if (heading && !heading.id) heading.id = `${uid}-${viewId}-title`;
15962
- setHeadingId(heading?.id);
15963
- });
15964
- const shownView = (0, import_react49.useRef)(viewId);
15965
- (0, import_react49.useEffect)(() => {
15966
- const previous = shownView.current;
15967
- shownView.current = viewId;
15968
- if (!viewId || !previous || previous === viewId) return;
15969
- const panel = panelRef.current;
15970
- const active2 = document.activeElement;
15971
- if (!panel || active2 && active2 !== document.body && !panel.contains(active2))
15972
- return;
15973
- const view = currentView();
15974
- (focusablesIn(view ?? null)[0] ?? panel).focus({ preventScroll: true });
15975
- });
15976
- const enterY = reduce ? 0 : placement === "bottom" ? 40 : 20;
15977
- const enterScale = reduce ? 1 : 0.97;
15978
- (0, import_react49.useEffect)(() => {
15979
- if (!open) return;
15980
- const prev = document.body.style.overflow;
15981
- document.body.style.overflow = "hidden";
15982
- return () => {
15983
- document.body.style.overflow = prev;
15984
- };
15985
- }, [open]);
15986
- return /* @__PURE__ */ (0, import_react47.createElement)(AnimatePresence, { initial: false }, open ? /* @__PURE__ */ (0, import_react47.createElement)(PresenceGate, { key: "backdrop" }, ({ gate }) => /* @__PURE__ */ (0, import_react47.createElement)(
15987
- motion2.button,
15988
- {
15989
- type: "button",
15990
- "aria-label": "Close modal",
15991
- tabIndex: -1,
15992
- initial: { opacity: 0 },
15993
- animate: { opacity: 1 },
15994
- exit: { opacity: 0 },
15995
- transition: { duration: 0.2, ease: EASE_OUT },
15996
- ...gate,
15997
- onClick: onClose,
15998
- className: "pointer-events-auto fixed inset-0 z-[80] bg-background/5 [backdrop-filter:blur(14px)_saturate(140%)] [-webkit-backdrop-filter:blur(14px)_saturate(140%)]"
15999
- }
16000
- )) : null, open ? /* @__PURE__ */ (0, import_react47.createElement)(PresenceGate, { key: "panel-layer" }, ({ isPresent: isPresent2, gate }) => (
16001
- // The layer itself never takes pointer events, so it carries
16002
- // `inert` alone rather than the gate's pointer-events value.
16003
- /* @__PURE__ */ (0, import_react47.createElement)(
16004
- "div",
16005
- {
16006
- inert: !isPresent2 ? "" : void 0,
16007
- className: cn(
16008
- "pointer-events-none fixed inset-4 z-[80] flex justify-center",
16009
- placement === "bottom" ? "items-end pb-4" : "items-center"
16010
- )
16011
- },
16012
- /* @__PURE__ */ (0, import_react47.createElement)(
16013
- motion2.div,
16014
- {
16015
- key: "panel",
16016
- ref: panelRef,
16017
- role: "dialog",
16018
- "aria-modal": "true",
16019
- "aria-label": ariaLabel,
16020
- "aria-labelledby": ariaLabel ? void 0 : headingId,
16021
- tabIndex: -1,
16022
- layout: true,
16023
- initial: { opacity: 0, y: enterY, scale: enterScale },
16024
- animate: { opacity: 1, y: 0, scale: 1 },
16025
- exit: {
16026
- opacity: 0,
16027
- y: enterY,
16028
- scale: reduce ? 1 : 0.98,
16029
- transition: { duration: 0.18, ease: EASE_OUT }
16030
- },
16031
- transition: SPRING_PANEL,
16032
- ...gate,
16033
- className: cn(
16034
- "pointer-events-auto relative w-full max-w-sm overflow-hidden rounded-3xl border border-border bg-background shadow-2xl outline-none will-change-transform",
16035
- className
16036
- )
16037
- },
16038
- /* @__PURE__ */ (0, import_react47.createElement)(motion2.div, { layout: "position", className: "p-5" }, /* @__PURE__ */ (0, import_react47.createElement)(AnimatePresence, { mode: "popLayout", initial: false }, /* @__PURE__ */ (0, import_react47.createElement)(
16039
- motion2.div,
16040
- {
16041
- key: viewId,
16042
- "data-view": viewId,
16043
- initial: reduce ? { opacity: 0 } : { opacity: 0, y: 8, filter: "blur(4px)" },
16044
- animate: reduce ? {
16045
- opacity: 1,
16046
- transition: {
16047
- duration: 0.18,
16048
- ease: EASE_OUT
16049
- }
16050
- } : {
16051
- opacity: 1,
16052
- y: 0,
16053
- filter: "blur(0px)",
16054
- transition: {
16055
- duration: 0.24,
16056
- ease: EASE_OUT
16057
- }
16058
- },
16059
- exit: reduce ? {
16060
- opacity: 0,
16061
- transition: {
16062
- duration: 0.14,
16063
- ease: EASE_OUT
16064
- }
16065
- } : {
16066
- opacity: 0,
16067
- y: -8,
16068
- filter: "blur(4px)",
16069
- transition: {
16070
- duration: 0.16,
16071
- ease: EASE_OUT
16072
- }
16073
- }
16074
- },
16075
- /* @__PURE__ */ (0, import_react47.createElement)(PresenceGate, null, ({ isPresent: viewPresent }) => (
16076
- // The outgoing view stays for its exit; inert keeps
16077
- // the trap and assistive technology on the incoming one.
16078
- /* @__PURE__ */ (0, import_react47.createElement)("div", { inert: !viewPresent ? "" : void 0 }, children)
16079
- ))
16080
- )))
16081
- )
16082
- )
16083
- )) : null);
16084
- }
16085
-
16086
15938
  // src/client/components/common.tsx
16087
15939
  function Button3({
16088
15940
  variant = "default",
@@ -16094,7 +15946,7 @@ window.__ModuleLoader__.load({
16094
15946
  ...rest
16095
15947
  }) {
16096
15948
  const beuiVariant = variant === "primary" ? "primary" : variant === "ghost" ? "ghost" : "outline";
16097
- return (0, import_react50.createElement)(Button, {
15949
+ return (0, import_react49.createElement)(Button, {
16098
15950
  ...rest,
16099
15951
  variant: beuiVariant,
16100
15952
  size: iconOnly ? "icon" : "sm",
@@ -16105,46 +15957,46 @@ window.__ModuleLoader__.load({
16105
15957
  }
16106
15958
  function Tag({ tone, children }) {
16107
15959
  const suffix = tone === void 0 ? "" : ` tdb-tag--${tone}`;
16108
- return (0, import_react50.createElement)("span", { className: `tdb-tag${suffix}` }, children);
15960
+ return (0, import_react49.createElement)("span", { className: `tdb-tag${suffix}` }, children);
16109
15961
  }
16110
15962
  function ShareBar({ ratio, label: label2 }) {
16111
15963
  const percent2 = Number.isFinite(ratio) ? Math.max(0, Math.min(1, ratio)) : 0;
16112
- return (0, import_react50.createElement)(
15964
+ return (0, import_react49.createElement)(
16113
15965
  "div",
16114
15966
  { className: "tdb-share" },
16115
- (0, import_react50.createElement)(
15967
+ (0, import_react49.createElement)(
16116
15968
  "div",
16117
15969
  { className: "tdb-share-track" },
16118
- (0, import_react50.createElement)("div", { className: "tdb-share-fill", style: { width: `${(percent2 * 100).toFixed(2)}%` } })
15970
+ (0, import_react49.createElement)("div", { className: "tdb-share-fill", style: { width: `${(percent2 * 100).toFixed(2)}%` } })
16119
15971
  ),
16120
- (0, import_react50.createElement)("span", { className: "tdb-share-text" }, label2)
15972
+ (0, import_react49.createElement)("span", { className: "tdb-share-text" }, label2)
16121
15973
  );
16122
15974
  }
16123
15975
  function Notice({ tone = "info", icon, children, action }) {
16124
15976
  const variant = tone === "error" ? "destructive" : tone === "warn" ? "warning" : "info";
16125
- return (0, import_react50.createElement)(
15977
+ return (0, import_react49.createElement)(
16126
15978
  Alert,
16127
15979
  { variant, open: true, className: "tdb-notice", role: tone === "error" ? "alert" : "status" },
16128
- (0, import_react50.createElement)(
15980
+ (0, import_react49.createElement)(
16129
15981
  AlertContent,
16130
15982
  {},
16131
15983
  icon,
16132
- (0, import_react50.createElement)("div", { className: "min-w-0" }, children),
16133
- action === void 0 ? null : (0, import_react50.createElement)(AlertAction, {}, action)
15984
+ (0, import_react49.createElement)("div", { className: "min-w-0" }, children),
15985
+ action === void 0 ? null : (0, import_react49.createElement)(AlertAction, {}, action)
16134
15986
  )
16135
15987
  );
16136
15988
  }
16137
15989
  function EmptyState({ icon, title }) {
16138
- return (0, import_react50.createElement)(
15990
+ return (0, import_react49.createElement)(
16139
15991
  "div",
16140
15992
  { className: "tdb-empty" },
16141
15993
  icon ?? null,
16142
- (0, import_react50.createElement)("div", { style: { color: "var(--tdb-ink)" } }, title)
15994
+ (0, import_react49.createElement)("div", { style: { color: "var(--tdb-ink)" } }, title)
16143
15995
  );
16144
15996
  }
16145
15997
  function Menu({ open, onClose, triggerRef, children }) {
16146
- const ref = (0, import_react50.useRef)(null);
16147
- (0, import_react50.useEffect)(() => {
15998
+ const ref = (0, import_react49.useRef)(null);
15999
+ (0, import_react49.useEffect)(() => {
16148
16000
  if (!open) return;
16149
16001
  const onPointer = (event) => {
16150
16002
  const target = event.target;
@@ -16164,76 +16016,45 @@ window.__ModuleLoader__.load({
16164
16016
  };
16165
16017
  }, [open, onClose, triggerRef]);
16166
16018
  if (!open) return null;
16167
- return (0, import_react50.createElement)("div", { className: "tdb-menu", ref, role: "menu" }, children);
16019
+ return (0, import_react49.createElement)("div", { className: "tdb-menu", ref, role: "menu" }, children);
16168
16020
  }
16169
16021
  function MenuItem({ onClick, title }) {
16170
- return (0, import_react50.createElement)("button", { type: "button", className: "tdb-menu-item", role: "menuitem", onClick }, title);
16171
- }
16172
- function Modal({ open, title, subtitle, onClose, closeLabel, children, footer }) {
16173
- if (!open) return null;
16174
- return (0, import_react50.createElement)(MorphingModal, {
16175
- viewId: "modal",
16176
- onClose,
16177
- placement: "center",
16178
- ariaLabel: typeof title === "string" ? title : closeLabel,
16179
- className: "tdb-modal max-w-2xl",
16180
- children: [
16181
- (0, import_react50.createElement)(
16182
- "div",
16183
- { className: "tdb-modal-head" },
16184
- (0, import_react50.createElement)(
16185
- "div",
16186
- {},
16187
- (0, import_react50.createElement)("h2", { className: "tdb-modal-title" }, title),
16188
- subtitle === void 0 ? null : (0, import_react50.createElement)("p", { className: "tdb-modal-sub" }, subtitle)
16189
- ),
16190
- (0, import_react50.createElement)(Button3, {
16191
- variant: "ghost",
16192
- iconOnly: true,
16193
- "data-autofocus": true,
16194
- "aria-label": closeLabel,
16195
- onClick: onClose
16196
- }, (0, import_react50.createElement)(CloseIcon, { size: 16 }))
16197
- ),
16198
- (0, import_react50.createElement)("div", { className: "tdb-modal-body" }, children),
16199
- footer === void 0 ? null : (0, import_react50.createElement)("div", { className: "tdb-modal-foot" }, footer)
16200
- ]
16201
- });
16022
+ return (0, import_react49.createElement)("button", { type: "button", className: "tdb-menu-item", role: "menuitem", onClick }, title);
16202
16023
  }
16203
16024
  function SkeletonDashboard() {
16204
- return (0, import_react50.createElement)(
16025
+ return (0, import_react49.createElement)(
16205
16026
  "div",
16206
16027
  { className: "tdb-container", "aria-busy": "true" },
16207
- (0, import_react50.createElement)(
16028
+ (0, import_react49.createElement)(
16208
16029
  "div",
16209
16030
  { className: "tdb-head" },
16210
- (0, import_react50.createElement)("div", { className: "tdb-skeleton", style: { width: "180px", height: "26px" } })
16031
+ (0, import_react49.createElement)("div", { className: "tdb-skeleton", style: { width: "180px", height: "26px" } })
16211
16032
  ),
16212
- (0, import_react50.createElement)(
16033
+ (0, import_react49.createElement)(
16213
16034
  "div",
16214
16035
  { className: "tdb-surface" },
16215
- (0, import_react50.createElement)(
16036
+ (0, import_react49.createElement)(
16216
16037
  "div",
16217
16038
  { className: "tdb-kpis" },
16218
- (0, import_react50.createElement)("div", { className: "tdb-kpi" }, (0, import_react50.createElement)("div", { className: "tdb-skeleton", style: { height: "58px" } })),
16219
- (0, import_react50.createElement)("div", { className: "tdb-kpi" }, (0, import_react50.createElement)("div", { className: "tdb-skeleton", style: { height: "58px" } })),
16220
- (0, import_react50.createElement)("div", { className: "tdb-kpi" }, (0, import_react50.createElement)("div", { className: "tdb-skeleton", style: { height: "58px" } })),
16221
- (0, import_react50.createElement)("div", { className: "tdb-kpi" }, (0, import_react50.createElement)("div", { className: "tdb-skeleton", style: { height: "58px" } }))
16039
+ (0, import_react49.createElement)("div", { className: "tdb-kpi" }, (0, import_react49.createElement)("div", { className: "tdb-skeleton", style: { height: "58px" } })),
16040
+ (0, import_react49.createElement)("div", { className: "tdb-kpi" }, (0, import_react49.createElement)("div", { className: "tdb-skeleton", style: { height: "58px" } })),
16041
+ (0, import_react49.createElement)("div", { className: "tdb-kpi" }, (0, import_react49.createElement)("div", { className: "tdb-skeleton", style: { height: "58px" } })),
16042
+ (0, import_react49.createElement)("div", { className: "tdb-kpi" }, (0, import_react49.createElement)("div", { className: "tdb-skeleton", style: { height: "58px" } }))
16222
16043
  ),
16223
- (0, import_react50.createElement)("div", { className: "tdb-rule" }),
16224
- (0, import_react50.createElement)("div", { className: "tdb-section" }, (0, import_react50.createElement)("div", { className: "tdb-skeleton tdb-skeleton--chart" })),
16225
- (0, import_react50.createElement)("div", { className: "tdb-rule" }),
16226
- (0, import_react50.createElement)("div", { className: "tdb-section" }, (0, import_react50.createElement)("div", { className: "tdb-skeleton tdb-skeleton--table" }))
16044
+ (0, import_react49.createElement)("div", { className: "tdb-rule" }),
16045
+ (0, import_react49.createElement)("div", { className: "tdb-section" }, (0, import_react49.createElement)("div", { className: "tdb-skeleton tdb-skeleton--chart" })),
16046
+ (0, import_react49.createElement)("div", { className: "tdb-rule" }),
16047
+ (0, import_react49.createElement)("div", { className: "tdb-section" }, (0, import_react49.createElement)("div", { className: "tdb-skeleton tdb-skeleton--table" }))
16227
16048
  )
16228
16049
  );
16229
16050
  }
16230
16051
 
16231
16052
  // src/client/components/ui/Pager.tsx
16232
- var import_react54 = require("react");
16053
+ var import_react53 = require("react");
16233
16054
 
16234
16055
  // src/client/beui/components/motion/pagination.tsx
16235
- var import_react51 = require("react");
16236
- var import_react53 = require("react");
16056
+ var import_react50 = require("react");
16057
+ var import_react52 = require("react");
16237
16058
  function paginationRange(page, totalPages, siblings = 1, boundaries = 1) {
16238
16059
  const range = (start, end) => Array.from({ length: Math.max(0, end - start + 1) }, (_, index) => start + index);
16239
16060
  const slots = boundaries * 2 + siblings * 2 + 3;
@@ -16279,11 +16100,11 @@ window.__ModuleLoader__.load({
16279
16100
  "aria-label": ariaLabel = "Pagination",
16280
16101
  ...props
16281
16102
  }) {
16282
- const id3 = (0, import_react53.useId)();
16103
+ const id3 = (0, import_react52.useId)();
16283
16104
  const reduce = useReducedMotion();
16284
16105
  const total = Math.max(1, Math.floor(totalPages));
16285
16106
  const clamp3 = (value) => Math.min(total, Math.max(1, Math.round(value)));
16286
- const [internal, setInternal] = (0, import_react53.useState)(() => clamp3(defaultPage));
16107
+ const [internal, setInternal] = (0, import_react52.useState)(() => clamp3(defaultPage));
16287
16108
  const current2 = clamp3(page ?? internal);
16288
16109
  const go = (next) => {
16289
16110
  const target = clamp3(next);
@@ -16315,22 +16136,22 @@ window.__ModuleLoader__.load({
16315
16136
  go(target);
16316
16137
  }
16317
16138
  };
16318
- return renderLink ? renderLink(linkProps) : /* @__PURE__ */ (0, import_react51.createElement)("a", { ...linkProps });
16139
+ return renderLink ? renderLink(linkProps) : /* @__PURE__ */ (0, import_react50.createElement)("a", { ...linkProps });
16319
16140
  }
16320
- return /* @__PURE__ */ (0, import_react51.createElement)("button", { type: "button", disabled, onClick: () => go(target), ...shared });
16141
+ return /* @__PURE__ */ (0, import_react50.createElement)("button", { type: "button", disabled, onClick: () => go(target), ...shared });
16321
16142
  };
16322
16143
  const items = paginationRange(current2, total, siblings, boundaries);
16323
16144
  const fade = { duration: reduce ? 0.12 : 0.16, ease: EASE_OUT };
16324
- return /* @__PURE__ */ (0, import_react51.createElement)("nav", { ...props, "aria-label": ariaLabel, className: cn("flex", className) }, /* @__PURE__ */ (0, import_react51.createElement)(LayoutGroup, { id: id3 }, /* @__PURE__ */ (0, import_react51.createElement)("ul", { className: "relative flex items-center gap-0.5 sm:gap-1" }, /* @__PURE__ */ (0, import_react51.createElement)("li", null, control(current2 - 1, {
16145
+ return /* @__PURE__ */ (0, import_react50.createElement)("nav", { ...props, "aria-label": ariaLabel, className: cn("flex", className) }, /* @__PURE__ */ (0, import_react50.createElement)(LayoutGroup, { id: id3 }, /* @__PURE__ */ (0, import_react50.createElement)("ul", { className: "relative flex items-center gap-0.5 sm:gap-1" }, /* @__PURE__ */ (0, import_react50.createElement)("li", null, control(current2 - 1, {
16325
16146
  label: "Previous page",
16326
16147
  disabled: current2 === 1,
16327
16148
  className: "text-muted-foreground hover:text-foreground disabled:pointer-events-none disabled:opacity-40",
16328
- children: /* @__PURE__ */ (0, import_react51.createElement)(ChevronLeft, { "aria-hidden": "true", className: "size-4" })
16329
- })), /* @__PURE__ */ (0, import_react51.createElement)(AnimatePresence, { mode: "popLayout", initial: false }, items.map((item) => {
16149
+ children: /* @__PURE__ */ (0, import_react50.createElement)(ChevronLeft, { "aria-hidden": "true", className: "size-4" })
16150
+ })), /* @__PURE__ */ (0, import_react50.createElement)(AnimatePresence, { mode: "popLayout", initial: false }, items.map((item) => {
16330
16151
  if (typeof item !== "number") {
16331
16152
  const back = item === "ellipsis-start";
16332
16153
  const Chevrons = back ? ChevronsLeft : ChevronsRight;
16333
- return /* @__PURE__ */ (0, import_react51.createElement)(
16154
+ return /* @__PURE__ */ (0, import_react50.createElement)(
16334
16155
  motion2.li,
16335
16156
  {
16336
16157
  key: item,
@@ -16340,18 +16161,18 @@ window.__ModuleLoader__.load({
16340
16161
  exit: { opacity: 0, transition: fade },
16341
16162
  transition: { layout: SPRING_LAYOUT, opacity: fade }
16342
16163
  },
16343
- /* @__PURE__ */ (0, import_react51.createElement)(PresenceGate, null, ({ gate }) => control(current2 + (back ? -jump : jump), {
16164
+ /* @__PURE__ */ (0, import_react50.createElement)(PresenceGate, null, ({ gate }) => control(current2 + (back ? -jump : jump), {
16344
16165
  gate,
16345
16166
  label: back ? `Back ${jump} pages` : `Forward ${jump} pages`,
16346
16167
  className: "group text-muted-foreground hover:text-foreground",
16347
- children: /* @__PURE__ */ (0, import_react51.createElement)(import_react51.Fragment, null, /* @__PURE__ */ (0, import_react51.createElement)(
16168
+ children: /* @__PURE__ */ (0, import_react50.createElement)(import_react50.Fragment, null, /* @__PURE__ */ (0, import_react50.createElement)(
16348
16169
  "span",
16349
16170
  {
16350
16171
  "aria-hidden": "true",
16351
16172
  className: "transition-[opacity,transform] duration-150 ease-out group-hover:scale-75 group-hover:opacity-0 group-focus-visible:scale-75 group-focus-visible:opacity-0 motion-reduce:transform-none"
16352
16173
  },
16353
16174
  "\u2026"
16354
- ), /* @__PURE__ */ (0, import_react51.createElement)(
16175
+ ), /* @__PURE__ */ (0, import_react50.createElement)(
16355
16176
  Chevrons,
16356
16177
  {
16357
16178
  "aria-hidden": "true",
@@ -16362,7 +16183,7 @@ window.__ModuleLoader__.load({
16362
16183
  );
16363
16184
  }
16364
16185
  const isCurrent = item === current2;
16365
- return /* @__PURE__ */ (0, import_react51.createElement)(
16186
+ return /* @__PURE__ */ (0, import_react50.createElement)(
16366
16187
  motion2.li,
16367
16188
  {
16368
16189
  key: item,
@@ -16372,12 +16193,12 @@ window.__ModuleLoader__.load({
16372
16193
  exit: { opacity: 0, scale: reduce ? 1 : 0.8, transition: fade },
16373
16194
  transition: { layout: SPRING_LAYOUT, opacity: fade, scale: SPRING_LAYOUT }
16374
16195
  },
16375
- /* @__PURE__ */ (0, import_react51.createElement)(PresenceGate, null, ({ gate }) => control(item, {
16196
+ /* @__PURE__ */ (0, import_react50.createElement)(PresenceGate, null, ({ gate }) => control(item, {
16376
16197
  gate,
16377
16198
  label: `Page ${item}`,
16378
16199
  current: isCurrent,
16379
16200
  className: isCurrent ? "font-medium text-background" : "text-muted-foreground hover:bg-foreground/[0.05] hover:text-foreground",
16380
- children: /* @__PURE__ */ (0, import_react51.createElement)(import_react51.Fragment, null, isCurrent ? /* @__PURE__ */ (0, import_react51.createElement)(
16201
+ children: /* @__PURE__ */ (0, import_react50.createElement)(import_react50.Fragment, null, isCurrent ? /* @__PURE__ */ (0, import_react50.createElement)(
16381
16202
  motion2.span,
16382
16203
  {
16383
16204
  "aria-hidden": "true",
@@ -16385,28 +16206,28 @@ window.__ModuleLoader__.load({
16385
16206
  transition: SPRING_LAYOUT,
16386
16207
  className: "absolute inset-0 rounded-full bg-foreground"
16387
16208
  }
16388
- ) : null, /* @__PURE__ */ (0, import_react51.createElement)("span", { className: "relative" }, item))
16209
+ ) : null, /* @__PURE__ */ (0, import_react50.createElement)("span", { className: "relative" }, item))
16389
16210
  }))
16390
16211
  );
16391
- })), /* @__PURE__ */ (0, import_react51.createElement)("li", null, control(current2 + 1, {
16212
+ })), /* @__PURE__ */ (0, import_react50.createElement)("li", null, control(current2 + 1, {
16392
16213
  label: "Next page",
16393
16214
  disabled: current2 === total,
16394
16215
  className: "text-muted-foreground hover:text-foreground disabled:pointer-events-none disabled:opacity-40",
16395
- children: /* @__PURE__ */ (0, import_react51.createElement)(ChevronRight, { "aria-hidden": "true", className: "size-4" })
16216
+ children: /* @__PURE__ */ (0, import_react50.createElement)(ChevronRight, { "aria-hidden": "true", className: "size-4" })
16396
16217
  })))));
16397
16218
  }
16398
16219
 
16399
16220
  // src/client/components/ui/Pager.tsx
16400
16221
  function Pager({ page, pages, onChange, label: label2, ariaLabel }) {
16401
- return (0, import_react54.createElement)(
16222
+ return (0, import_react53.createElement)(
16402
16223
  "div",
16403
16224
  { className: "tdb-pager" },
16404
- (0, import_react54.createElement)("span", {}, label2),
16405
- (0, import_react54.createElement)(
16225
+ (0, import_react53.createElement)("span", {}, label2),
16226
+ (0, import_react53.createElement)(
16406
16227
  "div",
16407
16228
  { className: "tdb-pager-actions" },
16408
- (0, import_react54.createElement)("span", { className: "sr-only" }, `${page} / ${pages}`),
16409
- (0, import_react54.createElement)(Pagination, {
16229
+ (0, import_react53.createElement)("span", { className: "sr-only" }, `${page} / ${pages}`),
16230
+ (0, import_react53.createElement)(Pagination, {
16410
16231
  page,
16411
16232
  totalPages: pages,
16412
16233
  onPageChange: onChange,
@@ -16420,29 +16241,29 @@ window.__ModuleLoader__.load({
16420
16241
  }
16421
16242
 
16422
16243
  // src/client/components/ui/Section.tsx
16423
- var import_react55 = require("react");
16244
+ var import_react54 = require("react");
16424
16245
  function Section({ title, actions, children, ariaLabel, className = "" }) {
16425
16246
  const hasHeader = title !== void 0 || actions !== void 0;
16426
- return (0, import_react55.createElement)(
16247
+ return (0, import_react54.createElement)(
16427
16248
  "section",
16428
16249
  {
16429
16250
  className: `tdb-section ${className}`.trim(),
16430
16251
  "aria-label": ariaLabel ?? (typeof title === "string" ? title : void 0)
16431
16252
  },
16432
- hasHeader ? (0, import_react55.createElement)(
16253
+ hasHeader ? (0, import_react54.createElement)(
16433
16254
  "div",
16434
16255
  {
16435
16256
  className: `tdb-section-head${title === void 0 ? " tdb-section-head--actions-only" : ""}`
16436
16257
  },
16437
- title === void 0 ? null : (0, import_react55.createElement)("h2", { className: "tdb-section-title" }, title),
16438
- actions === void 0 ? null : (0, import_react55.createElement)("div", { className: "tdb-section-actions" }, actions)
16258
+ title === void 0 ? null : (0, import_react54.createElement)("h2", { className: "tdb-section-title" }, title),
16259
+ actions === void 0 ? null : (0, import_react54.createElement)("div", { className: "tdb-section-actions" }, actions)
16439
16260
  ) : null,
16440
16261
  children
16441
16262
  );
16442
16263
  }
16443
16264
 
16444
16265
  // src/client/components/ui/DataTable.tsx
16445
- var import_react56 = require("react");
16266
+ var import_react55 = require("react");
16446
16267
  function DataTable({
16447
16268
  rows,
16448
16269
  columns,
@@ -16452,23 +16273,23 @@ window.__ModuleLoader__.load({
16452
16273
  onRowActivate
16453
16274
  }) {
16454
16275
  const activate = onRowActivate;
16455
- return (0, import_react56.createElement)(
16276
+ return (0, import_react55.createElement)(
16456
16277
  "div",
16457
16278
  { className: "tdb-table-wrap" },
16458
- (0, import_react56.createElement)(
16279
+ (0, import_react55.createElement)(
16459
16280
  "table",
16460
16281
  { className: "tdb-table", "aria-label": ariaLabel },
16461
- (0, import_react56.createElement)(
16282
+ (0, import_react55.createElement)(
16462
16283
  "thead",
16463
16284
  {},
16464
- (0, import_react56.createElement)("tr", {}, columns.map((column) => (0, import_react56.createElement)("th", {
16285
+ (0, import_react55.createElement)("tr", {}, columns.map((column) => (0, import_react55.createElement)("th", {
16465
16286
  key: column.key,
16466
16287
  className: column.headerClassName,
16467
16288
  style: column.style,
16468
16289
  ...column.headerProps
16469
16290
  }, column.header)))
16470
16291
  ),
16471
- (0, import_react56.createElement)("tbody", {}, rows.map((row) => (0, import_react56.createElement)("tr", {
16292
+ (0, import_react55.createElement)("tbody", {}, rows.map((row) => (0, import_react55.createElement)("tr", {
16472
16293
  key: rowKey(row),
16473
16294
  className: rowClassName ?? (activate === void 0 ? void 0 : "tdb-row"),
16474
16295
  tabIndex: activate === void 0 ? void 0 : 0,
@@ -16478,7 +16299,7 @@ window.__ModuleLoader__.load({
16478
16299
  event.preventDefault();
16479
16300
  activate(row);
16480
16301
  }
16481
- }, columns.map((column) => (0, import_react56.createElement)("td", {
16302
+ }, columns.map((column) => (0, import_react55.createElement)("td", {
16482
16303
  key: column.key,
16483
16304
  className: typeof column.cellClassName === "function" ? column.cellClassName(row) : column.cellClassName
16484
16305
  }, column.render(row))))))
@@ -16487,7 +16308,7 @@ window.__ModuleLoader__.load({
16487
16308
  }
16488
16309
 
16489
16310
  // src/shared/builtin-prices.generated.ts
16490
- var GENERATED_PRICE_UPDATED = "2026-10-30";
16311
+ var GENERATED_PRICE_UPDATED = "2026-11-09";
16491
16312
  var GENERATED_PRICES = [
16492
16313
  {
16493
16314
  id: "~anthropic/claude-fable-latest",
@@ -16507,15 +16328,15 @@ window.__ModuleLoader__.load({
16507
16328
  },
16508
16329
  {
16509
16330
  id: "~deepseek/deepseek-flash-latest",
16510
- price: { "currency": "USD", "input": 0.0309, "output": 1.25, "cacheRead": 0.0306, "cacheWrite": 0 }
16331
+ price: { "currency": "USD", "input": 6e-3, "output": 0.5, "cacheRead": 5e-3, "cacheWrite": 0 }
16511
16332
  },
16512
16333
  {
16513
16334
  id: "~deepseek/deepseek-pro-latest",
16514
- price: { "currency": "USD", "input": 0.1035, "output": 8, "cacheRead": 0.1, "cacheWrite": 0 }
16335
+ price: { "currency": "USD", "input": 0.0999, "output": 8, "cacheRead": 0.0999, "cacheWrite": 0 }
16515
16336
  },
16516
16337
  {
16517
16338
  id: "~deepseek/deepseek-v4-flash-latest",
16518
- price: { "currency": "USD", "input": 0.0359, "output": 0.3, "cacheRead": 0.0349, "cacheWrite": 0 }
16339
+ price: { "currency": "USD", "input": 0.0434, "output": 0.3, "cacheRead": 0.035, "cacheWrite": 0 }
16519
16340
  },
16520
16341
  {
16521
16342
  id: "~google/gemini-flash-latest",
@@ -16527,7 +16348,7 @@ window.__ModuleLoader__.load({
16527
16348
  },
16528
16349
  {
16529
16350
  id: "~moonshotai/kimi-latest",
16530
- price: { "currency": "USD", "input": 0.1624, "output": 9.3388, "cacheRead": 0.16, "cacheWrite": 0 }
16351
+ price: { "currency": "USD", "input": 0.1824, "output": 9.3388, "cacheRead": 0.18, "cacheWrite": 0 }
16531
16352
  },
16532
16353
  {
16533
16354
  id: "~openai/gpt-astra-latest",
@@ -16559,7 +16380,7 @@ window.__ModuleLoader__.load({
16559
16380
  },
16560
16381
  {
16561
16382
  id: "~z-ai/glm-flash-latest",
16562
- price: { "currency": "USD", "input": 0.0478, "output": 0.0701, "cacheRead": 0.03, "cacheWrite": 0 }
16383
+ price: { "currency": "USD", "input": 0.0335, "output": 0.083, "cacheRead": 0.03, "cacheWrite": 0 }
16563
16384
  },
16564
16385
  {
16565
16386
  id: "~z-ai/glm-latest",
@@ -16611,68 +16432,128 @@ window.__ModuleLoader__.load({
16611
16432
  },
16612
16433
  {
16613
16434
  id: "anthracite-org/magnum-v4-72b",
16614
- price: { "currency": "USD", "input": 2.5, "output": 5, "cacheRead": 0, "cacheWrite": 0 }
16435
+ price: { "currency": "USD", "input": 2.5, "output": 5, "cacheRead": 2.5, "cacheWrite": 0 }
16615
16436
  },
16616
16437
  {
16617
16438
  id: "anthropic/claude-fable-5",
16618
16439
  price: { "currency": "USD", "input": 10, "output": 50, "cacheRead": 1, "cacheWrite": 12.5 }
16619
16440
  },
16441
+ {
16442
+ id: "anthropic/claude-fable-5:batch",
16443
+ price: { "currency": "USD", "input": 5, "output": 25, "cacheRead": 0.5, "cacheWrite": 6.25 }
16444
+ },
16620
16445
  {
16621
16446
  id: "anthropic/claude-fable-5.1",
16622
16447
  price: { "currency": "USD", "input": 10, "output": 50, "cacheRead": 0.25, "cacheWrite": 12.5 }
16623
16448
  },
16449
+ {
16450
+ id: "anthropic/claude-fable-5.1:batch",
16451
+ price: { "currency": "USD", "input": 5, "output": 25, "cacheRead": 0.125, "cacheWrite": 6.25 }
16452
+ },
16624
16453
  {
16625
16454
  id: "anthropic/claude-haiku-4.5",
16626
16455
  price: { "currency": "USD", "input": 1, "output": 5, "cacheRead": 0.1, "cacheWrite": 1.25 }
16627
16456
  },
16457
+ {
16458
+ id: "anthropic/claude-haiku-4.5:batch",
16459
+ price: { "currency": "USD", "input": 0.5, "output": 2.5, "cacheRead": 0.05, "cacheWrite": 0.625 }
16460
+ },
16628
16461
  {
16629
16462
  id: "anthropic/claude-haiku-5.5",
16630
16463
  price: { "currency": "USD", "input": 0.1, "output": 0.5, "cacheRead": 0.01, "cacheWrite": 0.125 }
16631
16464
  },
16465
+ {
16466
+ id: "anthropic/claude-haiku-5.5:batch",
16467
+ price: { "currency": "USD", "input": 0.05, "output": 0.25, "cacheRead": 5e-3, "cacheWrite": 0.0625 }
16468
+ },
16632
16469
  {
16633
16470
  id: "anthropic/claude-opus-4.1",
16634
16471
  price: { "currency": "USD", "input": 15, "output": 75, "cacheRead": 1.5, "cacheWrite": 18.75 }
16635
16472
  },
16473
+ {
16474
+ id: "anthropic/claude-opus-4.1:batch",
16475
+ price: { "currency": "USD", "input": 7.5, "output": 37.5, "cacheRead": 0.75, "cacheWrite": 9.375 }
16476
+ },
16636
16477
  {
16637
16478
  id: "anthropic/claude-opus-4.5",
16638
16479
  price: { "currency": "USD", "input": 5, "output": 25, "cacheRead": 0.5, "cacheWrite": 6.25 }
16639
16480
  },
16481
+ {
16482
+ id: "anthropic/claude-opus-4.5:batch",
16483
+ price: { "currency": "USD", "input": 2.5, "output": 12.5, "cacheRead": 0.25, "cacheWrite": 3.125 }
16484
+ },
16640
16485
  {
16641
16486
  id: "anthropic/claude-opus-4.6",
16642
16487
  price: { "currency": "USD", "input": 5, "output": 25, "cacheRead": 0.5, "cacheWrite": 6.25 }
16643
16488
  },
16489
+ {
16490
+ id: "anthropic/claude-opus-4.6:batch",
16491
+ price: { "currency": "USD", "input": 2.5, "output": 12.5, "cacheRead": 0.25, "cacheWrite": 3.125 }
16492
+ },
16644
16493
  {
16645
16494
  id: "anthropic/claude-opus-4.7",
16646
16495
  price: { "currency": "USD", "input": 5, "output": 25, "cacheRead": 0.5, "cacheWrite": 6.25 }
16647
16496
  },
16497
+ {
16498
+ id: "anthropic/claude-opus-4.7:batch",
16499
+ price: { "currency": "USD", "input": 2.5, "output": 12.5, "cacheRead": 0.25, "cacheWrite": 3.125 }
16500
+ },
16648
16501
  {
16649
16502
  id: "anthropic/claude-opus-4.8",
16650
16503
  price: { "currency": "USD", "input": 5, "output": 25, "cacheRead": 0.5, "cacheWrite": 6.25 }
16651
16504
  },
16505
+ {
16506
+ id: "anthropic/claude-opus-4.8:batch",
16507
+ price: { "currency": "USD", "input": 2.5, "output": 12.5, "cacheRead": 0.25, "cacheWrite": 3.125 }
16508
+ },
16652
16509
  {
16653
16510
  id: "anthropic/claude-opus-5",
16654
16511
  price: { "currency": "USD", "input": 5, "output": 25, "cacheRead": 0.5, "cacheWrite": 6.25 }
16655
16512
  },
16513
+ {
16514
+ id: "anthropic/claude-opus-5:batch",
16515
+ price: { "currency": "USD", "input": 2.5, "output": 12.5, "cacheRead": 0.25, "cacheWrite": 3.125 }
16516
+ },
16656
16517
  {
16657
16518
  id: "anthropic/claude-opus-5.5",
16658
16519
  price: { "currency": "USD", "input": 4, "output": 20, "cacheRead": 0.2, "cacheWrite": 5 }
16659
16520
  },
16521
+ {
16522
+ id: "anthropic/claude-opus-5.5:batch",
16523
+ price: { "currency": "USD", "input": 2, "output": 10, "cacheRead": 0.1, "cacheWrite": 2.5 }
16524
+ },
16660
16525
  {
16661
16526
  id: "anthropic/claude-sonnet-4.5",
16662
16527
  price: { "currency": "USD", "input": 3, "output": 15, "cacheRead": 0.3, "cacheWrite": 3.75 }
16663
16528
  },
16529
+ {
16530
+ id: "anthropic/claude-sonnet-4.5:batch",
16531
+ price: { "currency": "USD", "input": 1.5, "output": 7.5, "cacheRead": 0.15, "cacheWrite": 1.875 }
16532
+ },
16664
16533
  {
16665
16534
  id: "anthropic/claude-sonnet-4.6",
16666
16535
  price: { "currency": "USD", "input": 3, "output": 15, "cacheRead": 0.3, "cacheWrite": 3.75 }
16667
16536
  },
16537
+ {
16538
+ id: "anthropic/claude-sonnet-4.6:batch",
16539
+ price: { "currency": "USD", "input": 1.5, "output": 7.5, "cacheRead": 0.15, "cacheWrite": 1.875 }
16540
+ },
16668
16541
  {
16669
16542
  id: "anthropic/claude-sonnet-5",
16670
16543
  price: { "currency": "USD", "input": 2, "output": 10, "cacheRead": 0.2, "cacheWrite": 2.5 }
16671
16544
  },
16545
+ {
16546
+ id: "anthropic/claude-sonnet-5:batch",
16547
+ price: { "currency": "USD", "input": 1, "output": 5, "cacheRead": 0.1, "cacheWrite": 1.25 }
16548
+ },
16672
16549
  {
16673
16550
  id: "anthropic/claude-sonnet-5.5",
16674
16551
  price: { "currency": "USD", "input": 2, "output": 10, "cacheRead": 0.1, "cacheWrite": 2.5 }
16675
16552
  },
16553
+ {
16554
+ id: "anthropic/claude-sonnet-5.5:batch",
16555
+ price: { "currency": "USD", "input": 1, "output": 5, "cacheRead": 0.05, "cacheWrite": 1.25 }
16556
+ },
16676
16557
  {
16677
16558
  id: "bytedance-seed/seed-1.6",
16678
16559
  price: { "currency": "USD", "input": 0.25, "output": 2, "cacheRead": 0, "cacheWrite": 0 }
@@ -16731,7 +16612,7 @@ window.__ModuleLoader__.load({
16731
16612
  },
16732
16613
  {
16733
16614
  id: "deepseek/deepseek-chat",
16734
- price: { "currency": "USD", "input": 0.2574, "output": 1.0287, "cacheRead": 0, "cacheWrite": 0 }
16615
+ price: { "currency": "USD", "input": 0.32, "output": 0.89, "cacheRead": 0, "cacheWrite": 0 }
16735
16616
  },
16736
16617
  {
16737
16618
  id: "deepseek/deepseek-chat-v3-0324",
@@ -16751,27 +16632,51 @@ window.__ModuleLoader__.load({
16751
16632
  },
16752
16633
  {
16753
16634
  id: "deepseek/deepseek-v3.2",
16754
- price: { "currency": "USD", "input": 0.28, "output": 0.42, "cacheRead": 0.028, "cacheWrite": 0 }
16635
+ price: { "currency": "USD", "input": 0.26, "output": 0.38, "cacheRead": 0.13, "cacheWrite": 0 }
16755
16636
  },
16756
16637
  {
16757
16638
  id: "deepseek/deepseek-v3.2-exp",
16758
16639
  price: { "currency": "USD", "input": 0.27, "output": 0.41, "cacheRead": 0, "cacheWrite": 0 }
16759
16640
  },
16641
+ {
16642
+ id: "deepseek/deepseek-v4-flash",
16643
+ price: { "currency": "USD", "input": 0.091, "output": 0.182, "cacheRead": 0.0182, "cacheWrite": 0 }
16644
+ },
16760
16645
  {
16761
16646
  id: "deepseek/deepseek-v4-flash-0731",
16762
- price: { "currency": "USD", "input": 0.119, "output": 0.238, "cacheRead": 0.0238, "cacheWrite": 0 }
16647
+ price: { "currency": "USD", "input": 0.0434, "output": 0.3, "cacheRead": 0.035, "cacheWrite": 0 }
16648
+ },
16649
+ {
16650
+ id: "deepseek/deepseek-v4-flash-0731:batch",
16651
+ price: { "currency": "USD", "input": 0.048, "output": 0.144, "cacheRead": 0.012, "cacheWrite": 0 }
16763
16652
  },
16764
16653
  {
16765
16654
  id: "deepseek/deepseek-v4-flash-vision-exp",
16766
- price: { "currency": "USD", "input": 0.2156, "output": 0.6468, "cacheRead": 686e-5, "cacheWrite": 0 }
16655
+ price: { "currency": "USD", "input": 0.44, "output": 1.32, "cacheRead": 0.014, "cacheWrite": 0 }
16656
+ },
16657
+ {
16658
+ id: "deepseek/deepseek-v4-pro",
16659
+ price: { "currency": "USD", "input": 0.894012, "output": 1.788024, "cacheRead": 0.074501, "cacheWrite": 0 }
16767
16660
  },
16768
16661
  {
16769
16662
  id: "deepseek/deepseek-v4-pro-0813",
16770
- price: { "currency": "USD", "input": 1.32, "output": 3.96, "cacheRead": 0.044, "cacheWrite": 0 }
16663
+ price: { "currency": "USD", "input": 0.111, "output": 4.44, "cacheRead": 0.097, "cacheWrite": 0 }
16664
+ },
16665
+ {
16666
+ id: "deepseek/deepseek-v4.1-flash",
16667
+ price: { "currency": "USD", "input": 0.051, "output": 0.567, "cacheRead": 0.018, "cacheWrite": 0 }
16771
16668
  },
16772
16669
  {
16773
16670
  id: "deepseek/deepseek-v4.1-flash-1017",
16774
- price: { "currency": "USD", "input": 0.3, "output": 1.2, "cacheRead": 6e-3, "cacheWrite": 0 }
16671
+ price: { "currency": "USD", "input": 6e-3, "output": 0.5, "cacheRead": 5e-3, "cacheWrite": 0 }
16672
+ },
16673
+ {
16674
+ id: "deepseek/deepseek-v4.1-flash-1017:batch",
16675
+ price: { "currency": "USD", "input": 0.011, "output": 0.2, "cacheRead": 2e-3, "cacheWrite": 0 }
16676
+ },
16677
+ {
16678
+ id: "deepseek/deepseek-v4.1-flash:batch",
16679
+ price: { "currency": "USD", "input": 0.011, "output": 0.2, "cacheRead": 2e-3, "cacheWrite": 0 }
16775
16680
  },
16776
16681
  {
16777
16682
  id: "dots-studio/dots-3-note-preview:free",
@@ -16809,6 +16714,10 @@ window.__ModuleLoader__.load({
16809
16714
  id: "google/gemini-3-flash-preview",
16810
16715
  price: { "currency": "USD", "input": 0.5, "output": 3, "cacheRead": 0.05, "cacheWrite": 0.083333 }
16811
16716
  },
16717
+ {
16718
+ id: "google/gemini-3-flash-preview:batch",
16719
+ price: { "currency": "USD", "input": 0.25, "output": 1.5, "cacheRead": 0, "cacheWrite": 0 }
16720
+ },
16812
16721
  {
16813
16722
  id: "google/gemini-3-pro-image",
16814
16723
  price: { "currency": "USD", "input": 2, "output": 12, "cacheRead": 0.2, "cacheWrite": 0.375 }
@@ -16837,6 +16746,10 @@ window.__ModuleLoader__.load({
16837
16746
  id: "google/gemini-3.1-flash-lite-preview",
16838
16747
  price: { "currency": "USD", "input": 0.25, "output": 1.5, "cacheRead": 0.025, "cacheWrite": 0.083333 }
16839
16748
  },
16749
+ {
16750
+ id: "google/gemini-3.1-flash-lite:batch",
16751
+ price: { "currency": "USD", "input": 0.125, "output": 0.75, "cacheRead": 0.0125, "cacheWrite": 0 }
16752
+ },
16840
16753
  {
16841
16754
  id: "google/gemini-3.1-pro-preview",
16842
16755
  price: { "currency": "USD", "input": 2, "output": 12, "cacheRead": 0.2, "cacheWrite": 0.375 }
@@ -16845,6 +16758,10 @@ window.__ModuleLoader__.load({
16845
16758
  id: "google/gemini-3.1-pro-preview-customtools",
16846
16759
  price: { "currency": "USD", "input": 2, "output": 12, "cacheRead": 0.2, "cacheWrite": 0.375 }
16847
16760
  },
16761
+ {
16762
+ id: "google/gemini-3.1-pro-preview:batch",
16763
+ price: { "currency": "USD", "input": 1, "output": 6, "cacheRead": 0, "cacheWrite": 0 }
16764
+ },
16848
16765
  {
16849
16766
  id: "google/gemini-3.5-flash",
16850
16767
  price: { "currency": "USD", "input": 1.5, "output": 9, "cacheRead": 0.15, "cacheWrite": 0.083333 }
@@ -16853,26 +16770,58 @@ window.__ModuleLoader__.load({
16853
16770
  id: "google/gemini-3.5-flash-lite",
16854
16771
  price: { "currency": "USD", "input": 0.3, "output": 2.5, "cacheRead": 0.03, "cacheWrite": 0.083333 }
16855
16772
  },
16773
+ {
16774
+ id: "google/gemini-3.5-flash-lite:batch",
16775
+ price: { "currency": "USD", "input": 0.15, "output": 1.25, "cacheRead": 0.015, "cacheWrite": 0 }
16776
+ },
16777
+ {
16778
+ id: "google/gemini-3.5-flash:batch",
16779
+ price: { "currency": "USD", "input": 0.75, "output": 4.5, "cacheRead": 0.075, "cacheWrite": 0 }
16780
+ },
16856
16781
  {
16857
16782
  id: "google/gemini-3.6-flash",
16858
16783
  price: { "currency": "USD", "input": 0.75, "output": 3.75, "cacheRead": 0.075, "cacheWrite": 0.041667 }
16859
16784
  },
16785
+ {
16786
+ id: "google/gemini-3.6-flash:batch",
16787
+ price: { "currency": "USD", "input": 0.375, "output": 1.875, "cacheRead": 0.0375, "cacheWrite": 0.041667 }
16788
+ },
16860
16789
  {
16861
16790
  id: "google/gemini-3.7-flash",
16862
16791
  price: { "currency": "USD", "input": 0.75, "output": 3.75, "cacheRead": 0.075, "cacheWrite": 0.041667 }
16863
16792
  },
16793
+ {
16794
+ id: "google/gemini-3.7-flash:batch",
16795
+ price: { "currency": "USD", "input": 0.375, "output": 1.875, "cacheRead": 0.0375, "cacheWrite": 0.041667 }
16796
+ },
16864
16797
  {
16865
16798
  id: "google/gemini-3.8-flash",
16866
16799
  price: { "currency": "USD", "input": 0.825, "output": 4.125, "cacheRead": 0.0825, "cacheWrite": 0.041667 }
16867
16800
  },
16801
+ {
16802
+ id: "google/gemini-3.8-flash:batch",
16803
+ price: { "currency": "USD", "input": 0.375, "output": 1.875, "cacheRead": 0.0375, "cacheWrite": 0.041667 }
16804
+ },
16868
16805
  {
16869
16806
  id: "google/gemini-4-argon",
16870
16807
  price: { "currency": "USD", "input": 2, "output": 10, "cacheRead": 0.1, "cacheWrite": 0.1875 }
16871
16808
  },
16809
+ {
16810
+ id: "google/gemini-4-argon:batch",
16811
+ price: { "currency": "USD", "input": 1, "output": 5, "cacheRead": 0.05, "cacheWrite": 0.1875 }
16812
+ },
16872
16813
  {
16873
16814
  id: "google/gemini-nano-banana-2.1",
16874
16815
  price: { "currency": "USD", "input": 1.5, "output": 7.5, "cacheRead": 0, "cacheWrite": 0 }
16875
16816
  },
16817
+ {
16818
+ id: "google/gemini-omni-1.1-flash",
16819
+ price: { "currency": "USD", "input": 1.5, "output": 9, "cacheRead": 0, "cacheWrite": 0 }
16820
+ },
16821
+ {
16822
+ id: "google/gemini-omni-1.2-flash",
16823
+ price: { "currency": "USD", "input": 1.5, "output": 9, "cacheRead": 0, "cacheWrite": 0 }
16824
+ },
16876
16825
  {
16877
16826
  id: "google/gemma-2-27b-it",
16878
16827
  price: { "currency": "USD", "input": 0.65, "output": 0.65, "cacheRead": 0, "cacheWrite": 0 }
@@ -16883,7 +16832,7 @@ window.__ModuleLoader__.load({
16883
16832
  },
16884
16833
  {
16885
16834
  id: "google/gemma-3-27b-it",
16886
- price: { "currency": "USD", "input": 0.08, "output": 0.35, "cacheRead": 0.04, "cacheWrite": 0 }
16835
+ price: { "currency": "USD", "input": 0.08, "output": 0.45, "cacheRead": 0.04, "cacheWrite": 0 }
16887
16836
  },
16888
16837
  {
16889
16838
  id: "google/gemma-3-4b-it",
@@ -16891,12 +16840,20 @@ window.__ModuleLoader__.load({
16891
16840
  },
16892
16841
  {
16893
16842
  id: "google/gemma-4-26b-a4b-it",
16894
- price: { "currency": "USD", "input": 0.0765, "output": 0.255, "cacheRead": 0.0425, "cacheWrite": 0 }
16843
+ price: { "currency": "USD", "input": 0.09, "output": 0.3, "cacheRead": 0.05, "cacheWrite": 0 }
16844
+ },
16845
+ {
16846
+ id: "google/gemma-4-26b-a4b-it:free",
16847
+ price: { "currency": "USD", "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }
16895
16848
  },
16896
16849
  {
16897
16850
  id: "google/gemma-4-31b-it",
16898
16851
  price: { "currency": "USD", "input": 0.2, "output": 0.4, "cacheRead": 0, "cacheWrite": 0 }
16899
16852
  },
16853
+ {
16854
+ id: "google/gemma-4-31b-it:free",
16855
+ price: { "currency": "USD", "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }
16856
+ },
16900
16857
  {
16901
16858
  id: "google/lyria-3-clip-preview",
16902
16859
  price: { "currency": "USD", "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }
@@ -16911,19 +16868,7 @@ window.__ModuleLoader__.load({
16911
16868
  },
16912
16869
  {
16913
16870
  id: "ibm-granite/granite-4.2-8b",
16914
- price: { "currency": "USD", "input": 0.06, "output": 0.15, "cacheRead": 0.015, "cacheWrite": 0 }
16915
- },
16916
- {
16917
- id: "inception/mercury-2",
16918
- price: { "currency": "USD", "input": 0.25, "output": 0.75, "cacheRead": 0.025, "cacheWrite": 0 }
16919
- },
16920
- {
16921
- id: "inception/mercury-2.5",
16922
- price: { "currency": "USD", "input": 0.04, "output": 0.15, "cacheRead": 4e-3, "cacheWrite": 0 }
16923
- },
16924
- {
16925
- id: "inception/mercury-3",
16926
- price: { "currency": "USD", "input": 0.1, "output": 0.35, "cacheRead": 0.01, "cacheWrite": 0 }
16871
+ price: { "currency": "USD", "input": 0.06, "output": 0.25, "cacheRead": 0.015, "cacheWrite": 0 }
16927
16872
  },
16928
16873
  {
16929
16874
  id: "inclusionai/ling-3.0-flash",
@@ -16933,9 +16878,13 @@ window.__ModuleLoader__.load({
16933
16878
  id: "inclusionai/ling-3.0-flash-vl",
16934
16879
  price: { "currency": "USD", "input": 0.06, "output": 0.18, "cacheRead": 0.012, "cacheWrite": 0 }
16935
16880
  },
16881
+ {
16882
+ id: "inclusionai/ling-3.0-tiny",
16883
+ price: { "currency": "USD", "input": 0.015, "output": 0.045, "cacheRead": 3e-3, "cacheWrite": 0 }
16884
+ },
16936
16885
  {
16937
16886
  id: "inclusionai/ling-3.1-flash",
16938
- price: { "currency": "USD", "input": 0.075, "output": 0.225, "cacheRead": 0.015, "cacheWrite": 0 }
16887
+ price: { "currency": "USD", "input": 0.045, "output": 0.135, "cacheRead": 9e-3, "cacheWrite": 0 }
16939
16888
  },
16940
16889
  {
16941
16890
  id: "inference-net/schematron-v2-small",
@@ -16949,13 +16898,25 @@ window.__ModuleLoader__.load({
16949
16898
  id: "liquid/lfm-2.5-2.6b",
16950
16899
  price: { "currency": "USD", "input": 0.35, "output": 0.5, "cacheRead": 0.04, "cacheWrite": 0 }
16951
16900
  },
16901
+ {
16902
+ id: "liquid/lfm-2.5-2.6b:free",
16903
+ price: { "currency": "USD", "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }
16904
+ },
16952
16905
  {
16953
16906
  id: "liquid/lfm-2.5-24b-a2b",
16954
16907
  price: { "currency": "USD", "input": 0.05, "output": 0.7, "cacheRead": 0.025, "cacheWrite": 0 }
16955
16908
  },
16909
+ {
16910
+ id: "liquid/lfm-3-1.7b",
16911
+ price: { "currency": "USD", "input": 0.08, "output": 0.2, "cacheRead": 0.02, "cacheWrite": 0 }
16912
+ },
16913
+ {
16914
+ id: "liquid/lfm-3-1.7b:free",
16915
+ price: { "currency": "USD", "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }
16916
+ },
16956
16917
  {
16957
16918
  id: "mancer/weaver",
16958
- price: { "currency": "USD", "input": 0.4, "output": 0.75, "cacheRead": 0, "cacheWrite": 0 }
16919
+ price: { "currency": "USD", "input": 0.4, "output": 0.75, "cacheRead": 0.4, "cacheWrite": 0 }
16959
16920
  },
16960
16921
  {
16961
16922
  id: "meituan/longcat-2.0",
@@ -16963,11 +16924,11 @@ window.__ModuleLoader__.load({
16963
16924
  },
16964
16925
  {
16965
16926
  id: "meta-llama/llama-3.1-70b-instruct",
16966
- price: { "currency": "USD", "input": 0.4, "output": 0.4, "cacheRead": 0, "cacheWrite": 0 }
16927
+ price: { "currency": "USD", "input": 0.72, "output": 0.72, "cacheRead": 0, "cacheWrite": 0 }
16967
16928
  },
16968
16929
  {
16969
16930
  id: "meta-llama/llama-3.1-8b-instruct",
16970
- price: { "currency": "USD", "input": 0.05, "output": 0.08, "cacheRead": 0.025, "cacheWrite": 0 }
16931
+ price: { "currency": "USD", "input": 0.02, "output": 0.04, "cacheRead": 0, "cacheWrite": 0 }
16971
16932
  },
16972
16933
  {
16973
16934
  id: "meta-llama/llama-3.2-1b-instruct",
@@ -16979,11 +16940,11 @@ window.__ModuleLoader__.load({
16979
16940
  },
16980
16941
  {
16981
16942
  id: "meta-llama/llama-3.3-70b-instruct",
16982
- price: { "currency": "USD", "input": 0.1, "output": 0.32, "cacheRead": 0, "cacheWrite": 0 }
16943
+ price: { "currency": "USD", "input": 0.59, "output": 0.79, "cacheRead": 0.295, "cacheWrite": 0 }
16983
16944
  },
16984
16945
  {
16985
16946
  id: "meta-llama/llama-4-maverick",
16986
- price: { "currency": "USD", "input": 0.1875, "output": 0.6525, "cacheRead": 0.05, "cacheWrite": 0 }
16947
+ price: { "currency": "USD", "input": 0.35, "output": 1, "cacheRead": 0.17, "cacheWrite": 0 }
16987
16948
  },
16988
16949
  {
16989
16950
  id: "meta-llama/llama-4-scout",
@@ -16997,6 +16958,10 @@ window.__ModuleLoader__.load({
16997
16958
  id: "meta/muse-glimmer-30b",
16998
16959
  price: { "currency": "USD", "input": 0.3, "output": 1.2, "cacheRead": 0.04, "cacheWrite": 0 }
16999
16960
  },
16961
+ {
16962
+ id: "meta/muse-glimmer-30b:batch",
16963
+ price: { "currency": "USD", "input": 0.24, "output": 0.96, "cacheRead": 0.032, "cacheWrite": 0 }
16964
+ },
17000
16965
  {
17001
16966
  id: "meta/muse-spark-1.1",
17002
16967
  price: { "currency": "USD", "input": 1.25, "output": 4.25, "cacheRead": 0.15, "cacheWrite": 0 }
@@ -17029,41 +16994,25 @@ window.__ModuleLoader__.load({
17029
16994
  id: "microsoft/phi-4",
17030
16995
  price: { "currency": "USD", "input": 0.07, "output": 0.14, "cacheRead": 0, "cacheWrite": 0 }
17031
16996
  },
17032
- {
17033
- id: "minimax/minimax-01",
17034
- price: { "currency": "USD", "input": 0.2, "output": 1.1, "cacheRead": 0, "cacheWrite": 0 }
17035
- },
17036
- {
17037
- id: "minimax/minimax-m1",
17038
- price: { "currency": "USD", "input": 0.55, "output": 2.2, "cacheRead": 0, "cacheWrite": 0 }
17039
- },
17040
- {
17041
- id: "minimax/minimax-m2",
17042
- price: { "currency": "USD", "input": 0.255, "output": 1.02, "cacheRead": 0, "cacheWrite": 0 }
17043
- },
17044
- {
17045
- id: "minimax/minimax-m2-her",
17046
- price: { "currency": "USD", "input": 0.3, "output": 1.2, "cacheRead": 0.03, "cacheWrite": 0 }
17047
- },
17048
- {
17049
- id: "minimax/minimax-m2.1",
17050
- price: { "currency": "USD", "input": 0.3, "output": 1.2, "cacheRead": 0.03, "cacheWrite": 0 }
17051
- },
17052
16997
  {
17053
16998
  id: "minimax/minimax-m2.5",
17054
- price: { "currency": "USD", "input": 0.3, "output": 1.2, "cacheRead": 0.03, "cacheWrite": 0 }
16999
+ price: { "currency": "USD", "input": 0.3, "output": 1.2, "cacheRead": 0.06, "cacheWrite": 0 }
17055
17000
  },
17056
17001
  {
17057
17002
  id: "minimax/minimax-m2.7",
17058
- price: { "currency": "USD", "input": 0.3, "output": 1.2, "cacheRead": 0.06, "cacheWrite": 0 }
17003
+ price: { "currency": "USD", "input": 0.21, "output": 0.84, "cacheRead": 0.042, "cacheWrite": 0 }
17059
17004
  },
17060
17005
  {
17061
17006
  id: "minimax/minimax-m3",
17062
17007
  price: { "currency": "USD", "input": 0.3, "output": 1.2, "cacheRead": 0.06, "cacheWrite": 0 }
17063
17008
  },
17009
+ {
17010
+ id: "minimax/minimax-m3:batch",
17011
+ price: { "currency": "USD", "input": 0.224, "output": 0.88, "cacheRead": 0.0448, "cacheWrite": 0 }
17012
+ },
17064
17013
  {
17065
17014
  id: "minimax/minimax-m3.1-flash",
17066
- price: { "currency": "USD", "input": 0.15, "output": 0.6, "cacheRead": 0.015, "cacheWrite": 0 }
17015
+ price: { "currency": "USD", "input": 0.075, "output": 0.3, "cacheRead": 75e-4, "cacheWrite": 0 }
17067
17016
  },
17068
17017
  {
17069
17018
  id: "mistralai/codestral-2508",
@@ -17085,6 +17034,14 @@ window.__ModuleLoader__.load({
17085
17034
  id: "mistralai/ministral-8b-2512",
17086
17035
  price: { "currency": "USD", "input": 0.15, "output": 0.15, "cacheRead": 0.015, "cacheWrite": 0 }
17087
17036
  },
17037
+ {
17038
+ id: "mistralai/mistral-large",
17039
+ price: { "currency": "USD", "input": 2, "output": 6, "cacheRead": 0.2, "cacheWrite": 0 }
17040
+ },
17041
+ {
17042
+ id: "mistralai/mistral-large-2407",
17043
+ price: { "currency": "USD", "input": 2, "output": 6, "cacheRead": 0.2, "cacheWrite": 0 }
17044
+ },
17088
17045
  {
17089
17046
  id: "mistralai/mistral-large-2512",
17090
17047
  price: { "currency": "USD", "input": 0.5, "output": 1.5, "cacheRead": 0.05, "cacheWrite": 0 }
@@ -17101,6 +17058,10 @@ window.__ModuleLoader__.load({
17101
17058
  id: "mistralai/mistral-medium-3-5",
17102
17059
  price: { "currency": "USD", "input": 1.5, "output": 7.5, "cacheRead": 0, "cacheWrite": 0 }
17103
17060
  },
17061
+ {
17062
+ id: "mistralai/mistral-medium-3-5:batch",
17063
+ price: { "currency": "USD", "input": 0.75, "output": 3.75, "cacheRead": 0, "cacheWrite": 0 }
17064
+ },
17104
17065
  {
17105
17066
  id: "mistralai/mistral-medium-3.1",
17106
17067
  price: { "currency": "USD", "input": 0.4, "output": 2, "cacheRead": 0.04, "cacheWrite": 0 }
@@ -17127,7 +17088,7 @@ window.__ModuleLoader__.load({
17127
17088
  },
17128
17089
  {
17129
17090
  id: "mistralai/mistral-small-3.2-24b-instruct",
17130
- price: { "currency": "USD", "input": 0.075, "output": 0.2, "cacheRead": 0, "cacheWrite": 0 }
17091
+ price: { "currency": "USD", "input": 0.1, "output": 0.3, "cacheRead": 0.01, "cacheWrite": 0 }
17131
17092
  },
17132
17093
  {
17133
17094
  id: "mistralai/mixtral-8x22b-instruct",
@@ -17145,6 +17106,10 @@ window.__ModuleLoader__.load({
17145
17106
  id: "moondream/moondream3.1-9b-a2b",
17146
17107
  price: { "currency": "USD", "input": 0.3, "output": 2.5, "cacheRead": 0, "cacheWrite": 0 }
17147
17108
  },
17109
+ {
17110
+ id: "moonshotai/kimi-k2",
17111
+ price: { "currency": "USD", "input": 0.57, "output": 2.3, "cacheRead": 0, "cacheWrite": 0 }
17112
+ },
17148
17113
  {
17149
17114
  id: "moonshotai/kimi-k2-0905",
17150
17115
  price: { "currency": "USD", "input": 0.6, "output": 2.5, "cacheRead": 0, "cacheWrite": 0 }
@@ -17155,7 +17120,7 @@ window.__ModuleLoader__.load({
17155
17120
  },
17156
17121
  {
17157
17122
  id: "moonshotai/kimi-k2.5",
17158
- price: { "currency": "USD", "input": 0.5, "output": 2.5, "cacheRead": 0.15, "cacheWrite": 0 }
17123
+ price: { "currency": "USD", "input": 0.532, "output": 3.325, "cacheRead": 0.209, "cacheWrite": 0 }
17159
17124
  },
17160
17125
  {
17161
17126
  id: "moonshotai/kimi-k2.6",
@@ -17163,11 +17128,15 @@ window.__ModuleLoader__.load({
17163
17128
  },
17164
17129
  {
17165
17130
  id: "moonshotai/kimi-k2.7-code",
17166
- price: { "currency": "USD", "input": 0.56, "output": 3.1, "cacheRead": 0.15, "cacheWrite": 0 }
17131
+ price: { "currency": "USD", "input": 0.6, "output": 3.5, "cacheRead": 0.16, "cacheWrite": 0 }
17167
17132
  },
17168
17133
  {
17169
17134
  id: "moonshotai/kimi-k3",
17170
- price: { "currency": "USD", "input": 0.192, "output": 15, "cacheRead": 0.182, "cacheWrite": 0 }
17135
+ price: { "currency": "USD", "input": 0.192, "output": 16, "cacheRead": 0.182, "cacheWrite": 0 }
17136
+ },
17137
+ {
17138
+ id: "moonshotai/kimi-k3:batch",
17139
+ price: { "currency": "USD", "input": 0.883, "output": 6, "cacheRead": 0.218, "cacheWrite": 0 }
17171
17140
  },
17172
17141
  {
17173
17142
  id: "moonshotai/kimi-k3.1-pro",
@@ -17177,10 +17146,18 @@ window.__ModuleLoader__.load({
17177
17146
  id: "morph/morph-v3-fast",
17178
17147
  price: { "currency": "USD", "input": 0.8, "output": 1.2, "cacheRead": 0, "cacheWrite": 0 }
17179
17148
  },
17149
+ {
17150
+ id: "morph/morph-v3-fast:batch",
17151
+ price: { "currency": "USD", "input": 0.4, "output": 0.6, "cacheRead": 0, "cacheWrite": 0 }
17152
+ },
17180
17153
  {
17181
17154
  id: "morph/morph-v3-large",
17182
17155
  price: { "currency": "USD", "input": 0.9, "output": 1.9, "cacheRead": 0, "cacheWrite": 0 }
17183
17156
  },
17157
+ {
17158
+ id: "morph/morph-v3-large:batch",
17159
+ price: { "currency": "USD", "input": 0.45, "output": 0.95, "cacheRead": 0, "cacheWrite": 0 }
17160
+ },
17184
17161
  {
17185
17162
  id: "nex-agi/nex-n2.5-mini",
17186
17163
  price: { "currency": "USD", "input": 0.025, "output": 0.1, "cacheRead": 25e-4, "cacheWrite": 0 }
@@ -17189,14 +17166,6 @@ window.__ModuleLoader__.load({
17189
17166
  id: "nex-agi/nex-n2.5-pro",
17190
17167
  price: { "currency": "USD", "input": 0.075, "output": 0.25, "cacheRead": 0.015, "cacheWrite": 0 }
17191
17168
  },
17192
- {
17193
- id: "nousresearch/hermes-3-llama-3.1-405b",
17194
- price: { "currency": "USD", "input": 1, "output": 1, "cacheRead": 0, "cacheWrite": 0 }
17195
- },
17196
- {
17197
- id: "nousresearch/hermes-3-llama-3.1-70b",
17198
- price: { "currency": "USD", "input": 0.7, "output": 0.7, "cacheRead": 0, "cacheWrite": 0 }
17199
- },
17200
17169
  {
17201
17170
  id: "nousresearch/hermes-4-405b",
17202
17171
  price: { "currency": "USD", "input": 1, "output": 3, "cacheRead": 0.2, "cacheWrite": 0 }
@@ -17211,12 +17180,16 @@ window.__ModuleLoader__.load({
17211
17180
  },
17212
17181
  {
17213
17182
  id: "nvidia/nemotron-3-super-120b-a12b",
17214
- price: { "currency": "USD", "input": 0.3, "output": 2.4, "cacheRead": 0.15, "cacheWrite": 0 }
17183
+ price: { "currency": "USD", "input": 0.075, "output": 0.4, "cacheRead": 0, "cacheWrite": 0 }
17215
17184
  },
17216
17185
  {
17217
17186
  id: "nvidia/nemotron-3-ultra-550b-a55b",
17218
17187
  price: { "currency": "USD", "input": 0.6, "output": 2.4, "cacheRead": 0.12, "cacheWrite": 0 }
17219
17188
  },
17189
+ {
17190
+ id: "nvidia/nemotron-3-ultra-550b-a55b:free",
17191
+ price: { "currency": "USD", "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }
17192
+ },
17220
17193
  {
17221
17194
  id: "nvidia/nemotron-3.5-content-safety",
17222
17195
  price: { "currency": "USD", "input": 0.2, "output": 0.2, "cacheRead": 0, "cacheWrite": 0 }
@@ -17225,10 +17198,18 @@ window.__ModuleLoader__.load({
17225
17198
  id: "nvidia/nemotron-3.5-lightning",
17226
17199
  price: { "currency": "USD", "input": 0.07, "output": 0.2, "cacheRead": 0.04, "cacheWrite": 0 }
17227
17200
  },
17201
+ {
17202
+ id: "nvidia/nemotron-3.5-lightning:free",
17203
+ price: { "currency": "USD", "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }
17204
+ },
17228
17205
  {
17229
17206
  id: "nvidia/nemotron-3.5-super-vl",
17230
17207
  price: { "currency": "USD", "input": 0.15, "output": 0.5, "cacheRead": 0.02, "cacheWrite": 0 }
17231
17208
  },
17209
+ {
17210
+ id: "nvidia/nemotron-3.5-super-vl:free",
17211
+ price: { "currency": "USD", "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }
17212
+ },
17232
17213
  {
17233
17214
  id: "openai/gpt-3.5-turbo-0613",
17234
17215
  price: { "currency": "USD", "input": 1, "output": 2, "cacheRead": 0, "cacheWrite": 0 }
@@ -17241,6 +17222,10 @@ window.__ModuleLoader__.load({
17241
17222
  id: "openai/gpt-4",
17242
17223
  price: { "currency": "USD", "input": 30, "output": 60, "cacheRead": 0, "cacheWrite": 0 }
17243
17224
  },
17225
+ {
17226
+ id: "openai/gpt-4-turbo:batch",
17227
+ price: { "currency": "USD", "input": 5, "output": 15, "cacheRead": 0, "cacheWrite": 0 }
17228
+ },
17244
17229
  {
17245
17230
  id: "openai/gpt-4.1",
17246
17231
  price: { "currency": "USD", "input": 2, "output": 8, "cacheRead": 0.5, "cacheWrite": 0 }
@@ -17249,42 +17234,94 @@ window.__ModuleLoader__.load({
17249
17234
  id: "openai/gpt-4.1-mini",
17250
17235
  price: { "currency": "USD", "input": 0.4, "output": 1.6, "cacheRead": 0.1, "cacheWrite": 0 }
17251
17236
  },
17237
+ {
17238
+ id: "openai/gpt-4.1-mini:batch",
17239
+ price: { "currency": "USD", "input": 0.2, "output": 0.8, "cacheRead": 0.05, "cacheWrite": 0 }
17240
+ },
17252
17241
  {
17253
17242
  id: "openai/gpt-4.1-nano",
17254
17243
  price: { "currency": "USD", "input": 0.1, "output": 0.4, "cacheRead": 0.03, "cacheWrite": 0 }
17255
17244
  },
17256
17245
  {
17257
- id: "openai/gpt-4o-2024-11-20",
17258
- price: { "currency": "USD", "input": 2.5, "output": 10, "cacheRead": 1.25, "cacheWrite": 0 }
17246
+ id: "openai/gpt-4.1-nano:batch",
17247
+ price: { "currency": "USD", "input": 0.05, "output": 0.2, "cacheRead": 0.0125, "cacheWrite": 0 }
17259
17248
  },
17260
17249
  {
17261
- id: "openai/gpt-4o-mini",
17262
- price: { "currency": "USD", "input": 0.15, "output": 0.6, "cacheRead": 0.075, "cacheWrite": 0 }
17250
+ id: "openai/gpt-4.1:batch",
17251
+ price: { "currency": "USD", "input": 1, "output": 4, "cacheRead": 0.25, "cacheWrite": 0 }
17263
17252
  },
17264
17253
  {
17265
- id: "openai/gpt-5",
17266
- price: { "currency": "USD", "input": 1.25, "output": 10, "cacheRead": 0.125, "cacheWrite": 0 }
17254
+ id: "openai/gpt-4o",
17255
+ price: { "currency": "USD", "input": 2.5, "output": 10, "cacheRead": 1.25, "cacheWrite": 0 }
17267
17256
  },
17268
17257
  {
17269
- id: "openai/gpt-5-image",
17270
- price: { "currency": "USD", "input": 10, "output": 10, "cacheRead": 1.25, "cacheWrite": 0 }
17258
+ id: "openai/gpt-4o-2024-05-13",
17259
+ price: { "currency": "USD", "input": 5, "output": 15, "cacheRead": 0, "cacheWrite": 0 }
17271
17260
  },
17272
17261
  {
17273
- id: "openai/gpt-5-image-mini",
17274
- price: { "currency": "USD", "input": 2.5, "output": 2, "cacheRead": 0.25, "cacheWrite": 0 }
17262
+ id: "openai/gpt-4o-2024-08-06",
17263
+ price: { "currency": "USD", "input": 2.5, "output": 10, "cacheRead": 1.25, "cacheWrite": 0 }
17275
17264
  },
17276
17265
  {
17277
- id: "openai/gpt-5-mini",
17278
- price: { "currency": "USD", "input": 0.25, "output": 2, "cacheRead": 0.025, "cacheWrite": 0 }
17266
+ id: "openai/gpt-4o-2024-11-20",
17267
+ price: { "currency": "USD", "input": 2.5, "output": 10, "cacheRead": 1.25, "cacheWrite": 0 }
17279
17268
  },
17280
17269
  {
17281
- id: "openai/gpt-5-nano",
17282
- price: { "currency": "USD", "input": 0.05, "output": 0.4, "cacheRead": 5e-3, "cacheWrite": 0 }
17283
- },
17270
+ id: "openai/gpt-4o-mini",
17271
+ price: { "currency": "USD", "input": 0.15, "output": 0.6, "cacheRead": 0.075, "cacheWrite": 0 }
17272
+ },
17273
+ {
17274
+ id: "openai/gpt-4o-mini-2024-07-18",
17275
+ price: { "currency": "USD", "input": 0.15, "output": 0.6, "cacheRead": 0.075, "cacheWrite": 0 }
17276
+ },
17277
+ {
17278
+ id: "openai/gpt-4o-mini:batch",
17279
+ price: { "currency": "USD", "input": 0.075, "output": 0.3, "cacheRead": 0.0375, "cacheWrite": 0 }
17280
+ },
17281
+ {
17282
+ id: "openai/gpt-4o:batch",
17283
+ price: { "currency": "USD", "input": 1.25, "output": 5, "cacheRead": 0.625, "cacheWrite": 0 }
17284
+ },
17285
+ {
17286
+ id: "openai/gpt-5",
17287
+ price: { "currency": "USD", "input": 1.25, "output": 10, "cacheRead": 0.125, "cacheWrite": 0 }
17288
+ },
17289
+ {
17290
+ id: "openai/gpt-5-image",
17291
+ price: { "currency": "USD", "input": 10, "output": 10, "cacheRead": 1.25, "cacheWrite": 0 }
17292
+ },
17293
+ {
17294
+ id: "openai/gpt-5-image-mini",
17295
+ price: { "currency": "USD", "input": 2.5, "output": 2, "cacheRead": 0.25, "cacheWrite": 0 }
17296
+ },
17297
+ {
17298
+ id: "openai/gpt-5-mini",
17299
+ price: { "currency": "USD", "input": 0.25, "output": 2, "cacheRead": 0.025, "cacheWrite": 0 }
17300
+ },
17301
+ {
17302
+ id: "openai/gpt-5-mini:batch",
17303
+ price: { "currency": "USD", "input": 0.125, "output": 1, "cacheRead": 0.0125, "cacheWrite": 0 }
17304
+ },
17305
+ {
17306
+ id: "openai/gpt-5-nano",
17307
+ price: { "currency": "USD", "input": 0.05, "output": 0.4, "cacheRead": 5e-3, "cacheWrite": 0 }
17308
+ },
17309
+ {
17310
+ id: "openai/gpt-5-nano:batch",
17311
+ price: { "currency": "USD", "input": 0.025, "output": 0.2, "cacheRead": 25e-4, "cacheWrite": 0 }
17312
+ },
17284
17313
  {
17285
17314
  id: "openai/gpt-5-pro",
17286
17315
  price: { "currency": "USD", "input": 15, "output": 120, "cacheRead": 0, "cacheWrite": 0 }
17287
17316
  },
17317
+ {
17318
+ id: "openai/gpt-5-pro:batch",
17319
+ price: { "currency": "USD", "input": 7.5, "output": 60, "cacheRead": 0, "cacheWrite": 0 }
17320
+ },
17321
+ {
17322
+ id: "openai/gpt-5:batch",
17323
+ price: { "currency": "USD", "input": 0.625, "output": 5, "cacheRead": 0.0625, "cacheWrite": 0 }
17324
+ },
17288
17325
  {
17289
17326
  id: "openai/gpt-5.1",
17290
17327
  price: { "currency": "USD", "input": 1.25, "output": 10, "cacheRead": 0.125, "cacheWrite": 0 }
@@ -17301,6 +17338,10 @@ window.__ModuleLoader__.load({
17301
17338
  id: "openai/gpt-5.1-codex-mini",
17302
17339
  price: { "currency": "USD", "input": 0.25, "output": 2, "cacheRead": 0.03, "cacheWrite": 0 }
17303
17340
  },
17341
+ {
17342
+ id: "openai/gpt-5.1:batch",
17343
+ price: { "currency": "USD", "input": 0.625, "output": 5, "cacheRead": 0.0625, "cacheWrite": 0 }
17344
+ },
17304
17345
  {
17305
17346
  id: "openai/gpt-5.2",
17306
17347
  price: { "currency": "USD", "input": 1.75, "output": 14, "cacheRead": 0.175, "cacheWrite": 0 }
@@ -17317,6 +17358,14 @@ window.__ModuleLoader__.load({
17317
17358
  id: "openai/gpt-5.2-pro",
17318
17359
  price: { "currency": "USD", "input": 21, "output": 168, "cacheRead": 0, "cacheWrite": 0 }
17319
17360
  },
17361
+ {
17362
+ id: "openai/gpt-5.2-pro:batch",
17363
+ price: { "currency": "USD", "input": 10.5, "output": 84, "cacheRead": 0, "cacheWrite": 0 }
17364
+ },
17365
+ {
17366
+ id: "openai/gpt-5.2:batch",
17367
+ price: { "currency": "USD", "input": 0.875, "output": 7, "cacheRead": 0.0875, "cacheWrite": 0 }
17368
+ },
17320
17369
  {
17321
17370
  id: "openai/gpt-5.3-codex",
17322
17371
  price: { "currency": "USD", "input": 1.75, "output": 14, "cacheRead": 0.175, "cacheWrite": 0 }
@@ -17333,14 +17382,30 @@ window.__ModuleLoader__.load({
17333
17382
  id: "openai/gpt-5.4-mini",
17334
17383
  price: { "currency": "USD", "input": 0.75, "output": 4.5, "cacheRead": 0.075, "cacheWrite": 0 }
17335
17384
  },
17385
+ {
17386
+ id: "openai/gpt-5.4-mini:batch",
17387
+ price: { "currency": "USD", "input": 0.375, "output": 2.25, "cacheRead": 0.0375, "cacheWrite": 0 }
17388
+ },
17336
17389
  {
17337
17390
  id: "openai/gpt-5.4-nano",
17338
17391
  price: { "currency": "USD", "input": 0.2, "output": 1.25, "cacheRead": 0.02, "cacheWrite": 0 }
17339
17392
  },
17393
+ {
17394
+ id: "openai/gpt-5.4-nano:batch",
17395
+ price: { "currency": "USD", "input": 0.1, "output": 0.625, "cacheRead": 0.01, "cacheWrite": 0 }
17396
+ },
17340
17397
  {
17341
17398
  id: "openai/gpt-5.4-pro",
17342
17399
  price: { "currency": "USD", "input": 30, "output": 180, "cacheRead": 0, "cacheWrite": 0 }
17343
17400
  },
17401
+ {
17402
+ id: "openai/gpt-5.4-pro:batch",
17403
+ price: { "currency": "USD", "input": 15, "output": 90, "cacheRead": 0, "cacheWrite": 0 }
17404
+ },
17405
+ {
17406
+ id: "openai/gpt-5.4:batch",
17407
+ price: { "currency": "USD", "input": 1.25, "output": 7.5, "cacheRead": 0.125, "cacheWrite": 0 }
17408
+ },
17344
17409
  {
17345
17410
  id: "openai/gpt-5.5",
17346
17411
  price: { "currency": "USD", "input": 5, "output": 30, "cacheRead": 0.5, "cacheWrite": 0 }
@@ -17349,6 +17414,14 @@ window.__ModuleLoader__.load({
17349
17414
  id: "openai/gpt-5.5-pro",
17350
17415
  price: { "currency": "USD", "input": 30, "output": 180, "cacheRead": 0, "cacheWrite": 0 }
17351
17416
  },
17417
+ {
17418
+ id: "openai/gpt-5.5-pro:batch",
17419
+ price: { "currency": "USD", "input": 15, "output": 90, "cacheRead": 0, "cacheWrite": 0 }
17420
+ },
17421
+ {
17422
+ id: "openai/gpt-5.5:batch",
17423
+ price: { "currency": "USD", "input": 2.5, "output": 15, "cacheRead": 0.25, "cacheWrite": 0 }
17424
+ },
17352
17425
  {
17353
17426
  id: "openai/gpt-5.6-luna",
17354
17427
  price: { "currency": "USD", "input": 0.2, "output": 1.2, "cacheRead": 0.02, "cacheWrite": 0.25 }
@@ -17357,6 +17430,14 @@ window.__ModuleLoader__.load({
17357
17430
  id: "openai/gpt-5.6-luna-pro",
17358
17431
  price: { "currency": "USD", "input": 0.2, "output": 1.2, "cacheRead": 0.02, "cacheWrite": 0.25 }
17359
17432
  },
17433
+ {
17434
+ id: "openai/gpt-5.6-luna-pro:batch",
17435
+ price: { "currency": "USD", "input": 0.1, "output": 0.6, "cacheRead": 0.01, "cacheWrite": 0 }
17436
+ },
17437
+ {
17438
+ id: "openai/gpt-5.6-luna:batch",
17439
+ price: { "currency": "USD", "input": 0.1, "output": 0.6, "cacheRead": 0.01, "cacheWrite": 0 }
17440
+ },
17360
17441
  {
17361
17442
  id: "openai/gpt-5.6-sol",
17362
17443
  price: { "currency": "USD", "input": 4, "output": 20, "cacheRead": 0.4, "cacheWrite": 5 }
@@ -17365,6 +17446,14 @@ window.__ModuleLoader__.load({
17365
17446
  id: "openai/gpt-5.6-sol-pro",
17366
17447
  price: { "currency": "USD", "input": 4, "output": 20, "cacheRead": 0.4, "cacheWrite": 5 }
17367
17448
  },
17449
+ {
17450
+ id: "openai/gpt-5.6-sol-pro:batch",
17451
+ price: { "currency": "USD", "input": 2, "output": 10, "cacheRead": 0.2, "cacheWrite": 2.5 }
17452
+ },
17453
+ {
17454
+ id: "openai/gpt-5.6-sol:batch",
17455
+ price: { "currency": "USD", "input": 2, "output": 10, "cacheRead": 0.2, "cacheWrite": 2.5 }
17456
+ },
17368
17457
  {
17369
17458
  id: "openai/gpt-5.6-terra",
17370
17459
  price: { "currency": "USD", "input": 2, "output": 12, "cacheRead": 0.2, "cacheWrite": 2.5 }
@@ -17373,6 +17462,14 @@ window.__ModuleLoader__.load({
17373
17462
  id: "openai/gpt-5.6-terra-pro",
17374
17463
  price: { "currency": "USD", "input": 2, "output": 12, "cacheRead": 0.2, "cacheWrite": 2.5 }
17375
17464
  },
17465
+ {
17466
+ id: "openai/gpt-5.6-terra-pro:batch",
17467
+ price: { "currency": "USD", "input": 1, "output": 6, "cacheRead": 0.1, "cacheWrite": 0 }
17468
+ },
17469
+ {
17470
+ id: "openai/gpt-5.6-terra:batch",
17471
+ price: { "currency": "USD", "input": 1, "output": 6, "cacheRead": 0.1, "cacheWrite": 0 }
17472
+ },
17376
17473
  {
17377
17474
  id: "openai/gpt-6-astra",
17378
17475
  price: { "currency": "USD", "input": 10, "output": 50, "cacheRead": 1, "cacheWrite": 12.5 }
@@ -17381,6 +17478,14 @@ window.__ModuleLoader__.load({
17381
17478
  id: "openai/gpt-6-astra-pro",
17382
17479
  price: { "currency": "USD", "input": 10, "output": 50, "cacheRead": 1, "cacheWrite": 12.5 }
17383
17480
  },
17481
+ {
17482
+ id: "openai/gpt-6-astra-pro:batch",
17483
+ price: { "currency": "USD", "input": 5, "output": 25, "cacheRead": 0.5, "cacheWrite": 6.25 }
17484
+ },
17485
+ {
17486
+ id: "openai/gpt-6-astra:batch",
17487
+ price: { "currency": "USD", "input": 5, "output": 25, "cacheRead": 0.5, "cacheWrite": 6.25 }
17488
+ },
17384
17489
  {
17385
17490
  id: "openai/gpt-6-luna",
17386
17491
  price: { "currency": "USD", "input": 0.1, "output": 0.5, "cacheRead": 0.01, "cacheWrite": 0.125 }
@@ -17389,6 +17494,14 @@ window.__ModuleLoader__.load({
17389
17494
  id: "openai/gpt-6-luna-pro",
17390
17495
  price: { "currency": "USD", "input": 0.1, "output": 0.5, "cacheRead": 0.01, "cacheWrite": 0.125 }
17391
17496
  },
17497
+ {
17498
+ id: "openai/gpt-6-luna-pro:batch",
17499
+ price: { "currency": "USD", "input": 0.05, "output": 0.25, "cacheRead": 5e-3, "cacheWrite": 0.0625 }
17500
+ },
17501
+ {
17502
+ id: "openai/gpt-6-luna:batch",
17503
+ price: { "currency": "USD", "input": 0.05, "output": 0.25, "cacheRead": 5e-3, "cacheWrite": 0.0625 }
17504
+ },
17392
17505
  {
17393
17506
  id: "openai/gpt-6-sol",
17394
17507
  price: { "currency": "USD", "input": 2, "output": 10, "cacheRead": 0.2, "cacheWrite": 2.5 }
@@ -17397,6 +17510,14 @@ window.__ModuleLoader__.load({
17397
17510
  id: "openai/gpt-6-sol-pro",
17398
17511
  price: { "currency": "USD", "input": 2, "output": 10, "cacheRead": 0.2, "cacheWrite": 2.5 }
17399
17512
  },
17513
+ {
17514
+ id: "openai/gpt-6-sol-pro:batch",
17515
+ price: { "currency": "USD", "input": 1, "output": 5, "cacheRead": 0.1, "cacheWrite": 1.25 }
17516
+ },
17517
+ {
17518
+ id: "openai/gpt-6-sol:batch",
17519
+ price: { "currency": "USD", "input": 1, "output": 5, "cacheRead": 0.1, "cacheWrite": 1.25 }
17520
+ },
17400
17521
  {
17401
17522
  id: "openai/gpt-6.1-sol",
17402
17523
  price: { "currency": "USD", "input": 2, "output": 10, "cacheRead": 0.1, "cacheWrite": 2.5 }
@@ -17405,6 +17526,14 @@ window.__ModuleLoader__.load({
17405
17526
  id: "openai/gpt-6.1-sol-pro",
17406
17527
  price: { "currency": "USD", "input": 2, "output": 10, "cacheRead": 0.1, "cacheWrite": 2.5 }
17407
17528
  },
17529
+ {
17530
+ id: "openai/gpt-6.1-sol-pro:batch",
17531
+ price: { "currency": "USD", "input": 1, "output": 5, "cacheRead": 0.05, "cacheWrite": 1.25 }
17532
+ },
17533
+ {
17534
+ id: "openai/gpt-6.1-sol:batch",
17535
+ price: { "currency": "USD", "input": 1, "output": 5, "cacheRead": 0.05, "cacheWrite": 1.25 }
17536
+ },
17408
17537
  {
17409
17538
  id: "openai/gpt-6.1-terra",
17410
17539
  price: { "currency": "USD", "input": 1, "output": 5, "cacheRead": 0.05, "cacheWrite": 1.25 }
@@ -17413,6 +17542,14 @@ window.__ModuleLoader__.load({
17413
17542
  id: "openai/gpt-6.1-terra-pro",
17414
17543
  price: { "currency": "USD", "input": 1, "output": 5, "cacheRead": 0.05, "cacheWrite": 1.25 }
17415
17544
  },
17545
+ {
17546
+ id: "openai/gpt-6.1-terra-pro:batch",
17547
+ price: { "currency": "USD", "input": 0.5, "output": 2.5, "cacheRead": 0.025, "cacheWrite": 0.625 }
17548
+ },
17549
+ {
17550
+ id: "openai/gpt-6.1-terra:batch",
17551
+ price: { "currency": "USD", "input": 0.5, "output": 2.5, "cacheRead": 0.025, "cacheWrite": 0.625 }
17552
+ },
17416
17553
  {
17417
17554
  id: "openai/gpt-audio",
17418
17555
  price: { "currency": "USD", "input": 2.5, "output": 10, "cacheRead": 0, "cacheWrite": 0 }
@@ -17429,9 +17566,17 @@ window.__ModuleLoader__.load({
17429
17566
  id: "openai/gpt-oss-120b",
17430
17567
  price: { "currency": "USD", "input": 0.15, "output": 0.6, "cacheRead": 0.075, "cacheWrite": 0 }
17431
17568
  },
17569
+ {
17570
+ id: "openai/gpt-oss-120b:batch",
17571
+ price: { "currency": "USD", "input": 0.0296, "output": 0.136, "cacheRead": 0, "cacheWrite": 0 }
17572
+ },
17432
17573
  {
17433
17574
  id: "openai/gpt-oss-20b",
17434
- price: { "currency": "USD", "input": 0.018, "output": 0.09, "cacheRead": 9e-3, "cacheWrite": 0 }
17575
+ price: { "currency": "USD", "input": 0.03, "output": 0.13, "cacheRead": 0.03, "cacheWrite": 0 }
17576
+ },
17577
+ {
17578
+ id: "openai/gpt-oss-20b:batch",
17579
+ price: { "currency": "USD", "input": 0.024, "output": 0.112, "cacheRead": 0, "cacheWrite": 0 }
17435
17580
  },
17436
17581
  {
17437
17582
  id: "openai/gpt-oss-safeguard-20b",
@@ -17441,17 +17586,29 @@ window.__ModuleLoader__.load({
17441
17586
  id: "openai/o3",
17442
17587
  price: { "currency": "USD", "input": 2, "output": 8, "cacheRead": 0.5, "cacheWrite": 0 }
17443
17588
  },
17589
+ {
17590
+ id: "openai/o3-mini:batch",
17591
+ price: { "currency": "USD", "input": 0.55, "output": 2.2, "cacheRead": 0.275, "cacheWrite": 0 }
17592
+ },
17444
17593
  {
17445
17594
  id: "openai/o3-pro",
17446
17595
  price: { "currency": "USD", "input": 20, "output": 80, "cacheRead": 0, "cacheWrite": 0 }
17447
17596
  },
17597
+ {
17598
+ id: "openai/o3:batch",
17599
+ price: { "currency": "USD", "input": 1, "output": 4, "cacheRead": 0.25, "cacheWrite": 0 }
17600
+ },
17601
+ {
17602
+ id: "openai/o4-mini:batch",
17603
+ price: { "currency": "USD", "input": 0.55, "output": 2.2, "cacheRead": 0.1375, "cacheWrite": 0 }
17604
+ },
17448
17605
  {
17449
17606
  id: "openrouter/free",
17450
17607
  price: { "currency": "USD", "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }
17451
17608
  },
17452
17609
  {
17453
17610
  id: "particle-ai/particle-1",
17454
- price: { "currency": "USD", "input": 0.25, "output": 1, "cacheRead": 0.03, "cacheWrite": 0 }
17611
+ price: { "currency": "USD", "input": 0.05, "output": 0.5, "cacheRead": 3e-3, "cacheWrite": 0 }
17455
17612
  },
17456
17613
  {
17457
17614
  id: "perceptron/perceptron-mk1",
@@ -17481,14 +17638,6 @@ window.__ModuleLoader__.load({
17481
17638
  id: "perplexity/sonar-reasoning-pro",
17482
17639
  price: { "currency": "USD", "input": 2, "output": 8, "cacheRead": 0, "cacheWrite": 0 }
17483
17640
  },
17484
- {
17485
- id: "poolside/laguna-s-2.1",
17486
- price: { "currency": "USD", "input": 0.09, "output": 0.18, "cacheRead": 9e-3, "cacheWrite": 0 }
17487
- },
17488
- {
17489
- id: "poolside/laguna-xs-2.1",
17490
- price: { "currency": "USD", "input": 0.06, "output": 0.12, "cacheRead": 0.03, "cacheWrite": 0 }
17491
- },
17492
17641
  {
17493
17642
  id: "prism-ml/ternary-bonsai-2-27b",
17494
17643
  price: { "currency": "USD", "input": 0.075, "output": 0.5, "cacheRead": 0.0375, "cacheWrite": 0 }
@@ -17523,7 +17672,7 @@ window.__ModuleLoader__.load({
17523
17672
  },
17524
17673
  {
17525
17674
  id: "qwen/qwen3-235b-a22b-2507",
17526
- price: { "currency": "USD", "input": 0.09, "output": 0.55, "cacheRead": 0, "cacheWrite": 0 }
17675
+ price: { "currency": "USD", "input": 0.14, "output": 0.8, "cacheRead": 0.05, "cacheWrite": 0 }
17527
17676
  },
17528
17677
  {
17529
17678
  id: "qwen/qwen3-235b-a22b-thinking-2507",
@@ -17547,7 +17696,7 @@ window.__ModuleLoader__.load({
17547
17696
  },
17548
17697
  {
17549
17698
  id: "qwen/qwen3-coder-30b-a3b-instruct",
17550
- price: { "currency": "USD", "input": 0.07, "output": 0.28, "cacheRead": 0, "cacheWrite": 0 }
17699
+ price: { "currency": "USD", "input": 0.15, "output": 0.6, "cacheRead": 0, "cacheWrite": 0 }
17551
17700
  },
17552
17701
  {
17553
17702
  id: "qwen/qwen3-coder-flash",
@@ -17591,7 +17740,7 @@ window.__ModuleLoader__.load({
17591
17740
  },
17592
17741
  {
17593
17742
  id: "qwen/qwen3.5-397b-a17b",
17594
- price: { "currency": "USD", "input": 0.5, "output": 3.6, "cacheRead": 0.3, "cacheWrite": 0 }
17743
+ price: { "currency": "USD", "input": 0.6, "output": 3.6, "cacheRead": 0.12, "cacheWrite": 0 }
17595
17744
  },
17596
17745
  {
17597
17746
  id: "qwen/qwen3.5-9b",
@@ -17637,13 +17786,21 @@ window.__ModuleLoader__.load({
17637
17786
  id: "qwen/qwen3.7-plus",
17638
17787
  price: { "currency": "USD", "input": 0.32, "output": 1.28, "cacheRead": 0.064, "cacheWrite": 0.4 }
17639
17788
  },
17789
+ {
17790
+ id: "qwen/qwen3.7-plus:batch",
17791
+ price: { "currency": "USD", "input": 0.23, "output": 0.92, "cacheRead": 0, "cacheWrite": 0 }
17792
+ },
17640
17793
  {
17641
17794
  id: "qwen/qwen3.8-2.4t-a95b",
17642
17795
  price: { "currency": "USD", "input": 2, "output": 6, "cacheRead": 0.25, "cacheWrite": 0 }
17643
17796
  },
17644
17797
  {
17645
17798
  id: "qwen/qwen3.8-27b",
17646
- price: { "currency": "USD", "input": 0.039, "output": 1.25, "cacheRead": 39e-4, "cacheWrite": 0 }
17799
+ price: { "currency": "USD", "input": 0.15, "output": 1.875, "cacheRead": 0.0375, "cacheWrite": 0 }
17800
+ },
17801
+ {
17802
+ id: "qwen/qwen3.8-27b:batch",
17803
+ price: { "currency": "USD", "input": 0.16, "output": 2, "cacheRead": 0.04, "cacheWrite": 0 }
17647
17804
  },
17648
17805
  {
17649
17806
  id: "qwen/qwen3.8-flash",
@@ -17653,6 +17810,10 @@ window.__ModuleLoader__.load({
17653
17810
  id: "qwen/qwen3.8-max-0902",
17654
17811
  price: { "currency": "USD", "input": 2, "output": 6, "cacheRead": 0.25, "cacheWrite": 0 }
17655
17812
  },
17813
+ {
17814
+ id: "qwen/qwen3.8-max-0902:batch",
17815
+ price: { "currency": "USD", "input": 1.15, "output": 3.45, "cacheRead": 0, "cacheWrite": 0 }
17816
+ },
17656
17817
  {
17657
17818
  id: "qwen/qwen3.8-max-prime",
17658
17819
  price: { "currency": "USD", "input": 4, "output": 12, "cacheRead": 0.5, "cacheWrite": 0 }
@@ -17667,7 +17828,7 @@ window.__ModuleLoader__.load({
17667
17828
  },
17668
17829
  {
17669
17830
  id: "reflection/beam-1.0-501b-a23b",
17670
- price: { "currency": "USD", "input": 0.25, "output": 1, "cacheRead": 0.05, "cacheWrite": 0 }
17831
+ price: { "currency": "USD", "input": 0.3, "output": 1, "cacheRead": 0.04, "cacheWrite": 0 }
17671
17832
  },
17672
17833
  {
17673
17834
  id: "rekaai/reka-edge",
@@ -17685,6 +17846,10 @@ window.__ModuleLoader__.load({
17685
17846
  id: "relace/relace-search",
17686
17847
  price: { "currency": "USD", "input": 1, "output": 3, "cacheRead": 0, "cacheWrite": 0 }
17687
17848
  },
17849
+ {
17850
+ id: "ricursiveai/ripple-65b-preview",
17851
+ price: { "currency": "USD", "input": 0.2, "output": 0.6, "cacheRead": 0.05, "cacheWrite": 0 }
17852
+ },
17688
17853
  {
17689
17854
  id: "sakana/fugu-max",
17690
17855
  price: { "currency": "USD", "input": 2, "output": 6, "cacheRead": 0.25, "cacheWrite": 0 }
@@ -17717,6 +17882,10 @@ window.__ModuleLoader__.load({
17717
17882
  id: "scaledown/summarize",
17718
17883
  price: { "currency": "USD", "input": 0.04, "output": 0, "cacheRead": 0, "cacheWrite": 0 }
17719
17884
  },
17885
+ {
17886
+ id: "stealth/crouton-alpha",
17887
+ price: { "currency": "USD", "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }
17888
+ },
17720
17889
  {
17721
17890
  id: "stepfun/step-3.5-flash",
17722
17891
  price: { "currency": "USD", "input": 0.1, "output": 0.3, "cacheRead": 0, "cacheWrite": 0 }
@@ -17747,15 +17916,19 @@ window.__ModuleLoader__.load({
17747
17916
  },
17748
17917
  {
17749
17918
  id: "tencent/hy3",
17750
- price: { "currency": "USD", "input": 0.132, "output": 0.528, "cacheRead": 0.033, "cacheWrite": 0 }
17919
+ price: { "currency": "USD", "input": 0.0825, "output": 0.33, "cacheRead": 0.020625, "cacheWrite": 0 }
17751
17920
  },
17752
17921
  {
17753
17922
  id: "tencent/hy3-preview",
17754
17923
  price: { "currency": "USD", "input": 0.18, "output": 0.6, "cacheRead": 0.06, "cacheWrite": 0 }
17755
17924
  },
17925
+ {
17926
+ id: "tencent/hy4",
17927
+ price: { "currency": "USD", "input": 0.417, "output": 1.2505, "cacheRead": 0.021, "cacheWrite": 0 }
17928
+ },
17756
17929
  {
17757
17930
  id: "tencent/hy4-preview",
17758
- price: { "currency": "USD", "input": 0.834, "output": 2.501, "cacheRead": 0.042, "cacheWrite": 0 }
17931
+ price: { "currency": "USD", "input": 0.7506, "output": 2.2509, "cacheRead": 0.0378, "cacheWrite": 0 }
17759
17932
  },
17760
17933
  {
17761
17934
  id: "thedrummer/cydonia-24b-v4.1",
@@ -17777,6 +17950,10 @@ window.__ModuleLoader__.load({
17777
17950
  id: "thinkingmachines/inkling-small",
17778
17951
  price: { "currency": "USD", "input": 0.45, "output": 1.2, "cacheRead": 0.1, "cacheWrite": 0 }
17779
17952
  },
17953
+ {
17954
+ id: "thinkingmachines/inkling-small:batch",
17955
+ price: { "currency": "USD", "input": 0.36, "output": 0.96, "cacheRead": 0.08, "cacheWrite": 0 }
17956
+ },
17780
17957
  {
17781
17958
  id: "unbiased/pareto-26.10",
17782
17959
  price: { "currency": "USD", "input": 0.8, "output": 3.2, "cacheRead": 0.03, "cacheWrite": 0 }
@@ -17787,7 +17964,7 @@ window.__ModuleLoader__.load({
17787
17964
  },
17788
17965
  {
17789
17966
  id: "undi95/remm-slerp-l2-13b",
17790
- price: { "currency": "USD", "input": 0.35, "output": 0.65, "cacheRead": 0, "cacheWrite": 0 }
17967
+ price: { "currency": "USD", "input": 0.35, "output": 0.65, "cacheRead": 0.35, "cacheWrite": 0 }
17791
17968
  },
17792
17969
  {
17793
17970
  id: "upstage/solar-mini4",
@@ -17813,6 +17990,10 @@ window.__ModuleLoader__.load({
17813
17990
  id: "x-ai/grok-4.3",
17814
17991
  price: { "currency": "USD", "input": 1.25, "output": 2.5, "cacheRead": 0.2, "cacheWrite": 0 }
17815
17992
  },
17993
+ {
17994
+ id: "x-ai/grok-4.3:batch",
17995
+ price: { "currency": "USD", "input": 1, "output": 2, "cacheRead": 0.16, "cacheWrite": 0 }
17996
+ },
17816
17997
  {
17817
17998
  id: "x-ai/grok-4.5",
17818
17999
  price: { "currency": "USD", "input": 2, "output": 6, "cacheRead": 0.3, "cacheWrite": 0 }
@@ -17821,10 +18002,18 @@ window.__ModuleLoader__.load({
17821
18002
  id: "x-ai/grok-4.6",
17822
18003
  price: { "currency": "USD", "input": 2, "output": 6, "cacheRead": 0.5, "cacheWrite": 0 }
17823
18004
  },
18005
+ {
18006
+ id: "x-ai/grok-4.6:batch",
18007
+ price: { "currency": "USD", "input": 1.6, "output": 4.8, "cacheRead": 0.4, "cacheWrite": 0 }
18008
+ },
17824
18009
  {
17825
18010
  id: "x-ai/grok-4.7",
17826
18011
  price: { "currency": "USD", "input": 2, "output": 6, "cacheRead": 0.5, "cacheWrite": 0 }
17827
18012
  },
18013
+ {
18014
+ id: "x-ai/grok-4.7:batch",
18015
+ price: { "currency": "USD", "input": 1.6, "output": 4.8, "cacheRead": 0.4, "cacheWrite": 0 }
18016
+ },
17828
18017
  {
17829
18018
  id: "x-ai/grok-build-0.1",
17830
18019
  price: { "currency": "USD", "input": 1, "output": 2, "cacheRead": 0.2, "cacheWrite": 0 }
@@ -17859,7 +18048,7 @@ window.__ModuleLoader__.load({
17859
18048
  },
17860
18049
  {
17861
18050
  id: "z-ai/glm-4.5-air",
17862
- price: { "currency": "USD", "input": 0.13, "output": 0.85, "cacheRead": 0.025, "cacheWrite": 0 }
18051
+ price: { "currency": "USD", "input": 0.2, "output": 1.1, "cacheRead": 0.03, "cacheWrite": 0 }
17863
18052
  },
17864
18053
  {
17865
18054
  id: "z-ai/glm-4.5v",
@@ -17875,7 +18064,7 @@ window.__ModuleLoader__.load({
17875
18064
  },
17876
18065
  {
17877
18066
  id: "z-ai/glm-4.7",
17878
- price: { "currency": "USD", "input": 0.54, "output": 1.98, "cacheRead": 0.099, "cacheWrite": 0 }
18067
+ price: { "currency": "USD", "input": 0.6, "output": 2.2, "cacheRead": 0.11, "cacheWrite": 0 }
17879
18068
  },
17880
18069
  {
17881
18070
  id: "z-ai/glm-4.7-flash",
@@ -17895,24 +18084,40 @@ window.__ModuleLoader__.load({
17895
18084
  },
17896
18085
  {
17897
18086
  id: "z-ai/glm-5.2",
17898
- price: { "currency": "USD", "input": 6e-3, "output": 7, "cacheRead": 5e-3, "cacheWrite": 0 }
18087
+ price: { "currency": "USD", "input": 6e-3, "output": 6.8, "cacheRead": 5e-3, "cacheWrite": 0 }
18088
+ },
18089
+ {
18090
+ id: "z-ai/glm-5.2:batch",
18091
+ price: { "currency": "USD", "input": 0.623, "output": 1.271, "cacheRead": 0.21, "cacheWrite": 0 }
17899
18092
  },
17900
18093
  {
17901
18094
  id: "z-ai/glm-5.3",
17902
- price: { "currency": "USD", "input": 0.08, "output": 3.6, "cacheRead": 0.076, "cacheWrite": 0 }
18095
+ price: { "currency": "USD", "input": 0.0699, "output": 1.4, "cacheRead": 0.0689, "cacheWrite": 0 }
17903
18096
  },
17904
18097
  {
17905
18098
  id: "z-ai/glm-5.3-flash",
17906
- price: { "currency": "USD", "input": 0.0478, "output": 0.0701, "cacheRead": 0.03, "cacheWrite": 0 }
18099
+ price: { "currency": "USD", "input": 0.0335, "output": 0.083, "cacheRead": 0.03, "cacheWrite": 0 }
18100
+ },
18101
+ {
18102
+ id: "z-ai/glm-5.3-flash:batch",
18103
+ price: { "currency": "USD", "input": 0.043, "output": 0.087, "cacheRead": 0.018, "cacheWrite": 0 }
17907
18104
  },
17908
18105
  {
17909
18106
  id: "z-ai/glm-5.3-flashx",
17910
- price: { "currency": "USD", "input": 0.37, "output": 1.25, "cacheRead": 0.09, "cacheWrite": 0 }
18107
+ price: { "currency": "USD", "input": 0.37, "output": 1.25, "cacheRead": 0.075, "cacheWrite": 0 }
18108
+ },
18109
+ {
18110
+ id: "z-ai/glm-5.3-flashx-legal",
18111
+ price: { "currency": "USD", "input": 0.37, "output": 1.25, "cacheRead": 0.075, "cacheWrite": 0 }
17911
18112
  },
17912
18113
  {
17913
18114
  id: "z-ai/glm-5.3-prime",
17914
18115
  price: { "currency": "USD", "input": 2.8, "output": 8.8, "cacheRead": 0.56, "cacheWrite": 0 }
17915
18116
  },
18117
+ {
18118
+ id: "z-ai/glm-5.3:batch",
18119
+ price: { "currency": "USD", "input": 0.45, "output": 2, "cacheRead": 0.1, "cacheWrite": 0 }
18120
+ },
17916
18121
  {
17917
18122
  id: "z-ai/glm-5v-turbo",
17918
18123
  price: { "currency": "USD", "input": 1.2, "output": 4, "cacheRead": 0.24, "cacheWrite": 0 }
@@ -17985,10 +18190,30 @@ window.__ModuleLoader__.load({
17985
18190
  }
17986
18191
  }
17987
18192
  for (const entry of GENERATED_PRICES) {
17988
- for (const candidate of modelKeyCandidates(entry.id)) {
18193
+ const candidates = modelKeyCandidates(entry.id);
18194
+ if (candidates.some((candidate) => BUILTIN_BY_KEY.has(candidate))) continue;
18195
+ for (const candidate of candidates) {
17989
18196
  if (!BUILTIN_BY_KEY.has(candidate)) BUILTIN_BY_KEY.set(candidate, entry.price);
17990
18197
  }
17991
18198
  }
18199
+ function builtinPriceRows() {
18200
+ const rows = BUILTIN_PRICES.map((entry) => ({
18201
+ key: entry.id,
18202
+ provider: "DeepSeek official",
18203
+ model: entry.id,
18204
+ price: entry.price
18205
+ }));
18206
+ for (const entry of GENERATED_PRICES) {
18207
+ const slash = entry.id.indexOf("/");
18208
+ rows.push({
18209
+ key: entry.id,
18210
+ provider: slash === -1 ? "OpenRouter" : entry.id.slice(0, slash).replace(/^~/, ""),
18211
+ model: entry.id,
18212
+ price: entry.price
18213
+ });
18214
+ }
18215
+ return rows.sort((left, right) => left.key.localeCompare(right.key));
18216
+ }
17992
18217
  function builtinPriceFor(model) {
17993
18218
  for (const key of modelKeyCandidates(model)) {
17994
18219
  const price = BUILTIN_BY_KEY.get(key);
@@ -18048,13 +18273,22 @@ window.__ModuleLoader__.load({
18048
18273
  const amount = (usage.uncachedInputTokens * price.input + usage.cacheReadTokens * price.cacheRead + usage.cacheWriteTokens * price.cacheWrite + usage.outputTokens * price.output) / 1e6;
18049
18274
  return Number.isFinite(amount) ? amount : null;
18050
18275
  }
18276
+ function priceForModel(table, key, model) {
18277
+ const direct = table[key];
18278
+ if (direct !== void 0) return direct;
18279
+ for (const candidate of modelKeyCandidates(model)) {
18280
+ const price = table[candidate];
18281
+ if (price !== void 0) return price;
18282
+ }
18283
+ return void 0;
18284
+ }
18051
18285
  function estimateCost(models, table) {
18052
18286
  const rows = [];
18053
18287
  const totals = /* @__PURE__ */ new Map();
18054
18288
  let pricedModels = 0;
18055
18289
  let unpricedModels = 0;
18056
18290
  for (const model of models) {
18057
- const price = table[model.key];
18291
+ const price = priceForModel(table, model.key, model.model);
18058
18292
  const configured = isPriceConfigured(price);
18059
18293
  const amount = configured ? costOf(model, price) : null;
18060
18294
  if (configured && amount !== null) {
@@ -18158,60 +18392,58 @@ window.__ModuleLoader__.load({
18158
18392
  refreshingPrices,
18159
18393
  priceError,
18160
18394
  onRefreshPrices,
18161
- onConfigure,
18162
18395
  autoSync
18163
18396
  } = props;
18164
18397
  const estimate = estimateCost([...models], pricing);
18165
18398
  const totalLabel = totalLabelOf(estimate);
18166
18399
  const refreshLabel = refreshingPrices ? t("cost.refreshing") : t("cost.refresh");
18167
- return (0, import_react57.createElement)(
18400
+ return (0, import_react56.createElement)(
18168
18401
  Section,
18169
18402
  { ariaLabel: t("cost.title") },
18170
- models.length === 0 ? (0, import_react57.createElement)(EmptyState, { icon: (0, import_react57.createElement)(ChartIcon, { size: 20 }), title: t("models.empty") }) : (0, import_react57.createElement)(
18403
+ models.length === 0 ? (0, import_react56.createElement)(EmptyState, { icon: (0, import_react56.createElement)(ChartIcon, { size: 20 }), title: t("models.empty") }) : (0, import_react56.createElement)(
18171
18404
  "div",
18172
18405
  { className: "tdb-cost-page" },
18173
- (0, import_react57.createElement)(
18406
+ (0, import_react56.createElement)(
18174
18407
  "div",
18175
18408
  { className: "tdb-cost-summary" },
18176
- (0, import_react57.createElement)(
18409
+ (0, import_react56.createElement)(
18177
18410
  "div",
18178
18411
  { className: "tdb-cost-summary-main" },
18179
- (0, import_react57.createElement)("div", { className: "tdb-cost-summary-value" }, totalLabel ?? "\u2014"),
18180
- (0, import_react57.createElement)(
18412
+ (0, import_react56.createElement)("div", { className: "tdb-cost-summary-value" }, totalLabel ?? "\u2014"),
18413
+ (0, import_react56.createElement)(
18181
18414
  "div",
18182
18415
  { className: "tdb-cost-summary-meta" },
18183
- (0, import_react57.createElement)("span", { className: "tdb-cost-meta" }, sourceText(t, intl, onlineAt, onlineSource, autoSync === true)),
18184
- estimate.unpricedModels > 0 ? (0, import_react57.createElement)("span", { className: "tdb-cost-hint" }, t("cost.unpriced", { count: estimate.unpricedModels })) : null
18416
+ (0, import_react56.createElement)("span", { className: "tdb-cost-meta" }, sourceText(t, intl, onlineAt, onlineSource, autoSync === true)),
18417
+ estimate.unpricedModels > 0 ? (0, import_react56.createElement)("span", { className: "tdb-cost-hint" }, t("cost.unpriced", { count: estimate.unpricedModels })) : null
18185
18418
  )
18186
18419
  ),
18187
- (0, import_react57.createElement)(
18420
+ (0, import_react56.createElement)(
18188
18421
  "div",
18189
18422
  { className: "tdb-cost-actions tdb-cost-summary-actions" },
18190
- (0, import_react57.createElement)(Button3, { variant: "ghost", busy: refreshingPrices, onClick: onRefreshPrices }, refreshLabel),
18191
- (0, import_react57.createElement)(Button3, { onClick: onConfigure }, t("cost.manage"))
18423
+ (0, import_react56.createElement)(Button3, { variant: "ghost", busy: refreshingPrices, onClick: onRefreshPrices }, refreshLabel)
18192
18424
  )
18193
18425
  ),
18194
- priceError ? (0, import_react57.createElement)("div", { className: "tdb-error-text", style: { marginTop: "6px" } }, t("cost.refreshError")) : null,
18195
- (0, import_react57.createElement)(CostTable, { rows: estimate.rows, t, intl })
18426
+ priceError ? (0, import_react56.createElement)("div", { className: "tdb-error-text", style: { marginTop: "6px" } }, t("cost.refreshError")) : null,
18427
+ (0, import_react56.createElement)(CostTable, { rows: estimate.rows, t, intl })
18196
18428
  )
18197
18429
  );
18198
18430
  }
18199
18431
  function CostTable({ rows, t, intl }) {
18200
18432
  const pageSize = TABLE_PAGE_SIZE;
18201
- const [page, setPage] = (0, import_react57.useState)(0);
18433
+ const [page, setPage] = (0, import_react56.useState)(0);
18202
18434
  const pages = Math.max(1, Math.ceil(rows.length / pageSize));
18203
18435
  const current2 = Math.min(page, pages - 1);
18204
18436
  const visible = rows.slice(current2 * pageSize, current2 * pageSize + pageSize);
18205
- return (0, import_react57.createElement)(
18437
+ return (0, import_react56.createElement)(
18206
18438
  "div",
18207
18439
  { className: "tdb-table-panel" },
18208
- (0, import_react57.createElement)(DataTable, {
18440
+ (0, import_react56.createElement)(DataTable, {
18209
18441
  rows: visible,
18210
18442
  columns: costColumns(t, intl),
18211
18443
  rowKey: (row) => row.key,
18212
18444
  ariaLabel: t("cost.title")
18213
18445
  }),
18214
- pages > 1 ? (0, import_react57.createElement)(Pager, {
18446
+ pages > 1 ? (0, import_react56.createElement)(Pager, {
18215
18447
  page: current2 + 1,
18216
18448
  pages,
18217
18449
  onChange: (next) => setPage(next - 1),
@@ -18225,15 +18457,15 @@ window.__ModuleLoader__.load({
18225
18457
  {
18226
18458
  key: "model",
18227
18459
  header: t("models.model"),
18228
- render: (row) => (0, import_react57.createElement)(
18460
+ render: (row) => (0, import_react56.createElement)(
18229
18461
  "div",
18230
18462
  {},
18231
- (0, import_react57.createElement)(
18463
+ (0, import_react56.createElement)(
18232
18464
  "div",
18233
18465
  { className: `tdb-model-name${row.model === "" ? " tdb-model-unknown" : ""}` },
18234
18466
  row.model === "" ? t("models.unknown") : row.model
18235
18467
  ),
18236
- (0, import_react57.createElement)("div", { className: "tdb-model-provider" }, row.provider === "" ? "\u2014" : row.provider)
18468
+ (0, import_react56.createElement)("div", { className: "tdb-model-provider" }, row.provider === "" ? "\u2014" : row.provider)
18237
18469
  )
18238
18470
  },
18239
18471
  {
@@ -18248,7 +18480,7 @@ window.__ModuleLoader__.load({
18248
18480
  header: t("cost.title"),
18249
18481
  headerClassName: "tdb-num",
18250
18482
  cellClassName: "tdb-num",
18251
- render: (row) => row.priced && row.amount !== null && row.currency !== null ? formatAmount(row.amount, row.currency) : (0, import_react57.createElement)("span", { className: "tdb-cost-hint" }, t("cost.notSet"))
18483
+ render: (row) => row.priced && row.amount !== null && row.currency !== null ? formatAmount(row.amount, row.currency) : (0, import_react56.createElement)("span", { className: "tdb-cost-hint" }, t("cost.notSet"))
18252
18484
  }
18253
18485
  ];
18254
18486
  }
@@ -18267,10 +18499,10 @@ window.__ModuleLoader__.load({
18267
18499
  }
18268
18500
 
18269
18501
  // src/client/components/DashboardHeader.tsx
18270
- var import_react66 = require("react");
18502
+ var import_react65 = require("react");
18271
18503
 
18272
18504
  // src/client/components/ExportMenu.tsx
18273
- var import_react58 = require("react");
18505
+ var import_react57 = require("react");
18274
18506
 
18275
18507
  // src/client/lib.ts
18276
18508
  var NS = "dsh-token-dashboard";
@@ -18482,8 +18714,8 @@ window.__ModuleLoader__.load({
18482
18714
 
18483
18715
  // src/client/components/ExportMenu.tsx
18484
18716
  function ExportMenu({ data, t }) {
18485
- const [open, setOpen] = (0, import_react58.useState)(false);
18486
- const anchor = (0, import_react58.useRef)(null);
18717
+ const [open, setOpen] = (0, import_react57.useState)(false);
18718
+ const anchor = (0, import_react57.useRef)(null);
18487
18719
  const close = () => setOpen(false);
18488
18720
  const stamp = data.today;
18489
18721
  const run = (kind) => {
@@ -18503,38 +18735,38 @@ window.__ModuleLoader__.load({
18503
18735
  close();
18504
18736
  }
18505
18737
  };
18506
- return (0, import_react58.createElement)(
18738
+ return (0, import_react57.createElement)(
18507
18739
  "div",
18508
18740
  { className: "tdb-menu-anchor", ref: anchor },
18509
- (0, import_react58.createElement)(Button3, {
18741
+ (0, import_react57.createElement)(Button3, {
18510
18742
  onClick: () => setOpen((current2) => !current2),
18511
18743
  "aria-haspopup": "menu",
18512
18744
  "aria-expanded": open
18513
- }, (0, import_react58.createElement)(DownloadIcon, { size: 14 }), t("actions.export")),
18514
- (0, import_react58.createElement)(
18745
+ }, (0, import_react57.createElement)(DownloadIcon, { size: 14 }), t("actions.export")),
18746
+ (0, import_react57.createElement)(
18515
18747
  Menu,
18516
18748
  { open, onClose: close, triggerRef: anchor },
18517
- (0, import_react58.createElement)(MenuItem, { onClick: () => run("summary"), title: t("export.summary") }),
18518
- (0, import_react58.createElement)(MenuItem, { onClick: () => run("sessions"), title: t("export.sessions") }),
18519
- (0, import_react58.createElement)(MenuItem, { onClick: () => run("json"), title: t("export.json") })
18749
+ (0, import_react57.createElement)(MenuItem, { onClick: () => run("summary"), title: t("export.summary") }),
18750
+ (0, import_react57.createElement)(MenuItem, { onClick: () => run("sessions"), title: t("export.sessions") }),
18751
+ (0, import_react57.createElement)(MenuItem, { onClick: () => run("json"), title: t("export.json") })
18520
18752
  )
18521
18753
  );
18522
18754
  }
18523
18755
 
18524
18756
  // src/client/components/ui/Select.tsx
18525
- var import_react65 = require("react");
18757
+ var import_react64 = require("react");
18526
18758
 
18527
18759
  // src/client/beui/components/motion/select.tsx
18528
- var import_react62 = require("react");
18529
- var import_react64 = require("react");
18760
+ var import_react61 = require("react");
18761
+ var import_react63 = require("react");
18530
18762
 
18531
18763
  // src/client/beui/lib/hooks/use-listbox.ts
18532
- var import_react61 = require("react");
18764
+ var import_react60 = require("react");
18533
18765
 
18534
18766
  // src/client/beui/lib/hooks/use-on-open.ts
18535
- var import_react59 = require("react");
18767
+ var import_react58 = require("react");
18536
18768
  function useOnOpen(open, start) {
18537
- const [wasOpen, setWasOpen] = (0, import_react59.useState)(open);
18769
+ const [wasOpen, setWasOpen] = (0, import_react58.useState)(open);
18538
18770
  if (open !== wasOpen) {
18539
18771
  setWasOpen(open);
18540
18772
  if (open) start();
@@ -18542,24 +18774,24 @@ window.__ModuleLoader__.load({
18542
18774
  }
18543
18775
 
18544
18776
  // src/client/beui/lib/hooks/use-row-cursor.ts
18545
- var import_react60 = require("react");
18777
+ var import_react59 = require("react");
18546
18778
  function indexOfCursor(rows, query, cursor) {
18547
18779
  if (cursor === null || cursor.query !== query) return -1;
18548
18780
  return rows.findIndex((row) => row.id === cursor.id);
18549
18781
  }
18550
18782
  function useRowCursor(rows, query) {
18551
- const [cursor, setCursor] = (0, import_react60.useState)(null);
18552
- const latest = (0, import_react60.useRef)({ rows, query });
18553
- (0, import_react60.useLayoutEffect)(() => {
18783
+ const [cursor, setCursor] = (0, import_react59.useState)(null);
18784
+ const latest = (0, import_react59.useRef)({ rows, query });
18785
+ (0, import_react59.useLayoutEffect)(() => {
18554
18786
  latest.current = { rows, query };
18555
18787
  });
18556
18788
  const cursorRow = indexOfCursor(rows, query, cursor);
18557
18789
  if (cursor !== null && cursorRow < 0) setCursor(null);
18558
- const moveTo = (0, import_react60.useCallback)(
18790
+ const moveTo = (0, import_react59.useCallback)(
18559
18791
  (id3) => setCursor(id3 === null ? null : { id: id3, query: latest.current.query }),
18560
18792
  []
18561
18793
  );
18562
- const moveActive = (0, import_react60.useCallback)((direction) => {
18794
+ const moveActive = (0, import_react59.useCallback)((direction) => {
18563
18795
  const { rows: live, query: liveQuery } = latest.current;
18564
18796
  const last = live.length - 1;
18565
18797
  if (last < 0) return;
@@ -18580,19 +18812,19 @@ window.__ModuleLoader__.load({
18580
18812
  selected,
18581
18813
  list
18582
18814
  }) {
18583
- const enabled = (0, import_react61.useMemo)(() => rows.filter((row) => !row.disabled), [rows]);
18815
+ const enabled = (0, import_react60.useMemo)(() => rows.filter((row) => !row.disabled), [rows]);
18584
18816
  const { activeIndex, moveTo, moveActive } = useRowCursor(enabled, "");
18585
18817
  useOnOpen(
18586
18818
  open,
18587
18819
  () => moveTo(enabled.some((row) => row.id === selected) ? selected ?? null : null)
18588
18820
  );
18589
18821
  const activeId = enabled[activeIndex]?.id;
18590
- const typed = (0, import_react61.useRef)({ text: "", at: 0 });
18591
- const openedOnMount = (0, import_react61.useRef)(open);
18592
- (0, import_react61.useEffect)(() => {
18822
+ const typed = (0, import_react60.useRef)({ text: "", at: 0 });
18823
+ const openedOnMount = (0, import_react60.useRef)(open);
18824
+ (0, import_react60.useEffect)(() => {
18593
18825
  if (!open) openedOnMount.current = false;
18594
18826
  }, [open]);
18595
- (0, import_react61.useEffect)(() => {
18827
+ (0, import_react60.useEffect)(() => {
18596
18828
  if (!open || activeId === void 0) return;
18597
18829
  if (openedOnMount.current && !list.current?.contains(document.activeElement))
18598
18830
  return;
@@ -18645,10 +18877,10 @@ window.__ModuleLoader__.load({
18645
18877
  hidden: { opacity: 0, y: -4, transition: { duration: 0.08, ease: EASE_OUT } },
18646
18878
  show: { opacity: 1, y: 0, transition: { duration: 0.12, ease: EASE_OUT } }
18647
18879
  };
18648
- var SelectContext = (0, import_react64.createContext)(null);
18649
- var ActiveOptionContext = (0, import_react64.createContext)(void 0);
18880
+ var SelectContext = (0, import_react63.createContext)(null);
18881
+ var ActiveOptionContext = (0, import_react63.createContext)(void 0);
18650
18882
  function useSelectContext(component) {
18651
- const ctx = (0, import_react64.useContext)(SelectContext);
18883
+ const ctx = (0, import_react63.useContext)(SelectContext);
18652
18884
  if (!ctx) throw new Error(`${component} must be used within <Select>`);
18653
18885
  return ctx;
18654
18886
  }
@@ -18664,31 +18896,31 @@ window.__ModuleLoader__.load({
18664
18896
  children
18665
18897
  }) {
18666
18898
  const reduce = useReducedMotion() ?? false;
18667
- const baseId = (0, import_react64.useId)();
18668
- const rootRef = (0, import_react64.useRef)(null);
18669
- const [internalOpen, setInternalOpen] = (0, import_react64.useState)(defaultOpen);
18670
- const [internal, setInternal] = (0, import_react64.useState)(defaultValue);
18671
- const [labels, setLabels] = (0, import_react64.useState)(/* @__PURE__ */ new Map());
18672
- const [placement, setPlacement] = (0, import_react64.useState)("bottom");
18899
+ const baseId = (0, import_react63.useId)();
18900
+ const rootRef = (0, import_react63.useRef)(null);
18901
+ const [internalOpen, setInternalOpen] = (0, import_react63.useState)(defaultOpen);
18902
+ const [internal, setInternal] = (0, import_react63.useState)(defaultValue);
18903
+ const [labels, setLabels] = (0, import_react63.useState)(/* @__PURE__ */ new Map());
18904
+ const [placement, setPlacement] = (0, import_react63.useState)("bottom");
18673
18905
  const controlled = value !== void 0;
18674
18906
  const current2 = controlled ? value : internal;
18675
18907
  const openControlled = openProp !== void 0;
18676
18908
  const open = openControlled ? openProp : internalOpen;
18677
18909
  const progress2 = useMotionValue(open ? 1 : 0);
18678
- const setOpen = (0, import_react64.useCallback)(
18910
+ const setOpen = (0, import_react63.useCallback)(
18679
18911
  (next) => {
18680
18912
  if (!openControlled) setInternalOpen(next);
18681
18913
  onOpenChange?.(next);
18682
18914
  },
18683
18915
  [onOpenChange, openControlled]
18684
18916
  );
18685
- const close = (0, import_react64.useCallback)(() => {
18917
+ const close = (0, import_react63.useCallback)(() => {
18686
18918
  const trigger = document.getElementById(`${baseId}-trigger`);
18687
18919
  if (rootRef.current?.contains(document.activeElement) && document.activeElement !== trigger)
18688
18920
  trigger?.focus();
18689
18921
  setOpen(false);
18690
18922
  }, [baseId, setOpen]);
18691
- const select = (0, import_react64.useCallback)(
18923
+ const select = (0, import_react63.useCallback)(
18692
18924
  (next) => {
18693
18925
  if (!controlled) setInternal(next);
18694
18926
  onValueChange?.(next);
@@ -18696,14 +18928,14 @@ window.__ModuleLoader__.load({
18696
18928
  },
18697
18929
  [controlled, onValueChange, close]
18698
18930
  );
18699
- const register = (0, import_react64.useCallback)((v, label2, disabled2) => {
18931
+ const register = (0, import_react63.useCallback)((v, label2, disabled2) => {
18700
18932
  setLabels((m2) => {
18701
18933
  const entry = m2.get(v);
18702
18934
  if (entry?.label === label2 && entry.disabled === disabled2) return m2;
18703
18935
  return new Map(m2).set(v, { label: label2, disabled: disabled2 });
18704
18936
  });
18705
18937
  }, []);
18706
- const unregister = (0, import_react64.useCallback)((v) => {
18938
+ const unregister = (0, import_react63.useCallback)((v) => {
18707
18939
  setLabels((m2) => {
18708
18940
  if (!m2.has(v)) return m2;
18709
18941
  const next = new Map(m2);
@@ -18711,7 +18943,7 @@ window.__ModuleLoader__.load({
18711
18943
  return next;
18712
18944
  });
18713
18945
  }, []);
18714
- (0, import_react64.useEffect)(() => {
18946
+ (0, import_react63.useEffect)(() => {
18715
18947
  const animation = animate(
18716
18948
  progress2,
18717
18949
  open ? 1 : 0,
@@ -18719,7 +18951,7 @@ window.__ModuleLoader__.load({
18719
18951
  );
18720
18952
  return () => animation.stop();
18721
18953
  }, [open, progress2, reduce]);
18722
- (0, import_react64.useEffect)(() => {
18954
+ (0, import_react63.useEffect)(() => {
18723
18955
  if (!open) return;
18724
18956
  const onKey = (e) => e.key === "Escape" && close();
18725
18957
  const onPointer = (e) => {
@@ -18733,7 +18965,7 @@ window.__ModuleLoader__.load({
18733
18965
  window.removeEventListener("pointerdown", onPointer);
18734
18966
  };
18735
18967
  }, [open, setOpen, close]);
18736
- const rows = (0, import_react64.useMemo)(
18968
+ const rows = (0, import_react63.useMemo)(
18737
18969
  () => Array.from(labels, ([id3, entry]) => ({
18738
18970
  id: id3,
18739
18971
  label: entry.label,
@@ -18741,7 +18973,7 @@ window.__ModuleLoader__.load({
18741
18973
  })),
18742
18974
  [labels]
18743
18975
  );
18744
- const ctx = (0, import_react64.useMemo)(
18976
+ const ctx = (0, import_react63.useMemo)(
18745
18977
  () => ({
18746
18978
  value: current2,
18747
18979
  open,
@@ -18777,7 +19009,7 @@ window.__ModuleLoader__.load({
18777
19009
  placement
18778
19010
  ]
18779
19011
  );
18780
- return /* @__PURE__ */ (0, import_react62.createElement)(SelectContext.Provider, { value: ctx }, /* @__PURE__ */ (0, import_react62.createElement)("div", { ref: rootRef, className: cn("relative", className) }, children));
19012
+ return /* @__PURE__ */ (0, import_react61.createElement)(SelectContext.Provider, { value: ctx }, /* @__PURE__ */ (0, import_react61.createElement)("div", { ref: rootRef, className: cn("relative", className) }, children));
18781
19013
  }
18782
19014
  function SelectTrigger({ className, ariaLabel, children }) {
18783
19015
  const ctx = useSelectContext("SelectTrigger");
@@ -18791,7 +19023,7 @@ window.__ModuleLoader__.load({
18791
19023
  ctx.progress,
18792
19024
  (p) => ctx.reduce ? ctx.open ? 180 : 0 : Math.min(1, Math.max(0, p)) * 180
18793
19025
  );
18794
- return /* @__PURE__ */ (0, import_react62.createElement)(
19026
+ return /* @__PURE__ */ (0, import_react61.createElement)(
18795
19027
  motion2.button,
18796
19028
  {
18797
19029
  type: "button",
@@ -18822,21 +19054,21 @@ window.__ModuleLoader__.load({
18822
19054
  )
18823
19055
  },
18824
19056
  children,
18825
- /* @__PURE__ */ (0, import_react62.createElement)(
19057
+ /* @__PURE__ */ (0, import_react61.createElement)(
18826
19058
  motion2.span,
18827
19059
  {
18828
19060
  "aria-hidden": true,
18829
19061
  style: { rotate: rotate2 },
18830
19062
  className: "text-muted-foreground"
18831
19063
  },
18832
- /* @__PURE__ */ (0, import_react62.createElement)(ChevronDown, { className: "h-4 w-4" })
19064
+ /* @__PURE__ */ (0, import_react61.createElement)(ChevronDown, { className: "h-4 w-4" })
18833
19065
  )
18834
19066
  );
18835
19067
  }
18836
19068
  function SelectValue({ placeholder, className }) {
18837
19069
  const ctx = useSelectContext("SelectValue");
18838
19070
  const label2 = ctx.labelFor(ctx.value);
18839
- return /* @__PURE__ */ (0, import_react62.createElement)(
19071
+ return /* @__PURE__ */ (0, import_react61.createElement)(
18840
19072
  "span",
18841
19073
  {
18842
19074
  className: cn(label2 ? "text-foreground" : "text-muted-foreground", className)
@@ -18846,8 +19078,8 @@ window.__ModuleLoader__.load({
18846
19078
  }
18847
19079
  function SelectContent({ className, children }) {
18848
19080
  const ctx = useSelectContext("SelectContent");
18849
- const panelRef = (0, import_react64.useRef)(null);
18850
- const [height, setHeight] = (0, import_react64.useState)(0);
19081
+ const panelRef = (0, import_react63.useRef)(null);
19082
+ const [height, setHeight] = (0, import_react63.useState)(0);
18851
19083
  const { open, progress: progress2, reduce, setPlacement } = ctx;
18852
19084
  const { activeId, onKeyDown } = useListbox({
18853
19085
  open,
@@ -18855,8 +19087,8 @@ window.__ModuleLoader__.load({
18855
19087
  selected: ctx.value,
18856
19088
  list: panelRef
18857
19089
  });
18858
- const [exiting, setExiting] = (0, import_react64.useState)(false);
18859
- const [wasOpen, setWasOpen] = (0, import_react64.useState)(open);
19090
+ const [exiting, setExiting] = (0, import_react63.useState)(false);
19091
+ const [wasOpen, setWasOpen] = (0, import_react63.useState)(open);
18860
19092
  if (open !== wasOpen) {
18861
19093
  setWasOpen(open);
18862
19094
  if (!open) setExiting(true);
@@ -18865,7 +19097,7 @@ window.__ModuleLoader__.load({
18865
19097
  useMotionValueEvent(progress2, "animationComplete", () => {
18866
19098
  if (progress2.get() === 0) setExiting(false);
18867
19099
  });
18868
- (0, import_react64.useLayoutEffect)(() => {
19100
+ (0, import_react63.useLayoutEffect)(() => {
18869
19101
  const node = panelRef.current;
18870
19102
  if (!node || !present) return;
18871
19103
  const measure = () => setHeight(node.offsetHeight);
@@ -18874,7 +19106,7 @@ window.__ModuleLoader__.load({
18874
19106
  observer2.observe(node);
18875
19107
  return () => observer2.disconnect();
18876
19108
  }, [present]);
18877
- (0, import_react64.useLayoutEffect)(() => {
19109
+ (0, import_react63.useLayoutEffect)(() => {
18878
19110
  if (!open) return;
18879
19111
  const trigger = document.getElementById(ctx.triggerId);
18880
19112
  const node = panelRef.current;
@@ -18905,7 +19137,7 @@ window.__ModuleLoader__.load({
18905
19137
  return `inset(${inset} round ${corners})`;
18906
19138
  });
18907
19139
  const opacity = useTransform(progress2, reduce ? [0, 1] : [0, 0.12], [0, 1]);
18908
- return /* @__PURE__ */ (0, import_react62.createElement)(
19140
+ return /* @__PURE__ */ (0, import_react61.createElement)(
18909
19141
  motion2.div,
18910
19142
  {
18911
19143
  ref: panelRef,
@@ -18936,7 +19168,7 @@ window.__ModuleLoader__.load({
18936
19168
  className
18937
19169
  )
18938
19170
  },
18939
- /* @__PURE__ */ (0, import_react62.createElement)(ActiveOptionContext.Provider, { value: activeId }, /* @__PURE__ */ (0, import_react62.createElement)(
19171
+ /* @__PURE__ */ (0, import_react61.createElement)(ActiveOptionContext.Provider, { value: activeId }, /* @__PURE__ */ (0, import_react61.createElement)(
18940
19172
  motion2.div,
18941
19173
  {
18942
19174
  initial: false,
@@ -18954,14 +19186,14 @@ window.__ModuleLoader__.load({
18954
19186
  children
18955
19187
  }) {
18956
19188
  const ctx = useSelectContext("SelectItem");
18957
- const activeId = (0, import_react64.useContext)(ActiveOptionContext);
19189
+ const activeId = (0, import_react63.useContext)(ActiveOptionContext);
18958
19190
  const selected = ctx.value === value;
18959
19191
  const label2 = typeof children === "string" ? children : value;
18960
- (0, import_react64.useLayoutEffect)(() => {
19192
+ (0, import_react63.useLayoutEffect)(() => {
18961
19193
  ctx.register(value, label2, disabled);
18962
19194
  }, [ctx.register, value, label2, disabled]);
18963
- (0, import_react64.useLayoutEffect)(() => () => ctx.unregister(value), [ctx.unregister, value]);
18964
- return /* @__PURE__ */ (0, import_react62.createElement)(motion2.div, { variants: ctx.reduce ? void 0 : ITEM_VARIANTS }, /* @__PURE__ */ (0, import_react62.createElement)(
19195
+ (0, import_react63.useLayoutEffect)(() => () => ctx.unregister(value), [ctx.unregister, value]);
19196
+ return /* @__PURE__ */ (0, import_react61.createElement)(motion2.div, { variants: ctx.reduce ? void 0 : ITEM_VARIANTS }, /* @__PURE__ */ (0, import_react61.createElement)(
18965
19197
  "button",
18966
19198
  {
18967
19199
  type: "button",
@@ -18979,30 +19211,30 @@ window.__ModuleLoader__.load({
18979
19211
  )
18980
19212
  },
18981
19213
  children,
18982
- selected ? /* @__PURE__ */ (0, import_react62.createElement)(Check, { className: "h-3.5 w-3.5 shrink-0" }) : null
19214
+ selected ? /* @__PURE__ */ (0, import_react61.createElement)(Check, { className: "h-3.5 w-3.5 shrink-0" }) : null
18983
19215
  ));
18984
19216
  }
18985
19217
 
18986
19218
  // src/client/components/ui/Select.tsx
18987
19219
  function Select2({ value, options, onChange, ariaLabel, className = "" }) {
18988
19220
  const selected = options.find((option) => option.value === value) ?? options[0];
18989
- return (0, import_react65.createElement)(Select, {
19221
+ return (0, import_react64.createElement)(Select, {
18990
19222
  value,
18991
19223
  onValueChange: onChange,
18992
19224
  className: `tdb-select-wrap ${className}`.trim(),
18993
19225
  children: [
18994
- (0, import_react65.createElement)(SelectTrigger, {
19226
+ (0, import_react64.createElement)(SelectTrigger, {
18995
19227
  key: "trigger",
18996
19228
  className: "tdb-select-trigger",
18997
19229
  ariaLabel,
18998
- children: (0, import_react65.createElement)(SelectValue, {
19230
+ children: (0, import_react64.createElement)(SelectValue, {
18999
19231
  placeholder: selected?.label ?? value
19000
19232
  })
19001
19233
  }),
19002
- (0, import_react65.createElement)(SelectContent, {
19234
+ (0, import_react64.createElement)(SelectContent, {
19003
19235
  key: "content",
19004
19236
  className: "tdb-select-menu",
19005
- children: options.map((option) => (0, import_react65.createElement)(SelectItem, {
19237
+ children: options.map((option) => (0, import_react64.createElement)(SelectItem, {
19006
19238
  key: option.value,
19007
19239
  value: option.value,
19008
19240
  className: "tdb-select-option",
@@ -19050,33 +19282,33 @@ window.__ModuleLoader__.load({
19050
19282
  scanInterval,
19051
19283
  onScanIntervalChange
19052
19284
  }) {
19053
- return (0, import_react66.createElement)(
19285
+ return (0, import_react65.createElement)(
19054
19286
  "header",
19055
19287
  { className: "tdb-head" },
19056
- (0, import_react66.createElement)("h1", { className: "tdb-title" }, t("panel.title")),
19057
- (0, import_react66.createElement)(
19288
+ (0, import_react65.createElement)("h1", { className: "tdb-title" }, t("panel.title")),
19289
+ (0, import_react65.createElement)(
19058
19290
  "div",
19059
19291
  { className: "tdb-actions" },
19060
- (0, import_react66.createElement)(
19292
+ (0, import_react65.createElement)(
19061
19293
  "div",
19062
19294
  { className: "tdb-lang-switch", role: "group", "aria-label": t("language.switch") },
19063
- (0, import_react66.createElement)("button", {
19295
+ (0, import_react65.createElement)("button", {
19064
19296
  type: "button",
19065
19297
  className: "tdb-lang-choice",
19066
19298
  "aria-pressed": language === "zh",
19067
19299
  onClick: () => onChangeLanguage("zh")
19068
19300
  }, "\u4E2D\u6587"),
19069
- (0, import_react66.createElement)("button", {
19301
+ (0, import_react65.createElement)("button", {
19070
19302
  type: "button",
19071
19303
  className: "tdb-lang-choice",
19072
19304
  "aria-pressed": language === "en",
19073
19305
  onClick: () => onChangeLanguage("en")
19074
19306
  }, "EN")
19075
19307
  ),
19076
- (0, import_react66.createElement)(
19308
+ (0, import_react65.createElement)(
19077
19309
  "div",
19078
19310
  { className: "tdb-scan-top" },
19079
- (0, import_react66.createElement)(Select2, {
19311
+ (0, import_react65.createElement)(Select2, {
19080
19312
  value: scanInterval,
19081
19313
  options: SCAN_INTERVALS.map((value) => ({ value, label: t(`scan.${value}`) })),
19082
19314
  onChange: (value) => onScanIntervalChange(value),
@@ -19084,7 +19316,7 @@ window.__ModuleLoader__.load({
19084
19316
  className: "tdb-scan-top-select"
19085
19317
  })
19086
19318
  ),
19087
- (0, import_react66.createElement)(
19319
+ (0, import_react65.createElement)(
19088
19320
  Button3,
19089
19321
  {
19090
19322
  variant: "ghost",
@@ -19093,19 +19325,19 @@ window.__ModuleLoader__.load({
19093
19325
  "aria-label": t("actions.syncNow"),
19094
19326
  title: t("actions.syncNow")
19095
19327
  },
19096
- (0, import_react66.createElement)("span", { className: refreshing ? "tdb-spin" : "" }, (0, import_react66.createElement)(RefreshIcon, { size: 15 })),
19097
- (0, import_react66.createElement)("span", { className: "tdb-sync-now-label" }, t("actions.syncNow"))
19328
+ (0, import_react65.createElement)("span", { className: refreshing ? "tdb-spin" : "" }, (0, import_react65.createElement)(RefreshIcon, { size: 15 })),
19329
+ (0, import_react65.createElement)("span", { className: "tdb-sync-now-label" }, t("actions.syncNow"))
19098
19330
  ),
19099
- showExport && data !== null ? (0, import_react66.createElement)(ExportMenu, { data, t }) : null
19331
+ showExport && data !== null ? (0, import_react65.createElement)(ExportMenu, { data, t }) : null
19100
19332
  )
19101
19333
  );
19102
19334
  }
19103
19335
 
19104
19336
  // src/client/components/Models.tsx
19105
- var import_react67 = require("react");
19337
+ var import_react66 = require("react");
19106
19338
  function ModelTable({ models, total, t, intl }) {
19107
19339
  const pageSize = TABLE_PAGE_SIZE;
19108
- const [page, setPage] = (0, import_react67.useState)(0);
19340
+ const [page, setPage] = (0, import_react66.useState)(0);
19109
19341
  const pages = Math.max(1, Math.ceil(models.length / pageSize));
19110
19342
  const current2 = Math.min(page, pages - 1);
19111
19343
  const visible = models.slice(current2 * pageSize, current2 * pageSize + pageSize);
@@ -19113,15 +19345,15 @@ window.__ModuleLoader__.load({
19113
19345
  {
19114
19346
  key: "model",
19115
19347
  header: t("models.model"),
19116
- render: (model) => (0, import_react67.createElement)(
19348
+ render: (model) => (0, import_react66.createElement)(
19117
19349
  "div",
19118
19350
  {},
19119
- (0, import_react67.createElement)(
19351
+ (0, import_react66.createElement)(
19120
19352
  "div",
19121
19353
  { className: `tdb-model-name${model.model === "" ? " tdb-model-unknown" : ""}` },
19122
19354
  model.model === "" ? t("models.unknown") : model.model
19123
19355
  ),
19124
- (0, import_react67.createElement)("div", { className: "tdb-model-provider" }, model.provider === "" ? "\u2014" : model.provider)
19356
+ (0, import_react66.createElement)("div", { className: "tdb-model-provider" }, model.provider === "" ? "\u2014" : model.provider)
19125
19357
  )
19126
19358
  },
19127
19359
  {
@@ -19166,23 +19398,23 @@ window.__ModuleLoader__.load({
19166
19398
  cellClassName: "tdb-hide-sm",
19167
19399
  render: (model) => {
19168
19400
  const share = total <= 0 ? 0 : totalTokens(model) / total;
19169
- return (0, import_react67.createElement)(ShareBar, { ratio: share, label: formatPercent(share) });
19401
+ return (0, import_react66.createElement)(ShareBar, { ratio: share, label: formatPercent(share) });
19170
19402
  }
19171
19403
  }
19172
19404
  ];
19173
- return (0, import_react67.createElement)(
19405
+ return (0, import_react66.createElement)(
19174
19406
  Section,
19175
19407
  { ariaLabel: t("models.title") },
19176
- models.length === 0 ? (0, import_react67.createElement)(EmptyState, { icon: (0, import_react67.createElement)(ChartIcon, { size: 20 }), title: t("models.empty") }) : (0, import_react67.createElement)(
19408
+ models.length === 0 ? (0, import_react66.createElement)(EmptyState, { icon: (0, import_react66.createElement)(ChartIcon, { size: 20 }), title: t("models.empty") }) : (0, import_react66.createElement)(
19177
19409
  "div",
19178
19410
  { className: "tdb-table-panel" },
19179
- (0, import_react67.createElement)(DataTable, {
19411
+ (0, import_react66.createElement)(DataTable, {
19180
19412
  rows: visible,
19181
19413
  columns,
19182
19414
  rowKey: (model) => model.key,
19183
19415
  ariaLabel: t("models.title")
19184
19416
  }),
19185
- pages > 1 ? (0, import_react67.createElement)(Pager, {
19417
+ pages > 1 ? (0, import_react66.createElement)(Pager, {
19186
19418
  page: current2 + 1,
19187
19419
  pages,
19188
19420
  onChange: (next) => setPage(next - 1),
@@ -19193,35 +19425,35 @@ window.__ModuleLoader__.load({
19193
19425
  );
19194
19426
  }
19195
19427
 
19196
- // src/client/components/PricingEditor.tsx
19197
- var import_react68 = require("react");
19198
- var PAGE_SIZE = 6;
19199
- function PricingEditor({ open, models, pricing, defaults, t, onClose, onSave }) {
19200
- const [draft, setDraft] = (0, import_react68.useState)({});
19201
- const [errors, setErrors] = (0, import_react68.useState)({});
19202
- const [page, setPage] = (0, import_react68.useState)(0);
19203
- const signature = (0, import_react68.useMemo)(() => models.map((model) => model.key).join("|"), [models]);
19204
- (0, import_react68.useEffect)(() => {
19205
- if (!open) return;
19206
- const next = {};
19207
- for (const model of models) {
19208
- const price = pricing[model.key] ?? defaults[model.key];
19209
- next[model.key] = price === void 0 ? { currency: "USD", input: "", output: "", cacheRead: "", cacheWrite: "" } : {
19210
- currency: price.currency,
19211
- input: String(price.input),
19212
- output: String(price.output),
19213
- cacheRead: String(price.cacheRead),
19214
- cacheWrite: String(price.cacheWrite)
19215
- };
19216
- }
19217
- setDraft(next);
19428
+ // src/client/components/PricingPage.tsx
19429
+ var import_react67 = require("react");
19430
+ function seed(models, pricing, defaults) {
19431
+ const next = {};
19432
+ for (const model of models) {
19433
+ const price = pricing[model.key] ?? defaults[model.key];
19434
+ next[model.key] = price === void 0 ? { currency: "USD", input: "", output: "", cacheRead: "", cacheWrite: "" } : {
19435
+ currency: price.currency,
19436
+ input: String(price.input),
19437
+ output: String(price.output),
19438
+ cacheRead: String(price.cacheRead),
19439
+ cacheWrite: String(price.cacheWrite)
19440
+ };
19441
+ }
19442
+ return next;
19443
+ }
19444
+ function PricingPage({ models, pricing, defaults, t, onSave }) {
19445
+ const [draft, setDraft] = (0, import_react67.useState)(() => seed(models, pricing, defaults));
19446
+ const [errors, setErrors] = (0, import_react67.useState)({});
19447
+ const [page, setPage] = (0, import_react67.useState)(0);
19448
+ const signature = (0, import_react67.useMemo)(() => models.map((model) => model.key).join("|"), [models]);
19449
+ (0, import_react67.useEffect)(() => {
19450
+ setDraft(seed(models, pricing, defaults));
19218
19451
  setErrors({});
19219
19452
  setPage(0);
19220
- }, [open, signature]);
19221
- if (!open) return null;
19222
- const pages = Math.max(1, Math.ceil(models.length / PAGE_SIZE));
19453
+ }, [signature]);
19454
+ const pages = Math.max(1, Math.ceil(models.length / TABLE_PAGE_SIZE));
19223
19455
  const current2 = Math.min(page, pages - 1);
19224
- const visible = models.slice(current2 * PAGE_SIZE, current2 * PAGE_SIZE + PAGE_SIZE);
19456
+ const visible = models.slice(current2 * TABLE_PAGE_SIZE, current2 * TABLE_PAGE_SIZE + TABLE_PAGE_SIZE);
19225
19457
  const update = (key, field, value) => {
19226
19458
  setDraft((current3) => ({
19227
19459
  ...current3,
@@ -19232,7 +19464,7 @@ window.__ModuleLoader__.load({
19232
19464
  }));
19233
19465
  };
19234
19466
  const save = () => {
19235
- const next = {};
19467
+ const next = { ...pricing };
19236
19468
  const invalid = {};
19237
19469
  for (const model of models) {
19238
19470
  const row = draft[model.key];
@@ -19252,112 +19484,95 @@ window.__ModuleLoader__.load({
19252
19484
  cacheRead: parsed[2] ?? 0,
19253
19485
  cacheWrite: parsed[3] ?? 0
19254
19486
  };
19255
- if (!samePrice(candidate, defaults[model.key])) next[model.key] = candidate;
19487
+ const keys = /* @__PURE__ */ new Set([model.key, ...modelKeyCandidates(model.model)]);
19488
+ if (!samePrice(candidate, defaults[model.key])) {
19489
+ for (const key of keys) next[key] = candidate;
19490
+ } else {
19491
+ for (const key of keys) delete next[key];
19492
+ }
19256
19493
  }
19257
19494
  const firstInvalid = models.findIndex((model) => invalid[model.key] === true);
19258
19495
  if (firstInvalid >= 0) {
19259
19496
  setErrors(invalid);
19260
- setPage(Math.floor(firstInvalid / PAGE_SIZE));
19497
+ setPage(Math.floor(firstInvalid / TABLE_PAGE_SIZE));
19261
19498
  return;
19262
19499
  }
19263
19500
  onSave(next);
19264
- onClose();
19501
+ setErrors({});
19265
19502
  };
19266
19503
  const clear = () => {
19267
19504
  onSave({});
19268
- onClose();
19505
+ setDraft(seed(models, {}, defaults));
19506
+ setErrors({});
19269
19507
  };
19270
- const footer = (0, import_react68.createElement)(
19271
- "div",
19272
- { style: { display: "contents" } },
19273
- (0, import_react68.createElement)(Button3, { variant: "ghost", onClick: clear }, t("cost.clear")),
19274
- (0, import_react68.createElement)(
19508
+ const body = models.length === 0 ? (0, import_react67.createElement)("div", { className: "tdb-empty" }, t("models.empty")) : (0, import_react67.createElement)(
19509
+ import_react67.Fragment,
19510
+ {},
19511
+ (0, import_react67.createElement)(
19275
19512
  "div",
19276
- { style: { display: "flex", gap: "8px" } },
19277
- (0, import_react68.createElement)(Button3, { onClick: onClose }, t("cost.cancel")),
19278
- (0, import_react68.createElement)(Button3, { variant: "primary", onClick: save }, t("cost.save"))
19279
- )
19280
- );
19281
- return (0, import_react68.createElement)(
19282
- Modal,
19283
- {
19284
- open: true,
19285
- title: t("cost.manage"),
19286
- subtitle: t("cost.perMillion"),
19287
- onClose,
19288
- closeLabel: t("common.close"),
19289
- footer
19290
- },
19291
- models.length === 0 ? (0, import_react68.createElement)("div", { className: "tdb-empty" }, t("models.empty")) : (0, import_react68.createElement)(
19292
- import_react68.Fragment,
19293
- {},
19294
- (0, import_react68.createElement)("div", { key: "hint", className: "tdb-pricing-note" }, t("cost.pricingHint")),
19295
- (0, import_react68.createElement)(
19513
+ { className: "tdb-pricing-wrap" },
19514
+ (0, import_react67.createElement)(
19296
19515
  "div",
19297
- { key: "grid", className: "tdb-pricing-wrap" },
19298
- (0, import_react68.createElement)(
19299
- "div",
19300
- { className: "tdb-pricing-grid" },
19301
- (0, import_react68.createElement)("div", { className: "tdb-pricing-head" }, t("models.model")),
19302
- (0, import_react68.createElement)("div", { className: "tdb-pricing-head" }, t("cost.currency")),
19303
- (0, import_react68.createElement)("div", { className: "tdb-pricing-head" }, t("cost.input")),
19304
- (0, import_react68.createElement)("div", { className: "tdb-pricing-head" }, t("cost.output")),
19305
- (0, import_react68.createElement)("div", { className: "tdb-pricing-head tdb-pricing-head--extra" }, t("cost.cacheRead")),
19306
- (0, import_react68.createElement)("div", { className: "tdb-pricing-head tdb-pricing-head--extra" }, t("cost.cacheWrite")),
19307
- visible.map((model) => {
19308
- const row = draft[model.key] ?? { currency: "USD", input: "", output: "", cacheRead: "", cacheWrite: "" };
19309
- const invalid = errors[model.key] === true;
19310
- return [
19311
- (0, import_react68.createElement)(
19516
+ { className: "tdb-pricing-grid" },
19517
+ (0, import_react67.createElement)("div", { className: "tdb-pricing-head" }, t("models.model")),
19518
+ (0, import_react67.createElement)("div", { className: "tdb-pricing-head" }, t("cost.currency")),
19519
+ (0, import_react67.createElement)("div", { className: "tdb-pricing-head" }, t("cost.input")),
19520
+ (0, import_react67.createElement)("div", { className: "tdb-pricing-head" }, t("cost.output")),
19521
+ (0, import_react67.createElement)("div", { className: "tdb-pricing-head tdb-pricing-head--extra" }, t("cost.cacheRead")),
19522
+ (0, import_react67.createElement)("div", { className: "tdb-pricing-head tdb-pricing-head--extra" }, t("cost.cacheWrite")),
19523
+ visible.map((model) => {
19524
+ const row = draft[model.key] ?? { currency: "USD", input: "", output: "", cacheRead: "", cacheWrite: "" };
19525
+ const invalid = errors[model.key] === true;
19526
+ return [
19527
+ (0, import_react67.createElement)(
19528
+ "div",
19529
+ { key: `${model.key}:name`, className: "tdb-pricing-model" },
19530
+ (0, import_react67.createElement)(
19312
19531
  "div",
19313
- { key: `${model.key}:name`, className: "tdb-pricing-model" },
19314
- (0, import_react68.createElement)(
19315
- "div",
19316
- { className: `tdb-model-name${model.model === "" ? " tdb-model-unknown" : ""}` },
19317
- model.model === "" ? t("models.unknown") : model.model
19318
- ),
19319
- (0, import_react68.createElement)("div", { className: "tdb-model-provider" }, model.provider === "" ? "\u2014" : model.provider)
19532
+ { className: `tdb-model-name${model.model === "" ? " tdb-model-unknown" : ""}` },
19533
+ model.model === "" ? t("models.unknown") : model.model
19320
19534
  ),
19321
- (0, import_react68.createElement)(Select2, {
19322
- key: `${model.key}:currency`,
19323
- value: row.currency,
19324
- options: currencyOptions(row.currency),
19325
- className: "tdb-pricing-currency",
19326
- ariaLabel: `${t("cost.currency")} ${model.model}`,
19327
- onChange: (value) => update(model.key, "currency", value)
19328
- }),
19329
- rateInput(model.key, "input", row.input, t("cost.input"), invalid, (value) => update(model.key, "input", value)),
19330
- rateInput(model.key, "output", row.output, t("cost.output"), invalid, (value) => update(model.key, "output", value)),
19331
- rateInput(model.key, "cacheRead", row.cacheRead, t("cost.cacheRead"), invalid, (value) => update(model.key, "cacheRead", value), true),
19332
- rateInput(model.key, "cacheWrite", row.cacheWrite, t("cost.cacheWrite"), invalid, (value) => update(model.key, "cacheWrite", value), true),
19333
- invalid ? (0, import_react68.createElement)("div", { key: `${model.key}:error`, className: "tdb-error-text", style: { gridColumn: "1 / -1" } }, t("cost.invalid")) : null
19334
- ];
19335
- })
19336
- )
19337
- ),
19338
- pages > 1 ? (0, import_react68.createElement)(
19535
+ (0, import_react67.createElement)("div", { className: "tdb-model-provider" }, model.provider === "" ? "\u2014" : model.provider)
19536
+ ),
19537
+ (0, import_react67.createElement)(Select2, {
19538
+ key: `${model.key}:currency`,
19539
+ value: row.currency,
19540
+ options: currencyOptions(row.currency),
19541
+ className: "tdb-pricing-currency",
19542
+ ariaLabel: `${t("cost.currency")} ${model.model}`,
19543
+ onChange: (value) => update(model.key, "currency", value)
19544
+ }),
19545
+ rateInput(model.key, "input", row.input, t("cost.input"), invalid, (value) => update(model.key, "input", value)),
19546
+ rateInput(model.key, "output", row.output, t("cost.output"), invalid, (value) => update(model.key, "output", value)),
19547
+ rateInput(model.key, "cacheRead", row.cacheRead, t("cost.cacheRead"), invalid, (value) => update(model.key, "cacheRead", value), true),
19548
+ rateInput(model.key, "cacheWrite", row.cacheWrite, t("cost.cacheWrite"), invalid, (value) => update(model.key, "cacheWrite", value), true),
19549
+ invalid ? (0, import_react67.createElement)("div", { key: `${model.key}:error`, className: "tdb-error-text", style: { gridColumn: "1 / -1" } }, t("cost.invalid")) : null
19550
+ ];
19551
+ })
19552
+ )
19553
+ ),
19554
+ pages > 1 ? (0, import_react67.createElement)(Pager, {
19555
+ page: current2 + 1,
19556
+ pages,
19557
+ onChange: (next) => setPage(next - 1),
19558
+ label: t("sessions.page", { page: current2 + 1, pages }),
19559
+ ariaLabel: t("tabs.pricing")
19560
+ }) : null
19561
+ );
19562
+ return (0, import_react67.createElement)(
19563
+ Section,
19564
+ { ariaLabel: t("tabs.pricing") },
19565
+ (0, import_react67.createElement)(
19566
+ "div",
19567
+ { className: "tdb-pricing-page" },
19568
+ (0, import_react67.createElement)("div", { className: "tdb-pricing-note" }, t("cost.pricingHint")),
19569
+ body,
19570
+ (0, import_react67.createElement)(
19339
19571
  "div",
19340
- { key: "pager", className: "tdb-pager" },
19341
- (0, import_react68.createElement)("span", {}, t("sessions.page", { page: current2 + 1, pages })),
19342
- (0, import_react68.createElement)(
19343
- "div",
19344
- { className: "tdb-pager-actions" },
19345
- (0, import_react68.createElement)(Button3, {
19346
- variant: "ghost",
19347
- iconOnly: true,
19348
- disabled: current2 <= 0,
19349
- "aria-label": t("sessions.previous"),
19350
- onClick: () => setPage(Math.max(0, current2 - 1))
19351
- }, (0, import_react68.createElement)(ChevronLeftIcon, { size: 15 })),
19352
- (0, import_react68.createElement)(Button3, {
19353
- variant: "ghost",
19354
- iconOnly: true,
19355
- disabled: current2 >= pages - 1,
19356
- "aria-label": t("sessions.next"),
19357
- onClick: () => setPage(Math.min(pages - 1, current2 + 1))
19358
- }, (0, import_react68.createElement)(ChevronRightIcon, { size: 15 }))
19359
- )
19360
- ) : null
19572
+ { className: "tdb-pricing-actions" },
19573
+ (0, import_react67.createElement)(Button3, { variant: "ghost", onClick: clear }, t("cost.clear")),
19574
+ (0, import_react67.createElement)(Button3, { variant: "primary", onClick: save }, t("cost.save"))
19575
+ )
19361
19576
  )
19362
19577
  );
19363
19578
  }
@@ -19368,7 +19583,7 @@ window.__ModuleLoader__.load({
19368
19583
  return [...values].map((value) => ({ value, label: value }));
19369
19584
  }
19370
19585
  function rateInput(key, field, value, label2, invalid, onChange, extra = false) {
19371
- return (0, import_react68.createElement)("input", {
19586
+ return (0, import_react67.createElement)("input", {
19372
19587
  key: `${key}:${field}`,
19373
19588
  className: `tdb-input tdb-pricing-input${invalid ? " tdb-pricing-row-error" : ""}${extra ? " tdb-pricing-cell--extra" : ""}`,
19374
19589
  type: "text",
@@ -19381,14 +19596,14 @@ window.__ModuleLoader__.load({
19381
19596
  }
19382
19597
 
19383
19598
  // src/client/components/SessionDetail.tsx
19384
- var import_react74 = require("react");
19599
+ var import_react73 = require("react");
19385
19600
 
19386
19601
  // src/client/components/ui/Drawer.tsx
19387
- var import_react72 = require("react");
19602
+ var import_react71 = require("react");
19388
19603
 
19389
19604
  // src/client/beui/components/motion/drawer.tsx
19390
- var import_react69 = require("react");
19391
- var import_react71 = require("react");
19605
+ var import_react68 = require("react");
19606
+ var import_react70 = require("react");
19392
19607
  function Drawer({
19393
19608
  open,
19394
19609
  onOpenChange,
@@ -19400,11 +19615,11 @@ window.__ModuleLoader__.load({
19400
19615
  dismissable = true
19401
19616
  }) {
19402
19617
  const reduce = useReducedMotion();
19403
- const panelRef = (0, import_react71.useRef)(null);
19618
+ const panelRef = (0, import_react70.useRef)(null);
19404
19619
  useFocusTrap(open, panelRef, {
19405
19620
  onEscape: dismissable ? () => onOpenChange(false) : void 0
19406
19621
  });
19407
- (0, import_react71.useEffect)(() => {
19622
+ (0, import_react70.useEffect)(() => {
19408
19623
  if (!open) return;
19409
19624
  const prevOverflow = document.body.style.overflow;
19410
19625
  document.body.style.overflow = "hidden";
@@ -19413,7 +19628,7 @@ window.__ModuleLoader__.load({
19413
19628
  };
19414
19629
  }, [open]);
19415
19630
  const offscreen = side === "right" ? "100%" : "-100%";
19416
- return /* @__PURE__ */ (0, import_react69.createElement)(AnimatePresence, null, open ? /* @__PURE__ */ (0, import_react69.createElement)(PresenceGate, { key: "backdrop" }, ({ gate }) => /* @__PURE__ */ (0, import_react69.createElement)(
19631
+ return /* @__PURE__ */ (0, import_react68.createElement)(AnimatePresence, null, open ? /* @__PURE__ */ (0, import_react68.createElement)(PresenceGate, { key: "backdrop" }, ({ gate }) => /* @__PURE__ */ (0, import_react68.createElement)(
19417
19632
  motion2.button,
19418
19633
  {
19419
19634
  type: "button",
@@ -19430,7 +19645,7 @@ window.__ModuleLoader__.load({
19430
19645
  backdropClassName
19431
19646
  )
19432
19647
  }
19433
- )) : null, open ? /* @__PURE__ */ (0, import_react69.createElement)(PresenceGate, { key: "panel" }, ({ gate }) => /* @__PURE__ */ (0, import_react69.createElement)(
19648
+ )) : null, open ? /* @__PURE__ */ (0, import_react68.createElement)(PresenceGate, { key: "panel" }, ({ gate }) => /* @__PURE__ */ (0, import_react68.createElement)(
19434
19649
  motion2.div,
19435
19650
  {
19436
19651
  ref: panelRef,
@@ -19465,7 +19680,7 @@ window.__ModuleLoader__.load({
19465
19680
  footer
19466
19681
  }) {
19467
19682
  if (!open) return null;
19468
- return (0, import_react72.createElement)(Drawer, {
19683
+ return (0, import_react71.createElement)(Drawer, {
19469
19684
  open: true,
19470
19685
  side: "right",
19471
19686
  ariaLabel: typeof title === "string" ? title : closeLabel,
@@ -19474,46 +19689,46 @@ window.__ModuleLoader__.load({
19474
19689
  if (!next) onClose();
19475
19690
  },
19476
19691
  children: [
19477
- (0, import_react72.createElement)(
19692
+ (0, import_react71.createElement)(
19478
19693
  "div",
19479
19694
  { key: "head", className: "tdb-drawer-head" },
19480
- (0, import_react72.createElement)(
19695
+ (0, import_react71.createElement)(
19481
19696
  "div",
19482
19697
  { style: { minWidth: 0 } },
19483
- (0, import_react72.createElement)("h2", { className: "tdb-drawer-title" }, title),
19484
- subtitle === void 0 ? null : (0, import_react72.createElement)("p", { className: "tdb-drawer-sub" }, subtitle),
19485
- badges === void 0 ? null : (0, import_react72.createElement)("div", { className: "tdb-session-badges" }, badges)
19698
+ (0, import_react71.createElement)("h2", { className: "tdb-drawer-title" }, title),
19699
+ subtitle === void 0 ? null : (0, import_react71.createElement)("p", { className: "tdb-drawer-sub" }, subtitle),
19700
+ badges === void 0 ? null : (0, import_react71.createElement)("div", { className: "tdb-session-badges" }, badges)
19486
19701
  ),
19487
- (0, import_react72.createElement)(Button3, {
19702
+ (0, import_react71.createElement)(Button3, {
19488
19703
  variant: "ghost",
19489
19704
  iconOnly: true,
19490
19705
  "data-autofocus": true,
19491
19706
  "aria-label": closeLabel,
19492
19707
  onClick: onClose
19493
- }, (0, import_react72.createElement)(CloseIcon, { size: 16 }))
19708
+ }, (0, import_react71.createElement)(CloseIcon, { size: 16 }))
19494
19709
  ),
19495
- (0, import_react72.createElement)("div", { key: "body", className: "tdb-drawer-body" }, children),
19496
- footer === void 0 ? null : (0, import_react72.createElement)("div", { key: "footer", className: "tdb-drawer-foot" }, footer)
19710
+ (0, import_react71.createElement)("div", { key: "body", className: "tdb-drawer-body" }, children),
19711
+ footer === void 0 ? null : (0, import_react71.createElement)("div", { key: "footer", className: "tdb-drawer-foot" }, footer)
19497
19712
  ]
19498
19713
  });
19499
19714
  }
19500
19715
 
19501
19716
  // src/client/components/ui/Stat.tsx
19502
- var import_react73 = require("react");
19717
+ var import_react72 = require("react");
19503
19718
  function Stat({ label: label2, value, total = false }) {
19504
- return (0, import_react73.createElement)(
19719
+ return (0, import_react72.createElement)(
19505
19720
  "div",
19506
19721
  { className: `tdb-detail-stat${total ? " tdb-detail-stat--total" : ""}` },
19507
- (0, import_react73.createElement)("div", { className: "tdb-detail-label" }, label2),
19508
- (0, import_react73.createElement)("div", { className: "tdb-detail-value" }, value)
19722
+ (0, import_react72.createElement)("div", { className: "tdb-detail-label" }, label2),
19723
+ (0, import_react72.createElement)("div", { className: "tdb-detail-value" }, value)
19509
19724
  );
19510
19725
  }
19511
19726
  function Field({ label: label2, value }) {
19512
- return (0, import_react73.createElement)(
19727
+ return (0, import_react72.createElement)(
19513
19728
  "div",
19514
19729
  { className: "tdb-field" },
19515
- (0, import_react73.createElement)("div", { className: "tdb-field-label" }, label2),
19516
- (0, import_react73.createElement)("div", { className: "tdb-field-value" }, value)
19730
+ (0, import_react72.createElement)("div", { className: "tdb-field-label" }, label2),
19731
+ (0, import_react72.createElement)("div", { className: "tdb-field-value" }, value)
19517
19732
  );
19518
19733
  }
19519
19734
 
@@ -19522,46 +19737,46 @@ window.__ModuleLoader__.load({
19522
19737
  if (session === null) return null;
19523
19738
  const title = session.title ?? t("sessions.untitled");
19524
19739
  const badges = [
19525
- session.live ? (0, import_react74.createElement)(Tag, { key: "live", tone: "live" }, t("sessions.live")) : null,
19526
- session.origin === "subagent" ? (0, import_react74.createElement)(Tag, { key: "sub", tone: "sub" }, t("sessions.subagent")) : null,
19527
- session.seeded ? (0, import_react74.createElement)(Tag, { key: "fork" }, t("sessions.fork")) : null,
19528
- session.stale ? (0, import_react74.createElement)(Tag, { key: "stale", tone: "stale" }, t("sessions.stale")) : null
19740
+ session.live ? (0, import_react73.createElement)(Tag, { key: "live", tone: "live" }, t("sessions.live")) : null,
19741
+ session.origin === "subagent" ? (0, import_react73.createElement)(Tag, { key: "sub", tone: "sub" }, t("sessions.subagent")) : null,
19742
+ session.seeded ? (0, import_react73.createElement)(Tag, { key: "fork" }, t("sessions.fork")) : null,
19743
+ session.stale ? (0, import_react73.createElement)(Tag, { key: "stale", tone: "stale" }, t("sessions.stale")) : null
19529
19744
  ];
19530
- const models = session.models.length === 0 ? (0, import_react74.createElement)("div", { className: "tdb-empty", style: { padding: "20px 0" } }, t("detail.none")) : (0, import_react74.createElement)(
19745
+ const models = session.models.length === 0 ? (0, import_react73.createElement)("div", { className: "tdb-empty", style: { padding: "20px 0" } }, t("detail.none")) : (0, import_react73.createElement)(
19531
19746
  "div",
19532
19747
  { className: "tdb-detail-models" },
19533
- session.models.map((model) => (0, import_react74.createElement)(
19748
+ session.models.map((model) => (0, import_react73.createElement)(
19534
19749
  "div",
19535
19750
  { key: model.key, className: "tdb-detail-model" },
19536
- (0, import_react74.createElement)(
19751
+ (0, import_react73.createElement)(
19537
19752
  "div",
19538
19753
  { className: "tdb-detail-model-head" },
19539
- (0, import_react74.createElement)(
19754
+ (0, import_react73.createElement)(
19540
19755
  "div",
19541
19756
  { style: { minWidth: 0 } },
19542
- (0, import_react74.createElement)(
19757
+ (0, import_react73.createElement)(
19543
19758
  "div",
19544
19759
  { className: `tdb-model-name${model.model === "" ? " tdb-model-unknown" : ""}` },
19545
19760
  model.model === "" ? t("models.unknown") : model.model
19546
19761
  ),
19547
- (0, import_react74.createElement)("div", { className: "tdb-model-provider" }, model.provider === "" ? "\u2014" : model.provider)
19762
+ (0, import_react73.createElement)("div", { className: "tdb-model-provider" }, model.provider === "" ? "\u2014" : model.provider)
19548
19763
  ),
19549
- (0, import_react74.createElement)("div", { className: "tdb-detail-model-total" }, formatNumber(totalTokens(model), intl))
19764
+ (0, import_react73.createElement)("div", { className: "tdb-detail-model-total" }, formatNumber(totalTokens(model), intl))
19550
19765
  ),
19551
- (0, import_react74.createElement)(
19766
+ (0, import_react73.createElement)(
19552
19767
  "div",
19553
19768
  { className: "tdb-detail-model-meta" },
19554
19769
  `${t("detail.input")} ${formatCompact(model.uncachedInputTokens, intl)} \xB7 ${t("detail.output")} ${formatCompact(model.outputTokens, intl)} \xB7 ${t("detail.cache")} ${formatCompact(cacheTokens(model), intl)} \xB7 ${formatNumber(model.requests, intl)} ${t("detail.requests").toLowerCase()}`
19555
19770
  )
19556
19771
  ))
19557
19772
  );
19558
- const footer = onOpen === void 0 ? (0, import_react74.createElement)(Button3, { variant: "primary", onClick: onClose }, t("detail.close")) : (0, import_react74.createElement)(
19773
+ const footer = onOpen === void 0 ? (0, import_react73.createElement)(Button3, { variant: "primary", onClick: onClose }, t("detail.close")) : (0, import_react73.createElement)(
19559
19774
  Button3,
19560
19775
  { variant: "primary", onClick: () => onOpen(session.id) },
19561
- (0, import_react74.createElement)(ArrowRightIcon, { size: 14 }),
19776
+ (0, import_react73.createElement)(ArrowRightIcon, { size: 14 }),
19562
19777
  t("detail.open")
19563
19778
  );
19564
- return (0, import_react74.createElement)(
19779
+ return (0, import_react73.createElement)(
19565
19780
  Drawer2,
19566
19781
  {
19567
19782
  open: true,
@@ -19571,39 +19786,39 @@ window.__ModuleLoader__.load({
19571
19786
  onClose,
19572
19787
  footer
19573
19788
  },
19574
- (0, import_react74.createElement)(
19789
+ (0, import_react73.createElement)(
19575
19790
  "div",
19576
19791
  { key: "stats", className: "tdb-detail-stats" },
19577
- (0, import_react74.createElement)(Stat, { label: t("detail.total"), value: formatNumber(totalTokens(session.totals), intl), total: true }),
19578
- (0, import_react74.createElement)(Stat, { label: t("detail.input"), value: formatNumber(session.totals.uncachedInputTokens, intl) }),
19579
- (0, import_react74.createElement)(Stat, { label: t("detail.output"), value: formatNumber(session.totals.outputTokens, intl) }),
19580
- (0, import_react74.createElement)(Stat, { label: t("detail.cache"), value: formatNumber(cacheTokens(session.totals), intl) }),
19581
- (0, import_react74.createElement)(Stat, { label: t("detail.requests"), value: formatNumber(session.requests, intl) })
19792
+ (0, import_react73.createElement)(Stat, { label: t("detail.total"), value: formatNumber(totalTokens(session.totals), intl), total: true }),
19793
+ (0, import_react73.createElement)(Stat, { label: t("detail.input"), value: formatNumber(session.totals.uncachedInputTokens, intl) }),
19794
+ (0, import_react73.createElement)(Stat, { label: t("detail.output"), value: formatNumber(session.totals.outputTokens, intl) }),
19795
+ (0, import_react73.createElement)(Stat, { label: t("detail.cache"), value: formatNumber(cacheTokens(session.totals), intl) }),
19796
+ (0, import_react73.createElement)(Stat, { label: t("detail.requests"), value: formatNumber(session.requests, intl) })
19582
19797
  ),
19583
- (0, import_react74.createElement)(
19798
+ (0, import_react73.createElement)(
19584
19799
  "div",
19585
19800
  { key: "fields", className: "tdb-fields" },
19586
- (0, import_react74.createElement)(Field, { label: t("detail.created"), value: formatDateTime(session.createdAt, intl) }),
19587
- (0, import_react74.createElement)(Field, { label: t("detail.last"), value: formatDateTime(session.lastActivity, intl) }),
19588
- (0, import_react74.createElement)(Field, { label: t("sessions.project"), value: session.project === "" ? "\u2014" : session.project }),
19589
- (0, import_react74.createElement)(Field, { label: t("detail.hitRate"), value: formatPercent(session.cacheHitRate) })
19801
+ (0, import_react73.createElement)(Field, { label: t("detail.created"), value: formatDateTime(session.createdAt, intl) }),
19802
+ (0, import_react73.createElement)(Field, { label: t("detail.last"), value: formatDateTime(session.lastActivity, intl) }),
19803
+ (0, import_react73.createElement)(Field, { label: t("sessions.project"), value: session.project === "" ? "\u2014" : session.project }),
19804
+ (0, import_react73.createElement)(Field, { label: t("detail.hitRate"), value: formatPercent(session.cacheHitRate) })
19590
19805
  ),
19591
- (0, import_react74.createElement)(
19806
+ (0, import_react73.createElement)(
19592
19807
  "div",
19593
19808
  { key: "models" },
19594
- (0, import_react74.createElement)("h3", { className: "tdb-section-title", style: { marginBottom: "10px" } }, t("detail.models")),
19809
+ (0, import_react73.createElement)("h3", { className: "tdb-section-title", style: { marginBottom: "10px" } }, t("detail.models")),
19595
19810
  models
19596
19811
  )
19597
19812
  );
19598
19813
  }
19599
19814
 
19600
19815
  // src/client/components/Sessions.tsx
19601
- var import_react78 = require("react");
19816
+ var import_react77 = require("react");
19602
19817
 
19603
19818
  // src/client/beui/components/motion/input.tsx
19604
- var import_react75 = require("react");
19605
- var import_react77 = require("react");
19606
- var Input = (0, import_react77.forwardRef)(function Input2({
19819
+ var import_react74 = require("react");
19820
+ var import_react76 = require("react");
19821
+ var Input = (0, import_react76.forwardRef)(function Input2({
19607
19822
  label: label2,
19608
19823
  value: valueProp,
19609
19824
  defaultValue,
@@ -19622,18 +19837,18 @@ window.__ModuleLoader__.load({
19622
19837
  type,
19623
19838
  ...rest
19624
19839
  }, ref) {
19625
- const reactId = (0, import_react77.useId)();
19840
+ const reactId = (0, import_react76.useId)();
19626
19841
  const id3 = idProp ?? reactId;
19627
19842
  const reduce = useReducedMotion();
19628
19843
  const controlled = valueProp !== void 0;
19629
- const [internal, setInternal] = (0, import_react77.useState)(defaultValue ?? "");
19844
+ const [internal, setInternal] = (0, import_react76.useState)(defaultValue ?? "");
19630
19845
  const value = controlled ? valueProp ?? "" : internal;
19631
- const [focused, setFocused] = (0, import_react77.useState)(false);
19632
- const fieldRef = (0, import_react77.useRef)(null);
19846
+ const [focused, setFocused] = (0, import_react76.useState)(false);
19847
+ const fieldRef = (0, import_react76.useRef)(null);
19633
19848
  const hasError = Boolean(error);
19634
19849
  const errorMessage = typeof error === "string" ? error : null;
19635
19850
  const rightSlot = success ? null : rightIcon;
19636
- (0, import_react77.useEffect)(() => {
19851
+ (0, import_react76.useEffect)(() => {
19637
19852
  if (!fieldRef.current || reduce || !hasError) return;
19638
19853
  animate(
19639
19854
  fieldRef.current,
@@ -19645,12 +19860,12 @@ window.__ModuleLoader__.load({
19645
19860
  if (!controlled) setInternal(next);
19646
19861
  onChange?.(next);
19647
19862
  };
19648
- return /* @__PURE__ */ (0, import_react75.createElement)(
19863
+ return /* @__PURE__ */ (0, import_react74.createElement)(
19649
19864
  "div",
19650
19865
  {
19651
19866
  className: cn("flex flex-col gap-1.5", className, classNames?.root)
19652
19867
  },
19653
- label2 ? /* @__PURE__ */ (0, import_react75.createElement)(
19868
+ label2 ? /* @__PURE__ */ (0, import_react74.createElement)(
19654
19869
  "label",
19655
19870
  {
19656
19871
  htmlFor: id3,
@@ -19661,7 +19876,7 @@ window.__ModuleLoader__.load({
19661
19876
  },
19662
19877
  label2
19663
19878
  ) : null,
19664
- /* @__PURE__ */ (0, import_react75.createElement)(
19879
+ /* @__PURE__ */ (0, import_react74.createElement)(
19665
19880
  "div",
19666
19881
  {
19667
19882
  ref: fieldRef,
@@ -19675,7 +19890,7 @@ window.__ModuleLoader__.load({
19675
19890
  classNames?.field
19676
19891
  )
19677
19892
  },
19678
- leftIcon ? /* @__PURE__ */ (0, import_react75.createElement)(
19893
+ leftIcon ? /* @__PURE__ */ (0, import_react74.createElement)(
19679
19894
  "span",
19680
19895
  {
19681
19896
  className: cn(
@@ -19685,7 +19900,7 @@ window.__ModuleLoader__.load({
19685
19900
  },
19686
19901
  leftIcon
19687
19902
  ) : null,
19688
- /* @__PURE__ */ (0, import_react75.createElement)(
19903
+ /* @__PURE__ */ (0, import_react74.createElement)(
19689
19904
  "input",
19690
19905
  {
19691
19906
  ref,
@@ -19715,7 +19930,7 @@ window.__ModuleLoader__.load({
19715
19930
  )
19716
19931
  }
19717
19932
  ),
19718
- success ? /* @__PURE__ */ (0, import_react75.createElement)(
19933
+ success ? /* @__PURE__ */ (0, import_react74.createElement)(
19719
19934
  motion2.svg,
19720
19935
  {
19721
19936
  viewBox: "0 0 24 24",
@@ -19725,7 +19940,7 @@ window.__ModuleLoader__.load({
19725
19940
  classNames?.successIcon
19726
19941
  )
19727
19942
  },
19728
- /* @__PURE__ */ (0, import_react75.createElement)(
19943
+ /* @__PURE__ */ (0, import_react74.createElement)(
19729
19944
  motion2.path,
19730
19945
  {
19731
19946
  d: "M5 12.5l4.5 4.5L19 7.5",
@@ -19738,7 +19953,7 @@ window.__ModuleLoader__.load({
19738
19953
  transition: { duration: 0.35, ease: "easeOut" }
19739
19954
  }
19740
19955
  )
19741
- ) : rightSlot ? /* @__PURE__ */ (0, import_react75.createElement)(
19956
+ ) : rightSlot ? /* @__PURE__ */ (0, import_react74.createElement)(
19742
19957
  "span",
19743
19958
  {
19744
19959
  className: cn(
@@ -19749,7 +19964,7 @@ window.__ModuleLoader__.load({
19749
19964
  rightSlot
19750
19965
  ) : null
19751
19966
  ),
19752
- /* @__PURE__ */ (0, import_react75.createElement)("div", { className: reserveErrorLine ? "min-h-4" : "contents" }, /* @__PURE__ */ (0, import_react75.createElement)(AnimatePresence, { initial: false }, errorMessage ? /* @__PURE__ */ (0, import_react75.createElement)(
19967
+ /* @__PURE__ */ (0, import_react74.createElement)("div", { className: reserveErrorLine ? "min-h-4" : "contents" }, /* @__PURE__ */ (0, import_react74.createElement)(AnimatePresence, { initial: false }, errorMessage ? /* @__PURE__ */ (0, import_react74.createElement)(
19753
19968
  motion2.p,
19754
19969
  {
19755
19970
  id: `${id3}-error`,
@@ -19771,18 +19986,18 @@ window.__ModuleLoader__.load({
19771
19986
  // src/client/components/Sessions.tsx
19772
19987
  function SessionTable({ rows, t, intl, now: now2, onSelect }) {
19773
19988
  const pageSize = TABLE_PAGE_SIZE;
19774
- const [query, setQuery] = (0, import_react78.useState)("");
19775
- const [project, setProject] = (0, import_react78.useState)("");
19776
- const [model, setModel] = (0, import_react78.useState)("");
19777
- const [sortKey, setSortKey] = (0, import_react78.useState)("last");
19778
- const [sortDir, setSortDir] = (0, import_react78.useState)("desc");
19779
- const [page, setPage] = (0, import_react78.useState)(0);
19780
- const projects = (0, import_react78.useMemo)(() => {
19989
+ const [query, setQuery] = (0, import_react77.useState)("");
19990
+ const [project, setProject] = (0, import_react77.useState)("");
19991
+ const [model, setModel] = (0, import_react77.useState)("");
19992
+ const [sortKey, setSortKey] = (0, import_react77.useState)("last");
19993
+ const [sortDir, setSortDir] = (0, import_react77.useState)("desc");
19994
+ const [page, setPage] = (0, import_react77.useState)(0);
19995
+ const projects = (0, import_react77.useMemo)(() => {
19781
19996
  const values = /* @__PURE__ */ new Set();
19782
19997
  for (const row of rows) if (row.project !== "") values.add(row.project);
19783
19998
  return [...values].sort((left, right) => left.localeCompare(right));
19784
19999
  }, [rows]);
19785
- const modelOptions = (0, import_react78.useMemo)(() => {
20000
+ const modelOptions = (0, import_react77.useMemo)(() => {
19786
20001
  const values = /* @__PURE__ */ new Map();
19787
20002
  for (const row of rows) {
19788
20003
  for (const item of row.models) {
@@ -19791,7 +20006,7 @@ window.__ModuleLoader__.load({
19791
20006
  }
19792
20007
  return [...values.entries()].map(([value, label2]) => ({ value, label: label2 })).sort((left, right) => left.label.localeCompare(right.label));
19793
20008
  }, [rows, t]);
19794
- const filtered = (0, import_react78.useMemo)(() => {
20009
+ const filtered = (0, import_react77.useMemo)(() => {
19795
20010
  const needle = query.trim().toLowerCase();
19796
20011
  const result = rows.filter((row) => {
19797
20012
  if (project !== "" && row.project !== project) return false;
@@ -19824,18 +20039,18 @@ window.__ModuleLoader__.load({
19824
20039
  key: "session",
19825
20040
  header: t("sessions.session"),
19826
20041
  headerClassName: "tdb-session-cell",
19827
- render: (row) => (0, import_react78.createElement)(
20042
+ render: (row) => (0, import_react77.createElement)(
19828
20043
  "div",
19829
20044
  {},
19830
- (0, import_react78.createElement)("div", { className: "tdb-session-title" }, row.title ?? t("sessions.untitled")),
19831
- (0, import_react78.createElement)(
20045
+ (0, import_react77.createElement)("div", { className: "tdb-session-title" }, row.title ?? t("sessions.untitled")),
20046
+ (0, import_react77.createElement)(
19832
20047
  "div",
19833
20048
  { className: "tdb-session-badges" },
19834
- row.project === "" ? null : (0, import_react78.createElement)("span", { className: "tdb-session-sub" }, row.project),
19835
- row.live ? (0, import_react78.createElement)(Tag, { tone: "live" }, t("sessions.live")) : null,
19836
- row.origin === "subagent" ? (0, import_react78.createElement)(Tag, { tone: "sub" }, t("sessions.subagent")) : null,
19837
- row.seeded ? (0, import_react78.createElement)(Tag, {}, t("sessions.fork")) : null,
19838
- row.stale ? (0, import_react78.createElement)(Tag, { tone: "stale" }, t("sessions.stale")) : null
20049
+ row.project === "" ? null : (0, import_react77.createElement)("span", { className: "tdb-session-sub" }, row.project),
20050
+ row.live ? (0, import_react77.createElement)(Tag, { tone: "live" }, t("sessions.live")) : null,
20051
+ row.origin === "subagent" ? (0, import_react77.createElement)(Tag, { tone: "sub" }, t("sessions.subagent")) : null,
20052
+ row.seeded ? (0, import_react77.createElement)(Tag, {}, t("sessions.fork")) : null,
20053
+ row.stale ? (0, import_react77.createElement)(Tag, { tone: "stale" }, t("sessions.stale")) : null
19839
20054
  )
19840
20055
  )
19841
20056
  },
@@ -19846,11 +20061,11 @@ window.__ModuleLoader__.load({
19846
20061
  cellClassName: "tdb-hide-sm",
19847
20062
  render: (row) => {
19848
20063
  const first = row.models[0];
19849
- return first === void 0 ? "\u2014" : (0, import_react78.createElement)(
20064
+ return first === void 0 ? "\u2014" : (0, import_react77.createElement)(
19850
20065
  "span",
19851
20066
  { className: "tdb-session-model" },
19852
20067
  first.model === "" ? t("models.unknown") : first.model,
19853
- row.models.length > 1 ? (0, import_react78.createElement)(
20068
+ row.models.length > 1 ? (0, import_react77.createElement)(
19854
20069
  "span",
19855
20070
  { className: "tdb-model-provider" },
19856
20071
  ` ${t("sessions.modelsMore", { count: row.models.length - 1 })}`
@@ -19860,7 +20075,7 @@ window.__ModuleLoader__.load({
19860
20075
  },
19861
20076
  {
19862
20077
  key: "last",
19863
- header: (0, import_react78.createElement)(SortHeader, {
20078
+ header: (0, import_react77.createElement)(SortHeader, {
19864
20079
  label: t("sessions.last"),
19865
20080
  title: t("sessions.sortLast"),
19866
20081
  active: sortKey === "last",
@@ -19869,7 +20084,7 @@ window.__ModuleLoader__.load({
19869
20084
  }),
19870
20085
  headerProps: { "aria-sort": activeSort(sortKey === "last", sortDir) },
19871
20086
  cellClassName: "tdb-nowrap",
19872
- render: (row) => (0, import_react78.createElement)(
20087
+ render: (row) => (0, import_react77.createElement)(
19873
20088
  "span",
19874
20089
  { title: formatDateTime(row.lastActivity, intl) },
19875
20090
  formatRelative(row.lastActivity, now2, intl)
@@ -19877,7 +20092,7 @@ window.__ModuleLoader__.load({
19877
20092
  },
19878
20093
  {
19879
20094
  key: "total",
19880
- header: (0, import_react78.createElement)(SortHeader, {
20095
+ header: (0, import_react77.createElement)(SortHeader, {
19881
20096
  label: t("sessions.total"),
19882
20097
  title: t("sessions.sortTotal"),
19883
20098
  active: sortKey === "total",
@@ -19887,13 +20102,13 @@ window.__ModuleLoader__.load({
19887
20102
  headerClassName: "tdb-num",
19888
20103
  headerProps: { "aria-sort": activeSort(sortKey === "total", sortDir) },
19889
20104
  cellClassName: "tdb-num",
19890
- render: (row) => (0, import_react78.createElement)("span", { style: { fontWeight: 600 } }, formatNumber(totalTokens(row.totals), intl))
20105
+ render: (row) => (0, import_react77.createElement)("span", { style: { fontWeight: 600 } }, formatNumber(totalTokens(row.totals), intl))
19891
20106
  }
19892
20107
  ];
19893
- const body = rows.length === 0 ? (0, import_react78.createElement)(EmptyState, { icon: (0, import_react78.createElement)(DatabaseIcon, { size: 20 }), title: t("sessions.empty") }) : filtered.length === 0 ? (0, import_react78.createElement)(EmptyState, { icon: (0, import_react78.createElement)(SearchIcon, { size: 20 }), title: t("sessions.emptyFiltered") }) : (0, import_react78.createElement)(
20108
+ const body = rows.length === 0 ? (0, import_react77.createElement)(EmptyState, { icon: (0, import_react77.createElement)(DatabaseIcon, { size: 20 }), title: t("sessions.empty") }) : filtered.length === 0 ? (0, import_react77.createElement)(EmptyState, { icon: (0, import_react77.createElement)(SearchIcon, { size: 20 }), title: t("sessions.emptyFiltered") }) : (0, import_react77.createElement)(
19894
20109
  "div",
19895
20110
  { className: "tdb-table-panel" },
19896
- (0, import_react78.createElement)(DataTable, {
20111
+ (0, import_react77.createElement)(DataTable, {
19897
20112
  rows: visible,
19898
20113
  columns,
19899
20114
  rowKey: (row) => row.id,
@@ -19901,7 +20116,7 @@ window.__ModuleLoader__.load({
19901
20116
  rowClassName: "tdb-row",
19902
20117
  onRowActivate: onSelect
19903
20118
  }),
19904
- (0, import_react78.createElement)(Pager, {
20119
+ (0, import_react77.createElement)(Pager, {
19905
20120
  page: current2 + 1,
19906
20121
  pages,
19907
20122
  onChange: (next) => setPage(next - 1),
@@ -19909,16 +20124,16 @@ window.__ModuleLoader__.load({
19909
20124
  ariaLabel: t("sessions.page", { page: current2 + 1, pages })
19910
20125
  })
19911
20126
  );
19912
- return (0, import_react78.createElement)(
20127
+ return (0, import_react77.createElement)(
19913
20128
  Section,
19914
20129
  { ariaLabel: t("sessions.title") },
19915
- rows.length === 0 ? body : (0, import_react78.createElement)(
19916
- import_react78.Fragment,
20130
+ rows.length === 0 ? body : (0, import_react77.createElement)(
20131
+ import_react77.Fragment,
19917
20132
  {},
19918
- (0, import_react78.createElement)(
20133
+ (0, import_react77.createElement)(
19919
20134
  "div",
19920
20135
  { className: "tdb-filters" },
19921
- (0, import_react78.createElement)(Input, {
20136
+ (0, import_react77.createElement)(Input, {
19922
20137
  className: "tdb-search",
19923
20138
  type: "search",
19924
20139
  value: query,
@@ -19928,10 +20143,10 @@ window.__ModuleLoader__.load({
19928
20143
  },
19929
20144
  placeholder: t("sessions.search"),
19930
20145
  "aria-label": t("sessions.search"),
19931
- leftIcon: (0, import_react78.createElement)(SearchIcon, { size: 14 }),
20146
+ leftIcon: (0, import_react77.createElement)(SearchIcon, { size: 14 }),
19932
20147
  classNames: { field: "h-8 rounded-lg", input: "text-xs" }
19933
20148
  }),
19934
- (0, import_react78.createElement)(Select2, {
20149
+ (0, import_react77.createElement)(Select2, {
19935
20150
  value: project,
19936
20151
  ariaLabel: t("sessions.project"),
19937
20152
  options: [{ value: "", label: t("sessions.projectAll") }, ...projects.map((value) => ({ value, label: value }))],
@@ -19940,7 +20155,7 @@ window.__ModuleLoader__.load({
19940
20155
  resetPage();
19941
20156
  }
19942
20157
  }),
19943
- (0, import_react78.createElement)(Select2, {
20158
+ (0, import_react77.createElement)(Select2, {
19944
20159
  value: model,
19945
20160
  ariaLabel: t("models.model"),
19946
20161
  options: [{ value: "", label: t("sessions.modelAll") }, ...modelOptions],
@@ -19955,7 +20170,7 @@ window.__ModuleLoader__.load({
19955
20170
  );
19956
20171
  }
19957
20172
  function SortHeader({ label: label2, title, active: active2, direction, onClick }) {
19958
- return (0, import_react78.createElement)(
20173
+ return (0, import_react77.createElement)(
19959
20174
  "button",
19960
20175
  {
19961
20176
  type: "button",
@@ -19964,7 +20179,7 @@ window.__ModuleLoader__.load({
19964
20179
  onClick
19965
20180
  },
19966
20181
  label2,
19967
- active2 ? (0, import_react78.createElement)("span", { className: "tdb-sort-arrow", "aria-hidden": "true" }, direction === "asc" ? "\u25B2" : "\u25BC") : null
20182
+ active2 ? (0, import_react77.createElement)("span", { className: "tdb-sort-arrow", "aria-hidden": "true" }, direction === "asc" ? "\u25B2" : "\u25BC") : null
19968
20183
  );
19969
20184
  }
19970
20185
  function activeSort(active2, direction) {
@@ -19973,13 +20188,13 @@ window.__ModuleLoader__.load({
19973
20188
  }
19974
20189
 
19975
20190
  // src/client/components/RequestLog.tsx
19976
- var import_react79 = require("react");
20191
+ var import_react78 = require("react");
19977
20192
  function RequestLog({ pricing, t, intl, refreshToken }) {
19978
- const [page, setPage] = (0, import_react79.useState)(0);
19979
- const [data, setData] = (0, import_react79.useState)(null);
19980
- const [loading, setLoading] = (0, import_react79.useState)(true);
19981
- const [failed, setFailed] = (0, import_react79.useState)(false);
19982
- (0, import_react79.useEffect)(() => {
20193
+ const [page, setPage] = (0, import_react78.useState)(0);
20194
+ const [data, setData] = (0, import_react78.useState)(null);
20195
+ const [loading, setLoading] = (0, import_react78.useState)(true);
20196
+ const [failed, setFailed] = (0, import_react78.useState)(false);
20197
+ (0, import_react78.useEffect)(() => {
19983
20198
  let stopped = false;
19984
20199
  setLoading(true);
19985
20200
  setFailed(false);
@@ -20002,40 +20217,40 @@ window.__ModuleLoader__.load({
20002
20217
  const pages = Math.max(1, Math.ceil(total / TABLE_PAGE_SIZE));
20003
20218
  const current2 = Math.min(page, pages - 1);
20004
20219
  if (loading && data === null) {
20005
- return (0, import_react79.createElement)(
20220
+ return (0, import_react78.createElement)(
20006
20221
  Section,
20007
20222
  { ariaLabel: t("tabs.requests") },
20008
- (0, import_react79.createElement)("div", { className: "tdb-empty" }, t("requests.loading"))
20223
+ (0, import_react78.createElement)("div", { className: "tdb-empty" }, t("requests.loading"))
20009
20224
  );
20010
20225
  }
20011
20226
  if (failed) {
20012
- return (0, import_react79.createElement)(
20227
+ return (0, import_react78.createElement)(
20013
20228
  Section,
20014
20229
  { ariaLabel: t("tabs.requests") },
20015
- (0, import_react79.createElement)("div", { className: "tdb-empty" }, t("requests.failed"))
20230
+ (0, import_react78.createElement)("div", { className: "tdb-empty" }, t("requests.failed"))
20016
20231
  );
20017
20232
  }
20018
20233
  if (total === 0) {
20019
- return (0, import_react79.createElement)(
20234
+ return (0, import_react78.createElement)(
20020
20235
  Section,
20021
20236
  { ariaLabel: t("tabs.requests") },
20022
- (0, import_react79.createElement)(EmptyState, { icon: (0, import_react79.createElement)(ChartIcon, { size: 20 }), title: t("requests.empty") })
20237
+ (0, import_react78.createElement)(EmptyState, { icon: (0, import_react78.createElement)(ChartIcon, { size: 20 }), title: t("requests.empty") })
20023
20238
  );
20024
20239
  }
20025
20240
  const rows = data?.rows ?? [];
20026
- return (0, import_react79.createElement)(
20241
+ return (0, import_react78.createElement)(
20027
20242
  Section,
20028
20243
  { ariaLabel: t("tabs.requests") },
20029
- (0, import_react79.createElement)(
20244
+ (0, import_react78.createElement)(
20030
20245
  "div",
20031
20246
  { className: "tdb-table-panel" },
20032
- (0, import_react79.createElement)(DataTable, {
20247
+ (0, import_react78.createElement)(DataTable, {
20033
20248
  rows,
20034
20249
  columns: requestColumns(pricing, t, intl),
20035
20250
  rowKey: (row) => row.id,
20036
20251
  ariaLabel: t("tabs.requests")
20037
20252
  }),
20038
- (0, import_react79.createElement)(Pager, {
20253
+ (0, import_react78.createElement)(Pager, {
20039
20254
  page: current2 + 1,
20040
20255
  pages,
20041
20256
  onChange: (next) => setPage(next - 1),
@@ -20069,7 +20284,7 @@ window.__ModuleLoader__.load({
20069
20284
  {
20070
20285
  key: "model",
20071
20286
  header: t("requests.model"),
20072
- render: (row) => (0, import_react79.createElement)(
20287
+ render: (row) => (0, import_react78.createElement)(
20073
20288
  "span",
20074
20289
  { className: "tdb-session-model", title: row.model },
20075
20290
  row.model === "" ? t("models.unknown") : row.model
@@ -20105,14 +20320,14 @@ window.__ModuleLoader__.load({
20105
20320
  },
20106
20321
  {
20107
20322
  key: "speed",
20108
- header: (0, import_react79.createElement)("span", { title: t("sessions.speedHint") }, t("sessions.speed")),
20323
+ header: (0, import_react78.createElement)("span", { title: t("sessions.speedHint") }, t("sessions.speed")),
20109
20324
  headerClassName: "tdb-num tdb-hide-sm",
20110
20325
  cellClassName: "tdb-num tdb-hide-sm",
20111
20326
  render: (row) => formatSpeed(row.speed)
20112
20327
  },
20113
20328
  {
20114
20329
  key: "firstToken",
20115
- header: (0, import_react79.createElement)("span", { title: t("sessions.firstTokenHint") }, t("sessions.firstToken")),
20330
+ header: (0, import_react78.createElement)("span", { title: t("sessions.firstTokenHint") }, t("sessions.firstToken")),
20116
20331
  headerClassName: "tdb-num tdb-hide-sm",
20117
20332
  cellClassName: "tdb-num tdb-hide-sm",
20118
20333
  render: (row) => formatFirstToken(row.firstToken)
@@ -20120,7 +20335,7 @@ window.__ModuleLoader__.load({
20120
20335
  ];
20121
20336
  }
20122
20337
  function requestCost(row, pricing) {
20123
- const price = pricing[row.modelKey];
20338
+ const price = priceForModel(pricing, row.modelKey, row.model);
20124
20339
  const amount = costOf({
20125
20340
  uncachedInputTokens: row.inputTokens,
20126
20341
  cacheReadTokens: row.cacheReadTokens,
@@ -20145,17 +20360,17 @@ window.__ModuleLoader__.load({
20145
20360
  }
20146
20361
 
20147
20362
  // src/client/components/Trends.tsx
20148
- var import_react89 = require("react");
20363
+ var import_react88 = require("react");
20149
20364
 
20150
20365
  // src/client/components/charts.tsx
20151
- var import_react83 = require("react");
20366
+ var import_react82 = require("react");
20152
20367
 
20153
20368
  // src/client/hooks.ts
20154
- var import_react80 = require("react");
20369
+ var import_react79 = require("react");
20155
20370
  function useElementSize() {
20156
- const ref = (0, import_react80.useRef)(null);
20157
- const [size, setSize] = (0, import_react80.useState)({ width: 0, height: 0 });
20158
- (0, import_react80.useEffect)(() => {
20371
+ const ref = (0, import_react79.useRef)(null);
20372
+ const [size, setSize] = (0, import_react79.useState)({ width: 0, height: 0 });
20373
+ (0, import_react79.useEffect)(() => {
20159
20374
  const node = ref.current;
20160
20375
  if (node === null || typeof ResizeObserver === "undefined") return;
20161
20376
  const update = () => {
@@ -20170,24 +20385,24 @@ window.__ModuleLoader__.load({
20170
20385
  return [ref, size];
20171
20386
  }
20172
20387
  function useNow(intervalMs = 3e4) {
20173
- const [now2, setNow] = (0, import_react80.useState)(() => Date.now());
20174
- (0, import_react80.useEffect)(() => {
20388
+ const [now2, setNow] = (0, import_react79.useState)(() => Date.now());
20389
+ (0, import_react79.useEffect)(() => {
20175
20390
  const timer = setInterval(() => setNow(Date.now()), intervalMs);
20176
20391
  return () => clearInterval(timer);
20177
20392
  }, [intervalMs]);
20178
20393
  return now2;
20179
20394
  }
20180
20395
  function useStats(intervalMs = POLL_INTERVAL_MS) {
20181
- const [data, setData] = (0, import_react80.useState)(null);
20182
- const [loading, setLoading] = (0, import_react80.useState)(true);
20183
- const [refreshing, setRefreshing] = (0, import_react80.useState)(false);
20184
- const [error, setError] = (0, import_react80.useState)(null);
20185
- const [pollError, setPollError] = (0, import_react80.useState)(null);
20186
- const [lastUpdated, setLastUpdated] = (0, import_react80.useState)(null);
20187
- const etag = (0, import_react80.useRef)(null);
20188
- const inflight = (0, import_react80.useRef)(null);
20189
- const hasData = (0, import_react80.useRef)(false);
20190
- const load = (0, import_react80.useCallback)(async (mode) => {
20396
+ const [data, setData] = (0, import_react79.useState)(null);
20397
+ const [loading, setLoading] = (0, import_react79.useState)(true);
20398
+ const [refreshing, setRefreshing] = (0, import_react79.useState)(false);
20399
+ const [error, setError] = (0, import_react79.useState)(null);
20400
+ const [pollError, setPollError] = (0, import_react79.useState)(null);
20401
+ const [lastUpdated, setLastUpdated] = (0, import_react79.useState)(null);
20402
+ const etag = (0, import_react79.useRef)(null);
20403
+ const inflight = (0, import_react79.useRef)(null);
20404
+ const hasData = (0, import_react79.useRef)(false);
20405
+ const load = (0, import_react79.useCallback)(async (mode) => {
20191
20406
  if (mode === "poll" && inflight.current !== null) return;
20192
20407
  if (mode === "manual" && inflight.current !== null) inflight.current.abort();
20193
20408
  const controller = new AbortController();
@@ -20213,10 +20428,10 @@ window.__ModuleLoader__.load({
20213
20428
  if (inflight.current === controller) inflight.current = null;
20214
20429
  }
20215
20430
  }, []);
20216
- (0, import_react80.useEffect)(() => {
20431
+ (0, import_react79.useEffect)(() => {
20217
20432
  void load("initial");
20218
20433
  }, [load]);
20219
- (0, import_react80.useEffect)(() => {
20434
+ (0, import_react79.useEffect)(() => {
20220
20435
  const tick = () => {
20221
20436
  if (typeof document !== "undefined" && document.visibilityState !== "visible") return;
20222
20437
  void load("poll");
@@ -20232,14 +20447,14 @@ window.__ModuleLoader__.load({
20232
20447
  inflight.current?.abort();
20233
20448
  };
20234
20449
  }, [load, intervalMs]);
20235
- const refresh = (0, import_react80.useCallback)(() => {
20450
+ const refresh = (0, import_react79.useCallback)(() => {
20236
20451
  void load("manual");
20237
20452
  }, [load]);
20238
20453
  return { data, loading, refreshing, error, pollError, lastUpdated, refresh };
20239
20454
  }
20240
20455
 
20241
20456
  // src/client/beui/components/motion/tooltip-surface.tsx
20242
- var import_react81 = require("react");
20457
+ var import_react80 = require("react");
20243
20458
  function TooltipSurface({
20244
20459
  children,
20245
20460
  side: _side = "top",
@@ -20251,7 +20466,7 @@ window.__ModuleLoader__.load({
20251
20466
  }) {
20252
20467
  const reduce = useReducedMotion();
20253
20468
  const closed = { opacity: 0, scale: reduce ? 1 : 0.94 };
20254
- return /* @__PURE__ */ (0, import_react81.createElement)(
20469
+ return /* @__PURE__ */ (0, import_react80.createElement)(
20255
20470
  motion2.span,
20256
20471
  {
20257
20472
  ref,
@@ -20285,7 +20500,7 @@ window.__ModuleLoader__.load({
20285
20500
  const [ref, size] = useElementSize();
20286
20501
  const width = Math.max(1, Math.round(size.width || 520));
20287
20502
  const height = Math.max(MIN_HEIGHT, Math.round(size.height || DEFAULT_HEIGHT));
20288
- const [hover2, setHover] = (0, import_react83.useState)(null);
20503
+ const [hover2, setHover] = (0, import_react82.useState)(null);
20289
20504
  const innerWidth = Math.max(20, width - LEFT - RIGHT);
20290
20505
  const innerHeight = height - TOP - BOTTOM;
20291
20506
  const band = innerWidth / Math.max(1, buckets.length);
@@ -20311,10 +20526,10 @@ window.__ModuleLoader__.load({
20311
20526
  setHover({ index, x: LEFT + band * index + band / 2, y });
20312
20527
  };
20313
20528
  const hovered = hover2 === null ? void 0 : buckets[hover2.index];
20314
- return (0, import_react83.createElement)(
20529
+ return (0, import_react82.createElement)(
20315
20530
  "div",
20316
20531
  { className: "tdb-chart", ref },
20317
- (0, import_react83.createElement)(
20532
+ (0, import_react82.createElement)(
20318
20533
  "svg",
20319
20534
  {
20320
20535
  width,
@@ -20326,8 +20541,8 @@ window.__ModuleLoader__.load({
20326
20541
  onMouseLeave: () => setHover(null)
20327
20542
  },
20328
20543
  ...grid(width, scale2, toY, intl),
20329
- (0, import_react83.createElement)("line", { x1: LEFT, y1: bottom, x2: width - RIGHT, y2: bottom, className: "tdb-axis-line" }),
20330
- hover2 === null ? null : (0, import_react83.createElement)("rect", {
20544
+ (0, import_react82.createElement)("line", { x1: LEFT, y1: bottom, x2: width - RIGHT, y2: bottom, className: "tdb-axis-line" }),
20545
+ hover2 === null ? null : (0, import_react82.createElement)("rect", {
20331
20546
  className: "tdb-hover-band",
20332
20547
  x: LEFT + band * hover2.index,
20333
20548
  y: TOP,
@@ -20339,10 +20554,10 @@ window.__ModuleLoader__.load({
20339
20554
  const center = LEFT + band * index + band / 2;
20340
20555
  const inputHeight = visibleHeight(bucket.uncachedInputTokens, toY, bottom);
20341
20556
  const outputHeight = visibleHeight(bucket.outputTokens, toY, bottom);
20342
- return (0, import_react83.createElement)(
20557
+ return (0, import_react82.createElement)(
20343
20558
  "g",
20344
20559
  { key: bucket.bucket },
20345
- inputHeight <= 0 ? null : (0, import_react83.createElement)("rect", {
20560
+ inputHeight <= 0 ? null : (0, import_react82.createElement)("rect", {
20346
20561
  x: center - gap / 2 - barWidth,
20347
20562
  y: bottom - inputHeight,
20348
20563
  width: barWidth,
@@ -20350,7 +20565,7 @@ window.__ModuleLoader__.load({
20350
20565
  rx: Math.min(2.5, barWidth / 2),
20351
20566
  className: "tdb-bar tdb-bar--input"
20352
20567
  }),
20353
- outputHeight <= 0 ? null : (0, import_react83.createElement)("rect", {
20568
+ outputHeight <= 0 ? null : (0, import_react82.createElement)("rect", {
20354
20569
  x: center + gap / 2,
20355
20570
  y: bottom - outputHeight,
20356
20571
  width: barWidth,
@@ -20362,7 +20577,7 @@ window.__ModuleLoader__.load({
20362
20577
  }),
20363
20578
  ...xLabels(buckets, band, width, bottom, labelOf)
20364
20579
  ),
20365
- hover2 === null || hovered === void 0 ? null : (0, import_react83.createElement)(Tooltip, {
20580
+ hover2 === null || hovered === void 0 ? null : (0, import_react82.createElement)(Tooltip, {
20366
20581
  x: tooltipX(hover2.x, width),
20367
20582
  y: tooltipY(hover2.y, height),
20368
20583
  title: labelOf(hovered),
@@ -20373,14 +20588,14 @@ window.__ModuleLoader__.load({
20373
20588
  { label: t("sessions.requests"), value: String(hovered.requests), color: void 0 }
20374
20589
  ]
20375
20590
  }),
20376
- empty ? (0, import_react83.createElement)("div", { className: "tdb-chart-empty" }, t("trend.emptyIo")) : null
20591
+ empty ? (0, import_react82.createElement)("div", { className: "tdb-chart-empty" }, t("trend.emptyIo")) : null
20377
20592
  );
20378
20593
  }
20379
20594
  function CacheChart({ buckets, granularity, t, intl }) {
20380
20595
  const [ref, size] = useElementSize();
20381
20596
  const width = Math.max(1, Math.round(size.width || 520));
20382
20597
  const height = Math.max(MIN_HEIGHT, Math.round(size.height || DEFAULT_HEIGHT));
20383
- const [hover2, setHover] = (0, import_react83.useState)(null);
20598
+ const [hover2, setHover] = (0, import_react82.useState)(null);
20384
20599
  const right = 42;
20385
20600
  const innerWidth = Math.max(20, width - LEFT - right);
20386
20601
  const innerHeight = height - TOP - BOTTOM;
@@ -20421,10 +20636,10 @@ window.__ModuleLoader__.load({
20421
20636
  const prompt = promptOf(hovered);
20422
20637
  return prompt === 0 ? null : hovered.cacheReadTokens / prompt;
20423
20638
  })();
20424
- return (0, import_react83.createElement)(
20639
+ return (0, import_react82.createElement)(
20425
20640
  "div",
20426
20641
  { className: "tdb-chart", ref },
20427
- (0, import_react83.createElement)(
20642
+ (0, import_react82.createElement)(
20428
20643
  "svg",
20429
20644
  {
20430
20645
  width,
@@ -20436,11 +20651,11 @@ window.__ModuleLoader__.load({
20436
20651
  onMouseLeave: () => setHover(null)
20437
20652
  },
20438
20653
  ...grid(width, scale2, toY, intl, right),
20439
- (0, import_react83.createElement)("text", { x: width - right + 6, y: TOP + 3, className: "tdb-axis-text" }, "100%"),
20440
- (0, import_react83.createElement)("text", { x: width - right + 6, y: TOP + innerHeight / 2, className: "tdb-axis-text" }, "50%"),
20441
- (0, import_react83.createElement)("text", { x: width - right + 6, y: bottom, className: "tdb-axis-text" }, "0%"),
20442
- (0, import_react83.createElement)("line", { x1: LEFT, y1: bottom, x2: width - right, y2: bottom, className: "tdb-axis-line" }),
20443
- hover2 === null ? null : (0, import_react83.createElement)("rect", {
20654
+ (0, import_react82.createElement)("text", { x: width - right + 6, y: TOP + 3, className: "tdb-axis-text" }, "100%"),
20655
+ (0, import_react82.createElement)("text", { x: width - right + 6, y: TOP + innerHeight / 2, className: "tdb-axis-text" }, "50%"),
20656
+ (0, import_react82.createElement)("text", { x: width - right + 6, y: bottom, className: "tdb-axis-text" }, "0%"),
20657
+ (0, import_react82.createElement)("line", { x1: LEFT, y1: bottom, x2: width - right, y2: bottom, className: "tdb-axis-line" }),
20658
+ hover2 === null ? null : (0, import_react82.createElement)("rect", {
20444
20659
  className: "tdb-hover-band",
20445
20660
  x: LEFT + band * hover2.index,
20446
20661
  y: TOP,
@@ -20451,10 +20666,10 @@ window.__ModuleLoader__.load({
20451
20666
  ...buckets.map((bucket, index) => {
20452
20667
  const readHeight = visibleHeight(bucket.cacheReadTokens, toY, bottom);
20453
20668
  const writeHeight = visibleHeight(bucket.cacheWriteTokens, toY, bottom);
20454
- return (0, import_react83.createElement)(
20669
+ return (0, import_react82.createElement)(
20455
20670
  "g",
20456
20671
  { key: bucket.bucket },
20457
- readHeight <= 0 ? null : (0, import_react83.createElement)("rect", {
20672
+ readHeight <= 0 ? null : (0, import_react82.createElement)("rect", {
20458
20673
  x: LEFT + band * index + (band - barWidth) / 2,
20459
20674
  y: bottom - readHeight,
20460
20675
  width: barWidth,
@@ -20462,7 +20677,7 @@ window.__ModuleLoader__.load({
20462
20677
  rx: Math.min(2.5, barWidth / 2),
20463
20678
  className: "tdb-bar tdb-bar--cache-read"
20464
20679
  }),
20465
- writeHeight <= 0 ? null : (0, import_react83.createElement)("rect", {
20680
+ writeHeight <= 0 ? null : (0, import_react82.createElement)("rect", {
20466
20681
  x: LEFT + band * index + (band - barWidth) / 2,
20467
20682
  y: bottom - readHeight - writeHeight,
20468
20683
  width: barWidth,
@@ -20472,12 +20687,12 @@ window.__ModuleLoader__.load({
20472
20687
  })
20473
20688
  );
20474
20689
  }),
20475
- ...segments.map((points, index) => (0, import_react83.createElement)("polyline", {
20690
+ ...segments.map((points, index) => (0, import_react82.createElement)("polyline", {
20476
20691
  key: `hit-${index}`,
20477
20692
  points,
20478
20693
  className: "tdb-line-hit"
20479
20694
  })),
20480
- ...hitPoints.map((point) => point === null ? null : (0, import_react83.createElement)("circle", {
20695
+ ...hitPoints.map((point) => point === null ? null : (0, import_react82.createElement)("circle", {
20481
20696
  key: `dot-${point.index}`,
20482
20697
  cx: point.x,
20483
20698
  cy: point.y,
@@ -20486,7 +20701,7 @@ window.__ModuleLoader__.load({
20486
20701
  })),
20487
20702
  ...xLabels(buckets, band, width, bottom, labelOf)
20488
20703
  ),
20489
- hover2 === null || hovered === void 0 ? null : (0, import_react83.createElement)(Tooltip, {
20704
+ hover2 === null || hovered === void 0 ? null : (0, import_react82.createElement)(Tooltip, {
20490
20705
  x: tooltipX(hover2.x, width),
20491
20706
  y: tooltipY(hover2.y, height),
20492
20707
  title: labelOf(hovered),
@@ -20496,30 +20711,30 @@ window.__ModuleLoader__.load({
20496
20711
  { label: t("legend.hitRate"), value: hoveredRatio === null ? "\u2014" : formatPercent(hoveredRatio), color: "var(--tdb-cat-hit)" }
20497
20712
  ]
20498
20713
  }),
20499
- empty ? (0, import_react83.createElement)("div", { className: "tdb-chart-empty" }, t("trend.emptyCache")) : null
20714
+ empty ? (0, import_react82.createElement)("div", { className: "tdb-chart-empty" }, t("trend.emptyCache")) : null
20500
20715
  );
20501
20716
  }
20502
20717
  function Tooltip({ x, y, title, rows }) {
20503
- return (0, import_react83.createElement)(
20718
+ return (0, import_react82.createElement)(
20504
20719
  "div",
20505
20720
  { className: "tdb-tooltip", style: { left: x, top: y } },
20506
- (0, import_react83.createElement)(TooltipSurface, {
20721
+ (0, import_react82.createElement)(TooltipSurface, {
20507
20722
  ready: true,
20508
20723
  className: "tdb-tooltip-surface",
20509
- children: (0, import_react83.createElement)(
20724
+ children: (0, import_react82.createElement)(
20510
20725
  "div",
20511
20726
  { className: "tdb-tooltip-content" },
20512
- (0, import_react83.createElement)("div", { className: "tdb-tooltip-title" }, title),
20513
- rows.map((row) => (0, import_react83.createElement)(
20727
+ (0, import_react82.createElement)("div", { className: "tdb-tooltip-title" }, title),
20728
+ rows.map((row) => (0, import_react82.createElement)(
20514
20729
  "div",
20515
20730
  { key: row.label, className: "tdb-tooltip-row" },
20516
- (0, import_react83.createElement)(
20731
+ (0, import_react82.createElement)(
20517
20732
  "span",
20518
20733
  { style: { display: "inline-flex", alignItems: "center", gap: 5 } },
20519
- row.color === void 0 ? null : (0, import_react83.createElement)("span", { className: "tdb-legend-dot", style: { background: row.color } }),
20734
+ row.color === void 0 ? null : (0, import_react82.createElement)("span", { className: "tdb-legend-dot", style: { background: row.color } }),
20520
20735
  row.label
20521
20736
  ),
20522
- (0, import_react83.createElement)("b", {}, row.value)
20737
+ (0, import_react82.createElement)("b", {}, row.value)
20523
20738
  ))
20524
20739
  )
20525
20740
  })
@@ -20530,7 +20745,7 @@ window.__ModuleLoader__.load({
20530
20745
  for (let index = 0; index <= INTERVALS; index += 1) {
20531
20746
  const value = scale2.step * index;
20532
20747
  const y = toY(value);
20533
- lines.push((0, import_react83.createElement)("line", {
20748
+ lines.push((0, import_react82.createElement)("line", {
20534
20749
  key: `grid-${index}`,
20535
20750
  x1: LEFT,
20536
20751
  y1: y,
@@ -20538,7 +20753,7 @@ window.__ModuleLoader__.load({
20538
20753
  y2: y,
20539
20754
  className: "tdb-grid-line"
20540
20755
  }));
20541
- lines.push((0, import_react83.createElement)("text", {
20756
+ lines.push((0, import_react82.createElement)("text", {
20542
20757
  key: `axis-${index}`,
20543
20758
  x: LEFT - 8,
20544
20759
  y: y + 3,
@@ -20559,7 +20774,7 @@ window.__ModuleLoader__.load({
20559
20774
  const previousX = LEFT + band * (index - step) + band / 2;
20560
20775
  if (x - previousX < 46) return;
20561
20776
  }
20562
- labels.push((0, import_react83.createElement)("text", {
20777
+ labels.push((0, import_react82.createElement)("text", {
20563
20778
  key: `x-${bucket.bucket}`,
20564
20779
  x,
20565
20780
  y: bottom + 16,
@@ -20595,13 +20810,13 @@ window.__ModuleLoader__.load({
20595
20810
  }
20596
20811
 
20597
20812
  // src/client/components/ui/DatePicker.tsx
20598
- var import_react84 = require("react");
20813
+ var import_react83 = require("react");
20599
20814
  function DatePicker({ value, onChange, ariaLabel, intl, min, max, previousLabel, nextLabel }) {
20600
- const [open, setOpen] = (0, import_react84.useState)(false);
20601
- const [position, setPosition] = (0, import_react84.useState)(null);
20602
- const [view, setView] = (0, import_react84.useState)(() => monthStart(selectedDate(value) ?? /* @__PURE__ */ new Date()));
20603
- const trigger = (0, import_react84.useRef)(null);
20604
- const layer = (0, import_react84.useRef)(null);
20815
+ const [open, setOpen] = (0, import_react83.useState)(false);
20816
+ const [position, setPosition] = (0, import_react83.useState)(null);
20817
+ const [view, setView] = (0, import_react83.useState)(() => monthStart(selectedDate(value) ?? /* @__PURE__ */ new Date()));
20818
+ const trigger = (0, import_react83.useRef)(null);
20819
+ const layer = (0, import_react83.useRef)(null);
20605
20820
  const selected = selectedDate(value);
20606
20821
  const today = isoDate(/* @__PURE__ */ new Date());
20607
20822
  const place = () => {
@@ -20616,7 +20831,7 @@ window.__ModuleLoader__.load({
20616
20831
  top: openUp ? Math.max(8, box.top - 336) : box.bottom + 4
20617
20832
  });
20618
20833
  };
20619
- (0, import_react84.useEffect)(() => {
20834
+ (0, import_react83.useEffect)(() => {
20620
20835
  if (!open) return;
20621
20836
  setView(monthStart(selected ?? /* @__PURE__ */ new Date()));
20622
20837
  place();
@@ -20649,7 +20864,7 @@ window.__ModuleLoader__.load({
20649
20864
  window.removeEventListener("scroll", onScroll, true);
20650
20865
  };
20651
20866
  }, [open]);
20652
- (0, import_react84.useEffect)(() => {
20867
+ (0, import_react83.useEffect)(() => {
20653
20868
  if (!open) return;
20654
20869
  layer.current?.querySelector('[aria-pressed="true"]')?.focus();
20655
20870
  }, [open, view]);
@@ -20666,10 +20881,10 @@ window.__ModuleLoader__.load({
20666
20881
  ...Array.from({ length: days }, (_, index) => new Date(view.getFullYear(), view.getMonth(), index + 1))
20667
20882
  ];
20668
20883
  while (cells.length % 7 !== 0) cells.push(null);
20669
- return (0, import_react84.createElement)(
20884
+ return (0, import_react83.createElement)(
20670
20885
  "div",
20671
20886
  { className: "tdb-date-picker" },
20672
- (0, import_react84.createElement)(
20887
+ (0, import_react83.createElement)(
20673
20888
  "button",
20674
20889
  {
20675
20890
  ref: trigger,
@@ -20680,10 +20895,10 @@ window.__ModuleLoader__.load({
20680
20895
  "aria-expanded": open,
20681
20896
  onClick: () => setOpen((current2) => !current2)
20682
20897
  },
20683
- (0, import_react84.createElement)(CalendarIcon, { size: 14 }),
20684
- (0, import_react84.createElement)("span", { className: "tdb-date-value" }, selected === null ? "\u2014" : formatDate(selected, intl))
20898
+ (0, import_react83.createElement)(CalendarIcon, { size: 14 }),
20899
+ (0, import_react83.createElement)("span", { className: "tdb-date-value" }, selected === null ? "\u2014" : formatDate(selected, intl))
20685
20900
  ),
20686
- open && position !== null ? (0, import_react84.createElement)(
20901
+ open && position !== null ? (0, import_react83.createElement)(
20687
20902
  "div",
20688
20903
  {
20689
20904
  ref: layer,
@@ -20692,32 +20907,32 @@ window.__ModuleLoader__.load({
20692
20907
  "aria-label": ariaLabel,
20693
20908
  style: { left: `${position.left}px`, top: `${position.top}px` }
20694
20909
  },
20695
- (0, import_react84.createElement)(
20910
+ (0, import_react83.createElement)(
20696
20911
  "div",
20697
20912
  { className: "tdb-cal-head" },
20698
- (0, import_react84.createElement)(Button3, {
20913
+ (0, import_react83.createElement)(Button3, {
20699
20914
  variant: "ghost",
20700
20915
  iconOnly: true,
20701
20916
  "aria-label": previousLabel,
20702
20917
  onClick: () => setView(new Date(view.getFullYear(), view.getMonth() - 1, 1))
20703
- }, (0, import_react84.createElement)(ChevronLeftIcon, { size: 14 })),
20704
- (0, import_react84.createElement)("span", { className: "tdb-cal-title" }, formatMonth(view, intl)),
20705
- (0, import_react84.createElement)(Button3, {
20918
+ }, (0, import_react83.createElement)(ChevronLeftIcon, { size: 14 })),
20919
+ (0, import_react83.createElement)("span", { className: "tdb-cal-title" }, formatMonth(view, intl)),
20920
+ (0, import_react83.createElement)(Button3, {
20706
20921
  variant: "ghost",
20707
20922
  iconOnly: true,
20708
20923
  "aria-label": nextLabel,
20709
20924
  onClick: () => setView(new Date(view.getFullYear(), view.getMonth() + 1, 1))
20710
- }, (0, import_react84.createElement)(ChevronRightIcon, { size: 14 }))
20925
+ }, (0, import_react83.createElement)(ChevronRightIcon, { size: 14 }))
20711
20926
  ),
20712
- (0, import_react84.createElement)(
20927
+ (0, import_react83.createElement)(
20713
20928
  "div",
20714
20929
  { className: "tdb-cal-grid" },
20715
- ...weekdayLabels(intl).map((label2) => (0, import_react84.createElement)("span", { key: `w-${label2}`, className: "tdb-cal-weekday" }, label2)),
20930
+ ...weekdayLabels(intl).map((label2) => (0, import_react83.createElement)("span", { key: `w-${label2}`, className: "tdb-cal-weekday" }, label2)),
20716
20931
  ...cells.map((date, index) => {
20717
- if (date === null) return (0, import_react84.createElement)("span", { key: `blank-${index}`, className: "tdb-cal-blank" });
20932
+ if (date === null) return (0, import_react83.createElement)("span", { key: `blank-${index}`, className: "tdb-cal-blank" });
20718
20933
  const iso = isoDate(date);
20719
20934
  const disabled = min !== void 0 && iso < min || max !== void 0 && iso > max;
20720
- return (0, import_react84.createElement)("button", {
20935
+ return (0, import_react83.createElement)("button", {
20721
20936
  key: iso,
20722
20937
  type: "button",
20723
20938
  className: "tdb-cal-day",
@@ -20771,14 +20986,14 @@ window.__ModuleLoader__.load({
20771
20986
  }
20772
20987
 
20773
20988
  // src/client/components/ui/Tabs.tsx
20774
- var import_react88 = require("react");
20989
+ var import_react87 = require("react");
20775
20990
 
20776
20991
  // src/client/beui/components/motion/tabs.tsx
20777
- var import_react85 = require("react");
20778
- var import_react87 = require("react");
20779
- var TabsCtx = (0, import_react87.createContext)(null);
20992
+ var import_react84 = require("react");
20993
+ var import_react86 = require("react");
20994
+ var TabsCtx = (0, import_react86.createContext)(null);
20780
20995
  function useTabs() {
20781
- const ctx = (0, import_react87.useContext)(TabsCtx);
20996
+ const ctx = (0, import_react86.useContext)(TabsCtx);
20782
20997
  if (!ctx) throw new Error("Tabs.* must be used inside <Tabs>");
20783
20998
  return ctx;
20784
20999
  }
@@ -20797,12 +21012,12 @@ window.__ModuleLoader__.load({
20797
21012
  children,
20798
21013
  className
20799
21014
  }) {
20800
- const [internal, setInternal] = (0, import_react87.useState)(defaultValue ?? "");
20801
- const layoutId = (0, import_react87.useId)();
21015
+ const [internal, setInternal] = (0, import_react86.useState)(defaultValue ?? "");
21016
+ const layoutId = (0, import_react86.useId)();
20802
21017
  const reduce = useReducedMotion();
20803
21018
  const controlled = value !== void 0;
20804
21019
  const current2 = controlled ? value : internal;
20805
- const setValue = (0, import_react87.useCallback)(
21020
+ const setValue = (0, import_react86.useCallback)(
20806
21021
  (v) => {
20807
21022
  if (!controlled) setInternal(v);
20808
21023
  onValueChange?.(v);
@@ -20813,13 +21028,13 @@ window.__ModuleLoader__.load({
20813
21028
  const y = useSpring(0, transition);
20814
21029
  const width = useSpring(0, transition);
20815
21030
  const height = useSpring(0, transition);
20816
- const track = (0, import_react87.useMemo)(() => ({ x, y, width, height }), [x, y, width, height]);
20817
- const [placed, setPlaced] = (0, import_react87.useState)(false);
20818
- const [tabs, setTabs] = (0, import_react87.useState)(/* @__PURE__ */ new Map());
20819
- const registerTab = (0, import_react87.useCallback)((tab, disabled) => {
21031
+ const track = (0, import_react86.useMemo)(() => ({ x, y, width, height }), [x, y, width, height]);
21032
+ const [placed, setPlaced] = (0, import_react86.useState)(false);
21033
+ const [tabs, setTabs] = (0, import_react86.useState)(/* @__PURE__ */ new Map());
21034
+ const registerTab = (0, import_react86.useCallback)((tab, disabled) => {
20820
21035
  setTabs((map) => map.get(tab) === disabled ? map : new Map(map).set(tab, disabled));
20821
21036
  }, []);
20822
- const unregisterTab = (0, import_react87.useCallback)((tab) => {
21037
+ const unregisterTab = (0, import_react86.useCallback)((tab) => {
20823
21038
  setTabs((map) => {
20824
21039
  if (!map.has(tab)) return map;
20825
21040
  const next = new Map(map);
@@ -20827,11 +21042,11 @@ window.__ModuleLoader__.load({
20827
21042
  return next;
20828
21043
  });
20829
21044
  }, []);
20830
- const [panels, setPanels] = (0, import_react87.useState)(/* @__PURE__ */ new Set());
20831
- const registerPanel = (0, import_react87.useCallback)((panel) => {
21045
+ const [panels, setPanels] = (0, import_react86.useState)(/* @__PURE__ */ new Set());
21046
+ const registerPanel = (0, import_react86.useCallback)((panel) => {
20832
21047
  setPanels((set) => set.has(panel) ? set : new Set(set).add(panel));
20833
21048
  }, []);
20834
- const unregisterPanel = (0, import_react87.useCallback)((panel) => {
21049
+ const unregisterPanel = (0, import_react86.useCallback)((panel) => {
20835
21050
  setPanels((set) => {
20836
21051
  if (!set.has(panel)) return set;
20837
21052
  const next = new Set(set);
@@ -20844,10 +21059,10 @@ window.__ModuleLoader__.load({
20844
21059
  const enabled = Array.from(tabs).filter(([, disabled]) => !disabled);
20845
21060
  tabStop = enabled.some(([tab]) => tab === current2) ? current2 : enabled[0]?.[0] ?? "";
20846
21061
  }
20847
- const baseId = (0, import_react87.useId)();
20848
- const tabId = (0, import_react87.useCallback)((tab) => `${baseId}-tab-${tab.replace(/[^\w-]/g, "_")}`, [baseId]);
20849
- const panelId = (0, import_react87.useCallback)((tab) => `${baseId}-panel-${tab.replace(/[^\w-]/g, "_")}`, [baseId]);
20850
- const contextValue = (0, import_react87.useMemo)(
21062
+ const baseId = (0, import_react86.useId)();
21063
+ const tabId = (0, import_react86.useCallback)((tab) => `${baseId}-tab-${tab.replace(/[^\w-]/g, "_")}`, [baseId]);
21064
+ const panelId = (0, import_react86.useCallback)((tab) => `${baseId}-panel-${tab.replace(/[^\w-]/g, "_")}`, [baseId]);
21065
+ const contextValue = (0, import_react86.useMemo)(
20851
21066
  () => ({
20852
21067
  value: current2,
20853
21068
  setValue,
@@ -20868,7 +21083,7 @@ window.__ModuleLoader__.load({
20868
21083
  }),
20869
21084
  [current2, icons, layoutId, setValue, variant, track, placed, tabStop, registerTab, unregisterTab, panels, registerPanel, unregisterPanel, tabId, panelId]
20870
21085
  );
20871
- return /* @__PURE__ */ (0, import_react85.createElement)(MotionConfig, { transition: reduce ? { duration: 0 } : transition }, /* @__PURE__ */ (0, import_react85.createElement)(TabsCtx.Provider, { value: contextValue }, /* @__PURE__ */ (0, import_react85.createElement)(motion2.div, { layoutRoot: true, className }, children)));
21086
+ return /* @__PURE__ */ (0, import_react84.createElement)(MotionConfig, { transition: reduce ? { duration: 0 } : transition }, /* @__PURE__ */ (0, import_react84.createElement)(TabsCtx.Provider, { value: contextValue }, /* @__PURE__ */ (0, import_react84.createElement)(motion2.div, { layoutRoot: true, className }, children)));
20872
21087
  }
20873
21088
  var listClasses = {
20874
21089
  pill: "inline-flex items-center gap-1 rounded-full bg-card p-1",
@@ -20885,12 +21100,12 @@ window.__ModuleLoader__.load({
20885
21100
  const { variant, value, icons, track, placed, setPlaced } = useTabs();
20886
21101
  const reduce = useReducedMotion();
20887
21102
  const tracked = icons === "selected" && variant !== "underline";
20888
- const rootRef = (0, import_react87.useRef)(null);
20889
- const viewportRef = (0, import_react87.useRef)(null);
20890
- const listRef = (0, import_react87.useRef)(null);
20891
- const viewportId = (0, import_react87.useId)();
20892
- const [edges, setEdges] = (0, import_react87.useState)({ overflow: false, left: false, right: false });
20893
- const measure = (0, import_react87.useCallback)(() => {
21103
+ const rootRef = (0, import_react86.useRef)(null);
21104
+ const viewportRef = (0, import_react86.useRef)(null);
21105
+ const listRef = (0, import_react86.useRef)(null);
21106
+ const viewportId = (0, import_react86.useId)();
21107
+ const [edges, setEdges] = (0, import_react86.useState)({ overflow: false, left: false, right: false });
21108
+ const measure = (0, import_react86.useCallback)(() => {
20894
21109
  const root = rootRef.current;
20895
21110
  const viewport = viewportRef.current;
20896
21111
  if (!root || !viewport) return;
@@ -20901,7 +21116,7 @@ window.__ModuleLoader__.load({
20901
21116
  const next = { overflow, left: fromLeft > 1, right: fromLeft < max - 1 };
20902
21117
  setEdges((previous) => previous.overflow === next.overflow && previous.left === next.left && previous.right === next.right ? previous : next);
20903
21118
  }, []);
20904
- const reveal = (0, import_react87.useCallback)((tab) => {
21119
+ const reveal = (0, import_react86.useCallback)((tab) => {
20905
21120
  const viewport = viewportRef.current;
20906
21121
  if (!viewport || !tab) return;
20907
21122
  const frame2 = viewport.getBoundingClientRect();
@@ -20914,7 +21129,7 @@ window.__ModuleLoader__.load({
20914
21129
  const delta = item.left < left ? item.left - left : item.right > right ? item.right - right : 0;
20915
21130
  if (delta) viewport.scrollBy({ left: delta, behavior: reduce ? "instant" : "smooth" });
20916
21131
  }, [reduce]);
20917
- (0, import_react87.useLayoutEffect)(() => {
21132
+ (0, import_react86.useLayoutEffect)(() => {
20918
21133
  const root = rootRef.current;
20919
21134
  const viewport = viewportRef.current;
20920
21135
  const list = listRef.current;
@@ -20934,14 +21149,14 @@ window.__ModuleLoader__.load({
20934
21149
  viewport.removeEventListener("scroll", measure);
20935
21150
  };
20936
21151
  }, [measure, reveal]);
20937
- (0, import_react87.useLayoutEffect)(() => {
21152
+ (0, import_react86.useLayoutEffect)(() => {
20938
21153
  void children;
20939
21154
  void value;
20940
21155
  void edges.overflow;
20941
21156
  measure();
20942
21157
  reveal(listRef.current?.querySelector('[role="tab"][aria-selected="true"]') ?? null);
20943
21158
  }, [children, value, edges.overflow, measure, reveal]);
20944
- (0, import_react87.useLayoutEffect)(() => {
21159
+ (0, import_react86.useLayoutEffect)(() => {
20945
21160
  if (!tracked) return;
20946
21161
  const list = listRef.current;
20947
21162
  if (!list) return;
@@ -20979,7 +21194,7 @@ window.__ModuleLoader__.load({
20979
21194
  for (const tab of list.querySelectorAll('[role="tab"]')) if (tab.parentElement) observer2.observe(tab.parentElement);
20980
21195
  return () => observer2.disconnect();
20981
21196
  }, [tracked, value, children, reduce, track, setPlaced]);
20982
- (0, import_react87.useLayoutEffect)(() => {
21197
+ (0, import_react86.useLayoutEffect)(() => {
20983
21198
  if (variant === "underline") return;
20984
21199
  const list = listRef.current;
20985
21200
  if (!list) return;
@@ -21051,7 +21266,7 @@ window.__ModuleLoader__.load({
21051
21266
  };
21052
21267
  const controlClass = "absolute inset-y-0 z-20 inline-flex w-9 items-center justify-center text-foreground transition-opacity hover:opacity-70 focus-visible:outline-2 focus-visible:-outline-offset-4 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-0";
21053
21268
  const surfaceClass = variant === "pill" ? "rounded-full bg-card" : variant === "segment" ? "rounded-lg bg-card" : "";
21054
- return /* @__PURE__ */ (0, import_react85.createElement)("div", { ref: rootRef, className: cn("relative isolate flex w-full max-w-full min-w-0 items-center", edges.overflow && surfaceClass, wrapperClassName) }, edges.overflow && /* @__PURE__ */ (0, import_react85.createElement)("button", { type: "button", "aria-label": "Scroll tabs left", "aria-controls": viewportId, disabled: !edges.left, onClick: () => scroll(-1), className: cn(controlClass, "left-0 rounded-l-full") }, /* @__PURE__ */ (0, import_react85.createElement)(ChevronLeft, { size: 20, "aria-hidden": "true" })), /* @__PURE__ */ (0, import_react85.createElement)(
21269
+ return /* @__PURE__ */ (0, import_react84.createElement)("div", { ref: rootRef, className: cn("relative isolate flex w-full max-w-full min-w-0 items-center", edges.overflow && surfaceClass, wrapperClassName) }, edges.overflow && /* @__PURE__ */ (0, import_react84.createElement)("button", { type: "button", "aria-label": "Scroll tabs left", "aria-controls": viewportId, disabled: !edges.left, onClick: () => scroll(-1), className: cn(controlClass, "left-0 rounded-l-full") }, /* @__PURE__ */ (0, import_react84.createElement)(ChevronLeft, { size: 20, "aria-hidden": "true" })), /* @__PURE__ */ (0, import_react84.createElement)(
21055
21270
  motion2.div,
21056
21271
  {
21057
21272
  ref: viewportRef,
@@ -21065,17 +21280,17 @@ window.__ModuleLoader__.load({
21065
21280
  if (event.target instanceof HTMLElement && event.target.getAttribute("role") === "tab") reveal(event.target);
21066
21281
  }
21067
21282
  },
21068
- /* @__PURE__ */ (0, import_react85.createElement)("div", { ...props, ref: listRef, role: "tablist", onKeyDown: onListKeyDown, className: cn(listClasses[variant], "w-max", tracked && "relative", className) }, children)
21069
- ), edges.overflow && edges.left && /* @__PURE__ */ (0, import_react85.createElement)("span", { "aria-hidden": "true", className: "pointer-events-none absolute inset-y-0 left-0 z-10 w-10 rounded-l-[inherit] backdrop-blur-[2px] [mask-image:linear-gradient(to_right,black,transparent)]" }), edges.overflow && edges.right && /* @__PURE__ */ (0, import_react85.createElement)("span", { "aria-hidden": "true", className: "pointer-events-none absolute inset-y-0 right-0 z-10 w-10 rounded-r-[inherit] backdrop-blur-[2px] [mask-image:linear-gradient(to_left,black,transparent)]" }), edges.overflow && /* @__PURE__ */ (0, import_react85.createElement)("button", { type: "button", "aria-label": "Scroll tabs right", "aria-controls": viewportId, disabled: !edges.right, onClick: () => scroll(1), className: cn(controlClass, "right-0 rounded-r-full") }, /* @__PURE__ */ (0, import_react85.createElement)(ChevronRight, { size: 20, "aria-hidden": "true" })));
21283
+ /* @__PURE__ */ (0, import_react84.createElement)("div", { ...props, ref: listRef, role: "tablist", onKeyDown: onListKeyDown, className: cn(listClasses[variant], "w-max", tracked && "relative", className) }, children)
21284
+ ), edges.overflow && edges.left && /* @__PURE__ */ (0, import_react84.createElement)("span", { "aria-hidden": "true", className: "pointer-events-none absolute inset-y-0 left-0 z-10 w-10 rounded-l-[inherit] backdrop-blur-[2px] [mask-image:linear-gradient(to_right,black,transparent)]" }), edges.overflow && edges.right && /* @__PURE__ */ (0, import_react84.createElement)("span", { "aria-hidden": "true", className: "pointer-events-none absolute inset-y-0 right-0 z-10 w-10 rounded-r-[inherit] backdrop-blur-[2px] [mask-image:linear-gradient(to_left,black,transparent)]" }), edges.overflow && /* @__PURE__ */ (0, import_react84.createElement)("button", { type: "button", "aria-label": "Scroll tabs right", "aria-controls": viewportId, disabled: !edges.right, onClick: () => scroll(1), className: cn(controlClass, "right-0 rounded-r-full") }, /* @__PURE__ */ (0, import_react84.createElement)(ChevronRight, { size: 20, "aria-hidden": "true" })));
21070
21285
  }
21071
21286
  var ICON_GAP = 6;
21072
21287
  function TriggerIcon({ icon, active: active2 }) {
21073
21288
  const { icons } = useTabs();
21074
21289
  const reduce = useReducedMotion();
21075
21290
  if (icons === "always") {
21076
- return /* @__PURE__ */ (0, import_react85.createElement)("span", { "aria-hidden": "true", className: "mr-1.5 inline-flex shrink-0 items-center" }, icon);
21291
+ return /* @__PURE__ */ (0, import_react84.createElement)("span", { "aria-hidden": "true", className: "mr-1.5 inline-flex shrink-0 items-center" }, icon);
21077
21292
  }
21078
- return /* @__PURE__ */ (0, import_react85.createElement)(
21293
+ return /* @__PURE__ */ (0, import_react84.createElement)(
21079
21294
  motion2.span,
21080
21295
  {
21081
21296
  "aria-hidden": "true",
@@ -21119,19 +21334,19 @@ window.__ModuleLoader__.load({
21119
21334
  } = useTabs();
21120
21335
  const active2 = current2 === value;
21121
21336
  const disabled = Boolean(props.disabled);
21122
- (0, import_react87.useLayoutEffect)(() => {
21337
+ (0, import_react86.useLayoutEffect)(() => {
21123
21338
  registerTab(value, disabled);
21124
21339
  }, [registerTab, value, disabled]);
21125
- (0, import_react87.useLayoutEffect)(() => () => unregisterTab(value), [unregisterTab, value]);
21340
+ (0, import_react86.useLayoutEffect)(() => () => unregisterTab(value), [unregisterTab, value]);
21126
21341
  const a11y = {
21127
21342
  id: tabId(value),
21128
21343
  "aria-controls": panels.has(value) ? panelId(value) : void 0,
21129
21344
  tabIndex: !disabled && (tabStop === null || tabStop === value) ? 0 : -1
21130
21345
  };
21131
- const content = icon ? /* @__PURE__ */ (0, import_react85.createElement)(import_react85.Fragment, null, /* @__PURE__ */ (0, import_react85.createElement)(TriggerIcon, { icon, active: active2 }), children) : children;
21132
- const [initialClip] = (0, import_react87.useState)(() => active2 ? "inset(0)" : "inset(0 100% 0 0)");
21346
+ const content = icon ? /* @__PURE__ */ (0, import_react84.createElement)(import_react84.Fragment, null, /* @__PURE__ */ (0, import_react84.createElement)(TriggerIcon, { icon, active: active2 }), children) : children;
21347
+ const [initialClip] = (0, import_react86.useState)(() => active2 ? "inset(0)" : "inset(0 100% 0 0)");
21133
21348
  if (variant === "underline") {
21134
- return /* @__PURE__ */ (0, import_react85.createElement)(
21349
+ return /* @__PURE__ */ (0, import_react84.createElement)(
21135
21350
  "button",
21136
21351
  {
21137
21352
  ...a11y,
@@ -21150,7 +21365,7 @@ window.__ModuleLoader__.load({
21150
21365
  )
21151
21366
  },
21152
21367
  content,
21153
- active2 ? /* @__PURE__ */ (0, import_react85.createElement)(
21368
+ active2 ? /* @__PURE__ */ (0, import_react84.createElement)(
21154
21369
  motion2.span,
21155
21370
  {
21156
21371
  layoutId,
@@ -21165,7 +21380,7 @@ window.__ModuleLoader__.load({
21165
21380
  }
21166
21381
  const radius = variant === "pill" ? "rounded-full" : "rounded-md";
21167
21382
  const tracked = icons === "selected" && placed;
21168
- return /* @__PURE__ */ (0, import_react85.createElement)("div", { className: cn("shrink-0", !tracked && "relative") }, active2 && tracked ? /* @__PURE__ */ (0, import_react85.createElement)(
21383
+ return /* @__PURE__ */ (0, import_react84.createElement)("div", { className: cn("shrink-0", !tracked && "relative") }, active2 && tracked ? /* @__PURE__ */ (0, import_react84.createElement)(
21169
21384
  motion2.span,
21170
21385
  {
21171
21386
  key: "tracked",
@@ -21173,7 +21388,7 @@ window.__ModuleLoader__.load({
21173
21388
  style: { ...track, borderRadius: variant === "pill" ? 9999 : 8 },
21174
21389
  className: cn("absolute top-0 left-0 bg-primary", radius, indicatorClassName)
21175
21390
  }
21176
- ) : active2 ? /* @__PURE__ */ (0, import_react85.createElement)(
21391
+ ) : active2 ? /* @__PURE__ */ (0, import_react84.createElement)(
21177
21392
  motion2.span,
21178
21393
  {
21179
21394
  key: "layout",
@@ -21187,7 +21402,7 @@ window.__ModuleLoader__.load({
21187
21402
  indicatorClassName
21188
21403
  )
21189
21404
  }
21190
- ) : null, /* @__PURE__ */ (0, import_react85.createElement)(
21405
+ ) : null, /* @__PURE__ */ (0, import_react84.createElement)(
21191
21406
  "button",
21192
21407
  {
21193
21408
  ...a11y,
@@ -21208,7 +21423,7 @@ window.__ModuleLoader__.load({
21208
21423
  )
21209
21424
  },
21210
21425
  content,
21211
- /* @__PURE__ */ (0, import_react85.createElement)(
21426
+ /* @__PURE__ */ (0, import_react84.createElement)(
21212
21427
  "span",
21213
21428
  {
21214
21429
  "data-tabs-label": "",
@@ -21230,14 +21445,14 @@ window.__ModuleLoader__.load({
21230
21445
  ariaLabel,
21231
21446
  kind = "range"
21232
21447
  }) {
21233
- return (0, import_react88.createElement)(Tabs, {
21448
+ return (0, import_react87.createElement)(Tabs, {
21234
21449
  value,
21235
21450
  onValueChange: (next) => onChange(next),
21236
21451
  variant: kind === "view" ? "segment" : "pill",
21237
- children: (0, import_react88.createElement)(TabsList, {
21452
+ children: (0, import_react87.createElement)(TabsList, {
21238
21453
  className: kind === "view" ? "tdb-view" : "tdb-range",
21239
21454
  "aria-label": ariaLabel,
21240
- children: items.map((item) => (0, import_react88.createElement)(TabsTrigger, {
21455
+ children: items.map((item) => (0, import_react87.createElement)(TabsTrigger, {
21241
21456
  key: item.id,
21242
21457
  value: item.id,
21243
21458
  className: kind === "view" ? "tdb-view-btn" : "tdb-range-btn",
@@ -21282,25 +21497,25 @@ window.__ModuleLoader__.load({
21282
21497
  }
21283
21498
  onRangeChange({ id: id3, from: range.from, to: range.to });
21284
21499
  };
21285
- return (0, import_react89.createElement)(
21500
+ return (0, import_react88.createElement)(
21286
21501
  Section,
21287
21502
  {
21288
21503
  ariaLabel: t("trend.title"),
21289
- actions: (0, import_react89.createElement)(SegmentedTabs, {
21504
+ actions: (0, import_react88.createElement)(SegmentedTabs, {
21290
21505
  items: rangeTabs,
21291
21506
  value: range.id,
21292
21507
  onChange: chooseRange,
21293
21508
  ariaLabel: t("range.label")
21294
21509
  })
21295
21510
  },
21296
- range.id === "custom" ? (0, import_react89.createElement)(
21511
+ range.id === "custom" ? (0, import_react88.createElement)(
21297
21512
  "div",
21298
21513
  { className: "tdb-custom-range" },
21299
- (0, import_react89.createElement)(
21514
+ (0, import_react88.createElement)(
21300
21515
  "label",
21301
21516
  { className: "tdb-date" },
21302
21517
  t("range.from"),
21303
- (0, import_react89.createElement)(DatePicker, {
21518
+ (0, import_react88.createElement)(DatePicker, {
21304
21519
  value: range.from,
21305
21520
  ariaLabel: t("range.from"),
21306
21521
  intl,
@@ -21310,11 +21525,11 @@ window.__ModuleLoader__.load({
21310
21525
  onChange: (value) => onRangeChange({ ...range, id: "custom", from: value })
21311
21526
  })
21312
21527
  ),
21313
- (0, import_react89.createElement)(
21528
+ (0, import_react88.createElement)(
21314
21529
  "label",
21315
21530
  { className: "tdb-date" },
21316
21531
  t("range.to"),
21317
- (0, import_react89.createElement)(DatePicker, {
21532
+ (0, import_react88.createElement)(DatePicker, {
21318
21533
  value: range.to,
21319
21534
  ariaLabel: t("range.to"),
21320
21535
  intl,
@@ -21325,17 +21540,17 @@ window.__ModuleLoader__.load({
21325
21540
  })
21326
21541
  )
21327
21542
  ) : null,
21328
- (0, import_react89.createElement)(
21543
+ (0, import_react88.createElement)(
21329
21544
  "div",
21330
21545
  { className: "tdb-chart-toolbar" },
21331
- (0, import_react89.createElement)(SegmentedTabs, {
21546
+ (0, import_react88.createElement)(SegmentedTabs, {
21332
21547
  items: views,
21333
21548
  value: view,
21334
21549
  onChange: onViewChange,
21335
21550
  ariaLabel: t("trend.views"),
21336
21551
  kind: "view"
21337
21552
  }),
21338
- (0, import_react89.createElement)(
21553
+ (0, import_react88.createElement)(
21339
21554
  "div",
21340
21555
  { className: "tdb-chart-summary" },
21341
21556
  t("trend.rangeTotal", {
@@ -21344,8 +21559,8 @@ window.__ModuleLoader__.load({
21344
21559
  })
21345
21560
  )
21346
21561
  ),
21347
- view === "io" ? (0, import_react89.createElement)(GroupedBars, { buckets: result.buckets, granularity: result.granularity, t, intl }) : (0, import_react89.createElement)(CacheChart, { buckets: result.buckets, granularity: result.granularity, t, intl }),
21348
- (0, import_react89.createElement)(Legend, {
21562
+ view === "io" ? (0, import_react88.createElement)(GroupedBars, { buckets: result.buckets, granularity: result.granularity, t, intl }) : (0, import_react88.createElement)(CacheChart, { buckets: result.buckets, granularity: result.granularity, t, intl }),
21563
+ (0, import_react88.createElement)(Legend, {
21349
21564
  items: view === "io" ? [
21350
21565
  { label: t("legend.input"), color: "var(--tdb-cat-input)" },
21351
21566
  { label: t("legend.output"), color: "var(--tdb-cat-output)" }
@@ -21358,13 +21573,13 @@ window.__ModuleLoader__.load({
21358
21573
  );
21359
21574
  }
21360
21575
  function Legend({ items }) {
21361
- return (0, import_react89.createElement)(
21576
+ return (0, import_react88.createElement)(
21362
21577
  "div",
21363
21578
  { className: "tdb-legend" },
21364
- items.map((item) => (0, import_react89.createElement)(
21579
+ items.map((item) => (0, import_react88.createElement)(
21365
21580
  "span",
21366
21581
  { key: item.label, className: "tdb-legend-item" },
21367
- (0, import_react89.createElement)("span", {
21582
+ (0, import_react88.createElement)("span", {
21368
21583
  className: `tdb-legend-dot${item.line === true ? " tdb-legend-dot--line" : ""}`,
21369
21584
  style: { background: item.color }
21370
21585
  }),
@@ -21374,16 +21589,16 @@ window.__ModuleLoader__.load({
21374
21589
  }
21375
21590
 
21376
21591
  // src/client/components/ui/PageTabs.tsx
21377
- var import_react90 = require("react");
21592
+ var import_react89 = require("react");
21378
21593
  function PageTabs({ items, value, onChange, ariaLabel }) {
21379
- return (0, import_react90.createElement)(Tabs, {
21594
+ return (0, import_react89.createElement)(Tabs, {
21380
21595
  value,
21381
21596
  onValueChange: (next) => onChange(next),
21382
21597
  variant: "underline",
21383
- children: (0, import_react90.createElement)(TabsList, {
21598
+ children: (0, import_react89.createElement)(TabsList, {
21384
21599
  className: "tdb-pagetabs",
21385
21600
  "aria-label": ariaLabel,
21386
- children: items.map((item) => (0, import_react90.createElement)(TabsTrigger, {
21601
+ children: items.map((item) => (0, import_react89.createElement)(TabsTrigger, {
21387
21602
  key: item.id,
21388
21603
  value: item.id,
21389
21604
  id: `tdb-tab-${item.id}`,
@@ -21396,7 +21611,7 @@ window.__ModuleLoader__.load({
21396
21611
  }
21397
21612
 
21398
21613
  // src/client/usePricing.ts
21399
- var import_react91 = require("react");
21614
+ var import_react90 = require("react");
21400
21615
  var EMPTY_ONLINE = { prices: {}, source: "", fetchedAt: 0 };
21401
21616
  function loadOnline() {
21402
21617
  try {
@@ -21406,24 +21621,24 @@ window.__ModuleLoader__.load({
21406
21621
  }
21407
21622
  }
21408
21623
  function usePricing() {
21409
- const [pricing, setPricing] = (0, import_react91.useState)(() => {
21624
+ const [pricing, setPricing] = (0, import_react90.useState)(() => {
21410
21625
  try {
21411
21626
  return parsePricing(localStorage.getItem(PRICING_KEY));
21412
21627
  } catch {
21413
21628
  return {};
21414
21629
  }
21415
21630
  });
21416
- const [onlineState, setOnlineState] = (0, import_react91.useState)(loadOnline);
21417
- const [refreshingOnline, setRefreshingOnline] = (0, import_react91.useState)(false);
21418
- const [onlineError, setOnlineError] = (0, import_react91.useState)(false);
21419
- const savePricing = (0, import_react91.useCallback)((table) => {
21631
+ const [onlineState, setOnlineState] = (0, import_react90.useState)(loadOnline);
21632
+ const [refreshingOnline, setRefreshingOnline] = (0, import_react90.useState)(false);
21633
+ const [onlineError, setOnlineError] = (0, import_react90.useState)(false);
21634
+ const savePricing = (0, import_react90.useCallback)((table) => {
21420
21635
  setPricing(table);
21421
21636
  try {
21422
21637
  localStorage.setItem(PRICING_KEY, serializePricing(table));
21423
21638
  } catch {
21424
21639
  }
21425
21640
  }, []);
21426
- const refreshOnline = (0, import_react91.useCallback)(async (models, options = {}) => {
21641
+ const refreshOnline = (0, import_react90.useCallback)(async (models, options = {}) => {
21427
21642
  const names = [...new Set(
21428
21643
  models.map((model) => model.model.trim()).filter((model) => model !== "")
21429
21644
  )].slice(0, 100);
@@ -21465,7 +21680,7 @@ window.__ModuleLoader__.load({
21465
21680
  }
21466
21681
 
21467
21682
  // src/client/language.ts
21468
- var import_react92 = require("react");
21683
+ var import_react91 = require("react");
21469
21684
  var LANGUAGE_KEY = "dsh-token-dashboard:language:v1";
21470
21685
  var current = "en";
21471
21686
  var initialized = false;
@@ -21520,7 +21735,7 @@ window.__ModuleLoader__.load({
21520
21735
  return () => listeners.delete(listener);
21521
21736
  }
21522
21737
  function useLanguage() {
21523
- return (0, import_react92.useSyncExternalStore)(subscribeLanguage, getLanguage, getLanguage);
21738
+ return (0, import_react91.useSyncExternalStore)(subscribeLanguage, getLanguage, getLanguage);
21524
21739
  }
21525
21740
 
21526
21741
  // src/client/locales.ts
@@ -21555,6 +21770,7 @@ window.__ModuleLoader__.load({
21555
21770
  "tabs.models": "Models",
21556
21771
  "tabs.sessions": "Sessions",
21557
21772
  "tabs.costs": "Costs",
21773
+ "tabs.pricing": "Rates",
21558
21774
  "tabs.requests": "Request log",
21559
21775
  "trend.title": "Usage",
21560
21776
  "trend.views": "Chart view",
@@ -21699,6 +21915,7 @@ window.__ModuleLoader__.load({
21699
21915
  "tabs.models": "\u6A21\u578B",
21700
21916
  "tabs.sessions": "\u4F1A\u8BDD",
21701
21917
  "tabs.costs": "\u8D39\u7528",
21918
+ "tabs.pricing": "\u5355\u4EF7",
21702
21919
  "tabs.requests": "\u8BF7\u6C42\u65E5\u5FD7",
21703
21920
  "trend.title": "\u7528\u91CF",
21704
21921
  "trend.views": "\u56FE\u8868\u89C6\u56FE",
@@ -22224,6 +22441,8 @@ window.__ModuleLoader__.load({
22224
22441
  color: var(--tdb-ink-2);
22225
22442
  }
22226
22443
  .tdb-pager-actions { display: flex; align-items: center; gap: 4px; }
22444
+ .tdb-pager ul, .tdb-pager li { margin: 0; padding: 0; list-style: none; }
22445
+ .tdb-pager li::marker { content: ''; }
22227
22446
 
22228
22447
  .tdb-empty {
22229
22448
  display: flex;
@@ -22398,7 +22617,9 @@ window.__ModuleLoader__.load({
22398
22617
  }
22399
22618
  .tdb-menu-item:hover { background: var(--tdb-surface-2); }
22400
22619
 
22401
- .tdb-pricing-wrap { overflow-x: auto; }
22620
+ .tdb-pricing-page { display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0; }
22621
+ .tdb-pricing-wrap { flex: 0 1 auto; min-height: 0; overflow: hidden; }
22622
+ .tdb-pricing-actions { display: flex; align-items: center; justify-content: flex-end; gap: 8px; flex-wrap: wrap; margin-top: auto; padding-top: 14px; }
22402
22623
  .tdb-pricing-grid {
22403
22624
  display: grid;
22404
22625
  grid-template-columns: 1.6fr 0.7fr repeat(4, minmax(0, 0.6fr));
@@ -22537,20 +22758,20 @@ window.__ModuleLoader__.load({
22537
22758
  `;
22538
22759
 
22539
22760
  // src/client/beui-css.ts
22540
- var BEUI_CSS = "/*! tailwindcss v4.3.5 | MIT License | https://tailwindcss.com */\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:block))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--color-amber-300:oklch(87.9% .169 91.605);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-800:oklch(47.3% .137 46.201);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-700:oklch(50.8% .118 165.612);--color-black:#000;--spacing:.25rem;--container-sm:24rem;--container-2xl:42rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--font-weight-medium:500;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-3xl:1.5rem;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--color-success:var(--tdb-success)}}@layer base{.tdb-root button,.tdb-root input{color:inherit;font:inherit;background:0 0;border:0}.tdb-root *,.tdb-root :before,.tdb-root :after{border-style:solid;border-width:0}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:0}.inset-4{inset:calc(var(--spacing) * 4)}.inset-y-0{inset-block:0}.top-0{top:0}.top-1\\/2{top:50%}.top-full{top:100%}.right-0{right:0}.right-3\\.5{right:calc(var(--spacing) * 3.5)}.bottom-0{bottom:0}.bottom-full{bottom:100%}.left-0{left:0}.left-3{left:calc(var(--spacing) * 3)}.isolate{isolation:isolate}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.z-\\[80\\]{z-index:80}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.-m-1\\.5{margin:calc(var(--spacing) * -1.5)}.mt-0\\.5{margin-top:calc(var(--spacing) * .5)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mr-1\\.5{margin-right:calc(var(--spacing) * 1.5)}.-mb-px{margin-bottom:-1px}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.h-3\\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-8{height:calc(var(--spacing) * 8)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-full{height:100%}.h-px{height:1px}.min-h-4{min-height:calc(var(--spacing) * 4)}.min-h-\\[44px\\]{min-height:44px}.w-3\\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-80{width:calc(var(--spacing) * 80)}.w-full{width:100%}.w-max{width:max-content}.max-w-2xl{max-width:var(--container-2xl)}.max-w-\\[85vw\\]{max-width:85vw}.max-w-full{max-width:100%}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:0}.min-w-8{min-width:calc(var(--spacing) * 8)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.-translate-y-1\\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.scale-75{--tw-scale-x:75%;--tw-scale-y:75%;--tw-scale-z:75%;scale:var(--tw-scale-x) var(--tw-scale-y)}.transform{transform:var(--tw-rotate-x, ) var(--tw-rotate-y, ) var(--tw-rotate-z, ) var(--tw-skew-x, ) var(--tw-skew-y, )}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.resize{resize:both}.\\[scrollbar-width\\:none\\]{scrollbar-width:none}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.\\[gap\\:inherit\\]{gap:inherit}.gap-0{gap:0}.gap-0\\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.\\[border-radius\\:inherit\\]{border-radius:inherit}.rounded{border-radius:.25rem}.rounded-3xl{border-radius:var(--radius-3xl)}.rounded-\\[inherit\\]{border-radius:inherit}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-l-\\[inherit\\]{border-top-left-radius:inherit;border-bottom-left-radius:inherit}.rounded-l-full{border-top-left-radius:2147483647px;border-bottom-left-radius:2147483647px}.rounded-r-\\[inherit\\]{border-top-right-radius:inherit;border-bottom-right-radius:inherit}.rounded-r-full{border-top-right-radius:2147483647px;border-bottom-right-radius:2147483647px}.border{border-style:var(--tw-border-style);border-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-border{border-color:var(--tdb-line)}.border-destructive{border-color:var(--tdb-error)}.border-foreground\\/40{border-color:var(--tdb-ink)}@supports (color:color-mix(in lab, red, red)){.border-foreground\\/40{border-color:color-mix(in oklab, var(--tdb-ink) 40%, transparent)}}.bg-amber-500\\/5{background-color:#f99c000d}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\\/5{background-color:color-mix(in oklab, var(--color-amber-500) 5%, transparent)}}.bg-background,.bg-background\\/5{background-color:var(--tdb-surface)}@supports (color:color-mix(in lab, red, red)){.bg-background\\/5{background-color:color-mix(in oklab, var(--tdb-surface) 5%, transparent)}}.bg-black\\/40{background-color:#0006}@supports (color:color-mix(in lab, red, red)){.bg-black\\/40{background-color:color-mix(in oklab, var(--color-black) 40%, transparent)}}.bg-card{background-color:var(--tdb-surface)}.bg-current{background-color:currentColor}.bg-destructive\\/5{background-color:var(--tdb-error)}@supports (color:color-mix(in lab, red, red)){.bg-destructive\\/5{background-color:color-mix(in oklab, var(--tdb-error) 5%, transparent)}}.bg-emerald-500\\/5{background-color:#00bb7f0d}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\\/5{background-color:color-mix(in oklab, var(--color-emerald-500) 5%, transparent)}}.bg-foreground{background-color:var(--tdb-ink)}.bg-muted{background-color:var(--tdb-surface-2)}.bg-primary,.bg-primary\\/5{background-color:var(--tdb-brand)}@supports (color:color-mix(in lab, red, red)){.bg-primary\\/5{background-color:color-mix(in oklab, var(--tdb-brand) 5%, transparent)}}.bg-transparent{background-color:#0000}.\\[mask-image\\:linear-gradient\\(to_left\\,black\\,transparent\\)\\]{-webkit-mask-image:linear-gradient(270deg,#000,#0000);mask-image:linear-gradient(270deg,#000,#0000)}.\\[mask-image\\:linear-gradient\\(to_right\\,black\\,transparent\\)\\]{-webkit-mask-image:linear-gradient(90deg,#000,#0000);mask-image:linear-gradient(90deg,#000,#0000)}.\\[padding\\:inherit\\]{padding:inherit}.p-0\\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.px-1{padding-inline:var(--spacing)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-1{padding-block:var(--spacing)}.py-1\\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pr-3\\.5{padding-right:calc(var(--spacing) * 3.5)}.pr-10{padding-right:calc(var(--spacing) * 10)}.pb-2\\.5{padding-bottom:calc(var(--spacing) * 2.5)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-3\\.5{padding-left:calc(var(--spacing) * 3.5)}.pl-10{padding-left:calc(var(--spacing) * 10)}.text-left{text-align:left}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.text-pretty{text-wrap:pretty}.whitespace-nowrap{white-space:nowrap}.text-\\(--color-success\\){color:var(--color-success)}.text-amber-800{color:var(--color-amber-800)}.text-background{color:var(--tdb-surface)}.text-destructive{color:var(--tdb-error)}.text-emerald-700{color:var(--color-emerald-700)}.text-foreground{color:var(--tdb-ink)}.text-muted-foreground{color:var(--tdb-ink-2)}.text-primary{color:var(--tdb-brand)}.text-primary-foreground{color:var(--dsw-alias-bg-base,#fff)}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal, ) var(--tw-slashed-zero, ) var(--tw-numeric-figure, ) var(--tw-numeric-spacing, ) var(--tw-numeric-fraction, )}.underline{text-decoration-line:underline}.caret-foreground{caret-color:var(--tdb-ink)}.opacity-0{opacity:0}.opacity-60{opacity:.6}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset, ) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-destructive\\/25{--tw-ring-color:var(--tdb-error)}@supports (color:color-mix(in lab, red, red)){.ring-destructive\\/25{--tw-ring-color:color-mix(in oklab, var(--tdb-error) 25%, transparent)}}.ring-ring\\/40{--tw-ring-color:var(--tdb-brand)}@supports (color:color-mix(in lab, red, red)){.ring-ring\\/40{--tw-ring-color:color-mix(in oklab, var(--tdb-brand) 40%, transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur, ) var(--tw-brightness, ) var(--tw-contrast, ) var(--tw-grayscale, ) var(--tw-hue-rotate, ) var(--tw-invert, ) var(--tw-saturate, ) var(--tw-sepia, ) var(--tw-drop-shadow, )}.backdrop-blur-\\[2px\\]{--tw-backdrop-blur:blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur, ) var(--tw-backdrop-brightness, ) var(--tw-backdrop-contrast, ) var(--tw-backdrop-grayscale, ) var(--tw-backdrop-hue-rotate, ) var(--tw-backdrop-invert, ) var(--tw-backdrop-opacity, ) var(--tw-backdrop-saturate, ) var(--tw-backdrop-sepia, );backdrop-filter:var(--tw-backdrop-blur, ) var(--tw-backdrop-brightness, ) var(--tw-backdrop-contrast, ) var(--tw-backdrop-grayscale, ) var(--tw-backdrop-hue-rotate, ) var(--tw-backdrop-invert, ) var(--tw-backdrop-opacity, ) var(--tw-backdrop-saturate, ) var(--tw-backdrop-sepia, )}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur, ) var(--tw-backdrop-brightness, ) var(--tw-backdrop-contrast, ) var(--tw-backdrop-grayscale, ) var(--tw-backdrop-hue-rotate, ) var(--tw-backdrop-invert, ) var(--tw-backdrop-opacity, ) var(--tw-backdrop-saturate, ) var(--tw-backdrop-sepia, );backdrop-filter:var(--tw-backdrop-blur, ) var(--tw-backdrop-brightness, ) var(--tw-backdrop-contrast, ) var(--tw-backdrop-grayscale, ) var(--tw-backdrop-hue-rotate, ) var(--tw-backdrop-invert, ) var(--tw-backdrop-opacity, ) var(--tw-backdrop-saturate, ) var(--tw-backdrop-sepia, )}.\\[backdrop-filter\\:blur\\(14px\\)_saturate\\(140\\%\\)\\]{-webkit-backdrop-filter:blur(14px)saturate(140%);backdrop-filter:blur(14px)saturate(140%)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[color\\,background-color\\,transform\\]{transition-property:color,background-color,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[opacity\\,transform\\]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.will-change-transform{will-change:transform}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\\[-webkit-backdrop-filter\\:blur\\(14px\\)_saturate\\(140\\%\\)\\]{-webkit-backdrop-filter:blur(14px)saturate(140%)}@media (hover:hover){:is(:where(.group):hover .group-hover\\:scale-75){--tw-scale-x:75%;--tw-scale-y:75%;--tw-scale-z:75%;scale:var(--tw-scale-x) var(--tw-scale-y)}:is(:where(.group):hover .group-hover\\:scale-100){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}:is(:where(.group):hover .group-hover\\:opacity-0){opacity:0}:is(:where(.group):hover .group-hover\\:opacity-100){opacity:1}}:is(:where(.group):focus-visible .group-focus-visible\\:scale-75){--tw-scale-x:75%;--tw-scale-y:75%;--tw-scale-z:75%;scale:var(--tw-scale-x) var(--tw-scale-y)}:is(:where(.group):focus-visible .group-focus-visible\\:scale-100){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}:is(:where(.group):focus-visible .group-focus-visible\\:opacity-0){opacity:0}:is(:where(.group):focus-visible .group-focus-visible\\:opacity-100){opacity:1}.placeholder\\:text-muted-foreground\\/60::placeholder{color:var(--tdb-ink-2)}@supports (color:color-mix(in lab, red, red)){.placeholder\\:text-muted-foreground\\/60::placeholder{color:color-mix(in oklab, var(--tdb-ink-2) 60%, transparent)}}@media (hover:hover){.hover\\:border-\\(--color-border-strong\\):hover{border-color:var(--color-border-strong)}.hover\\:border-border:hover{border-color:var(--tdb-line)}.hover\\:bg-foreground\\/5:hover{background-color:var(--tdb-ink)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-foreground\\/5:hover{background-color:color-mix(in oklab, var(--tdb-ink) 5%, transparent)}}.hover\\:bg-foreground\\/\\[0\\.05\\]:hover{background-color:var(--tdb-ink)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-foreground\\/\\[0\\.05\\]:hover{background-color:color-mix(in oklab, var(--tdb-ink) 5%, transparent)}}.hover\\:bg-muted:hover,.hover\\:bg-muted\\/60:hover{background-color:var(--tdb-surface-2)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-muted\\/60:hover{background-color:color-mix(in oklab, var(--tdb-surface-2) 60%, transparent)}}.hover\\:bg-primary\\/90:hover{background-color:var(--tdb-brand)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-primary\\/90:hover{background-color:color-mix(in oklab, var(--tdb-brand) 90%, transparent)}}.hover\\:text-foreground:hover{color:var(--tdb-ink)}.hover\\:opacity-70:hover{opacity:.7}}.focus-visible\\:bg-muted:focus-visible{background-color:var(--tdb-surface-2)}.focus-visible\\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset, ) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\\:ring-foreground\\/20:focus-visible{--tw-ring-color:var(--tdb-ink)}@supports (color:color-mix(in lab, red, red)){.focus-visible\\:ring-foreground\\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--tdb-ink) 20%, transparent)}}.focus-visible\\:ring-ring:focus-visible,.focus-visible\\:ring-ring\\/40:focus-visible{--tw-ring-color:var(--tdb-brand)}@supports (color:color-mix(in lab, red, red)){.focus-visible\\:ring-ring\\/40:focus-visible{--tw-ring-color:color-mix(in oklab, var(--tdb-brand) 40%, transparent)}}.focus-visible\\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\\:-outline-offset-4:focus-visible{outline-offset:calc(4px * -1)}.focus-visible\\:outline-ring:focus-visible{outline-color:var(--tdb-brand)}.active\\:scale-\\[0\\.94\\]:active{scale:.94}.disabled\\:pointer-events-none:disabled{pointer-events:none}.disabled\\:opacity-0:disabled{opacity:0}.disabled\\:opacity-40:disabled{opacity:.4}.disabled\\:opacity-50:disabled{opacity:.5}@media (prefers-reduced-motion:reduce){.motion-reduce\\:transform-none{transform:none}.motion-reduce\\:active\\:scale-100:active{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}}@media (min-width:40rem){.sm\\:h-9{height:calc(var(--spacing) * 9)}.sm\\:min-w-9{min-width:calc(var(--spacing) * 9)}.sm\\:gap-1{gap:var(--spacing)}}@media (prefers-color-scheme:dark){.dark\\:text-amber-300{color:var(--color-amber-300)}.dark\\:text-emerald-400{color:var(--color-emerald-400)}}.\\[\\&_a\\]\\:underline a{text-decoration-line:underline}.\\[\\&_a\\]\\:underline-offset-4 a{text-underline-offset:4px}.\\[\\&_button\\]\\:grid button{display:grid}.\\[\\&_button\\]\\:size-11 button{width:calc(var(--spacing) * 11);height:calc(var(--spacing) * 11)}.\\[\\&_button\\]\\:place-items-center button{place-items:center}.\\[\\&_svg\\]\\:h-4 svg{height:calc(var(--spacing) * 4)}.\\[\\&_svg\\]\\:w-4 svg{width:calc(var(--spacing) * 4)}.\\[\\&\\:\\:-webkit-scrollbar\\]\\:hidden::-webkit-scrollbar{display:none}.\\[\\&\\>svg\\]\\:size-4>svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}}.tdb-root button,.tdb-root input{font:inherit}.tdb-root{--color-background:var(--tdb-surface);--color-foreground:var(--tdb-ink);--color-card:var(--tdb-surface);--color-card-foreground:var(--tdb-ink);--color-popover:var(--tdb-surface);--color-popover-foreground:var(--tdb-ink);--color-primary:var(--tdb-brand);--color-primary-foreground:var(--dsw-alias-bg-base,#fff);--color-secondary:var(--tdb-surface-2);--color-secondary-foreground:var(--tdb-ink);--color-muted:var(--tdb-surface-2);--color-muted-foreground:var(--tdb-ink-2);--color-accent:var(--tdb-surface-2);--color-accent-foreground:var(--tdb-ink);--color-border:var(--tdb-line);--color-input:var(--tdb-line-strong);--color-ring:var(--tdb-brand);--color-destructive:var(--tdb-error);--color-success:var(--tdb-success)}@property --tw-translate-x{syntax:\"*\";inherits:false;initial-value:0}@property --tw-translate-y{syntax:\"*\";inherits:false;initial-value:0}@property --tw-translate-z{syntax:\"*\";inherits:false;initial-value:0}@property --tw-scale-x{syntax:\"*\";inherits:false;initial-value:1}@property --tw-scale-y{syntax:\"*\";inherits:false;initial-value:1}@property --tw-scale-z{syntax:\"*\";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:\"*\";inherits:false}@property --tw-rotate-y{syntax:\"*\";inherits:false}@property --tw-rotate-z{syntax:\"*\";inherits:false}@property --tw-skew-x{syntax:\"*\";inherits:false}@property --tw-skew-y{syntax:\"*\";inherits:false}@property --tw-space-y-reverse{syntax:\"*\";inherits:false;initial-value:0}@property --tw-border-style{syntax:\"*\";inherits:false;initial-value:solid}@property --tw-leading{syntax:\"*\";inherits:false}@property --tw-font-weight{syntax:\"*\";inherits:false}@property --tw-ordinal{syntax:\"*\";inherits:false}@property --tw-slashed-zero{syntax:\"*\";inherits:false}@property --tw-numeric-figure{syntax:\"*\";inherits:false}@property --tw-numeric-spacing{syntax:\"*\";inherits:false}@property --tw-numeric-fraction{syntax:\"*\";inherits:false}@property --tw-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:\"*\";inherits:false}@property --tw-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:\"*\";inherits:false}@property --tw-inset-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:\"*\";inherits:false}@property --tw-ring-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:\"*\";inherits:false}@property --tw-inset-ring-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:\"*\";inherits:false}@property --tw-ring-offset-width{syntax:\"<length>\";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:\"*\";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:\"*\";inherits:false;initial-value:solid}@property --tw-blur{syntax:\"*\";inherits:false}@property --tw-brightness{syntax:\"*\";inherits:false}@property --tw-contrast{syntax:\"*\";inherits:false}@property --tw-grayscale{syntax:\"*\";inherits:false}@property --tw-hue-rotate{syntax:\"*\";inherits:false}@property --tw-invert{syntax:\"*\";inherits:false}@property --tw-opacity{syntax:\"*\";inherits:false}@property --tw-saturate{syntax:\"*\";inherits:false}@property --tw-sepia{syntax:\"*\";inherits:false}@property --tw-drop-shadow{syntax:\"*\";inherits:false}@property --tw-drop-shadow-color{syntax:\"*\";inherits:false}@property --tw-drop-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:\"*\";inherits:false}@property --tw-backdrop-blur{syntax:\"*\";inherits:false}@property --tw-backdrop-brightness{syntax:\"*\";inherits:false}@property --tw-backdrop-contrast{syntax:\"*\";inherits:false}@property --tw-backdrop-grayscale{syntax:\"*\";inherits:false}@property --tw-backdrop-hue-rotate{syntax:\"*\";inherits:false}@property --tw-backdrop-invert{syntax:\"*\";inherits:false}@property --tw-backdrop-opacity{syntax:\"*\";inherits:false}@property --tw-backdrop-saturate{syntax:\"*\";inherits:false}@property --tw-backdrop-sepia{syntax:\"*\";inherits:false}@property --tw-duration{syntax:\"*\";inherits:false}@property --tw-ease{syntax:\"*\";inherits:false}";
22761
+ var BEUI_CSS = "/*! tailwindcss v4.3.5 | MIT License | https://tailwindcss.com */\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:block))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--color-amber-300:oklch(87.9% .169 91.605);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-800:oklch(47.3% .137 46.201);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-700:oklch(50.8% .118 165.612);--color-black:#000;--spacing:.25rem;--container-sm:24rem;--container-2xl:42rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--font-weight-medium:500;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-3xl:1.5rem;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--color-success:var(--tdb-success)}}@layer base{.tdb-root button,.tdb-root input{color:inherit;font:inherit;background:0 0;border:0}.tdb-root *,.tdb-root :before,.tdb-root :after{border-style:solid;border-width:0}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:0}.inset-4{inset:calc(var(--spacing) * 4)}.inset-y-0{inset-block:0}.top-0{top:0}.top-1\\/2{top:50%}.top-full{top:100%}.right-0{right:0}.right-3\\.5{right:calc(var(--spacing) * 3.5)}.bottom-0{bottom:0}.bottom-full{bottom:100%}.left-0{left:0}.left-3{left:calc(var(--spacing) * 3)}.isolate{isolation:isolate}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.z-\\[80\\]{z-index:80}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.-m-1\\.5{margin:calc(var(--spacing) * -1.5)}.mt-0\\.5{margin-top:calc(var(--spacing) * .5)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mr-1\\.5{margin-right:calc(var(--spacing) * 1.5)}.-mb-px{margin-bottom:-1px}.block{display:block}.contents{display:contents}.flex{display:flex}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.h-3\\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-8{height:calc(var(--spacing) * 8)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-full{height:100%}.h-px{height:1px}.min-h-4{min-height:calc(var(--spacing) * 4)}.min-h-\\[44px\\]{min-height:44px}.w-3\\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-80{width:calc(var(--spacing) * 80)}.w-full{width:100%}.w-max{width:max-content}.max-w-2xl{max-width:var(--container-2xl)}.max-w-\\[85vw\\]{max-width:85vw}.max-w-full{max-width:100%}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:0}.min-w-8{min-width:calc(var(--spacing) * 8)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.-translate-y-1\\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.scale-75{--tw-scale-x:75%;--tw-scale-y:75%;--tw-scale-z:75%;scale:var(--tw-scale-x) var(--tw-scale-y)}.transform{transform:var(--tw-rotate-x, ) var(--tw-rotate-y, ) var(--tw-rotate-z, ) var(--tw-skew-x, ) var(--tw-skew-y, )}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.resize{resize:both}.\\[scrollbar-width\\:none\\]{scrollbar-width:none}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.\\[gap\\:inherit\\]{gap:inherit}.gap-0{gap:0}.gap-0\\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.\\[border-radius\\:inherit\\]{border-radius:inherit}.rounded{border-radius:.25rem}.rounded-3xl{border-radius:var(--radius-3xl)}.rounded-\\[inherit\\]{border-radius:inherit}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-l-\\[inherit\\]{border-top-left-radius:inherit;border-bottom-left-radius:inherit}.rounded-l-full{border-top-left-radius:2147483647px;border-bottom-left-radius:2147483647px}.rounded-r-\\[inherit\\]{border-top-right-radius:inherit;border-bottom-right-radius:inherit}.rounded-r-full{border-top-right-radius:2147483647px;border-bottom-right-radius:2147483647px}.border{border-style:var(--tw-border-style);border-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-border{border-color:var(--tdb-line)}.border-destructive{border-color:var(--tdb-error)}.border-foreground\\/40{border-color:var(--tdb-ink)}@supports (color:color-mix(in lab, red, red)){.border-foreground\\/40{border-color:color-mix(in oklab, var(--tdb-ink) 40%, transparent)}}.bg-amber-500\\/5{background-color:#f99c000d}@supports (color:color-mix(in lab, red, red)){.bg-amber-500\\/5{background-color:color-mix(in oklab, var(--color-amber-500) 5%, transparent)}}.bg-background,.bg-background\\/5{background-color:var(--tdb-surface)}@supports (color:color-mix(in lab, red, red)){.bg-background\\/5{background-color:color-mix(in oklab, var(--tdb-surface) 5%, transparent)}}.bg-black\\/40{background-color:#0006}@supports (color:color-mix(in lab, red, red)){.bg-black\\/40{background-color:color-mix(in oklab, var(--color-black) 40%, transparent)}}.bg-card{background-color:var(--tdb-surface)}.bg-current{background-color:currentColor}.bg-destructive\\/5{background-color:var(--tdb-error)}@supports (color:color-mix(in lab, red, red)){.bg-destructive\\/5{background-color:color-mix(in oklab, var(--tdb-error) 5%, transparent)}}.bg-emerald-500\\/5{background-color:#00bb7f0d}@supports (color:color-mix(in lab, red, red)){.bg-emerald-500\\/5{background-color:color-mix(in oklab, var(--color-emerald-500) 5%, transparent)}}.bg-foreground{background-color:var(--tdb-ink)}.bg-muted{background-color:var(--tdb-surface-2)}.bg-primary,.bg-primary\\/5{background-color:var(--tdb-brand)}@supports (color:color-mix(in lab, red, red)){.bg-primary\\/5{background-color:color-mix(in oklab, var(--tdb-brand) 5%, transparent)}}.bg-transparent{background-color:#0000}.\\[mask-image\\:linear-gradient\\(to_left\\,black\\,transparent\\)\\]{-webkit-mask-image:linear-gradient(270deg,#000,#0000);mask-image:linear-gradient(270deg,#000,#0000)}.\\[mask-image\\:linear-gradient\\(to_right\\,black\\,transparent\\)\\]{-webkit-mask-image:linear-gradient(90deg,#000,#0000);mask-image:linear-gradient(90deg,#000,#0000)}.\\[padding\\:inherit\\]{padding:inherit}.p-0\\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.px-1{padding-inline:var(--spacing)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-1{padding-block:var(--spacing)}.py-1\\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pr-3\\.5{padding-right:calc(var(--spacing) * 3.5)}.pr-10{padding-right:calc(var(--spacing) * 10)}.pb-2\\.5{padding-bottom:calc(var(--spacing) * 2.5)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-3\\.5{padding-left:calc(var(--spacing) * 3.5)}.pl-10{padding-left:calc(var(--spacing) * 10)}.text-left{text-align:left}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.text-pretty{text-wrap:pretty}.whitespace-nowrap{white-space:nowrap}.text-\\(--color-success\\){color:var(--color-success)}.text-amber-800{color:var(--color-amber-800)}.text-background{color:var(--tdb-surface)}.text-destructive{color:var(--tdb-error)}.text-emerald-700{color:var(--color-emerald-700)}.text-foreground{color:var(--tdb-ink)}.text-muted-foreground{color:var(--tdb-ink-2)}.text-primary{color:var(--tdb-brand)}.text-primary-foreground{color:var(--dsw-alias-bg-base,#fff)}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal, ) var(--tw-slashed-zero, ) var(--tw-numeric-figure, ) var(--tw-numeric-spacing, ) var(--tw-numeric-fraction, )}.underline{text-decoration-line:underline}.caret-foreground{caret-color:var(--tdb-ink)}.opacity-0{opacity:0}.opacity-60{opacity:.6}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset, ) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-destructive\\/25{--tw-ring-color:var(--tdb-error)}@supports (color:color-mix(in lab, red, red)){.ring-destructive\\/25{--tw-ring-color:color-mix(in oklab, var(--tdb-error) 25%, transparent)}}.ring-ring\\/40{--tw-ring-color:var(--tdb-brand)}@supports (color:color-mix(in lab, red, red)){.ring-ring\\/40{--tw-ring-color:color-mix(in oklab, var(--tdb-brand) 40%, transparent)}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur, ) var(--tw-brightness, ) var(--tw-contrast, ) var(--tw-grayscale, ) var(--tw-hue-rotate, ) var(--tw-invert, ) var(--tw-saturate, ) var(--tw-sepia, ) var(--tw-drop-shadow, )}.backdrop-blur-\\[2px\\]{--tw-backdrop-blur:blur(2px);-webkit-backdrop-filter:var(--tw-backdrop-blur, ) var(--tw-backdrop-brightness, ) var(--tw-backdrop-contrast, ) var(--tw-backdrop-grayscale, ) var(--tw-backdrop-hue-rotate, ) var(--tw-backdrop-invert, ) var(--tw-backdrop-opacity, ) var(--tw-backdrop-saturate, ) var(--tw-backdrop-sepia, );backdrop-filter:var(--tw-backdrop-blur, ) var(--tw-backdrop-brightness, ) var(--tw-backdrop-contrast, ) var(--tw-backdrop-grayscale, ) var(--tw-backdrop-hue-rotate, ) var(--tw-backdrop-invert, ) var(--tw-backdrop-opacity, ) var(--tw-backdrop-saturate, ) var(--tw-backdrop-sepia, )}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur, ) var(--tw-backdrop-brightness, ) var(--tw-backdrop-contrast, ) var(--tw-backdrop-grayscale, ) var(--tw-backdrop-hue-rotate, ) var(--tw-backdrop-invert, ) var(--tw-backdrop-opacity, ) var(--tw-backdrop-saturate, ) var(--tw-backdrop-sepia, );backdrop-filter:var(--tw-backdrop-blur, ) var(--tw-backdrop-brightness, ) var(--tw-backdrop-contrast, ) var(--tw-backdrop-grayscale, ) var(--tw-backdrop-hue-rotate, ) var(--tw-backdrop-invert, ) var(--tw-backdrop-opacity, ) var(--tw-backdrop-saturate, ) var(--tw-backdrop-sepia, )}.\\[backdrop-filter\\:blur\\(14px\\)_saturate\\(140\\%\\)\\]{-webkit-backdrop-filter:blur(14px)saturate(140%);backdrop-filter:blur(14px)saturate(140%)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[color\\,background-color\\,transform\\]{transition-property:color,background-color,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[opacity\\,transform\\]{transition-property:opacity,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.will-change-transform{will-change:transform}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\\[-webkit-backdrop-filter\\:blur\\(14px\\)_saturate\\(140\\%\\)\\]{-webkit-backdrop-filter:blur(14px)saturate(140%)}@media (hover:hover){:is(:where(.group):hover .group-hover\\:scale-75){--tw-scale-x:75%;--tw-scale-y:75%;--tw-scale-z:75%;scale:var(--tw-scale-x) var(--tw-scale-y)}:is(:where(.group):hover .group-hover\\:scale-100){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}:is(:where(.group):hover .group-hover\\:opacity-0){opacity:0}:is(:where(.group):hover .group-hover\\:opacity-100){opacity:1}}:is(:where(.group):focus-visible .group-focus-visible\\:scale-75){--tw-scale-x:75%;--tw-scale-y:75%;--tw-scale-z:75%;scale:var(--tw-scale-x) var(--tw-scale-y)}:is(:where(.group):focus-visible .group-focus-visible\\:scale-100){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}:is(:where(.group):focus-visible .group-focus-visible\\:opacity-0){opacity:0}:is(:where(.group):focus-visible .group-focus-visible\\:opacity-100){opacity:1}.placeholder\\:text-muted-foreground\\/60::placeholder{color:var(--tdb-ink-2)}@supports (color:color-mix(in lab, red, red)){.placeholder\\:text-muted-foreground\\/60::placeholder{color:color-mix(in oklab, var(--tdb-ink-2) 60%, transparent)}}@media (hover:hover){.hover\\:border-\\(--color-border-strong\\):hover{border-color:var(--color-border-strong)}.hover\\:border-border:hover{border-color:var(--tdb-line)}.hover\\:bg-foreground\\/5:hover{background-color:var(--tdb-ink)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-foreground\\/5:hover{background-color:color-mix(in oklab, var(--tdb-ink) 5%, transparent)}}.hover\\:bg-foreground\\/\\[0\\.05\\]:hover{background-color:var(--tdb-ink)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-foreground\\/\\[0\\.05\\]:hover{background-color:color-mix(in oklab, var(--tdb-ink) 5%, transparent)}}.hover\\:bg-muted:hover,.hover\\:bg-muted\\/60:hover{background-color:var(--tdb-surface-2)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-muted\\/60:hover{background-color:color-mix(in oklab, var(--tdb-surface-2) 60%, transparent)}}.hover\\:bg-primary\\/90:hover{background-color:var(--tdb-brand)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-primary\\/90:hover{background-color:color-mix(in oklab, var(--tdb-brand) 90%, transparent)}}.hover\\:text-foreground:hover{color:var(--tdb-ink)}.hover\\:opacity-70:hover{opacity:.7}}.focus-visible\\:bg-muted:focus-visible{background-color:var(--tdb-surface-2)}.focus-visible\\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset, ) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\\:ring-foreground\\/20:focus-visible{--tw-ring-color:var(--tdb-ink)}@supports (color:color-mix(in lab, red, red)){.focus-visible\\:ring-foreground\\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--tdb-ink) 20%, transparent)}}.focus-visible\\:ring-ring:focus-visible,.focus-visible\\:ring-ring\\/40:focus-visible{--tw-ring-color:var(--tdb-brand)}@supports (color:color-mix(in lab, red, red)){.focus-visible\\:ring-ring\\/40:focus-visible{--tw-ring-color:color-mix(in oklab, var(--tdb-brand) 40%, transparent)}}.focus-visible\\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\\:-outline-offset-4:focus-visible{outline-offset:calc(4px * -1)}.focus-visible\\:outline-ring:focus-visible{outline-color:var(--tdb-brand)}.active\\:scale-\\[0\\.94\\]:active{scale:.94}.disabled\\:pointer-events-none:disabled{pointer-events:none}.disabled\\:opacity-0:disabled{opacity:0}.disabled\\:opacity-40:disabled{opacity:.4}.disabled\\:opacity-50:disabled{opacity:.5}@media (prefers-reduced-motion:reduce){.motion-reduce\\:transform-none{transform:none}.motion-reduce\\:active\\:scale-100:active{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}}@media (min-width:40rem){.sm\\:h-9{height:calc(var(--spacing) * 9)}.sm\\:min-w-9{min-width:calc(var(--spacing) * 9)}.sm\\:gap-1{gap:var(--spacing)}}@media (prefers-color-scheme:dark){.dark\\:text-amber-300{color:var(--color-amber-300)}.dark\\:text-emerald-400{color:var(--color-emerald-400)}}.\\[\\&_a\\]\\:underline a{text-decoration-line:underline}.\\[\\&_a\\]\\:underline-offset-4 a{text-underline-offset:4px}.\\[\\&_button\\]\\:grid button{display:grid}.\\[\\&_button\\]\\:size-11 button{width:calc(var(--spacing) * 11);height:calc(var(--spacing) * 11)}.\\[\\&_button\\]\\:place-items-center button{place-items:center}.\\[\\&_svg\\]\\:h-4 svg{height:calc(var(--spacing) * 4)}.\\[\\&_svg\\]\\:w-4 svg{width:calc(var(--spacing) * 4)}.\\[\\&\\:\\:-webkit-scrollbar\\]\\:hidden::-webkit-scrollbar{display:none}.\\[\\&\\>svg\\]\\:size-4>svg{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}}.tdb-root button,.tdb-root input{font:inherit}.tdb-root{--color-background:var(--tdb-surface);--color-foreground:var(--tdb-ink);--color-card:var(--tdb-surface);--color-card-foreground:var(--tdb-ink);--color-popover:var(--tdb-surface);--color-popover-foreground:var(--tdb-ink);--color-primary:var(--tdb-brand);--color-primary-foreground:var(--dsw-alias-bg-base,#fff);--color-secondary:var(--tdb-surface-2);--color-secondary-foreground:var(--tdb-ink);--color-muted:var(--tdb-surface-2);--color-muted-foreground:var(--tdb-ink-2);--color-accent:var(--tdb-surface-2);--color-accent-foreground:var(--tdb-ink);--color-border:var(--tdb-line);--color-input:var(--tdb-line-strong);--color-ring:var(--tdb-brand);--color-destructive:var(--tdb-error);--color-success:var(--tdb-success)}@property --tw-translate-x{syntax:\"*\";inherits:false;initial-value:0}@property --tw-translate-y{syntax:\"*\";inherits:false;initial-value:0}@property --tw-translate-z{syntax:\"*\";inherits:false;initial-value:0}@property --tw-scale-x{syntax:\"*\";inherits:false;initial-value:1}@property --tw-scale-y{syntax:\"*\";inherits:false;initial-value:1}@property --tw-scale-z{syntax:\"*\";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:\"*\";inherits:false}@property --tw-rotate-y{syntax:\"*\";inherits:false}@property --tw-rotate-z{syntax:\"*\";inherits:false}@property --tw-skew-x{syntax:\"*\";inherits:false}@property --tw-skew-y{syntax:\"*\";inherits:false}@property --tw-space-y-reverse{syntax:\"*\";inherits:false;initial-value:0}@property --tw-border-style{syntax:\"*\";inherits:false;initial-value:solid}@property --tw-leading{syntax:\"*\";inherits:false}@property --tw-font-weight{syntax:\"*\";inherits:false}@property --tw-ordinal{syntax:\"*\";inherits:false}@property --tw-slashed-zero{syntax:\"*\";inherits:false}@property --tw-numeric-figure{syntax:\"*\";inherits:false}@property --tw-numeric-spacing{syntax:\"*\";inherits:false}@property --tw-numeric-fraction{syntax:\"*\";inherits:false}@property --tw-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:\"*\";inherits:false}@property --tw-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:\"*\";inherits:false}@property --tw-inset-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:\"*\";inherits:false}@property --tw-ring-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:\"*\";inherits:false}@property --tw-inset-ring-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:\"*\";inherits:false}@property --tw-ring-offset-width{syntax:\"<length>\";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:\"*\";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:\"*\";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:\"*\";inherits:false;initial-value:solid}@property --tw-blur{syntax:\"*\";inherits:false}@property --tw-brightness{syntax:\"*\";inherits:false}@property --tw-contrast{syntax:\"*\";inherits:false}@property --tw-grayscale{syntax:\"*\";inherits:false}@property --tw-hue-rotate{syntax:\"*\";inherits:false}@property --tw-invert{syntax:\"*\";inherits:false}@property --tw-opacity{syntax:\"*\";inherits:false}@property --tw-saturate{syntax:\"*\";inherits:false}@property --tw-sepia{syntax:\"*\";inherits:false}@property --tw-drop-shadow{syntax:\"*\";inherits:false}@property --tw-drop-shadow-color{syntax:\"*\";inherits:false}@property --tw-drop-shadow-alpha{syntax:\"<percentage>\";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:\"*\";inherits:false}@property --tw-backdrop-blur{syntax:\"*\";inherits:false}@property --tw-backdrop-brightness{syntax:\"*\";inherits:false}@property --tw-backdrop-contrast{syntax:\"*\";inherits:false}@property --tw-backdrop-grayscale{syntax:\"*\";inherits:false}@property --tw-backdrop-hue-rotate{syntax:\"*\";inherits:false}@property --tw-backdrop-invert{syntax:\"*\";inherits:false}@property --tw-backdrop-opacity{syntax:\"*\";inherits:false}@property --tw-backdrop-saturate{syntax:\"*\";inherits:false}@property --tw-backdrop-sepia{syntax:\"*\";inherits:false}@property --tw-duration{syntax:\"*\";inherits:false}@property --tw-ease{syntax:\"*\";inherits:false}";
22541
22762
 
22542
22763
  // src/client/App.tsx
22543
22764
  var AUTO_PRICE_SYNC_MS = 6 * 60 * 60 * 1e3;
22544
22765
  var AUTO_PRICE_INITIAL_DELAY_MS = 3e3;
22545
22766
  function Dashboard({ onOpenSession }) {
22546
22767
  const language = useLanguage();
22547
- const t = (0, import_react93.useMemo)(
22768
+ const t = (0, import_react92.useMemo)(
22548
22769
  () => makeT((key) => (language === "zh" ? zh : en)[key] ?? key),
22549
22770
  [language]
22550
22771
  );
22551
22772
  const intl = language === "zh" ? "zh-CN" : "en-US";
22552
22773
  const now2 = useNow(6e4);
22553
- const [scanInterval, setScanInterval] = (0, import_react93.useState)(readScanInterval);
22774
+ const [scanInterval, setScanInterval] = (0, import_react92.useState)(readScanInterval);
22554
22775
  const stats = useStats(SCAN_INTERVAL_MS[scanInterval]);
22555
22776
  const data = stats.data;
22556
22777
  const {
@@ -22563,28 +22784,41 @@ window.__ModuleLoader__.load({
22563
22784
  onlineError,
22564
22785
  refreshOnline
22565
22786
  } = usePricing();
22566
- const models = (0, import_react93.useMemo)(() => data?.models ?? [], [data]);
22567
- const defaults = (0, import_react93.useMemo)(() => defaultsForModels(models, online), [models, online]);
22568
- const effectivePricing = (0, import_react93.useMemo)(() => mergePricing(defaults, pricing), [defaults, pricing]);
22569
- const [selectedId, setSelectedId] = (0, import_react93.useState)(null);
22570
- const [pricingOpen, setPricingOpen] = (0, import_react93.useState)(false);
22571
- const [page, setPage] = (0, import_react93.useState)("overview");
22572
- const [requestRefresh, setRequestRefresh] = (0, import_react93.useState)(0);
22573
- const [range, setRange] = (0, import_react93.useState)({ id: "30d", from: "", to: "" });
22574
- const [chartView, setChartView] = (0, import_react93.useState)("io");
22575
- const priceModelsRef = (0, import_react93.useRef)(models);
22576
- const onlineRef = (0, import_react93.useRef)(online);
22577
- const onlineAtRef = (0, import_react93.useRef)(onlineAt);
22578
- const refreshPricesRef = (0, import_react93.useRef)(refreshOnline);
22787
+ const models = (0, import_react92.useMemo)(() => data?.models ?? [], [data]);
22788
+ const defaults = (0, import_react92.useMemo)(() => defaultsForModels(models, online), [models, online]);
22789
+ const effectivePricing = (0, import_react92.useMemo)(() => mergePricing(defaults, pricing), [defaults, pricing]);
22790
+ const builtinRows = (0, import_react92.useMemo)(() => builtinPriceRows(), []);
22791
+ const builtinModels = (0, import_react92.useMemo)(() => builtinRows.map((row) => ({
22792
+ key: row.key,
22793
+ provider: row.provider,
22794
+ model: row.model,
22795
+ requests: 0,
22796
+ uncachedInputTokens: 0,
22797
+ cacheReadTokens: 0,
22798
+ cacheWriteTokens: 0,
22799
+ outputTokens: 0
22800
+ })), [builtinRows]);
22801
+ const builtinDefaults = (0, import_react92.useMemo)(() => Object.fromEntries(
22802
+ builtinRows.map((row) => [row.key, row.price])
22803
+ ), [builtinRows]);
22804
+ const [selectedId, setSelectedId] = (0, import_react92.useState)(null);
22805
+ const [page, setPage] = (0, import_react92.useState)("overview");
22806
+ const [requestRefresh, setRequestRefresh] = (0, import_react92.useState)(0);
22807
+ const [range, setRange] = (0, import_react92.useState)({ id: "30d", from: "", to: "" });
22808
+ const [chartView, setChartView] = (0, import_react92.useState)("io");
22809
+ const priceModelsRef = (0, import_react92.useRef)(models);
22810
+ const onlineRef = (0, import_react92.useRef)(online);
22811
+ const onlineAtRef = (0, import_react92.useRef)(onlineAt);
22812
+ const refreshPricesRef = (0, import_react92.useRef)(refreshOnline);
22579
22813
  priceModelsRef.current = models;
22580
22814
  onlineRef.current = online;
22581
22815
  onlineAtRef.current = onlineAt;
22582
22816
  refreshPricesRef.current = refreshOnline;
22583
- const priceModelKey = (0, import_react93.useMemo)(
22817
+ const priceModelKey = (0, import_react92.useMemo)(
22584
22818
  () => [...new Set(models.map((model) => model.model))].sort().join("|"),
22585
22819
  [models]
22586
22820
  );
22587
- (0, import_react93.useEffect)(() => {
22821
+ (0, import_react92.useEffect)(() => {
22588
22822
  if (priceModelsRef.current.length === 0) return;
22589
22823
  let stopped = false;
22590
22824
  let inFlight = false;
@@ -22615,7 +22849,7 @@ window.__ModuleLoader__.load({
22615
22849
  clearInterval(timer);
22616
22850
  };
22617
22851
  }, [priceModelKey]);
22618
- const rangeResult = (0, import_react93.useMemo)(() => selectRange({
22852
+ const rangeResult = (0, import_react92.useMemo)(() => selectRange({
22619
22853
  days: data?.days ?? [],
22620
22854
  hours: data?.hours ?? [],
22621
22855
  today: data?.today ?? ""
@@ -22626,7 +22860,8 @@ window.__ModuleLoader__.load({
22626
22860
  { id: "models", label: t("tabs.models") },
22627
22861
  { id: "sessions", label: t("tabs.sessions") },
22628
22862
  { id: "requests", label: t("tabs.requests") },
22629
- { id: "costs", label: t("tabs.costs") }
22863
+ { id: "costs", label: t("tabs.costs") },
22864
+ { id: "pricing", label: t("tabs.pricing") }
22630
22865
  ];
22631
22866
  const refreshAll = () => {
22632
22867
  stats.refresh();
@@ -22636,7 +22871,7 @@ window.__ModuleLoader__.load({
22636
22871
  setPage(next);
22637
22872
  if (next !== "sessions") setSelectedId(null);
22638
22873
  };
22639
- const header = (showExport) => (0, import_react93.createElement)(DashboardHeader, {
22874
+ const header = (showExport) => (0, import_react92.createElement)(DashboardHeader, {
22640
22875
  t,
22641
22876
  data,
22642
22877
  language,
@@ -22651,35 +22886,35 @@ window.__ModuleLoader__.load({
22651
22886
  }
22652
22887
  });
22653
22888
  if (stats.loading && data === null) {
22654
- return (0, import_react93.createElement)(
22889
+ return (0, import_react92.createElement)(
22655
22890
  "div",
22656
22891
  { className: "tdb-root" },
22657
- (0, import_react93.createElement)("style", { key: "tdb-styles" }, CSS + BEUI_CSS),
22658
- (0, import_react93.createElement)("div", { className: "tdb-scroll" }, (0, import_react93.createElement)(SkeletonDashboard))
22892
+ (0, import_react92.createElement)("style", { key: "tdb-styles" }, CSS + BEUI_CSS),
22893
+ (0, import_react92.createElement)("div", { className: "tdb-scroll" }, (0, import_react92.createElement)(SkeletonDashboard))
22659
22894
  );
22660
22895
  }
22661
22896
  if (data === null) {
22662
- return (0, import_react93.createElement)(
22897
+ return (0, import_react92.createElement)(
22663
22898
  "div",
22664
22899
  { className: "tdb-root" },
22665
- (0, import_react93.createElement)("style", { key: "tdb-styles" }, CSS + BEUI_CSS),
22666
- (0, import_react93.createElement)(
22900
+ (0, import_react92.createElement)("style", { key: "tdb-styles" }, CSS + BEUI_CSS),
22901
+ (0, import_react92.createElement)(
22667
22902
  "div",
22668
22903
  { className: "tdb-scroll" },
22669
- (0, import_react93.createElement)(
22904
+ (0, import_react92.createElement)(
22670
22905
  "div",
22671
22906
  { className: "tdb-container" },
22672
22907
  header(false),
22673
- (0, import_react93.createElement)(
22908
+ (0, import_react92.createElement)(
22674
22909
  "div",
22675
22910
  { className: "tdb-surface" },
22676
- (0, import_react93.createElement)(
22911
+ (0, import_react92.createElement)(
22677
22912
  "div",
22678
22913
  { className: "tdb-section" },
22679
- (0, import_react93.createElement)(Notice, {
22914
+ (0, import_react92.createElement)(Notice, {
22680
22915
  tone: "error",
22681
- icon: (0, import_react93.createElement)(AlertIcon, { size: 16 }),
22682
- action: (0, import_react93.createElement)(Button3, { onClick: stats.refresh }, t("errors.retry"))
22916
+ icon: (0, import_react92.createElement)(AlertIcon, { size: 16 }),
22917
+ action: (0, import_react92.createElement)(Button3, { onClick: stats.refresh }, t("errors.retry"))
22683
22918
  }, t("errors.title"))
22684
22919
  )
22685
22920
  )
@@ -22688,24 +22923,24 @@ window.__ModuleLoader__.load({
22688
22923
  );
22689
22924
  }
22690
22925
  if (data.sessions.total === 0) {
22691
- return (0, import_react93.createElement)(
22926
+ return (0, import_react92.createElement)(
22692
22927
  "div",
22693
22928
  { className: "tdb-root" },
22694
- (0, import_react93.createElement)("style", { key: "tdb-styles" }, CSS + BEUI_CSS),
22695
- (0, import_react93.createElement)(
22929
+ (0, import_react92.createElement)("style", { key: "tdb-styles" }, CSS + BEUI_CSS),
22930
+ (0, import_react92.createElement)(
22696
22931
  "div",
22697
22932
  { className: "tdb-scroll" },
22698
- (0, import_react93.createElement)(
22933
+ (0, import_react92.createElement)(
22699
22934
  "div",
22700
22935
  { className: "tdb-container" },
22701
22936
  header(false),
22702
- (0, import_react93.createElement)(
22937
+ (0, import_react92.createElement)(
22703
22938
  "div",
22704
22939
  { className: "tdb-surface" },
22705
- (0, import_react93.createElement)(
22940
+ (0, import_react92.createElement)(
22706
22941
  "div",
22707
22942
  { className: "tdb-section" },
22708
- (0, import_react93.createElement)(EmptyState, { icon: (0, import_react93.createElement)(DatabaseIcon, { size: 22 }), title: t("sessions.empty") })
22943
+ (0, import_react92.createElement)(EmptyState, { icon: (0, import_react92.createElement)(DatabaseIcon, { size: 22 }), title: t("sessions.empty") })
22709
22944
  )
22710
22945
  )
22711
22946
  )
@@ -22713,28 +22948,28 @@ window.__ModuleLoader__.load({
22713
22948
  );
22714
22949
  }
22715
22950
  const problem = data.errors.length > 0 ? t("errors.partial", { count: data.errors.length }) : stats.pollError !== null ? t("errors.poll") : null;
22716
- return (0, import_react93.createElement)(
22951
+ return (0, import_react92.createElement)(
22717
22952
  "div",
22718
22953
  { className: "tdb-root" },
22719
- (0, import_react93.createElement)("style", { key: "tdb-styles" }, CSS + BEUI_CSS),
22720
- (0, import_react93.createElement)(
22954
+ (0, import_react92.createElement)("style", { key: "tdb-styles" }, CSS + BEUI_CSS),
22955
+ (0, import_react92.createElement)(
22721
22956
  "div",
22722
22957
  { className: "tdb-scroll" },
22723
- (0, import_react93.createElement)(
22958
+ (0, import_react92.createElement)(
22724
22959
  "div",
22725
22960
  { className: "tdb-container" },
22726
22961
  header(true),
22727
- problem === null ? null : (0, import_react93.createElement)(Notice, { tone: "warn", icon: (0, import_react93.createElement)(AlertIcon, { size: 15 }) }, problem),
22728
- (0, import_react93.createElement)(
22962
+ problem === null ? null : (0, import_react92.createElement)(Notice, { tone: "warn", icon: (0, import_react92.createElement)(AlertIcon, { size: 15 }) }, problem),
22963
+ (0, import_react92.createElement)(
22729
22964
  "div",
22730
22965
  { className: "tdb-surface tdb-surface--pages" },
22731
- (0, import_react93.createElement)(PageTabs, {
22966
+ (0, import_react92.createElement)(PageTabs, {
22732
22967
  items: pageTabs,
22733
22968
  value: page,
22734
22969
  onChange: changePage,
22735
22970
  ariaLabel: t("tabs.label")
22736
22971
  }),
22737
- (0, import_react93.createElement)(
22972
+ (0, import_react92.createElement)(
22738
22973
  "div",
22739
22974
  {
22740
22975
  key: page,
@@ -22743,12 +22978,12 @@ window.__ModuleLoader__.load({
22743
22978
  role: "tabpanel",
22744
22979
  "aria-labelledby": `tdb-tab-${page}`
22745
22980
  },
22746
- page === "overview" ? (0, import_react93.createElement)(
22747
- import_react93.Fragment,
22981
+ page === "overview" ? (0, import_react92.createElement)(
22982
+ import_react92.Fragment,
22748
22983
  {},
22749
- (0, import_react93.createElement)(KpiCards, { data, result: rangeResult, t, intl }),
22750
- (0, import_react93.createElement)("div", { className: "tdb-rule" }),
22751
- (0, import_react93.createElement)(Trends, {
22984
+ (0, import_react92.createElement)(KpiCards, { data, result: rangeResult, t, intl }),
22985
+ (0, import_react92.createElement)("div", { className: "tdb-rule" }),
22986
+ (0, import_react92.createElement)(Trends, {
22752
22987
  data,
22753
22988
  result: rangeResult,
22754
22989
  range,
@@ -22758,18 +22993,24 @@ window.__ModuleLoader__.load({
22758
22993
  t,
22759
22994
  intl
22760
22995
  })
22761
- ) : page === "models" ? (0, import_react93.createElement)(ModelTable, { models: data.models, total: totalTokens(data.totals), t, intl }) : page === "sessions" ? (0, import_react93.createElement)(SessionTable, {
22996
+ ) : page === "models" ? (0, import_react92.createElement)(ModelTable, { models: data.models, total: totalTokens(data.totals), t, intl }) : page === "sessions" ? (0, import_react92.createElement)(SessionTable, {
22762
22997
  rows: data.sessionRows,
22763
22998
  t,
22764
22999
  intl,
22765
23000
  now: now2,
22766
23001
  onSelect: (session) => setSelectedId(session.id)
22767
- }) : page === "requests" ? (0, import_react93.createElement)(RequestLog, {
23002
+ }) : page === "requests" ? (0, import_react92.createElement)(RequestLog, {
22768
23003
  pricing: effectivePricing,
22769
23004
  t,
22770
23005
  intl,
22771
23006
  refreshToken: `${data.revision}:${requestRefresh}`
22772
- }) : (0, import_react93.createElement)(CostPage, {
23007
+ }) : page === "pricing" ? (0, import_react92.createElement)(PricingPage, {
23008
+ models: builtinModels,
23009
+ pricing,
23010
+ defaults: builtinDefaults,
23011
+ t,
23012
+ onSave: savePricing
23013
+ }) : (0, import_react92.createElement)(CostPage, {
22773
23014
  models: data.models,
22774
23015
  pricing: effectivePricing,
22775
23016
  t,
@@ -22781,14 +23022,13 @@ window.__ModuleLoader__.load({
22781
23022
  onRefreshPrices: () => {
22782
23023
  void refreshOnline(data.models);
22783
23024
  },
22784
- onConfigure: () => setPricingOpen(true),
22785
23025
  autoSync: true
22786
23026
  })
22787
23027
  )
22788
23028
  )
22789
23029
  )
22790
23030
  ),
22791
- (0, import_react93.createElement)(SessionDetail, {
23031
+ (0, import_react92.createElement)(SessionDetail, {
22792
23032
  session: selected,
22793
23033
  t,
22794
23034
  intl,
@@ -22797,15 +23037,6 @@ window.__ModuleLoader__.load({
22797
23037
  onOpenSession(id3);
22798
23038
  setSelectedId(null);
22799
23039
  }
22800
- }),
22801
- (0, import_react93.createElement)(PricingEditor, {
22802
- open: pricingOpen,
22803
- models: data.models,
22804
- pricing,
22805
- defaults,
22806
- t,
22807
- onClose: () => setPricingOpen(false),
22808
- onSave: savePricing
22809
23040
  })
22810
23041
  );
22811
23042
  }
@@ -22847,18 +23078,18 @@ window.__ModuleLoader__.load({
22847
23078
  name: "main",
22848
23079
  key: PANEL_ID,
22849
23080
  locale: NS
22850
- }, () => (0, import_react94.createElement)(Dashboard, {
23081
+ }, () => (0, import_react93.createElement)(Dashboard, {
22851
23082
  ...canOpen ? { onOpenSession: openSession } : {}
22852
23083
  })));
22853
23084
  const FooterEntry = (owner = {}) => {
22854
23085
  const language = useLanguage();
22855
23086
  const wide = owner.wide !== false;
22856
23087
  const label2 = (language === "zh" ? zh : en)["panel.title"] ?? "Token usage";
22857
- return (0, import_react94.createElement)(
22858
- import_react94.Fragment,
23088
+ return (0, import_react93.createElement)(
23089
+ import_react93.Fragment,
22859
23090
  {},
22860
- (0, import_react94.createElement)("style", { key: "tdb-footer-style" }, FOOTER_CSS),
22861
- (0, import_react94.createElement)(
23091
+ (0, import_react93.createElement)("style", { key: "tdb-footer-style" }, FOOTER_CSS),
23092
+ (0, import_react93.createElement)(
22862
23093
  "button",
22863
23094
  {
22864
23095
  key: "tdb-footer-button",
@@ -22873,8 +23104,8 @@ window.__ModuleLoader__.load({
22873
23104
  }
22874
23105
  }
22875
23106
  },
22876
- (0, import_react94.createElement)(ChartIcon, { size: wide ? 16 : 18 }),
22877
- wide ? (0, import_react94.createElement)("span", { className: "tdb-footer-action-label" }, label2) : null
23107
+ (0, import_react93.createElement)(ChartIcon, { size: wide ? 16 : 18 }),
23108
+ wide ? (0, import_react93.createElement)("span", { className: "tdb-footer-action-label" }, label2) : null
22878
23109
  )
22879
23110
  );
22880
23111
  };