floor-editor-ts 1.2.9 → 1.3.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.
@@ -6392,6 +6392,11 @@ function updateBackgroundImage(updates) {
6392
6392
  if (f.backgroundImage) Object.assign(f.backgroundImage, updates);
6393
6393
  });
6394
6394
  }
6395
+ var cameraThumbnailOpacity = writable(.65);
6396
+ function updateCameraThumbnailOpacity(opacity) {
6397
+ const clamped = Math.min(1, Math.max(.05, opacity));
6398
+ cameraThumbnailOpacity.set(clamped);
6399
+ }
6395
6400
  function addColumn(position, shape = "round") {
6396
6401
  const id = uid$1();
6397
6402
  mutate((f) => {
@@ -6988,15 +6993,21 @@ var DEFAULT_CONFIG = {
6988
6993
  showCameraCones: false,
6989
6994
  showCameraLabels: true,
6990
6995
  cameraHeatmapMatrix: [],
6991
- siteCameras: []
6996
+ siteCameras: [],
6997
+ cameraThumbnail: "",
6998
+ cameraThumbnailOpacity: .65
6992
6999
  };
6993
7000
  function normalizeConfig(value) {
6994
7001
  if (!value || typeof value !== "object") return { ...DEFAULT_CONFIG };
6995
7002
  const siteCameras = Array.isArray(value.siteCameras) ? value.siteCameras.filter((c) => !!c && typeof c === "object" && typeof c.serial === "string" && typeof c.name === "string") : DEFAULT_CONFIG.siteCameras;
7003
+ const image = typeof value.cameraThumbnail === "string" ? value.cameraThumbnail ? value.cameraThumbnail : DEFAULT_CONFIG.cameraThumbnail : DEFAULT_CONFIG.cameraThumbnail;
7004
+ const opacity = typeof value.cameraThumbnailOpacity === "number" && value.cameraThumbnailOpacity >= 0 && value.cameraThumbnailOpacity <= 1 ? value.cameraThumbnailOpacity : DEFAULT_CONFIG.cameraThumbnailOpacity;
6996
7005
  return {
6997
7006
  ...DEFAULT_CONFIG,
6998
7007
  ...value,
6999
- siteCameras
7008
+ siteCameras,
7009
+ cameraThumbnail: image,
7010
+ cameraThumbnailOpacity: opacity
7000
7011
  };
7001
7012
  }
7002
7013
  function normalizeFloorData(data) {
@@ -58098,9 +58109,9 @@ var root_17$2 = /* @__PURE__ */ from_html(`<div class="text-[10px] text-gray-400
58098
58109
  var root_18$2 = /* @__PURE__ */ from_html(`<button> </button>`);
58099
58110
  var root_20$2 = /* @__PURE__ */ from_html(`<button draggable="true"><span role="button" tabindex="0"> </span> <div class="w-8 h-8 rounded-lg flex items-center justify-center"><div class="w-4 h-4 rounded-sm"></div></div> <span class="text-[10px] font-medium text-gray-600 leading-tight text-center"> </span></button>`);
58100
58111
  var root_19$2 = /* @__PURE__ */ from_html(`<div class="mt-1"><h4 class="text-[10px] font-semibold text-gray-400 uppercase mb-1.5">Recent</h4> <div class="grid grid-cols-2 gap-2"></div></div> <hr class="border-gray-100"/>`, 1);
58101
- var root_22$2 = /* @__PURE__ */ from_html(`<span class="text-xs font-medium text-gray-600"> <mark class="bg-yellow-200 text-gray-800 rounded-sm px-0.5"> </mark> </span>`);
58112
+ var root_22$1 = /* @__PURE__ */ from_html(`<span class="text-xs font-medium text-gray-600"> <mark class="bg-yellow-200 text-gray-800 rounded-sm px-0.5"> </mark> </span>`);
58102
58113
  var root_23$2 = /* @__PURE__ */ from_html(`<span class="text-xs font-medium text-gray-600"> </span>`);
58103
- var root_21$1 = /* @__PURE__ */ from_html(`<button draggable="true"><span role="button" tabindex="0"> </span> <div class="w-10 h-10 rounded-lg flex items-center justify-center"><div class="w-5 h-5 rounded-sm"></div></div> <!> <span class="text-[10px] text-gray-400"> </span></button>`);
58114
+ var root_21$2 = /* @__PURE__ */ from_html(`<button draggable="true"><span role="button" tabindex="0"> </span> <div class="w-10 h-10 rounded-lg flex items-center justify-center"><div class="w-5 h-5 rounded-sm"></div></div> <!> <span class="text-[10px] text-gray-400"> </span></button>`);
58104
58115
  var root_15$2 = /* @__PURE__ */ from_html(`<div class="space-y-2"><div class="relative"><input type="text" placeholder="Search furniture..." class="w-full px-3 py-2 pr-8 border border-gray-200 rounded-lg text-sm focus:ring-2 focus:ring-blue-200 focus:border-blue-400 outline-none"/> <!></div> <!> <div class="flex flex-wrap gap-1 max-h-24 overflow-y-auto"><button>All</button> <button> </button> <!></div> <!> <div class="grid grid-cols-2 gap-2 mt-2"></div></div>`);
58105
58116
  var root_24$2 = /* @__PURE__ */ from_html(`<div class="fixed z-50 pointer-events-none"><div class="bg-white rounded-xl shadow-2xl border border-gray-200 overflow-hidden" style="width: 220px;"><div class="w-full h-[120px] bg-gray-50 flex items-center justify-center p-3"><div class="w-16 h-16 rounded-xl flex items-center justify-center"><div class="w-10 h-10 rounded-md"></div></div></div> <div class="p-3 space-y-1.5"><div class="flex items-center gap-2"><span class="text-sm font-semibold text-gray-800"> </span> <span class="px-1.5 py-0.5 rounded-full text-[9px] font-semibold text-white"> </span></div> <div class="text-xs text-gray-500"> </div></div></div></div>`);
58106
58117
  var root_25$1 = /* @__PURE__ */ from_html(`<div class="fixed inset-0 bg-black/50 z-50 flex items-center justify-center"><div class="bg-white rounded-xl shadow-2xl w-80 p-5"><h3 class="text-sm font-bold text-gray-800 mb-1">Import RoomPlan</h3> <p class="text-xs text-gray-400 mb-4"> </p> <div class="space-y-3"><label class="flex items-start gap-2.5 cursor-pointer"><input type="checkbox" class="accent-blue-500 mt-0.5"/> <div><div class="text-sm font-medium text-gray-700">Straighten walls</div> <div class="text-xs text-gray-400">Snap near-horizontal/vertical walls to axis</div></div></label> <label class="flex items-start gap-2.5 cursor-pointer"><input type="checkbox" class="accent-blue-500 mt-0.5"/> <div><div class="text-sm font-medium text-gray-700">Enforce orthogonal <span class="text-xs text-blue-400 font-mono"> </span></div> <div class="text-xs text-gray-400">Force all walls to 90°/180° angles</div></div></label> <label class="block"><div class="text-xs text-gray-500 mb-1">Corner merge distance (cm)</div> <input type="number" min="0" max="50" step="5" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label></div> <div class="flex gap-2 mt-5"><button class="flex-1 px-3 py-2 border border-gray-200 rounded-lg text-sm text-gray-600 hover:bg-gray-50 transition-colors">Cancel</button> <button class="flex-1 px-3 py-2 bg-blue-500 text-white rounded-lg text-sm font-medium hover:bg-blue-600 transition-colors">Import</button></div></div></div>`);
@@ -58758,7 +58769,7 @@ function BuildPanel($$anchor, $$props) {
58758
58769
  var div_29 = sibling(node_6, 2);
58759
58770
  each(div_29, 21, () => get(filtered), index$1, ($$anchor, item) => {
58760
58771
  const s = /* @__PURE__ */ user_derived(() => get(search).toLowerCase());
58761
- var button_23 = root_21$1();
58772
+ var button_23 = root_21$2();
58762
58773
  var span_10 = child(button_23);
58763
58774
  var text_22 = child(span_10, true);
58764
58775
  reset(span_10);
@@ -58768,7 +58779,7 @@ function BuildPanel($$anchor, $$props) {
58768
58779
  var node_7 = sibling(div_30, 2);
58769
58780
  var consequent_12 = ($$anchor) => {
58770
58781
  const idx = /* @__PURE__ */ user_derived(() => get(item).name.toLowerCase().indexOf(get(s)));
58771
- var span_11 = root_22$2();
58782
+ var span_11 = root_22$1();
58772
58783
  var text_23 = child(span_11, true);
58773
58784
  var mark = sibling(text_23);
58774
58785
  var text_24 = child(mark, true);
@@ -59351,17 +59362,18 @@ var root_12$1 = /* @__PURE__ */ from_html(`<label class="block"><span class="tex
59351
59362
  var root_15$1 = /* @__PURE__ */ from_html(`<label class="block"><span class="text-xs text-gray-500">Camera Name</span> <input type="text" placeholder="Display name" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label> <label class="block"><span class="text-xs text-gray-500">Camera Serial</span> <input type="text" placeholder="Device serial" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label>`, 1);
59352
59363
  var root_16 = /* @__PURE__ */ from_html(`<button></button>`);
59353
59364
  var root_10$1 = /* @__PURE__ */ from_html(`<h3 class="text-sm font-semibold text-gray-700 mb-3 flex items-center gap-2"><span class="w-6 h-6 bg-purple-100 rounded flex items-center justify-center text-xs"> </span> <button> </button></h3> <div class="space-y-3"><!> <div><div class="flex items-center gap-1 mb-2"><span class="text-xs text-gray-500">Color</span> <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="text-gray-400"><rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect><circle cx="9" cy="9" r="2"></circle><path d="m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21"></path></svg></div> <div class="grid grid-cols-5 gap-1.5 mb-2"></div> <div class="flex items-center gap-2"><span class="text-xs text-gray-500">Custom:</span> <input type="color" class="w-8 h-6 rounded border border-gray-200 cursor-pointer"/></div></div> <label class="block"><span class="text-xs text-gray-500"> </span> <input type="number" min="1" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label> <label class="block"><span class="text-xs text-gray-500"> </span> <input type="number" min="1" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label> <label class="block"><span class="text-xs text-gray-500"> </span> <input type="number" min="1" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label> <label class="block"><span class="text-xs text-gray-500">Material</span> <select class="w-full px-2 py-1 border border-gray-200 rounded text-sm"><option>Wood</option><option>Metal</option><option>Fabric</option><option>Leather</option><option>Glass</option><option>Plastic</option><option>Stone</option><option>Ceramic</option></select></label> <label class="block"><span class="text-xs text-gray-500">Rotation (degrees)</span> <input type="number" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label> <div class="flex gap-1"><button class="flex-1 px-2 py-1.5 border border-gray-200 rounded text-sm hover:bg-gray-50 transition-colors" title="Rotate 90° left">↺ 90°</button> <button class="flex-1 px-2 py-1.5 border border-gray-200 rounded text-sm hover:bg-gray-50 transition-colors" title="Rotate 90° right">↻ 90°</button></div> <div class="flex gap-1"><button class="flex-1 px-2 py-1.5 border border-gray-200 rounded text-sm hover:bg-gray-50 transition-colors" title="Flip horizontally">↔ Flip H</button> <button class="flex-1 px-2 py-1.5 border border-gray-200 rounded text-sm hover:bg-gray-50 transition-colors" title="Flip vertically">↕ Flip V</button></div> <button class="w-full px-2 py-1.5 border border-gray-300 rounded text-sm text-gray-600 hover:bg-gray-50 transition-colors">Reset to defaults</button></div>`, 1);
59354
- var root_18$1 = /* @__PURE__ */ from_html(`<option> </option>`);
59355
- var root_19$1 = /* @__PURE__ */ from_html(`<button></button>`);
59356
- var root_22$1 = /* @__PURE__ */ from_html(`<button><div class="w-full h-12 rounded-md mb-1 overflow-hidden"></div> <div class="text-center leading-3 text-[10px] text-gray-600 truncate"> </div></button>`);
59357
- var root_20$1 = /* @__PURE__ */ from_html(`<div><span class="text-xs font-medium text-gray-600 mb-1.5 block"> </span> <div class="grid grid-cols-3 gap-1.5"></div></div>`);
59358
- var root_17$1 = /* @__PURE__ */ from_html(`<h3 class="text-sm font-semibold text-gray-700 mb-3 flex items-center gap-2"><span class="w-6 h-6 bg-green-100 rounded flex items-center justify-center text-xs">⬜</span> Room Properties</h3> <div class="space-y-3"><label class="block"><span class="text-xs text-gray-500">Room Type</span> <select class="w-full px-2 py-1 border border-gray-200 rounded text-sm"></select></label> <label class="block"><span class="text-xs text-gray-500">Room Name</span> <input type="text" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label> <label class="block"><span class="text-xs text-gray-500">Category</span> <select class="w-full px-2 py-1 border border-gray-200 rounded text-sm"><option>🏠 Indoor</option><option>🌳 Outdoor</option><option>🚗 Garage</option><option>🔧 Utility</option></select></label> <div><span class="text-xs text-gray-500">Area</span> <p class="text-sm text-gray-700"> </p></div> <div><span class="text-xs text-gray-500 mb-1.5 block">Room Color</span> <div class="grid grid-cols-5 gap-1.5 mb-2"></div> <div class="flex items-center gap-2"><span class="text-xs text-gray-500">Custom:</span> <input type="color" class="w-8 h-6 rounded border border-gray-200 cursor-pointer"/></div></div> <div><div class="flex items-center gap-1 mb-2"><span class="text-xs text-gray-500">Floor Material</span> <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="text-gray-400"><path d="M3 3h18v18H3z"></path><path d="M8 8h8v8H8z"></path></svg></div> <div class="space-y-3"></div></div></div>`, 1);
59359
- var root_23$1 = /* @__PURE__ */ from_html(`<h3 class="text-sm font-semibold text-gray-700 mb-3 flex items-center gap-2"><span class="w-6 h-6 bg-gray-200 rounded flex items-center justify-center text-xs">🪜</span> Stair Properties</h3> <div class="space-y-3"><label class="block"><span class="text-xs text-gray-500">Type</span> <select class="w-full px-2 py-1 border border-gray-200 rounded text-sm"><option>Straight</option><option>L-Shaped</option><option>U-Shaped</option><option>Spiral</option></select></label> <label class="block"><span class="text-xs text-gray-500"> </span> <input type="number" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label> <label class="block"><span class="text-xs text-gray-500"> </span> <input type="number" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label> <label class="block"><span class="text-xs text-gray-500">Risers</span> <input type="number" min="3" max="30" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label> <label class="block"><span class="text-xs text-gray-500">Direction</span> <div class="flex gap-2"><button>Up ↑</button> <button>Down ↓</button></div></label> <label class="block"><span class="text-xs text-gray-500">Rotation (degrees)</span> <input type="number" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label></div>`, 1);
59360
- var root_25 = /* @__PURE__ */ from_html(`<button></button>`);
59361
- var root_26 = /* @__PURE__ */ from_html(`<label class="block"><span class="text-xs text-gray-500">Rotation (degrees)</span> <input type="number" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label>`);
59362
- var root_24$1 = /* @__PURE__ */ from_html(`<h3 class="text-sm font-semibold text-gray-700 mb-3 flex items-center gap-2"><span class="w-6 h-6 bg-gray-200 rounded flex items-center justify-center text-xs">🏛️</span> Column Properties</h3> <div class="space-y-3"><label class="block"><span class="text-xs text-gray-500">Shape</span> <div class="flex gap-2"><button>⭕ Round</button> <button>⬜ Square</button></div></label> <label class="block"><span class="text-xs text-gray-500"> </span> <input type="number" min="10" max="200" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label> <label class="block"><span class="text-xs text-gray-500"> </span> <input type="number" min="50" max="1000" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label> <div><span class="text-xs text-gray-500 mb-1.5 block">Color</span> <div class="grid grid-cols-5 gap-1.5 mb-2"></div> <div class="flex items-center gap-2"><span class="text-xs text-gray-500">Custom:</span> <input type="color" class="w-8 h-6 rounded border border-gray-200 cursor-pointer"/></div></div> <!></div>`, 1);
59363
- var root_27 = /* @__PURE__ */ from_html(`<div class="space-y-3"><h3 class="text-sm font-semibold text-gray-700 mb-3 flex items-center gap-2"><span class="w-6 h-6 bg-emerald-100 rounded flex items-center justify-center text-xs">🏷️</span> Text Annotation</h3> <label class="block"><span class="text-xs text-gray-500">Text</span> <input type="text" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label> <label class="block"><span class="text-xs text-gray-500">Font Size</span> <input type="number" min="8" max="72" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label> <label class="block"><span class="text-xs text-gray-500">Color</span> <div class="flex items-center gap-2"><input type="color" class="w-8 h-6 rounded border border-gray-200 cursor-pointer"/> <span class="text-xs text-gray-400"> </span></div></label> <label class="block"><span class="text-xs text-gray-500">Rotation (°)</span> <input type="number" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label> <label class="block"><span class="text-xs text-gray-500">X</span> <input type="number" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label> <label class="block"><span class="text-xs text-gray-500">Y</span> <input type="number" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label></div>`);
59364
- var root_28 = /* @__PURE__ */ from_html(`<div class="mt-4 pt-3 border-t border-gray-200"><h3 class="text-sm font-semibold text-gray-700 mb-3 flex items-center gap-2"><span class="w-6 h-6 bg-blue-100 rounded flex items-center justify-center text-xs">🖼️</span> Background Image</h3> <div class="space-y-3"><label class="block"><span class="text-xs text-gray-500">Opacity</span> <input type="range" min="0.05" max="1" step="0.05" class="w-full"/></label> <label class="block"><span class="text-xs text-gray-500">Scale</span> <input type="range" min="0.1" max="5" step="0.05" class="w-full"/></label> <label class="block"><span class="text-xs text-gray-500">Rotation</span> <input type="number" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label> <div class="flex gap-2"><button> </button> <button class="flex-1 px-2 py-1.5 border rounded text-sm border-gray-200 hover:bg-gray-50">📏 Set Scale</button></div> <button class="w-full px-2 py-1.5 border border-red-300 rounded text-sm text-red-600 hover:bg-red-50">Remove Image</button></div></div>`);
59365
+ var root_18$1 = /* @__PURE__ */ from_html(`<label class="block pb-3 border-b border-gray-200"><span class="text-xs text-gray-500"> </span> <input type="range" min="0.05" max="1" step="0.05" class="w-full"/></label>`);
59366
+ var root_19$1 = /* @__PURE__ */ from_html(`<option> </option>`);
59367
+ var root_20$1 = /* @__PURE__ */ from_html(`<button></button>`);
59368
+ var root_23$1 = /* @__PURE__ */ from_html(`<button><div class="w-full h-12 rounded-md mb-1 overflow-hidden"></div> <div class="text-center leading-3 text-[10px] text-gray-600 truncate"> </div></button>`);
59369
+ var root_21$1 = /* @__PURE__ */ from_html(`<div><span class="text-xs font-medium text-gray-600 mb-1.5 block"> </span> <div class="grid grid-cols-3 gap-1.5"></div></div>`);
59370
+ var root_17$1 = /* @__PURE__ */ from_html(`<h3 class="text-sm font-semibold text-gray-700 mb-3 flex items-center gap-2"><span class="w-6 h-6 bg-green-100 rounded flex items-center justify-center text-xs">⬜</span> Room Properties</h3> <div class="space-y-3"><!> <label class="block"><span class="text-xs text-gray-500">Room Type</span> <select class="w-full px-2 py-1 border border-gray-200 rounded text-sm"></select></label> <label class="block"><span class="text-xs text-gray-500">Room Name</span> <input type="text" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label> <label class="block"><span class="text-xs text-gray-500">Category</span> <select class="w-full px-2 py-1 border border-gray-200 rounded text-sm"><option>🏠 Indoor</option><option>🌳 Outdoor</option><option>🚗 Garage</option><option>🔧 Utility</option></select></label> <div><span class="text-xs text-gray-500">Area</span> <p class="text-sm text-gray-700"> </p></div> <div><span class="text-xs text-gray-500 mb-1.5 block">Room Color</span> <div class="grid grid-cols-5 gap-1.5 mb-2"></div> <div class="flex items-center gap-2"><span class="text-xs text-gray-500">Custom:</span> <input type="color" class="w-8 h-6 rounded border border-gray-200 cursor-pointer"/></div></div> <div><div class="flex items-center gap-1 mb-2"><span class="text-xs text-gray-500">Floor Material</span> <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="text-gray-400"><path d="M3 3h18v18H3z"></path><path d="M8 8h8v8H8z"></path></svg></div> <div class="space-y-3"></div></div></div>`, 1);
59371
+ var root_24$1 = /* @__PURE__ */ from_html(`<h3 class="text-sm font-semibold text-gray-700 mb-3 flex items-center gap-2"><span class="w-6 h-6 bg-gray-200 rounded flex items-center justify-center text-xs">🪜</span> Stair Properties</h3> <div class="space-y-3"><label class="block"><span class="text-xs text-gray-500">Type</span> <select class="w-full px-2 py-1 border border-gray-200 rounded text-sm"><option>Straight</option><option>L-Shaped</option><option>U-Shaped</option><option>Spiral</option></select></label> <label class="block"><span class="text-xs text-gray-500"> </span> <input type="number" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label> <label class="block"><span class="text-xs text-gray-500"> </span> <input type="number" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label> <label class="block"><span class="text-xs text-gray-500">Risers</span> <input type="number" min="3" max="30" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label> <label class="block"><span class="text-xs text-gray-500">Direction</span> <div class="flex gap-2"><button>Up ↑</button> <button>Down ↓</button></div></label> <label class="block"><span class="text-xs text-gray-500">Rotation (degrees)</span> <input type="number" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label></div>`, 1);
59372
+ var root_26 = /* @__PURE__ */ from_html(`<button></button>`);
59373
+ var root_27 = /* @__PURE__ */ from_html(`<label class="block"><span class="text-xs text-gray-500">Rotation (degrees)</span> <input type="number" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label>`);
59374
+ var root_25 = /* @__PURE__ */ from_html(`<h3 class="text-sm font-semibold text-gray-700 mb-3 flex items-center gap-2"><span class="w-6 h-6 bg-gray-200 rounded flex items-center justify-center text-xs">🏛️</span> Column Properties</h3> <div class="space-y-3"><label class="block"><span class="text-xs text-gray-500">Shape</span> <div class="flex gap-2"><button>⭕ Round</button> <button>⬜ Square</button></div></label> <label class="block"><span class="text-xs text-gray-500"> </span> <input type="number" min="10" max="200" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label> <label class="block"><span class="text-xs text-gray-500"> </span> <input type="number" min="50" max="1000" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label> <div><span class="text-xs text-gray-500 mb-1.5 block">Color</span> <div class="grid grid-cols-5 gap-1.5 mb-2"></div> <div class="flex items-center gap-2"><span class="text-xs text-gray-500">Custom:</span> <input type="color" class="w-8 h-6 rounded border border-gray-200 cursor-pointer"/></div></div> <!></div>`, 1);
59375
+ var root_28 = /* @__PURE__ */ from_html(`<div class="space-y-3"><h3 class="text-sm font-semibold text-gray-700 mb-3 flex items-center gap-2"><span class="w-6 h-6 bg-emerald-100 rounded flex items-center justify-center text-xs">🏷️</span> Text Annotation</h3> <label class="block"><span class="text-xs text-gray-500">Text</span> <input type="text" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label> <label class="block"><span class="text-xs text-gray-500">Font Size</span> <input type="number" min="8" max="72" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label> <label class="block"><span class="text-xs text-gray-500">Color</span> <div class="flex items-center gap-2"><input type="color" class="w-8 h-6 rounded border border-gray-200 cursor-pointer"/> <span class="text-xs text-gray-400"> </span></div></label> <label class="block"><span class="text-xs text-gray-500">Rotation (°)</span> <input type="number" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label> <label class="block"><span class="text-xs text-gray-500">X</span> <input type="number" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label> <label class="block"><span class="text-xs text-gray-500">Y</span> <input type="number" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label></div>`);
59376
+ var root_29 = /* @__PURE__ */ from_html(`<div class="mt-4 pt-3 border-t border-gray-200"><h3 class="text-sm font-semibold text-gray-700 mb-3 flex items-center gap-2"><span class="w-6 h-6 bg-blue-100 rounded flex items-center justify-center text-xs">🖼️</span> Background Image</h3> <div class="space-y-3"><label class="block"><span class="text-xs text-gray-500">Opacity</span> <input type="range" min="0.05" max="1" step="0.05" class="w-full"/></label> <label class="block"><span class="text-xs text-gray-500">Scale</span> <input type="range" min="0.1" max="5" step="0.05" class="w-full"/></label> <label class="block"><span class="text-xs text-gray-500">Rotation</span> <input type="number" class="w-full px-2 py-1 border border-gray-200 rounded text-sm"/></label> <div class="flex gap-2"><button> </button> <button class="flex-1 px-2 py-1.5 border rounded text-sm border-gray-200 hover:bg-gray-50">📏 Set Scale</button></div> <button class="w-full px-2 py-1.5 border border-red-300 rounded text-sm text-red-600 hover:bg-red-50">Remove Image</button></div></div>`);
59365
59377
  var root$3 = /* @__PURE__ */ from_html(`<div data-properties-panel="" style="top: 48px; bottom: 36px;"><!> <!></div>`);
59366
59378
  function PropertiesPanel($$anchor, $$props) {
59367
59379
  push($$props, true);
@@ -59399,7 +59411,7 @@ function PropertiesPanel($$anchor, $$props) {
59399
59411
  function unitLabel() {
59400
59412
  return get(settings).units === "imperial" ? "in" : "cm";
59401
59413
  }
59402
- let is3D = prop($$props, "is3D", 3, false), siteCameras = prop($$props, "siteCameras", 19, () => []);
59414
+ let is3D = prop($$props, "is3D", 3, false), siteCameras = prop($$props, "siteCameras", 19, () => []), cameraThumbnail = prop($$props, "cameraThumbnail", 3, "");
59403
59415
  let wallSideTab = /* @__PURE__ */ state("interior");
59404
59416
  let selectedWall = /* @__PURE__ */ user_derived(() => {
59405
59417
  var _$$get$walls$find, _$$get;
@@ -59433,17 +59445,25 @@ function PropertiesPanel($$anchor, $$props) {
59433
59445
  var _$$get8;
59434
59446
  return !!((_$$get8 = get(floor)) === null || _$$get8 === void 0 ? void 0 : _$$get8.backgroundImage);
59435
59447
  });
59448
+ let hasCameraThumbnailOverlay = /* @__PURE__ */ user_derived(() => {
59449
+ var _cameraThumbnail, _$$get9;
59450
+ return !!((_cameraThumbnail = cameraThumbnail()) === null || _cameraThumbnail === void 0 ? void 0 : _cameraThumbnail.trim()) && !((_$$get9 = get(floor)) === null || _$$get9 === void 0 ? void 0 : _$$get9.backgroundImage);
59451
+ });
59452
+ let thumbOpacity = /* @__PURE__ */ state(.65);
59453
+ cameraThumbnailOpacity.subscribe((v) => {
59454
+ set(thumbOpacity, v, true);
59455
+ });
59436
59456
  let selectedRoom = /* @__PURE__ */ user_derived(() => {
59437
- var _ref, _$$get$rooms$find, _$$get9;
59438
- return (_ref = (_$$get$rooms$find = (_$$get9 = get(floor)) === null || _$$get9 === void 0 || (_$$get9 = _$$get9.rooms) === null || _$$get9 === void 0 ? void 0 : _$$get9.find((r) => r.id === get(selRoomId))) !== null && _$$get$rooms$find !== void 0 ? _$$get$rooms$find : get(detectedRooms).find((r) => r.id === get(selRoomId))) !== null && _ref !== void 0 ? _ref : null;
59457
+ var _ref, _$$get$rooms$find, _$$get10;
59458
+ return (_ref = (_$$get$rooms$find = (_$$get10 = get(floor)) === null || _$$get10 === void 0 || (_$$get10 = _$$get10.rooms) === null || _$$get10 === void 0 ? void 0 : _$$get10.find((r) => r.id === get(selRoomId))) !== null && _$$get$rooms$find !== void 0 ? _$$get$rooms$find : get(detectedRooms).find((r) => r.id === get(selRoomId))) !== null && _ref !== void 0 ? _ref : null;
59439
59459
  });
59440
59460
  let selectedDoorWall = /* @__PURE__ */ user_derived(() => {
59441
- var _ref2, _$$get10;
59442
- return (_ref2 = get(selectedDoor) && ((_$$get10 = get(floor)) === null || _$$get10 === void 0 || (_$$get10 = _$$get10.walls) === null || _$$get10 === void 0 ? void 0 : _$$get10.find((w) => w.id === get(selectedDoor).wallId))) !== null && _ref2 !== void 0 ? _ref2 : null;
59461
+ var _ref2, _$$get11;
59462
+ return (_ref2 = get(selectedDoor) && ((_$$get11 = get(floor)) === null || _$$get11 === void 0 || (_$$get11 = _$$get11.walls) === null || _$$get11 === void 0 ? void 0 : _$$get11.find((w) => w.id === get(selectedDoor).wallId))) !== null && _ref2 !== void 0 ? _ref2 : null;
59443
59463
  });
59444
59464
  let selectedWindowWall = /* @__PURE__ */ user_derived(() => {
59445
- var _ref3, _$$get11;
59446
- return (_ref3 = get(selectedWindow) && ((_$$get11 = get(floor)) === null || _$$get11 === void 0 || (_$$get11 = _$$get11.walls) === null || _$$get11 === void 0 ? void 0 : _$$get11.find((w) => w.id === get(selectedWindow).wallId))) !== null && _ref3 !== void 0 ? _ref3 : null;
59465
+ var _ref3, _$$get12;
59466
+ return (_ref3 = get(selectedWindow) && ((_$$get12 = get(floor)) === null || _$$get12 === void 0 || (_$$get12 = _$$get12.walls) === null || _$$get12 === void 0 ? void 0 : _$$get12.find((w) => w.id === get(selectedWindow).wallId))) !== null && _ref3 !== void 0 ? _ref3 : null;
59447
59467
  });
59448
59468
  function calcWallLength(wall) {
59449
59469
  if (wall.curvePoint) {
@@ -59540,9 +59560,9 @@ function PropertiesPanel($$anchor, $$props) {
59540
59560
  }
59541
59561
  const useSiteCameraSelect = /* @__PURE__ */ user_derived(() => siteCameras().length > 0);
59542
59562
  const usedCameraSerials = /* @__PURE__ */ user_derived(() => {
59543
- var _$$get12;
59563
+ var _$$get13;
59544
59564
  const used = /* @__PURE__ */ new Set();
59545
- if (!((_$$get12 = get(floor)) === null || _$$get12 === void 0 ? void 0 : _$$get12.furniture) || !get(selectedFurniture)) return used;
59565
+ if (!((_$$get13 = get(floor)) === null || _$$get13 === void 0 ? void 0 : _$$get13.furniture) || !get(selectedFurniture)) return used;
59546
59566
  for (const item of get(floor).furniture) {
59547
59567
  if (item.catalogId !== "camera" || item.id === get(selectedFurniture).id) continue;
59548
59568
  if (item.serial) used.add(item.serial);
@@ -60129,7 +60149,7 @@ function PropertiesPanel($$anchor, $$props) {
60129
60149
  reset(label_11);
60130
60150
  reset(div_11);
60131
60151
  template_effect(($0, $1, $2, $3, $4, $5, $6, $7) => {
60132
- var _$$get13, _$$get14, _$$get15, _$$get16;
60152
+ var _$$get14, _$$get15, _$$get16, _$$get17;
60133
60153
  set_text(text_6, `Width (${$0 !== null && $0 !== void 0 ? $0 : ""})`);
60134
60154
  set_value(input_5, $1);
60135
60155
  set_text(text_7, `Distance from A (${$2 !== null && $2 !== void 0 ? $2 : ""})`);
@@ -60142,10 +60162,10 @@ function PropertiesPanel($$anchor, $$props) {
60142
60162
  var _select$__value;
60143
60163
  select.value = (_select$__value = select.__value = get(selectedDoor).type) !== null && _select$__value !== void 0 ? _select$__value : "", select_option(select, get(selectedDoor).type);
60144
60164
  }
60145
- set_class(button_9, 1, `flex-1 px-2 py-1.5 border rounded text-sm transition-colors ${((_$$get13 = get(selectedDoor)) === null || _$$get13 === void 0 ? void 0 : _$$get13.swingDirection) === "left" ? "bg-blue-100 border-blue-400 text-blue-700" : "border-gray-200 hover:bg-gray-50"}`);
60146
- set_class(button_10, 1, `flex-1 px-2 py-1.5 border rounded text-sm transition-colors ${((_$$get14 = get(selectedDoor)) === null || _$$get14 === void 0 ? void 0 : _$$get14.swingDirection) === "right" ? "bg-blue-100 border-blue-400 text-blue-700" : "border-gray-200 hover:bg-gray-50"}`);
60147
- set_class(button_11, 1, `flex-1 px-2 py-1.5 border rounded text-sm transition-colors ${!((_$$get15 = get(selectedDoor)) === null || _$$get15 === void 0 ? void 0 : _$$get15.flipSide) ? "bg-blue-100 border-blue-400 text-blue-700" : "border-gray-200 hover:bg-gray-50"}`);
60148
- set_class(button_12, 1, `flex-1 px-2 py-1.5 border rounded text-sm transition-colors ${((_$$get16 = get(selectedDoor)) === null || _$$get16 === void 0 ? void 0 : _$$get16.flipSide) ? "bg-blue-100 border-blue-400 text-blue-700" : "border-gray-200 hover:bg-gray-50"}`);
60165
+ set_class(button_9, 1, `flex-1 px-2 py-1.5 border rounded text-sm transition-colors ${((_$$get14 = get(selectedDoor)) === null || _$$get14 === void 0 ? void 0 : _$$get14.swingDirection) === "left" ? "bg-blue-100 border-blue-400 text-blue-700" : "border-gray-200 hover:bg-gray-50"}`);
60166
+ set_class(button_10, 1, `flex-1 px-2 py-1.5 border rounded text-sm transition-colors ${((_$$get15 = get(selectedDoor)) === null || _$$get15 === void 0 ? void 0 : _$$get15.swingDirection) === "right" ? "bg-blue-100 border-blue-400 text-blue-700" : "border-gray-200 hover:bg-gray-50"}`);
60167
+ set_class(button_11, 1, `flex-1 px-2 py-1.5 border rounded text-sm transition-colors ${!((_$$get16 = get(selectedDoor)) === null || _$$get16 === void 0 ? void 0 : _$$get16.flipSide) ? "bg-blue-100 border-blue-400 text-blue-700" : "border-gray-200 hover:bg-gray-50"}`);
60168
+ set_class(button_12, 1, `flex-1 px-2 py-1.5 border rounded text-sm transition-colors ${((_$$get17 = get(selectedDoor)) === null || _$$get17 === void 0 ? void 0 : _$$get17.flipSide) ? "bg-blue-100 border-blue-400 text-blue-700" : "border-gray-200 hover:bg-gray-50"}`);
60149
60169
  }, [
60150
60170
  () => unitLabel(),
60151
60171
  () => displayValue(get(selectedDoor).width),
@@ -60537,19 +60557,38 @@ function PropertiesPanel($$anchor, $$props) {
60537
60557
  delegated("click", button_19, resetFurnitureDefaults);
60538
60558
  append($$anchor, fragment_3);
60539
60559
  };
60540
- var consequent_9 = ($$anchor) => {
60560
+ var consequent_10 = ($$anchor) => {
60541
60561
  var fragment_7 = root_17$1();
60542
60562
  var div_21 = sibling(first_child(fragment_7), 2);
60543
- var label_26 = child(div_21);
60544
- var select_4 = sibling(child(label_26), 2);
60563
+ var node_8 = child(div_21);
60564
+ var consequent_8 = ($$anchor) => {
60565
+ var label_26 = root_18$1();
60566
+ var span_19 = child(label_26);
60567
+ var text_23 = child(span_19);
60568
+ reset(span_19);
60569
+ var input_21 = sibling(span_19, 2);
60570
+ remove_input_defaults(input_21);
60571
+ reset(label_26);
60572
+ template_effect(($0) => {
60573
+ set_text(text_23, `Camera Thumbnail Opacity (${$0 !== null && $0 !== void 0 ? $0 : ""}%)`);
60574
+ set_value(input_21, get(thumbOpacity));
60575
+ }, [() => Math.round(get(thumbOpacity) * 100)]);
60576
+ delegated("input", input_21, (e) => updateCameraThumbnailOpacity(Number(e.target.value)));
60577
+ append($$anchor, label_26);
60578
+ };
60579
+ if_block(node_8, ($$render) => {
60580
+ if (get(hasCameraThumbnailOverlay)) $$render(consequent_8);
60581
+ });
60582
+ var label_27 = sibling(node_8, 2);
60583
+ var select_4 = sibling(child(label_27), 2);
60545
60584
  each(select_4, 21, () => roomTypes, index$1, ($$anchor, rt) => {
60546
- var option_21 = root_18$1();
60547
- var text_23 = child(option_21);
60585
+ var option_21 = root_19$1();
60586
+ var text_24 = child(option_21);
60548
60587
  reset(option_21);
60549
60588
  var option_21_value = {};
60550
60589
  template_effect(() => {
60551
60590
  var _$$get$icon, _$$get$label;
60552
- set_text(text_23, `${(_$$get$icon = get(rt).icon) !== null && _$$get$icon !== void 0 ? _$$get$icon : ""} ${(_$$get$label = get(rt).label) !== null && _$$get$label !== void 0 ? _$$get$label : ""}`);
60591
+ set_text(text_24, `${(_$$get$icon = get(rt).icon) !== null && _$$get$icon !== void 0 ? _$$get$icon : ""} ${(_$$get$label = get(rt).label) !== null && _$$get$label !== void 0 ? _$$get$label : ""}`);
60553
60592
  if (option_21_value !== (option_21_value = get(rt).id)) {
60554
60593
  var _option_21$__value;
60555
60594
  option_21.value = (_option_21$__value = option_21.__value = get(rt).id) !== null && _option_21$__value !== void 0 ? _option_21$__value : "";
@@ -60560,13 +60599,13 @@ function PropertiesPanel($$anchor, $$props) {
60560
60599
  reset(select_4);
60561
60600
  var select_4_value;
60562
60601
  init_select(select_4);
60563
- reset(label_26);
60564
- var label_27 = sibling(label_26, 2);
60565
- var input_21 = sibling(child(label_27), 2);
60566
- remove_input_defaults(input_21);
60567
60602
  reset(label_27);
60568
60603
  var label_28 = sibling(label_27, 2);
60569
- var select_5 = sibling(child(label_28), 2);
60604
+ var input_22 = sibling(child(label_28), 2);
60605
+ remove_input_defaults(input_22);
60606
+ reset(label_28);
60607
+ var label_29 = sibling(label_28, 2);
60608
+ var select_5 = sibling(child(label_29), 2);
60570
60609
  var option_22 = child(select_5);
60571
60610
  option_22.value = option_22.__value = "indoor";
60572
60611
  var option_23 = sibling(option_22);
@@ -60578,16 +60617,16 @@ function PropertiesPanel($$anchor, $$props) {
60578
60617
  reset(select_5);
60579
60618
  var select_5_value;
60580
60619
  init_select(select_5);
60581
- reset(label_28);
60582
- var div_22 = sibling(label_28, 2);
60620
+ reset(label_29);
60621
+ var div_22 = sibling(label_29, 2);
60583
60622
  var p_1 = sibling(child(div_22), 2);
60584
- var text_24 = child(p_1, true);
60623
+ var text_25 = child(p_1, true);
60585
60624
  reset(p_1);
60586
60625
  reset(div_22);
60587
60626
  var div_23 = sibling(div_22, 2);
60588
60627
  var div_24 = sibling(child(div_23), 2);
60589
60628
  each(div_24, 21, () => roomColorPresets, index$1, ($$anchor, preset) => {
60590
- var button_20 = root_19$1();
60629
+ var button_20 = root_20$1();
60591
60630
  template_effect(() => {
60592
60631
  var _$$get$color5;
60593
60632
  set_class(button_20, 1, `w-7 h-7 rounded-md border-2 hover:border-gray-300 transition-colors ${get(selectedRoom).color === get(preset).color ? "border-blue-500 ring-1 ring-blue-200" : "border-gray-200"}`);
@@ -60599,50 +60638,50 @@ function PropertiesPanel($$anchor, $$props) {
60599
60638
  });
60600
60639
  reset(div_24);
60601
60640
  var div_25 = sibling(div_24, 2);
60602
- var input_22 = sibling(child(div_25), 2);
60603
- remove_input_defaults(input_22);
60641
+ var input_23 = sibling(child(div_25), 2);
60642
+ remove_input_defaults(input_23);
60604
60643
  reset(div_25);
60605
60644
  reset(div_23);
60606
60645
  var div_26 = sibling(div_23, 2);
60607
60646
  var div_27 = sibling(child(div_26), 2);
60608
60647
  each(div_27, 21, () => textureGroups, index$1, ($$anchor, group) => {
60609
- var div_28 = root_20$1();
60610
- var span_19 = child(div_28);
60611
- var text_25 = child(span_19, true);
60612
- reset(span_19);
60613
- var div_29 = sibling(span_19, 2);
60648
+ var div_28 = root_21$1();
60649
+ var span_20 = child(div_28);
60650
+ var text_26 = child(span_20, true);
60651
+ reset(span_20);
60652
+ var div_29 = sibling(span_20, 2);
60614
60653
  each(div_29, 21, () => get(group).ids, index$1, ($$anchor, matId) => {
60615
60654
  const mat = /* @__PURE__ */ user_derived(() => floorMaterials.find((m) => m.id === get(matId)));
60616
60655
  var fragment_8 = comment();
60617
- var node_8 = first_child(fragment_8);
60618
- var consequent_8 = ($$anchor) => {
60656
+ var node_9 = first_child(fragment_8);
60657
+ var consequent_9 = ($$anchor) => {
60619
60658
  const texPath = /* @__PURE__ */ user_derived(() => {
60620
60659
  var _floorTexPaths$$$get$;
60621
60660
  return (_floorTexPaths$$$get$ = floorTexPaths[get(mat).id]) !== null && _floorTexPaths$$$get$ !== void 0 ? _floorTexPaths$$$get$ : "";
60622
60661
  });
60623
- var button_21 = root_22$1();
60662
+ var button_21 = root_23$1();
60624
60663
  var div_30 = child(button_21);
60625
60664
  var div_31 = sibling(div_30, 2);
60626
- var text_26 = child(div_31, true);
60665
+ var text_27 = child(div_31, true);
60627
60666
  reset(div_31);
60628
60667
  reset(button_21);
60629
60668
  template_effect(() => {
60630
60669
  set_class(button_21, 1, `p-1 rounded-lg border-2 hover:border-gray-300 transition-all text-xs ${get(selectedRoom).floorTexture === get(mat).id ? "border-blue-500 ring-2 ring-blue-200 shadow-sm" : "border-gray-200"}`);
60631
60670
  set_attribute(button_21, "title", get(mat).name);
60632
60671
  set_style(div_30, get(texPath) ? `background-image: url(${get(texPath)}); background-size: cover; background-position: center;` : `background-color: ${get(mat).color}`);
60633
- set_text(text_26, get(mat).name);
60672
+ set_text(text_27, get(mat).name);
60634
60673
  });
60635
60674
  delegated("click", button_21, () => onRoomFloor(get(mat).id));
60636
60675
  append($$anchor, button_21);
60637
60676
  };
60638
- if_block(node_8, ($$render) => {
60639
- if (get(mat)) $$render(consequent_8);
60677
+ if_block(node_9, ($$render) => {
60678
+ if (get(mat)) $$render(consequent_9);
60640
60679
  });
60641
60680
  append($$anchor, fragment_8);
60642
60681
  });
60643
60682
  reset(div_29);
60644
60683
  reset(div_28);
60645
- template_effect(() => set_text(text_25, get(group).label));
60684
+ template_effect(() => set_text(text_26, get(group).label));
60646
60685
  append($$anchor, div_28);
60647
60686
  });
60648
60687
  reset(div_27);
@@ -60654,16 +60693,16 @@ function PropertiesPanel($$anchor, $$props) {
60654
60693
  var _select_4$__value;
60655
60694
  select_4.value = (_select_4$__value = select_4.__value = get(selectedRoomType)) !== null && _select_4$__value !== void 0 ? _select_4$__value : "", select_option(select_4, get(selectedRoomType));
60656
60695
  }
60657
- set_value(input_21, get(selectedRoom).name);
60696
+ set_value(input_22, get(selectedRoom).name);
60658
60697
  if (select_5_value !== (select_5_value = (_$$get$roomType = get(selectedRoom).roomType) !== null && _$$get$roomType !== void 0 ? _$$get$roomType : "indoor")) {
60659
60698
  var _select_5$__value, _$$get$roomType2, _$$get$roomType3;
60660
60699
  select_5.value = (_select_5$__value = select_5.__value = (_$$get$roomType2 = get(selectedRoom).roomType) !== null && _$$get$roomType2 !== void 0 ? _$$get$roomType2 : "indoor") !== null && _select_5$__value !== void 0 ? _select_5$__value : "", select_option(select_5, (_$$get$roomType3 = get(selectedRoom).roomType) !== null && _$$get$roomType3 !== void 0 ? _$$get$roomType3 : "indoor");
60661
60700
  }
60662
- set_text(text_24, $0);
60663
- set_value(input_22, (_$$get$color6 = get(selectedRoom).color) !== null && _$$get$color6 !== void 0 ? _$$get$color6 : "#ffffff");
60701
+ set_text(text_25, $0);
60702
+ set_value(input_23, (_$$get$color6 = get(selectedRoom).color) !== null && _$$get$color6 !== void 0 ? _$$get$color6 : "#ffffff");
60664
60703
  }, [() => formatArea(get(selectedRoom).area, get(settings).units)]);
60665
60704
  delegated("change", select_4, onRoomType);
60666
- delegated("input", input_21, onRoomName);
60705
+ delegated("input", input_22, onRoomName);
60667
60706
  delegated("change", select_5, (e) => {
60668
60707
  if (get(selectedRoom)) {
60669
60708
  const v = e.target.value;
@@ -60671,14 +60710,14 @@ function PropertiesPanel($$anchor, $$props) {
60671
60710
  updateDetectedRoom(get(selectedRoom).id, { roomType: v });
60672
60711
  }
60673
60712
  });
60674
- delegated("input", input_22, (e) => onRoomColor(e.target.value));
60713
+ delegated("input", input_23, (e) => onRoomColor(e.target.value));
60675
60714
  append($$anchor, fragment_7);
60676
60715
  };
60677
- var consequent_10 = ($$anchor) => {
60678
- var fragment_9 = root_23$1();
60716
+ var consequent_11 = ($$anchor) => {
60717
+ var fragment_9 = root_24$1();
60679
60718
  var div_32 = sibling(first_child(fragment_9), 2);
60680
- var label_29 = child(div_32);
60681
- var select_6 = sibling(child(label_29), 2);
60719
+ var label_30 = child(div_32);
60720
+ var select_6 = sibling(child(label_30), 2);
60682
60721
  var option_26 = child(select_6);
60683
60722
  option_26.value = option_26.__value = "straight";
60684
60723
  var option_27 = sibling(option_26);
@@ -60690,13 +60729,6 @@ function PropertiesPanel($$anchor, $$props) {
60690
60729
  reset(select_6);
60691
60730
  var select_6_value;
60692
60731
  init_select(select_6);
60693
- reset(label_29);
60694
- var label_30 = sibling(label_29, 2);
60695
- var span_20 = child(label_30);
60696
- var text_27 = child(span_20);
60697
- reset(span_20);
60698
- var input_23 = sibling(span_20, 2);
60699
- remove_input_defaults(input_23);
60700
60732
  reset(label_30);
60701
60733
  var label_31 = sibling(label_30, 2);
60702
60734
  var span_21 = child(label_31);
@@ -60706,33 +60738,40 @@ function PropertiesPanel($$anchor, $$props) {
60706
60738
  remove_input_defaults(input_24);
60707
60739
  reset(label_31);
60708
60740
  var label_32 = sibling(label_31, 2);
60709
- var input_25 = sibling(child(label_32), 2);
60741
+ var span_22 = child(label_32);
60742
+ var text_29 = child(span_22);
60743
+ reset(span_22);
60744
+ var input_25 = sibling(span_22, 2);
60710
60745
  remove_input_defaults(input_25);
60711
60746
  reset(label_32);
60712
60747
  var label_33 = sibling(label_32, 2);
60713
- var div_33 = sibling(child(label_33), 2);
60748
+ var input_26 = sibling(child(label_33), 2);
60749
+ remove_input_defaults(input_26);
60750
+ reset(label_33);
60751
+ var label_34 = sibling(label_33, 2);
60752
+ var div_33 = sibling(child(label_34), 2);
60714
60753
  var button_22 = child(div_33);
60715
60754
  var button_23 = sibling(button_22, 2);
60716
60755
  reset(div_33);
60717
- reset(label_33);
60718
- var label_34 = sibling(label_33, 2);
60719
- var input_26 = sibling(child(label_34), 2);
60720
- remove_input_defaults(input_26);
60721
60756
  reset(label_34);
60757
+ var label_35 = sibling(label_34, 2);
60758
+ var input_27 = sibling(child(label_35), 2);
60759
+ remove_input_defaults(input_27);
60760
+ reset(label_35);
60722
60761
  reset(div_32);
60723
60762
  template_effect(($0, $1, $2, $3) => {
60724
60763
  if (select_6_value !== (select_6_value = get(selectedStair).stairType || "straight")) {
60725
60764
  var _select_6$__value;
60726
60765
  select_6.value = (_select_6$__value = select_6.__value = get(selectedStair).stairType || "straight") !== null && _select_6$__value !== void 0 ? _select_6$__value : "", select_option(select_6, get(selectedStair).stairType || "straight");
60727
60766
  }
60728
- set_text(text_27, `Width (${$0 !== null && $0 !== void 0 ? $0 : ""})`);
60729
- set_value(input_23, $1);
60730
- set_text(text_28, `Depth (${$2 !== null && $2 !== void 0 ? $2 : ""})`);
60731
- set_value(input_24, $3);
60732
- set_value(input_25, get(selectedStair).riserCount);
60767
+ set_text(text_28, `Width (${$0 !== null && $0 !== void 0 ? $0 : ""})`);
60768
+ set_value(input_24, $1);
60769
+ set_text(text_29, `Depth (${$2 !== null && $2 !== void 0 ? $2 : ""})`);
60770
+ set_value(input_25, $3);
60771
+ set_value(input_26, get(selectedStair).riserCount);
60733
60772
  set_class(button_22, 1, `flex-1 px-2 py-1.5 border rounded text-sm transition-colors ${get(selectedStair).direction === "up" ? "bg-blue-100 border-blue-400 text-blue-700" : "border-gray-200 hover:bg-gray-50"}`);
60734
60773
  set_class(button_23, 1, `flex-1 px-2 py-1.5 border rounded text-sm transition-colors ${get(selectedStair).direction === "down" ? "bg-blue-100 border-blue-400 text-blue-700" : "border-gray-200 hover:bg-gray-50"}`);
60735
- set_value(input_26, get(selectedStair).rotation);
60774
+ set_value(input_27, get(selectedStair).rotation);
60736
60775
  }, [
60737
60776
  () => unitLabel(),
60738
60777
  () => displayValue(get(selectedStair).width),
@@ -60740,29 +60779,22 @@ function PropertiesPanel($$anchor, $$props) {
60740
60779
  () => displayValue(get(selectedStair).depth)
60741
60780
  ]);
60742
60781
  delegated("change", select_6, (e) => updateStair(get(selectedStair).id, { stairType: e.target.value }));
60743
- delegated("input", input_23, (e) => updateStair(get(selectedStair).id, { width: inputToCm(Number(e.target.value)) }));
60744
- delegated("input", input_24, (e) => updateStair(get(selectedStair).id, { depth: inputToCm(Number(e.target.value)) }));
60745
- delegated("input", input_25, (e) => updateStair(get(selectedStair).id, { riserCount: Number(e.target.value) }));
60782
+ delegated("input", input_24, (e) => updateStair(get(selectedStair).id, { width: inputToCm(Number(e.target.value)) }));
60783
+ delegated("input", input_25, (e) => updateStair(get(selectedStair).id, { depth: inputToCm(Number(e.target.value)) }));
60784
+ delegated("input", input_26, (e) => updateStair(get(selectedStair).id, { riserCount: Number(e.target.value) }));
60746
60785
  delegated("click", button_22, () => updateStair(get(selectedStair).id, { direction: "up" }));
60747
60786
  delegated("click", button_23, () => updateStair(get(selectedStair).id, { direction: "down" }));
60748
- delegated("input", input_26, (e) => updateStair(get(selectedStair).id, { rotation: Number(e.target.value) }));
60787
+ delegated("input", input_27, (e) => updateStair(get(selectedStair).id, { rotation: Number(e.target.value) }));
60749
60788
  append($$anchor, fragment_9);
60750
60789
  };
60751
- var consequent_12 = ($$anchor) => {
60752
- var fragment_10 = root_24$1();
60790
+ var consequent_13 = ($$anchor) => {
60791
+ var fragment_10 = root_25();
60753
60792
  var div_34 = sibling(first_child(fragment_10), 2);
60754
- var label_35 = child(div_34);
60755
- var div_35 = sibling(child(label_35), 2);
60793
+ var label_36 = child(div_34);
60794
+ var div_35 = sibling(child(label_36), 2);
60756
60795
  var button_24 = child(div_35);
60757
60796
  var button_25 = sibling(button_24, 2);
60758
60797
  reset(div_35);
60759
- reset(label_35);
60760
- var label_36 = sibling(label_35, 2);
60761
- var span_22 = child(label_36);
60762
- var text_29 = child(span_22);
60763
- reset(span_22);
60764
- var input_27 = sibling(span_22, 2);
60765
- remove_input_defaults(input_27);
60766
60798
  reset(label_36);
60767
60799
  var label_37 = sibling(label_36, 2);
60768
60800
  var span_23 = child(label_37);
@@ -60771,10 +60803,17 @@ function PropertiesPanel($$anchor, $$props) {
60771
60803
  var input_28 = sibling(span_23, 2);
60772
60804
  remove_input_defaults(input_28);
60773
60805
  reset(label_37);
60774
- var div_36 = sibling(label_37, 2);
60806
+ var label_38 = sibling(label_37, 2);
60807
+ var span_24 = child(label_38);
60808
+ var text_31 = child(span_24);
60809
+ reset(span_24);
60810
+ var input_29 = sibling(span_24, 2);
60811
+ remove_input_defaults(input_29);
60812
+ reset(label_38);
60813
+ var div_36 = sibling(label_38, 2);
60775
60814
  var div_37 = sibling(child(div_36), 2);
60776
60815
  each(div_37, 21, () => columnColorPresets, index$1, ($$anchor, preset) => {
60777
- var button_26 = root_25();
60816
+ var button_26 = root_26();
60778
60817
  template_effect(() => {
60779
60818
  var _$$get$color7;
60780
60819
  set_class(button_26, 1, `w-7 h-7 rounded-md border-2 hover:border-gray-300 transition-colors ${get(selectedColumn).color === get(preset).color ? "border-blue-500 ring-1 ring-blue-200" : "border-gray-200"}`);
@@ -60786,32 +60825,32 @@ function PropertiesPanel($$anchor, $$props) {
60786
60825
  });
60787
60826
  reset(div_37);
60788
60827
  var div_38 = sibling(div_37, 2);
60789
- var input_29 = sibling(child(div_38), 2);
60790
- remove_input_defaults(input_29);
60828
+ var input_30 = sibling(child(div_38), 2);
60829
+ remove_input_defaults(input_30);
60791
60830
  reset(div_38);
60792
60831
  reset(div_36);
60793
- var node_9 = sibling(div_36, 2);
60794
- var consequent_11 = ($$anchor) => {
60795
- var label_38 = root_26();
60796
- var input_30 = sibling(child(label_38), 2);
60797
- remove_input_defaults(input_30);
60798
- reset(label_38);
60799
- template_effect(() => set_value(input_30, get(selectedColumn).rotation));
60800
- delegated("input", input_30, (e) => updateColumn(get(selectedColumn).id, { rotation: Number(e.target.value) }));
60801
- append($$anchor, label_38);
60832
+ var node_10 = sibling(div_36, 2);
60833
+ var consequent_12 = ($$anchor) => {
60834
+ var label_39 = root_27();
60835
+ var input_31 = sibling(child(label_39), 2);
60836
+ remove_input_defaults(input_31);
60837
+ reset(label_39);
60838
+ template_effect(() => set_value(input_31, get(selectedColumn).rotation));
60839
+ delegated("input", input_31, (e) => updateColumn(get(selectedColumn).id, { rotation: Number(e.target.value) }));
60840
+ append($$anchor, label_39);
60802
60841
  };
60803
- if_block(node_9, ($$render) => {
60804
- if (get(selectedColumn).shape === "square") $$render(consequent_11);
60842
+ if_block(node_10, ($$render) => {
60843
+ if (get(selectedColumn).shape === "square") $$render(consequent_12);
60805
60844
  });
60806
60845
  reset(div_34);
60807
60846
  template_effect(($0, $1, $2, $3) => {
60808
60847
  set_class(button_24, 1, `flex-1 px-2 py-1.5 border rounded text-sm transition-colors ${get(selectedColumn).shape === "round" ? "bg-blue-100 border-blue-400 text-blue-700" : "border-gray-200 hover:bg-gray-50"}`);
60809
60848
  set_class(button_25, 1, `flex-1 px-2 py-1.5 border rounded text-sm transition-colors ${get(selectedColumn).shape === "square" ? "bg-blue-100 border-blue-400 text-blue-700" : "border-gray-200 hover:bg-gray-50"}`);
60810
- set_text(text_29, `${get(selectedColumn).shape === "round" ? "Diameter" : "Side Length"} (${$0 !== null && $0 !== void 0 ? $0 : ""})`);
60811
- set_value(input_27, $1);
60812
- set_text(text_30, `Height (${$2 !== null && $2 !== void 0 ? $2 : ""})`);
60813
- set_value(input_28, $3);
60814
- set_value(input_29, get(selectedColumn).color);
60849
+ set_text(text_30, `${get(selectedColumn).shape === "round" ? "Diameter" : "Side Length"} (${$0 !== null && $0 !== void 0 ? $0 : ""})`);
60850
+ set_value(input_28, $1);
60851
+ set_text(text_31, `Height (${$2 !== null && $2 !== void 0 ? $2 : ""})`);
60852
+ set_value(input_29, $3);
60853
+ set_value(input_30, get(selectedColumn).color);
60815
60854
  }, [
60816
60855
  () => unitLabel(),
60817
60856
  () => displayValue(get(selectedColumn).diameter),
@@ -60820,33 +60859,29 @@ function PropertiesPanel($$anchor, $$props) {
60820
60859
  ]);
60821
60860
  delegated("click", button_24, () => updateColumn(get(selectedColumn).id, { shape: "round" }));
60822
60861
  delegated("click", button_25, () => updateColumn(get(selectedColumn).id, { shape: "square" }));
60823
- delegated("input", input_27, (e) => updateColumn(get(selectedColumn).id, { diameter: inputToCm(Number(e.target.value)) }));
60824
- delegated("input", input_28, (e) => updateColumn(get(selectedColumn).id, { height: inputToCm(Number(e.target.value)) }));
60825
- delegated("input", input_29, (e) => updateColumn(get(selectedColumn).id, { color: e.target.value }));
60862
+ delegated("input", input_28, (e) => updateColumn(get(selectedColumn).id, { diameter: inputToCm(Number(e.target.value)) }));
60863
+ delegated("input", input_29, (e) => updateColumn(get(selectedColumn).id, { height: inputToCm(Number(e.target.value)) }));
60864
+ delegated("input", input_30, (e) => updateColumn(get(selectedColumn).id, { color: e.target.value }));
60826
60865
  append($$anchor, fragment_10);
60827
60866
  };
60828
- var consequent_13 = ($$anchor) => {
60829
- var div_39 = root_27();
60830
- var label_39 = sibling(child(div_39), 2);
60831
- var input_31 = sibling(child(label_39), 2);
60832
- remove_input_defaults(input_31);
60833
- reset(label_39);
60834
- var label_40 = sibling(label_39, 2);
60867
+ var consequent_14 = ($$anchor) => {
60868
+ var div_39 = root_28();
60869
+ var label_40 = sibling(child(div_39), 2);
60835
60870
  var input_32 = sibling(child(label_40), 2);
60836
60871
  remove_input_defaults(input_32);
60837
60872
  reset(label_40);
60838
60873
  var label_41 = sibling(label_40, 2);
60839
- var div_40 = sibling(child(label_41), 2);
60840
- var input_33 = child(div_40);
60874
+ var input_33 = sibling(child(label_41), 2);
60841
60875
  remove_input_defaults(input_33);
60842
- var span_24 = sibling(input_33, 2);
60843
- var text_31 = child(span_24, true);
60844
- reset(span_24);
60845
- reset(div_40);
60846
60876
  reset(label_41);
60847
60877
  var label_42 = sibling(label_41, 2);
60848
- var input_34 = sibling(child(label_42), 2);
60878
+ var div_40 = sibling(child(label_42), 2);
60879
+ var input_34 = child(div_40);
60849
60880
  remove_input_defaults(input_34);
60881
+ var span_25 = sibling(input_34, 2);
60882
+ var text_32 = child(span_25, true);
60883
+ reset(span_25);
60884
+ reset(div_40);
60850
60885
  reset(label_42);
60851
60886
  var label_43 = sibling(label_42, 2);
60852
60887
  var input_35 = sibling(child(label_43), 2);
@@ -60856,22 +60891,26 @@ function PropertiesPanel($$anchor, $$props) {
60856
60891
  var input_36 = sibling(child(label_44), 2);
60857
60892
  remove_input_defaults(input_36);
60858
60893
  reset(label_44);
60894
+ var label_45 = sibling(label_44, 2);
60895
+ var input_37 = sibling(child(label_45), 2);
60896
+ remove_input_defaults(input_37);
60897
+ reset(label_45);
60859
60898
  reset(div_39);
60860
60899
  template_effect(($0, $1) => {
60861
- set_value(input_31, get(selectedTextAnnotation).text);
60862
- set_value(input_32, get(selectedTextAnnotation).fontSize);
60863
- set_value(input_33, get(selectedTextAnnotation).color);
60864
- set_text(text_31, get(selectedTextAnnotation).color);
60865
- set_value(input_34, get(selectedTextAnnotation).rotation);
60866
- set_value(input_35, $0);
60867
- set_value(input_36, $1);
60900
+ set_value(input_32, get(selectedTextAnnotation).text);
60901
+ set_value(input_33, get(selectedTextAnnotation).fontSize);
60902
+ set_value(input_34, get(selectedTextAnnotation).color);
60903
+ set_text(text_32, get(selectedTextAnnotation).color);
60904
+ set_value(input_35, get(selectedTextAnnotation).rotation);
60905
+ set_value(input_36, $0);
60906
+ set_value(input_37, $1);
60868
60907
  }, [() => Math.round(get(selectedTextAnnotation).x), () => Math.round(get(selectedTextAnnotation).y)]);
60869
- delegated("input", input_31, (e) => updateTextAnnotation(get(selectedTextAnnotation).id, { text: e.target.value }));
60870
- delegated("input", input_32, (e) => updateTextAnnotation(get(selectedTextAnnotation).id, { fontSize: Number(e.target.value) }));
60871
- delegated("input", input_33, (e) => updateTextAnnotation(get(selectedTextAnnotation).id, { color: e.target.value }));
60872
- delegated("input", input_34, (e) => updateTextAnnotation(get(selectedTextAnnotation).id, { rotation: Number(e.target.value) }));
60873
- delegated("input", input_35, (e) => updateTextAnnotation(get(selectedTextAnnotation).id, { x: Number(e.target.value) }));
60874
- delegated("input", input_36, (e) => updateTextAnnotation(get(selectedTextAnnotation).id, { y: Number(e.target.value) }));
60908
+ delegated("input", input_32, (e) => updateTextAnnotation(get(selectedTextAnnotation).id, { text: e.target.value }));
60909
+ delegated("input", input_33, (e) => updateTextAnnotation(get(selectedTextAnnotation).id, { fontSize: Number(e.target.value) }));
60910
+ delegated("input", input_34, (e) => updateTextAnnotation(get(selectedTextAnnotation).id, { color: e.target.value }));
60911
+ delegated("input", input_35, (e) => updateTextAnnotation(get(selectedTextAnnotation).id, { rotation: Number(e.target.value) }));
60912
+ delegated("input", input_36, (e) => updateTextAnnotation(get(selectedTextAnnotation).id, { x: Number(e.target.value) }));
60913
+ delegated("input", input_37, (e) => updateTextAnnotation(get(selectedTextAnnotation).id, { y: Number(e.target.value) }));
60875
60914
  append($$anchor, div_39);
60876
60915
  };
60877
60916
  if_block(node, ($$render) => {
@@ -60879,20 +60918,16 @@ function PropertiesPanel($$anchor, $$props) {
60879
60918
  else if (get(selectedDoor)) $$render(consequent_2, 1);
60880
60919
  else if (get(selectedWindow)) $$render(consequent_3, 2);
60881
60920
  else if (get(selectedFurniture)) $$render(consequent_7, 3);
60882
- else if (get(selectedRoom)) $$render(consequent_9, 4);
60883
- else if (get(selectedStair)) $$render(consequent_10, 5);
60884
- else if (get(selectedColumn)) $$render(consequent_12, 6);
60885
- else if (get(selectedTextAnnotation)) $$render(consequent_13, 7);
60921
+ else if (get(selectedRoom)) $$render(consequent_10, 4);
60922
+ else if (get(selectedStair)) $$render(consequent_11, 5);
60923
+ else if (get(selectedColumn)) $$render(consequent_13, 6);
60924
+ else if (get(selectedTextAnnotation)) $$render(consequent_14, 7);
60886
60925
  });
60887
- var node_10 = sibling(node, 2);
60888
- var consequent_14 = ($$anchor) => {
60889
- var div_41 = root_28();
60926
+ var node_11 = sibling(node, 2);
60927
+ var consequent_15 = ($$anchor) => {
60928
+ var div_41 = root_29();
60890
60929
  var div_42 = sibling(child(div_41), 2);
60891
- var label_45 = child(div_42);
60892
- var input_37 = sibling(child(label_45), 2);
60893
- remove_input_defaults(input_37);
60894
- reset(label_45);
60895
- var label_46 = sibling(label_45, 2);
60930
+ var label_46 = child(div_42);
60896
60931
  var input_38 = sibling(child(label_46), 2);
60897
60932
  remove_input_defaults(input_38);
60898
60933
  reset(label_46);
@@ -60900,9 +60935,13 @@ function PropertiesPanel($$anchor, $$props) {
60900
60935
  var input_39 = sibling(child(label_47), 2);
60901
60936
  remove_input_defaults(input_39);
60902
60937
  reset(label_47);
60903
- var div_43 = sibling(label_47, 2);
60938
+ var label_48 = sibling(label_47, 2);
60939
+ var input_40 = sibling(child(label_48), 2);
60940
+ remove_input_defaults(input_40);
60941
+ reset(label_48);
60942
+ var div_43 = sibling(label_48, 2);
60904
60943
  var button_27 = child(div_43);
60905
- var text_32 = child(button_27, true);
60944
+ var text_33 = child(button_27, true);
60906
60945
  reset(button_27);
60907
60946
  var button_28 = sibling(button_27, 2);
60908
60947
  reset(div_43);
@@ -60910,15 +60949,15 @@ function PropertiesPanel($$anchor, $$props) {
60910
60949
  reset(div_42);
60911
60950
  reset(div_41);
60912
60951
  template_effect(() => {
60913
- set_value(input_37, get(floor).backgroundImage.opacity);
60914
- set_value(input_38, get(floor).backgroundImage.scale);
60915
- set_value(input_39, get(floor).backgroundImage.rotation);
60952
+ set_value(input_38, get(floor).backgroundImage.opacity);
60953
+ set_value(input_39, get(floor).backgroundImage.scale);
60954
+ set_value(input_40, get(floor).backgroundImage.rotation);
60916
60955
  set_class(button_27, 1, `flex-1 px-2 py-1.5 border rounded text-sm ${get(floor).backgroundImage.locked ? "bg-amber-100 border-amber-400 text-amber-700" : "border-gray-200 hover:bg-gray-50"}`);
60917
- set_text(text_32, get(floor).backgroundImage.locked ? "🔒 Locked" : "🔓 Unlocked");
60956
+ set_text(text_33, get(floor).backgroundImage.locked ? "🔒 Locked" : "🔓 Unlocked");
60918
60957
  });
60919
- delegated("input", input_37, (e) => updateBackgroundImage({ opacity: Number(e.target.value) }));
60920
- delegated("input", input_38, (e) => updateBackgroundImage({ scale: Number(e.target.value) }));
60921
- delegated("input", input_39, (e) => updateBackgroundImage({ rotation: Number(e.target.value) }));
60958
+ delegated("input", input_38, (e) => updateBackgroundImage({ opacity: Number(e.target.value) }));
60959
+ delegated("input", input_39, (e) => updateBackgroundImage({ scale: Number(e.target.value) }));
60960
+ delegated("input", input_40, (e) => updateBackgroundImage({ rotation: Number(e.target.value) }));
60922
60961
  delegated("click", button_27, () => updateBackgroundImage({ locked: !get(floor).backgroundImage.locked }));
60923
60962
  delegated("click", button_28, () => {
60924
60963
  calibrationPoints.set([]);
@@ -60927,9 +60966,9 @@ function PropertiesPanel($$anchor, $$props) {
60927
60966
  delegated("click", button_29, () => setBackgroundImage(void 0));
60928
60967
  append($$anchor, div_41);
60929
60968
  };
60930
- if_block(node_10, ($$render) => {
60931
- var _$$get17;
60932
- if (get(hasBgImage) && ((_$$get17 = get(floor)) === null || _$$get17 === void 0 ? void 0 : _$$get17.backgroundImage)) $$render(consequent_14);
60969
+ if_block(node_11, ($$render) => {
60970
+ var _$$get18;
60971
+ if (get(hasBgImage) && ((_$$get18 = get(floor)) === null || _$$get18 === void 0 ? void 0 : _$$get18.backgroundImage)) $$render(consequent_15);
60933
60972
  });
60934
60973
  reset(div);
60935
60974
  template_effect(() => classes = set_class(div, 1, `${is3D() ? "w-80" : "w-64"} shrink-0 bg-white border-l border-gray-200 flex flex-col overflow-y-auto p-3 fixed right-0 z-40 shadow-lg`, null, classes, { hidden: !get(hasSelection) }));
@@ -64714,7 +64753,7 @@ function FloorPlanCanvas($$anchor, $$props) {
64714
64753
  const $panMode = () => store_get(panMode, "$panMode", $$stores);
64715
64754
  const $projectSettings = () => store_get(projectSettings, "$projectSettings", $$stores);
64716
64755
  const [$$stores, $$cleanup] = setup_stores();
64717
- let selectedCameraSerial = prop($$props, "selectedCameraSerial", 3, null), showCameraCones = prop($$props, "showCameraCones", 3, false), showCameraLabels = prop($$props, "showCameraLabels", 3, true), cameraHeatmapMatrix = prop($$props, "cameraHeatmapMatrix", 19, () => []);
64756
+ let selectedCameraSerial = prop($$props, "selectedCameraSerial", 3, null), showCameraCones = prop($$props, "showCameraCones", 3, false), showCameraLabels = prop($$props, "showCameraLabels", 3, true), cameraHeatmapMatrix = prop($$props, "cameraHeatmapMatrix", 19, () => []), cameraThumbnail = prop($$props, "cameraThumbnail", 3, "");
64718
64757
  let canvas;
64719
64758
  let ctx;
64720
64759
  let width = /* @__PURE__ */ state(800);
@@ -64813,6 +64852,7 @@ function FloorPlanCanvas($$anchor, $$props) {
64813
64852
  showCameraCones();
64814
64853
  showCameraLabels();
64815
64854
  cameraHeatmapMatrix();
64855
+ cameraThumbnail();
64816
64856
  $$props.projectName;
64817
64857
  $$props.heatmapEnabled;
64818
64858
  $$props.heatmapMatrix;
@@ -64890,6 +64930,33 @@ function FloorPlanCanvas($$anchor, $$props) {
64890
64930
  let isCalibrating = /* @__PURE__ */ state(false);
64891
64931
  let calPoints = /* @__PURE__ */ state(proxy([]));
64892
64932
  let bgImage = /* @__PURE__ */ state(null);
64933
+ let thumbnailOpacity = /* @__PURE__ */ state(.65);
64934
+ user_effect(() => {
64935
+ var _$$get, _cameraThumbnail$trim, _cameraThumbnail;
64936
+ const floorBgUrl = (_$$get = get(currentFloor)) === null || _$$get === void 0 || (_$$get = _$$get.backgroundImage) === null || _$$get === void 0 ? void 0 : _$$get.dataUrl;
64937
+ const thumbnailUrl = (_cameraThumbnail$trim = (_cameraThumbnail = cameraThumbnail()) === null || _cameraThumbnail === void 0 ? void 0 : _cameraThumbnail.trim()) !== null && _cameraThumbnail$trim !== void 0 ? _cameraThumbnail$trim : "";
64938
+ const url = floorBgUrl || thumbnailUrl;
64939
+ if (!url) {
64940
+ set(bgImage, null);
64941
+ return;
64942
+ }
64943
+ let cancelled = false;
64944
+ const img = new Image();
64945
+ img.onload = () => {
64946
+ if (cancelled) return;
64947
+ set(bgImage, img, true);
64948
+ markDirty();
64949
+ };
64950
+ img.onerror = () => {
64951
+ if (cancelled) return;
64952
+ set(bgImage, null);
64953
+ markDirty();
64954
+ };
64955
+ img.src = url;
64956
+ return () => {
64957
+ cancelled = true;
64958
+ };
64959
+ });
64893
64960
  let draggingRoomLabelId = /* @__PURE__ */ state(null);
64894
64961
  let roomLabelDragStart = {
64895
64962
  x: 0,
@@ -65449,9 +65516,9 @@ function FloorPlanCanvas($$anchor, $$props) {
65449
65516
  }
65450
65517
  }
65451
65518
  function drawMeasurement() {
65452
- var _$$get;
65519
+ var _$$get2;
65453
65520
  if (!get(measureStart)) return;
65454
- const end = (_$$get = get(measureEnd)) !== null && _$$get !== void 0 ? _$$get : get(mousePos);
65521
+ const end = (_$$get2 = get(measureEnd)) !== null && _$$get2 !== void 0 ? _$$get2 : get(mousePos);
65455
65522
  const s = worldToScreen(get(measureStart).x, get(measureStart).y);
65456
65523
  const e = worldToScreen(end.x, end.y);
65457
65524
  ctx.strokeStyle = "#ef4444";
@@ -65618,13 +65685,21 @@ function FloorPlanCanvas($$anchor, $$props) {
65618
65685
  function drawColumn$1(col, selected) {
65619
65686
  drawColumn(getCS(), col, selected);
65620
65687
  }
65688
+ function getCameraThumbnailBounds(floor = get(currentFloor)) {
65689
+ if (!floor) return null;
65690
+ return getFloorBounds(floor, { includeWallThickness: true });
65691
+ }
65692
+ function isCameraThumbnailOverlayActive() {
65693
+ var _cameraThumbnail2, _$$get3;
65694
+ return !!(((_cameraThumbnail2 = cameraThumbnail()) === null || _cameraThumbnail2 === void 0 ? void 0 : _cameraThumbnail2.trim()) && get(bgImage) && !((_$$get3 = get(currentFloor)) === null || _$$get3 === void 0 ? void 0 : _$$get3.backgroundImage));
65695
+ }
65621
65696
  function drawBackgroundImage() {
65622
- var _$$get2;
65623
- if (!get(bgImage) || !((_$$get2 = get(currentFloor)) === null || _$$get2 === void 0 ? void 0 : _$$get2.backgroundImage)) return;
65697
+ var _$$get4;
65698
+ if (!get(bgImage) || !((_$$get4 = get(currentFloor)) === null || _$$get4 === void 0 ? void 0 : _$$get4.backgroundImage)) return;
65624
65699
  const bg = get(currentFloor).backgroundImage;
65625
- const s = worldToScreen(bg.position.x, bg.position.y);
65626
65700
  ctx.save();
65627
65701
  ctx.globalAlpha = bg.opacity;
65702
+ const s = worldToScreen(bg.position.x, bg.position.y);
65628
65703
  ctx.translate(s.x, s.y);
65629
65704
  ctx.rotate(bg.rotation * Math.PI / 180);
65630
65705
  const sw = get(bgImage).width * bg.scale * get(zoom);
@@ -65632,6 +65707,23 @@ function FloorPlanCanvas($$anchor, $$props) {
65632
65707
  ctx.drawImage(get(bgImage), -sw / 2, -sh / 2, sw, sh);
65633
65708
  ctx.restore();
65634
65709
  }
65710
+ function drawCameraThumbnail() {
65711
+ if (!isCameraThumbnailOverlayActive() || !get(bgImage) || !get(currentFloor)) return;
65712
+ const bounds = getCameraThumbnailBounds();
65713
+ if (!bounds) return;
65714
+ ctx.save();
65715
+ ctx.globalAlpha = get(thumbnailOpacity);
65716
+ const topLeft = worldToScreen(bounds.minX, bounds.minY);
65717
+ const bottomRight = worldToScreen(bounds.maxX, bounds.maxY);
65718
+ ctx.drawImage(get(bgImage), topLeft.x, topLeft.y, bottomRight.x - topLeft.x, bottomRight.y - topLeft.y);
65719
+ ctx.restore();
65720
+ }
65721
+ function drawFloorHeatmapLayer() {
65722
+ var _$$props$heatmapMatri, _$$props$heatmapMatri2;
65723
+ const floor = get(currentFloor);
65724
+ if (!floor || !$$props.heatmapEnabled || !((_$$props$heatmapMatri = $$props.heatmapMatrix) === null || _$$props$heatmapMatri === void 0 ? void 0 : _$$props$heatmapMatri.length)) return;
65725
+ drawFloorHeatmap(getCS(), floor, (_$$props$heatmapMatri2 = $$props.heatmapMatrix) !== null && _$$props$heatmapMatri2 !== void 0 ? _$$props$heatmapMatri2 : [], get(detectedRooms));
65726
+ }
65635
65727
  function getFloorWallBounds(floor = get(currentFloor)) {
65636
65728
  var _floor$walls;
65637
65729
  if (!(floor === null || floor === void 0 || (_floor$walls = floor.walls) === null || _floor$walls === void 0 ? void 0 : _floor$walls.length)) return null;
@@ -65702,10 +65794,6 @@ function FloorPlanCanvas($$anchor, $$props) {
65702
65794
  return id === selId || multiIds.has(id);
65703
65795
  }
65704
65796
  drawRooms$1();
65705
- if (floor && $$props.heatmapEnabled && $$props.heatmapMatrix && $$props.heatmapMatrix.length > 0) {
65706
- var _$$props$heatmapMatri;
65707
- drawFloorHeatmap(getCS(), floor, (_$$props$heatmapMatri = $$props.heatmapMatrix) !== null && _$$props$heatmapMatri !== void 0 ? _$$props$heatmapMatri : [], get(detectedRooms));
65708
- }
65709
65797
  if (!$$props.viewOnly) drawSnapPoints$1();
65710
65798
  if (get(layerVis).walls) {
65711
65799
  for (const w of floor.walls) drawWall$1(w, isSelected(w.id));
@@ -66292,6 +66380,7 @@ function FloorPlanCanvas($$anchor, $$props) {
66292
66380
  if (get(layerVis).annotations && floor) drawAnnotations$1(floor);
66293
66381
  if (get(annotating) && get(annotationStart)) drawAnnotationPreview();
66294
66382
  if (floor) drawTextAnnotations$1(floor);
66383
+ drawCameraThumbnail();
66295
66384
  if (get(draggingHandle) === "rotate" && get(currentSelectedId) && get(currentFloor)) {
66296
66385
  const fi = get(currentFloor).furniture.find((f) => f.id === get(currentSelectedId));
66297
66386
  if (fi) {
@@ -66328,6 +66417,7 @@ function FloorPlanCanvas($$anchor, $$props) {
66328
66417
  ctx.setLineDash([]);
66329
66418
  ctx.restore();
66330
66419
  }
66420
+ drawFloorHeatmapLayer();
66331
66421
  drawMinimap$1();
66332
66422
  requestAnimationFrame(draw);
66333
66423
  }
@@ -66419,16 +66509,6 @@ function FloorPlanCanvas($$anchor, $$props) {
66419
66509
  set(currentSelectedIds, ids, true);
66420
66510
  markDirty();
66421
66511
  });
66422
- const unsub14 = activeFloor.subscribe((f) => {
66423
- var _f$backgroundImage;
66424
- if ((f === null || f === void 0 || (_f$backgroundImage = f.backgroundImage) === null || _f$backgroundImage === void 0 ? void 0 : _f$backgroundImage.dataUrl) && (!get(bgImage) || get(bgImage).src !== f.backgroundImage.dataUrl)) {
66425
- const img = new Image();
66426
- img.onload = () => {
66427
- set(bgImage, img, true);
66428
- };
66429
- img.src = f.backgroundImage.dataUrl;
66430
- } else if (!(f === null || f === void 0 ? void 0 : f.backgroundImage)) set(bgImage, null);
66431
- });
66432
66512
  const unsubZoom = canvasZoom.subscribe((v) => {
66433
66513
  set(zoom, v, true);
66434
66514
  });
@@ -66463,6 +66543,10 @@ function FloorPlanCanvas($$anchor, $$props) {
66463
66543
  }
66464
66544
  }
66465
66545
  document.addEventListener("paste", handlePaste);
66546
+ const unsubThumbOpacity = cameraThumbnailOpacity.subscribe((v) => {
66547
+ set(thumbnailOpacity, v, true);
66548
+ markDirty();
66549
+ });
66466
66550
  return () => {
66467
66551
  resizeObs.disconnect();
66468
66552
  unsub1();
@@ -66479,10 +66563,10 @@ function FloorPlanCanvas($$anchor, $$props) {
66479
66563
  unsub12();
66480
66564
  unsub13();
66481
66565
  unsub_multi();
66482
- unsub14();
66483
66566
  unsubZoom();
66484
66567
  unsubCamX();
66485
66568
  unsubCamY();
66569
+ unsubThumbOpacity();
66486
66570
  unsub_col();
66487
66571
  unsub_cols();
66488
66572
  unsub_layers();
@@ -66653,7 +66737,7 @@ function FloorPlanCanvas($$anchor, $$props) {
66653
66737
  return findRoomAt(p, get(detectedRooms), get(currentFloor).walls);
66654
66738
  }
66655
66739
  function onMouseDown(e) {
66656
- var _$$get3;
66740
+ var _$$get5;
66657
66741
  if ($$props.viewOnly) return;
66658
66742
  markDirty();
66659
66743
  if (e.button === 1 || e.button === 0 && (get(spaceDown) || $panMode() || e.shiftKey && get(currentTool) === "select")) {
@@ -66734,7 +66818,7 @@ function FloorPlanCanvas($$anchor, $$props) {
66734
66818
  placingStair.set(false);
66735
66819
  return;
66736
66820
  }
66737
- if (tool === "select" && ((_$$get3 = get(currentFloor)) === null || _$$get3 === void 0 ? void 0 : _$$get3.guides)) {
66821
+ if (tool === "select" && ((_$$get5 = get(currentFloor)) === null || _$$get5 === void 0 ? void 0 : _$$get5.guides)) {
66738
66822
  const GUIDE_HIT = 6 / get(zoom);
66739
66823
  for (const g of get(currentFloor).guides) {
66740
66824
  if (g.orientation === "horizontal" && Math.abs(wp.y - g.position) < GUIDE_HIT) {
@@ -66803,9 +66887,9 @@ function FloorPlanCanvas($$anchor, $$props) {
66803
66887
  const dist = Math.hypot(newPts[1].x - newPts[0].x, newPts[1].y - newPts[0].y);
66804
66888
  const realDist = prompt("Enter the real-world distance between these two points (in cm):");
66805
66889
  if (realDist && Number(realDist) > 0) {
66806
- var _$$get4;
66890
+ var _$$get6;
66807
66891
  const pixelsPerCm = dist / Number(realDist);
66808
- if ((_$$get4 = get(currentFloor)) === null || _$$get4 === void 0 ? void 0 : _$$get4.backgroundImage) updateBackgroundImage({ scale: get(currentFloor).backgroundImage.scale * (1 / pixelsPerCm) });
66892
+ if ((_$$get6 = get(currentFloor)) === null || _$$get6 === void 0 ? void 0 : _$$get6.backgroundImage) updateBackgroundImage({ scale: get(currentFloor).backgroundImage.scale * (1 / pixelsPerCm) });
66809
66893
  }
66810
66894
  calibrationMode.set(false);
66811
66895
  return [];
@@ -67175,7 +67259,7 @@ function FloorPlanCanvas($$anchor, $$props) {
67175
67259
  }
67176
67260
  }
67177
67261
  function onMouseMove(e) {
67178
- var _$$get5, _$$get6, _$$get7, _$$get8;
67262
+ var _$$get7, _$$get8, _$$get9, _$$get10;
67179
67263
  if ($$props.viewOnly) return;
67180
67264
  markDirty();
67181
67265
  const rect = canvas.getBoundingClientRect();
@@ -67193,7 +67277,7 @@ function FloorPlanCanvas($$anchor, $$props) {
67193
67277
  } : r));
67194
67278
  return;
67195
67279
  }
67196
- if (get(draggingGuideId) && ((_$$get5 = get(currentFloor)) === null || _$$get5 === void 0 ? void 0 : _$$get5.guides)) {
67280
+ if (get(draggingGuideId) && ((_$$get7 = get(currentFloor)) === null || _$$get7 === void 0 ? void 0 : _$$get7.guides)) {
67197
67281
  const g = get(currentFloor).guides.find((g) => g.id === get(draggingGuideId));
67198
67282
  if (g) {
67199
67283
  const newPos = g.orientation === "horizontal" ? get(mousePos).y : get(mousePos).x;
@@ -67349,7 +67433,7 @@ function FloorPlanCanvas($$anchor, $$props) {
67349
67433
  }
67350
67434
  }
67351
67435
  }
67352
- if (get(draggingTextAnnotationId) && ((_$$get6 = get(currentFloor)) === null || _$$get6 === void 0 ? void 0 : _$$get6.textAnnotations)) {
67436
+ if (get(draggingTextAnnotationId) && ((_$$get8 = get(currentFloor)) === null || _$$get8 === void 0 ? void 0 : _$$get8.textAnnotations)) {
67353
67437
  const basePos = {
67354
67438
  x: get(mousePos).x - textAnnotationDragOffset.x,
67355
67439
  y: get(mousePos).y - textAnnotationDragOffset.y
@@ -67366,7 +67450,7 @@ function FloorPlanCanvas($$anchor, $$props) {
67366
67450
  }, true);
67367
67451
  }
67368
67452
  }
67369
- if (get(draggingColumnId) && ((_$$get7 = get(currentFloor)) === null || _$$get7 === void 0 ? void 0 : _$$get7.columns)) {
67453
+ if (get(draggingColumnId) && ((_$$get9 = get(currentFloor)) === null || _$$get9 === void 0 ? void 0 : _$$get9.columns)) {
67370
67454
  const basePos = {
67371
67455
  x: get(mousePos).x - columnDragOffset.x,
67372
67456
  y: get(mousePos).y - columnDragOffset.y
@@ -67376,7 +67460,7 @@ function FloorPlanCanvas($$anchor, $$props) {
67376
67460
  y: snap(basePos.y)
67377
67461
  });
67378
67462
  }
67379
- if (get(draggingStairId) && ((_$$get8 = get(currentFloor)) === null || _$$get8 === void 0 ? void 0 : _$$get8.stairs)) {
67463
+ if (get(draggingStairId) && ((_$$get10 = get(currentFloor)) === null || _$$get10 === void 0 ? void 0 : _$$get10.stairs)) {
67380
67464
  const basePos = {
67381
67465
  x: get(mousePos).x - stairDragOffset.x,
67382
67466
  y: get(mousePos).y - stairDragOffset.y
@@ -67387,12 +67471,12 @@ function FloorPlanCanvas($$anchor, $$props) {
67387
67471
  });
67388
67472
  }
67389
67473
  if (get(draggingFurnitureId)) {
67390
- var _$$get9;
67474
+ var _$$get11;
67391
67475
  const basePos = {
67392
67476
  x: get(mousePos).x - dragOffset.x,
67393
67477
  y: get(mousePos).y - dragOffset.y
67394
67478
  };
67395
- const fi = (_$$get9 = get(currentFloor)) === null || _$$get9 === void 0 ? void 0 : _$$get9.furniture.find((f) => f.id === get(draggingFurnitureId));
67479
+ const fi = (_$$get11 = get(currentFloor)) === null || _$$get11 === void 0 ? void 0 : _$$get11.furniture.find((f) => f.id === get(draggingFurnitureId));
67396
67480
  if (fi) {
67397
67481
  const wallSnap = snapFurnitureToWall(basePos, fi.catalogId, fi.rotation);
67398
67482
  if (wallSnap) {
@@ -67405,13 +67489,13 @@ function FloorPlanCanvas($$anchor, $$props) {
67405
67489
  wallAngle: wallSnap.wallAngle
67406
67490
  }, true);
67407
67491
  } else {
67408
- var _$$get10;
67492
+ var _$$get12;
67409
67493
  const snapped = {
67410
67494
  x: snap(basePos.x),
67411
67495
  y: snap(basePos.y)
67412
67496
  };
67413
67497
  const GUIDE_SNAP = 10;
67414
- if ((_$$get10 = get(currentFloor)) === null || _$$get10 === void 0 ? void 0 : _$$get10.guides) for (const g of get(currentFloor).guides) {
67498
+ if ((_$$get12 = get(currentFloor)) === null || _$$get12 === void 0 ? void 0 : _$$get12.guides) for (const g of get(currentFloor).guides) {
67415
67499
  if (g.orientation === "horizontal" && Math.abs(snapped.y - g.position) < GUIDE_SNAP) snapped.y = g.position;
67416
67500
  if (g.orientation === "vertical" && Math.abs(snapped.x - g.position) < GUIDE_SNAP) snapped.x = g.position;
67417
67501
  }
@@ -68107,8 +68191,8 @@ function FloorPlanCanvas($$anchor, $$props) {
68107
68191
  }
68108
68192
  }
68109
68193
  let cursorStyle = /* @__PURE__ */ user_derived(() => {
68110
- var _$$get11;
68111
- return get(spaceDown) || get(isPanning) || $panMode() || get(shiftDown) && get(currentTool) === "select" ? "grab" : get(draggingFurnitureId) ? "move" : get(draggingRoomId) ? "move" : get(draggingMultiSelect) ? "move" : get(draggingDoorId) ? "move" : get(draggingWindowId) ? "move" : get(draggingStairId) ? "move" : get(draggingColumnId) ? "move" : get(draggingTextAnnotationId) ? "move" : get(draggingWallParallel) ? "move" : get(draggingCurveHandle) ? "crosshair" : get(draggingWallEndpoint) ? "crosshair" : get(draggingHandle) === "rotate" ? "grabbing" : get(draggingHandle) === "resize-t" || get(draggingHandle) === "resize-b" ? "ns-resize" : get(draggingHandle) === "resize-l" || get(draggingHandle) === "resize-r" ? "ew-resize" : ((_$$get11 = get(draggingHandle)) === null || _$$get11 === void 0 ? void 0 : _$$get11.startsWith("resize")) ? "nwse-resize" : get(currentTool) === "text" ? "text" : get(currentTool) === "select" ? "default" : get(currentTool) === "furniture" ? "copy" : get(currentTool) === "door" || get(currentTool) === "window" ? get(placementPreview) ? "crosshair" : "not-allowed" : "crosshair";
68194
+ var _$$get13;
68195
+ return get(spaceDown) || get(isPanning) || $panMode() || get(shiftDown) && get(currentTool) === "select" ? "grab" : get(draggingFurnitureId) ? "move" : get(draggingRoomId) ? "move" : get(draggingMultiSelect) ? "move" : get(draggingDoorId) ? "move" : get(draggingWindowId) ? "move" : get(draggingStairId) ? "move" : get(draggingColumnId) ? "move" : get(draggingTextAnnotationId) ? "move" : get(draggingWallParallel) ? "move" : get(draggingCurveHandle) ? "crosshair" : get(draggingWallEndpoint) ? "crosshair" : get(draggingHandle) === "rotate" ? "grabbing" : get(draggingHandle) === "resize-t" || get(draggingHandle) === "resize-b" ? "ns-resize" : get(draggingHandle) === "resize-l" || get(draggingHandle) === "resize-r" ? "ew-resize" : ((_$$get13 = get(draggingHandle)) === null || _$$get13 === void 0 ? void 0 : _$$get13.startsWith("resize")) ? "nwse-resize" : get(currentTool) === "text" ? "text" : get(currentTool) === "select" ? "default" : get(currentTool) === "furniture" ? "copy" : get(currentTool) === "door" || get(currentTool) === "window" ? get(placementPreview) ? "crosshair" : "not-allowed" : "crosshair";
68112
68196
  });
68113
68197
  var div = root$1();
68114
68198
  event("keydown", $window, onKeyDown);
@@ -68195,8 +68279,8 @@ function FloorPlanCanvas($$anchor, $$props) {
68195
68279
  }
68196
68280
  set(editingTextAnnotationId, null);
68197
68281
  } else if (e.key === "Escape") {
68198
- var _$$get12;
68199
- if ((_$$get12 = get(currentFloor)) === null || _$$get12 === void 0 ? void 0 : _$$get12.textAnnotations) {
68282
+ var _$$get14;
68283
+ if ((_$$get14 = get(currentFloor)) === null || _$$get14 === void 0 ? void 0 : _$$get14.textAnnotations) {
68200
68284
  const ta = get(currentFloor).textAnnotations.find((t) => t.id === get(editingTextAnnotationId));
68201
68285
  if (ta && ta.text === "Text" && !get(editingTextAnnotationValue).trim()) {
68202
68286
  removeTextAnnotation(get(editingTextAnnotationId));
@@ -68548,8 +68632,8 @@ function FloorPlanCanvas($$anchor, $$props) {
68548
68632
  var text_16 = child(div_8);
68549
68633
  reset(div_8);
68550
68634
  template_effect(() => {
68551
- var _$$get13;
68552
- return set_text(text_16, `Click to place · Scroll or R to rotate (${(_$$get13 = get(currentPlacingRotation)) !== null && _$$get13 !== void 0 ? _$$get13 : ""}°) · Esc
68635
+ var _$$get15;
68636
+ return set_text(text_16, `Click to place · Scroll or R to rotate (${(_$$get15 = get(currentPlacingRotation)) !== null && _$$get15 !== void 0 ? _$$get15 : ""}°) · Esc
68553
68637
  to cancel`);
68554
68638
  });
68555
68639
  append($$anchor, div_8);
@@ -69647,6 +69731,9 @@ function App($$anchor, $$props) {
69647
69731
  let config = /* @__PURE__ */ state(proxy({ ...DEFAULT_CONFIG }));
69648
69732
  (_$$props$stores = $$props.stores) === null || _$$props$stores === void 0 || _$$props$stores.floorData.subscribe((v) => set(floorData, v, true));
69649
69733
  (_$$props$stores2 = $$props.stores) === null || _$$props$stores2 === void 0 || _$$props$stores2.config.subscribe((v) => set(config, normalizeConfig(v), true));
69734
+ user_effect(() => {
69735
+ if (get(config).cameraThumbnailOpacity != null) cameraThumbnailOpacity.set(get(config).cameraThumbnailOpacity);
69736
+ });
69650
69737
  let commandPaletteOpen = /* @__PURE__ */ state(false);
69651
69738
  let printOpen = /* @__PURE__ */ state(false);
69652
69739
  let mode = /* @__PURE__ */ state("2d");
@@ -69784,6 +69871,10 @@ function App($$anchor, $$props) {
69784
69871
  var _$$get11;
69785
69872
  return (_$$get11 = get(config)) === null || _$$get11 === void 0 ? void 0 : _$$get11.cameraHeatmapMatrix;
69786
69873
  });
69874
+ let $10 = /* @__PURE__ */ user_derived(() => {
69875
+ var _$$get12;
69876
+ return ((_$$get12 = get(config)) === null || _$$get12 === void 0 ? void 0 : _$$get12.cameraThumbnail) || "";
69877
+ });
69787
69878
  FloorPlanCanvas(node_3, {
69788
69879
  get viewOnly() {
69789
69880
  return get($0);
@@ -69814,6 +69905,9 @@ function App($$anchor, $$props) {
69814
69905
  },
69815
69906
  get cameraHeatmapMatrix() {
69816
69907
  return get($9);
69908
+ },
69909
+ get cameraThumbnail() {
69910
+ return get($10);
69817
69911
  }
69818
69912
  });
69819
69913
  }
@@ -69842,8 +69936,12 @@ function App($$anchor, $$props) {
69842
69936
  {
69843
69937
  let $0 = /* @__PURE__ */ user_derived(() => get(mode) === "3d");
69844
69938
  let $1 = /* @__PURE__ */ user_derived(() => {
69845
- var _$$get$siteCameras, _$$get12;
69846
- return (_$$get$siteCameras = (_$$get12 = get(config)) === null || _$$get12 === void 0 ? void 0 : _$$get12.siteCameras) !== null && _$$get$siteCameras !== void 0 ? _$$get$siteCameras : [];
69939
+ var _$$get$siteCameras, _$$get13;
69940
+ return (_$$get$siteCameras = (_$$get13 = get(config)) === null || _$$get13 === void 0 ? void 0 : _$$get13.siteCameras) !== null && _$$get$siteCameras !== void 0 ? _$$get$siteCameras : [];
69941
+ });
69942
+ let $2 = /* @__PURE__ */ user_derived(() => {
69943
+ var _$$get$cameraThumbnai, _$$get14;
69944
+ return (_$$get$cameraThumbnai = (_$$get14 = get(config)) === null || _$$get14 === void 0 ? void 0 : _$$get14.cameraThumbnail) !== null && _$$get$cameraThumbnai !== void 0 ? _$$get$cameraThumbnai : "";
69847
69945
  });
69848
69946
  PropertiesPanel($$anchor, {
69849
69947
  get is3D() {
@@ -69851,6 +69949,9 @@ function App($$anchor, $$props) {
69851
69949
  },
69852
69950
  get siteCameras() {
69853
69951
  return get($1);
69952
+ },
69953
+ get cameraThumbnail() {
69954
+ return get($2);
69854
69955
  }
69855
69956
  });
69856
69957
  }
@@ -70016,18 +70117,11 @@ function _ensureShadowRoot() {
70016
70117
  }
70017
70118
  const shadow = this.attachShadow({ mode: "open" });
70018
70119
  const style = document.createElement("style");
70019
- style.textContent = app_default + `
70020
-
70021
- :host {
70022
-
70120
+ style.textContent = app_default + `:host {
70023
70121
  display: block;
70024
-
70025
70122
  width: 100%;
70026
-
70027
70123
  height: 100%;
70028
-
70029
70124
  }
70030
-
70031
70125
  `;
70032
70126
  shadow.appendChild(style);
70033
70127
  _classPrivateFieldSet2(_wrapper, this, document.createElement("div"));