@openspecui/web 3.1.2 → 3.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.
Files changed (69) hide show
  1. package/dist/assets/CanvasRenderer-DaAtcSpJ.js +1 -0
  2. package/dist/assets/WebGLRenderer-Dw9u4T-1.js +1 -0
  3. package/dist/assets/WebGPURenderer-DZLDcYus.js +1 -0
  4. package/dist/assets/browserAll-DHDY4Lag.js +1 -0
  5. package/dist/assets/{dist-C5LhmGQv.js → dist--kJS10K4.js} +1 -1
  6. package/dist/assets/{dist-BY1C7Mdt.js → dist-B4Ej2z5p.js} +1 -1
  7. package/dist/assets/dist-Bg53DwSg.js +1 -0
  8. package/dist/assets/{dist-CFN6RaSL.js → dist-Bx_btjfU.js} +1 -1
  9. package/dist/assets/{dist-F-FUgDEH.js → dist-CAemHNFv.js} +1 -1
  10. package/dist/assets/dist-CBdQjXWm.js +1 -0
  11. package/dist/assets/{dist-DeUrqbt3.js → dist-Cc4rhz0Q.js} +1 -1
  12. package/dist/assets/dist-CcMtrYGd.js +1 -0
  13. package/dist/assets/{dist-CBEkwgt3.js → dist-ClrYUZj0.js} +1 -1
  14. package/dist/assets/{dist-CqxGwcdL.js → dist-DedlS1Fr.js} +1 -1
  15. package/dist/assets/{dist-DJozOuN7.js → dist-T8yPt5qM.js} +1 -1
  16. package/dist/assets/{dist-Diaa_k73.js → dist-WL830Xdr.js} +1 -1
  17. package/dist/assets/{ghostty-web-CDaaUwy5.js → ghostty-web-DVokbZ5P.js} +1 -1
  18. package/dist/assets/index-BIMvgiBn.css +1 -0
  19. package/dist/assets/{index-Dcy8EgUo.js → index-CEq1CSkJ.js} +146 -146
  20. package/dist/assets/{init-DrdyAVK9.js → init-DxNnipqM.js} +1 -1
  21. package/dist/assets/trpc-BdFwCFp0.js +1 -0
  22. package/dist/assets/webworkerAll-B77YQ4kV.js +1 -0
  23. package/dist/index.html +2 -2
  24. package/dist-ssg/client/.vite/ssr-manifest.json +21 -15
  25. package/dist-ssg/client/assets/CanvasRenderer-DQhD3mh1.js +1 -0
  26. package/dist-ssg/client/assets/WebGLRenderer-BiZDXqzp.js +1 -0
  27. package/dist-ssg/client/assets/WebGPURenderer-D1nI-2Sp.js +1 -0
  28. package/dist-ssg/client/assets/browserAll-BHwk3te6.js +1 -0
  29. package/dist-ssg/client/assets/{dist-DNujtUmO.js → dist-B3BgKjHS.js} +1 -1
  30. package/dist-ssg/client/assets/{dist-BhO2H7OR.js → dist-BatiVkVi.js} +1 -1
  31. package/dist-ssg/client/assets/dist-BbQ3gKhT.js +1 -0
  32. package/dist-ssg/client/assets/{dist-DO8y1bmy.js → dist-Bo53fF5A.js} +1 -1
  33. package/dist-ssg/client/assets/{dist-CveFw6RB.js → dist-BpX6HcAh.js} +1 -1
  34. package/dist-ssg/client/assets/dist-ByDVQI3O.js +1 -0
  35. package/dist-ssg/client/assets/{dist-CutmPbSe.js → dist-CdX5HK1b.js} +1 -1
  36. package/dist-ssg/client/assets/{dist-DIst5rCp.js → dist-D92F7LaW.js} +1 -1
  37. package/dist-ssg/client/assets/dist-De4GFj_M.js +1 -0
  38. package/dist-ssg/client/assets/{dist-Dr_EZjoB.js → dist-QmTcnYGP.js} +1 -1
  39. package/dist-ssg/client/assets/{dist-Bml-zLQW.js → dist-gh87xRoS.js} +1 -1
  40. package/dist-ssg/client/assets/{dist-CPNJ3aGj.js → dist-o5b4RTXe.js} +1 -1
  41. package/dist-ssg/client/assets/{ghostty-web-Dy5PgESC.js → ghostty-web-BfPjk5-h.js} +1 -1
  42. package/dist-ssg/client/assets/index-nIC438iN.css +2 -0
  43. package/dist-ssg/client/assets/{index.ssg-aBliwGpC.js → index.ssg-wxGG39Ri.js} +85 -85
  44. package/dist-ssg/client/assets/{init-DVEXKLT1.js → init-DnDCMdRA.js} +1 -1
  45. package/dist-ssg/client/assets/trpc-JLvkwF5N.js +1 -0
  46. package/dist-ssg/client/assets/webworkerAll-VgzZQ1wt.js +1 -0
  47. package/dist-ssg/client/index.ssg.html +2 -2
  48. package/dist-ssg/server/entry-server.js +290 -59
  49. package/package.json +1 -1
  50. package/dist/assets/CanvasRenderer-GMVoqlzn.js +0 -1
  51. package/dist/assets/WebGLRenderer-k-Z8pjlp.js +0 -1
  52. package/dist/assets/WebGPURenderer-C_8mniec.js +0 -1
  53. package/dist/assets/browserAll-BWYXp-f3.js +0 -1
  54. package/dist/assets/dist-B3ZlOYLU.js +0 -1
  55. package/dist/assets/dist-BCywbLgf.js +0 -1
  56. package/dist/assets/dist-BhjA24BR.js +0 -1
  57. package/dist/assets/index-CuBLKe7j.css +0 -1
  58. package/dist/assets/trpc-DxYD5MvM.js +0 -1
  59. package/dist/assets/webworkerAll-COGBf_rl.js +0 -1
  60. package/dist-ssg/client/assets/CanvasRenderer-B7-UHo7l.js +0 -1
  61. package/dist-ssg/client/assets/WebGLRenderer-1dzTO98s.js +0 -1
  62. package/dist-ssg/client/assets/WebGPURenderer-e46qYwvA.js +0 -1
  63. package/dist-ssg/client/assets/browserAll-9vMZEjlX.js +0 -1
  64. package/dist-ssg/client/assets/dist-5GS8V85g.js +0 -1
  65. package/dist-ssg/client/assets/dist-B-kSGqm_.js +0 -1
  66. package/dist-ssg/client/assets/dist-BeJow-i0.js +0 -1
  67. package/dist-ssg/client/assets/index-CVQW5ffN.css +0 -2
  68. package/dist-ssg/client/assets/trpc-DJg1omNa.js +0 -1
  69. package/dist-ssg/client/assets/webworkerAll-DfQd5wx2.js +0 -1
