brepjs-cad 0.177.0 → 0.178.0

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/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.178.0](https://github.com/andymai/brepjs/compare/brepjs-cad-v0.177.0...brepjs-cad-v0.178.0) (2026-08-29)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **brepjs-cad:** ship the Z-up preview camera in the bundled viewer ([#2265](https://github.com/andymai/brepjs/issues/2265)) ([9993376](https://github.com/andymai/brepjs/commit/9993376b323ff47ee67583a57d88f82f0d343fc2)), closes [#2264](https://github.com/andymai/brepjs/issues/2264)
9
+
3
10
  ## [0.177.0](https://github.com/andymai/brepjs/compare/brepjs-cad-v0.176.0...brepjs-cad-v0.177.0) (2026-08-26)
4
11
 
5
12
 
package/README.md CHANGED
@@ -53,7 +53,7 @@ npx -y -p brepjs-cad brep part.brep.ts --serve # p
53
53
  npx -y -p brepjs-cad brep part.brep.ts --serve --no-open # preview server; just print the URL (no browser)
54
54
  ```
55
55
 
56
- `--snapshot`/`--serve` use the bundled viewer (shipped under `viewer/dist`, including the OCCT WASM). The `--serve` link is interactive: a toolbar offers view presets + fit, solid/wireframe/x-ray modes, edge/grid toggles, a turntable, click-to-inspect face picking, a section/clipping plane, a measurements panel, and an in-browser PNG screenshot. `--snapshot` loads the same page with `ui=0` to suppress the toolbar, and burns the bounding-box size into each PNG (`dims=1`) so the agent can read scale from the image.
56
+ `--snapshot`/`--serve` use the bundled viewer (shipped under `viewer/dist`, including the OCCT WASM). It renders in brepjs's native Z-up coordinates: Z is up, the XY plane is horizontal, and models are never rotated to fit the renderer's convention. The `--serve` link is interactive: a toolbar offers view presets + fit, solid/wireframe/x-ray modes, edge/grid toggles, a turntable, click-to-inspect face picking, a section/clipping plane, a measurements panel, and an in-browser PNG screenshot. `--snapshot` loads the same page with `ui=0` to suppress the toolbar, and burns the bounding-box size into each PNG (`dims=1`) so the agent can read scale from the image.
57
57
 
58
58
  `--serve` prints the viewer URL and, in an interactive terminal, opens it in your default browser. Auto-open is skipped when it would be unwanted: when the server is reused (a tab is already open), under CI, when output is piped (non-TTY, e.g. agent runs), or on Linux with no display server. Pass `--no-open` to always suppress it.
59
59
 
@@ -11479,7 +11479,7 @@ var require_jsx_runtime = /* @__PURE__ */ __commonJSMin(((exports, module) => {
11479
11479
  }));
11480
11480
  require_react();
11481
11481
  require_jsx_runtime();
11482
- new Vector3(.6, .5, .6), new Vector3(0, .3, 1), new Vector3(0, 1, -.01), new Vector3(1, .3, 0);
11482
+ new Vector3(.6, -.6, .5), new Vector3(0, -1, .3), new Vector3(0, .01, 1), new Vector3(1, 0, .3);
11483
11483
  var groupStyle = {
11484
11484
  display: "flex",
11485
11485
  flexDirection: "column",
@@ -11478,7 +11478,7 @@ var require_jsx_runtime = /* @__PURE__ */ require_rolldown_runtime.__commonJSMin
11478
11478
  }));
11479
11479
  require_react();
11480
11480
  require_jsx_runtime();
11481
- new Vector3(.6, .5, .6), new Vector3(0, .3, 1), new Vector3(0, 1, -.01), new Vector3(1, .3, 0);
11481
+ new Vector3(.6, -.6, .5), new Vector3(0, -1, .3), new Vector3(0, .01, 1), new Vector3(1, 0, .3);
11482
11482
  var groupStyle = {
11483
11483
  display: "flex",
11484
11484
  flexDirection: "column",
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_rolldown_runtime = require("../rolldown-runtime-y5ARvAq5.cjs");
3
- const require_evaluate = require("../evaluate-DDwQkzN-.cjs");
3
+ const require_evaluate = require("../evaluate-sRn-Xvw4.cjs");
4
4
  let node_fs = require("node:fs");
5
5
  let node_path = require("node:path");
6
6
  let rhino3dm = require("rhino3dm");
@@ -1,4 +1,4 @@
1
- import { t as evaluateElements } from "../evaluate-TZ0h4RP0.js";
1
+ import { t as evaluateElements } from "../evaluate-C6FBiEVI.js";
2
2
  import { mkdirSync, writeFileSync } from "node:fs";
3
3
  import { dirname } from "node:path";
4
4
  import rhino3dm from "rhino3dm";
@@ -2,7 +2,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_usingCtx = require("../usingCtx-LY0tPCbQ.cjs");
3
3
  const require_openBrowser = require("../openBrowser-Bip99cQv.cjs");
4
4
  const require_snapshot_static = require("../snapshot/static.cjs");
5
- const require_evaluate = require("../evaluate-DDwQkzN-.cjs");
5
+ const require_evaluate = require("../evaluate-sRn-Xvw4.cjs");
6
6
  let node_fs = require("node:fs");
7
7
  let node_path = require("node:path");
8
8
  let node_http = require("node:http");
@@ -1,4 +1,4 @@
1
- import { n as evaluatePreview, r as encodePreviewPayload } from "../evaluate-TZ0h4RP0.js";
1
+ import { n as evaluatePreview, r as encodePreviewPayload } from "../evaluate-C6FBiEVI.js";
2
2
  import { v as loadBrep } from "../usingCtx-BDYtpr4t.js";
3
3
  import { a as isWatchRelevant, i as debounce, n as shouldAutoOpen, o as watchRootFor, r as createSerialRunner, s as watchTree, t as openBrowser } from "../openBrowser-Dg9oDOte.js";
4
4
  import { VIEWER_DIST, safeJoin, sendFile } from "../snapshot/static.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "brepjs-cad",
3
- "version": "0.177.0",
3
+ "version": "0.178.0",
4
4
  "description": "Brainstorm → design → author → verify → polish pipeline for parametric brepjs CAD, with the brep CLI",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -4178,7 +4178,7 @@ No matching component was found for:
4178
4178
  varying vec2 vWorldPos;
4179
4179
  void main() {
4180
4180
  vec4 worldPos = modelMatrix * vec4(position, 1.0);
4181
- vWorldPos = worldPos.xz;
4181
+ vWorldPos = worldPos.xy;
4182
4182
  gl_Position = projectionMatrix * viewMatrix * worldPos;
4183
4183
  }
4184
4184
  `,qy=`
@@ -4205,4 +4205,4 @@ No matching component was found for:
4205
4205
 
4206
4206
  gl_FragColor = vec4(lineColor, alpha);
4207
4207
  }
4208
- `;function Jy({cellSize:e=10,lineColor:t=`#888898`,lineOpacity:n=.1,fadeStart:r=50,fadeEnd:i=200}){let a=(0,v.useRef)(null),o=i*2.5;return(0,v.useEffect)(()=>()=>{a.current?.dispose()},[]),(0,$.jsxs)(`mesh`,{rotation:[-Math.PI/2,0,0],position:[0,-.01,0],children:[(0,$.jsx)(`planeGeometry`,{args:[o,o]}),(0,$.jsx)(`shaderMaterial`,{ref:a,vertexShader:Ky,fragmentShader:qy,uniforms:{cellSize:{value:e},lineColor:{value:new q(t)},lineOpacity:{value:n},fadeStart:{value:r},fadeEnd:{value:i}},transparent:!0,depthWrite:!1,side:2,polygonOffset:!0,polygonOffsetFactor:1,polygonOffsetUnits:1})]})}function Yy(){return(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`hemisphereLight`,{args:[`#ffffff`,`#1a1a2e`,.65]}),(0,$.jsx)(`directionalLight`,{position:[-50,60,80],intensity:.85,color:`#fff8f0`}),(0,$.jsx)(`directionalLight`,{position:[40,-40,30],intensity:.15,color:`#e0e8ff`})]})}function Xy({autoRotate:e=!1,target:t,gridVisible:n=!0,gridProps:r,controlsProps:i,controlsRef:a,onControlsStart:o}){let s={...a?{ref:a}:{},...t?{target:t}:{},...o?{onStart:o}:{}};return(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(Yy,{}),(0,$.jsx)(Gy,{}),(0,$.jsx)(by,{makeDefault:!0,autoRotate:e,autoRotateSpeed:1.5,...s,...i}),n&&(0,$.jsx)(Jy,{...r})]})}var Zy={iso:new K(.6,.5,.6),front:new K(0,.3,1),top:new K(0,1,-.01),right:new K(1,.3,0)};function Qy({data:e,view:t,fitSignal:n,projection:r,onFirstFrame:i}){let a=x_(e=>e.camera),o=x_(e=>e.invalidate),s=(0,v.useRef)(!1),c=(0,v.useRef)(i);c.current=i;let{center:l,radius:u}=(0,v.useMemo)(()=>{let t=xy(e);t.computeBoundingSphere();let n=t.boundingSphere??new zi(new K,1),r={center:n.center.clone(),radius:n.radius||1};return t.dispose(),r},[e]);return(0,v.useEffect)(()=>{let e=Zy[t].clone().normalize();a.position.copy(l).addScaledVector(e,u*3),a.near=u/100,a.far=u*100;let n=a;if(n.isOrthographicCamera){let e=Math.min(n.right-n.left,n.top-n.bottom);e>0&&u>0&&(n.zoom=e/(u*2.4))}a.lookAt(l),a.updateProjectionMatrix(),o(),s.current||(s.current=!0,c.current?.())},[a,o,l,u,t,n,r]),null}function $y(){let e=x_(e=>e.camera),t=(0,v.useRef)([e.position.x,e.position.y,e.position.z]);return(0,$.jsx)(yy,{makeDefault:!0,position:t.current,zoom:20,near:.1,far:2e3})}function eb(){let e=x_(e=>e.gl);return(0,v.useEffect)(()=>(e.localClippingEnabled=!0,()=>{e.localClippingEnabled=!1}),[e]),null}function tb({data:e,view:t=`iso`,fitSignal:n,autoRotate:r=!1,gridVisible:i=!0,projection:a=`perspective`,onFirstFrame:o,onError:s,errorFallback:c,children:l}){return(0,$.jsx)(Ay,{onError:s,fallback:c,children:(0,$.jsxs)(Hv,{frameloop:r?`always`:`demand`,gl:{preserveDrawingBuffer:!0},children:[(0,$.jsx)(eb,{}),a===`orthographic`&&(0,$.jsx)($y,{}),(0,$.jsx)(Xy,{autoRotate:r,gridVisible:i}),(0,$.jsx)(Qy,{data:e,view:t,fitSignal:n,projection:a,onFirstFrame:o}),l]})})}var nb=[`iso`,`front`,`top`,`right`],rb={solid:`Solid`,wireframe:`Wire`,xray:`X-ray`},ib={iso:`Iso`,front:`Front`,top:`Top`,right:`Right`};function ab({viewMode:e,onViewModeChange:t,showEdges:n,onToggleEdges:r,showGrid:i,onToggleGrid:a,autoRotate:o,onToggleAutoRotate:s,projection:c,onToggleProjection:l,activeView:u,onView:d,onFit:f,onScreenshot:p,touch:m=!1,className:h}){return(0,$.jsxs)(`div`,{className:h,style:h?void 0:{...cb,gap:m?8:6},children:[(f||p)&&(0,$.jsxs)(ob,{touch:m,children:[f&&(0,$.jsx)(sb,{label:`Fit`,onClick:f,touch:m}),p&&(0,$.jsx)(sb,{label:`Snap`,onClick:p,touch:m})]}),e&&t&&(0,$.jsx)(ob,{touch:m,children:Object.keys(rb).map(n=>(0,$.jsx)(sb,{label:rb[n],active:e===n,touch:m,onClick:()=>{t(n)}},n))}),(r||a||s||l)&&(0,$.jsxs)(ob,{touch:m,children:[r&&(0,$.jsx)(sb,{label:`Edges`,active:n,onClick:r,touch:m}),a&&(0,$.jsx)(sb,{label:`Grid`,active:i,onClick:a,touch:m}),s&&(0,$.jsx)(sb,{label:`Spin`,active:o,onClick:s,touch:m}),l&&(0,$.jsx)(sb,{label:c===`orthographic`?`Ortho`:`Persp`,active:c===`orthographic`,touch:m,onClick:l})]}),d&&(0,$.jsx)(ob,{touch:m,children:nb.map(e=>(0,$.jsx)(sb,{label:ib[e],active:u===e,touch:m,onClick:()=>{d(e)}},e))})]})}function ob({children:e,touch:t}){return(0,$.jsx)(`div`,{style:t?fb:lb,children:e})}function sb({label:e,active:t,onClick:n,touch:r}){return(0,$.jsx)(`button`,{type:`button`,onClick:n,"aria-pressed":t,style:{...r?pb:ub,...t?db:null},children:e})}var cb={position:`absolute`,top:12,right:12,zIndex:10,display:`flex`,flexDirection:`column`,gap:6,pointerEvents:`none`,fontFamily:`ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif`},lb={display:`flex`,flexDirection:`column`,gap:4,padding:4,borderRadius:8,background:`rgba(26, 29, 33, 0.7)`,backdropFilter:`blur(6px)`,border:`1px solid rgba(255, 255, 255, 0.08)`},ub={cursor:`pointer`,pointerEvents:`auto`,padding:`4px 10px`,borderRadius:5,fontSize:12,fontWeight:500,lineHeight:1.2,color:`#9aa3ad`,background:`rgba(255, 255, 255, 0.04)`,border:`1px solid transparent`,transition:`color 120ms, background 120ms`},db={color:`#6ee7d7`,background:`rgba(45, 212, 191, 0.16)`,borderColor:`rgba(45, 212, 191, 0.3)`},fb={...lb,gap:6,padding:6},pb={...ub,padding:`9px 14px`,fontSize:13,borderRadius:6};function mb({dims:e,volume:t,area:n,triangles:r,valid:i,unit:a,className:o}){let s=a?` ${a}`:``,c=[];return e&&c.push((0,$.jsx)(hb,{label:`Size`,value:`${gb(e[0])} × ${gb(e[1])} × ${gb(e[2])}${s}`},`size`)),t!==void 0&&c.push((0,$.jsx)(hb,{label:`Volume`,value:`${gb(t)}${a?` ${a}³`:``}`},`vol`)),n!==void 0&&c.push((0,$.jsx)(hb,{label:`Area`,value:`${gb(n)}${a?` ${a}²`:``}`},`area`)),r!==void 0&&c.push((0,$.jsx)(hb,{label:`Triangles`,value:r.toLocaleString()},`tris`)),i!==void 0&&c.push((0,$.jsx)(hb,{label:`Validity`,value:i?`valid`:`invalid`,valueColor:i?`#6ee7d7`:`#f0a0a0`},`valid`)),c.length===0?null:(0,$.jsx)(`div`,{className:o,style:o?void 0:_b,children:c})}function hb({label:e,value:t,valueColor:n}){return(0,$.jsxs)(`div`,{style:vb,children:[(0,$.jsx)(`span`,{style:yb,children:e}),(0,$.jsx)(`span`,{style:{...bb,...n?{color:n}:null},children:t})]})}function gb(e){return Number.isFinite(e)?Number.isInteger(e)?e.toLocaleString():Number(e.toFixed(2)).toLocaleString():`—`}var _b={position:`absolute`,left:12,bottom:12,zIndex:10,display:`flex`,flexDirection:`column`,gap:2,padding:`8px 10px`,borderRadius:8,minWidth:150,background:`rgba(26, 29, 33, 0.7)`,backdropFilter:`blur(6px)`,border:`1px solid rgba(255, 255, 255, 0.08)`,fontFamily:`ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif`},vb={display:`flex`,justifyContent:`space-between`,gap:16,fontSize:12,lineHeight:1.5},yb={color:`#7b8591`},bb={color:`#c8cdd3`,fontVariantNumeric:`tabular-nums`},xb={PLANE:`Planar`,CYLINDER:`Cylindrical`,CONE:`Conical`,SPHERE:`Spherical`,TORUS:`Toroidal`,BEZIER_SURFACE:`Bézier`,BSPLINE_SURFACE:`B-spline`,REVOLUTION_SURFACE:`Revolved`,EXTRUSION_SURFACE:`Extruded`,OFFSET_SURFACE:`Offset`,OTHER_SURFACE:`Surface`};function Sb(e){return xb[e]??`Surface`}function Cb(e){return Number.isFinite(e)?Number.isInteger(e)?e.toLocaleString():Number(e.toFixed(2)).toLocaleString():`—`}function wb({face:e,onClear:t,unit:n,className:r}){if(!e)return null;let[i,a,o]=e.normal;return(0,$.jsxs)(`div`,{className:r,style:r?void 0:Eb,children:[(0,$.jsxs)(`div`,{style:Db,children:[(0,$.jsxs)(`span`,{style:Ob,children:[Sb(e.surfaceType),` face`]}),t&&(0,$.jsx)(`button`,{type:`button`,onClick:t,"aria-label":`Clear selection`,style:kb,children:`✕`})]}),(0,$.jsx)(Tb,{label:`Area`,value:`${Cb(e.area)}${n?` ${n}²`:``}`}),(0,$.jsx)(Tb,{label:`Normal`,value:`${Cb(i)}, ${Cb(a)}, ${Cb(o)}`})]})}function Tb({label:e,value:t}){return(0,$.jsxs)(`div`,{style:Ab,children:[(0,$.jsx)(`span`,{style:jb,children:e}),(0,$.jsx)(`span`,{style:Mb,children:t})]})}var Eb={position:`absolute`,left:12,top:12,zIndex:10,display:`flex`,flexDirection:`column`,gap:2,padding:`8px 10px`,borderRadius:8,minWidth:170,background:`rgba(26, 29, 33, 0.7)`,backdropFilter:`blur(6px)`,border:`1px solid rgba(74, 206, 204, 0.3)`,fontFamily:`ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif`},Db={display:`flex`,justifyContent:`space-between`,alignItems:`center`,gap:12,marginBottom:2},Ob={color:`#6ee7d7`,fontSize:12,fontWeight:600},kb={cursor:`pointer`,border:`none`,background:`transparent`,color:`#7b8591`,fontSize:12,lineHeight:1,padding:0},Ab={display:`flex`,justifyContent:`space-between`,gap:16,fontSize:12,lineHeight:1.5},jb={color:`#7b8591`},Mb={color:`#c8cdd3`,fontVariantNumeric:`tabular-nums`},Nb=[`x`,`y`,`z`];function Pb({enabled:e,onToggle:t,axis:n,onAxisChange:r,position:i,min:a,max:o,onPositionChange:s,flip:c,onToggleFlip:l,className:u}){return(0,$.jsxs)(`div`,{className:u,style:u?void 0:Ib,children:[(0,$.jsx)(Fb,{label:`Section`,active:e,onClick:t}),e&&(0,$.jsxs)($.Fragment,{children:[Nb.map(e=>(0,$.jsx)(Fb,{label:e.toUpperCase(),active:n===e,onClick:()=>{r(e)}},e)),(0,$.jsx)(`input`,{type:`range`,min:a,max:o,step:(o-a)/200||.01,value:i,disabled:a===o,onChange:e=>{s(Number(e.target.value))},"aria-label":`Section position`,style:{...zb,...a===o?{opacity:.4}:null}}),(0,$.jsx)(Fb,{label:`Flip`,active:c,onClick:l})]})]})}function Fb({label:e,active:t,onClick:n}){return(0,$.jsx)(`button`,{type:`button`,onClick:n,"aria-pressed":t,style:{...Lb,...t?Rb:null},children:e})}var Ib={position:`absolute`,bottom:12,left:`50%`,transform:`translateX(-50%)`,zIndex:10,display:`flex`,alignItems:`center`,gap:4,padding:4,borderRadius:8,background:`rgba(26, 29, 33, 0.7)`,backdropFilter:`blur(6px)`,border:`1px solid rgba(255, 255, 255, 0.08)`,fontFamily:`ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif`},Lb={cursor:`pointer`,padding:`4px 10px`,borderRadius:5,fontSize:12,fontWeight:500,lineHeight:1.2,color:`#9aa3ad`,background:`rgba(255, 255, 255, 0.04)`,border:`1px solid transparent`},Rb={color:`#6ee7d7`,background:`rgba(45, 212, 191, 0.16)`,borderColor:`rgba(45, 212, 191, 0.3)`},zb={width:160,accentColor:`#4ACECC`,margin:`0 4px`};function Bb(e,t){let n=t*3,r=0,i=e.length-1;for(;r<=i;){let t=r+i>>>1,a=e[t];if(!a)break;if(n<a.start)i=t-1;else if(n>=a.start+a.count)r=t+1;else return a}return null}var Vb=e=>e+3&-4;function Hb(e){let t=new DataView(e);if(e.byteLength<8||t.getUint32(0,!0)!==1112560214)throw Error(`not a preview payload (bad magic)`);let n=t.getUint32(4,!0),r=JSON.parse(new TextDecoder().decode(new Uint8Array(e,8,n)));if(r.version!==1)throw Error(`unsupported preview payload version ${r.version}`);let i=8+Vb(n),a=(t,n)=>{let r=new t(e,i,n);return i+=n*4,r};return{data:{position:a(Float32Array,r.buffers.position),normal:a(Float32Array,r.buffers.normal),index:a(Uint32Array,r.buffers.index),edges:a(Float32Array,r.buffers.edges),...r.faceGroups?{faceGroups:[...r.faceGroups]}:{}},elements:r.elements,failed:r.failed,tree:r.tree,measurements:r.measurements}}function Ub(e){let t=new URLSearchParams(e),n=t.get(`file`);return n?{dir:t.get(`dir`),file:n}:null}function Wb(e){let t=e.lastIndexOf(`.`);return t===-1?``:e.slice(t).toLowerCase()}function Gb({inspect:e=!1}={}){let[t,n]=(0,v.useState)({status:`idle`});return(0,v.useEffect)(()=>{if(new URLSearchParams(window.location.search).has(`preview`)){n({status:`loading`});let e=!1,t=async()=>{try{let t=await fetch(`/__preview/model`);if(!t.ok)throw Error(`fetch preview model: ${t.status}`);let r=Hb(await t.arrayBuffer());if(e)return;n({status:`ready`,data:r.data,measurements:{valid:r.failed.length===0},preview:{elements:r.elements,failed:r.failed,tree:r.tree}})}catch(t){e||n({status:`error`,error:t instanceof Error?t.message:String(t)})}};t();let r=new EventSource(`/__preview/events`);return r.onmessage=()=>void t(),()=>{e=!0,r.close()}}let t=Ub(window.location.search);if(!t){n({status:`error`,error:`missing ?file= parameter`});return}if(!t.dir){n({status:`error`,error:`missing ?dir= parameter`});return}n({status:`loading`});let r=new Worker(new URL(``+new URL(`kernelWorker-C7TmNmhp.js`,import.meta.url).href,``+import.meta.url),{type:`module`}),i=!1;r.addEventListener(`message`,e=>{i||(e.data.type===`loaded`?n({status:`ready`,data:e.data.meshData,measurements:e.data.measurements}):n({status:`error`,error:e.data.error}))});let a=`/__model/${t.file.split(`/`).map(encodeURIComponent).join(`/`)}?dir=${encodeURIComponent(t.dir)}`;return fetch(a).then(e=>{if(!e.ok)throw Error(`fetch ${t.file}: ${e.status}`);return e.arrayBuffer()}).then(n=>{let i={type:`load`,bytes:n,ext:Wb(t.file),inspect:e};r.postMessage(i,[n])}).catch(e=>{i||n({status:`error`,error:e instanceof Error?e.message:String(e)})}),()=>{i=!0,r.terminate()}},[e]),t}var Kb=[`iso`,`front`,`top`,`right`],qb=new Set;function Jb(e){return Kb.includes(e)}function Yb(e){return qb.add(e),()=>qb.delete(e)}function Xb(e){for(let t of qb)t(e)}function Zb(){globalThis.__ready=!0}function Qb(){let e=globalThis;e.__ready=!1,e.__renderView=e=>{Jb(e)&&Xb({view:e})},e.__setScene=e=>{e&&Jb(e.view)&&Xb(e)}}function $b({marks:e}){return(0,$.jsx)($.Fragment,{children:e.map((e,t)=>(0,$.jsx)(iy,{position:[e.pos[0],e.pos[1],e.pos[2]],center:!0,children:(0,$.jsx)(`div`,{style:{background:`#ffcc00`,color:`#000`,font:`700 13px monospace`,padding:`1px 5px`,borderRadius:4,border:`1px solid #000`,whiteSpace:`nowrap`,pointerEvents:`none`},children:e.label})},`${e.label}-${t}`))})}var ex=new URLSearchParams(window.location.search),tx=ex.get(`ui`)!==`0`,nx=ex.get(`dims`)===`1`;function rx(){let e=document.querySelector(`canvas`);if(!e)return;let t=e.toDataURL(`image/png`),n=document.createElement(`a`);n.href=t,n.download=`brepjs-view.png`,n.click()}function ix({preview:e,selected:t}){return(0,$.jsxs)(`div`,{style:{position:`absolute`,top:12,left:12,maxWidth:340,maxHeight:`60vh`,overflowY:`auto`,background:`rgba(16, 20, 24, 0.85)`,color:`#cfd6dc`,font:`12px monospace`,padding:`8px 10px`,borderRadius:6,pointerEvents:`auto`},children:[(0,$.jsxs)(`div`,{children:[`elements: `,e.elements.length,e.failed.length>0&&(0,$.jsxs)(`span`,{style:{color:`#e88`},children:[` · `,e.failed.length,` failed`]})]}),t&&(0,$.jsxs)(`div`,{style:{color:`#ffd479`},children:[`selected: `,t]}),e.failed.map(e=>(0,$.jsxs)(`div`,{style:{color:`#e88`},children:[`✗ `,e]},e))]})}function ax(){let e=Gb({inspect:tx}),[t,n]=(0,v.useState)(`iso`),[r,i]=(0,v.useState)(`solid`),[a,o]=(0,v.useState)(!0),[s,c]=(0,v.useState)(!0),[l,u]=(0,v.useState)(!1),[d,f]=(0,v.useState)(`perspective`),[p,m]=(0,v.useState)(0),[h,g]=(0,v.useState)(null),[_,y]=(0,v.useState)(null),[b,x]=(0,v.useState)(!1),[S,C]=(0,v.useState)(`x`),[w,T]=(0,v.useState)(0),[E,D]=(0,v.useState)(!1),[O,k]=(0,v.useState)([]),[A,ee]=(0,v.useState)(null),j=e.status===`ready`?e.preview:void 0,M=(0,v.useCallback)(e=>{j&&ee(Bb(j.elements,e)?.keyPath??null)},[j]),te=(0,v.useCallback)(()=>{m(e=>e+1)},[]),N=(0,v.useCallback)(e=>{g(e)},[]),P=(0,v.useCallback)(e=>{y(e?e.faceId:null)},[]),F=(0,v.useMemo)(()=>e.status===`ready`?Sy(e.data):null,[e]);(0,v.useEffect)(()=>Yb(e=>{if(n(e.view),i(e.viewMode??`solid`),e.section&&F){let t=e.section.axis===`x`?0:e.section.axis===`y`?1:2;C(e.section.axis),T(F.min[t]+e.section.frac*(F.max[t]-F.min[t])),x(!0)}else x(!1);k(e.marks??[])}),[F]);let ne=S===`x`?0:S===`y`?1:2,re=F?F.min[ne]:0,ie=F?F.max[ne]:1,I=(0,v.useCallback)(e=>{if(!F)return 0;let t=e===`x`?0:e===`y`?1:2;return(F.min[t]+F.max[t])/2},[F]),ae=(0,v.useCallback)(()=>{x(e=>(e||T(I(S)),!e))},[I,S]),L=(0,v.useCallback)(e=>{C(e),T(I(e))},[I]),R=(0,v.useMemo)(()=>b&&F?[wy(S,w,E)]:void 0,[b,F,S,w,E]);return e.status===`error`?(0,$.jsxs)(`div`,{style:{color:`#e88`,padding:16,fontFamily:`monospace`},children:[`error: `,e.error]}):e.status===`ready`?(0,$.jsxs)($.Fragment,{children:[(0,$.jsxs)(tb,{data:e.data,view:t,fitSignal:p,autoRotate:l,gridVisible:s,projection:d,onFirstFrame:Zb,children:[(0,$.jsx)(ky,{data:e.data,viewMode:r,...R?{clippingPlanes:R}:{},...tx?{onFacePick:N,onFaceHover:P}:{},...j?{onTrianglePick:M}:{}}),a&&r!==`wireframe`&&e.data.edges.length>0&&(0,$.jsx)(Ny,{edges:e.data.edges,...R?{clippingPlanes:R}:{}}),tx&&(0,$.jsx)(Vy,{data:e.data,selectedFaceIds:h?[h.faceId]:[],hoverFaceId:_}),O.length>0&&(0,$.jsx)($b,{marks:O})]}),tx&&(0,$.jsx)(wb,{face:h,onClear:()=>{g(null)}}),tx&&(0,$.jsx)(Pb,{enabled:b,onToggle:ae,axis:S,onAxisChange:L,position:w,min:re,max:ie,onPositionChange:T,flip:E,onToggleFlip:()=>{D(e=>!e)}}),tx&&(0,$.jsx)(mb,{dims:Cy(e.data),volume:e.measurements.volume,area:e.measurements.area,triangles:e.data.index.length/3,valid:e.measurements.valid}),!tx&&nx&&(0,$.jsx)(mb,{dims:Cy(e.data)}),j&&(0,$.jsx)(ix,{preview:j,selected:A}),tx&&(0,$.jsx)(ab,{viewMode:r,onViewModeChange:i,showEdges:a,onToggleEdges:()=>{o(e=>!e)},showGrid:s,onToggleGrid:()=>{c(e=>!e)},autoRotate:l,onToggleAutoRotate:()=>{u(e=>!e)},projection:d,onToggleProjection:()=>{f(e=>e===`perspective`?`orthographic`:`perspective`)},activeView:t,onView:n,onFit:te,onScreenshot:rx})]}):(0,$.jsx)(`div`,{style:{color:`#9aa`,padding:16,fontFamily:`monospace`},children:`loading model…`})}Qb();var ox=document.getElementById(`root`);ox&&(0,y.createRoot)(ox).render((0,$.jsx)(v.StrictMode,{children:(0,$.jsx)(ax,{})}));
4208
+ `;function Jy({cellSize:e=10,lineColor:t=`#888898`,lineOpacity:n=.1,fadeStart:r=50,fadeEnd:i=200}){let a=(0,v.useRef)(null),o=i*2.5;return(0,v.useEffect)(()=>()=>{a.current?.dispose()},[]),(0,$.jsxs)(`mesh`,{rotation:[0,0,0],position:[0,0,-.01],children:[(0,$.jsx)(`planeGeometry`,{args:[o,o]}),(0,$.jsx)(`shaderMaterial`,{ref:a,vertexShader:Ky,fragmentShader:qy,uniforms:{cellSize:{value:e},lineColor:{value:new q(t)},lineOpacity:{value:n},fadeStart:{value:r},fadeEnd:{value:i}},transparent:!0,depthWrite:!1,side:2,polygonOffset:!0,polygonOffsetFactor:1,polygonOffsetUnits:1})]})}function Yy(){return(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(`hemisphereLight`,{args:[`#ffffff`,`#1a1a2e`,.65],position:[0,0,1]}),(0,$.jsx)(`directionalLight`,{position:[-50,-80,60],intensity:.85,color:`#fff8f0`}),(0,$.jsx)(`directionalLight`,{position:[40,-30,-40],intensity:.15,color:`#e0e8ff`})]})}function Xy({autoRotate:e=!1,target:t,gridVisible:n=!0,gridProps:r,controlsProps:i,controlsRef:a,onControlsStart:o}){let s={...a?{ref:a}:{},...t?{target:t}:{},...o?{onStart:o}:{}};return(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(Yy,{}),(0,$.jsx)(Gy,{}),(0,$.jsx)(by,{makeDefault:!0,autoRotate:e,autoRotateSpeed:1.5,...s,...i}),n&&(0,$.jsx)(Jy,{...r})]})}var Zy={iso:new K(.6,-.6,.5),front:new K(0,-1,.3),top:new K(0,.01,1),right:new K(1,0,.3)};function Qy({data:e,view:t,fitSignal:n,projection:r,onFirstFrame:i}){let a=x_(e=>e.camera),o=x_(e=>e.invalidate),s=(0,v.useRef)(!1),c=(0,v.useRef)(i);c.current=i;let{center:l,radius:u}=(0,v.useMemo)(()=>{let t=xy(e);t.computeBoundingSphere();let n=t.boundingSphere??new zi(new K,1),r={center:n.center.clone(),radius:n.radius||1};return t.dispose(),r},[e]);return(0,v.useEffect)(()=>{let e=Zy[t].clone().normalize();a.up.set(0,0,1),a.position.copy(l).addScaledVector(e,u*3),a.near=u/100,a.far=u*100;let n=a;if(n.isOrthographicCamera){let e=Math.min(n.right-n.left,n.top-n.bottom);e>0&&u>0&&(n.zoom=e/(u*2.4))}a.lookAt(l),a.updateProjectionMatrix(),o(),s.current||(s.current=!0,c.current?.())},[a,o,l,u,t,n,r]),null}function $y(){let e=x_(e=>e.camera),t=(0,v.useRef)([e.position.x,e.position.y,e.position.z]);return(0,$.jsx)(yy,{makeDefault:!0,position:t.current,up:[0,0,1],zoom:20,near:.1,far:2e3})}function eb(){let e=x_(e=>e.gl);return(0,v.useEffect)(()=>(e.localClippingEnabled=!0,()=>{e.localClippingEnabled=!1}),[e]),null}function tb({data:e,view:t=`iso`,fitSignal:n,autoRotate:r=!1,gridVisible:i=!0,projection:a=`perspective`,onFirstFrame:o,onError:s,errorFallback:c,children:l}){return(0,$.jsx)(Ay,{onError:s,fallback:c,children:(0,$.jsxs)(Hv,{camera:{position:[1,-1,1],up:[0,0,1]},frameloop:r?`always`:`demand`,gl:{preserveDrawingBuffer:!0},children:[(0,$.jsx)(eb,{}),a===`orthographic`&&(0,$.jsx)($y,{}),(0,$.jsx)(Xy,{autoRotate:r,gridVisible:i}),(0,$.jsx)(Qy,{data:e,view:t,fitSignal:n,projection:a,onFirstFrame:o}),l]})})}var nb=[`iso`,`front`,`top`,`right`],rb={solid:`Solid`,wireframe:`Wire`,xray:`X-ray`},ib={iso:`Iso`,front:`Front`,top:`Top`,right:`Right`};function ab({viewMode:e,onViewModeChange:t,showEdges:n,onToggleEdges:r,showGrid:i,onToggleGrid:a,autoRotate:o,onToggleAutoRotate:s,projection:c,onToggleProjection:l,activeView:u,onView:d,onFit:f,onScreenshot:p,touch:m=!1,className:h}){return(0,$.jsxs)(`div`,{className:h,style:h?void 0:{...cb,gap:m?8:6},children:[(f||p)&&(0,$.jsxs)(ob,{touch:m,children:[f&&(0,$.jsx)(sb,{label:`Fit`,onClick:f,touch:m}),p&&(0,$.jsx)(sb,{label:`Snap`,onClick:p,touch:m})]}),e&&t&&(0,$.jsx)(ob,{touch:m,children:Object.keys(rb).map(n=>(0,$.jsx)(sb,{label:rb[n],active:e===n,touch:m,onClick:()=>{t(n)}},n))}),(r||a||s||l)&&(0,$.jsxs)(ob,{touch:m,children:[r&&(0,$.jsx)(sb,{label:`Edges`,active:n,onClick:r,touch:m}),a&&(0,$.jsx)(sb,{label:`Grid`,active:i,onClick:a,touch:m}),s&&(0,$.jsx)(sb,{label:`Spin`,active:o,onClick:s,touch:m}),l&&(0,$.jsx)(sb,{label:c===`orthographic`?`Ortho`:`Persp`,active:c===`orthographic`,touch:m,onClick:l})]}),d&&(0,$.jsx)(ob,{touch:m,children:nb.map(e=>(0,$.jsx)(sb,{label:ib[e],active:u===e,touch:m,onClick:()=>{d(e)}},e))})]})}function ob({children:e,touch:t}){return(0,$.jsx)(`div`,{style:t?fb:lb,children:e})}function sb({label:e,active:t,onClick:n,touch:r}){return(0,$.jsx)(`button`,{type:`button`,onClick:n,"aria-pressed":t,style:{...r?pb:ub,...t?db:null},children:e})}var cb={position:`absolute`,top:12,right:12,zIndex:10,display:`flex`,flexDirection:`column`,gap:6,pointerEvents:`none`,fontFamily:`ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif`},lb={display:`flex`,flexDirection:`column`,gap:4,padding:4,borderRadius:8,background:`rgba(26, 29, 33, 0.7)`,backdropFilter:`blur(6px)`,border:`1px solid rgba(255, 255, 255, 0.08)`},ub={cursor:`pointer`,pointerEvents:`auto`,padding:`4px 10px`,borderRadius:5,fontSize:12,fontWeight:500,lineHeight:1.2,color:`#9aa3ad`,background:`rgba(255, 255, 255, 0.04)`,border:`1px solid transparent`,transition:`color 120ms, background 120ms`},db={color:`#6ee7d7`,background:`rgba(45, 212, 191, 0.16)`,borderColor:`rgba(45, 212, 191, 0.3)`},fb={...lb,gap:6,padding:6},pb={...ub,padding:`9px 14px`,fontSize:13,borderRadius:6};function mb({dims:e,volume:t,area:n,triangles:r,valid:i,unit:a,className:o}){let s=a?` ${a}`:``,c=[];return e&&c.push((0,$.jsx)(hb,{label:`Size`,value:`${gb(e[0])} × ${gb(e[1])} × ${gb(e[2])}${s}`},`size`)),t!==void 0&&c.push((0,$.jsx)(hb,{label:`Volume`,value:`${gb(t)}${a?` ${a}³`:``}`},`vol`)),n!==void 0&&c.push((0,$.jsx)(hb,{label:`Area`,value:`${gb(n)}${a?` ${a}²`:``}`},`area`)),r!==void 0&&c.push((0,$.jsx)(hb,{label:`Triangles`,value:r.toLocaleString()},`tris`)),i!==void 0&&c.push((0,$.jsx)(hb,{label:`Validity`,value:i?`valid`:`invalid`,valueColor:i?`#6ee7d7`:`#f0a0a0`},`valid`)),c.length===0?null:(0,$.jsx)(`div`,{className:o,style:o?void 0:_b,children:c})}function hb({label:e,value:t,valueColor:n}){return(0,$.jsxs)(`div`,{style:vb,children:[(0,$.jsx)(`span`,{style:yb,children:e}),(0,$.jsx)(`span`,{style:{...bb,...n?{color:n}:null},children:t})]})}function gb(e){return Number.isFinite(e)?Number.isInteger(e)?e.toLocaleString():Number(e.toFixed(2)).toLocaleString():`—`}var _b={position:`absolute`,left:12,bottom:12,zIndex:10,display:`flex`,flexDirection:`column`,gap:2,padding:`8px 10px`,borderRadius:8,minWidth:150,background:`rgba(26, 29, 33, 0.7)`,backdropFilter:`blur(6px)`,border:`1px solid rgba(255, 255, 255, 0.08)`,fontFamily:`ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif`},vb={display:`flex`,justifyContent:`space-between`,gap:16,fontSize:12,lineHeight:1.5},yb={color:`#7b8591`},bb={color:`#c8cdd3`,fontVariantNumeric:`tabular-nums`},xb={PLANE:`Planar`,CYLINDER:`Cylindrical`,CONE:`Conical`,SPHERE:`Spherical`,TORUS:`Toroidal`,BEZIER_SURFACE:`Bézier`,BSPLINE_SURFACE:`B-spline`,REVOLUTION_SURFACE:`Revolved`,EXTRUSION_SURFACE:`Extruded`,OFFSET_SURFACE:`Offset`,OTHER_SURFACE:`Surface`};function Sb(e){return xb[e]??`Surface`}function Cb(e){return Number.isFinite(e)?Number.isInteger(e)?e.toLocaleString():Number(e.toFixed(2)).toLocaleString():`—`}function wb({face:e,onClear:t,unit:n,className:r}){if(!e)return null;let[i,a,o]=e.normal;return(0,$.jsxs)(`div`,{className:r,style:r?void 0:Eb,children:[(0,$.jsxs)(`div`,{style:Db,children:[(0,$.jsxs)(`span`,{style:Ob,children:[Sb(e.surfaceType),` face`]}),t&&(0,$.jsx)(`button`,{type:`button`,onClick:t,"aria-label":`Clear selection`,style:kb,children:`✕`})]}),(0,$.jsx)(Tb,{label:`Area`,value:`${Cb(e.area)}${n?` ${n}²`:``}`}),(0,$.jsx)(Tb,{label:`Normal`,value:`${Cb(i)}, ${Cb(a)}, ${Cb(o)}`})]})}function Tb({label:e,value:t}){return(0,$.jsxs)(`div`,{style:Ab,children:[(0,$.jsx)(`span`,{style:jb,children:e}),(0,$.jsx)(`span`,{style:Mb,children:t})]})}var Eb={position:`absolute`,left:12,top:12,zIndex:10,display:`flex`,flexDirection:`column`,gap:2,padding:`8px 10px`,borderRadius:8,minWidth:170,background:`rgba(26, 29, 33, 0.7)`,backdropFilter:`blur(6px)`,border:`1px solid rgba(74, 206, 204, 0.3)`,fontFamily:`ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif`},Db={display:`flex`,justifyContent:`space-between`,alignItems:`center`,gap:12,marginBottom:2},Ob={color:`#6ee7d7`,fontSize:12,fontWeight:600},kb={cursor:`pointer`,border:`none`,background:`transparent`,color:`#7b8591`,fontSize:12,lineHeight:1,padding:0},Ab={display:`flex`,justifyContent:`space-between`,gap:16,fontSize:12,lineHeight:1.5},jb={color:`#7b8591`},Mb={color:`#c8cdd3`,fontVariantNumeric:`tabular-nums`},Nb=[`x`,`y`,`z`];function Pb({enabled:e,onToggle:t,axis:n,onAxisChange:r,position:i,min:a,max:o,onPositionChange:s,flip:c,onToggleFlip:l,className:u}){return(0,$.jsxs)(`div`,{className:u,style:u?void 0:Ib,children:[(0,$.jsx)(Fb,{label:`Section`,active:e,onClick:t}),e&&(0,$.jsxs)($.Fragment,{children:[Nb.map(e=>(0,$.jsx)(Fb,{label:e.toUpperCase(),active:n===e,onClick:()=>{r(e)}},e)),(0,$.jsx)(`input`,{type:`range`,min:a,max:o,step:(o-a)/200||.01,value:i,disabled:a===o,onChange:e=>{s(Number(e.target.value))},"aria-label":`Section position`,style:{...zb,...a===o?{opacity:.4}:null}}),(0,$.jsx)(Fb,{label:`Flip`,active:c,onClick:l})]})]})}function Fb({label:e,active:t,onClick:n}){return(0,$.jsx)(`button`,{type:`button`,onClick:n,"aria-pressed":t,style:{...Lb,...t?Rb:null},children:e})}var Ib={position:`absolute`,bottom:12,left:`50%`,transform:`translateX(-50%)`,zIndex:10,display:`flex`,alignItems:`center`,gap:4,padding:4,borderRadius:8,background:`rgba(26, 29, 33, 0.7)`,backdropFilter:`blur(6px)`,border:`1px solid rgba(255, 255, 255, 0.08)`,fontFamily:`ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif`},Lb={cursor:`pointer`,padding:`4px 10px`,borderRadius:5,fontSize:12,fontWeight:500,lineHeight:1.2,color:`#9aa3ad`,background:`rgba(255, 255, 255, 0.04)`,border:`1px solid transparent`},Rb={color:`#6ee7d7`,background:`rgba(45, 212, 191, 0.16)`,borderColor:`rgba(45, 212, 191, 0.3)`},zb={width:160,accentColor:`#4ACECC`,margin:`0 4px`};function Bb(e,t){let n=t*3,r=0,i=e.length-1;for(;r<=i;){let t=r+i>>>1,a=e[t];if(!a)break;if(n<a.start)i=t-1;else if(n>=a.start+a.count)r=t+1;else return a}return null}var Vb=e=>e+3&-4;function Hb(e){let t=new DataView(e);if(e.byteLength<8||t.getUint32(0,!0)!==1112560214)throw Error(`not a preview payload (bad magic)`);let n=t.getUint32(4,!0),r=JSON.parse(new TextDecoder().decode(new Uint8Array(e,8,n)));if(r.version!==1)throw Error(`unsupported preview payload version ${r.version}`);let i=8+Vb(n),a=(t,n)=>{let r=new t(e,i,n);return i+=n*4,r};return{data:{position:a(Float32Array,r.buffers.position),normal:a(Float32Array,r.buffers.normal),index:a(Uint32Array,r.buffers.index),edges:a(Float32Array,r.buffers.edges),...r.faceGroups?{faceGroups:[...r.faceGroups]}:{}},elements:r.elements,failed:r.failed,tree:r.tree,measurements:r.measurements}}function Ub(e){let t=new URLSearchParams(e),n=t.get(`file`);return n?{dir:t.get(`dir`),file:n}:null}function Wb(e){let t=e.lastIndexOf(`.`);return t===-1?``:e.slice(t).toLowerCase()}function Gb({inspect:e=!1}={}){let[t,n]=(0,v.useState)({status:`idle`});return(0,v.useEffect)(()=>{if(new URLSearchParams(window.location.search).has(`preview`)){n({status:`loading`});let e=!1,t=async()=>{try{let t=await fetch(`/__preview/model`);if(!t.ok)throw Error(`fetch preview model: ${t.status}`);let r=Hb(await t.arrayBuffer());if(e)return;n({status:`ready`,data:r.data,measurements:{valid:r.failed.length===0},preview:{elements:r.elements,failed:r.failed,tree:r.tree}})}catch(t){e||n({status:`error`,error:t instanceof Error?t.message:String(t)})}};t();let r=new EventSource(`/__preview/events`);return r.onmessage=()=>void t(),()=>{e=!0,r.close()}}let t=Ub(window.location.search);if(!t){n({status:`error`,error:`missing ?file= parameter`});return}if(!t.dir){n({status:`error`,error:`missing ?dir= parameter`});return}n({status:`loading`});let r=new Worker(new URL(``+new URL(`kernelWorker-C7TmNmhp.js`,import.meta.url).href,``+import.meta.url),{type:`module`}),i=!1;r.addEventListener(`message`,e=>{i||(e.data.type===`loaded`?n({status:`ready`,data:e.data.meshData,measurements:e.data.measurements}):n({status:`error`,error:e.data.error}))});let a=`/__model/${t.file.split(`/`).map(encodeURIComponent).join(`/`)}?dir=${encodeURIComponent(t.dir)}`;return fetch(a).then(e=>{if(!e.ok)throw Error(`fetch ${t.file}: ${e.status}`);return e.arrayBuffer()}).then(n=>{let i={type:`load`,bytes:n,ext:Wb(t.file),inspect:e};r.postMessage(i,[n])}).catch(e=>{i||n({status:`error`,error:e instanceof Error?e.message:String(e)})}),()=>{i=!0,r.terminate()}},[e]),t}var Kb=[`iso`,`front`,`top`,`right`],qb=new Set;function Jb(e){return Kb.includes(e)}function Yb(e){return qb.add(e),()=>qb.delete(e)}function Xb(e){for(let t of qb)t(e)}function Zb(){globalThis.__ready=!0}function Qb(){let e=globalThis;e.__ready=!1,e.__renderView=e=>{Jb(e)&&Xb({view:e})},e.__setScene=e=>{e&&Jb(e.view)&&Xb(e)}}function $b({marks:e}){return(0,$.jsx)($.Fragment,{children:e.map((e,t)=>(0,$.jsx)(iy,{position:[e.pos[0],e.pos[1],e.pos[2]],center:!0,children:(0,$.jsx)(`div`,{style:{background:`#ffcc00`,color:`#000`,font:`700 13px monospace`,padding:`1px 5px`,borderRadius:4,border:`1px solid #000`,whiteSpace:`nowrap`,pointerEvents:`none`},children:e.label})},`${e.label}-${t}`))})}var ex=new URLSearchParams(window.location.search),tx=ex.get(`ui`)!==`0`,nx=ex.get(`dims`)===`1`;function rx(){let e=document.querySelector(`canvas`);if(!e)return;let t=e.toDataURL(`image/png`),n=document.createElement(`a`);n.href=t,n.download=`brepjs-view.png`,n.click()}function ix({preview:e,selected:t}){return(0,$.jsxs)(`div`,{style:{position:`absolute`,top:12,left:12,maxWidth:340,maxHeight:`60vh`,overflowY:`auto`,background:`rgba(16, 20, 24, 0.85)`,color:`#cfd6dc`,font:`12px monospace`,padding:`8px 10px`,borderRadius:6,pointerEvents:`auto`},children:[(0,$.jsxs)(`div`,{children:[`elements: `,e.elements.length,e.failed.length>0&&(0,$.jsxs)(`span`,{style:{color:`#e88`},children:[` · `,e.failed.length,` failed`]})]}),t&&(0,$.jsxs)(`div`,{style:{color:`#ffd479`},children:[`selected: `,t]}),e.failed.map(e=>(0,$.jsxs)(`div`,{style:{color:`#e88`},children:[`✗ `,e]},e))]})}function ax(){let e=Gb({inspect:tx}),[t,n]=(0,v.useState)(`iso`),[r,i]=(0,v.useState)(`solid`),[a,o]=(0,v.useState)(!0),[s,c]=(0,v.useState)(!0),[l,u]=(0,v.useState)(!1),[d,f]=(0,v.useState)(`perspective`),[p,m]=(0,v.useState)(0),[h,g]=(0,v.useState)(null),[_,y]=(0,v.useState)(null),[b,x]=(0,v.useState)(!1),[S,C]=(0,v.useState)(`x`),[w,T]=(0,v.useState)(0),[E,D]=(0,v.useState)(!1),[O,k]=(0,v.useState)([]),[A,ee]=(0,v.useState)(null),j=e.status===`ready`?e.preview:void 0,M=(0,v.useCallback)(e=>{j&&ee(Bb(j.elements,e)?.keyPath??null)},[j]),te=(0,v.useCallback)(()=>{m(e=>e+1)},[]),N=(0,v.useCallback)(e=>{g(e)},[]),P=(0,v.useCallback)(e=>{y(e?e.faceId:null)},[]),F=(0,v.useMemo)(()=>e.status===`ready`?Sy(e.data):null,[e]);(0,v.useEffect)(()=>Yb(e=>{if(n(e.view),i(e.viewMode??`solid`),e.section&&F){let t=e.section.axis===`x`?0:e.section.axis===`y`?1:2;C(e.section.axis),T(F.min[t]+e.section.frac*(F.max[t]-F.min[t])),x(!0)}else x(!1);k(e.marks??[])}),[F]);let ne=S===`x`?0:S===`y`?1:2,re=F?F.min[ne]:0,ie=F?F.max[ne]:1,I=(0,v.useCallback)(e=>{if(!F)return 0;let t=e===`x`?0:e===`y`?1:2;return(F.min[t]+F.max[t])/2},[F]),ae=(0,v.useCallback)(()=>{x(e=>(e||T(I(S)),!e))},[I,S]),L=(0,v.useCallback)(e=>{C(e),T(I(e))},[I]),R=(0,v.useMemo)(()=>b&&F?[wy(S,w,E)]:void 0,[b,F,S,w,E]);return e.status===`error`?(0,$.jsxs)(`div`,{style:{color:`#e88`,padding:16,fontFamily:`monospace`},children:[`error: `,e.error]}):e.status===`ready`?(0,$.jsxs)($.Fragment,{children:[(0,$.jsxs)(tb,{data:e.data,view:t,fitSignal:p,autoRotate:l,gridVisible:s,projection:d,onFirstFrame:Zb,children:[(0,$.jsx)(ky,{data:e.data,viewMode:r,...R?{clippingPlanes:R}:{},...tx?{onFacePick:N,onFaceHover:P}:{},...j?{onTrianglePick:M}:{}}),a&&r!==`wireframe`&&e.data.edges.length>0&&(0,$.jsx)(Ny,{edges:e.data.edges,...R?{clippingPlanes:R}:{}}),tx&&(0,$.jsx)(Vy,{data:e.data,selectedFaceIds:h?[h.faceId]:[],hoverFaceId:_}),O.length>0&&(0,$.jsx)($b,{marks:O})]}),tx&&(0,$.jsx)(wb,{face:h,onClear:()=>{g(null)}}),tx&&(0,$.jsx)(Pb,{enabled:b,onToggle:ae,axis:S,onAxisChange:L,position:w,min:re,max:ie,onPositionChange:T,flip:E,onToggleFlip:()=>{D(e=>!e)}}),tx&&(0,$.jsx)(mb,{dims:Cy(e.data),volume:e.measurements.volume,area:e.measurements.area,triangles:e.data.index.length/3,valid:e.measurements.valid}),!tx&&nx&&(0,$.jsx)(mb,{dims:Cy(e.data)}),j&&(0,$.jsx)(ix,{preview:j,selected:A}),tx&&(0,$.jsx)(ab,{viewMode:r,onViewModeChange:i,showEdges:a,onToggleEdges:()=>{o(e=>!e)},showGrid:s,onToggleGrid:()=>{c(e=>!e)},autoRotate:l,onToggleAutoRotate:()=>{u(e=>!e)},projection:d,onToggleProjection:()=>{f(e=>e===`perspective`?`orthographic`:`perspective`)},activeView:t,onView:n,onFit:te,onScreenshot:rx})]}):(0,$.jsx)(`div`,{style:{color:`#9aa`,padding:16,fontFamily:`monospace`},children:`loading model…`})}Qb();var ox=document.getElementById(`root`);ox&&(0,y.createRoot)(ox).render((0,$.jsx)(v.StrictMode,{children:(0,$.jsx)(ax,{})}));
@@ -14,7 +14,7 @@
14
14
  background: #1a1d21;
15
15
  }
16
16
  </style>
17
- <script type="module" crossorigin src="./assets/index-Cq6KRusM.js"></script>
17
+ <script type="module" crossorigin src="./assets/index-DpWxoifW.js"></script>
18
18
  </head>
19
19
  <body>
20
20
  <div id="root"></div>