@tscircuit/runframe 0.0.145 → 0.0.146

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/dist/runner.js CHANGED
@@ -390,7 +390,7 @@ var RunFrame = (props) => {
390
390
  ]
391
391
  }
392
392
  ),
393
- isRunning && /* @__PURE__ */ jsx("div", { className: "rf-flex rf-items-center", children: /* @__PURE__ */ jsx(
393
+ isRunning && /* @__PURE__ */ jsx("div", { className: "rf-flex rf-items-center rf-ml-1", children: /* @__PURE__ */ jsx(
394
394
  Button,
395
395
  {
396
396
  onClick: (e) => {
@@ -403,7 +403,7 @@ var RunFrame = (props) => {
403
403
  },
404
404
  variant: "ghost",
405
405
  size: "icon",
406
- className: "rf-text-red-300 hover:rf-text-red-400 hover:!rf-bg-transparent -ml-4 [&>svg]:rf-text-red-300 [&>svg]:hover:rf-text-red-400 rf-flex rf-items-center rf-justify-center",
406
+ className: "rf-text-red-300 hover:rf-text-red-400 hover:!rf-bg-transparent [&>svg]:rf-text-red-300 [&>svg]:hover:rf-text-red-400 rf-flex rf-items-center rf-justify-center",
407
407
  children: /* @__PURE__ */ jsx(
408
408
  Square,
409
409
  {
@@ -13130,7 +13130,7 @@ searched component ${l.getString()}, which has ports: ${l.children.filter(c=>c.c
13130
13130
  [zustand devtools middleware] Unsupported __setState action format.
13131
13131
  When using 'store' option in devtools(), the 'state' should have only one key, which is a value of 'store' that was passed in devtools(),
13132
13132
  and value of this only key should be a state object. Example: { "type": "__setState", "state": { "abc123Store": { "foo": "bar" } } }
13133
- `);const C=b.state[s];if(C==null)return;JSON.stringify(i.getState())!==JSON.stringify(C)&&v(C);return}i.dispatchFromDevtools&&typeof i.dispatch=="function"&&i.dispatch(b)});case"DISPATCH":switch(E.payload.type){case"RESET":return v(x),s===void 0?u==null?void 0:u.init(i.getState()):u==null?void 0:u.init(qF(l.name));case"COMMIT":if(s===void 0){u==null||u.init(i.getState());return}return u==null?void 0:u.init(qF(l.name));case"ROLLBACK":return Hpe(E.state,b=>{if(s===void 0){v(b),u==null||u.init(i.getState());return}v(b[s]),u==null||u.init(qF(l.name))});case"JUMP_TO_STATE":case"JUMP_TO_ACTION":return Hpe(E.state,b=>{if(s===void 0){v(b);return}JSON.stringify(i.getState())!==JSON.stringify(b[s])&&v(b[s])});case"IMPORT_STATE":{const{nextLiftedState:b}=E.payload,C=(S=b.computedStates.slice(-1)[0])==null?void 0:S.state;if(!C)return;v(s===void 0?C:C[s]),u==null||u.send(null,b);return}case"PAUSE_RECORDING":return h=!h}return}}),x},Hpe=(r,e)=>{let t;try{t=JSON.parse(r)}catch(n){console.error("[zustand devtools middleware] Could not parse the received json",n)}t!==void 0&&e(t)},XR=window.API_BASE_URL??"/api",Eat=vg("run-frame"),qpe=Eat.extend("store");async function wat(r,e){return(await(await fetch(`${XR}/files/upsert`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({file_path:r,text_content:e})})).json()).file}async function $pe(r){return(await(await fetch(`${XR}/files/get?file_path=${encodeURIComponent(r)}`)).json()).file}async function pmn(r){const e=r?`${XR}/events/list?since=${encodeURIComponent(r)}`:`${XR}/events/list`;return(await(await fetch(e)).json()).event_list}async function hmn(){const r=await fetch(`${XR}/files/list`),{file_list:e}=await r.json(),t=new Map;for(const n of e){const i=await $pe(n.file_path);t.set(n.file_path,i.text_content)}return t}const mmn=RCt()(dmn((r,e)=>({fsMap:new Map,lastEventTime:new Date().toISOString(),isPolling:!1,error:null,circuitJson:null,lastManualEditsChangeSentAt:0,recentEvents:[],loadInitialFiles:async()=>{const t=await hmn();qpe("loaded initial files",{fsMap:t}),r({fsMap:t})},upsertFile:async(t,n)=>{try{const i=await wat(t,n);r(a=>({fsMap:new Map(a.fsMap).set(i.file_path,i.text_content)}))}catch(i){r({error:i})}},getFile:async t=>{try{const n=await $pe(t);r(i=>({fsMap:new Map(i.fsMap).set(n.file_path,n.text_content)}))}catch(n){r({error:n})}},setCircuitJson:t=>{t!==e().circuitJson&&r({circuitJson:t})},startPolling:()=>{const t=async()=>{const n=e();if(n.isPolling){try{const i=await pmn(n.lastEventTime);if(i.length>0){r(s=>({recentEvents:[...s.recentEvents,...i].slice(0,100)}));const a=i[i.length-1].created_at,o=new Map(n.fsMap);for(const s of i)if(s.event_type==="FILE_UPDATED"){const l=await $pe(s.file_path);if(s.file_path==="manual_edits.json"&&Date.now()-n.lastManualEditsChangeSentAt<1e3)continue;o.set(l.file_path,l.text_content)}r({fsMap:o,lastEventTime:a})}}catch(i){r({error:i})}setTimeout(t,1e3)}};r({isPolling:!0}),t()},stopPolling:()=>{r({isPolling:!1})},pushEvent:async t=>{await fetch(`${window.API_BASE_URL??""}/api/events/create`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})},applyEditEventsAndUpdateManualEditsJson:async t=>{qpe("applyEditEventsAndUpdateManualEditsJson",{editEvents:t});const n=e();if(!n.circuitJson)return;const i=n.fsMap.get("manual-edits.json"),a=i?JSON.parse(i):{},o=Ctn({circuitJson:n.circuitJson,editEvents:t,manualEditsFile:a});qpe("updatedManualEditsFileContent",o),r(s=>({lastManualEditsChangeSentAt:Date.now(),fsMap:new Map(s.fsMap).set("manual-edits.json",JSON.stringify(o))})),await wat("manual-edits.json",JSON.stringify(o,null,2))}}),{name:"run-frame-store"})),vmn=(r,e)=>{const t={};for(const[n,i]of r.entries()){const a=e.get(n);a!==i&&(t[n]={old:i,new:a})}for(const[n,i]of e.entries())r.has(n)||(t[n]={old:void 0,new:i});return t},Tat=r=>{const e={};if(!r)return e;for(const n of K3)e[n]=0;const t=new Map;for(const n of r){const[,,i,a]=n.type.split(":");if(a==="start"){t.set(`${i}:${n.renderId}`,n);continue}if(a==="end"){const o=t.get(`${i}:${n.renderId}`);if(o){const s=n.createdAt-o.createdAt;e[i]=(e[i]||0)+s}}}return e},ymn=26,N8=vg("run-frame:RunFrame"),gmn=r=>{const[e,t]=mmn(C=>[C.circuitJson,C.setCircuitJson]),[n,i]=Ct.useState(null),[a,o]=Ct.useReducer((C,N)=>C+1,0),s=Ct.useRef(0),[l,c]=Ct.useState(!1),[u,f]=Ct.useState(null),[h,v]=Ct.useState(r.defaultActiveTab??"pcb");Ct.useEffect(()=>{r.debug&&vg.enable("run-frame*")},[r.debug]);const x=r.fsMap instanceof Map?r.fsMap:Object.entries(r.fsMap??{}).reduce((C,[N,U])=>C.set(N,U),new Map),E=Ct.useRef(null),S=Ct.useRef(null);Ct.useEffect(()=>{if(!x)return;const C=r.showRunButton&&a!==s.current;if(E.current&&e){const U=vmn(E.current,x);if(Object.keys(U).length>0)N8("code changes detected");else if(S.current!==r.entrypoint)N8("render triggered by entrypoint change");else if(!C){N8("render triggered without changes to fsMap, skipping");return}}if(r.showRunButton&&a===s.current)return;E.current=x,S.current=r.entrypoint,s.current=a,c(!0);async function N(){var de,ye,Se,Re,Te;N8("running render worker"),i(null);const U={progress:0},G=globalThis.runFrameWorker??await umn({webWorkerUrl:r.evalWebWorkerBlobUrl,verbose:!0});globalThis.runFrameWorker=G,(de=r.onRenderStarted)==null||de.call(r);const Z=x instanceof Map?Object.fromEntries(x.entries()):x;if(!Z[r.entrypoint]){i({error:`Entrypoint not found (entrypoint: "${r.entrypoint}", fsMapKeys: ${Object.keys(Z).join(", ")})`,stack:""});return}const $=new Set;let te=Date.now();if(G.on("renderable:renderLifecycle:anyEvent",Ce=>{U.lastRenderEvent=Ce,U.eventsProcessed=(U.eventsProcessed??0)+1,$.has(Ce.renderId)||$.add(Ce.renderId);const Me=$.size*ymn*2,Fe=U.eventsProcessed>$.size*2,Ie=U.eventsProcessed/Me,ke=1-Math.exp(-Ie*3);U.progress=Fe?ke:(1-Math.exp(-(U.eventsProcessed??0)/1e3))*.05,h==="render_log"&&(U.renderEvents=U.renderEvents??[],Ce.createdAt=Date.now(),U.renderEvents.push(Ce),Date.now()-te>500&&(U.phaseTimings=Tat(U.renderEvents??[]),te=Date.now())),f({...U})}),!(await G.executeWithFsMap({entrypoint:r.entrypoint,fsMap:Z}).then(()=>({success:!0})).catch(Ce=>{var Fe;const Me=Ce.message.includes(":")?Ce.message.replace(/[^:]+:/,""):Ce.message;return(Fe=r.onError)==null||Fe.call(r,Ce),i({error:Me,stack:Ce.stack}),console.error(Ce),{success:!1}})).success)return c(!1);const se=G.renderUntilSettled();N8("waiting for initial circuit json...");let fe=await G.getCircuitJson().catch(Ce=>{var Me;return N8("error getting initial circuit json",Ce),(Me=r.onError)==null||Me.call(r,Ce),i({error:Ce.message,stack:Ce.stack}),c(!1),null});fe&&(N8("got initial circuit json"),t(fe),(ye=r.onCircuitJsonChange)==null||ye.call(r,fe),(Se=r.onInitialRender)==null||Se.call(r,{circuitJson:fe}),await se,N8("getting final circuit json"),fe=await G.getCircuitJson(),(Re=r.onCircuitJsonChange)==null||Re.call(r,fe),t(fe),(Te=r.onRenderFinished)==null||Te.call(r,{circuitJson:fe}),h==="render_log"&&(U.phaseTimings=Tat(U.renderEvents??[])),U.progress=1,f({...U}),c(!1))}N()},[r.fsMap,r.entrypoint,a]);const b=Ct.useMemo(()=>`cj-${Math.random().toString(36).substring(2,15)}`,[e]);return _t.jsx(Jhn,{defaultActiveTab:r.defaultActiveTab,leftHeaderContent:_t.jsxs(_t.Fragment,{children:[r.showRunButton&&_t.jsxs("div",{className:"rf-relative rf-inline-flex",children:[_t.jsxs("button",{type:"button",onClick:()=>{o(1)},className:"rf-flex rf-items-center rf-gap-2 rf-px-4 rf-py-2 rf-bg-blue-600 hover:rf-bg-blue-700 rf-text-white rf-rounded-md disabled:rf-opacity-50 transition-colors duration-200",disabled:l,children:["Run"," ",l?_t.jsx(zfe,{className:"rf-w-3 rf-h-3 rf-animate-spin"}):_t.jsx(IJe,{className:"rf-w-3 rf-h-3"})]}),l&&_t.jsx("div",{className:"rf-flex rf-items-center",children:_t.jsx(Ow,{onClick:C=>{C.stopPropagation(),c(!1),globalThis.runFrameWorker&&(globalThis.runFrameWorker.kill(),globalThis.runFrameWorker=null)},variant:"ghost",size:"icon",className:"rf-text-red-300 hover:rf-text-red-400 hover:!rf-bg-transparent -ml-4 [&>svg]:rf-text-red-300 [&>svg]:hover:rf-text-red-400 rf-flex rf-items-center rf-justify-center",children:_t.jsx(Nan,{className:"!rf-h-2.5 !rf-w-2.5",fill:"currentColor",stroke:"currentColor"})})})]}),r.leftHeaderContent]}),onActiveTabChange:v,circuitJson:e,circuitJsonKey:b,renderLog:u,isRunningCode:l,errorMessage:n==null?void 0:n.error,onEditEvent:r.onEditEvent,editEvents:r.editEvents})};Eat.extend("useEditEventController"),vg("run-frame:RunFrameWithApi"),wAe.createRoot(document.getElementById("root")).render(_t.jsx(od.StrictMode,{children:_t.jsx("div",{style:{width:"100vw",height:"100vh"},children:_t.jsx(gmn,{fsMap:{"main.tsx":`
13133
+ `);const C=b.state[s];if(C==null)return;JSON.stringify(i.getState())!==JSON.stringify(C)&&v(C);return}i.dispatchFromDevtools&&typeof i.dispatch=="function"&&i.dispatch(b)});case"DISPATCH":switch(E.payload.type){case"RESET":return v(x),s===void 0?u==null?void 0:u.init(i.getState()):u==null?void 0:u.init(qF(l.name));case"COMMIT":if(s===void 0){u==null||u.init(i.getState());return}return u==null?void 0:u.init(qF(l.name));case"ROLLBACK":return Hpe(E.state,b=>{if(s===void 0){v(b),u==null||u.init(i.getState());return}v(b[s]),u==null||u.init(qF(l.name))});case"JUMP_TO_STATE":case"JUMP_TO_ACTION":return Hpe(E.state,b=>{if(s===void 0){v(b);return}JSON.stringify(i.getState())!==JSON.stringify(b[s])&&v(b[s])});case"IMPORT_STATE":{const{nextLiftedState:b}=E.payload,C=(S=b.computedStates.slice(-1)[0])==null?void 0:S.state;if(!C)return;v(s===void 0?C:C[s]),u==null||u.send(null,b);return}case"PAUSE_RECORDING":return h=!h}return}}),x},Hpe=(r,e)=>{let t;try{t=JSON.parse(r)}catch(n){console.error("[zustand devtools middleware] Could not parse the received json",n)}t!==void 0&&e(t)},XR=window.API_BASE_URL??"/api",Eat=vg("run-frame"),qpe=Eat.extend("store");async function wat(r,e){return(await(await fetch(`${XR}/files/upsert`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({file_path:r,text_content:e})})).json()).file}async function $pe(r){return(await(await fetch(`${XR}/files/get?file_path=${encodeURIComponent(r)}`)).json()).file}async function pmn(r){const e=r?`${XR}/events/list?since=${encodeURIComponent(r)}`:`${XR}/events/list`;return(await(await fetch(e)).json()).event_list}async function hmn(){const r=await fetch(`${XR}/files/list`),{file_list:e}=await r.json(),t=new Map;for(const n of e){const i=await $pe(n.file_path);t.set(n.file_path,i.text_content)}return t}const mmn=RCt()(dmn((r,e)=>({fsMap:new Map,lastEventTime:new Date().toISOString(),isPolling:!1,error:null,circuitJson:null,lastManualEditsChangeSentAt:0,recentEvents:[],loadInitialFiles:async()=>{const t=await hmn();qpe("loaded initial files",{fsMap:t}),r({fsMap:t})},upsertFile:async(t,n)=>{try{const i=await wat(t,n);r(a=>({fsMap:new Map(a.fsMap).set(i.file_path,i.text_content)}))}catch(i){r({error:i})}},getFile:async t=>{try{const n=await $pe(t);r(i=>({fsMap:new Map(i.fsMap).set(n.file_path,n.text_content)}))}catch(n){r({error:n})}},setCircuitJson:t=>{t!==e().circuitJson&&r({circuitJson:t})},startPolling:()=>{const t=async()=>{const n=e();if(n.isPolling){try{const i=await pmn(n.lastEventTime);if(i.length>0){r(s=>({recentEvents:[...s.recentEvents,...i].slice(0,100)}));const a=i[i.length-1].created_at,o=new Map(n.fsMap);for(const s of i)if(s.event_type==="FILE_UPDATED"){const l=await $pe(s.file_path);if(s.file_path==="manual_edits.json"&&Date.now()-n.lastManualEditsChangeSentAt<1e3)continue;o.set(l.file_path,l.text_content)}r({fsMap:o,lastEventTime:a})}}catch(i){r({error:i})}setTimeout(t,1e3)}};r({isPolling:!0}),t()},stopPolling:()=>{r({isPolling:!1})},pushEvent:async t=>{await fetch(`${window.API_BASE_URL??""}/api/events/create`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})},applyEditEventsAndUpdateManualEditsJson:async t=>{qpe("applyEditEventsAndUpdateManualEditsJson",{editEvents:t});const n=e();if(!n.circuitJson)return;const i=n.fsMap.get("manual-edits.json"),a=i?JSON.parse(i):{},o=Ctn({circuitJson:n.circuitJson,editEvents:t,manualEditsFile:a});qpe("updatedManualEditsFileContent",o),r(s=>({lastManualEditsChangeSentAt:Date.now(),fsMap:new Map(s.fsMap).set("manual-edits.json",JSON.stringify(o))})),await wat("manual-edits.json",JSON.stringify(o,null,2))}}),{name:"run-frame-store"})),vmn=(r,e)=>{const t={};for(const[n,i]of r.entries()){const a=e.get(n);a!==i&&(t[n]={old:i,new:a})}for(const[n,i]of e.entries())r.has(n)||(t[n]={old:void 0,new:i});return t},Tat=r=>{const e={};if(!r)return e;for(const n of K3)e[n]=0;const t=new Map;for(const n of r){const[,,i,a]=n.type.split(":");if(a==="start"){t.set(`${i}:${n.renderId}`,n);continue}if(a==="end"){const o=t.get(`${i}:${n.renderId}`);if(o){const s=n.createdAt-o.createdAt;e[i]=(e[i]||0)+s}}}return e},ymn=26,N8=vg("run-frame:RunFrame"),gmn=r=>{const[e,t]=mmn(C=>[C.circuitJson,C.setCircuitJson]),[n,i]=Ct.useState(null),[a,o]=Ct.useReducer((C,N)=>C+1,0),s=Ct.useRef(0),[l,c]=Ct.useState(!1),[u,f]=Ct.useState(null),[h,v]=Ct.useState(r.defaultActiveTab??"pcb");Ct.useEffect(()=>{r.debug&&vg.enable("run-frame*")},[r.debug]);const x=r.fsMap instanceof Map?r.fsMap:Object.entries(r.fsMap??{}).reduce((C,[N,U])=>C.set(N,U),new Map),E=Ct.useRef(null),S=Ct.useRef(null);Ct.useEffect(()=>{if(!x)return;const C=r.showRunButton&&a!==s.current;if(E.current&&e){const U=vmn(E.current,x);if(Object.keys(U).length>0)N8("code changes detected");else if(S.current!==r.entrypoint)N8("render triggered by entrypoint change");else if(!C){N8("render triggered without changes to fsMap, skipping");return}}if(r.showRunButton&&a===s.current)return;E.current=x,S.current=r.entrypoint,s.current=a,c(!0);async function N(){var de,ye,Se,Re,Te;N8("running render worker"),i(null);const U={progress:0},G=globalThis.runFrameWorker??await umn({webWorkerUrl:r.evalWebWorkerBlobUrl,verbose:!0});globalThis.runFrameWorker=G,(de=r.onRenderStarted)==null||de.call(r);const Z=x instanceof Map?Object.fromEntries(x.entries()):x;if(!Z[r.entrypoint]){i({error:`Entrypoint not found (entrypoint: "${r.entrypoint}", fsMapKeys: ${Object.keys(Z).join(", ")})`,stack:""});return}const $=new Set;let te=Date.now();if(G.on("renderable:renderLifecycle:anyEvent",Ce=>{U.lastRenderEvent=Ce,U.eventsProcessed=(U.eventsProcessed??0)+1,$.has(Ce.renderId)||$.add(Ce.renderId);const Me=$.size*ymn*2,Fe=U.eventsProcessed>$.size*2,Ie=U.eventsProcessed/Me,ke=1-Math.exp(-Ie*3);U.progress=Fe?ke:(1-Math.exp(-(U.eventsProcessed??0)/1e3))*.05,h==="render_log"&&(U.renderEvents=U.renderEvents??[],Ce.createdAt=Date.now(),U.renderEvents.push(Ce),Date.now()-te>500&&(U.phaseTimings=Tat(U.renderEvents??[]),te=Date.now())),f({...U})}),!(await G.executeWithFsMap({entrypoint:r.entrypoint,fsMap:Z}).then(()=>({success:!0})).catch(Ce=>{var Fe;const Me=Ce.message.includes(":")?Ce.message.replace(/[^:]+:/,""):Ce.message;return(Fe=r.onError)==null||Fe.call(r,Ce),i({error:Me,stack:Ce.stack}),console.error(Ce),{success:!1}})).success)return c(!1);const se=G.renderUntilSettled();N8("waiting for initial circuit json...");let fe=await G.getCircuitJson().catch(Ce=>{var Me;return N8("error getting initial circuit json",Ce),(Me=r.onError)==null||Me.call(r,Ce),i({error:Ce.message,stack:Ce.stack}),c(!1),null});fe&&(N8("got initial circuit json"),t(fe),(ye=r.onCircuitJsonChange)==null||ye.call(r,fe),(Se=r.onInitialRender)==null||Se.call(r,{circuitJson:fe}),await se,N8("getting final circuit json"),fe=await G.getCircuitJson(),(Re=r.onCircuitJsonChange)==null||Re.call(r,fe),t(fe),(Te=r.onRenderFinished)==null||Te.call(r,{circuitJson:fe}),h==="render_log"&&(U.phaseTimings=Tat(U.renderEvents??[])),U.progress=1,f({...U}),c(!1))}N()},[r.fsMap,r.entrypoint,a]);const b=Ct.useMemo(()=>`cj-${Math.random().toString(36).substring(2,15)}`,[e]);return _t.jsx(Jhn,{defaultActiveTab:r.defaultActiveTab,leftHeaderContent:_t.jsxs(_t.Fragment,{children:[r.showRunButton&&_t.jsxs("div",{className:"rf-relative rf-inline-flex",children:[_t.jsxs("button",{type:"button",onClick:()=>{o(1)},className:"rf-flex rf-items-center rf-gap-2 rf-px-4 rf-py-2 rf-bg-blue-600 hover:rf-bg-blue-700 rf-text-white rf-rounded-md disabled:rf-opacity-50 transition-colors duration-200",disabled:l,children:["Run"," ",l?_t.jsx(zfe,{className:"rf-w-3 rf-h-3 rf-animate-spin"}):_t.jsx(IJe,{className:"rf-w-3 rf-h-3"})]}),l&&_t.jsx("div",{className:"rf-flex rf-items-center rf-ml-1",children:_t.jsx(Ow,{onClick:C=>{C.stopPropagation(),c(!1),globalThis.runFrameWorker&&(globalThis.runFrameWorker.kill(),globalThis.runFrameWorker=null)},variant:"ghost",size:"icon",className:"rf-text-red-300 hover:rf-text-red-400 hover:!rf-bg-transparent [&>svg]:rf-text-red-300 [&>svg]:hover:rf-text-red-400 rf-flex rf-items-center rf-justify-center",children:_t.jsx(Nan,{className:"!rf-h-2.5 !rf-w-2.5",fill:"currentColor",stroke:"currentColor"})})})]}),r.leftHeaderContent]}),onActiveTabChange:v,circuitJson:e,circuitJsonKey:b,renderLog:u,isRunningCode:l,errorMessage:n==null?void 0:n.error,onEditEvent:r.onEditEvent,editEvents:r.editEvents})};Eat.extend("useEditEventController"),vg("run-frame:RunFrameWithApi"),wAe.createRoot(document.getElementById("root")).render(_t.jsx(od.StrictMode,{children:_t.jsx("div",{style:{width:"100vw",height:"100vh"},children:_t.jsx(gmn,{fsMap:{"main.tsx":`
13134
13134
  circuit.add(
13135
13135
  <board width="10mm" height="10mm">
13136
13136
  <resistor name="R1" resistance="1k" footprint="0402" />
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@tscircuit/runframe",
3
3
  "main": "dist/preview.js",
4
4
  "type": "module",
5
- "version": "0.0.145",
5
+ "version": "0.0.146",
6
6
  "exports": {
7
7
  ".": "./dist/preview.js",
8
8
  "./preview": "./dist/preview.js",