@@ -1 +1 @@
1
- import{it as e}from"./Geometry-CNDxiJq_.js";import{a as t,i as n}from"./index.ssg-aBliwGpC.js";e.add(n),e.add(t);
1
+ import{it as e}from"./Geometry-CNDxiJq_.js";import{a as t,i as n}from"./index.ssg-wxGG39Ri.js";e.add(n),e.add(t);
@@ -0,0 +1 @@
1
+ import{F as e}from"./index.ssg-wxGG39Ri.js";export{e as trpcClient};
@@ -0,0 +1 @@
1
+ import"./Geometry-CNDxiJq_.js";import"./index.ssg-wxGG39Ri.js";import"./init-DnDCMdRA.js";
@@ -35,7 +35,7 @@
35
35
  document.head.append(preconnectApi, preconnectStatic, stylesheet)
36
36
  })()
37
37
  </script>
38
- <script type="module" crossorigin src="/assets/index.ssg-aBliwGpC.js"></script>
38
+ <script type="module" crossorigin src="/assets/index.ssg-wxGG39Ri.js"></script>
39
39
  <link rel="modulepreload" crossorigin href="/assets/chunk-DECur_0Z.js">
40
40
  <link rel="modulepreload" crossorigin href="/assets/dist-QUHuPJsA.js">
41
41
  <link rel="modulepreload" crossorigin href="/assets/dist-BGaHY1kO.js">
@@ -45,7 +45,7 @@
45
45
  <link rel="modulepreload" crossorigin href="/assets/getTextureBatchBindGroup-CqvclRGr.js">
46
46
  <link rel="modulepreload" crossorigin href="/assets/BufferResource-DKNednNt.js">
47
47
  <link rel="modulepreload" crossorigin href="/assets/ImageSource-DsthkIsU.js">
48
- <link rel="stylesheet" crossorigin href="/assets/index-CVQW5ffN.css">
48
+ <link rel="stylesheet" crossorigin href="/assets/index-nIC438iN.css">
49
49
  </head>
50
50
  <body>
51
51
  <div id="root"><!--app-html--></div>
@@ -46424,6 +46424,9 @@ async function getConfig$1() {
46424
46424
  cursorBlink: true,
46425
46425
  cursorStyle: "block",
46426
46426
  scrollback: 1e3,
46427
+ useTheme: "app",
46428
+ lightTheme: "default-light",
46429
+ darkTheme: "default-dark",
46427
46430
  rendererEngine: "xterm"
46428
46431
  }
46429
46432
  };
@@ -84158,7 +84161,7 @@ var tabsStyleText = (id) => {
84158
84161
  transform: scaleX(0.5);
84159
84162
  }
84160
84163
 
