@tscircuit/runframe 0.0.559 → 0.0.561

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.
@@ -1105,7 +1105,7 @@ var RenderLogViewer = ({
1105
1105
  };
1106
1106
 
1107
1107
  // package.json
1108
- var version = "0.0.558";
1108
+ var version = "0.0.560";
1109
1109
 
1110
1110
  // lib/components/CircuitJsonPreview/CircuitJsonPreview.tsx
1111
1111
  import { jsx as jsx16, jsxs as jsxs12 } from "react/jsx-runtime";
@@ -1146,7 +1146,8 @@ var CircuitJsonPreview = ({
1146
1146
  autoRotate3dViewerDisabled,
1147
1147
  showSchematicDebugGrid = false,
1148
1148
  showToggleFullScreen = true,
1149
- defaultToFullScreen = false
1149
+ defaultToFullScreen = false,
1150
+ activeEffectName
1150
1151
  }) => {
1151
1152
  useStyles();
1152
1153
  const circuitJsonErrors = useMemo2(() => {
@@ -1213,7 +1214,7 @@ var CircuitJsonPreview = ({
1213
1214
  !leftHeaderContent && isRunningCode && /* @__PURE__ */ jsx16(Loader2, { className: "rf-w-4 rf-h-4 rf-animate-spin" }),
1214
1215
  !leftHeaderContent && /* @__PURE__ */ jsx16("div", { className: "rf-flex-grow" }),
1215
1216
  renderLog && renderLog.progress !== 1 && !errorMessage && /* @__PURE__ */ jsxs12("div", { className: "rf-flex rf-items-center rf-gap-2", children: [
1216
- renderLog.lastRenderEvent && /* @__PURE__ */ jsx16("div", { className: "rf-text-xs rf-text-gray-500", children: renderLog.lastRenderEvent?.phase ?? "" }),
1217
+ activeEffectName ? /* @__PURE__ */ jsx16("div", { className: "rf-text-xs rf-text-gray-500", children: activeEffectName }) : renderLog.lastRenderEvent && /* @__PURE__ */ jsx16("div", { className: "rf-text-xs rf-text-gray-500", children: renderLog.lastRenderEvent?.phase ?? "" }),
1217
1218
  /* @__PURE__ */ jsx16("div", { className: "rf-w-4 rf-h-4 rf-bg-blue-500 rf-opacity-50 rf-rounded-full rf-text-white", children: /* @__PURE__ */ jsx16(LoaderCircleIcon, { className: "rf-w-4 rf-h-4 rf-animate-spin" }) }),
1218
1219
  /* @__PURE__ */ jsxs12("div", { className: "rf-text-xs rf-font-bold rf-text-gray-700 rf-tabular-nums", children: [
1219
1220
  ((renderLog.progress ?? 0) * 100).toFixed(1),
package/dist/preview.d.ts CHANGED
@@ -67,6 +67,10 @@ interface PreviewContentProps {
67
67
  hasCodeChangedSinceLastRun?: boolean;
68
68
  defaultActiveTab?: TabId;
69
69
  renderLog?: RenderLog | null;
70
+ /**
71
+ * Name of the currently running async effect from @tscircuit/core, if any
72
+ */
73
+ activeEffectName?: string;
70
74
  onEditEvent?: (editEvent: ManualEditEvent) => void;
71
75
  editEvents?: ManualEditEvent[];
72
76
  onActiveTabChange?: (tab: TabId) => any;
@@ -83,7 +87,7 @@ declare global {
83
87
  }
84
88
  }
85
89
 
86
- declare const CircuitJsonPreview: ({ code, onRunClicked, errorMessage, errorStack, circuitJson, autoroutingGraphics, showRightHeaderContent, showCodeTab, codeTabContent, showJsonTab, showRenderLogTab, onActiveTabChange, renderLog, showImportAndFormatButtons, className, headerClassName, leftHeaderContent, readOnly, isStreaming, autoroutingLog, onReportAutoroutingLog, isRunningCode, hasCodeChangedSinceLastRun, onEditEvent, editEvents, defaultActiveTab, autoRotate3dViewerDisabled, showSchematicDebugGrid, showToggleFullScreen, defaultToFullScreen, }: PreviewContentProps) => react_jsx_runtime.JSX.Element;
90
+ declare const CircuitJsonPreview: ({ code, onRunClicked, errorMessage, errorStack, circuitJson, autoroutingGraphics, showRightHeaderContent, showCodeTab, codeTabContent, showJsonTab, showRenderLogTab, onActiveTabChange, renderLog, showImportAndFormatButtons, className, headerClassName, leftHeaderContent, readOnly, isStreaming, autoroutingLog, onReportAutoroutingLog, isRunningCode, hasCodeChangedSinceLastRun, onEditEvent, editEvents, defaultActiveTab, autoRotate3dViewerDisabled, showSchematicDebugGrid, showToggleFullScreen, defaultToFullScreen, activeEffectName, }: PreviewContentProps) => react_jsx_runtime.JSX.Element;
87
91
 
88
92
  interface BomTableProps {
89
93
  circuitJson: AnyCircuitElement[];
package/dist/preview.js CHANGED
@@ -8,7 +8,7 @@ import {
8
8
  linkify,
9
9
  useOrderDialog,
10
10
  useOrderDialogCli
11
- } from "./chunk-6APZUCLA.js";
11
+ } from "./chunk-G55JSW6D.js";
12
12
  export {
13
13
  BomTable,
14
14
  CadViewer,
package/dist/runner.js CHANGED
@@ -27,7 +27,7 @@ import {
27
27
  useOrderDialog,
28
28
  useOrderDialogCli,
29
29
  useRunFrameStore
30
- } from "./chunk-6APZUCLA.js";
30
+ } from "./chunk-G55JSW6D.js";
31
31
 
32
32
  // lib/components/RunFrame/RunFrame.tsx
33
33
  import { createCircuitWebWorker } from "@tscircuit/eval/worker";
@@ -165,6 +165,10 @@ var RunFrame = (props) => {
165
165
  const runMutex = useMutex();
166
166
  const [isRunning, setIsRunning] = useState(false);
167
167
  const [dependenciesLoaded, setDependenciesLoaded] = useState(false);
168
+ const [activeAsyncEffects, setActiveAsyncEffects] = useState({});
169
+ const activeEffectName = Object.values(activeAsyncEffects).sort(
170
+ (a, b) => a.startTime - b.startTime
171
+ )[0]?.effectName;
168
172
  useEffect(() => {
169
173
  const handleKeyDown = (e) => {
170
174
  if ((e.ctrlKey || e.metaKey) && e.key === "Enter" && !isRunning) {
@@ -244,6 +248,7 @@ var RunFrame = (props) => {
244
248
  debug("running render worker");
245
249
  setError(null);
246
250
  setRenderLog(null);
251
+ setActiveAsyncEffects({});
247
252
  const renderLog2 = { progress: 0 };
248
253
  let cancelled = false;
249
254
  cancelExecutionRef.current = () => {
@@ -276,6 +281,20 @@ var RunFrame = (props) => {
276
281
  const renderIds = /* @__PURE__ */ new Set();
277
282
  const startRenderTime = Date.now();
278
283
  let lastRenderLogSet = Date.now();
284
+ worker.on("asyncEffect:start", (event) => {
285
+ const id = `${event.phase}|${event.componentDisplayName ?? ""}|${event.effectName}`;
286
+ setActiveAsyncEffects((effects) => ({
287
+ ...effects,
288
+ [id]: { ...event, startTime: Date.now() }
289
+ }));
290
+ });
291
+ worker.on("asyncEffect:end", (event) => {
292
+ const id = `${event.phase}|${event.componentDisplayName ?? ""}|${event.effectName}`;
293
+ setActiveAsyncEffects((effects) => {
294
+ const { [id]: _removed, ...rest } = effects;
295
+ return rest;
296
+ });
297
+ });
279
298
  worker.on("autorouting:start", (event) => {
280
299
  setAutoroutingLog({
281
300
  ...autoroutingLog,
@@ -330,6 +349,7 @@ var RunFrame = (props) => {
330
349
  });
331
350
  if (!evalResult.success) {
332
351
  setIsRunning(false);
352
+ setActiveAsyncEffects({});
333
353
  return;
334
354
  }
335
355
  const $renderResult = worker.renderUntilSettled();
@@ -340,6 +360,7 @@ var RunFrame = (props) => {
340
360
  setError({ error: e.message, stack: e.stack });
341
361
  setRenderLog(null);
342
362
  setIsRunning(false);
363
+ setActiveAsyncEffects({});
343
364
  return null;
344
365
  });
345
366
  if (!circuitJson2) return;
@@ -364,6 +385,7 @@ var RunFrame = (props) => {
364
385
  setRenderLog({ ...renderLog2 });
365
386
  }
366
387
  setIsRunning(false);
388
+ setActiveAsyncEffects({});
367
389
  cancelExecutionRef.current = null;
368
390
  };
369
391
  runMutex.runWithMutex(runWorker);
@@ -461,6 +483,7 @@ var RunFrame = (props) => {
461
483
  cancelExecutionRef.current = null;
462
484
  }
463
485
  runMutex.cancel();
486
+ setActiveAsyncEffects({});
464
487
  if (globalThis.runFrameWorker) {
465
488
  globalThis.runFrameWorker.kill();
466
489
  globalThis.runFrameWorker = null;
@@ -485,6 +508,7 @@ var RunFrame = (props) => {
485
508
  onActiveTabChange: setActiveTab,
486
509
  circuitJson,
487
510
  renderLog,
511
+ activeEffectName,
488
512
  isRunningCode: isRunning,
489
513
  errorMessage: error?.error,
490
514
  errorStack: error?.stack,