@floless/app 0.72.0 → 0.72.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.
@@ -53022,7 +53022,7 @@ function appVersion() {
53022
53022
  return resolveVersion({
53023
53023
  isSea: isSea2(),
53024
53024
  sqVersionXml: readSqVersionXml(),
53025
- define: true ? "0.72.0" : void 0,
53025
+ define: true ? "0.72.1" : void 0,
53026
53026
  pkgVersion: readPkgVersion()
53027
53027
  });
53028
53028
  }
@@ -53032,7 +53032,7 @@ function resolveChannel(s) {
53032
53032
  return "dev";
53033
53033
  }
53034
53034
  function appChannel() {
53035
- return resolveChannel({ isSea: isSea2(), define: true ? "0.72.0" : void 0 });
53035
+ return resolveChannel({ isSea: isSea2(), define: true ? "0.72.1" : void 0 });
53036
53036
  }
53037
53037
 
53038
53038
  // workflow-update.ts
@@ -2454,6 +2454,22 @@ function membersInRect(x0, y0, x1, y1) {
2454
2454
  }
2455
2455
  return out;
2456
2456
  }
2457
+ // Connection Components whose CENTRE falls inside a marquee rect (mirrors membersInRect's member-centre
2458
+ // test, applied to each connection's bounding box) — so area-select picks up connections, not just members.
2459
+ function connsInRect(x0, y0, x1, y1) {
2460
+ const rect = canvasEl.getBoundingClientRect();
2461
+ const lo = { x: Math.min(x0, x1), y: Math.min(y0, y1) }, hi = { x: Math.max(x0, x1), y: Math.max(y0, y1) };
2462
+ const conns = new Set();
2463
+ for (const m of meshById.values()) { const c = m.userData && m.userData.conn; if (c && m.visible) conns.add(c); }
2464
+ const out = [];
2465
+ for (const conn of conns) {
2466
+ const b = connBox(conn); if (b.isEmpty()) continue;
2467
+ const w = b.getCenter(new THREE.Vector3()).project(camera); if (w.z > 1) continue;
2468
+ const sx = rect.left + (w.x * 0.5 + 0.5) * rect.width, sy = rect.top + (-w.y * 0.5 + 0.5) * rect.height;
2469
+ if (sx >= lo.x && sx <= hi.x && sy >= lo.y && sy <= hi.y) out.push(conn);
2470
+ }
2471
+ return out;
2472
+ }
2457
2473
 
2458
2474
  function onUp(e) {
2459
2475
  if (e.button === 2) rightDownXY = null; // end the click-vs-drag test (rightMoved keeps the verdict for the contextmenu that follows)
@@ -2461,7 +2477,12 @@ function onUp(e) {
2461
2477
  if (!renderer || !canvasEl || canvasEl.style.display === 'none') { downXY = null; boxSel = pending = dragging = null; if (controls) controls.enabled = true; return; } // 3D hidden mid-gesture → drop stale gesture state (no resume on re-show)
2462
2478
  const bs = boxSel; boxSel = null;
2463
2479
  if (bs) { // empty-space gesture: drag = box-select, click = clear selection
2464
- if (bs.moved) { resetCycle(); const ids = membersInRect(bs.x, bs.y, e.clientX, e.clientY); if (api && api.onSelectMany) api.onSelectMany(ids); }
2480
+ if (bs.moved) { resetCycle();
2481
+ const memberIds = membersInRect(bs.x, bs.y, e.clientX, e.clientY);
2482
+ const connIds = connsInRect(bs.x, bs.y, e.clientX, e.clientY);
2483
+ if (!memberIds.length && connIds.length === 1) selectWholeConn(connIds[0]); // a lone connection framed → full component select (envelope + inspector), same as a click
2484
+ else { resetConnState(); const ids = [...memberIds, ...connIds.flatMap((c) => connChildIds(c))]; if (api && api.onSelectMany) api.onSelectMany(ids); } // members and/or several connections → a plain multi-select that INCLUDES the connections' parts
2485
+ }
2465
2486
  else clickSelect(e.clientX, e.clientY, e.ctrlKey || e.metaKey); // click in empty space → cycle-pick (may land on a derived part) or clear
2466
2487
  downXY = null; return;
2467
2488
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@floless/app",
3
- "version": "0.72.0",
3
+ "version": "0.72.1",
4
4
  "type": "module",
5
5
  "description": "Thin localhost host for floless.app — serves web/ and shells the aware CLI. No engine, no LLM.",
6
6
  "bin": {