84161
- #${id} .tabs-strip {
84164
+ #${id}[data-tabs-strip-decoration='on'] .tabs-strip {
84162
84165
  background-image: linear-gradient(
84163
84166
  to bottom,
84164
84167
  transparent,
@@ -84189,7 +84192,7 @@ function buildStableContentTabIds(previousTabIds, currentTabIds) {
84189
84192
  * Hidden tabs are pre-rendered at lower priority and preserve their state.
84190
84193
  * Supports both controlled and uncontrolled active tab.
84191
84194
  */
84192
- function TabsImpl({ tabs, selectedTab: controlled, onTabChange, onTabClose, onTabOrderChange, actions, onTabBarDoubleClick, className = "", variant = "default" }, ref) {
84195
+ function TabsImpl({ tabs, selectedTab: controlled, onTabChange, onTabClose, onTabOrderChange, actions, onTabBarDoubleClick, className = "", classNames, showHeaderShell = true, showSelectionIndicator = true, decorateStrip = true }, ref) {
84193
84196
  const [uncontrolled, setUncontrolled] = (0, import_react.useState)(tabs[0]?.id ?? "");
84194
84197
  const [dropIndicator, setDropIndicator] = (0, import_react.useState)(null);
84195
84198
  const dropIndicatorRef = (0, import_react.useRef)(null);
@@ -84243,7 +84246,7 @@ function TabsImpl({ tabs, selectedTab: controlled, onTabChange, onTabClose, onTa
84243
84246
  const header = headerRef.current;
84244
84247
  const activeTrigger = activeTab ? triggerRefs.current.get(activeTab) : null;
84245
84248
  if (!indicator) return;
84246
- if (variant !== "default" || !header || !activeTrigger) {
84249
+ if (!showSelectionIndicator || !header || !activeTrigger) {
84247
84250
  indicator.style.opacity = "0";
84248
84251
  indicator.style.width = "0px";
84249
84252
  indicator.style.height = "0px";
@@ -84256,12 +84259,12 @@ function TabsImpl({ tabs, selectedTab: controlled, onTabChange, onTabClose, onTa
84256
84259
  indicator.style.width = `${triggerRect.width}px`;
84257
84260
  indicator.style.height = `${triggerRect.height}px`;
84258
84261
  indicator.style.transform = `translate(${triggerRect.left - headerRect.left}px, ${triggerRect.top - headerRect.top}px)`;
84259
- }, [activeTab, variant]);
84262
+ }, [activeTab, showSelectionIndicator]);
84260
84263
  (0, import_react.useLayoutEffect)(() => {
84261
84264
  syncSelectionIndicator();
84262
84265
  }, [syncSelectionIndicator, tabLayoutSignature]);
84263
84266
  (0, import_react.useLayoutEffect)(() => {
84264
- if (variant !== "default") return;
84267
+ if (!showSelectionIndicator) return;
84265
84268
  const tabsButton = tabsButtonRef.current;
84266
84269
  if (!tabsButton) return;
84267
84270
  const handleScroll = () => {
@@ -84284,9 +84287,9 @@ function TabsImpl({ tabs, selectedTab: controlled, onTabChange, onTabClose, onTa
84284
84287
  };
84285
84288
  }, [
84286
84289
  activeTab,
84290
+ showSelectionIndicator,
84287
84291
  syncSelectionIndicator,
84288
- tabLayoutSignature,
84289
- variant
84292
+ tabLayoutSignature
84290
84293
  ]);
84291
84294
  const handleChange = (id) => {
84292
84295
  if (!controlled) setUncontrolled(id);
@@ -84367,13 +84370,19 @@ function TabsImpl({ tabs, selectedTab: controlled, onTabChange, onTabClose, onTa
84367
84370
  event.dataTransfer.dropEffect = "move";
84368
84371
  }, [reorderable]);
84369
84372
  if (tabs.length === 0) return null;
84370
- const headerClassName = variant === "terminal" ? "tabs-header bg-terminal text-terminal-foreground sticky top-0 z-20 flex min-w-0 items-stretch" : "tabs-header relative sticky top-0 z-20 min-w-0";
84371
- const stripClassName = variant === "terminal" ? "tabs-strip min-w-0 flex-1 bg-terminal px-4" : "tabs-strip min-w-0 flex-1 rounded-l-md px-4";
84372
- const listClassName = variant === "terminal" ? "tabs-button scrollbar-none flex min-w-0 gap-1 overflow-x-auto pt-2" : "tabs-button scrollbar-none flex min-w-0 gap-1 overflow-x-auto";
84373
- const buttonBaseClassName = `group relative z-10 m-0 flex h-full shrink-0 items-center gap-2 px-2 text-sm font-medium transition-colors ${variant === "terminal" ? "rounded-t-[8px] py-1" : "py-2"}`;
84374
- const activeButtonClassName = variant === "terminal" ? "tab-selected bg-background text-foreground" : "tab-selected text-foreground";
84375
- const inactiveButtonClassName = variant === "terminal" ? "bg-terminal text-terminal-foreground/80 hover:bg-terminal hover:text-terminal-foreground" : "text-muted-foreground hover:bg-background/35 hover:text-foreground";
84376
- const actionsClassName = variant === "terminal" ? "tabs-actions border-border bg-terminal text-terminal-foreground flex shrink-0 items-center border-b px-1" : "tabs-actions border-zinc-500/15 flex shrink-0 items-center rounded-r-md border-l px-1";
84373
+ const headerClassName = cn$1("tabs-header relative sticky top-0 z-20 flex min-w-0 items-stretch", classNames?.header);
84374
+ const headerShellClassName = cn$1("tabs-header-shell bg-card/95 pointer-events-none absolute inset-0 z-0 rounded-md border border-zinc-500/15 shadow-[inset_0_-1px_0_color-mix(in_srgb,var(--border)_85%,transparent)] backdrop-blur-sm", classNames?.headerShell);
84375
+ const headerForegroundClassName = cn$1("tabs-header-foreground relative z-20 flex min-w-0 items-stretch", classNames?.headerForeground);
84376
+ const stripClassName = cn$1("tabs-strip flex min-w-0 flex-1 items-stretch rounded-l-md px-4", classNames?.strip);
84377
+ const listClassName = cn$1("tabs-button scrollbar-none flex min-w-0 flex-1 gap-1 overflow-x-auto", classNames?.list);
84378
+ const buttonBaseClassName = cn$1("group relative z-10 m-0 flex h-full shrink-0 px-2 py-2 text-sm font-medium transition-colors", classNames?.buttonBase);
84379
+ const buttonInnerClassName = cn$1("inline-flex h-full items-center gap-2", classNames?.buttonInner);
84380
+ const activeButtonClassName = cn$1("tab-selected text-foreground", classNames?.activeButton);
84381
+ const inactiveButtonClassName = cn$1("text-muted-foreground hover:bg-background/35 hover:text-foreground", classNames?.inactiveButton);
84382
+ const activeButtonInnerClassName = cn$1(classNames?.activeButtonInner);
84383
+ const inactiveButtonInnerClassName = cn$1(classNames?.inactiveButtonInner);
84384
+ const actionsClassName = cn$1("tabs-actions border-zinc-500/15 flex shrink-0 items-center rounded-r-md border-l px-1 h-full", classNames?.actions);
84385
+ const selectionIndicatorClassName = cn$1("tabs-selection-indicator border-primary bg-background/70 duration-280 absolute left-0 top-0 border-b-4 opacity-0 transition-[transform,width,height,opacity] ease-[cubic-bezier(0.22,1,0.36,1)]", classNames?.selectionIndicator);
84377
84386
  const handleTabBarDoubleClick = (event) => {
84378
84387
  if (!onTabBarDoubleClick) return;
84379
84388
  if (event.target.closest("[data-tab-item=\"true\"]")) return;
@@ -84381,7 +84390,7 @@ function TabsImpl({ tabs, selectedTab: controlled, onTabChange, onTabClose, onTa
84381
84390
  };
84382
84391
  const tabButtons = tabs.map((tab) => {
84383
84392
  const dragIndicatorStyle = dropIndicator?.tabId === tab.id ? { boxShadow: dropIndicator.position === "before" ? "inset 2px 0 0 var(--border)" : "inset -2px 0 0 var(--border)" } : void 0;
84384
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("button", {
84393
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
84385
84394
  ref: (element) => {
84386
84395
  triggerRefs.current.set(tab.id, element);
84387
84396
  },
@@ -84395,56 +84404,60 @@ function TabsImpl({ tabs, selectedTab: controlled, onTabChange, onTabClose, onTa
84395
84404
  onDrop: (event) => handleItemDrop(event, tab.id),
84396
84405
  className: `${buttonBaseClassName} ${activeTab === tab.id ? activeButtonClassName : inactiveButtonClassName} ${reorderable ? "cursor-grab active:cursor-grabbing" : ""}`,
84397
84406
  style: dragIndicatorStyle,
84398
- children: [
84399
- tab.icon,
84400
- tab.label,
84401
- tab.closable && onTabClose && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
84402
- role: "button",
84403
- tabIndex: 0,
84404
- onClick: (event) => {
84405
- event.stopPropagation();
84406
- onTabClose(tab.id);
84407
- },
84408
- onKeyDown: (event) => {
84409
- if (event.key === "Enter" || event.key === " ") {
84407
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
84408
+ "data-tabs-button-inner": "true",
84409
+ className: `${buttonInnerClassName} ${activeTab === tab.id ? activeButtonInnerClassName : inactiveButtonInnerClassName}`,
84410
+ children: [
84411
+ tab.icon,
84412
+ tab.label,
84413
+ tab.closable && onTabClose && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
84414
+ role: "button",
84415
+ tabIndex: 0,
84416
+ onClick: (event) => {
84410
84417
  event.stopPropagation();
84411
84418
  onTabClose(tab.id);
84412
- }
84413
- },
84414
- draggable: false,
84415
- className: `hover:text-foreground -mr-1 rounded p-0.5 transition ${tab.closeButtonVisibility === "always" ? "opacity-100" : "opacity-0 group-hover:opacity-100 [button:hover>&]:opacity-100"} ${activeTab === tab.id ? "text-current/80" : "text-muted-foreground"}`,
84416
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(X$2, { className: "h-3 w-3" })
84417
- })
84418
- ]
84419
+ },
84420
+ onKeyDown: (event) => {
84421
+ if (event.key === "Enter" || event.key === " ") {
84422
+ event.stopPropagation();
84423
+ onTabClose(tab.id);
84424
+ }
84425
+ },
84426
+ draggable: false,
84427
+ className: `-mr-1 rounded p-0.5 transition ${tab.closeButtonVisibility === "always" ? "opacity-100" : "opacity-0 group-hover:opacity-100 [button:hover>&]:opacity-100"} ${activeTab === tab.id ? cn$1("text-current/80 hover:text-foreground", classNames?.closeButtonActive) : cn$1("text-muted-foreground hover:text-foreground", classNames?.closeButtonInactive)}`,
84428
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(X$2, { className: "h-3 w-3" })
84429
+ })
84430
+ ]
84431
+ })
84419
84432
  }, tab.id);
84420
84433
  });
84421
84434
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
84422
84435
  id,
84423
84436
  ref: rootRef,
84424
- "data-tabs-variant": variant,
84437
+ "data-tabs-strip-decoration": decorateStrip ? "on" : "off",
84425
84438
  className: `relative isolate flex min-h-0 min-w-0 flex-1 flex-col ${className}`,
84426
84439
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
84427
84440
  ref: headerRef,
84428
84441
  className: headerClassName,
84429
- children: variant === "default" ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
84430
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
84442
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
84443
+ showHeaderShell && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
84431
84444
  ref: headerShellRef,
84432
84445
  "data-tabs-header-shell": "true",
84433
- className: "tabs-header-shell bg-card/95 pointer-events-none absolute inset-0 z-0 rounded-md border border-zinc-500/15 shadow-[inset_0_-1px_0_color-mix(in_srgb,var(--border)_85%,transparent)] backdrop-blur-sm"
84446
+ className: headerShellClassName
84434
84447
  }),
84435
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
84448
+ showSelectionIndicator && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
84436
84449
  className: "pointer-events-none absolute inset-0 z-10",
84437
84450
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
84438
84451
  ref: selectionIndicatorRef,
84439
84452
  "data-tabs-selection-indicator": "true",
84440
84453
  "aria-hidden": "true",
84441
- className: "tabs-selection-indicator border-primary bg-background/70 duration-280 absolute left-0 top-0 rounded-md border-b-2 opacity-0 shadow-[inset_0_-1px_0_color-mix(in_srgb,var(--border)_85%,transparent)] transition-[transform,width,height,opacity] ease-[cubic-bezier(0.22,1,0.36,1)]"
84454
+ className: selectionIndicatorClassName
84442
84455
  })
84443
84456
  }),
84444
84457
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
84445
84458
  ref: headerForegroundRef,
84446
84459
  "data-tabs-header-foreground": "true",
84447
- className: "tabs-header-foreground relative z-20 flex min-w-0 items-stretch",
84460
+ className: headerForegroundClassName,
84448
84461
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
84449
84462
  className: stripClassName,
84450
84463
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
@@ -84461,21 +84474,7 @@ function TabsImpl({ tabs, selectedTab: controlled, onTabChange, onTabClose, onTa
84461
84474
  children: actions
84462
84475
  })]
84463
84476
  })
84464
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
84465
- className: stripClassName,
84466
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
84467
- ref: tabsButtonRef,
84468
- className: listClassName,
84469
- onDoubleClick: handleTabBarDoubleClick,
84470
- onDragOver: handleListDragOver,
84471
- onDrop: handleListDrop,
84472
- children: tabButtons
84473
- })
84474
- }), actions && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
84475
- "data-tabs-actions": "true",
84476
- className: actionsClassName,
84477
- children: actions
84478
- })] })
84477
+ ] })
84479
84478
  }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
84480
84479
  className: "relative flex min-h-0 flex-1 overflow-hidden",
84481
84480
  children: contentTabs.map((tab) => tab.unmountOnHide ? activeTab === tab.id && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
@@ -144781,6 +144780,194 @@ var TerminalInputHistoryStore = class {
144781
144780
  }
144782
144781
  };
144783
144782
  //#endregion
144783
+ //#region src/lib/terminal-theme.ts
144784
+ var TERMINAL_THEME_REGISTRY = {
144785
+ "default-light": {
144786
+ id: "default-light",
144787
+ label: "Default Light",
144788
+ modeHint: "light",
144789
+ palette: {
144790
+ background: "#f6f5f2",
144791
+ foreground: "#1b1b1b",
144792
+ cursor: "#ea580c",
144793
+ cursorAccent: "#f6f5f2",
144794
+ selectionBackground: "rgba(234, 88, 12, 0.22)",
144795
+ black: "#111111",
144796
+ red: "#b91c1c",
144797
+ green: "#15803d",
144798
+ yellow: "#a16207",
144799
+ blue: "#1d4ed8",
144800
+ magenta: "#a21caf",
144801
+ cyan: "#0f766e",
144802
+ white: "#f6f5f2",
144803
+ brightBlack: "#4b5563",
144804
+ brightRed: "#dc2626",
144805
+ brightGreen: "#16a34a",
144806
+ brightYellow: "#ca8a04",
144807
+ brightBlue: "#2563eb",
144808
+ brightMagenta: "#c026d3",
144809
+ brightCyan: "#0891b2",
144810
+ brightWhite: "#ffffff"
144811
+ }
144812
+ },
144813
+ "default-dark": {
144814
+ id: "default-dark",
144815
+ label: "Default Dark",
144816
+ modeHint: "dark",
144817
+ palette: {
144818
+ background: "#141414",
144819
+ foreground: "#e5dfd2",
144820
+ cursor: "#f97316",
144821
+ cursorAccent: "#141414",
144822
+ selectionBackground: "rgba(249, 115, 22, 0.28)",
144823
+ black: "#151515",
144824
+ red: "#f87171",
144825
+ green: "#4ade80",
144826
+ yellow: "#facc15",
144827
+ blue: "#60a5fa",
144828
+ magenta: "#e879f9",
144829
+ cyan: "#67e8f9",
144830
+ white: "#f4f1ea",
144831
+ brightBlack: "#6b7280",
144832
+ brightRed: "#fca5a5",
144833
+ brightGreen: "#86efac",
144834
+ brightYellow: "#fde047",
144835
+ brightBlue: "#93c5fd",
144836
+ brightMagenta: "#f0abfc",
144837
+ brightCyan: "#a5f3fc",
144838
+ brightWhite: "#fffdf8"
144839
+ }
144840
+ },
144841
+ monokai: {
144842
+ id: "monokai",
144843
+ label: "Monokai",
144844
+ modeHint: "either",
144845
+ palette: {
144846
+ background: "#272822",
144847
+ foreground: "#f8f8f2",
144848
+ cursor: "#f8f8f0",
144849
+ cursorAccent: "#272822",
144850
+ selectionBackground: "rgba(73, 72, 62, 0.9)",
144851
+ black: "#272822",
144852
+ red: "#f92672",
144853
+ green: "#a6e22e",
144854
+ yellow: "#f4bf75",
144855
+ blue: "#66d9ef",
144856
+ magenta: "#ae81ff",
144857
+ cyan: "#a1efe4",
144858
+ white: "#f8f8f2",
144859
+ brightBlack: "#75715e",
144860
+ brightRed: "#f92672",
144861
+ brightGreen: "#a6e22e",
144862
+ brightYellow: "#f4bf75",
144863
+ brightBlue: "#66d9ef",
144864
+ brightMagenta: "#ae81ff",
144865
+ brightCyan: "#a1efe4",
144866
+ brightWhite: "#f9f8f5"
144867
+ }
144868
+ },
144869
+ nord: {
144870
+ id: "nord",
144871
+ label: "Nord",
144872
+ modeHint: "either",
144873
+ palette: {
144874
+ background: "#2e3440",
144875
+ foreground: "#d8dee9",
144876
+ cursor: "#88c0d0",
144877
+ cursorAccent: "#2e3440",
144878
+ selectionBackground: "rgba(94, 129, 172, 0.38)",
144879
+ black: "#3b4252",
144880
+ red: "#bf616a",
144881
+ green: "#a3be8c",
144882
+ yellow: "#ebcb8b",
144883
+ blue: "#81a1c1",
144884
+ magenta: "#b48ead",
144885
+ cyan: "#88c0d0",
144886
+ white: "#e5e9f0",
144887
+ brightBlack: "#4c566a",
144888
+ brightRed: "#d08770",
144889
+ brightGreen: "#8fbcbb",
144890
+ brightYellow: "#eceff4",
144891
+ brightBlue: "#5e81ac",
144892
+ brightMagenta: "#b48ead",
144893
+ brightCyan: "#8fbcbb",
144894
+ brightWhite: "#eceff4"
144895
+ }
144896
+ },
144897
+ "solarized-light": {
144898
+ id: "solarized-light",
144899
+ label: "Solarized Light",
144900
+ modeHint: "light",
144901
+ palette: {
144902
+ background: "#fdf6e3",
144903
+ foreground: "#586e75",
144904
+ cursor: "#cb4b16",
144905
+ cursorAccent: "#fdf6e3",
144906
+ selectionBackground: "rgba(147, 161, 161, 0.32)",
144907
+ black: "#073642",
144908
+ red: "#dc322f",
144909
+ green: "#859900",
144910
+ yellow: "#b58900",
144911
+ blue: "#268bd2",
144912
+ magenta: "#d33682",
144913
+ cyan: "#2aa198",
144914
+ white: "#eee8d5",
144915
+ brightBlack: "#657b83",
144916
+ brightRed: "#cb4b16",
144917
+ brightGreen: "#93a1a1",
144918
+ brightYellow: "#839496",
144919
+ brightBlue: "#6c71c4",
144920
+ brightMagenta: "#d33682",
144921
+ brightCyan: "#2aa198",
144922
+ brightWhite: "#fdf6e3"
144923
+ }
144924
+ },
144925
+ "solarized-dark": {
144926
+ id: "solarized-dark",
144927
+ label: "Solarized Dark",
144928
+ modeHint: "dark",
144929
+ palette: {
144930
+ background: "#002b36",
144931
+ foreground: "#93a1a1",
144932
+ cursor: "#cb4b16",
144933
+ cursorAccent: "#002b36",
144934
+ selectionBackground: "rgba(88, 110, 117, 0.5)",
144935
+ black: "#073642",
144936
+ red: "#dc322f",
144937
+ green: "#859900",
144938
+ yellow: "#b58900",
144939
+ blue: "#268bd2",
144940
+ magenta: "#d33682",
144941
+ cyan: "#2aa198",
144942
+ white: "#eee8d5",
144943
+ brightBlack: "#657b83",
144944
+ brightRed: "#cb4b16",
144945
+ brightGreen: "#586e75",
144946
+ brightYellow: "#657b83",
144947
+ brightBlue: "#839496",
144948
+ brightMagenta: "#6c71c4",
144949
+ brightCyan: "#93a1a1",
144950
+ brightWhite: "#fdf6e3"
144951
+ }
144952
+ }
144953
+ };
144954
+ function resolveTerminalThemeMode(input) {
144955
+ const mode = input.useTheme ?? "app";
144956
+ if (mode === "light") return "light";
144957
+ if (mode === "dark") return "dark";
144958
+ if (mode === "system") return input.systemDarkMode ? "dark" : "light";
144959
+ return input.appDarkMode ? "dark" : "light";
144960
+ }
144961
+ function resolveTerminalTheme(input) {
144962
+ const mode = resolveTerminalThemeMode(input);
144963
+ const id = mode === "dark" ? input.darkTheme ?? "default-dark" : input.lightTheme ?? "default-light";
144964
+ return {
144965
+ id,
144966
+ mode,
144967
+ definition: TERMINAL_THEME_REGISTRY[id]
144968
+ };
144969
+ }
144970
+ //#endregion
144784
144971
  //#region src/lib/terminal-controller.ts
144785
144972
  var DEFAULT_FONT_FAMILY = "ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, monospace";
144786
144973
  var DEFAULT_TERMINAL_CONFIG = {
@@ -144789,6 +144976,9 @@ var DEFAULT_TERMINAL_CONFIG = {
144789
144976
  cursorBlink: true,
144790
144977
  cursorStyle: "block",
144791
144978
  scrollback: 1e3,
144979
+ useTheme: "app",
144980
+ lightTheme: "default-light",
144981
+ darkTheme: "default-dark",
144792
144982
  rendererEngine: "xterm"
144793
144983
  };
144794
144984
  var OUTPUT_IDLE_THRESHOLD = 1500;
@@ -144876,6 +145066,15 @@ var TerminalController = class {
144876
145066
  inputHistoryStore = new TerminalInputHistoryStore();
144877
145067
  ghosttyModule = null;
144878
145068
  ghosttyInitPromise = null;
145069
+ appDarkMode = false;
145070
+ systemDarkMode = false;
145071
+ resolvedTheme = resolveTerminalTheme({
145072
+ useTheme: DEFAULT_TERMINAL_CONFIG.useTheme,
145073
+ lightTheme: DEFAULT_TERMINAL_CONFIG.lightTheme,
145074
+ darkTheme: DEFAULT_TERMINAL_CONFIG.darkTheme,
145075
+ appDarkMode: false,
145076
+ systemDarkMode: false
145077
+ });
144879
145078
  ws = null;
144880
145079
  wsConnected = false;
144881
145080
  reconnectTimer = null;
@@ -144963,13 +145162,20 @@ var TerminalController = class {
144963
145162
  };
144964
145163
  }
144965
145164
  getTerminalOptions() {
145165
+ const resolvedTheme = resolveTerminalTheme({
145166
+ useTheme: this.config.useTheme,
145167
+ lightTheme: this.config.lightTheme,
145168
+ darkTheme: this.config.darkTheme,
145169
+ appDarkMode: this.appDarkMode,
145170
+ systemDarkMode: this.systemDarkMode
145171
+ });
144966
145172
  return {
144967
145173
  cursorBlink: this.config.cursorBlink,
144968
145174
  cursorStyle: this.config.cursorStyle,
144969
145175
  fontSize: this.config.fontSize,
144970
145176
  fontFamily: DEFAULT_FONT_FAMILY,
144971
- theme: { background: "transparent" },
144972
- allowTransparency: true,
145177
+ theme: resolvedTheme.definition.palette,
145178
+ allowTransparency: false,
144973
145179
  convertEol: true,
144974
145180
  macOptionIsMeta: true,
144975
145181
  macOptionClickForcesSelection: true,
@@ -145024,8 +145230,8 @@ var TerminalController = class {
145024
145230
  }
145025
145231
  applyGhosttyBackground(instance, container) {
145026
145232
  if (instance.rendererEngine !== "ghostty") return;
145027
- const background = this.resolveNearestOpaqueBackground(container);
145028
145233
  const currentTheme = instance.terminal.options.theme ?? {};
145234
+ const background = typeof currentTheme.background === "string" && currentTheme.background.trim().length > 0 ? currentTheme.background : this.resolveNearestOpaqueBackground(container);
145029
145235
  instance.terminal.options.allowTransparency = false;
145030
145236
  instance.terminal.options.theme = {
145031
145237
  ...currentTheme,
@@ -145285,6 +145491,15 @@ var TerminalController = class {
145285
145491
  getConfig() {
145286
145492
  return { ...this.config };
145287
145493
  }
145494
+ getResolvedTheme() {
145495
+ return this.resolvedTheme;
145496
+ }
145497
+ setThemeContext(input) {
145498
+ if (!(this.appDarkMode !== input.appDarkMode || this.systemDarkMode !== input.systemDarkMode)) return;
145499
+ this.appDarkMode = input.appDarkMode;
145500
+ this.systemDarkMode = input.systemDarkMode;
145501
+ this.refreshResolvedTheme();
145502
+ }
145288
145503
  applyConfig(config) {
145289
145504
  const { rendererEngine, ...restConfig } = config;
145290
145505
  Object.assign(this.config, restConfig);
@@ -145295,12 +145510,28 @@ var TerminalController = class {
145295
145510
  t.options.cursorStyle = this.config.cursorStyle;
145296
145511
  t.options.scrollback = this.config.scrollback;
145297
145512
  }
145513
+ this.refreshResolvedTheme();
145298
145514
  this._applyFonts();
145299
145515
  if (rendererEngine && rendererEngine !== this.config.rendererEngine) this.setRendererEngine(rendererEngine).catch((error) => {
145300
145516
  console.error("[terminal] failed to switch renderer engine:", error);
145301
145517
  });
145302
145518
  this.notify();
145303
145519
  }
145520
+ refreshResolvedTheme() {
145521
+ const resolvedTheme = resolveTerminalTheme({
145522
+ useTheme: this.config.useTheme,
145523
+ lightTheme: this.config.lightTheme,
145524
+ darkTheme: this.config.darkTheme,
145525
+ appDarkMode: this.appDarkMode,
145526
+ systemDarkMode: this.systemDarkMode
145527
+ });
145528
+ this.resolvedTheme = resolvedTheme;
145529
+ for (const instance of this.instances.values()) {
145530
+ instance.terminal.options.theme = resolvedTheme.definition.palette;
145531
+ instance.terminal.options.allowTransparency = false;
145532
+ if (instance.mountedContainer) this.applyGhosttyBackground(instance, instance.mountedContainer);
145533
+ }
145534
+ }
145304
145535
  async _applyFonts() {
145305
145536
  const raw = this.config.fontFamily;
145306
145537
  if (!raw) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openspecui/web",
3
- "version": "3.1.2",
3
+ "version": "3.2.1",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "openspecui-ssg": "./dist-ssg/ssg-cli.mjs"
@@ -1 +0,0 @@
1
- import"./Geometry-CNDxiJq_.js";import{r as e}from"./index-Dcy8EgUo.js";export{e as CanvasRenderer};
@@ -1 +0,0 @@
1
- import"./Geometry-CNDxiJq_.js";import{n as e}from"./index-Dcy8EgUo.js";export{e as WebGLRenderer};
@@ -1 +0,0 @@
1
- import"./Geometry-CNDxiJq_.js";import{t as e}from"./index-Dcy8EgUo.js";export{e as WebGPURenderer};
@@ -1 +0,0 @@
1
- import{it as e,x as t}from"./Geometry-CNDxiJq_.js";import{c as n,l as r,o as i,s as a}from"./index-Dcy8EgUo.js";import"./init-DrdyAVK9.js";e.add(r),e.mixin(t,n),e.add(a),e.mixin(t,i);
@@ -1 +0,0 @@
1
- import"./dist-QUHuPJsA.js";import{k as e}from"./index-Dcy8EgUo.js";export{e as json};
@@ -1 +0,0 @@
1
- import"./dist-QUHuPJsA.js";import{T as e}from"./index-Dcy8EgUo.js";export{e as css};
@@ -1 +0,0 @@
1
- import"./dist-QUHuPJsA.js";import{u as e}from"./index-Dcy8EgUo.js";export{e as yaml};