floor-editor-ts 1.0.4 → 1.0.5

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.
@@ -56022,19 +56022,19 @@ var themePreference = createThemeStore();
56022
56022
  //#region src/lib/components/toolbar/SettingsDialog.svelte
56023
56023
  init_client();
56024
56024
  var root_2$12 = /* @__PURE__ */ from_html(`<div class="absolute bottom-0 left-0 right-0 h-0.5 bg-slate-700 dark:bg-slate-300 rounded-t"></div>`);
56025
- var root_3$12 = /* @__PURE__ */ from_html(`<div class="absolute bottom-0 left-0 right-0 h-0.5 bg-slate-700 dark:bg-slate-300 rounded-t"></div>`);
56026
- var root_4$11 = /* @__PURE__ */ from_html(`<div class="absolute bottom-0 left-0 right-0 h-0.5 bg-slate-700 dark:bg-slate-300 rounded-t"></div>`);
56027
- var root_5$9 = /* @__PURE__ */ from_html(`<div class="absolute bottom-0 left-0 right-0 h-0.5 bg-slate-700 dark:bg-slate-300 rounded-t"></div>`);
56028
- var root_6$6 = /* @__PURE__ */ from_html(`<div class="space-y-4"><label class="block"><span class="text-sm font-medium text-gray-700 dark:text-gray-300">Project Name</span> <input type="text" class="mt-1 w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg text-sm focus:ring-2 focus:ring-slate-500 focus:border-slate-500 outline-none bg-white dark:bg-gray-700 dark:text-gray-100" placeholder="Untitled Project"/></label> <label class="block"><span class="text-sm font-medium text-gray-700 dark:text-gray-300">Description</span> <textarea rows="3" class="mt-1 w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg text-sm focus:ring-2 focus:ring-slate-500 focus:border-slate-500 outline-none resize-none bg-white dark:bg-gray-700 dark:text-gray-100" placeholder="Add a description for this project..."></textarea></label></div>`);
56029
- var root_7$5 = /* @__PURE__ */ from_html(`<div class="flex items-center justify-between mb-5"><span class="text-sm font-medium text-gray-700 dark:text-gray-300">Metrics unit</span> <div class="flex rounded-lg border border-gray-300 dark:border-gray-600 overflow-hidden"><button>m, cm</button> <button>ft, inch</button></div></div> <div class="bg-gray-50 dark:bg-gray-700/50 rounded-xl divide-y divide-gray-200 dark:divide-gray-600"><label class="flex items-center justify-between px-4 py-3.5 cursor-pointer"><span class="text-sm text-gray-700">Dimensions</span> <input type="checkbox" class="w-10 h-5 rounded-full appearance-none cursor-pointer bg-gray-300 checked:bg-slate-700 relative transition-colors
56025
+ var root_3$11 = /* @__PURE__ */ from_html(`<div class="absolute bottom-0 left-0 right-0 h-0.5 bg-slate-700 dark:bg-slate-300 rounded-t"></div>`);
56026
+ var root_4$12 = /* @__PURE__ */ from_html(`<div class="absolute bottom-0 left-0 right-0 h-0.5 bg-slate-700 dark:bg-slate-300 rounded-t"></div>`);
56027
+ var root_5$8 = /* @__PURE__ */ from_html(`<div class="absolute bottom-0 left-0 right-0 h-0.5 bg-slate-700 dark:bg-slate-300 rounded-t"></div>`);
56028
+ var root_6$5 = /* @__PURE__ */ from_html(`<div class="space-y-4"><label class="block"><span class="text-sm font-medium text-gray-700 dark:text-gray-300">Project Name</span> <input type="text" class="mt-1 w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg text-sm focus:ring-2 focus:ring-slate-500 focus:border-slate-500 outline-none bg-white dark:bg-gray-700 dark:text-gray-100" placeholder="Untitled Project"/></label> <label class="block"><span class="text-sm font-medium text-gray-700 dark:text-gray-300">Description</span> <textarea rows="3" class="mt-1 w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg text-sm focus:ring-2 focus:ring-slate-500 focus:border-slate-500 outline-none resize-none bg-white dark:bg-gray-700 dark:text-gray-100" placeholder="Add a description for this project..."></textarea></label></div>`);
56029
+ var root_7$6 = /* @__PURE__ */ from_html(`<div class="flex items-center justify-between mb-5"><span class="text-sm font-medium text-gray-700 dark:text-gray-300">Metrics unit</span> <div class="flex rounded-lg border border-gray-300 dark:border-gray-600 overflow-hidden"><button>m, cm</button> <button>ft, inch</button></div></div> <div class="bg-gray-50 dark:bg-gray-700/50 rounded-xl divide-y divide-gray-200 dark:divide-gray-600"><label class="flex items-center justify-between px-4 py-3.5 cursor-pointer"><span class="text-sm text-gray-700">Dimensions</span> <input type="checkbox" class="w-10 h-5 rounded-full appearance-none cursor-pointer bg-gray-300 checked:bg-slate-700 relative transition-colors
56030
56030
  before:content-[''] before:absolute before:w-4 before:h-4 before:rounded-full before:bg-white before:top-0.5 before:left-0.5 before:transition-transform checked:before:translate-x-5"/></label> <label class="flex items-center justify-between px-4 py-3.5 cursor-pointer"><span class="text-sm text-gray-700">External Dimensions</span> <input type="checkbox" class="w-10 h-5 rounded-full appearance-none cursor-pointer bg-gray-300 checked:bg-slate-700 relative transition-colors
56031
56031
  before:content-[''] before:absolute before:w-4 before:h-4 before:rounded-full before:bg-white before:top-0.5 before:left-0.5 before:transition-transform checked:before:translate-x-5"/></label> <label class="flex items-center justify-between px-4 py-3.5 cursor-pointer"><span class="text-sm text-gray-700">Internal Dimensions</span> <input type="checkbox" class="w-10 h-5 rounded-full appearance-none cursor-pointer bg-gray-300 checked:bg-slate-700 relative transition-colors
56032
56032
  before:content-[''] before:absolute before:w-4 before:h-4 before:rounded-full before:bg-white before:top-0.5 before:left-0.5 before:transition-transform checked:before:translate-x-5"/></label> <label class="flex items-center justify-between px-4 py-3.5 cursor-pointer"><span class="text-sm text-gray-700">Extension Lines</span> <input type="checkbox" class="w-10 h-5 rounded-full appearance-none cursor-pointer bg-gray-300 checked:bg-slate-700 relative transition-colors
56033
56033
  before:content-[''] before:absolute before:w-4 before:h-4 before:rounded-full before:bg-white before:top-0.5 before:left-0.5 before:transition-transform checked:before:translate-x-5"/></label> <label class="flex items-center justify-between px-4 py-3.5 cursor-pointer"><span class="text-sm text-gray-700">Object Distance</span> <input type="checkbox" class="w-10 h-5 rounded-full appearance-none cursor-pointer bg-gray-300 checked:bg-slate-700 relative transition-colors
56034
56034
  before:content-[''] before:absolute before:w-4 before:h-4 before:rounded-full before:bg-white before:top-0.5 before:left-0.5 before:transition-transform checked:before:translate-x-5"/></label> <div class="flex items-center justify-between px-4 py-3.5"><span class="text-sm text-gray-700">Line Color</span> <div class="flex items-center gap-2"><button style="background-color: #ffffff" aria-label="White line color"></button> <span class="text-gray-300">|</span> <button style="background-color: #1e293b" aria-label="Dark line color"></button></div></div></div>`, 1);
56035
56035
  var root_9$2 = /* @__PURE__ */ from_html(`<button><span class="text-2xl"> </span> <span class="text-xs font-medium text-gray-700 dark:text-gray-300"> </span></button>`);
56036
- var root_8$2 = /* @__PURE__ */ from_html(`<div class="space-y-4"><div><span class="text-sm font-medium text-gray-700 dark:text-gray-300 block mb-3">Theme</span> <div class="flex gap-3"></div></div></div>`);
56037
- var root_11$3 = /* @__PURE__ */ from_html(`<button class="px-4 py-2 text-sm font-medium text-red-600 dark:text-red-400 border border-red-300 dark:border-red-600 rounded-lg hover:bg-red-50 dark:hover:bg-red-900/20 transition-colors">Remove</button>`);
56036
+ var root_8$4 = /* @__PURE__ */ from_html(`<div class="space-y-4"><div><span class="text-sm font-medium text-gray-700 dark:text-gray-300 block mb-3">Theme</span> <div class="flex gap-3"></div></div></div>`);
56037
+ var root_11$2 = /* @__PURE__ */ from_html(`<button class="px-4 py-2 text-sm font-medium text-red-600 dark:text-red-400 border border-red-300 dark:border-red-600 rounded-lg hover:bg-red-50 dark:hover:bg-red-900/20 transition-colors">Remove</button>`);
56038
56038
  var root_12$3 = /* @__PURE__ */ from_html(`<button class="px-4 py-2 text-sm font-medium text-red-600 dark:text-red-400 border border-red-300 dark:border-red-600 rounded-lg hover:bg-red-50 dark:hover:bg-red-900/20 transition-colors">Remove</button>`);
56039
56039
  var root_10$2 = /* @__PURE__ */ from_html(`<div class="space-y-4"><div><span class="text-sm font-medium text-gray-700 dark:text-gray-300 block mb-1">Gemini API Key</span> <p class="text-xs text-gray-500 dark:text-gray-400 mb-3">Required for AI-powered photorealistic rendering. Your key is stored locally in your browser only - never sent to our servers.</p> <div class="flex gap-2"><div class="relative flex-1"><input class="w-full px-3 py-2 pr-10 border border-gray-300 dark:border-gray-600 rounded-lg text-sm font-mono focus:ring-2 focus:ring-slate-500 focus:border-slate-500 outline-none bg-white dark:bg-gray-700 dark:text-gray-100" placeholder="AIza..."/> <button class="absolute right-2 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 text-sm"> </button></div></div> <div class="flex gap-2 mt-3"><button class="px-4 py-2 text-sm font-medium bg-slate-700 text-white rounded-lg hover:bg-slate-600 transition-colors"> </button> <!></div></div> <div class="border-t border-gray-200 dark:border-gray-700 pt-4"><span class="text-sm font-medium text-gray-700 dark:text-gray-300 block mb-2">How to get a Gemini key</span> <ol class="text-xs text-gray-500 dark:text-gray-400 space-y-1 list-decimal list-inside"><li>Go to <a href="https://aistudio.google.com/apikey" target="_blank" rel="noopener" class="text-blue-500 hover:underline">Google AI Studio</a></li> <li>Click "Create API Key"</li> <li>Copy and paste it above</li></ol></div> <div class="border-t border-gray-200 dark:border-gray-700 pt-4"><span class="text-sm font-medium text-gray-700 dark:text-gray-300 block mb-1">OpenAI API Key</span> <p class="text-xs text-gray-500 dark:text-gray-400 mb-3">Optional — enables OpenAI image generation as an alternative to Gemini. Stored locally only.</p> <div class="flex gap-2"><div class="relative flex-1"><input class="w-full px-3 py-2 pr-10 border border-gray-300 dark:border-gray-600 rounded-lg text-sm font-mono focus:ring-2 focus:ring-slate-500 focus:border-slate-500 outline-none bg-white dark:bg-gray-700 dark:text-gray-100" placeholder="sk-..."/> <button class="absolute right-2 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 text-sm"> </button></div></div> <div class="flex gap-2 mt-3"><button class="px-4 py-2 text-sm font-medium bg-slate-700 text-white rounded-lg hover:bg-slate-600 transition-colors"> </button> <!></div> <div class="mt-3"><span class="text-sm font-medium text-gray-700 dark:text-gray-300 block mb-2">How to get an OpenAI key</span> <ol class="text-xs text-gray-500 dark:text-gray-400 space-y-1 list-decimal list-inside"><li>Go to <a href="https://platform.openai.com/api-keys" target="_blank" rel="noopener" class="text-blue-500 hover:underline">OpenAI Platform</a></li> <li>Click "Create new secret key"</li> <li>Copy and paste it above</li></ol></div></div></div>`);
56040
56040
  var root_1$14 = /* @__PURE__ */ from_html(`<div class="fixed inset-0 bg-black/50 z-50 flex items-center justify-center" role="dialog" tabindex="-1" aria-label="Settings"><div class="bg-white dark:bg-gray-800 rounded-xl shadow-2xl w-[420px] max-h-[80vh] flex flex-col" role="document"><div class="flex items-center justify-between px-5 pt-4 pb-2"><h2 class="text-lg font-bold text-gray-800 dark:text-gray-100">Settings</h2> <button class="text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 text-xl leading-none" aria-label="Close settings">✕</button></div> <div class="flex border-b border-gray-200 dark:border-gray-700 px-5"><button>Project <!></button> <button>Dimensions <!></button> <button>Appearance <!></button> <button>AI <!></button></div> <div class="p-5 overflow-y-auto"><!></div></div></div>`);
@@ -56158,7 +56158,7 @@ function SettingsDialog($$anchor, $$props) {
56158
56158
  var button_2 = sibling(button_1, 2);
56159
56159
  var node_2 = sibling(child(button_2));
56160
56160
  var consequent_1 = ($$anchor) => {
56161
- append($$anchor, root_3$12());
56161
+ append($$anchor, root_3$11());
56162
56162
  };
56163
56163
  if_block(node_2, ($$render) => {
56164
56164
  if (get(activeTab) === "dimensions") $$render(consequent_1);
@@ -56167,7 +56167,7 @@ function SettingsDialog($$anchor, $$props) {
56167
56167
  var button_3 = sibling(button_2, 2);
56168
56168
  var node_3 = sibling(child(button_3));
56169
56169
  var consequent_2 = ($$anchor) => {
56170
- append($$anchor, root_4$11());
56170
+ append($$anchor, root_4$12());
56171
56171
  };
56172
56172
  if_block(node_3, ($$render) => {
56173
56173
  if (get(activeTab) === "appearance") $$render(consequent_2);
@@ -56176,7 +56176,7 @@ function SettingsDialog($$anchor, $$props) {
56176
56176
  var button_4 = sibling(button_3, 2);
56177
56177
  var node_4 = sibling(child(button_4));
56178
56178
  var consequent_3 = ($$anchor) => {
56179
- append($$anchor, root_5$9());
56179
+ append($$anchor, root_5$8());
56180
56180
  };
56181
56181
  if_block(node_4, ($$render) => {
56182
56182
  if (get(activeTab) === "ai") $$render(consequent_3);
@@ -56186,7 +56186,7 @@ function SettingsDialog($$anchor, $$props) {
56186
56186
  var div_8 = sibling(div_3, 2);
56187
56187
  var node_5 = child(div_8);
56188
56188
  var consequent_4 = ($$anchor) => {
56189
- var div_9 = root_6$6();
56189
+ var div_9 = root_6$5();
56190
56190
  var label_1 = child(div_9);
56191
56191
  var input = sibling(child(label_1), 2);
56192
56192
  remove_input_defaults(input);
@@ -56205,7 +56205,7 @@ function SettingsDialog($$anchor, $$props) {
56205
56205
  append($$anchor, div_9);
56206
56206
  };
56207
56207
  var consequent_5 = ($$anchor) => {
56208
- var fragment_1 = root_7$5();
56208
+ var fragment_1 = root_7$6();
56209
56209
  var div_10 = first_child(fragment_1);
56210
56210
  var div_11 = sibling(child(div_10), 2);
56211
56211
  var button_5 = child(div_11);
@@ -56263,7 +56263,7 @@ function SettingsDialog($$anchor, $$props) {
56263
56263
  append($$anchor, fragment_1);
56264
56264
  };
56265
56265
  var consequent_6 = ($$anchor) => {
56266
- var div_15 = root_8$2();
56266
+ var div_15 = root_8$4();
56267
56267
  var div_16 = child(div_15);
56268
56268
  var div_17 = sibling(child(div_16), 2);
56269
56269
  each(div_17, 20, () => [
@@ -56326,7 +56326,7 @@ function SettingsDialog($$anchor, $$props) {
56326
56326
  reset(button_11);
56327
56327
  var node_6 = sibling(button_11, 2);
56328
56328
  var consequent_7 = ($$anchor) => {
56329
- var button_12 = root_11$3();
56329
+ var button_12 = root_11$2();
56330
56330
  delegated("click", button_12, clearGeminiKey);
56331
56331
  append($$anchor, button_12);
56332
56332
  };
@@ -56431,9 +56431,9 @@ delegate([
56431
56431
  init_client();
56432
56432
  var root_2$11 = /* @__PURE__ */ from_html(`<div class="flex items-center justify-between text-xs bg-gray-50 rounded px-2 py-1.5"><span class="text-gray-700"> <span class="text-gray-400"> </span></span> <span class="font-medium text-gray-800"> </span></div>`);
56433
56433
  var root_1$13 = /* @__PURE__ */ from_html(`<div><h4 class="text-xs font-semibold text-gray-500 uppercase mb-1.5">By Category</h4> <div class="space-y-1"></div></div>`);
56434
- var root_4$10 = /* @__PURE__ */ from_html(`<div class="flex items-center gap-1.5 text-xs px-1 py-1"><div class="flex-1 min-w-0"><div class="flex items-center justify-between"><span class="text-gray-700 truncate"> </span> <span class="text-gray-500 ml-1 shrink-0"> </span></div> <div class="w-full bg-gray-200 rounded-full h-1 mt-0.5"><div class="bg-blue-400 h-1 rounded-full"></div></div></div> <span class="text-[10px] text-gray-400 w-8 text-right shrink-0"> </span></div>`);
56435
- var root_3$11 = /* @__PURE__ */ from_html(`<div><h4 class="text-xs font-semibold text-gray-500 uppercase mb-1.5">Room Breakdown</h4> <div class="space-y-0.5"></div></div>`);
56436
- var root_5$8 = /* @__PURE__ */ from_html(`<p class="text-xs text-gray-400 text-center py-4">No rooms detected yet.<br/>Draw walls to create rooms.</p>`);
56434
+ var root_4$11 = /* @__PURE__ */ from_html(`<div class="flex items-center gap-1.5 text-xs px-1 py-1"><div class="flex-1 min-w-0"><div class="flex items-center justify-between"><span class="text-gray-700 truncate"> </span> <span class="text-gray-500 ml-1 shrink-0"> </span></div> <div class="w-full bg-gray-200 rounded-full h-1 mt-0.5"><div class="bg-blue-400 h-1 rounded-full"></div></div></div> <span class="text-[10px] text-gray-400 w-8 text-right shrink-0"> </span></div>`);
56435
+ var root_3$10 = /* @__PURE__ */ from_html(`<div><h4 class="text-xs font-semibold text-gray-500 uppercase mb-1.5">Room Breakdown</h4> <div class="space-y-0.5"></div></div>`);
56436
+ var root_5$7 = /* @__PURE__ */ from_html(`<p class="text-xs text-gray-400 text-center py-4">No rooms detected yet.<br/>Draw walls to create rooms.</p>`);
56437
56437
  var root$5 = /* @__PURE__ */ from_html(`<div class="space-y-3"><div class="grid grid-cols-2 gap-2"><div class="bg-blue-50 rounded-lg p-2 text-center"><div class="text-lg font-bold text-blue-700"> </div> <div class="text-[10px] text-blue-500">Rooms</div></div> <div class="bg-green-50 rounded-lg p-2 text-center"><div class="text-lg font-bold text-green-700"> </div> <div class="text-[10px] text-green-500">Total Area</div></div> <div class="bg-amber-50 rounded-lg p-2 text-center"><div class="text-sm font-bold text-amber-700"> </div> <div class="text-[10px] text-amber-500">Doors / Windows</div></div> <div class="bg-purple-50 rounded-lg p-2 text-center"><div class="text-sm font-bold text-purple-700"> </div> <div class="text-[10px] text-purple-500">Wall Length</div></div></div> <!> <!></div>`);
56438
56438
  function AreaSummaryPanel($$anchor, $$props) {
56439
56439
  push($$props, true);
@@ -56578,11 +56578,11 @@ function AreaSummaryPanel($$anchor, $$props) {
56578
56578
  });
56579
56579
  var node_1 = sibling(node, 2);
56580
56580
  var consequent_1 = ($$anchor) => {
56581
- var div_13 = root_3$11();
56581
+ var div_13 = root_3$10();
56582
56582
  var div_14 = sibling(child(div_13), 2);
56583
56583
  each(div_14, 21, () => get(allRooms), index$1, ($$anchor, room) => {
56584
56584
  const pct = /* @__PURE__ */ user_derived(() => get(totalArea) > 0 ? get(room).area / get(totalArea) * 100 : 0);
56585
- var div_15 = root_4$10();
56585
+ var div_15 = root_4$11();
56586
56586
  var div_16 = child(div_15);
56587
56587
  var div_17 = child(div_16);
56588
56588
  var span_3 = child(div_17);
@@ -56617,7 +56617,7 @@ function AreaSummaryPanel($$anchor, $$props) {
56617
56617
  append($$anchor, div_13);
56618
56618
  };
56619
56619
  var alternate = ($$anchor) => {
56620
- append($$anchor, root_5$8());
56620
+ append($$anchor, root_5$7());
56621
56621
  };
56622
56622
  if_block(node_1, ($$render) => {
56623
56623
  if (get(allRooms).length > 0) $$render(consequent_1);
@@ -56776,9 +56776,9 @@ async function autoSave(onDispatch) {
56776
56776
  //#region src/lib/components/toolbar/VersionHistoryPanel.svelte
56777
56777
  init_client();
56778
56778
  var root_2$10 = /* @__PURE__ */ from_html(`<p class="text-sm text-gray-400 text-center py-8">No snapshots yet.<br/>Versions are saved automatically every 5 minutes.</p>`);
56779
- var root_4$9 = /* @__PURE__ */ from_html(`<div class="flex items-center justify-between py-2 px-2 rounded-lg hover:bg-gray-50 group transition-colors"><div class="flex-1 min-w-0"><div class="text-sm font-medium text-gray-700 truncate"> </div> <div class="text-xs text-gray-400"> </div></div> <button class="text-xs px-2.5 py-1 bg-blue-50 text-blue-600 rounded-md hover:bg-blue-100 transition-colors opacity-0 group-hover:opacity-100 font-medium shrink-0 ml-2">Restore</button></div>`);
56780
- var root_3$10 = /* @__PURE__ */ from_html(`<div class="space-y-1"></div>`);
56781
- var root_5$7 = /* @__PURE__ */ from_html(`<div class="px-4 py-2 border-t border-gray-100"><button class="text-xs text-red-400 hover:text-red-600 transition-colors">Clear all versions</button></div>`);
56779
+ var root_4$10 = /* @__PURE__ */ from_html(`<div class="flex items-center justify-between py-2 px-2 rounded-lg hover:bg-gray-50 group transition-colors"><div class="flex-1 min-w-0"><div class="text-sm font-medium text-gray-700 truncate"> </div> <div class="text-xs text-gray-400"> </div></div> <button class="text-xs px-2.5 py-1 bg-blue-50 text-blue-600 rounded-md hover:bg-blue-100 transition-colors opacity-0 group-hover:opacity-100 font-medium shrink-0 ml-2">Restore</button></div>`);
56780
+ var root_3$9 = /* @__PURE__ */ from_html(`<div class="space-y-1"></div>`);
56781
+ var root_5$6 = /* @__PURE__ */ from_html(`<div class="px-4 py-2 border-t border-gray-100"><button class="text-xs text-red-400 hover:text-red-600 transition-colors">Clear all versions</button></div>`);
56782
56782
  var root_1$12 = /* @__PURE__ */ from_html(`<div class="fixed inset-0 bg-black/40 z-50 flex items-center justify-center"><div class="bg-white rounded-xl shadow-2xl w-96 max-h-[70vh] flex flex-col"><div class="flex items-center justify-between px-4 py-3 border-b border-gray-100"><h2 class="text-sm font-semibold text-gray-800 flex items-center gap-2"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline></svg> Version History</h2> <button class="text-gray-400 hover:text-gray-600 transition-colors" aria-label="Close"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg></button></div> <div class="flex-1 overflow-y-auto px-4 py-2"><!></div> <!></div></div>`);
56783
56783
  function VersionHistoryPanel($$anchor, $$props) {
56784
56784
  push($$props, true);
@@ -56828,10 +56828,10 @@ function VersionHistoryPanel($$anchor, $$props) {
56828
56828
  append($$anchor, root_2$10());
56829
56829
  };
56830
56830
  var alternate = ($$anchor) => {
56831
- var div_4 = root_3$10();
56831
+ var div_4 = root_3$9();
56832
56832
  each(div_4, 21, () => [...get(snapshots)].reverse(), index$1, ($$anchor, snap, i) => {
56833
56833
  const realIndex = /* @__PURE__ */ user_derived(() => get(snapshots).length - 1 - i);
56834
- var div_5 = root_4$9();
56834
+ var div_5 = root_4$10();
56835
56835
  var div_6 = child(div_5);
56836
56836
  var div_7 = child(div_6);
56837
56837
  var text = child(div_7, true);
@@ -56859,7 +56859,7 @@ function VersionHistoryPanel($$anchor, $$props) {
56859
56859
  reset(div_3);
56860
56860
  var node_2 = sibling(div_3, 2);
56861
56861
  var consequent_1 = ($$anchor) => {
56862
- var div_9 = root_5$7();
56862
+ var div_9 = root_5$6();
56863
56863
  var button_2 = child(div_9);
56864
56864
  reset(div_9);
56865
56865
  delegated("click", button_2, onClearAll);
@@ -56892,15 +56892,16 @@ init_client();
56892
56892
  init_index_client();
56893
56893
  init_onboarding_svelte();
56894
56894
  var root_2$9 = /* @__PURE__ */ from_html(`<input type="text" class="bg-white/20 text-white font-semibold px-2 py-0.5 rounded border border-white/30 outline-none text-sm w-40"/>`);
56895
- var root_3$9 = /* @__PURE__ */ from_html(`<button class="font-semibold text-white text-sm hover:bg-white/10 px-2 py-0.5 rounded transition-colors" title="Click to rename"> </button>`);
56896
- var root_4$8 = /* @__PURE__ */ from_html(`<button> </button>`);
56897
- var root_5$6 = /* @__PURE__ */ from_html(`<div class="flex bg-white/15 rounded-full p-0.5"><button title="Select mode (V)" aria-label="Select mode"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 3l7.07 16.97 2.51-7.39 7.39-2.51L3 3z"></path><path d="M13 13l6 6"></path></svg></button> <button title="Pan mode (H)" aria-label="Pan mode"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 11V6a2 2 0 0 0-4 0v1"></path><path d="M14 10V4a2 2 0 0 0-4 0v2"></path><path d="M10 10.5V6a2 2 0 0 0-4 0v8"></path><path d="M18 8a2 2 0 1 1 4 0v6a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.86-5.99-2.34l-3.6-3.6a2 2 0 0 1 2.83-2.82L7 15"></path></svg></button></div>`);
56898
- var root_6$5 = /* @__PURE__ */ from_html(`<div class="flex items-center gap-1 bg-white/15 rounded-full p-0.5"><button class="w-7 h-7 flex items-center justify-center text-white/80 hover:text-white hover:bg-white/10 rounded-full transition-colors text-sm font-bold" title="Zoom Out (−)" aria-label="Zoom Out">−</button> <button class="px-2 py-1 text-xs font-medium text-white/80 hover:text-white hover:bg-white/10 rounded-full transition-colors min-w-[3rem] text-center" title="Reset Zoom (100%)"> </button> <button class="w-7 h-7 flex items-center justify-center text-white/80 hover:text-white hover:bg-white/10 rounded-full transition-colors text-sm font-bold" title="Zoom In (+)" aria-label="Zoom In">+</button></div>`);
56899
- var root_7$4 = /* @__PURE__ */ from_html(`<div class="absolute right-0 top-full mt-1 bg-white rounded-lg shadow-lg border border-gray-200 py-1 w-48 z-50"><button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="6 9 6 2 18 2 18 9"></polyline><path d="M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2"></path><rect x="6" y="14" width="12" height="8"></rect></svg> Print Layout</button> <div class="h-px bg-gray-100 my-1"></div> <button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="18" height="18" rx="2"></rect><circle cx="8.5" cy="8.5" r="1.5"></circle><path d="M21 15l-5-5L5 21"></path></svg> Export 2D as PNG</button> <button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 2L2 7l10 5 10-5-10-5z"></path><path d="M2 17l10 5 10-5"></path><path d="M2 12l10 5 10-5"></path></svg> Export 3D as PNG</button> <button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 19V5"></path><path d="M5 12l7-7 7 7"></path></svg> Export as SVG</button> <button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><path d="M14 2v6h6"></path><path d="M8 16h2"></path><path d="M14 16h2"></path></svg> Export as DXF</button> <button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><path d="M14 2v6h6"></path><path d="M9 16h6"></path></svg> Export as DWG</button> <button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><path d="M14 2v6h6"></path><path d="M16 11v6"></path><path d="M8 11v6"></path><path d="M12 11v6"></path></svg> Export as PDF</button> <button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><path d="M14 2v6h6"></path></svg> Download JSON</button> <div class="h-px bg-gray-100 my-1"></div> <button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="17 8 12 3 7 8"></polyline><line x1="12" y1="3" x2="12" y2="15"></line></svg> Import JSON</button> <button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="12" y1="5" x2="12" y2="19"></line><line x1="5" y1="12" x2="19" y2="12"></line></svg> New Project</button></div>`);
56895
+ var root_3$8 = /* @__PURE__ */ from_html(`<button class="font-semibold text-white text-sm hover:bg-white/10 px-2 py-0.5 rounded transition-colors" title="Click to rename"> </button>`);
56896
+ var root_4$9 = /* @__PURE__ */ from_html(`<button> </button>`);
56897
+ var root_5$5 = /* @__PURE__ */ from_html(`<div class="flex bg-white/15 rounded-full p-0.5"><button title="Select mode (V)" aria-label="Select mode"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 3l7.07 16.97 2.51-7.39 7.39-2.51L3 3z"></path><path d="M13 13l6 6"></path></svg></button> <button title="Pan mode (H)" aria-label="Pan mode"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 11V6a2 2 0 0 0-4 0v1"></path><path d="M14 10V4a2 2 0 0 0-4 0v2"></path><path d="M10 10.5V6a2 2 0 0 0-4 0v8"></path><path d="M18 8a2 2 0 1 1 4 0v6a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.86-5.99-2.34l-3.6-3.6a2 2 0 0 1 2.83-2.82L7 15"></path></svg></button></div>`);
56898
+ var root_6$4 = /* @__PURE__ */ from_html(`<div class="flex items-center gap-1 bg-white/15 rounded-full p-0.5"><button class="w-7 h-7 flex items-center justify-center text-white/80 hover:text-white hover:bg-white/10 rounded-full transition-colors text-sm font-bold" title="Zoom Out (−)" aria-label="Zoom Out">−</button> <button class="px-2 py-1 text-xs font-medium text-white/80 hover:text-white hover:bg-white/10 rounded-full transition-colors min-w-[3rem] text-center" title="Reset Zoom (100%)"> </button> <button class="w-7 h-7 flex items-center justify-center text-white/80 hover:text-white hover:bg-white/10 rounded-full transition-colors text-sm font-bold" title="Zoom In (+)" aria-label="Zoom In">+</button></div>`);
56899
+ var root_8$3 = /* @__PURE__ */ from_html(`<button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="17 8 12 3 7 8"></polyline><line x1="12" y1="3" x2="12" y2="15"></line></svg> Import JSON</button>`);
56900
+ var root_7$5 = /* @__PURE__ */ from_html(`<div class="absolute right-0 top-full mt-1 bg-white rounded-lg shadow-lg border border-gray-200 py-1 w-48 z-50"><button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="6 9 6 2 18 2 18 9"></polyline><path d="M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2"></path><rect x="6" y="14" width="12" height="8"></rect></svg> Print Layout</button> <div class="h-px bg-gray-100 my-1"></div> <button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="18" height="18" rx="2"></rect><circle cx="8.5" cy="8.5" r="1.5"></circle><path d="M21 15l-5-5L5 21"></path></svg> Export 2D as PNG</button> <button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 2L2 7l10 5 10-5-10-5z"></path><path d="M2 17l10 5 10-5"></path><path d="M2 12l10 5 10-5"></path></svg> Export 3D as PNG</button> <button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 19V5"></path><path d="M5 12l7-7 7 7"></path></svg> Export as SVG</button> <button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><path d="M14 2v6h6"></path><path d="M8 16h2"></path><path d="M14 16h2"></path></svg> Export as DXF</button> <button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><path d="M14 2v6h6"></path><path d="M9 16h6"></path></svg> Export as DWG</button> <button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><path d="M14 2v6h6"></path><path d="M16 11v6"></path><path d="M8 11v6"></path><path d="M12 11v6"></path></svg> Export as PDF</button> <button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><path d="M14 2v6h6"></path></svg> Download JSON</button> <div class="h-px bg-gray-100 my-1"></div> <!> <button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="12" y1="5" x2="12" y2="19"></line><line x1="5" y1="12" x2="19" y2="12"></line></svg> New Project</button></div>`);
56900
56901
  var root_1$11 = /* @__PURE__ */ from_html(`<div class="h-12 bg-gradient-to-r from-slate-800 to-slate-700 flex items-center px-4 gap-3 shrink-0 shadow-sm"><!> <div class="h-5 w-px bg-white/20"></div> <div class="flex items-center gap-1"><!> <button class="text-white/80 hover:text-white text-xs hover:bg-white/10 px-1.5 py-0.5 rounded transition-colors" title="Add Floor" aria-label="Add Floor">+</button> <span class="text-white/40 text-[10px] ml-1"> </span></div> <div class="flex-1"></div> <button class="p-1.5 text-white/80 hover:text-white hover:bg-white/10 rounded transition-colors" title="Undo (Ctrl+Z)" aria-label="Undo"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="1 4 1 10 7 10"></polyline><path d="M3.51 15a9 9 0 1 0 2.13-9.36L1 10"></path></svg></button> <button class="p-1.5 text-white/80 hover:text-white hover:bg-white/10 rounded transition-colors" title="Redo (Ctrl+Y)" aria-label="Redo"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="23 4 23 10 17 10"></polyline><path d="M20.49 15a9 9 0 1 1-2.13-9.36L23 10"></path></svg></button> <div class="h-5 w-px bg-white/20"></div> <button aria-label="Snap to Grid"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="7" height="7"></rect><rect x="14" y="3" width="7" height="7"></rect><rect x="14" y="14" width="7" height="7"></rect><rect x="3" y="14" width="7" height="7"></rect></svg></button> <!> <button aria-label="Toggle Furniture"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="12" width="20" height="8" rx="1"></rect><path d="M4 12V7a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v5"></path><line x1="12" y1="12" x2="12" y2="20"></line></svg></button> <div class="h-5 w-px bg-white/20"></div> <!> <button class="p-1.5 text-white/80 hover:text-white hover:bg-white/10 rounded transition-colors" title="Version History" aria-label="Version History"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline></svg></button> <button class="px-2 py-1.5 text-white/80 hover:text-white hover:bg-white/10 rounded transition-colors" title="Area Summary" aria-label="Area Summary"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="2"></rect><path d="M3 9h18"></path><path d="M9 3v18"></path></svg></button> <button class="px-2 py-1.5 text-white/80 hover:text-white hover:bg-white/10 rounded transition-colors" title="Settings" aria-label="Settings"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06A1.65 1.65 0 0 0 4.68 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06A1.65 1.65 0 0 0 9 4.68a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06A1.65 1.65 0 0 0 19.4 9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path></svg></button> <div class="h-5 w-px bg-white/20"></div> <div class="relative"><button class="px-3 py-1.5 text-sm text-white/90 hover:text-white hover:bg-white/10 rounded transition-colors flex items-center gap-1.5"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="7 10 12 15 17 10"></polyline><line x1="12" y1="15" x2="12" y2="3"></line></svg> Export</button> <!></div> <span><!></span> <button class="px-3 py-1.5 text-sm bg-white text-slate-800 font-semibold rounded-lg hover:bg-blue-50 transition-colors shadow-sm">Save</button></div>`);
56901
- var root_12$2 = /* @__PURE__ */ from_html(`<div class="absolute right-0 top-full mt-1 bg-white rounded-lg shadow-lg border border-gray-200 py-1 w-48 z-50"><button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="6 9 6 2 18 2 18 9"></polyline><path d="M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2"></path><rect x="6" y="14" width="12" height="8"></rect></svg> Print Layout</button> <div class="h-px bg-gray-100 my-1"></div> <button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="18" height="18" rx="2"></rect><circle cx="8.5" cy="8.5" r="1.5"></circle><path d="M21 15l-5-5L5 21"></path></svg> Export 2D as PNG</button> <button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 2L2 7l10 5 10-5-10-5z"></path><path d="M2 17l10 5 10-5"></path><path d="M2 12l10 5 10-5"></path></svg> Export 3D as PNG</button> <button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 19V5"></path><path d="M5 12l7-7 7 7"></path></svg> Export as SVG</button> <button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><path d="M14 2v6h6"></path><path d="M8 16h2"></path><path d="M14 16h2"></path></svg> Export as DXF</button> <button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><path d="M14 2v6h6"></path><path d="M9 16h6"></path></svg> Export as DWG</button> <button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><path d="M14 2v6h6"></path><path d="M16 11v6"></path><path d="M8 11v6"></path><path d="M12 11v6"></path></svg> Export as PDF</button> <button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><path d="M14 2v6h6"></path></svg> Download JSON</button> <div class="h-px bg-gray-100 my-1"></div> <button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="17 8 12 3 7 8"></polyline><line x1="12" y1="3" x2="12" y2="15"></line></svg> Import JSON</button></div>`);
56902
- var root_11$2 = /* @__PURE__ */ from_html(`<div class="h-12 bg-gradient-to-r from-slate-800 to-slate-700 flex items-center justify-between px-4 gap-3 shrink-0 shadow-sm"><span class="font-semibold text-white text-sm px-2 py-0.5 rounded transition-colors"> </span> <div class="relative"><button class="px-3 py-1.5 text-sm text-white/90 hover:text-white hover:bg-white/10 rounded transition-colors flex items-center gap-1.5"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="7 10 12 15 17 10"></polyline><line x1="12" y1="15" x2="12" y2="3"></line></svg> Import</button> <!></div></div>`);
56903
- var root_13$1 = /* @__PURE__ */ from_html(`<div class="fixed inset-0 z-50 flex items-center justify-center bg-black/40"><div class="bg-white rounded-xl shadow-2xl w-[420px] max-h-[80vh] overflow-hidden"><div class="flex items-center justify-between px-5 py-3 border-b border-gray-200"><h2 class="text-base font-semibold text-gray-800">📐 Area Summary</h2> <button class="text-gray-400 hover:text-gray-600 text-xl leading-none">&times;</button></div> <div class="overflow-y-auto max-h-[calc(80vh-52px)] p-1"><!></div></div></div>`);
56902
+ var root_13$2 = /* @__PURE__ */ from_html(`<div class="absolute right-0 top-full mt-1 bg-white rounded-lg shadow-lg border border-gray-200 py-1 w-48 z-50"><button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="6 9 6 2 18 2 18 9"></polyline><path d="M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2"></path><rect x="6" y="14" width="12" height="8"></rect></svg> Print Layout</button> <div class="h-px bg-gray-100 my-1"></div> <button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="18" height="18" rx="2"></rect><circle cx="8.5" cy="8.5" r="1.5"></circle><path d="M21 15l-5-5L5 21"></path></svg> Export 2D as PNG</button> <button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 2L2 7l10 5 10-5-10-5z"></path><path d="M2 17l10 5 10-5"></path><path d="M2 12l10 5 10-5"></path></svg> Export 3D as PNG</button> <button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 19V5"></path><path d="M5 12l7-7 7 7"></path></svg> Export as SVG</button> <button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><path d="M14 2v6h6"></path><path d="M8 16h2"></path><path d="M14 16h2"></path></svg> Export as DXF</button> <button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><path d="M14 2v6h6"></path><path d="M9 16h6"></path></svg> Export as DWG</button> <button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><path d="M14 2v6h6"></path><path d="M16 11v6"></path><path d="M8 11v6"></path><path d="M12 11v6"></path></svg> Export as PDF</button> <button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><path d="M14 2v6h6"></path></svg> Download JSON</button> <div class="h-px bg-gray-100 my-1"></div> <button class="w-full px-3 py-2 text-sm text-gray-700 hover:bg-gray-100 text-left flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="17 8 12 3 7 8"></polyline><line x1="12" y1="3" x2="12" y2="15"></line></svg> Import JSON</button></div>`);
56903
+ var root_12$2 = /* @__PURE__ */ from_html(`<div class="h-12 bg-gradient-to-r from-slate-800 to-slate-700 flex items-center justify-between px-4 gap-3 shrink-0 shadow-sm"><span class="font-semibold text-white text-sm px-2 py-0.5 rounded transition-colors"> </span> <div class="relative"><button class="px-3 py-1.5 text-sm text-white/90 hover:text-white hover:bg-white/10 rounded transition-colors flex items-center gap-1.5"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="7 10 12 15 17 10"></polyline><line x1="12" y1="15" x2="12" y2="3"></line></svg> Import</button> <!></div></div>`);
56904
+ var root_14$1 = /* @__PURE__ */ from_html(`<div class="fixed inset-0 z-50 flex items-center justify-center bg-black/40"><div class="bg-white rounded-xl shadow-2xl w-[420px] max-h-[80vh] overflow-hidden"><div class="flex items-center justify-between px-5 py-3 border-b border-gray-200"><h2 class="text-base font-semibold text-gray-800">📐 Area Summary</h2> <button class="text-gray-400 hover:text-gray-600 text-xl leading-none">&times;</button></div> <div class="overflow-y-auto max-h-[calc(80vh-52px)] p-1"><!></div></div></div>`);
56904
56905
  var root$4 = /* @__PURE__ */ from_html(`<!> <!> <!> <!>`, 1);
56905
56906
  function TopBar($$anchor, $$props) {
56906
56907
  push($$props, true);
@@ -57085,7 +57086,7 @@ function TopBar($$anchor, $$props) {
57085
57086
  }
57086
57087
  var fragment = root$4();
57087
57088
  var node = first_child(fragment);
57088
- var consequent_6 = ($$anchor) => {
57089
+ var consequent_7 = ($$anchor) => {
57089
57090
  var div = root_1$11();
57090
57091
  var node_1 = child(div);
57091
57092
  var consequent = ($$anchor) => {
@@ -57097,7 +57098,7 @@ function TopBar($$anchor, $$props) {
57097
57098
  append($$anchor, input_1);
57098
57099
  };
57099
57100
  var alternate = ($$anchor) => {
57100
- var button = root_3$9();
57101
+ var button = root_3$8();
57101
57102
  var text_1 = child(button, true);
57102
57103
  reset(button);
57103
57104
  template_effect(() => set_text(text_1, get(projectName)));
@@ -57111,7 +57112,7 @@ function TopBar($$anchor, $$props) {
57111
57112
  var div_1 = sibling(node_1, 4);
57112
57113
  var node_2 = child(div_1);
57113
57114
  each(node_2, 17, () => get(floors), index$1, ($$anchor, fl) => {
57114
- var button_1 = root_4$8();
57115
+ var button_1 = root_4$9();
57115
57116
  var text_2 = child(button_1, true);
57116
57117
  reset(button_1);
57117
57118
  template_effect(() => {
@@ -57133,7 +57134,7 @@ function TopBar($$anchor, $$props) {
57133
57134
  var button_5 = sibling(button_4, 4);
57134
57135
  var node_3 = sibling(button_5, 2);
57135
57136
  var consequent_1 = ($$anchor) => {
57136
- var div_2 = root_5$6();
57137
+ var div_2 = root_5$5();
57137
57138
  var button_6 = child(div_2);
57138
57139
  var button_7 = sibling(button_6, 2);
57139
57140
  reset(div_2);
@@ -57151,7 +57152,7 @@ function TopBar($$anchor, $$props) {
57151
57152
  var button_8 = sibling(node_3, 2);
57152
57153
  var node_4 = sibling(button_8, 4);
57153
57154
  var consequent_2 = ($$anchor) => {
57154
- var div_3 = root_6$5();
57155
+ var div_3 = root_6$4();
57155
57156
  var button_9 = child(div_3);
57156
57157
  var button_10 = sibling(button_9, 2);
57157
57158
  var text_4 = child(button_10);
@@ -57173,8 +57174,8 @@ function TopBar($$anchor, $$props) {
57173
57174
  var div_4 = sibling(button_14, 4);
57174
57175
  var button_15 = child(div_4);
57175
57176
  var node_5 = sibling(button_15, 2);
57176
- var consequent_3 = ($$anchor) => {
57177
- var div_5 = root_7$4();
57177
+ var consequent_4 = ($$anchor) => {
57178
+ var div_5 = root_7$5();
57178
57179
  var button_16 = child(div_5);
57179
57180
  var button_17 = sibling(button_16, 4);
57180
57181
  var button_18 = sibling(button_17, 2);
@@ -57183,8 +57184,16 @@ function TopBar($$anchor, $$props) {
57183
57184
  var button_21 = sibling(button_20, 2);
57184
57185
  var button_22 = sibling(button_21, 2);
57185
57186
  var button_23 = sibling(button_22, 2);
57186
- var button_24 = sibling(button_23, 4);
57187
- var button_25 = sibling(button_24, 2);
57187
+ var node_6 = sibling(button_23, 4);
57188
+ var consequent_3 = ($$anchor) => {
57189
+ var button_24 = root_8$3();
57190
+ delegated("click", button_24, onImportJSON);
57191
+ append($$anchor, button_24);
57192
+ };
57193
+ if_block(node_6, ($$render) => {
57194
+ if (!$$props.viewOnly) $$render(consequent_3);
57195
+ });
57196
+ var button_25 = sibling(node_6, 2);
57188
57197
  reset(div_5);
57189
57198
  delegated("click", button_16, () => {
57190
57199
  set(exportOpen, false);
@@ -57200,29 +57209,28 @@ function TopBar($$anchor, $$props) {
57200
57209
  delegated("click", button_21, onExportDWG);
57201
57210
  delegated("click", button_22, onExportPDF);
57202
57211
  delegated("click", button_23, onExportJSON);
57203
- delegated("click", button_24, onImportJSON);
57204
57212
  delegated("click", button_25, newProject);
57205
57213
  append($$anchor, div_5);
57206
57214
  };
57207
57215
  if_block(node_5, ($$render) => {
57208
- if (get(exportOpen)) $$render(consequent_3);
57216
+ if (get(exportOpen)) $$render(consequent_4);
57209
57217
  });
57210
57218
  reset(div_4);
57211
57219
  bind_this(div_4, ($$value) => exportRef = $$value, () => exportRef);
57212
57220
  var span_1 = sibling(div_4, 2);
57213
- var node_6 = child(span_1);
57214
- var consequent_4 = ($$anchor) => {
57221
+ var node_7 = child(span_1);
57222
+ var consequent_5 = ($$anchor) => {
57215
57223
  append($$anchor, text$1("Saving…"));
57216
57224
  };
57217
- var consequent_5 = ($$anchor) => {
57225
+ var consequent_6 = ($$anchor) => {
57218
57226
  append($$anchor, text$1("Saved ✓"));
57219
57227
  };
57220
57228
  var alternate_1 = ($$anchor) => {
57221
57229
  append($$anchor, text$1("Unsaved •"));
57222
57230
  };
57223
- if_block(node_6, ($$render) => {
57224
- if ($saveState() === "saving") $$render(consequent_4);
57225
- else if ($saveState() === "saved") $$render(consequent_5, 1);
57231
+ if_block(node_7, ($$render) => {
57232
+ if ($saveState() === "saving") $$render(consequent_5);
57233
+ else if ($saveState() === "saved") $$render(consequent_6, 1);
57226
57234
  else $$render(alternate_1, -1);
57227
57235
  });
57228
57236
  reset(span_1);
@@ -57264,15 +57272,15 @@ function TopBar($$anchor, $$props) {
57264
57272
  append($$anchor, div);
57265
57273
  };
57266
57274
  var alternate_2 = ($$anchor) => {
57267
- var div_6 = root_11$2();
57275
+ var div_6 = root_12$2();
57268
57276
  var span_2 = child(div_6);
57269
57277
  var text_8 = child(span_2, true);
57270
57278
  reset(span_2);
57271
57279
  var div_7 = sibling(span_2, 2);
57272
57280
  var button_27 = child(div_7);
57273
- var node_7 = sibling(button_27, 2);
57274
- var consequent_7 = ($$anchor) => {
57275
- var div_8 = root_12$2();
57281
+ var node_8 = sibling(button_27, 2);
57282
+ var consequent_8 = ($$anchor) => {
57283
+ var div_8 = root_13$2();
57276
57284
  var button_28 = child(div_8);
57277
57285
  var button_29 = sibling(button_28, 4);
57278
57286
  var button_30 = sibling(button_29, 2);
@@ -57300,8 +57308,8 @@ function TopBar($$anchor, $$props) {
57300
57308
  delegated("click", button_36, onImportJSON);
57301
57309
  append($$anchor, div_8);
57302
57310
  };
57303
- if_block(node_7, ($$render) => {
57304
- if (get(exportOpen)) $$render(consequent_7);
57311
+ if_block(node_8, ($$render) => {
57312
+ if (get(exportOpen)) $$render(consequent_8);
57305
57313
  });
57306
57314
  reset(div_7);
57307
57315
  bind_this(div_7, ($$value) => exportRef = $$value, () => exportRef);
@@ -57314,11 +57322,11 @@ function TopBar($$anchor, $$props) {
57314
57322
  append($$anchor, div_6);
57315
57323
  };
57316
57324
  if_block(node, ($$render) => {
57317
- if (!$$props.viewOnly) $$render(consequent_6);
57325
+ if (!$$props.viewOnly) $$render(consequent_7);
57318
57326
  else $$render(alternate_2, -1);
57319
57327
  });
57320
- var node_8 = sibling(node, 2);
57321
- SettingsDialog(node_8, {
57328
+ var node_9 = sibling(node, 2);
57329
+ SettingsDialog(node_9, {
57322
57330
  get open() {
57323
57331
  return get(settingsOpen);
57324
57332
  },
@@ -57326,8 +57334,8 @@ function TopBar($$anchor, $$props) {
57326
57334
  set(settingsOpen, $$value, true);
57327
57335
  }
57328
57336
  });
57329
- var node_9 = sibling(node_8, 2);
57330
- VersionHistoryPanel(node_9, {
57337
+ var node_10 = sibling(node_9, 2);
57338
+ VersionHistoryPanel(node_10, {
57331
57339
  get open() {
57332
57340
  return get(versionHistoryOpen);
57333
57341
  },
@@ -57335,9 +57343,9 @@ function TopBar($$anchor, $$props) {
57335
57343
  set(versionHistoryOpen, $$value, true);
57336
57344
  }
57337
57345
  });
57338
- var node_10 = sibling(node_9, 2);
57339
- var consequent_8 = ($$anchor) => {
57340
- var div_9 = root_13$1();
57346
+ var node_11 = sibling(node_10, 2);
57347
+ var consequent_9 = ($$anchor) => {
57348
+ var div_9 = root_14$1();
57341
57349
  var div_10 = child(div_9);
57342
57350
  var div_11 = child(div_10);
57343
57351
  var button_37 = sibling(child(div_11), 2);
@@ -57355,8 +57363,8 @@ function TopBar($$anchor, $$props) {
57355
57363
  delegated("click", button_37, () => set(areaOpen, false));
57356
57364
  append($$anchor, div_9);
57357
57365
  };
57358
- if_block(node_10, ($$render) => {
57359
- if (get(areaOpen)) $$render(consequent_8);
57366
+ if_block(node_11, ($$render) => {
57367
+ if (get(areaOpen)) $$render(consequent_9);
57360
57368
  });
57361
57369
  append($$anchor, fragment);
57362
57370
  pop();
@@ -57899,8 +57907,8 @@ function placeRoomTemplate(preset, origin, template, w = 400, h = 300) {
57899
57907
  //#region src/lib/components/editor/UndoHistoryPanel.svelte
57900
57908
  init_client();
57901
57909
  var root_2$8 = /* @__PURE__ */ from_html(`<div class="px-3 py-6 text-center text-xs text-gray-400">No history yet</div>`);
57902
- var root_4$7 = /* @__PURE__ */ from_html(`<button><span class="w-5 text-[10px] text-gray-400 text-right shrink-0"></span> <span class="truncate flex-1"> </span> <span class="text-[10px] text-gray-300 shrink-0"> </span></button>`);
57903
- var root_3$8 = /* @__PURE__ */ from_html(`<div class="py-1"><!> <div><span class="w-5 text-[10px] text-gray-400 text-right shrink-0">●</span> <span class="truncate flex-1 font-medium">Current state</span></div></div>`);
57910
+ var root_4$8 = /* @__PURE__ */ from_html(`<button><span class="w-5 text-[10px] text-gray-400 text-right shrink-0"></span> <span class="truncate flex-1"> </span> <span class="text-[10px] text-gray-300 shrink-0"> </span></button>`);
57911
+ var root_3$7 = /* @__PURE__ */ from_html(`<div class="py-1"><!> <div><span class="w-5 text-[10px] text-gray-400 text-right shrink-0">●</span> <span class="truncate flex-1 font-medium">Current state</span></div></div>`);
57904
57912
  var root_1$10 = /* @__PURE__ */ from_html(`<div class="fixed bottom-12 left-4 w-64 max-h-80 bg-white rounded-xl shadow-2xl border border-gray-200 z-50 flex flex-col overflow-hidden"><div class="flex items-center justify-between px-3 py-2 border-b border-gray-100 bg-gray-50"><div class="flex items-center gap-1.5"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" class="text-slate-500"><polyline points="1 4 1 10 7 10"></polyline><path d="M3.51 15a9 9 0 1 0 2.13-9.36L1 10"></path></svg> <span class="text-xs font-semibold text-slate-700">Undo History</span></div> <div class="flex items-center gap-2"><span class="text-[10px] text-slate-400"> </span> <button class="text-gray-400 hover:text-gray-600 text-sm leading-none" aria-label="Close history">✕</button></div></div> <div class="flex-1 overflow-y-auto"><!></div></div>`);
57905
57913
  function UndoHistoryPanel($$anchor, $$props) {
57906
57914
  push($$props, true);
@@ -57940,10 +57948,10 @@ function UndoHistoryPanel($$anchor, $$props) {
57940
57948
  append($$anchor, root_2$8());
57941
57949
  };
57942
57950
  var alternate = ($$anchor) => {
57943
- var div_5 = root_3$8();
57951
+ var div_5 = root_3$7();
57944
57952
  var node_2 = child(div_5);
57945
57953
  each(node_2, 17, () => get(history).entries, index$1, ($$anchor, entry, i) => {
57946
- var button_1 = root_4$7();
57954
+ var button_1 = root_4$8();
57947
57955
  let classes;
57948
57956
  var span_1 = child(button_1);
57949
57957
  span_1.textContent = i + 1;
@@ -58001,19 +58009,19 @@ delegate(["click"]);
58001
58009
  //#region src/lib/components/sidebar/BuildPanel.svelte
58002
58010
  init_client();
58003
58011
  init_index_client();
58004
- var root_3$7 = /* @__PURE__ */ from_html(`<button draggable="true"><div class="w-9 h-9 rounded-lg bg-amber-50 flex items-center justify-center"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="#92400e" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path></path></svg></div> <span class="text-xs font-medium text-gray-600"> </span> <span class="text-[10px] text-gray-400"> </span></button>`);
58005
- var root_4$6 = /* @__PURE__ */ from_html(`<button draggable="true"><div class="w-9 h-9 rounded-lg bg-cyan-50 flex items-center justify-center"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="#0e7490" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="18" height="16" rx="1"></rect><line x1="12" y1="4" x2="12" y2="20"></line><line x1="3" y1="12" x2="21" y2="12"></line></svg></div> <span class="text-xs font-medium text-gray-600"> </span> <span class="text-[10px] text-gray-400"> </span></button>`);
58012
+ var root_3$6 = /* @__PURE__ */ from_html(`<button draggable="true"><div class="w-9 h-9 rounded-lg bg-amber-50 flex items-center justify-center"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="#92400e" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path></path></svg></div> <span class="text-xs font-medium text-gray-600"> </span> <span class="text-[10px] text-gray-400"> </span></button>`);
58013
+ var root_4$7 = /* @__PURE__ */ from_html(`<button draggable="true"><div class="w-9 h-9 rounded-lg bg-cyan-50 flex items-center justify-center"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="#0e7490" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="18" height="16" rx="1"></rect><line x1="12" y1="4" x2="12" y2="20"></line><line x1="3" y1="12" x2="21" y2="12"></line></svg></div> <span class="text-xs font-medium text-gray-600"> </span> <span class="text-[10px] text-gray-400"> </span></button>`);
58006
58014
  var root_2$7 = /* @__PURE__ */ from_html(`<div class="grid grid-cols-2 gap-2 mb-3"></div> <h3 class="text-xs font-semibold text-gray-400 uppercase mb-2">Windows</h3> <div class="grid grid-cols-2 gap-2"></div>`, 1);
58007
58015
  var root_1$9 = /* @__PURE__ */ from_html(`<div class="space-y-1"><h3 class="text-xs font-semibold text-gray-400 uppercase mb-2">Tools</h3> <button><div><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 3l7.07 16.97 2.51-7.39 7.39-2.51L3 3z"></path><path d="M13 13l6 6"></path></svg></div> <div class="text-left"><div class="font-medium">Select <span class="text-gray-400 text-xs ml-1">V</span></div> <div class="text-xs text-gray-400">Click to select elements</div></div></button> <button><div><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="8" width="18" height="8" rx="1"></rect><line x1="7" y1="8" x2="7" y2="16"></line><line x1="12" y1="8" x2="12" y2="16"></line><line x1="17" y1="8" x2="17" y2="16"></line></svg></div> <div class="text-left"><div class="font-medium">Draw Wall <span class="text-gray-400 text-xs ml-1">W</span></div> <div class="text-xs text-gray-400">Click to draw, dbl-click to finish</div></div></button> <h3 class="text-xs font-semibold text-gray-400 uppercase mb-2 mt-3">Structure</h3> <button><div><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 5h-5V2h-3v6h-4V5H7v6H2v3h5v3h3v-3h4v3h3v-6h5z"></path></svg></div> <div class="text-left"><div class="font-medium">Add Stairs</div> <div class="text-xs text-gray-400">Click to place stairs</div></div></button> <div class="flex gap-2"><button><div><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="6"></circle><line x1="6" y1="6" x2="18" y2="18"></line><line x1="18" y1="6" x2="6" y2="18"></line></svg></div> <div class="text-left"><div class="font-medium text-xs">Round Column</div></div></button> <button><div><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="6" y="6" width="12" height="12"></rect><line x1="6" y1="6" x2="18" y2="18"></line><line x1="18" y1="6" x2="6" y2="18"></line></svg></div> <div class="text-left"><div class="font-medium text-xs">Square Column</div></div></button></div> <h3 class="text-xs font-semibold text-gray-400 uppercase mb-2 mt-3">Annotate</h3> <button><div><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 7V4h16v3"></path><line x1="12" y1="4" x2="12" y2="20"></line><line x1="8" y1="20" x2="16" y2="20"></line></svg></div> <div class="text-left"><div class="font-medium">Text Label</div> <div class="text-xs text-gray-400">Add text annotations (T)</div></div></button> <button><div><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"></path><line x1="16" y1="5" x2="22" y2="5"></line><line x1="19" y1="2" x2="19" y2="8"></line><line x1="3" y1="12" x2="12" y2="12"></line></svg></div> <div class="text-left"><div class="font-medium">Dimension</div> <div class="text-xs text-gray-400">Add dimension annotations (N)</div></div></button> <button><div><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2 12h5l2-7 4 14 2-7h7"></path></svg></div> <div class="text-left"><div class="font-medium">Measure</div> <div class="text-xs text-gray-400">Measure distances (M)</div></div></button> <h3 class="text-xs font-semibold text-gray-400 uppercase mb-2 mt-3">Import</h3> <button class="w-full flex items-center gap-3 px-3 py-2.5 rounded-lg text-sm transition-colors hover:bg-gray-50 text-gray-700"><div class="w-9 h-9 rounded-lg bg-gray-100 flex items-center justify-center"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><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="text-left"><div class="font-medium">Import Image</div> <div class="text-xs text-gray-400">Floor plan background</div></div></button> <button class="w-full flex items-center gap-3 px-3 py-2.5 rounded-lg text-sm transition-colors hover:bg-gray-50 text-gray-700"><div class="w-9 h-9 rounded-lg bg-gray-100 flex items-center justify-center"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path><polyline points="9 22 9 12 15 12 15 22"></polyline></svg></div> <div class="text-left"><div class="font-medium">Import RoomPlan</div> <div class="text-xs text-gray-400">iOS LiDAR scan (.json/.zip)</div></div></button> <button class="w-full flex items-center justify-between px-1 py-2 mt-3"><h3 class="text-xs font-semibold text-gray-400 uppercase">Doors</h3> <span class="text-gray-400 text-xs"> </span></button> <!></div>`);
58008
- var root_6$4 = /* @__PURE__ */ from_html(`<button class="flex flex-col items-center gap-1.5 p-3 rounded-lg border-2 border-gray-100 hover:border-blue-300 hover:bg-blue-50 transition-colors cursor-grab active:cursor-grabbing" draggable="true"><div class="w-12 h-12 rounded-lg bg-gray-50 flex items-center justify-center text-2xl font-mono"> </div> <span class="text-xs font-medium text-gray-600"> </span></button>`);
58009
- var root_7$3 = /* @__PURE__ */ from_html(`<button class="flex flex-col items-center gap-1.5 p-3 rounded-lg border-2 border-gray-100 hover:border-green-300 hover:bg-green-50 transition-colors cursor-grab active:cursor-grabbing" draggable="true"><div class="w-12 h-12 rounded-lg bg-green-50 flex items-center justify-center text-lg"><!></div> <span class="text-xs font-medium text-gray-600"> </span> <span class="text-[10px] text-gray-400"> </span></button>`);
58010
- var root_5$5 = /* @__PURE__ */ from_html(`<div class="space-y-2"><h3 class="text-xs font-semibold text-gray-400 uppercase mb-2">Room Presets</h3> <p class="text-xs text-gray-400 mb-3">Click to add a room shape to the canvas</p> <div class="grid grid-cols-2 gap-2"></div> <hr class="my-3 border-gray-200"/> <h3 class="text-xs font-semibold text-gray-400 uppercase mb-2">Room Templates</h3> <p class="text-xs text-gray-400 mb-3">Pre-furnished rooms — walls + furniture in one click</p> <div class="grid grid-cols-2 gap-2"></div></div>`);
58016
+ var root_6$3 = /* @__PURE__ */ from_html(`<button class="flex flex-col items-center gap-1.5 p-3 rounded-lg border-2 border-gray-100 hover:border-blue-300 hover:bg-blue-50 transition-colors cursor-grab active:cursor-grabbing" draggable="true"><div class="w-12 h-12 rounded-lg bg-gray-50 flex items-center justify-center text-2xl font-mono"> </div> <span class="text-xs font-medium text-gray-600"> </span></button>`);
58017
+ var root_7$4 = /* @__PURE__ */ from_html(`<button class="flex flex-col items-center gap-1.5 p-3 rounded-lg border-2 border-gray-100 hover:border-green-300 hover:bg-green-50 transition-colors cursor-grab active:cursor-grabbing" draggable="true"><div class="w-12 h-12 rounded-lg bg-green-50 flex items-center justify-center text-lg"><!></div> <span class="text-xs font-medium text-gray-600"> </span> <span class="text-[10px] text-gray-400"> </span></button>`);
58018
+ var root_5$4 = /* @__PURE__ */ from_html(`<div class="space-y-2"><h3 class="text-xs font-semibold text-gray-400 uppercase mb-2">Room Presets</h3> <p class="text-xs text-gray-400 mb-3">Click to add a room shape to the canvas</p> <div class="grid grid-cols-2 gap-2"></div> <hr class="my-3 border-gray-200"/> <h3 class="text-xs font-semibold text-gray-400 uppercase mb-2">Room Templates</h3> <p class="text-xs text-gray-400 mb-3">Pre-furnished rooms — walls + furniture in one click</p> <div class="grid grid-cols-2 gap-2"></div></div>`);
58011
58019
  var root_16$1 = /* @__PURE__ */ from_html(`<button class="absolute right-2 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600 w-5 h-5 flex items-center justify-center rounded-full hover:bg-gray-100" title="Clear search"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg></button>`);
58012
58020
  var root_17$2 = /* @__PURE__ */ from_html(`<div class="text-[10px] text-gray-400 px-1"> </div>`);
58013
58021
  var root_18$2 = /* @__PURE__ */ from_html(`<button> </button>`);
58014
58022
  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>`);
58015
58023
  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);
58016
- 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>`);
58024
+ 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>`);
58017
58025
  var root_23$1 = /* @__PURE__ */ from_html(`<span class="text-xs font-medium text-gray-600"> </span>`);
58018
58026
  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>`);
58019
58027
  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>`);
@@ -58386,7 +58394,7 @@ function BuildPanel($$anchor, $$props) {
58386
58394
  var fragment_1 = root_2$7();
58387
58395
  var div_13 = first_child(fragment_1);
58388
58396
  each(div_13, 21, () => doorCatalog, index$1, ($$anchor, dc) => {
58389
- var button_14 = root_3$7();
58397
+ var button_14 = root_3$6();
58390
58398
  var div_14 = child(button_14);
58391
58399
  var svg = child(div_14);
58392
58400
  var path = child(svg);
@@ -58416,7 +58424,7 @@ function BuildPanel($$anchor, $$props) {
58416
58424
  reset(div_13);
58417
58425
  var div_15 = sibling(div_13, 4);
58418
58426
  each(div_15, 21, () => windowCatalog, index$1, ($$anchor, wc) => {
58419
- var button_15 = root_4$6();
58427
+ var button_15 = root_4$7();
58420
58428
  var span_3 = sibling(child(button_15), 2);
58421
58429
  var text_4 = child(span_3, true);
58422
58430
  reset(span_3);
@@ -58477,10 +58485,10 @@ function BuildPanel($$anchor, $$props) {
58477
58485
  append($$anchor, div_3);
58478
58486
  };
58479
58487
  var consequent_8 = ($$anchor) => {
58480
- var div_16 = root_5$5();
58488
+ var div_16 = root_5$4();
58481
58489
  var div_17 = sibling(child(div_16), 4);
58482
58490
  each(div_17, 21, () => roomPresets, index$1, ($$anchor, preset) => {
58483
- var button_16 = root_6$4();
58491
+ var button_16 = root_6$3();
58484
58492
  var div_18 = child(button_16);
58485
58493
  var text_6 = child(div_18, true);
58486
58494
  reset(div_18);
@@ -58503,7 +58511,7 @@ function BuildPanel($$anchor, $$props) {
58503
58511
  reset(div_17);
58504
58512
  var div_19 = sibling(div_17, 8);
58505
58513
  each(div_19, 21, () => roomTemplates, index$1, ($$anchor, tmpl) => {
58506
- var button_17 = root_7$3();
58514
+ var button_17 = root_7$4();
58507
58515
  var div_20 = child(button_17);
58508
58516
  var node_2 = child(div_20);
58509
58517
  var consequent_2 = ($$anchor) => {
@@ -58683,7 +58691,7 @@ function BuildPanel($$anchor, $$props) {
58683
58691
  var node_7 = sibling(div_30, 2);
58684
58692
  var consequent_12 = ($$anchor) => {
58685
58693
  const idx = /* @__PURE__ */ user_derived(() => get(item).name.toLowerCase().indexOf(get(s)));
58686
- var span_11 = root_22$1();
58694
+ var span_11 = root_22$2();
58687
58695
  var text_23 = child(span_11, true);
58688
58696
  var mark = sibling(text_23);
58689
58697
  var text_24 = child(mark, true);
@@ -59142,19 +59150,19 @@ var images = {
59142
59150
  //#endregion
59143
59151
  //#region src/lib/components/sidebar/PropertiesPanel.svelte
59144
59152
  init_client();
59145
- var root_3$6 = /* @__PURE__ */ from_html(`<button></button>`);
59146
- var root_4$5 = /* @__PURE__ */ from_html(`<button><span class="bg-white/80 backdrop-blur-sm rounded px-1 py-0.5 mb-0.5 text-gray-700"> </span></button>`);
59153
+ var root_3$5 = /* @__PURE__ */ from_html(`<button></button>`);
59154
+ var root_4$6 = /* @__PURE__ */ from_html(`<button><span class="bg-white/80 backdrop-blur-sm rounded px-1 py-0.5 mb-0.5 text-gray-700"> </span></button>`);
59147
59155
  var root_2$6 = /* @__PURE__ */ from_html(`<div class="space-y-2"><span class="text-xs text-gray-500">Color</span> <div class="grid grid-cols-6 gap-1.5"></div> <label 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"/></label> <span class="text-xs text-gray-500">Texture</span> <div class="grid grid-cols-3 gap-1.5"><button>None</button> <!></div></div>`);
59148
- var root_6$3 = /* @__PURE__ */ from_html(`<button></button>`);
59149
- var root_7$2 = /* @__PURE__ */ from_html(`<button><span class="bg-white/80 backdrop-blur-sm rounded px-1 py-0.5 mb-0.5 text-gray-700"> </span></button>`);
59150
- var root_5$4 = /* @__PURE__ */ from_html(`<div class="space-y-2"><span class="text-xs text-gray-500">Color</span> <div class="grid grid-cols-6 gap-1.5"></div> <label 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"/></label> <span class="text-xs text-gray-500">Texture</span> <div class="grid grid-cols-3 gap-1.5"><button>None</button> <!></div></div>`);
59156
+ var root_6$2 = /* @__PURE__ */ from_html(`<button></button>`);
59157
+ var root_7$3 = /* @__PURE__ */ from_html(`<button><span class="bg-white/80 backdrop-blur-sm rounded px-1 py-0.5 mb-0.5 text-gray-700"> </span></button>`);
59158
+ var root_5$3 = /* @__PURE__ */ from_html(`<div class="space-y-2"><span class="text-xs text-gray-500">Color</span> <div class="grid grid-cols-6 gap-1.5"></div> <label 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"/></label> <span class="text-xs text-gray-500">Texture</span> <div class="grid grid-cols-3 gap-1.5"><button>None</button> <!></div></div>`);
59151
59159
  var root_1$8 = /* @__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> Wall Properties</h3> <div class="space-y-3"><label class="block"><span class="text-xs text-gray-500"> </span> <input type="number" disabled="" class="w-full px-2 py-1 border border-gray-200 rounded text-sm bg-gray-50"/></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> <div class="flex items-center gap-2"><span class="text-xs text-gray-500">Curved</span> <button> </button></div> <div><div class="flex border-b border-gray-200 mb-3"><button>Interior</button> <button>Exterior</button></div> <!></div></div>`, 1);
59152
- var root_8$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-amber-100 rounded flex items-center justify-center text-xs">🚪</span> Door Properties</h3> <div class="space-y-3"><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" 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"> </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">Type</span> <select class="w-full px-2 py-1 border border-gray-200 rounded text-sm"><option>Single</option><option>Double</option><option>Sliding</option><option>French</option><option>Pocket</option><option>Bifold</option></select></label> <label class="block"><span class="text-xs text-gray-500">Hinge Side</span> <div class="flex gap-2"><button>Left</button> <button>Right</button></div></label> <label class="block"><span class="text-xs text-gray-500">Opens</span> <div class="flex gap-2"><button>Inward</button> <button>Outward</button></div></label></div>`, 1);
59160
+ var root_8$2 = /* @__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-amber-100 rounded flex items-center justify-center text-xs">🚪</span> Door Properties</h3> <div class="space-y-3"><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" 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"> </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">Type</span> <select class="w-full px-2 py-1 border border-gray-200 rounded text-sm"><option>Single</option><option>Double</option><option>Sliding</option><option>French</option><option>Pocket</option><option>Bifold</option></select></label> <label class="block"><span class="text-xs text-gray-500">Hinge Side</span> <div class="flex gap-2"><button>Left</button> <button>Right</button></div></label> <label class="block"><span class="text-xs text-gray-500">Opens</span> <div class="flex gap-2"><button>Inward</button> <button>Outward</button></div></label></div>`, 1);
59153
59161
  var root_9$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-cyan-100 rounded flex items-center justify-center text-xs">🪟</span> Window 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>Standard</option><option>Fixed</option><option>Casement</option><option>Sliding</option><option>Bay</option></select></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" 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"> </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></div>`, 1);
59154
59162
  var root_11$1 = /* @__PURE__ */ from_html(`<button></button>`);
59155
59163
  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);
59156
- var root_13 = /* @__PURE__ */ from_html(`<option> </option>`);
59157
- var root_14$1 = /* @__PURE__ */ from_html(`<button></button>`);
59164
+ var root_13$1 = /* @__PURE__ */ from_html(`<option> </option>`);
59165
+ var root_14 = /* @__PURE__ */ from_html(`<button></button>`);
59158
59166
  var root_17$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>`);
59159
59167
  var root_15$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>`);
59160
59168
  var root_12$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);
@@ -59162,7 +59170,7 @@ var root_18$1 = /* @__PURE__ */ from_html(`<h3 class="text-sm font-semibold text
59162
59170
  var root_20$1 = /* @__PURE__ */ from_html(`<button></button>`);
59163
59171
  var root_21$1 = /* @__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>`);
59164
59172
  var root_19$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);
59165
- var root_22 = /* @__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>`);
59173
+ var root_22$1 = /* @__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>`);
59166
59174
  var root_23 = /* @__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>`);
59167
59175
  var root$2 = /* @__PURE__ */ from_html(`<div style="top: 48px; bottom: 36px;"><!> <!></div>`);
59168
59176
  function PropertiesPanel($$anchor, $$props) {
@@ -59638,7 +59646,7 @@ function PropertiesPanel($$anchor, $$props) {
59638
59646
  var div_5 = root_2$6();
59639
59647
  var div_6 = sibling(child(div_5), 2);
59640
59648
  each(div_6, 21, () => wallColors, index$1, ($$anchor, wc) => {
59641
- var button_3 = root_3$6();
59649
+ var button_3 = root_3$5();
59642
59650
  template_effect(() => {
59643
59651
  var _$$get$color;
59644
59652
  set_class(button_3, 1, `w-7 h-7 rounded-md border-2 hover:border-gray-300 transition-colors ${get(sideColor) === get(wc).color ? "border-blue-500 ring-1 ring-blue-200" : "border-gray-200"}`);
@@ -59669,7 +59677,7 @@ function PropertiesPanel($$anchor, $$props) {
59669
59677
  "subway-tile": images.subwayTile
59670
59678
  }[get(wc).id]) !== null && _redBrick$exposedBr !== void 0 ? _redBrick$exposedBr : "";
59671
59679
  });
59672
- var button_5 = root_4$5();
59680
+ var button_5 = root_4$6();
59673
59681
  var span_3 = child(button_5);
59674
59682
  var text_4 = child(span_3, true);
59675
59683
  reset(span_3);
@@ -59704,10 +59712,10 @@ function PropertiesPanel($$anchor, $$props) {
59704
59712
  var alternate = ($$anchor) => {
59705
59713
  const sideColor = /* @__PURE__ */ user_derived(() => get(selectedWall).exteriorColor || get(selectedWall).color);
59706
59714
  const sideTex = /* @__PURE__ */ user_derived(() => get(selectedWall).exteriorTexture === "none" ? void 0 : get(selectedWall).exteriorTexture || get(selectedWall).texture);
59707
- var div_8 = root_5$4();
59715
+ var div_8 = root_5$3();
59708
59716
  var div_9 = sibling(child(div_8), 2);
59709
59717
  each(div_9, 21, () => wallColors, index$1, ($$anchor, wc) => {
59710
- var button_6 = root_6$3();
59718
+ var button_6 = root_6$2();
59711
59719
  template_effect(() => {
59712
59720
  var _$$get$color2;
59713
59721
  set_class(button_6, 1, `w-7 h-7 rounded-md border-2 hover:border-gray-300 transition-colors ${get(sideColor) === get(wc).color ? "border-blue-500 ring-1 ring-blue-200" : "border-gray-200"}`);
@@ -59738,7 +59746,7 @@ function PropertiesPanel($$anchor, $$props) {
59738
59746
  "subway-tile": images.subwayTile
59739
59747
  }[get(wc).id]) !== null && _redBrick$exposedBr2 !== void 0 ? _redBrick$exposedBr2 : "";
59740
59748
  });
59741
- var button_8 = root_7$2();
59749
+ var button_8 = root_7$3();
59742
59750
  var span_4 = child(button_8);
59743
59751
  var text_5 = child(span_4, true);
59744
59752
  reset(span_4);
@@ -59816,7 +59824,7 @@ function PropertiesPanel($$anchor, $$props) {
59816
59824
  append($$anchor, fragment);
59817
59825
  };
59818
59826
  var consequent_2 = ($$anchor) => {
59819
- var fragment_1 = root_8$1();
59827
+ var fragment_1 = root_8$2();
59820
59828
  var div_11 = sibling(first_child(fragment_1), 2);
59821
59829
  var label_5 = child(div_11);
59822
59830
  var span_5 = child(label_5);
@@ -60212,7 +60220,7 @@ function PropertiesPanel($$anchor, $$props) {
60212
60220
  var label_23 = child(div_21);
60213
60221
  var select_3 = sibling(child(label_23), 2);
60214
60222
  each(select_3, 21, () => roomTypes, index$1, ($$anchor, rt) => {
60215
- var option_19 = root_13();
60223
+ var option_19 = root_13$1();
60216
60224
  var text_21 = child(option_19);
60217
60225
  reset(option_19);
60218
60226
  var option_19_value = {};
@@ -60256,7 +60264,7 @@ function PropertiesPanel($$anchor, $$props) {
60256
60264
  var div_23 = sibling(div_22, 2);
60257
60265
  var div_24 = sibling(child(div_23), 2);
60258
60266
  each(div_24, 21, () => roomColorPresets, index$1, ($$anchor, preset) => {
60259
- var button_20 = root_14$1();
60267
+ var button_20 = root_14();
60260
60268
  template_effect(() => {
60261
60269
  var _$$get$color5;
60262
60270
  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"}`);
@@ -60495,7 +60503,7 @@ function PropertiesPanel($$anchor, $$props) {
60495
60503
  append($$anchor, fragment_7);
60496
60504
  };
60497
60505
  var consequent_10 = ($$anchor) => {
60498
- var div_39 = root_22();
60506
+ var div_39 = root_22$1();
60499
60507
  var label_36 = sibling(child(div_39), 2);
60500
60508
  var input_29 = sibling(child(label_36), 2);
60501
60509
  remove_input_defaults(input_29);
@@ -60614,11 +60622,11 @@ delegate([
60614
60622
  //#endregion
60615
60623
  //#region src/lib/components/sidebar/LayersPanel.svelte
60616
60624
  init_client();
60617
- var root_3$5 = /* @__PURE__ */ from_html(`<button><span class="text-[10px]"> </span> <span class="truncate flex-1"> </span></button>`);
60618
- var root_4$4 = /* @__PURE__ */ from_html(`<div class="pl-7 pr-2 py-1 text-gray-300 italic">Empty</div>`);
60625
+ var root_3$4 = /* @__PURE__ */ from_html(`<button><span class="text-[10px]"> </span> <span class="truncate flex-1"> </span></button>`);
60626
+ var root_4$5 = /* @__PURE__ */ from_html(`<div class="pl-7 pr-2 py-1 text-gray-300 italic">Empty</div>`);
60619
60627
  var root_2$5 = /* @__PURE__ */ from_html(`<!> <!>`, 1);
60620
60628
  var root_1$7 = /* @__PURE__ */ from_html(`<div class="border-b border-gray-50 relative"><button class="w-full flex items-center gap-1.5 px-2 py-1.5 hover:bg-gray-50 text-left"><span class="text-[10px] text-gray-400 w-3"> </span> <span> </span> <span class="font-medium text-gray-700 flex-1"> </span> <span class="text-gray-400 mr-1"> </span></button> <span role="button" tabindex="0">👁</span> <!></div>`);
60621
- var root_5$3 = /* @__PURE__ */ from_html(`<div class="p-4 text-gray-400 text-center">No elements</div>`);
60629
+ var root_5$2 = /* @__PURE__ */ from_html(`<div class="p-4 text-gray-400 text-center">No elements</div>`);
60622
60630
  var root$1 = /* @__PURE__ */ from_html(`<div class="w-56 bg-white border-l border-gray-200 flex flex-col overflow-hidden text-xs select-none"><div class="px-3 py-2 border-b border-gray-100 font-semibold text-gray-700 text-sm flex items-center gap-1.5">🗂 Layers</div> <div class="flex-1 overflow-y-auto"><!> <!></div></div>`);
60623
60631
  function LayersPanel($$anchor, $$props) {
60624
60632
  push($$props, true);
@@ -60790,7 +60798,7 @@ function LayersPanel($$anchor, $$props) {
60790
60798
  var fragment = root_2$5();
60791
60799
  var node_2 = first_child(fragment);
60792
60800
  each(node_2, 17, () => get(cat).items, index$1, ($$anchor, item) => {
60793
- var button_1 = root_3$5();
60801
+ var button_1 = root_3$4();
60794
60802
  let classes_1;
60795
60803
  var span_5 = child(button_1);
60796
60804
  var text_4 = child(span_5, true);
@@ -60813,7 +60821,7 @@ function LayersPanel($$anchor, $$props) {
60813
60821
  });
60814
60822
  var node_3 = sibling(node_2, 2);
60815
60823
  var consequent = ($$anchor) => {
60816
- append($$anchor, root_4$4());
60824
+ append($$anchor, root_4$5());
60817
60825
  };
60818
60826
  if_block(node_3, ($$render) => {
60819
60827
  if (get(cat).items.length === 0) $$render(consequent);
@@ -60847,7 +60855,7 @@ function LayersPanel($$anchor, $$props) {
60847
60855
  });
60848
60856
  var node_4 = sibling(node, 2);
60849
60857
  var consequent_2 = ($$anchor) => {
60850
- append($$anchor, root_5$3());
60858
+ append($$anchor, root_5$2());
60851
60859
  };
60852
60860
  if_block(node_4, ($$render) => {
60853
60861
  if (get(categories).length === 0) $$render(consequent_2);
@@ -61974,11 +61982,11 @@ function handleGlobalShortcut(e, ctx = {}) {
61974
61982
  init_client();
61975
61983
  init_index_client();
61976
61984
  var root_2$4 = /* @__PURE__ */ from_html(`<button class="ctx-item svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">📋</span> Duplicate</button> <button class="ctx-item svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">🔄</span> Rotate 90°</button> <button class="ctx-item svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">↔️</span> Flip Horizontal</button> <div class="ctx-sep svelte-wxo1tu"></div> <button class="ctx-item svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">⬆️</span> Bring to Front</button> <button class="ctx-item svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">⬇️</span> Send to Back</button> <div class="ctx-sep svelte-wxo1tu"></div> <div class="ctx-sep svelte-wxo1tu"></div> <button class="ctx-item svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu"> </span> </button> <button class="ctx-item svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">⚙️</span> Properties</button> <div class="ctx-sep svelte-wxo1tu"></div> <button class="ctx-item ctx-danger svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">🗑️</span> Delete</button>`, 1);
61977
- var root_3$4 = /* @__PURE__ */ from_html(`<button class="ctx-item svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">✂️</span> Split Wall</button> <button class="ctx-item svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">〰️</span> </button> <div class="ctx-sep svelte-wxo1tu"></div> <button class="ctx-item svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">⚙️</span> Properties</button> <div class="ctx-sep svelte-wxo1tu"></div> <button class="ctx-item ctx-danger svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">🗑️</span> Delete Wall</button>`, 1);
61978
- var root_4$3 = /* @__PURE__ */ from_html(`<button class="ctx-item svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">⚙️</span> Properties</button> <div class="ctx-sep svelte-wxo1tu"></div> <button class="ctx-item ctx-danger svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">🗑️</span> Delete</button>`, 1);
61979
- var root_5$2 = /* @__PURE__ */ from_html(`<button class="ctx-item svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">✏️</span> Rename Room</button> <button class="ctx-item svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">🎨</span> Change Floor Texture</button> <div class="ctx-sep svelte-wxo1tu"></div> <button class="ctx-item ctx-danger svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">🗑️</span> Delete Room</button>`, 1);
61980
- var root_7$1 = /* @__PURE__ */ from_html(`<button class="ctx-item svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">📋</span> Paste</button> <div class="ctx-sep svelte-wxo1tu"></div>`, 1);
61981
- var root_6$2 = /* @__PURE__ */ from_html(`<!> <button class="ctx-item svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">⬜</span> Select All</button> <button class="ctx-item svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">📦</span> Group Selected (Ctrl+G)</button> <button class="ctx-item svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">📤</span> Ungroup (Ctrl+Shift+G)</button> <button class="ctx-item svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">🧱</span> Add Wall</button> <div class="ctx-sep svelte-wxo1tu"></div> <button class="ctx-item svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">🔍</span> Zoom to Fit</button>`, 1);
61985
+ var root_3$3 = /* @__PURE__ */ from_html(`<button class="ctx-item svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">✂️</span> Split Wall</button> <button class="ctx-item svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">〰️</span> </button> <div class="ctx-sep svelte-wxo1tu"></div> <button class="ctx-item svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">⚙️</span> Properties</button> <div class="ctx-sep svelte-wxo1tu"></div> <button class="ctx-item ctx-danger svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">🗑️</span> Delete Wall</button>`, 1);
61986
+ var root_4$4 = /* @__PURE__ */ from_html(`<button class="ctx-item svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">⚙️</span> Properties</button> <div class="ctx-sep svelte-wxo1tu"></div> <button class="ctx-item ctx-danger svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">🗑️</span> Delete</button>`, 1);
61987
+ var root_5$1 = /* @__PURE__ */ from_html(`<button class="ctx-item svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">✏️</span> Rename Room</button> <button class="ctx-item svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">🎨</span> Change Floor Texture</button> <div class="ctx-sep svelte-wxo1tu"></div> <button class="ctx-item ctx-danger svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">🗑️</span> Delete Room</button>`, 1);
61988
+ var root_7$2 = /* @__PURE__ */ from_html(`<button class="ctx-item svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">📋</span> Paste</button> <div class="ctx-sep svelte-wxo1tu"></div>`, 1);
61989
+ var root_6$1 = /* @__PURE__ */ from_html(`<!> <button class="ctx-item svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">⬜</span> Select All</button> <button class="ctx-item svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">📦</span> Group Selected (Ctrl+G)</button> <button class="ctx-item svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">📤</span> Ungroup (Ctrl+Shift+G)</button> <button class="ctx-item svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">🧱</span> Add Wall</button> <div class="ctx-sep svelte-wxo1tu"></div> <button class="ctx-item svelte-wxo1tu" role="menuitem"><span class="ctx-icon svelte-wxo1tu">🔍</span> Zoom to Fit</button>`, 1);
61982
61990
  var root_1$6 = /* @__PURE__ */ from_html(`<div class="fixed z-[9999] bg-white border border-gray-200 rounded-lg shadow-xl py-1 min-w-[180px] text-sm select-none" role="menu"><!></div>`);
61983
61991
  function ContextMenu($$anchor, $$props) {
61984
61992
  push($$props, true);
@@ -62051,7 +62059,7 @@ function ContextMenu($$anchor, $$props) {
62051
62059
  append($$anchor, fragment_1);
62052
62060
  };
62053
62061
  var consequent_1 = ($$anchor) => {
62054
- var fragment_2 = root_3$4();
62062
+ var fragment_2 = root_3$3();
62055
62063
  var button_8 = first_child(fragment_2);
62056
62064
  var button_9 = sibling(button_8, 2);
62057
62065
  var text_2 = sibling(child(button_9));
@@ -62069,7 +62077,7 @@ function ContextMenu($$anchor, $$props) {
62069
62077
  append($$anchor, fragment_2);
62070
62078
  };
62071
62079
  var consequent_2 = ($$anchor) => {
62072
- var fragment_3 = root_4$3();
62080
+ var fragment_3 = root_4$4();
62073
62081
  var button_12 = first_child(fragment_3);
62074
62082
  var button_13 = sibling(button_12, 4);
62075
62083
  delegated("click", button_12, () => clickItem("properties"));
@@ -62077,7 +62085,7 @@ function ContextMenu($$anchor, $$props) {
62077
62085
  append($$anchor, fragment_3);
62078
62086
  };
62079
62087
  var consequent_3 = ($$anchor) => {
62080
- var fragment_4 = root_5$2();
62088
+ var fragment_4 = root_5$1();
62081
62089
  var button_14 = first_child(fragment_4);
62082
62090
  var button_15 = sibling(button_14, 2);
62083
62091
  var button_16 = sibling(button_15, 4);
@@ -62087,10 +62095,10 @@ function ContextMenu($$anchor, $$props) {
62087
62095
  append($$anchor, fragment_4);
62088
62096
  };
62089
62097
  var consequent_5 = ($$anchor) => {
62090
- var fragment_5 = root_6$2();
62098
+ var fragment_5 = root_6$1();
62091
62099
  var node_2 = first_child(fragment_5);
62092
62100
  var consequent_4 = ($$anchor) => {
62093
- var fragment_6 = root_7$1();
62101
+ var fragment_6 = root_7$2();
62094
62102
  var button_17 = first_child(fragment_6);
62095
62103
  next(2);
62096
62104
  delegated("click", button_17, () => clickItem("paste"));
@@ -64341,27 +64349,28 @@ function hitTestTextAnnotation(wp, floor, ctx, zoom) {
64341
64349
  //#region src/lib/components/editor/FloorPlanCanvas.svelte
64342
64350
  init_client();
64343
64351
  init_index_client();
64344
- var root_1$5 = /* @__PURE__ */ from_html(`<input type="text" class="absolute bg-white border-2 border-blue-500 rounded px-2 py-1 text-sm text-center shadow-lg outline-none"/>`);
64345
64352
  var root_2$3 = /* @__PURE__ */ from_html(`<input type="text" class="absolute bg-white border-2 border-blue-500 rounded px-2 py-1 text-sm text-center shadow-lg outline-none"/>`);
64346
- var root_3$3 = /* @__PURE__ */ from_html(`<div class="absolute inset-0 flex items-center justify-center pointer-events-none"><div class="text-center opacity-60"><div class="text-5xl mb-3">🏠</div> <div class="text-sm font-medium text-gray-500">Start building your floor plan</div> <div class="text-xs text-gray-400 mt-1">Draw walls with <span class="font-mono bg-gray-100 px-1 rounded">W</span> or drag items from the sidebar</div></div></div>`);
64347
- var root_4$2 = /* @__PURE__ */ from_html(`<canvas width="180" height="120" class="absolute bottom-10 right-2 rounded-lg shadow-lg border border-gray-300 cursor-crosshair bg-white" style="z-index: 15;"></canvas>`);
64348
- var root_5$1 = /* @__PURE__ */ from_html(`<span> </span> <span> </span> <span class="text-gray-300">|</span>`, 1);
64349
- var root_7 = /* @__PURE__ */ from_html(`<span> </span>`);
64350
- var root_8 = /* @__PURE__ */ from_html(`<span> </span>`);
64353
+ var root_3$2 = /* @__PURE__ */ from_html(`<input type="text" class="absolute bg-white border-2 border-blue-500 rounded px-2 py-1 text-sm text-center shadow-lg outline-none"/>`);
64354
+ var root_4$3 = /* @__PURE__ */ from_html(`<div class="absolute inset-0 flex items-center justify-center pointer-events-none"><div class="text-center opacity-60"><div class="text-5xl mb-3">🏠</div> <div class="text-sm font-medium text-gray-500">Start building your floor plan</div> <div class="text-xs text-gray-400 mt-1">Draw walls with <span class="font-mono bg-gray-100 px-1 rounded">W</span> or drag items from the sidebar</div></div></div>`);
64355
+ var root_5 = /* @__PURE__ */ from_html(`<canvas width="180" height="120" class="absolute bottom-10 right-2 rounded-lg shadow-lg border border-gray-300 cursor-crosshair bg-white" style="z-index: 15;"></canvas>`);
64356
+ var root_6 = /* @__PURE__ */ from_html(`<span> </span> <span> </span> <span class="text-gray-300">|</span>`, 1);
64357
+ var root_8$1 = /* @__PURE__ */ from_html(`<span> </span>`);
64351
64358
  var root_9 = /* @__PURE__ */ from_html(`<span> </span>`);
64352
- var root_6$1 = /* @__PURE__ */ from_html(`<span> </span> <!> <!> <!> <span class="text-gray-300">|</span>`, 1);
64353
- var root_10 = /* @__PURE__ */ from_html(`<span class="text-blue-600 font-medium"> </span> <span class="text-gray-300">|</span>`, 1);
64354
- var root_12 = /* @__PURE__ */ from_html(`<label class="flex items-center gap-2 py-0.5 cursor-pointer hover:bg-gray-50 rounded px-1"><input type="checkbox" class="accent-blue-500"/> <span> </span></label>`);
64355
- var root_11 = /* @__PURE__ */ from_html(`<div class="absolute bottom-12 right-2 z-20 bg-white rounded-lg shadow-lg border border-gray-200 p-3 text-xs min-w-[160px]"><div class="font-semibold text-gray-700 mb-2">Layers</div> <!> <hr class="my-1 border-gray-100"/> <label class="flex items-center gap-2 py-0.5 cursor-pointer hover:bg-gray-50 rounded px-1"><input type="checkbox" class="accent-blue-500"/> <span>Room Labels</span></label> <label class="flex items-center gap-2 py-0.5 cursor-pointer hover:bg-gray-50 rounded px-1"><input type="checkbox" class="accent-blue-500"/> <span>Dimensions</span></label></div>`);
64356
- var root_15 = /* @__PURE__ */ from_html(`<button class="w-7 h-7 flex items-center justify-center rounded hover:bg-gray-100 text-gray-500 hover:text-gray-700" title="Flip swing" aria-label="Flip swing"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M7 16V4m0 0L3 8m4-4l4 4M17 8v12m0 0l4-4m-4 4l-4-4"></path></svg></button>`);
64357
- var root_16 = /* @__PURE__ */ from_html(`<button class="w-7 h-7 flex items-center justify-center rounded hover:bg-gray-100 text-gray-500 hover:text-gray-700" title="Split wall at midpoint" aria-label="Split wall at midpoint"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 2v20M4 12h4M16 12h4"></path></svg></button>`);
64358
- var root_14 = /* @__PURE__ */ from_html(`<div class="absolute z-40 flex items-center gap-0.5 bg-white rounded-lg shadow-lg border border-gray-200 px-1 py-0.5"><button class="w-7 h-7 flex items-center justify-center rounded hover:bg-gray-100 text-gray-500 hover:text-gray-700" title="Duplicate" aria-label="Duplicate"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2"></rect><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"></path></svg></button> <!> <!> <div class="w-px h-5 bg-gray-200 mx-0.5"></div> <button class="w-7 h-7 flex items-center justify-center rounded hover:bg-red-50 text-gray-400 hover:text-red-600" title="Delete" aria-label="Delete"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M3 6h18M8 6V4a2 2 0 012-2h4a2 2 0 012 2v2m3 0v14a2 2 0 01-2 2H7a2 2 0 01-2-2V6h14"></path></svg></button></div>`);
64359
- var root_17 = /* @__PURE__ */ from_html(`<div class="absolute top-2 left-1/2 -translate-x-1/2 bg-blue-600 text-white px-3 py-1 rounded-full text-xs shadow">Click to add wall segment · Double-click to finish · C to close loop · Esc to cancel</div>`);
64360
- var root_18 = /* @__PURE__ */ from_html(`<div class="absolute top-2 left-1/2 -translate-x-1/2 bg-purple-600 text-white px-3 py-1 rounded-full text-xs shadow"> </div>`);
64361
- var root_19 = /* @__PURE__ */ from_html(`<div class="absolute top-2 left-1/2 -translate-x-1/2 bg-red-600 text-white px-3 py-1 rounded-full text-xs shadow">Right-click two points to measure · M to exit · Esc to cancel</div>`);
64362
- var root_20 = /* @__PURE__ */ from_html(`<div class="absolute top-2 left-1/2 -translate-x-1/2 bg-emerald-600 text-white px-3 py-1 rounded-full text-xs shadow">Click to place text label · Esc to cancel</div>`);
64363
- var root_21 = /* @__PURE__ */ from_html(`<div class="absolute top-2 left-1/2 -translate-x-1/2 bg-indigo-600 text-white px-3 py-1 rounded-full text-xs shadow"> </div>`);
64364
- var root = /* @__PURE__ */ from_html(`<div class="w-full h-full relative overflow-hidden" role="application"><canvas class="block w-full h-full" tabindex="0" aria-label="Floor plan editor canvas"></canvas> <!> <!> <!> <!> <div class="absolute bottom-2 right-2 bg-white/80 rounded px-2 py-1 text-xs text-gray-500 flex gap-3"><!> <!> <!> <span> </span> <button class="hover:text-gray-700" title="Zoom to Fit (F)">⊞ Fit</button> <button class="hover:text-gray-700" title="Toggle Grid (G)"> </button> <button class="hover:text-gray-700" title="Toggle Snap to Grid (S)"> </button> <button class="hover:text-gray-700" title="Toggle Furniture"> </button> <button class="hover:text-gray-700" title="Layer Visibility">🗂 Layers</button> <button class="hover:text-gray-700" title="Toggle Rulers"> </button> <button class="hover:text-gray-700" title="Toggle Mini-map"> </button></div> <!> <!> <!> <!> <!> <!> <!> <div class="absolute bottom-3 left-3 z-20 flex items-center gap-1 bg-white rounded-lg shadow-lg border border-gray-200 px-1 py-0.5"><button class="w-7 h-7 flex items-center justify-center rounded hover:bg-gray-100 text-gray-600 hover:text-gray-800 font-bold text-lg" title="Zoom Out (−)" aria-label="Zoom out">−</button> <button class="min-w-[3.5rem] h-7 flex items-center justify-center rounded hover:bg-gray-100 text-xs font-medium text-gray-600 hover:text-gray-800 tabular-nums" title="Reset to 100%" aria-label="Zoom to 100%"> </button> <button class="w-7 h-7 flex items-center justify-center rounded hover:bg-gray-100 text-gray-600 hover:text-gray-800 font-bold text-lg" title="Zoom In (+)" aria-label="Zoom in">+</button> <div class="w-px h-5 bg-gray-200"></div> <button class="w-7 h-7 flex items-center justify-center rounded hover:bg-gray-100 text-gray-500 hover:text-gray-700 text-sm" title="Zoom to Fit (F)" aria-label="Zoom to fit">⊞</button></div> <!></div>`);
64359
+ var root_10 = /* @__PURE__ */ from_html(`<span> </span>`);
64360
+ var root_7$1 = /* @__PURE__ */ from_html(`<span> </span> <!> <!> <!> <span class="text-gray-300">|</span>`, 1);
64361
+ var root_11 = /* @__PURE__ */ from_html(`<span class="text-blue-600 font-medium"> </span> <span class="text-gray-300">|</span>`, 1);
64362
+ var root_13 = /* @__PURE__ */ from_html(`<label class="flex items-center gap-2 py-0.5 cursor-pointer hover:bg-gray-50 rounded px-1"><input type="checkbox" class="accent-blue-500"/> <span> </span></label>`);
64363
+ var root_12 = /* @__PURE__ */ from_html(`<div class="absolute bottom-12 right-2 z-20 bg-white rounded-lg shadow-lg border border-gray-200 p-3 text-xs min-w-[160px]"><div class="font-semibold text-gray-700 mb-2">Layers</div> <!> <hr class="my-1 border-gray-100"/> <label class="flex items-center gap-2 py-0.5 cursor-pointer hover:bg-gray-50 rounded px-1"><input type="checkbox" class="accent-blue-500"/> <span>Room Labels</span></label> <label class="flex items-center gap-2 py-0.5 cursor-pointer hover:bg-gray-50 rounded px-1"><input type="checkbox" class="accent-blue-500"/> <span>Dimensions</span></label></div>`);
64364
+ var root_16 = /* @__PURE__ */ from_html(`<button class="w-7 h-7 flex items-center justify-center rounded hover:bg-gray-100 text-gray-500 hover:text-gray-700" title="Flip swing" aria-label="Flip swing"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M7 16V4m0 0L3 8m4-4l4 4M17 8v12m0 0l4-4m-4 4l-4-4"></path></svg></button>`);
64365
+ var root_17 = /* @__PURE__ */ from_html(`<button class="w-7 h-7 flex items-center justify-center rounded hover:bg-gray-100 text-gray-500 hover:text-gray-700" title="Split wall at midpoint" aria-label="Split wall at midpoint"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 2v20M4 12h4M16 12h4"></path></svg></button>`);
64366
+ var root_15 = /* @__PURE__ */ from_html(`<div class="absolute z-40 flex items-center gap-0.5 bg-white rounded-lg shadow-lg border border-gray-200 px-1 py-0.5"><button class="w-7 h-7 flex items-center justify-center rounded hover:bg-gray-100 text-gray-500 hover:text-gray-700" title="Duplicate" aria-label="Duplicate"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2"></rect><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"></path></svg></button> <!> <!> <div class="w-px h-5 bg-gray-200 mx-0.5"></div> <button class="w-7 h-7 flex items-center justify-center rounded hover:bg-red-50 text-gray-400 hover:text-red-600" title="Delete" aria-label="Delete"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M3 6h18M8 6V4a2 2 0 012-2h4a2 2 0 012 2v2m3 0v14a2 2 0 01-2 2H7a2 2 0 01-2-2V6h14"></path></svg></button></div>`);
64367
+ var root_18 = /* @__PURE__ */ from_html(`<div class="absolute top-2 left-1/2 -translate-x-1/2 bg-blue-600 text-white px-3 py-1 rounded-full text-xs shadow">Click to add wall segment · Double-click to finish · C to close loop · Esc to cancel</div>`);
64368
+ var root_19 = /* @__PURE__ */ from_html(`<div class="absolute top-2 left-1/2 -translate-x-1/2 bg-purple-600 text-white px-3 py-1 rounded-full text-xs shadow"> </div>`);
64369
+ var root_20 = /* @__PURE__ */ from_html(`<div class="absolute top-2 left-1/2 -translate-x-1/2 bg-red-600 text-white px-3 py-1 rounded-full text-xs shadow">Right-click two points to measure · M to exit · Esc to cancel</div>`);
64370
+ var root_21 = /* @__PURE__ */ from_html(`<div class="absolute top-2 left-1/2 -translate-x-1/2 bg-emerald-600 text-white px-3 py-1 rounded-full text-xs shadow">Click to place text label · Esc to cancel</div>`);
64371
+ var root_22 = /* @__PURE__ */ from_html(`<div class="absolute top-2 left-1/2 -translate-x-1/2 bg-indigo-600 text-white px-3 py-1 rounded-full text-xs shadow"> </div>`);
64372
+ var root_1$5 = /* @__PURE__ */ from_html(`<!> <!> <!> <!> <div class="absolute bottom-2 right-2 bg-white/80 rounded px-2 py-1 text-xs text-gray-500 flex gap-3"><!> <!> <!> <span> </span> <button class="hover:text-gray-700" title="Zoom to Fit (F)">⊞ Fit</button> <button class="hover:text-gray-700" title="Toggle Grid (G)"> </button> <button class="hover:text-gray-700" title="Toggle Snap to Grid (S)"> </button> <button class="hover:text-gray-700" title="Toggle Furniture"> </button> <button class="hover:text-gray-700" title="Layer Visibility">🗂 Layers</button> <button class="hover:text-gray-700" title="Toggle Rulers"> </button> <button class="hover:text-gray-700" title="Toggle Mini-map"> </button></div> <!> <!> <!> <!> <!> <!> <!> <div class="absolute bottom-3 left-3 z-20 flex items-center gap-1 bg-white rounded-lg shadow-lg border border-gray-200 px-1 py-0.5"><button class="w-7 h-7 flex items-center justify-center rounded hover:bg-gray-100 text-gray-600 hover:text-gray-800 font-bold text-lg" title="Zoom Out (−)" aria-label="Zoom out">−</button> <button class="min-w-[3.5rem] h-7 flex items-center justify-center rounded hover:bg-gray-100 text-xs font-medium text-gray-600 hover:text-gray-800 tabular-nums" title="Reset to 100%" aria-label="Zoom to 100%"> </button> <button class="w-7 h-7 flex items-center justify-center rounded hover:bg-gray-100 text-gray-600 hover:text-gray-800 font-bold text-lg" title="Zoom In (+)" aria-label="Zoom in">+</button> <div class="w-px h-5 bg-gray-200"></div> <button class="w-7 h-7 flex items-center justify-center rounded hover:bg-gray-100 text-gray-500 hover:text-gray-700 text-sm" title="Zoom to Fit (F)" aria-label="Zoom to fit">⊞</button></div> <!>`, 1);
64373
+ var root = /* @__PURE__ */ from_html(`<div class="w-full h-full relative overflow-hidden" role="application"><canvas class="block w-full h-full" tabindex="0" aria-label="Floor plan editor canvas"></canvas> <!></div>`);
64365
64374
  function FloorPlanCanvas($$anchor, $$props) {
64366
64375
  push($$props, true);
64367
64376
  const $panMode = () => store_get(panMode, "$panMode", $$stores);
@@ -67909,478 +67918,516 @@ function FloorPlanCanvas($$anchor, $$props) {
67909
67918
  var canvas_1 = child(div);
67910
67919
  bind_this(canvas_1, ($$value) => canvas = $$value, () => canvas);
67911
67920
  var node = sibling(canvas_1, 2);
67912
- var consequent = ($$anchor) => {
67913
- var input = root_1$5();
67914
- remove_input_defaults(input);
67915
- autofocus(input, true);
67916
- template_effect(() => {
67917
- var _$$get$x, _$$get$y;
67918
- set_style(input, `left: ${(_$$get$x = get(editingRoomPos).x) !== null && _$$get$x !== void 0 ? _$$get$x : ""}px; top: ${(_$$get$y = get(editingRoomPos).y) !== null && _$$get$y !== void 0 ? _$$get$y : ""}px; transform: translate(-50%, -50%); z-index: 20; min-width: 100px;`);
67919
- set_value(input, get(editingRoomName));
67920
- });
67921
- delegated("input", input, (e) => {
67922
- set(editingRoomName, e.target.value, true);
67923
- });
67924
- delegated("keydown", input, (e) => {
67925
- if (e.key === "Enter") {
67926
- updateRoom(get(editingRoomId), { name: get(editingRoomName) });
67927
- detectedRoomsStore.update((rooms) => rooms.map((r) => r.id === get(editingRoomId) ? {
67928
- ...r,
67929
- name: get(editingRoomName)
67930
- } : r));
67931
- set(editingRoomId, null);
67932
- } else if (e.key === "Escape") set(editingRoomId, null);
67933
- });
67934
- event("blur", input, () => {
67935
- if (get(editingRoomId)) {
67936
- updateRoom(get(editingRoomId), { name: get(editingRoomName) });
67937
- detectedRoomsStore.update((rooms) => rooms.map((r) => r.id === get(editingRoomId) ? {
67938
- ...r,
67939
- name: get(editingRoomName)
67940
- } : r));
67941
- set(editingRoomId, null);
67942
- }
67943
- });
67944
- append($$anchor, input);
67945
- };
67946
- if_block(node, ($$render) => {
67947
- if (get(editingRoomId)) $$render(consequent);
67948
- });
67949
- var node_1 = sibling(node, 2);
67950
- var consequent_1 = ($$anchor) => {
67951
- var input_1 = root_2$3();
67952
- remove_input_defaults(input_1);
67953
- autofocus(input_1, true);
67954
- template_effect(() => {
67955
- var _$$get$x2, _$$get$y2;
67956
- set_style(input_1, `left: ${(_$$get$x2 = get(editingTextAnnotationPos).x) !== null && _$$get$x2 !== void 0 ? _$$get$x2 : ""}px; top: ${(_$$get$y2 = get(editingTextAnnotationPos).y) !== null && _$$get$y2 !== void 0 ? _$$get$y2 : ""}px; transform: translate(-50%, -50%); z-index: 20; min-width: 120px;`);
67957
- set_value(input_1, get(editingTextAnnotationValue));
67958
- });
67959
- delegated("input", input_1, (e) => {
67960
- set(editingTextAnnotationValue, e.target.value, true);
67921
+ var consequent_20 = ($$anchor) => {
67922
+ var fragment = root_1$5();
67923
+ var node_1 = first_child(fragment);
67924
+ var consequent = ($$anchor) => {
67925
+ var input = root_2$3();
67926
+ remove_input_defaults(input);
67927
+ autofocus(input, true);
67928
+ template_effect(() => {
67929
+ var _$$get$x, _$$get$y;
67930
+ set_style(input, `left: ${(_$$get$x = get(editingRoomPos).x) !== null && _$$get$x !== void 0 ? _$$get$x : ""}px; top: ${(_$$get$y = get(editingRoomPos).y) !== null && _$$get$y !== void 0 ? _$$get$y : ""}px; transform: translate(-50%, -50%); z-index: 20; min-width: 100px;`);
67931
+ set_value(input, get(editingRoomName));
67932
+ });
67933
+ delegated("input", input, (e) => {
67934
+ set(editingRoomName, e.target.value, true);
67935
+ });
67936
+ delegated("keydown", input, (e) => {
67937
+ if (e.key === "Enter") {
67938
+ updateRoom(get(editingRoomId), { name: get(editingRoomName) });
67939
+ detectedRoomsStore.update((rooms) => rooms.map((r) => r.id === get(editingRoomId) ? {
67940
+ ...r,
67941
+ name: get(editingRoomName)
67942
+ } : r));
67943
+ set(editingRoomId, null);
67944
+ } else if (e.key === "Escape") set(editingRoomId, null);
67945
+ });
67946
+ event("blur", input, () => {
67947
+ if (get(editingRoomId)) {
67948
+ updateRoom(get(editingRoomId), { name: get(editingRoomName) });
67949
+ detectedRoomsStore.update((rooms) => rooms.map((r) => r.id === get(editingRoomId) ? {
67950
+ ...r,
67951
+ name: get(editingRoomName)
67952
+ } : r));
67953
+ set(editingRoomId, null);
67954
+ }
67955
+ });
67956
+ append($$anchor, input);
67957
+ };
67958
+ if_block(node_1, ($$render) => {
67959
+ if (get(editingRoomId)) $$render(consequent);
67961
67960
  });
67962
- delegated("keydown", input_1, (e) => {
67963
- e.stopPropagation();
67964
- if (e.key === "Enter") {
67965
- if (get(editingTextAnnotationValue).trim()) updateTextAnnotation(get(editingTextAnnotationId), { text: get(editingTextAnnotationValue) });
67966
- else {
67967
- removeTextAnnotation(get(editingTextAnnotationId));
67968
- set(selectedTextAnnotationId, null);
67969
- selectedElementId.set(null);
67961
+ var node_2 = sibling(node_1, 2);
67962
+ var consequent_1 = ($$anchor) => {
67963
+ var input_1 = root_3$2();
67964
+ remove_input_defaults(input_1);
67965
+ autofocus(input_1, true);
67966
+ template_effect(() => {
67967
+ var _$$get$x2, _$$get$y2;
67968
+ set_style(input_1, `left: ${(_$$get$x2 = get(editingTextAnnotationPos).x) !== null && _$$get$x2 !== void 0 ? _$$get$x2 : ""}px; top: ${(_$$get$y2 = get(editingTextAnnotationPos).y) !== null && _$$get$y2 !== void 0 ? _$$get$y2 : ""}px; transform: translate(-50%, -50%); z-index: 20; min-width: 120px;`);
67969
+ set_value(input_1, get(editingTextAnnotationValue));
67970
+ });
67971
+ delegated("input", input_1, (e) => {
67972
+ set(editingTextAnnotationValue, e.target.value, true);
67973
+ });
67974
+ delegated("keydown", input_1, (e) => {
67975
+ e.stopPropagation();
67976
+ if (e.key === "Enter") {
67977
+ if (get(editingTextAnnotationValue).trim()) updateTextAnnotation(get(editingTextAnnotationId), { text: get(editingTextAnnotationValue) });
67978
+ else {
67979
+ removeTextAnnotation(get(editingTextAnnotationId));
67980
+ set(selectedTextAnnotationId, null);
67981
+ selectedElementId.set(null);
67982
+ }
67983
+ set(editingTextAnnotationId, null);
67984
+ } else if (e.key === "Escape") {
67985
+ var _$$get12;
67986
+ if ((_$$get12 = get(currentFloor)) === null || _$$get12 === void 0 ? void 0 : _$$get12.textAnnotations) {
67987
+ const ta = get(currentFloor).textAnnotations.find((t) => t.id === get(editingTextAnnotationId));
67988
+ if (ta && ta.text === "Text" && !get(editingTextAnnotationValue).trim()) {
67989
+ removeTextAnnotation(get(editingTextAnnotationId));
67990
+ set(selectedTextAnnotationId, null);
67991
+ selectedElementId.set(null);
67992
+ }
67993
+ }
67994
+ set(editingTextAnnotationId, null);
67970
67995
  }
67971
- set(editingTextAnnotationId, null);
67972
- } else if (e.key === "Escape") {
67973
- var _$$get12;
67974
- if ((_$$get12 = get(currentFloor)) === null || _$$get12 === void 0 ? void 0 : _$$get12.textAnnotations) {
67975
- const ta = get(currentFloor).textAnnotations.find((t) => t.id === get(editingTextAnnotationId));
67976
- if (ta && ta.text === "Text" && !get(editingTextAnnotationValue).trim()) {
67996
+ });
67997
+ event("blur", input_1, () => {
67998
+ if (get(editingTextAnnotationId)) {
67999
+ if (get(editingTextAnnotationValue).trim()) updateTextAnnotation(get(editingTextAnnotationId), { text: get(editingTextAnnotationValue) });
68000
+ else {
67977
68001
  removeTextAnnotation(get(editingTextAnnotationId));
67978
68002
  set(selectedTextAnnotationId, null);
67979
68003
  selectedElementId.set(null);
67980
68004
  }
68005
+ set(editingTextAnnotationId, null);
67981
68006
  }
67982
- set(editingTextAnnotationId, null);
67983
- }
68007
+ });
68008
+ append($$anchor, input_1);
68009
+ };
68010
+ if_block(node_2, ($$render) => {
68011
+ if (get(editingTextAnnotationId)) $$render(consequent_1);
67984
68012
  });
67985
- event("blur", input_1, () => {
67986
- if (get(editingTextAnnotationId)) {
67987
- if (get(editingTextAnnotationValue).trim()) updateTextAnnotation(get(editingTextAnnotationId), { text: get(editingTextAnnotationValue) });
67988
- else {
67989
- removeTextAnnotation(get(editingTextAnnotationId));
67990
- set(selectedTextAnnotationId, null);
67991
- selectedElementId.set(null);
67992
- }
67993
- set(editingTextAnnotationId, null);
67994
- }
68013
+ var node_3 = sibling(node_2, 2);
68014
+ var consequent_2 = ($$anchor) => {
68015
+ append($$anchor, root_4$3());
68016
+ };
68017
+ if_block(node_3, ($$render) => {
68018
+ if (get(currentFloor) && get(currentFloor).walls.length === 0 && get(currentFloor).furniture.length === 0 && get(currentFloor).doors.length === 0 && !$$props.viewOnly) $$render(consequent_2);
67995
68019
  });
67996
- append($$anchor, input_1);
67997
- };
67998
- if_block(node_1, ($$render) => {
67999
- if (get(editingTextAnnotationId)) $$render(consequent_1);
68000
- });
68001
- var node_2 = sibling(node_1, 2);
68002
- var consequent_2 = ($$anchor) => {
68003
- append($$anchor, root_3$3());
68004
- };
68005
- if_block(node_2, ($$render) => {
68006
- if (get(currentFloor) && get(currentFloor).walls.length === 0 && get(currentFloor).furniture.length === 0 && get(currentFloor).doors.length === 0 && !$$props.viewOnly) $$render(consequent_2);
68007
- });
68008
- var node_3 = sibling(node_2, 2);
68009
- var consequent_3 = ($$anchor) => {
68010
- var canvas_2 = root_4$2();
68011
- bind_this(canvas_2, ($$value) => minimapCanvas = $$value, () => minimapCanvas);
68012
- delegated("click", canvas_2, onMinimapClick);
68013
- append($$anchor, canvas_2);
68014
- };
68015
- if_block(node_3, ($$render) => {
68016
- if (get(showMinimap) && get(currentFloor) && get(currentFloor).walls.length > 0) $$render(consequent_3);
68017
- });
68018
- var div_2 = sibling(node_3, 2);
68019
- var node_4 = child(div_2);
68020
- var consequent_4 = ($$anchor) => {
68021
- var fragment = root_5$1();
68022
- var span = first_child(fragment);
68023
- var text_1 = child(span);
68024
- reset(span);
68025
- var span_1 = sibling(span, 2);
68026
- var text_2 = child(span_1, true);
68027
- reset(span_1);
68028
- next(2);
68029
- template_effect(($0) => {
68030
- var _$$get$length;
68031
- set_text(text_1, `${(_$$get$length = get(detectedRooms).length) !== null && _$$get$length !== void 0 ? _$$get$length : ""} room${get(detectedRooms).length !== 1 ? "s" : ""}`);
68032
- set_text(text_2, $0);
68033
- }, [() => formatArea(get(detectedRooms).reduce((s, r) => s + r.area, 0), $projectSettings().units)]);
68034
- append($$anchor, fragment);
68035
- };
68036
- if_block(node_4, ($$render) => {
68037
- if (get(detectedRooms).length > 0) $$render(consequent_4);
68038
- });
68039
- var node_5 = sibling(node_4, 2);
68040
- var consequent_8 = ($$anchor) => {
68041
- var fragment_1 = root_6$1();
68042
- var span_2 = first_child(fragment_1);
68043
- var text_3 = child(span_2);
68044
- reset(span_2);
68045
- var node_6 = sibling(span_2, 2);
68046
- var consequent_5 = ($$anchor) => {
68047
- var span_3 = root_7();
68048
- var text_4 = child(span_3);
68049
- reset(span_3);
68050
- template_effect(() => {
68051
- var _$$get$doors$length;
68052
- return set_text(text_4, `${(_$$get$doors$length = get(currentFloor).doors.length) !== null && _$$get$doors$length !== void 0 ? _$$get$doors$length : ""} door${get(currentFloor).doors.length !== 1 ? "s" : ""}`);
68053
- });
68054
- append($$anchor, span_3);
68020
+ var node_4 = sibling(node_3, 2);
68021
+ var consequent_3 = ($$anchor) => {
68022
+ var canvas_2 = root_5();
68023
+ bind_this(canvas_2, ($$value) => minimapCanvas = $$value, () => minimapCanvas);
68024
+ delegated("click", canvas_2, onMinimapClick);
68025
+ append($$anchor, canvas_2);
68055
68026
  };
68056
- if_block(node_6, ($$render) => {
68057
- if (get(currentFloor).doors.length > 0) $$render(consequent_5);
68027
+ if_block(node_4, ($$render) => {
68028
+ if (get(showMinimap) && get(currentFloor) && get(currentFloor).walls.length > 0) $$render(consequent_3);
68058
68029
  });
68059
- var node_7 = sibling(node_6, 2);
68060
- var consequent_6 = ($$anchor) => {
68061
- var span_4 = root_8();
68062
- var text_5 = child(span_4);
68063
- reset(span_4);
68030
+ var div_2 = sibling(node_4, 2);
68031
+ var node_5 = child(div_2);
68032
+ var consequent_4 = ($$anchor) => {
68033
+ var fragment_1 = root_6();
68034
+ var span = first_child(fragment_1);
68035
+ var text_1 = child(span);
68036
+ reset(span);
68037
+ var span_1 = sibling(span, 2);
68038
+ var text_2 = child(span_1, true);
68039
+ reset(span_1);
68040
+ next(2);
68041
+ template_effect(($0) => {
68042
+ var _$$get$length;
68043
+ set_text(text_1, `${(_$$get$length = get(detectedRooms).length) !== null && _$$get$length !== void 0 ? _$$get$length : ""} room${get(detectedRooms).length !== 1 ? "s" : ""}`);
68044
+ set_text(text_2, $0);
68045
+ }, [() => formatArea(get(detectedRooms).reduce((s, r) => s + r.area, 0), $projectSettings().units)]);
68046
+ append($$anchor, fragment_1);
68047
+ };
68048
+ if_block(node_5, ($$render) => {
68049
+ if (get(detectedRooms).length > 0) $$render(consequent_4);
68050
+ });
68051
+ var node_6 = sibling(node_5, 2);
68052
+ var consequent_8 = ($$anchor) => {
68053
+ var fragment_2 = root_7$1();
68054
+ var span_2 = first_child(fragment_2);
68055
+ var text_3 = child(span_2);
68056
+ reset(span_2);
68057
+ var node_7 = sibling(span_2, 2);
68058
+ var consequent_5 = ($$anchor) => {
68059
+ var span_3 = root_8$1();
68060
+ var text_4 = child(span_3);
68061
+ reset(span_3);
68062
+ template_effect(() => {
68063
+ var _$$get$doors$length;
68064
+ return set_text(text_4, `${(_$$get$doors$length = get(currentFloor).doors.length) !== null && _$$get$doors$length !== void 0 ? _$$get$doors$length : ""} door${get(currentFloor).doors.length !== 1 ? "s" : ""}`);
68065
+ });
68066
+ append($$anchor, span_3);
68067
+ };
68068
+ if_block(node_7, ($$render) => {
68069
+ if (get(currentFloor).doors.length > 0) $$render(consequent_5);
68070
+ });
68071
+ var node_8 = sibling(node_7, 2);
68072
+ var consequent_6 = ($$anchor) => {
68073
+ var span_4 = root_9();
68074
+ var text_5 = child(span_4);
68075
+ reset(span_4);
68076
+ template_effect(() => {
68077
+ var _$$get$windows$length;
68078
+ return set_text(text_5, `${(_$$get$windows$length = get(currentFloor).windows.length) !== null && _$$get$windows$length !== void 0 ? _$$get$windows$length : ""} window${get(currentFloor).windows.length !== 1 ? "s" : ""}`);
68079
+ });
68080
+ append($$anchor, span_4);
68081
+ };
68082
+ if_block(node_8, ($$render) => {
68083
+ if (get(currentFloor).windows.length > 0) $$render(consequent_6);
68084
+ });
68085
+ var node_9 = sibling(node_8, 2);
68086
+ var consequent_7 = ($$anchor) => {
68087
+ var span_5 = root_10();
68088
+ var text_6 = child(span_5);
68089
+ reset(span_5);
68090
+ template_effect(() => {
68091
+ var _$$get$furniture$leng;
68092
+ return set_text(text_6, `${(_$$get$furniture$leng = get(currentFloor).furniture.length) !== null && _$$get$furniture$leng !== void 0 ? _$$get$furniture$leng : ""} object${get(currentFloor).furniture.length !== 1 ? "s" : ""}`);
68093
+ });
68094
+ append($$anchor, span_5);
68095
+ };
68096
+ if_block(node_9, ($$render) => {
68097
+ if (get(currentFloor).furniture.length > 0) $$render(consequent_7);
68098
+ });
68099
+ next(2);
68064
68100
  template_effect(() => {
68065
- var _$$get$windows$length;
68066
- return set_text(text_5, `${(_$$get$windows$length = get(currentFloor).windows.length) !== null && _$$get$windows$length !== void 0 ? _$$get$windows$length : ""} window${get(currentFloor).windows.length !== 1 ? "s" : ""}`);
68101
+ var _$$get$walls$length;
68102
+ return set_text(text_3, `${(_$$get$walls$length = get(currentFloor).walls.length) !== null && _$$get$walls$length !== void 0 ? _$$get$walls$length : ""} wall${get(currentFloor).walls.length !== 1 ? "s" : ""}`);
68067
68103
  });
68068
- append($$anchor, span_4);
68104
+ append($$anchor, fragment_2);
68069
68105
  };
68070
- if_block(node_7, ($$render) => {
68071
- if (get(currentFloor).windows.length > 0) $$render(consequent_6);
68106
+ if_block(node_6, ($$render) => {
68107
+ if (get(currentFloor)) $$render(consequent_8);
68072
68108
  });
68073
- var node_8 = sibling(node_7, 2);
68074
- var consequent_7 = ($$anchor) => {
68075
- var span_5 = root_9();
68076
- var text_6 = child(span_5);
68077
- reset(span_5);
68109
+ var node_10 = sibling(node_6, 2);
68110
+ var consequent_9 = ($$anchor) => {
68111
+ var fragment_3 = root_11();
68112
+ var span_6 = first_child(fragment_3);
68113
+ var text_7 = child(span_6);
68114
+ reset(span_6);
68115
+ next(2);
68078
68116
  template_effect(() => {
68079
- var _$$get$furniture$leng;
68080
- return set_text(text_6, `${(_$$get$furniture$leng = get(currentFloor).furniture.length) !== null && _$$get$furniture$leng !== void 0 ? _$$get$furniture$leng : ""} object${get(currentFloor).furniture.length !== 1 ? "s" : ""}`);
68117
+ var _$$get$size;
68118
+ return set_text(text_7, `${(_$$get$size = get(currentSelectedIds).size) !== null && _$$get$size !== void 0 ? _$$get$size : ""} selected`);
68081
68119
  });
68082
- append($$anchor, span_5);
68120
+ append($$anchor, fragment_3);
68083
68121
  };
68084
- if_block(node_8, ($$render) => {
68085
- if (get(currentFloor).furniture.length > 0) $$render(consequent_7);
68086
- });
68087
- next(2);
68088
- template_effect(() => {
68089
- var _$$get$walls$length;
68090
- return set_text(text_3, `${(_$$get$walls$length = get(currentFloor).walls.length) !== null && _$$get$walls$length !== void 0 ? _$$get$walls$length : ""} wall${get(currentFloor).walls.length !== 1 ? "s" : ""}`);
68091
- });
68092
- append($$anchor, fragment_1);
68093
- };
68094
- if_block(node_5, ($$render) => {
68095
- if (get(currentFloor)) $$render(consequent_8);
68096
- });
68097
- var node_9 = sibling(node_5, 2);
68098
- var consequent_9 = ($$anchor) => {
68099
- var fragment_2 = root_10();
68100
- var span_6 = first_child(fragment_2);
68101
- var text_7 = child(span_6);
68102
- reset(span_6);
68103
- next(2);
68104
- template_effect(() => {
68105
- var _$$get$size;
68106
- return set_text(text_7, `${(_$$get$size = get(currentSelectedIds).size) !== null && _$$get$size !== void 0 ? _$$get$size : ""} selected`);
68122
+ if_block(node_10, ($$render) => {
68123
+ if (get(currentSelectedIds).size > 1) $$render(consequent_9);
68107
68124
  });
68108
- append($$anchor, fragment_2);
68109
- };
68110
- if_block(node_9, ($$render) => {
68111
- if (get(currentSelectedIds).size > 1) $$render(consequent_9);
68112
- });
68113
- var span_7 = sibling(node_9, 2);
68114
- var text_8 = child(span_7);
68115
- reset(span_7);
68116
- var button = sibling(span_7, 2);
68117
- var button_1 = sibling(button, 2);
68118
- var text_9 = child(button_1);
68119
- reset(button_1);
68120
- var button_2 = sibling(button_1, 2);
68121
- var text_10 = child(button_2);
68122
- reset(button_2);
68123
- var button_3 = sibling(button_2, 2);
68124
- var text_11 = child(button_3);
68125
- reset(button_3);
68126
- var button_4 = sibling(button_3, 2);
68127
- var button_5 = sibling(button_4, 2);
68128
- var text_12 = child(button_5);
68129
- reset(button_5);
68130
- var button_6 = sibling(button_5, 2);
68131
- var text_13 = child(button_6);
68132
- text_13.nodeValue = "🗺 Map";
68133
- reset(button_6);
68134
- reset(div_2);
68135
- var node_10 = sibling(div_2, 2);
68136
- var consequent_10 = ($$anchor) => {
68137
- var div_3 = root_11();
68138
- var node_11 = sibling(child(div_3), 2);
68139
- each(node_11, 16, () => [
68140
- ["walls", "Walls"],
68141
- ["doors", "Doors"],
68142
- ["windows", "Windows"],
68143
- ["furniture", "Furniture"],
68144
- ["stairs", "Stairs"],
68145
- ["columns", "Columns"],
68146
- ["guides", "Guides"],
68147
- ["measurements", "Measurements"]
68148
- ], index$1, ($$anchor, $$item) => {
68149
- var $$array = /* @__PURE__ */ user_derived(() => to_array($$item, 2));
68150
- let key = () => get($$array)[0];
68151
- let label = () => get($$array)[1];
68152
- var label_1 = root_12();
68153
- var input_2 = child(label_1);
68154
- remove_input_defaults(input_2);
68155
- var span_8 = sibling(input_2, 2);
68156
- var text_14 = child(span_8, true);
68157
- reset(span_8);
68158
- reset(label_1);
68159
- template_effect(() => {
68160
- set_checked(input_2, get(layerVis)[key()]);
68161
- set_text(text_14, label());
68125
+ var span_7 = sibling(node_10, 2);
68126
+ var text_8 = child(span_7);
68127
+ reset(span_7);
68128
+ var button = sibling(span_7, 2);
68129
+ var button_1 = sibling(button, 2);
68130
+ var text_9 = child(button_1);
68131
+ reset(button_1);
68132
+ var button_2 = sibling(button_1, 2);
68133
+ var text_10 = child(button_2);
68134
+ reset(button_2);
68135
+ var button_3 = sibling(button_2, 2);
68136
+ var text_11 = child(button_3);
68137
+ reset(button_3);
68138
+ var button_4 = sibling(button_3, 2);
68139
+ var button_5 = sibling(button_4, 2);
68140
+ var text_12 = child(button_5);
68141
+ reset(button_5);
68142
+ var button_6 = sibling(button_5, 2);
68143
+ var text_13 = child(button_6);
68144
+ text_13.nodeValue = "🗺 Map";
68145
+ reset(button_6);
68146
+ reset(div_2);
68147
+ var node_11 = sibling(div_2, 2);
68148
+ var consequent_10 = ($$anchor) => {
68149
+ var div_3 = root_12();
68150
+ var node_12 = sibling(child(div_3), 2);
68151
+ each(node_12, 16, () => [
68152
+ ["walls", "Walls"],
68153
+ ["doors", "Doors"],
68154
+ ["windows", "Windows"],
68155
+ ["furniture", "Furniture"],
68156
+ ["stairs", "Stairs"],
68157
+ ["columns", "Columns"],
68158
+ ["guides", "Guides"],
68159
+ ["measurements", "Measurements"]
68160
+ ], index$1, ($$anchor, $$item) => {
68161
+ var $$array = /* @__PURE__ */ user_derived(() => to_array($$item, 2));
68162
+ let key = () => get($$array)[0];
68163
+ let label = () => get($$array)[1];
68164
+ var label_1 = root_13();
68165
+ var input_2 = child(label_1);
68166
+ remove_input_defaults(input_2);
68167
+ var span_8 = sibling(input_2, 2);
68168
+ var text_14 = child(span_8, true);
68169
+ reset(span_8);
68170
+ reset(label_1);
68171
+ template_effect(() => {
68172
+ set_checked(input_2, get(layerVis)[key()]);
68173
+ set_text(text_14, label());
68174
+ });
68175
+ delegated("change", input_2, () => layerVisibility.update((v) => ({
68176
+ ...v,
68177
+ [key()]: !v[key()]
68178
+ })));
68179
+ append($$anchor, label_1);
68162
68180
  });
68163
- delegated("change", input_2, () => layerVisibility.update((v) => ({
68164
- ...v,
68165
- [key()]: !v[key()]
68166
- })));
68167
- append($$anchor, label_1);
68181
+ var label_2 = sibling(node_12, 4);
68182
+ var input_3 = child(label_2);
68183
+ remove_input_defaults(input_3);
68184
+ next(2);
68185
+ reset(label_2);
68186
+ var label_3 = sibling(label_2, 2);
68187
+ var input_4 = child(label_3);
68188
+ remove_input_defaults(input_4);
68189
+ next(2);
68190
+ reset(label_3);
68191
+ reset(div_3);
68192
+ bind_checked(input_3, () => get(showRoomLabels), ($$value) => set(showRoomLabels, $$value));
68193
+ bind_checked(input_4, () => get(showDimensions), ($$value) => set(showDimensions, $$value));
68194
+ append($$anchor, div_3);
68195
+ };
68196
+ if_block(node_11, ($$render) => {
68197
+ if (get(showLayerPanel)) $$render(consequent_10);
68168
68198
  });
68169
- var label_2 = sibling(node_11, 4);
68170
- var input_3 = child(label_2);
68171
- remove_input_defaults(input_3);
68172
- next(2);
68173
- reset(label_2);
68174
- var label_3 = sibling(label_2, 2);
68175
- var input_4 = child(label_3);
68176
- remove_input_defaults(input_4);
68177
- next(2);
68178
- reset(label_3);
68179
- reset(div_3);
68180
- bind_checked(input_3, () => get(showRoomLabels), ($$value) => set(showRoomLabels, $$value));
68181
- bind_checked(input_4, () => get(showDimensions), ($$value) => set(showDimensions, $$value));
68182
- append($$anchor, div_3);
68183
- };
68184
- if_block(node_10, ($$render) => {
68185
- if (get(showLayerPanel)) $$render(consequent_10);
68186
- });
68187
- var node_12 = sibling(node_10, 2);
68188
- var consequent_14 = ($$anchor) => {
68189
- const el = /* @__PURE__ */ user_derived(() => (() => {
68190
- const f = get(currentFloor);
68191
- const wall = f.walls.find((w) => w.id === get(currentSelectedId));
68192
- if (wall) return {
68193
- type: "wall",
68194
- pos: worldToScreen((wall.start.x + wall.end.x) / 2, (wall.start.y + wall.end.y) / 2)
68195
- };
68196
- const door = f.doors.find((d) => d.id === get(currentSelectedId));
68197
- if (door) {
68198
- const w = f.walls.find((w) => w.id === door.wallId);
68199
- if (w) return {
68200
- type: "door",
68201
- pos: worldToScreen(w.start.x + (w.end.x - w.start.x) * door.position, w.start.y + (w.end.y - w.start.y) * door.position),
68202
- door
68199
+ var node_13 = sibling(node_11, 2);
68200
+ var consequent_14 = ($$anchor) => {
68201
+ const el = /* @__PURE__ */ user_derived(() => (() => {
68202
+ const f = get(currentFloor);
68203
+ const wall = f.walls.find((w) => w.id === get(currentSelectedId));
68204
+ if (wall) return {
68205
+ type: "wall",
68206
+ pos: worldToScreen((wall.start.x + wall.end.x) / 2, (wall.start.y + wall.end.y) / 2)
68203
68207
  };
68204
- }
68205
- const win = f.windows.find((w) => w.id === get(currentSelectedId));
68206
- if (win) {
68207
- const w = f.walls.find((w) => w.id === win.wallId);
68208
- if (w) return {
68209
- type: "window",
68210
- pos: worldToScreen(w.start.x + (w.end.x - w.start.x) * win.position, w.start.y + (w.end.y - w.start.y) * win.position)
68208
+ const door = f.doors.find((d) => d.id === get(currentSelectedId));
68209
+ if (door) {
68210
+ const w = f.walls.find((w) => w.id === door.wallId);
68211
+ if (w) return {
68212
+ type: "door",
68213
+ pos: worldToScreen(w.start.x + (w.end.x - w.start.x) * door.position, w.start.y + (w.end.y - w.start.y) * door.position),
68214
+ door
68215
+ };
68216
+ }
68217
+ const win = f.windows.find((w) => w.id === get(currentSelectedId));
68218
+ if (win) {
68219
+ const w = f.walls.find((w) => w.id === win.wallId);
68220
+ if (w) return {
68221
+ type: "window",
68222
+ pos: worldToScreen(w.start.x + (w.end.x - w.start.x) * win.position, w.start.y + (w.end.y - w.start.y) * win.position)
68223
+ };
68224
+ }
68225
+ const furn = f.furniture.find((fi) => fi.id === get(currentSelectedId));
68226
+ if (furn) return {
68227
+ type: "furniture",
68228
+ pos: worldToScreen(furn.position.x, furn.position.y)
68211
68229
  };
68212
- }
68213
- const furn = f.furniture.find((fi) => fi.id === get(currentSelectedId));
68214
- if (furn) return {
68215
- type: "furniture",
68216
- pos: worldToScreen(furn.position.x, furn.position.y)
68217
- };
68218
- return null;
68219
- })());
68220
- var fragment_3 = comment();
68221
- var node_13 = first_child(fragment_3);
68222
- var consequent_13 = ($$anchor) => {
68223
- var div_4 = root_14();
68224
- var button_7 = child(div_4);
68225
- var node_14 = sibling(button_7, 2);
68226
- var consequent_11 = ($$anchor) => {
68227
- var button_8 = root_15();
68228
- delegated("click", button_8, () => {
68229
- if (get(el).door) updateDoor(get(el).door.id, { swingDirection: get(el).door.swingDirection === "left" ? "right" : "left" });
68230
+ return null;
68231
+ })());
68232
+ var fragment_4 = comment();
68233
+ var node_14 = first_child(fragment_4);
68234
+ var consequent_13 = ($$anchor) => {
68235
+ var div_4 = root_15();
68236
+ var button_7 = child(div_4);
68237
+ var node_15 = sibling(button_7, 2);
68238
+ var consequent_11 = ($$anchor) => {
68239
+ var button_8 = root_16();
68240
+ delegated("click", button_8, () => {
68241
+ if (get(el).door) updateDoor(get(el).door.id, { swingDirection: get(el).door.swingDirection === "left" ? "right" : "left" });
68242
+ });
68243
+ append($$anchor, button_8);
68244
+ };
68245
+ if_block(node_15, ($$render) => {
68246
+ if (get(el).type === "door" && get(el).door) $$render(consequent_11);
68230
68247
  });
68231
- append($$anchor, button_8);
68232
- };
68233
- if_block(node_14, ($$render) => {
68234
- if (get(el).type === "door" && get(el).door) $$render(consequent_11);
68235
- });
68236
- var node_15 = sibling(node_14, 2);
68237
- var consequent_12 = ($$anchor) => {
68238
- var button_9 = root_16();
68239
- delegated("click", button_9, () => {
68240
- if (get(currentSelectedId)) {
68241
- if (splitWall(get(currentSelectedId), .5)) selectedElementId.set(null);
68248
+ var node_16 = sibling(node_15, 2);
68249
+ var consequent_12 = ($$anchor) => {
68250
+ var button_9 = root_17();
68251
+ delegated("click", button_9, () => {
68252
+ if (get(currentSelectedId)) {
68253
+ if (splitWall(get(currentSelectedId), .5)) selectedElementId.set(null);
68254
+ }
68255
+ });
68256
+ append($$anchor, button_9);
68257
+ };
68258
+ if_block(node_16, ($$render) => {
68259
+ if (get(el).type === "wall" && get(currentSelectedId) && get(currentSelectedIds).size === 0) $$render(consequent_12);
68260
+ });
68261
+ var button_10 = sibling(node_16, 4);
68262
+ reset(div_4);
68263
+ template_effect(() => {
68264
+ var _$$get$pos$x;
68265
+ return set_style(div_4, `left: ${(_$$get$pos$x = get(el).pos.x) !== null && _$$get$pos$x !== void 0 ? _$$get$pos$x : ""}px; top: ${get(el).pos.y - 44}px; transform: translateX(-50%);`);
68266
+ });
68267
+ delegated("click", button_7, () => {
68268
+ if (!get(currentSelectedId) || !get(currentFloor)) return;
68269
+ let newId = null;
68270
+ if (get(el).type === "door") newId = duplicateDoor(get(currentSelectedId));
68271
+ else if (get(el).type === "window") newId = duplicateWindow(get(currentSelectedId));
68272
+ else if (get(el).type === "furniture") newId = duplicateFurniture(get(currentSelectedId));
68273
+ else if (get(el).type === "wall") newId = duplicateWall(get(currentSelectedId));
68274
+ if (newId) selectedElementId.set(newId);
68275
+ });
68276
+ delegated("click", button_10, () => {
68277
+ if (get(currentSelectedIds).size > 0) {
68278
+ beginUndoGroup();
68279
+ for (const id of get(currentSelectedIds)) removeElement(id);
68280
+ endUndoGroup();
68281
+ selectedElementIds.set(/* @__PURE__ */ new Set());
68282
+ selectedElementId.set(null);
68283
+ } else if (get(currentSelectedId)) {
68284
+ removeElement(get(currentSelectedId));
68285
+ selectedElementId.set(null);
68242
68286
  }
68243
68287
  });
68244
- append($$anchor, button_9);
68288
+ append($$anchor, div_4);
68245
68289
  };
68246
- if_block(node_15, ($$render) => {
68247
- if (get(el).type === "wall" && get(currentSelectedId) && get(currentSelectedIds).size === 0) $$render(consequent_12);
68290
+ if_block(node_14, ($$render) => {
68291
+ if (get(el)) $$render(consequent_13);
68248
68292
  });
68249
- var button_10 = sibling(node_15, 4);
68250
- reset(div_4);
68293
+ append($$anchor, fragment_4);
68294
+ };
68295
+ if_block(node_13, ($$render) => {
68296
+ if ((get(currentSelectedId) || get(currentSelectedIds).size > 0) && get(currentFloor) && get(currentTool) === "select") $$render(consequent_14);
68297
+ });
68298
+ var node_17 = sibling(node_13, 2);
68299
+ var consequent_15 = ($$anchor) => {
68300
+ append($$anchor, root_18());
68301
+ };
68302
+ if_block(node_17, ($$render) => {
68303
+ if (get(currentTool) === "wall" && get(wallStart)) $$render(consequent_15);
68304
+ });
68305
+ var node_18 = sibling(node_17, 2);
68306
+ var consequent_16 = ($$anchor) => {
68307
+ var div_6 = root_19();
68308
+ var text_15 = child(div_6);
68309
+ reset(div_6);
68251
68310
  template_effect(() => {
68252
- var _$$get$pos$x;
68253
- return set_style(div_4, `left: ${(_$$get$pos$x = get(el).pos.x) !== null && _$$get$pos$x !== void 0 ? _$$get$pos$x : ""}px; top: ${get(el).pos.y - 44}px; transform: translateX(-50%);`);
68311
+ var _$$get13;
68312
+ return set_text(text_15, `Click to place · Scroll or R to rotate (${(_$$get13 = get(currentPlacingRotation)) !== null && _$$get13 !== void 0 ? _$$get13 : ""}°) · Esc to cancel`);
68254
68313
  });
68255
- delegated("click", button_7, () => {
68256
- if (!get(currentSelectedId) || !get(currentFloor)) return;
68257
- let newId = null;
68258
- if (get(el).type === "door") newId = duplicateDoor(get(currentSelectedId));
68259
- else if (get(el).type === "window") newId = duplicateWindow(get(currentSelectedId));
68260
- else if (get(el).type === "furniture") newId = duplicateFurniture(get(currentSelectedId));
68261
- else if (get(el).type === "wall") newId = duplicateWall(get(currentSelectedId));
68262
- if (newId) selectedElementId.set(newId);
68263
- });
68264
- delegated("click", button_10, () => {
68265
- if (get(currentSelectedIds).size > 0) {
68266
- beginUndoGroup();
68267
- for (const id of get(currentSelectedIds)) removeElement(id);
68268
- endUndoGroup();
68269
- selectedElementIds.set(/* @__PURE__ */ new Set());
68270
- selectedElementId.set(null);
68271
- } else if (get(currentSelectedId)) {
68272
- removeElement(get(currentSelectedId));
68273
- selectedElementId.set(null);
68274
- }
68275
- });
68276
- append($$anchor, div_4);
68314
+ append($$anchor, div_6);
68277
68315
  };
68278
- if_block(node_13, ($$render) => {
68279
- if (get(el)) $$render(consequent_13);
68316
+ if_block(node_18, ($$render) => {
68317
+ if (get(currentPlacingId) && get(currentTool) === "furniture") $$render(consequent_16);
68280
68318
  });
68281
- append($$anchor, fragment_3);
68282
- };
68283
- if_block(node_12, ($$render) => {
68284
- if ((get(currentSelectedId) || get(currentSelectedIds).size > 0) && get(currentFloor) && get(currentTool) === "select") $$render(consequent_14);
68285
- });
68286
- var node_16 = sibling(node_12, 2);
68287
- var consequent_15 = ($$anchor) => {
68288
- append($$anchor, root_17());
68289
- };
68290
- if_block(node_16, ($$render) => {
68291
- if (get(currentTool) === "wall" && get(wallStart)) $$render(consequent_15);
68292
- });
68293
- var node_17 = sibling(node_16, 2);
68294
- var consequent_16 = ($$anchor) => {
68295
- var div_6 = root_18();
68296
- var text_15 = child(div_6);
68297
- reset(div_6);
68298
- template_effect(() => {
68299
- var _$$get13;
68300
- return set_text(text_15, `Click to place · Scroll or R to rotate (${(_$$get13 = get(currentPlacingRotation)) !== null && _$$get13 !== void 0 ? _$$get13 : ""}°) · Esc to cancel`);
68319
+ var node_19 = sibling(node_18, 2);
68320
+ var consequent_17 = ($$anchor) => {
68321
+ append($$anchor, root_20());
68322
+ };
68323
+ if_block(node_19, ($$render) => {
68324
+ if (get(measuring)) $$render(consequent_17);
68301
68325
  });
68302
- append($$anchor, div_6);
68303
- };
68304
- if_block(node_17, ($$render) => {
68305
- if (get(currentPlacingId) && get(currentTool) === "furniture") $$render(consequent_16);
68306
- });
68307
- var node_18 = sibling(node_17, 2);
68308
- var consequent_17 = ($$anchor) => {
68309
- append($$anchor, root_19());
68310
- };
68311
- if_block(node_18, ($$render) => {
68312
- if (get(measuring)) $$render(consequent_17);
68313
- });
68314
- var node_19 = sibling(node_18, 2);
68315
- var consequent_18 = ($$anchor) => {
68316
- append($$anchor, root_20());
68317
- };
68318
- if_block(node_19, ($$render) => {
68319
- if (get(textAnnotationMode)) $$render(consequent_18);
68320
- });
68321
- var node_20 = sibling(node_19, 2);
68322
- var consequent_19 = ($$anchor) => {
68323
- var div_9 = root_21();
68324
- var text_16 = child(div_9);
68325
- reset(div_9);
68326
- template_effect(() => set_text(text_16, `${get(annotationStart) ? "Click second point to create annotation" : "Click first point"} · N to exit · Esc to cancel`));
68327
- append($$anchor, div_9);
68326
+ var node_20 = sibling(node_19, 2);
68327
+ var consequent_18 = ($$anchor) => {
68328
+ append($$anchor, root_21());
68329
+ };
68330
+ if_block(node_20, ($$render) => {
68331
+ if (get(textAnnotationMode)) $$render(consequent_18);
68332
+ });
68333
+ var node_21 = sibling(node_20, 2);
68334
+ var consequent_19 = ($$anchor) => {
68335
+ var div_9 = root_22();
68336
+ var text_16 = child(div_9);
68337
+ reset(div_9);
68338
+ template_effect(() => set_text(text_16, `${get(annotationStart) ? "Click second point to create annotation" : "Click first point"} · N to exit · Esc to cancel`));
68339
+ append($$anchor, div_9);
68340
+ };
68341
+ if_block(node_21, ($$render) => {
68342
+ if (get(annotating)) $$render(consequent_19);
68343
+ });
68344
+ var div_10 = sibling(node_21, 2);
68345
+ var button_11 = child(div_10);
68346
+ var button_12 = sibling(button_11, 2);
68347
+ var text_17 = child(button_12);
68348
+ reset(button_12);
68349
+ var button_13 = sibling(button_12, 2);
68350
+ var button_14 = sibling(button_13, 4);
68351
+ reset(div_10);
68352
+ ContextMenu(sibling(div_10, 2), {
68353
+ get x() {
68354
+ return get(ctxMenuX);
68355
+ },
68356
+ get y() {
68357
+ return get(ctxMenuY);
68358
+ },
68359
+ get visible() {
68360
+ return get(ctxMenuVisible);
68361
+ },
68362
+ get targetType() {
68363
+ return get(ctxMenuTargetType);
68364
+ },
68365
+ get targetId() {
68366
+ return get(ctxMenuTargetId);
68367
+ },
68368
+ get targetWall() {
68369
+ return get(ctxMenuWall);
68370
+ },
68371
+ get targetFurniture() {
68372
+ return get(ctxMenuFurniture);
68373
+ },
68374
+ get targetRoom() {
68375
+ return get(ctxMenuRoom);
68376
+ },
68377
+ get clipboard() {
68378
+ return get(clipboard);
68379
+ },
68380
+ onclose: () => {
68381
+ set(ctxMenuVisible, false);
68382
+ },
68383
+ onaction: handleContextMenuAction
68384
+ });
68385
+ template_effect(($0, $1) => {
68386
+ set_text(text_8, `Zoom: ${$0 !== null && $0 !== void 0 ? $0 : ""}%`);
68387
+ set_text(text_9, `${get(showGrid) ? "▦" : "▢"} Grid`);
68388
+ set_text(text_10, `${get(currentSnapToGrid) ? "🧲" : "↔"} Snap`);
68389
+ set_text(text_11, `${get(showFurniture) ? "🪑" : "👻"} Furniture`);
68390
+ set_text(text_12, `${get(showRulers) ? "📏" : "📐"} Rulers`);
68391
+ set_text(text_17, `${$1 !== null && $1 !== void 0 ? $1 : ""}%`);
68392
+ }, [() => Math.round(get(zoom) * 100), () => Math.round(get(zoom) * 100)]);
68393
+ delegated("click", button, () => zoomToFit());
68394
+ delegated("click", button_1, () => set(showGrid, !get(showGrid)));
68395
+ delegated("click", button_2, () => projectSettings.update((s) => ({
68396
+ ...s,
68397
+ snapToGrid: !s.snapToGrid
68398
+ })));
68399
+ delegated("click", button_3, () => layerVisibility.update((v) => ({
68400
+ ...v,
68401
+ furniture: !v.furniture
68402
+ })));
68403
+ delegated("click", button_4, () => set(showLayerPanel, !get(showLayerPanel)));
68404
+ delegated("click", button_5, () => set(showRulers, !get(showRulers)));
68405
+ delegated("click", button_6, () => set(showMinimap, !get(showMinimap)));
68406
+ delegated("click", button_11, () => {
68407
+ const newZoom = Math.max(.1, get(zoom) * .8);
68408
+ const worldCX = (get(width) / 2 - get(width) / 2) / get(zoom) + get(camX);
68409
+ const worldCY = (get(height) / 2 - get(height) / 2) / get(zoom) + get(camY);
68410
+ set(camX, worldCX - (get(width) / 2 - get(width) / 2) / newZoom);
68411
+ set(camY, worldCY - (get(height) / 2 - get(height) / 2) / newZoom);
68412
+ set(zoom, newZoom, true);
68413
+ });
68414
+ delegated("click", button_12, () => {
68415
+ set(zoom, 1);
68416
+ });
68417
+ delegated("click", button_13, () => {
68418
+ set(zoom, Math.min(10, get(zoom) * 1.25), true);
68419
+ });
68420
+ delegated("click", button_14, () => zoomToFit());
68421
+ append($$anchor, fragment);
68328
68422
  };
68329
- if_block(node_20, ($$render) => {
68330
- if (get(annotating)) $$render(consequent_19);
68331
- });
68332
- var div_10 = sibling(node_20, 2);
68333
- var button_11 = child(div_10);
68334
- var button_12 = sibling(button_11, 2);
68335
- var text_17 = child(button_12);
68336
- reset(button_12);
68337
- var button_13 = sibling(button_12, 2);
68338
- var button_14 = sibling(button_13, 4);
68339
- reset(div_10);
68340
- ContextMenu(sibling(div_10, 2), {
68341
- get x() {
68342
- return get(ctxMenuX);
68343
- },
68344
- get y() {
68345
- return get(ctxMenuY);
68346
- },
68347
- get visible() {
68348
- return get(ctxMenuVisible);
68349
- },
68350
- get targetType() {
68351
- return get(ctxMenuTargetType);
68352
- },
68353
- get targetId() {
68354
- return get(ctxMenuTargetId);
68355
- },
68356
- get targetWall() {
68357
- return get(ctxMenuWall);
68358
- },
68359
- get targetFurniture() {
68360
- return get(ctxMenuFurniture);
68361
- },
68362
- get targetRoom() {
68363
- return get(ctxMenuRoom);
68364
- },
68365
- get clipboard() {
68366
- return get(clipboard);
68367
- },
68368
- onclose: () => {
68369
- set(ctxMenuVisible, false);
68370
- },
68371
- onaction: handleContextMenuAction
68423
+ if_block(node, ($$render) => {
68424
+ if (!$$props.viewOnly) $$render(consequent_20);
68372
68425
  });
68373
68426
  reset(div);
68374
- template_effect(($0, $1) => {
68427
+ template_effect(() => {
68375
68428
  var _$$get14;
68376
- set_style(canvas_1, `cursor: ${(_$$get14 = get(cursorStyle)) !== null && _$$get14 !== void 0 ? _$$get14 : ""}`);
68377
- set_text(text_8, `Zoom: ${$0 !== null && $0 !== void 0 ? $0 : ""}%`);
68378
- set_text(text_9, `${get(showGrid) ? "▦" : "▢"} Grid`);
68379
- set_text(text_10, `${get(currentSnapToGrid) ? "🧲" : "↔"} Snap`);
68380
- set_text(text_11, `${get(showFurniture) ? "🪑" : "👻"} Furniture`);
68381
- set_text(text_12, `${get(showRulers) ? "📏" : "📐"} Rulers`);
68382
- set_text(text_17, `${$1 !== null && $1 !== void 0 ? $1 : ""}%`);
68383
- }, [() => Math.round(get(zoom) * 100), () => Math.round(get(zoom) * 100)]);
68429
+ return set_style(canvas_1, `cursor: ${(_$$get14 = get(cursorStyle)) !== null && _$$get14 !== void 0 ? _$$get14 : ""}`);
68430
+ });
68384
68431
  delegated("mousedown", canvas_1, onMouseDown);
68385
68432
  delegated("mousemove", canvas_1, onMouseMove);
68386
68433
  delegated("mouseup", canvas_1, onMouseUp);
@@ -68390,34 +68437,6 @@ function FloorPlanCanvas($$anchor, $$props) {
68390
68437
  event("dragover", canvas_1, onDragOver);
68391
68438
  event("dragleave", canvas_1, onDragLeave);
68392
68439
  event("drop", canvas_1, onDrop);
68393
- delegated("click", button, () => zoomToFit());
68394
- delegated("click", button_1, () => set(showGrid, !get(showGrid)));
68395
- delegated("click", button_2, () => projectSettings.update((s) => ({
68396
- ...s,
68397
- snapToGrid: !s.snapToGrid
68398
- })));
68399
- delegated("click", button_3, () => layerVisibility.update((v) => ({
68400
- ...v,
68401
- furniture: !v.furniture
68402
- })));
68403
- delegated("click", button_4, () => set(showLayerPanel, !get(showLayerPanel)));
68404
- delegated("click", button_5, () => set(showRulers, !get(showRulers)));
68405
- delegated("click", button_6, () => set(showMinimap, !get(showMinimap)));
68406
- delegated("click", button_11, () => {
68407
- const newZoom = Math.max(.1, get(zoom) * .8);
68408
- const worldCX = (get(width) / 2 - get(width) / 2) / get(zoom) + get(camX);
68409
- const worldCY = (get(height) / 2 - get(height) / 2) / get(zoom) + get(camY);
68410
- set(camX, worldCX - (get(width) / 2 - get(width) / 2) / newZoom);
68411
- set(camY, worldCY - (get(height) / 2 - get(height) / 2) / newZoom);
68412
- set(zoom, newZoom, true);
68413
- });
68414
- delegated("click", button_12, () => {
68415
- set(zoom, 1);
68416
- });
68417
- delegated("click", button_13, () => {
68418
- set(zoom, Math.min(10, get(zoom) * 1.25), true);
68419
- });
68420
- delegated("click", button_14, () => zoomToFit());
68421
68440
  append($$anchor, div);
68422
68441
  pop();
68423
68442
  $$cleanup();
@@ -68555,7 +68574,7 @@ function alignElements(ids, op) {
68555
68574
  //#endregion
68556
68575
  //#region src/lib/components/editor/AlignmentToolbar.svelte
68557
68576
  init_client();
68558
- var root_3$2 = /* @__PURE__ */ from_html(`<div class="w-px h-5 bg-gray-200 mx-0.5"></div>`);
68577
+ var root_3$1 = /* @__PURE__ */ from_html(`<div class="w-px h-5 bg-gray-200 mx-0.5"></div>`);
68559
68578
  var root_2$2 = /* @__PURE__ */ from_html(`<button class="w-7 h-7 flex items-center justify-center rounded hover:bg-blue-50 text-gray-500 hover:text-blue-600 transition-colors"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><path></path></svg></button> <!>`, 1);
68560
68579
  var root_1$4 = /* @__PURE__ */ from_html(`<div class="fixed top-16 left-1/2 -translate-x-1/2 z-50 flex items-center gap-0.5 bg-white rounded-lg shadow-lg border border-gray-200 px-1.5 py-1"><span class="text-xs text-gray-400 px-1 select-none"> </span> <div class="w-px h-5 bg-gray-200 mx-0.5"></div> <!></div>`);
68561
68580
  function AlignmentToolbar($$anchor, $$props) {
@@ -68629,7 +68648,7 @@ function AlignmentToolbar($$anchor, $$props) {
68629
68648
  reset(button);
68630
68649
  var node_2 = sibling(button, 2);
68631
68650
  var consequent = ($$anchor) => {
68632
- append($$anchor, root_3$2());
68651
+ append($$anchor, root_3$1());
68633
68652
  };
68634
68653
  if_block(node_2, ($$render) => {
68635
68654
  if (get(btn).op === "align-right" || get(btn).op === "align-bottom") $$render(consequent);
@@ -68660,7 +68679,7 @@ delegate(["click"]);
68660
68679
  //#region src/lib/components/editor/CommandPalette.svelte
68661
68680
  init_client();
68662
68681
  var root_2$1 = /* @__PURE__ */ from_html(`<div class="px-4 py-6 text-center text-sm text-gray-400">No results found</div>`);
68663
- var root_4$1 = /* @__PURE__ */ from_html(`<div role="option"><span class="text-base w-6 text-center flex-shrink-0"> </span> <span class="flex-1 truncate"> </span> <span class="text-xs text-gray-400 flex-shrink-0"> </span></div>`);
68682
+ var root_4$2 = /* @__PURE__ */ from_html(`<div role="option"><span class="text-base w-6 text-center flex-shrink-0"> </span> <span class="flex-1 truncate"> </span> <span class="text-xs text-gray-400 flex-shrink-0"> </span></div>`);
68664
68683
  var root_1$3 = /* @__PURE__ */ from_html(`<div class="fixed inset-0 bg-black/40 z-[100] flex justify-center" role="dialog" aria-label="Command Palette"><div class="mt-[15vh] w-full max-w-lg h-fit bg-white rounded-xl shadow-2xl overflow-hidden" role="listbox"><div class="flex items-center gap-2 px-4 py-3 border-b border-gray-200"><span class="text-gray-400 text-lg">🔍</span> <input class="flex-1 bg-transparent outline-none text-sm text-gray-800 placeholder-gray-400" placeholder="Search furniture, tools, actions…" type="text" spellcheck="false"/> <kbd class="text-[10px] px-1.5 py-0.5 bg-gray-100 rounded border border-gray-200 text-gray-400">ESC</kbd></div> <div class="max-h-[50vh] overflow-y-auto"><!></div> <div class="px-4 py-2 border-t border-gray-100 flex items-center gap-3 text-[10px] text-gray-400"><span><kbd class="px-1 py-0.5 bg-gray-100 rounded border border-gray-200">↑↓</kbd> navigate</span> <span><kbd class="px-1 py-0.5 bg-gray-100 rounded border border-gray-200">↵</kbd> select</span> <span><kbd class="px-1 py-0.5 bg-gray-100 rounded border border-gray-200">esc</kbd> close</span></div></div></div>`);
68665
68684
  function CommandPalette($$anchor, $$props) {
68666
68685
  push($$props, true);
@@ -68921,7 +68940,7 @@ function CommandPalette($$anchor, $$props) {
68921
68940
  var alternate = ($$anchor) => {
68922
68941
  var fragment_1 = comment();
68923
68942
  each(first_child(fragment_1), 17, () => get(results), index$1, ($$anchor, item, i) => {
68924
- var div_5 = root_4$1();
68943
+ var div_5 = root_4$2();
68925
68944
  let classes;
68926
68945
  var span = child(div_5);
68927
68946
  var text = child(span, true);
@@ -68981,8 +69000,8 @@ delegate(["click", "keydown"]);
68981
69000
  init_client();
68982
69001
  init_index_client();
68983
69002
  var root_2 = /* @__PURE__ */ from_html(`<option> </option>`);
68984
- var root_4 = /* @__PURE__ */ from_html(`<div class="flex justify-between"><span class="text-slate-600"> </span> <span class="text-slate-800 font-medium ml-2"> </span></div>`);
68985
- var root_3$1 = /* @__PURE__ */ from_html(`<div class="border-t border-slate-300 pt-3 mt-2 print-legend"><h3 class="text-xs font-bold text-slate-700 uppercase tracking-wide mb-2">Room Schedule</h3> <div class="grid grid-cols-3 gap-x-6 gap-y-1 text-xs"></div></div>`);
69003
+ var root_4$1 = /* @__PURE__ */ from_html(`<div class="flex justify-between"><span class="text-slate-600"> </span> <span class="text-slate-800 font-medium ml-2"> </span></div>`);
69004
+ var root_3 = /* @__PURE__ */ from_html(`<div class="border-t border-slate-300 pt-3 mt-2 print-legend"><h3 class="text-xs font-bold text-slate-700 uppercase tracking-wide mb-2">Room Schedule</h3> <div class="grid grid-cols-3 gap-x-6 gap-y-1 text-xs"></div></div>`);
68986
69005
  var root_1$2 = /* @__PURE__ */ from_html(`<div class="fixed inset-0 bg-black/60 z-[100] flex items-start justify-center overflow-auto print-overlay-backdrop"><div class="fixed top-0 left-0 right-0 bg-slate-800 text-white px-6 py-3 flex items-center gap-4 z-[101] print-hide"><h3 class="font-semibold text-sm">Print Preview</h3> <div class="h-4 w-px bg-white/20"></div> <label class="text-xs text-white/70">Page: <select class="ml-1 bg-slate-700 text-white text-xs rounded px-2 py-1 border border-slate-600"><option>Letter</option><option>A4</option></select></label> <label class="text-xs text-white/70">Orientation: <select class="ml-1 bg-slate-700 text-white text-xs rounded px-2 py-1 border border-slate-600"><option>Landscape</option><option>Portrait</option></select></label> <label class="text-xs text-white/70">Scale: <select class="ml-1 bg-slate-700 text-white text-xs rounded px-2 py-1 border border-slate-600"></select></label> <div class="flex-1"></div> <button class="px-4 py-1.5 bg-blue-500 hover:bg-blue-600 text-white text-sm font-semibold rounded-lg transition-colors flex items-center gap-2"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="6 9 6 2 18 2 18 9"></polyline><path d="M6 18H4a2 2 0 0 1-2-2v-5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v5a2 2 0 0 1-2 2h-2"></path><rect x="6" y="14" width="12" height="8"></rect></svg> Print</button> <button class="px-3 py-1.5 text-white/70 hover:text-white text-sm transition-colors">✕ Close</button></div> <div><div class="border-b-2 border-slate-800 pb-3 mb-4 flex items-end justify-between print-title-block"><div><h1 class="text-xl font-bold text-slate-800"> </h1> <p class="text-sm text-slate-500"> </p></div> <div class="text-right text-xs text-slate-500"><p class="font-semibold text-slate-700"> </p> <p> </p></div></div> <div class="flex-1 relative print-canvas-container svelte-67xe6d"><canvas class="w-full svelte-67xe6d" style="height: calc(100% - 20px);"></canvas> <div class="absolute top-2 right-2 print-north-arrow"><svg width="40" height="40" viewBox="0 0 40 40"><polygon points="20,2 24,16 20,12 16,16" fill="#1e293b"></polygon><polygon points="20,38 24,24 20,28 16,24" fill="#94a3b8"></polygon><text x="20" y="10" text-anchor="middle" fill="#1e293b" font-size="8" font-weight="bold">N</text></svg></div> <div class="absolute bottom-1 left-2 flex items-center gap-2 text-[10px] text-slate-600 print-scale-bar"><div class="flex items-end gap-0"><div class="w-12 h-1 bg-slate-800"></div> <div class="w-12 h-1 bg-slate-400"></div></div> <span> </span></div></div> <!> <div class="border-t border-slate-200 pt-2 mt-3 flex justify-between text-[9px] text-slate-400 print-footer"><span>Generated by Open3D Floorplan</span> <span>Page 1 of 1</span></div></div></div>`);
68987
69006
  function PrintLayout($$anchor, $$props) {
68988
69007
  push($$props, true);
@@ -69256,10 +69275,10 @@ function PrintLayout($$anchor, $$props) {
69256
69275
  reset(div_6);
69257
69276
  var node_1 = sibling(div_6, 2);
69258
69277
  var consequent = ($$anchor) => {
69259
- var div_8 = root_3$1();
69278
+ var div_8 = root_3();
69260
69279
  var div_9 = sibling(child(div_8), 2);
69261
69280
  each(div_9, 21, getRooms, index$1, ($$anchor, room) => {
69262
- var div_10 = root_4();
69281
+ var div_10 = root_4$1();
69263
69282
  var span_1 = child(div_10);
69264
69283
  var text_6 = child(span_1, true);
69265
69284
  reset(span_1);
@@ -69394,10 +69413,10 @@ delegate(["click"]);
69394
69413
  //#region src/App.svelte
69395
69414
  init_client();
69396
69415
  init_index_client();
69397
- var root_3 = /* @__PURE__ */ from_html(`<!> <!>`, 1);
69398
- var root_5 = /* @__PURE__ */ from_html(`<div class="fixed inset-0 bg-black/50 flex items-center justify-center z-50" role="dialog" tabindex="-1" aria-label="Keyboard Shortcuts"><div class="bg-white rounded-2xl shadow-2xl max-w-2xl w-full mx-4 max-h-[85vh] flex flex-col" role="document"><div class="flex items-center justify-between px-6 pt-5 pb-3 border-b border-gray-100"><div class="flex items-center gap-2"><svg class="w-5 h-5 text-slate-600" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707"></path></svg> <h2 class="text-lg font-bold text-slate-800">Keyboard Shortcuts</h2></div> <div class="flex items-center gap-2"><button class="text-xs px-3 py-1.5 rounded-lg bg-slate-100 hover:bg-slate-200 text-slate-600 hover:text-slate-800 transition-colors flex items-center gap-1.5" aria-label="Copy all shortcuts"><svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"></path></svg> Copy All</button> <button class="text-gray-400 hover:text-gray-600 text-xl leading-none" aria-label="Close shortcuts">✕</button></div></div> <div class="overflow-y-auto px-6 py-4"><div class="grid grid-cols-2 gap-x-8 gap-y-0 text-sm"><div><div class="flex items-center gap-2 mb-2"><span class="text-xs font-bold uppercase tracking-wider text-indigo-500">Tools</span> <div class="flex-1 h-px bg-indigo-100"></div></div> <div class="space-y-1.5 mb-5"><div class="flex justify-between"><span class="text-gray-600">Select tool</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">V</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Wall tool</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">W</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Door tool</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">D</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Pan mode</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">H</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Measure tool</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">M</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Annotate tool</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">N</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Text tool</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">T</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Toggle snap</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">S</kbd></div></div> <div class="flex items-center gap-2 mb-2"><span class="text-xs font-bold uppercase tracking-wider text-amber-500">Edit</span> <div class="flex-1 h-px bg-amber-100"></div></div> <div class="space-y-1.5 mb-5"><div class="flex justify-between"><span class="text-gray-600">Undo</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">Ctrl+Z</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Redo</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">Ctrl+Y</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Copy</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">Ctrl+C</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Paste</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">Ctrl+V</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Select all</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">Ctrl+A</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Deselect all</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">Ctrl+D</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Save project</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">Ctrl+S</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Cancel / Deselect</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">Esc</kbd></div></div></div> <div><div class="flex items-center gap-2 mb-2"><span class="text-xs font-bold uppercase tracking-wider text-emerald-500">Elements</span> <div class="flex-1 h-px bg-emerald-100"></div></div> <div class="space-y-1.5 mb-5"><div class="flex justify-between"><span class="text-gray-600">Rotate element</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">R</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Delete selected</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">Del</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Lock / Unlock</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">Ctrl+L</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Group selection</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">Ctrl+G</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Ungroup</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">Ctrl+⇧+G</kbd></div></div> <div class="flex items-center gap-2 mb-2"><span class="text-xs font-bold uppercase tracking-wider text-blue-500">View</span> <div class="flex-1 h-px bg-blue-100"></div></div> <div class="space-y-1.5 mb-5"><div class="flex justify-between"><span class="text-gray-600">Toggle 2D / 3D</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">Tab</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Zoom to fit</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">F</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Toggle grid</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">G</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Toggle layers</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">L</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Show shortcuts</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">?</kbd></div></div> <div class="flex items-center gap-2 mb-2"><span class="text-xs font-bold uppercase tracking-wider text-purple-500">Canvas</span> <div class="flex-1 h-px bg-purple-100"></div></div> <div class="space-y-1.5 mb-5"><div class="flex justify-between"><span class="text-gray-600">Zoom in / out</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">Scroll</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Zoom in / out</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">+ / −</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Pan canvas</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">Space+Drag</kbd></div></div> <div class="flex items-center gap-2 mb-2"><span class="text-xs font-bold uppercase tracking-wider text-rose-500">Walls</span> <div class="flex-1 h-px bg-rose-100"></div></div> <div class="space-y-1.5"><div class="flex justify-between"><span class="text-gray-600">Finish wall chain</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">Dbl-click</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Close wall loop</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">C</kbd></div></div></div></div></div> <div class="px-6 py-3 border-t border-gray-100 text-center"><p class="text-xs text-gray-400">Press <kbd class="px-1 py-0.5 bg-gray-100 rounded text-xs font-mono border border-gray-200">?</kbd> or <kbd class="px-1 py-0.5 bg-gray-100 rounded text-xs font-mono border border-gray-200">Esc</kbd> to close</p></div></div></div>`);
69399
- var root_1 = /* @__PURE__ */ from_html(`<div class="h-screen flex flex-col overflow-hidden"><!> <div class="flex flex-1 overflow-hidden"><!> <div class="flex-1 min-w-0 relative"><!></div> <!> <!></div></div> <!> <!> <!> <!> <!>`, 1);
69400
- var root_6 = /* @__PURE__ */ from_html(`<div class="h-screen flex items-center justify-center"><p class="text-gray-400">Loading...</p></div>`);
69416
+ var root_4 = /* @__PURE__ */ from_html(`<!> <!>`, 1);
69417
+ var root_7 = /* @__PURE__ */ from_html(`<div class="fixed inset-0 bg-black/50 flex items-center justify-center z-50" role="dialog" tabindex="-1" aria-label="Keyboard Shortcuts"><div class="bg-white rounded-2xl shadow-2xl max-w-2xl w-full mx-4 max-h-[85vh] flex flex-col" role="document"><div class="flex items-center justify-between px-6 pt-5 pb-3 border-b border-gray-100"><div class="flex items-center gap-2"><svg class="w-5 h-5 text-slate-600" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707"></path></svg> <h2 class="text-lg font-bold text-slate-800">Keyboard Shortcuts</h2></div> <div class="flex items-center gap-2"><button class="text-xs px-3 py-1.5 rounded-lg bg-slate-100 hover:bg-slate-200 text-slate-600 hover:text-slate-800 transition-colors flex items-center gap-1.5" aria-label="Copy all shortcuts"><svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"></path></svg> Copy All</button> <button class="text-gray-400 hover:text-gray-600 text-xl leading-none" aria-label="Close shortcuts">✕</button></div></div> <div class="overflow-y-auto px-6 py-4"><div class="grid grid-cols-2 gap-x-8 gap-y-0 text-sm"><div><div class="flex items-center gap-2 mb-2"><span class="text-xs font-bold uppercase tracking-wider text-indigo-500">Tools</span> <div class="flex-1 h-px bg-indigo-100"></div></div> <div class="space-y-1.5 mb-5"><div class="flex justify-between"><span class="text-gray-600">Select tool</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">V</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Wall tool</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">W</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Door tool</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">D</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Pan mode</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">H</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Measure tool</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">M</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Annotate tool</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">N</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Text tool</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">T</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Toggle snap</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">S</kbd></div></div> <div class="flex items-center gap-2 mb-2"><span class="text-xs font-bold uppercase tracking-wider text-amber-500">Edit</span> <div class="flex-1 h-px bg-amber-100"></div></div> <div class="space-y-1.5 mb-5"><div class="flex justify-between"><span class="text-gray-600">Undo</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">Ctrl+Z</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Redo</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">Ctrl+Y</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Copy</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">Ctrl+C</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Paste</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">Ctrl+V</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Select all</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">Ctrl+A</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Deselect all</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">Ctrl+D</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Save project</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">Ctrl+S</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Cancel / Deselect</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">Esc</kbd></div></div></div> <div><div class="flex items-center gap-2 mb-2"><span class="text-xs font-bold uppercase tracking-wider text-emerald-500">Elements</span> <div class="flex-1 h-px bg-emerald-100"></div></div> <div class="space-y-1.5 mb-5"><div class="flex justify-between"><span class="text-gray-600">Rotate element</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">R</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Delete selected</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">Del</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Lock / Unlock</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">Ctrl+L</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Group selection</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">Ctrl+G</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Ungroup</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">Ctrl+⇧+G</kbd></div></div> <div class="flex items-center gap-2 mb-2"><span class="text-xs font-bold uppercase tracking-wider text-blue-500">View</span> <div class="flex-1 h-px bg-blue-100"></div></div> <div class="space-y-1.5 mb-5"><div class="flex justify-between"><span class="text-gray-600">Toggle 2D / 3D</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">Tab</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Zoom to fit</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">F</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Toggle grid</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">G</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Toggle layers</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">L</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Show shortcuts</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">?</kbd></div></div> <div class="flex items-center gap-2 mb-2"><span class="text-xs font-bold uppercase tracking-wider text-purple-500">Canvas</span> <div class="flex-1 h-px bg-purple-100"></div></div> <div class="space-y-1.5 mb-5"><div class="flex justify-between"><span class="text-gray-600">Zoom in / out</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">Scroll</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Zoom in / out</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">+ / −</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Pan canvas</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">Space+Drag</kbd></div></div> <div class="flex items-center gap-2 mb-2"><span class="text-xs font-bold uppercase tracking-wider text-rose-500">Walls</span> <div class="flex-1 h-px bg-rose-100"></div></div> <div class="space-y-1.5"><div class="flex justify-between"><span class="text-gray-600">Finish wall chain</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">Dbl-click</kbd></div> <div class="flex justify-between"><span class="text-gray-600">Close wall loop</span><kbd class="px-1.5 py-0.5 bg-gray-100 rounded text-xs font-mono text-slate-700 border border-gray-200">C</kbd></div></div></div></div></div> <div class="px-6 py-3 border-t border-gray-100 text-center"><p class="text-xs text-gray-400">Press <kbd class="px-1 py-0.5 bg-gray-100 rounded text-xs font-mono border border-gray-200">?</kbd> or <kbd class="px-1 py-0.5 bg-gray-100 rounded text-xs font-mono border border-gray-200">Esc</kbd> to close</p></div></div></div>`);
69418
+ var root_1 = /* @__PURE__ */ from_html(`<div class="h-full flex flex-col overflow-hidden"><!> <div class="flex flex-1 overflow-hidden"><!> <div class="flex-1 min-w-0 relative"><!></div> <!> <!></div></div> <!> <!> <!> <!> <!>`, 1);
69419
+ var root_8 = /* @__PURE__ */ from_html(`<div class="h-screen flex items-center justify-center"><p class="text-gray-400">Loading...</p></div>`);
69401
69420
  function App($$anchor, $$props) {
69402
69421
  var _$$props$stores, _$$props$stores2;
69403
69422
  push($$props, true);
@@ -69417,256 +69436,256 @@ function App($$anchor, $$props) {
69417
69436
  });
69418
69437
  user_effect(() => {
69419
69438
  currentProject.set({
69420
- "id": "0retn2ek",
69421
- "name": "L-Shaped House",
69422
- "floors": [{
69423
- "id": "1fg6pga0",
69424
- "name": "Ground Floor",
69425
- "level": 0,
69426
- "walls": [
69439
+ id: "0retn2ek",
69440
+ name: "L-Shaped House",
69441
+ floors: [{
69442
+ id: "1fg6pga0",
69443
+ name: "Ground Floor",
69444
+ level: 0,
69445
+ walls: [
69427
69446
  {
69428
- "id": "lg5h806h",
69429
- "start": {
69430
- "x": 0,
69431
- "y": 0
69447
+ id: "lg5h806h",
69448
+ start: {
69449
+ x: 0,
69450
+ y: 0
69432
69451
  },
69433
- "end": {
69434
- "x": 1400,
69435
- "y": 0
69452
+ end: {
69453
+ x: 1400,
69454
+ y: 0
69436
69455
  },
69437
- "thickness": 15,
69438
- "height": 280,
69439
- "color": "#444444"
69456
+ thickness: 15,
69457
+ height: 280,
69458
+ color: "#444444"
69440
69459
  },
69441
69460
  {
69442
- "id": "whcf9cv2",
69443
- "start": {
69444
- "x": 1400,
69445
- "y": 0
69461
+ id: "whcf9cv2",
69462
+ start: {
69463
+ x: 1400,
69464
+ y: 0
69446
69465
  },
69447
- "end": {
69448
- "x": 1400,
69449
- "y": 600
69466
+ end: {
69467
+ x: 1400,
69468
+ y: 600
69450
69469
  },
69451
- "thickness": 15,
69452
- "height": 280,
69453
- "color": "#444444"
69470
+ thickness: 15,
69471
+ height: 280,
69472
+ color: "#444444"
69454
69473
  },
69455
69474
  {
69456
- "id": "phvbebmu",
69457
- "start": {
69458
- "x": 1400,
69459
- "y": 600
69475
+ id: "phvbebmu",
69476
+ start: {
69477
+ x: 1400,
69478
+ y: 600
69460
69479
  },
69461
- "end": {
69462
- "x": 600,
69463
- "y": 600
69480
+ end: {
69481
+ x: 600,
69482
+ y: 600
69464
69483
  },
69465
- "thickness": 15,
69466
- "height": 280,
69467
- "color": "#444444"
69484
+ thickness: 15,
69485
+ height: 280,
69486
+ color: "#444444"
69468
69487
  },
69469
69488
  {
69470
- "id": "xaxhdtmi",
69471
- "start": {
69472
- "x": 600,
69473
- "y": 600
69489
+ id: "xaxhdtmi",
69490
+ start: {
69491
+ x: 600,
69492
+ y: 600
69474
69493
  },
69475
- "end": {
69476
- "x": 600,
69477
- "y": 1100
69494
+ end: {
69495
+ x: 600,
69496
+ y: 1100
69478
69497
  },
69479
- "thickness": 15,
69480
- "height": 280,
69481
- "color": "#444444"
69498
+ thickness: 15,
69499
+ height: 280,
69500
+ color: "#444444"
69482
69501
  },
69483
69502
  {
69484
- "id": "cs1poy28",
69485
- "start": {
69486
- "x": 600,
69487
- "y": 1100
69503
+ id: "cs1poy28",
69504
+ start: {
69505
+ x: 600,
69506
+ y: 1100
69488
69507
  },
69489
- "end": {
69490
- "x": 0,
69491
- "y": 1100
69508
+ end: {
69509
+ x: 0,
69510
+ y: 1100
69492
69511
  },
69493
- "thickness": 15,
69494
- "height": 280,
69495
- "color": "#444444"
69512
+ thickness: 15,
69513
+ height: 280,
69514
+ color: "#444444"
69496
69515
  },
69497
69516
  {
69498
- "id": "irjmbyqg",
69499
- "start": {
69500
- "x": 0,
69501
- "y": 1100
69517
+ id: "irjmbyqg",
69518
+ start: {
69519
+ x: 0,
69520
+ y: 1100
69502
69521
  },
69503
- "end": {
69504
- "x": 0,
69505
- "y": 0
69522
+ end: {
69523
+ x: 0,
69524
+ y: 0
69506
69525
  },
69507
- "thickness": 15,
69508
- "height": 280,
69509
- "color": "#444444"
69526
+ thickness: 15,
69527
+ height: 280,
69528
+ color: "#444444"
69510
69529
  },
69511
69530
  {
69512
- "id": "n45rb09q",
69513
- "start": {
69514
- "x": 350,
69515
- "y": 600
69531
+ id: "n45rb09q",
69532
+ start: {
69533
+ x: 350,
69534
+ y: 600
69516
69535
  },
69517
- "end": {
69518
- "x": 350,
69519
- "y": 1100
69536
+ end: {
69537
+ x: 350,
69538
+ y: 1100
69520
69539
  },
69521
- "thickness": 15,
69522
- "height": 280,
69523
- "color": "#444444"
69540
+ thickness: 15,
69541
+ height: 280,
69542
+ color: "#444444"
69524
69543
  },
69525
69544
  {
69526
- "id": "mrcejzip",
69527
- "start": {
69528
- "x": 0,
69529
- "y": 600
69545
+ id: "mrcejzip",
69546
+ start: {
69547
+ x: 0,
69548
+ y: 600
69530
69549
  },
69531
- "end": {
69532
- "x": 350,
69533
- "y": 600
69550
+ end: {
69551
+ x: 350,
69552
+ y: 600
69534
69553
  },
69535
- "thickness": 15,
69536
- "height": 280,
69537
- "color": "#444444"
69554
+ thickness: 15,
69555
+ height: 280,
69556
+ color: "#444444"
69538
69557
  },
69539
69558
  {
69540
- "id": "s0j86ogg",
69541
- "start": {
69542
- "x": 400,
69543
- "y": 0
69559
+ id: "s0j86ogg",
69560
+ start: {
69561
+ x: 400,
69562
+ y: 0
69544
69563
  },
69545
- "end": {
69546
- "x": 400,
69547
- "y": 350
69564
+ end: {
69565
+ x: 400,
69566
+ y: 350
69548
69567
  },
69549
- "thickness": 15,
69550
- "height": 280,
69551
- "color": "#444444"
69568
+ thickness: 15,
69569
+ height: 280,
69570
+ color: "#444444"
69552
69571
  },
69553
69572
  {
69554
- "id": "9779xycw",
69555
- "start": {
69556
- "x": 0,
69557
- "y": 350
69573
+ id: "9779xycw",
69574
+ start: {
69575
+ x: 0,
69576
+ y: 350
69558
69577
  },
69559
- "end": {
69560
- "x": 400,
69561
- "y": 350
69578
+ end: {
69579
+ x: 400,
69580
+ y: 350
69562
69581
  },
69563
- "thickness": 15,
69564
- "height": 280,
69565
- "color": "#444444"
69582
+ thickness: 15,
69583
+ height: 280,
69584
+ color: "#444444"
69566
69585
  },
69567
69586
  {
69568
- "id": "epl8xjo0",
69569
- "start": {
69570
- "x": 800,
69571
- "y": 0
69587
+ id: "epl8xjo0",
69588
+ start: {
69589
+ x: 800,
69590
+ y: 0
69572
69591
  },
69573
- "end": {
69574
- "x": 800,
69575
- "y": 350
69592
+ end: {
69593
+ x: 800,
69594
+ y: 350
69576
69595
  },
69577
- "thickness": 15,
69578
- "height": 280,
69579
- "color": "#444444"
69596
+ thickness: 15,
69597
+ height: 280,
69598
+ color: "#444444"
69580
69599
  },
69581
69600
  {
69582
- "id": "pw24r5jz",
69583
- "start": {
69584
- "x": 400,
69585
- "y": 350
69601
+ id: "pw24r5jz",
69602
+ start: {
69603
+ x: 400,
69604
+ y: 350
69586
69605
  },
69587
- "end": {
69588
- "x": 800,
69589
- "y": 350
69606
+ end: {
69607
+ x: 800,
69608
+ y: 350
69590
69609
  },
69591
- "thickness": 15,
69592
- "height": 280,
69593
- "color": "#444444"
69610
+ thickness: 15,
69611
+ height: 280,
69612
+ color: "#444444"
69594
69613
  },
69595
69614
  {
69596
- "id": "xvghl92m",
69597
- "start": {
69598
- "x": 800,
69599
- "y": 350
69615
+ id: "xvghl92m",
69616
+ start: {
69617
+ x: 800,
69618
+ y: 350
69600
69619
  },
69601
- "end": {
69602
- "x": 1400,
69603
- "y": 350
69620
+ end: {
69621
+ x: 1400,
69622
+ y: 350
69604
69623
  },
69605
- "thickness": 15,
69606
- "height": 280,
69607
- "color": "#444444"
69624
+ thickness: 15,
69625
+ height: 280,
69626
+ color: "#444444"
69608
69627
  },
69609
69628
  {
69610
- "id": "j5kb9mas",
69611
- "start": {
69612
- "x": 200,
69613
- "y": 350
69629
+ id: "j5kb9mas",
69630
+ start: {
69631
+ x: 200,
69632
+ y: 350
69614
69633
  },
69615
- "end": {
69616
- "x": 200,
69617
- "y": 600
69634
+ end: {
69635
+ x: 200,
69636
+ y: 600
69618
69637
  },
69619
- "thickness": 15,
69620
- "height": 280,
69621
- "color": "#444444"
69638
+ thickness: 15,
69639
+ height: 280,
69640
+ color: "#444444"
69622
69641
  },
69623
69642
  {
69624
- "id": "lryeizdx",
69625
- "start": {
69626
- "x": 0,
69627
- "y": 600
69643
+ id: "lryeizdx",
69644
+ start: {
69645
+ x: 0,
69646
+ y: 600
69628
69647
  },
69629
- "end": {
69630
- "x": 200,
69631
- "y": 600
69648
+ end: {
69649
+ x: 200,
69650
+ y: 600
69632
69651
  },
69633
- "thickness": 15,
69634
- "height": 280,
69635
- "color": "#444444"
69652
+ thickness: 15,
69653
+ height: 280,
69654
+ color: "#444444"
69636
69655
  },
69637
69656
  {
69638
- "id": "zp1xe5hf",
69639
- "start": {
69640
- "x": 1e3,
69641
- "y": 350
69657
+ id: "zp1xe5hf",
69658
+ start: {
69659
+ x: 1e3,
69660
+ y: 350
69642
69661
  },
69643
- "end": {
69644
- "x": 1e3,
69645
- "y": 600
69662
+ end: {
69663
+ x: 1e3,
69664
+ y: 600
69646
69665
  },
69647
- "thickness": 15,
69648
- "height": 280,
69649
- "color": "#444444"
69666
+ thickness: 15,
69667
+ height: 280,
69668
+ color: "#444444"
69650
69669
  },
69651
69670
  {
69652
- "id": "2cvf9bma",
69653
- "start": {
69654
- "x": 200,
69655
- "y": 350
69671
+ id: "2cvf9bma",
69672
+ start: {
69673
+ x: 200,
69674
+ y: 350
69656
69675
  },
69657
- "end": {
69658
- "x": 200,
69659
- "y": 600
69676
+ end: {
69677
+ x: 200,
69678
+ y: 600
69660
69679
  },
69661
- "thickness": 15,
69662
- "height": 280,
69663
- "color": "#444444"
69680
+ thickness: 15,
69681
+ height: 280,
69682
+ color: "#444444"
69664
69683
  }
69665
69684
  ],
69666
- "rooms": [{
69667
- "id": "room-1-1776067835920",
69668
- "name": "Room 1",
69669
- "walls": [
69685
+ rooms: [{
69686
+ id: "room-1-1776067835920",
69687
+ name: "Room 1",
69688
+ walls: [
69670
69689
  "lg5h806h",
69671
69690
  "whcf9cv2",
69672
69691
  "phvbebmu",
@@ -69674,12 +69693,12 @@ function App($$anchor, $$props) {
69674
69693
  "cs1poy28",
69675
69694
  "irjmbyqg"
69676
69695
  ],
69677
- "floorTexture": "hardwood",
69678
- "area": 114
69696
+ floorTexture: "hardwood",
69697
+ area: 114
69679
69698
  }, {
69680
- "id": "room-6-1776067835920",
69681
- "name": "Room 6",
69682
- "walls": [
69699
+ id: "room-6-1776067835920",
69700
+ name: "Room 6",
69701
+ walls: [
69683
69702
  "phvbebmu",
69684
69703
  "zp1xe5hf",
69685
69704
  "xvghl92m",
@@ -69691,379 +69710,379 @@ function App($$anchor, $$props) {
69691
69710
  "cs1poy28",
69692
69711
  "xaxhdtmi"
69693
69712
  ],
69694
- "floorTexture": "light-oak",
69695
- "area": 32.5
69713
+ floorTexture: "light-oak",
69714
+ area: 32.5
69696
69715
  }],
69697
- "doors": [
69716
+ doors: [
69698
69717
  {
69699
- "id": "ri02cnm3",
69700
- "wallId": "phvbebmu",
69701
- "position": .8,
69702
- "width": 90,
69703
- "height": 210,
69704
- "type": "single",
69705
- "swingDirection": "left",
69706
- "flipSide": false
69718
+ id: "ri02cnm3",
69719
+ wallId: "phvbebmu",
69720
+ position: .8,
69721
+ width: 90,
69722
+ height: 210,
69723
+ type: "single",
69724
+ swingDirection: "left",
69725
+ flipSide: false
69707
69726
  },
69708
69727
  {
69709
- "id": "5vzer8y2",
69710
- "wallId": "mrcejzip",
69711
- "position": .5,
69712
- "width": 300,
69713
- "height": 210,
69714
- "type": "double",
69715
- "swingDirection": "left",
69716
- "flipSide": false
69728
+ id: "5vzer8y2",
69729
+ wallId: "mrcejzip",
69730
+ position: .5,
69731
+ width: 300,
69732
+ height: 210,
69733
+ type: "double",
69734
+ swingDirection: "left",
69735
+ flipSide: false
69717
69736
  },
69718
69737
  {
69719
- "id": "djdsr69e",
69720
- "wallId": "9779xycw",
69721
- "position": .6,
69722
- "width": 90,
69723
- "height": 210,
69724
- "type": "single",
69725
- "swingDirection": "left",
69726
- "flipSide": false
69738
+ id: "djdsr69e",
69739
+ wallId: "9779xycw",
69740
+ position: .6,
69741
+ width: 90,
69742
+ height: 210,
69743
+ type: "single",
69744
+ swingDirection: "left",
69745
+ flipSide: false
69727
69746
  },
69728
69747
  {
69729
- "id": "q7q6yxj5",
69730
- "wallId": "pw24r5jz",
69731
- "position": .5,
69732
- "width": 90,
69733
- "height": 210,
69734
- "type": "single",
69735
- "swingDirection": "left",
69736
- "flipSide": false
69748
+ id: "q7q6yxj5",
69749
+ wallId: "pw24r5jz",
69750
+ position: .5,
69751
+ width: 90,
69752
+ height: 210,
69753
+ type: "single",
69754
+ swingDirection: "left",
69755
+ flipSide: false
69737
69756
  },
69738
69757
  {
69739
- "id": "trlthzki",
69740
- "wallId": "xvghl92m",
69741
- "position": .3,
69742
- "width": 90,
69743
- "height": 210,
69744
- "type": "single",
69745
- "swingDirection": "left",
69746
- "flipSide": false
69758
+ id: "trlthzki",
69759
+ wallId: "xvghl92m",
69760
+ position: .3,
69761
+ width: 90,
69762
+ height: 210,
69763
+ type: "single",
69764
+ swingDirection: "left",
69765
+ flipSide: false
69747
69766
  },
69748
69767
  {
69749
- "id": "cftusuau",
69750
- "wallId": "j5kb9mas",
69751
- "position": .5,
69752
- "width": 90,
69753
- "height": 210,
69754
- "type": "single",
69755
- "swingDirection": "left",
69756
- "flipSide": false
69768
+ id: "cftusuau",
69769
+ wallId: "j5kb9mas",
69770
+ position: .5,
69771
+ width: 90,
69772
+ height: 210,
69773
+ type: "single",
69774
+ swingDirection: "left",
69775
+ flipSide: false
69757
69776
  },
69758
69777
  {
69759
- "id": "ffwybstc",
69760
- "wallId": "zp1xe5hf",
69761
- "position": .5,
69762
- "width": 90,
69763
- "height": 210,
69764
- "type": "single",
69765
- "swingDirection": "left",
69766
- "flipSide": false
69778
+ id: "ffwybstc",
69779
+ wallId: "zp1xe5hf",
69780
+ position: .5,
69781
+ width: 90,
69782
+ height: 210,
69783
+ type: "single",
69784
+ swingDirection: "left",
69785
+ flipSide: false
69767
69786
  },
69768
69787
  {
69769
- "id": "zbqvbt3e",
69770
- "wallId": "n45rb09q",
69771
- "position": .3,
69772
- "width": 90,
69773
- "height": 210,
69774
- "type": "single",
69775
- "swingDirection": "left",
69776
- "flipSide": false
69788
+ id: "zbqvbt3e",
69789
+ wallId: "n45rb09q",
69790
+ position: .3,
69791
+ width: 90,
69792
+ height: 210,
69793
+ type: "single",
69794
+ swingDirection: "left",
69795
+ flipSide: false
69777
69796
  }
69778
69797
  ],
69779
- "windows": [
69798
+ windows: [
69780
69799
  {
69781
- "id": "str62d0g",
69782
- "wallId": "lg5h806h",
69783
- "position": .15,
69784
- "width": 140,
69785
- "height": 120,
69786
- "sillHeight": 90,
69787
- "type": "standard"
69800
+ id: "str62d0g",
69801
+ wallId: "lg5h806h",
69802
+ position: .15,
69803
+ width: 140,
69804
+ height: 120,
69805
+ sillHeight: 90,
69806
+ type: "standard"
69788
69807
  },
69789
69808
  {
69790
- "id": "rhl9pa6k",
69791
- "wallId": "lg5h806h",
69792
- "position": .45,
69793
- "width": 140,
69794
- "height": 120,
69795
- "sillHeight": 90,
69796
- "type": "standard"
69809
+ id: "rhl9pa6k",
69810
+ wallId: "lg5h806h",
69811
+ position: .45,
69812
+ width: 140,
69813
+ height: 120,
69814
+ sillHeight: 90,
69815
+ type: "standard"
69797
69816
  },
69798
69817
  {
69799
- "id": "lg4nh0s5",
69800
- "wallId": "lg5h806h",
69801
- "position": .8,
69802
- "width": 140,
69803
- "height": 120,
69804
- "sillHeight": 90,
69805
- "type": "standard"
69818
+ id: "lg4nh0s5",
69819
+ wallId: "lg5h806h",
69820
+ position: .8,
69821
+ width: 140,
69822
+ height: 120,
69823
+ sillHeight: 90,
69824
+ type: "standard"
69806
69825
  },
69807
69826
  {
69808
- "id": "8bpiebl6",
69809
- "wallId": "whcf9cv2",
69810
- "position": .3,
69811
- "width": 120,
69812
- "height": 120,
69813
- "sillHeight": 90,
69814
- "type": "standard"
69827
+ id: "8bpiebl6",
69828
+ wallId: "whcf9cv2",
69829
+ position: .3,
69830
+ width: 120,
69831
+ height: 120,
69832
+ sillHeight: 90,
69833
+ type: "standard"
69815
69834
  },
69816
69835
  {
69817
- "id": "nqvio771",
69818
- "wallId": "whcf9cv2",
69819
- "position": .7,
69820
- "width": 180,
69821
- "height": 120,
69822
- "sillHeight": 90,
69823
- "type": "standard"
69836
+ id: "nqvio771",
69837
+ wallId: "whcf9cv2",
69838
+ position: .7,
69839
+ width: 180,
69840
+ height: 120,
69841
+ sillHeight: 90,
69842
+ type: "standard"
69824
69843
  },
69825
69844
  {
69826
- "id": "4wfq1m5b",
69827
- "wallId": "cs1poy28",
69828
- "position": .7,
69829
- "width": 150,
69830
- "height": 120,
69831
- "sillHeight": 90,
69832
- "type": "standard"
69845
+ id: "4wfq1m5b",
69846
+ wallId: "cs1poy28",
69847
+ position: .7,
69848
+ width: 150,
69849
+ height: 120,
69850
+ sillHeight: 90,
69851
+ type: "standard"
69833
69852
  },
69834
69853
  {
69835
- "id": "uy5t0vr6",
69836
- "wallId": "irjmbyqg",
69837
- "position": .1,
69838
- "width": 120,
69839
- "height": 120,
69840
- "sillHeight": 90,
69841
- "type": "standard"
69854
+ id: "uy5t0vr6",
69855
+ wallId: "irjmbyqg",
69856
+ position: .1,
69857
+ width: 120,
69858
+ height: 120,
69859
+ sillHeight: 90,
69860
+ type: "standard"
69842
69861
  }
69843
69862
  ],
69844
- "furniture": [
69863
+ furniture: [
69845
69864
  {
69846
- "id": "3s34714b",
69847
- "catalogId": "bed_queen",
69848
- "position": {
69849
- "x": 150,
69850
- "y": 120
69865
+ id: "3s34714b",
69866
+ catalogId: "bed_queen",
69867
+ position: {
69868
+ x: 150,
69869
+ y: 120
69851
69870
  },
69852
- "rotation": 0,
69853
- "scale": {
69854
- "x": 1,
69855
- "y": 1,
69856
- "z": 1
69871
+ rotation: 0,
69872
+ scale: {
69873
+ x: 1,
69874
+ y: 1,
69875
+ z: 1
69857
69876
  }
69858
69877
  },
69859
69878
  {
69860
- "id": "vy1dh1df",
69861
- "catalogId": "bed_queen",
69862
- "position": {
69863
- "x": 550,
69864
- "y": 120
69879
+ id: "vy1dh1df",
69880
+ catalogId: "bed_queen",
69881
+ position: {
69882
+ x: 550,
69883
+ y: 120
69865
69884
  },
69866
- "rotation": 0,
69867
- "scale": {
69868
- "x": 1,
69869
- "y": 1,
69870
- "z": 1
69885
+ rotation: 0,
69886
+ scale: {
69887
+ x: 1,
69888
+ y: 1,
69889
+ z: 1
69871
69890
  }
69872
69891
  },
69873
69892
  {
69874
- "id": "lbkdt1gr",
69875
- "catalogId": "bed_twin",
69876
- "position": {
69877
- "x": 1050,
69878
- "y": 120
69893
+ id: "lbkdt1gr",
69894
+ catalogId: "bed_twin",
69895
+ position: {
69896
+ x: 1050,
69897
+ y: 120
69879
69898
  },
69880
- "rotation": 0,
69881
- "scale": {
69882
- "x": 1,
69883
- "y": 1,
69884
- "z": 1
69899
+ rotation: 0,
69900
+ scale: {
69901
+ x: 1,
69902
+ y: 1,
69903
+ z: 1
69885
69904
  }
69886
69905
  },
69887
69906
  {
69888
- "id": "929s823r",
69889
- "catalogId": "sofa",
69890
- "position": {
69891
- "x": 500,
69892
- "y": 450
69907
+ id: "929s823r",
69908
+ catalogId: "sofa",
69909
+ position: {
69910
+ x: 500,
69911
+ y: 450
69893
69912
  },
69894
- "rotation": 0,
69895
- "scale": {
69896
- "x": 1,
69897
- "y": 1,
69898
- "z": 1
69913
+ rotation: 0,
69914
+ scale: {
69915
+ x: 1,
69916
+ y: 1,
69917
+ z: 1
69899
69918
  }
69900
69919
  },
69901
69920
  {
69902
- "id": "vemdx0ly",
69903
- "catalogId": "dining_table",
69904
- "position": {
69905
- "x": 1100,
69906
- "y": 470
69921
+ id: "vemdx0ly",
69922
+ catalogId: "dining_table",
69923
+ position: {
69924
+ x: 1100,
69925
+ y: 470
69907
69926
  },
69908
- "rotation": 0,
69909
- "scale": {
69910
- "x": 1,
69911
- "y": 1,
69912
- "z": 1
69927
+ rotation: 0,
69928
+ scale: {
69929
+ x: 1,
69930
+ y: 1,
69931
+ z: 1
69913
69932
  }
69914
69933
  },
69915
69934
  {
69916
- "id": "4ut780gy",
69917
- "catalogId": "toilet",
69918
- "position": {
69919
- "x": 80,
69920
- "y": 450
69935
+ id: "4ut780gy",
69936
+ catalogId: "toilet",
69937
+ position: {
69938
+ x: 80,
69939
+ y: 450
69921
69940
  },
69922
- "rotation": 0,
69923
- "scale": {
69924
- "x": 1,
69925
- "y": 1,
69926
- "z": 1
69941
+ rotation: 0,
69942
+ scale: {
69943
+ x: 1,
69944
+ y: 1,
69945
+ z: 1
69927
69946
  }
69928
69947
  },
69929
69948
  {
69930
- "id": "b86ttpr9",
69931
- "catalogId": "sink_b",
69932
- "position": {
69933
- "x": 80,
69934
- "y": 530
69949
+ id: "b86ttpr9",
69950
+ catalogId: "sink_b",
69951
+ position: {
69952
+ x: 80,
69953
+ y: 530
69935
69954
  },
69936
- "rotation": 0,
69937
- "scale": {
69938
- "x": 1,
69939
- "y": 1,
69940
- "z": 1
69955
+ rotation: 0,
69956
+ scale: {
69957
+ x: 1,
69958
+ y: 1,
69959
+ z: 1
69941
69960
  }
69942
69961
  },
69943
69962
  {
69944
- "id": "o5vi7zwx",
69945
- "catalogId": "toilet",
69946
- "position": {
69947
- "x": 880,
69948
- "y": 450
69963
+ id: "o5vi7zwx",
69964
+ catalogId: "toilet",
69965
+ position: {
69966
+ x: 880,
69967
+ y: 450
69949
69968
  },
69950
- "rotation": 0,
69951
- "scale": {
69952
- "x": 1,
69953
- "y": 1,
69954
- "z": 1
69969
+ rotation: 0,
69970
+ scale: {
69971
+ x: 1,
69972
+ y: 1,
69973
+ z: 1
69955
69974
  }
69956
69975
  },
69957
69976
  {
69958
- "id": "5n8aegie",
69959
- "catalogId": "sink_b",
69960
- "position": {
69961
- "x": 880,
69962
- "y": 530
69977
+ id: "5n8aegie",
69978
+ catalogId: "sink_b",
69979
+ position: {
69980
+ x: 880,
69981
+ y: 530
69963
69982
  },
69964
- "rotation": 0,
69965
- "scale": {
69966
- "x": 1,
69967
- "y": 1,
69968
- "z": 1
69983
+ rotation: 0,
69984
+ scale: {
69985
+ x: 1,
69986
+ y: 1,
69987
+ z: 1
69969
69988
  }
69970
69989
  },
69971
69990
  {
69972
- "id": "3srr4a1o",
69973
- "catalogId": "camera",
69974
- "position": {
69975
- "x": 350,
69976
- "y": 125
69991
+ id: "3srr4a1o",
69992
+ catalogId: "camera",
69993
+ position: {
69994
+ x: 350,
69995
+ y: 125
69977
69996
  },
69978
- "rotation": 240,
69979
- "scale": {
69980
- "x": 1,
69981
- "y": 1,
69982
- "z": 1
69997
+ rotation: 240,
69998
+ scale: {
69999
+ x: 1,
70000
+ y: 1,
70001
+ z: 1
69983
70002
  }
69984
70003
  },
69985
70004
  {
69986
- "id": "c5t2gb8x",
69987
- "catalogId": "camera",
69988
- "position": {
69989
- "x": 1250,
69990
- "y": 175
70005
+ id: "c5t2gb8x",
70006
+ catalogId: "camera",
70007
+ position: {
70008
+ x: 1250,
70009
+ y: 175
69991
70010
  },
69992
- "rotation": 0,
69993
- "scale": {
69994
- "x": 1,
69995
- "y": 1,
69996
- "z": 1
70011
+ rotation: 0,
70012
+ scale: {
70013
+ x: 1,
70014
+ y: 1,
70015
+ z: 1
69997
70016
  }
69998
70017
  },
69999
70018
  {
70000
- "id": "2i2ebqoi",
70001
- "catalogId": "camera",
70002
- "position": {
70003
- "x": 200,
70004
- "y": 775
70019
+ id: "2i2ebqoi",
70020
+ catalogId: "camera",
70021
+ position: {
70022
+ x: 200,
70023
+ y: 775
70005
70024
  },
70006
- "rotation": 0,
70007
- "scale": {
70008
- "x": 1,
70009
- "y": 1,
70010
- "z": 1
70025
+ rotation: 0,
70026
+ scale: {
70027
+ x: 1,
70028
+ y: 1,
70029
+ z: 1
70011
70030
  }
70012
70031
  },
70013
70032
  {
70014
- "id": "uem6oqib",
70015
- "catalogId": "camera",
70016
- "position": {
70017
- "x": 350,
70018
- "y": 525
70033
+ id: "uem6oqib",
70034
+ catalogId: "camera",
70035
+ position: {
70036
+ x: 350,
70037
+ y: 525
70019
70038
  },
70020
- "rotation": 225,
70021
- "scale": {
70022
- "x": 1,
70023
- "y": 1,
70024
- "z": 1
70039
+ rotation: 225,
70040
+ scale: {
70041
+ x: 1,
70042
+ y: 1,
70043
+ z: 1
70025
70044
  }
70026
70045
  },
70027
70046
  {
70028
- "id": "h5sbi17v",
70029
- "catalogId": "camera",
70030
- "position": {
70031
- "x": 775,
70032
- "y": 450
70047
+ id: "h5sbi17v",
70048
+ catalogId: "camera",
70049
+ position: {
70050
+ x: 775,
70051
+ y: 450
70033
70052
  },
70034
- "rotation": 90,
70035
- "scale": {
70036
- "x": 1,
70037
- "y": 1,
70038
- "z": 1
70053
+ rotation: 90,
70054
+ scale: {
70055
+ x: 1,
70056
+ y: 1,
70057
+ z: 1
70039
70058
  }
70040
70059
  },
70041
70060
  {
70042
- "id": "6uqjgzjq",
70043
- "catalogId": "camera",
70044
- "position": {
70045
- "x": 1275,
70046
- "y": 500
70061
+ id: "6uqjgzjq",
70062
+ catalogId: "camera",
70063
+ position: {
70064
+ x: 1275,
70065
+ y: 500
70047
70066
  },
70048
- "rotation": 345,
70049
- "scale": {
70050
- "x": 1,
70051
- "y": 1,
70052
- "z": 1
70067
+ rotation: 345,
70068
+ scale: {
70069
+ x: 1,
70070
+ y: 1,
70071
+ z: 1
70053
70072
  }
70054
70073
  }
70055
70074
  ],
70056
- "stairs": [],
70057
- "columns": [],
70058
- "guides": [],
70059
- "measurements": [],
70060
- "annotations": [],
70061
- "textAnnotations": [],
70062
- "groups": []
70075
+ stairs: [],
70076
+ columns: [],
70077
+ guides: [],
70078
+ measurements: [],
70079
+ annotations: [],
70080
+ textAnnotations: [],
70081
+ groups: []
70063
70082
  }],
70064
- "activeFloorId": "1fg6pga0",
70065
- "createdAt": "2026-04-13T08:10:35.869Z",
70066
- "updatedAt": "2026-04-13T08:58:30.617Z"
70083
+ activeFloorId: "1fg6pga0",
70084
+ createdAt: "2026-04-13T08:10:35.869Z",
70085
+ updatedAt: "2026-04-13T08:58:30.617Z"
70067
70086
  });
70068
70087
  });
70069
70088
  onMount(() => {
@@ -70098,21 +70117,26 @@ function App($$anchor, $$props) {
70098
70117
  if (e.key === "l" && !e.ctrlKey && !e.metaKey && !e.altKey && ((_e$target3 = e.target) === null || _e$target3 === void 0 ? void 0 : _e$target3.tagName) !== "INPUT") set(showLayers, !get(showLayers));
70099
70118
  });
70100
70119
  var node = first_child(fragment);
70101
- var consequent_4 = ($$anchor) => {
70120
+ var consequent_6 = ($$anchor) => {
70102
70121
  var fragment_1 = root_1();
70103
70122
  var div = first_child(fragment_1);
70104
70123
  var node_1 = child(div);
70105
- TopBar(node_1, {
70106
- get viewOnly() {
70107
- return get(config).viewOnly;
70108
- },
70109
- get onDispatch() {
70110
- return $$props.onDispatch;
70111
- }
70124
+ var consequent = ($$anchor) => {
70125
+ TopBar($$anchor, {
70126
+ get viewOnly() {
70127
+ return get(config).viewOnly;
70128
+ },
70129
+ get onDispatch() {
70130
+ return $$props.onDispatch;
70131
+ }
70132
+ });
70133
+ };
70134
+ if_block(node_1, ($$render) => {
70135
+ if (!get(config).viewOnly) $$render(consequent);
70112
70136
  });
70113
70137
  var div_1 = sibling(node_1, 2);
70114
70138
  var node_2 = child(div_1);
70115
- var consequent = ($$anchor) => {
70139
+ var consequent_1 = ($$anchor) => {
70116
70140
  BuildPanel($$anchor, {
70117
70141
  get showHelp() {
70118
70142
  return get(showHelp);
@@ -70136,13 +70160,13 @@ function App($$anchor, $$props) {
70136
70160
  };
70137
70161
  if_block(node_2, ($$render) => {
70138
70162
  var _$$get;
70139
- if (get(mode) === "2d" && !((_$$get = get(config)) === null || _$$get === void 0 ? void 0 : _$$get.viewOnly)) $$render(consequent);
70163
+ if (get(mode) === "2d" && !((_$$get = get(config)) === null || _$$get === void 0 ? void 0 : _$$get.viewOnly)) $$render(consequent_1);
70140
70164
  });
70141
70165
  var div_2 = sibling(node_2, 2);
70142
70166
  var node_3 = child(div_2);
70143
- var consequent_1 = ($$anchor) => {
70144
- var fragment_3 = root_3();
70145
- var node_4 = first_child(fragment_3);
70167
+ var consequent_3 = ($$anchor) => {
70168
+ var fragment_4 = root_4();
70169
+ var node_4 = first_child(fragment_4);
70146
70170
  {
70147
70171
  let $0 = /* @__PURE__ */ user_derived(() => {
70148
70172
  var _$$get2;
@@ -70152,19 +70176,25 @@ function App($$anchor, $$props) {
70152
70176
  return get($0);
70153
70177
  } });
70154
70178
  }
70155
- AlignmentToolbar(sibling(node_4, 2), {});
70156
- append($$anchor, fragment_3);
70179
+ var node_5 = sibling(node_4, 2);
70180
+ var consequent_2 = ($$anchor) => {
70181
+ AlignmentToolbar($$anchor, {});
70182
+ };
70183
+ if_block(node_5, ($$render) => {
70184
+ if (!get(config).viewOnly) $$render(consequent_2);
70185
+ });
70186
+ append($$anchor, fragment_4);
70157
70187
  };
70158
70188
  if_block(node_3, ($$render) => {
70159
- if (get(mode) === "2d") $$render(consequent_1);
70189
+ if (get(mode) === "2d") $$render(consequent_3);
70160
70190
  });
70161
70191
  reset(div_2);
70162
70192
  var node_6 = sibling(div_2, 2);
70163
- var consequent_2 = ($$anchor) => {
70193
+ var consequent_4 = ($$anchor) => {
70164
70194
  LayersPanel($$anchor, {});
70165
70195
  };
70166
70196
  if_block(node_6, ($$render) => {
70167
- if (get(showLayers) && get(mode) === "2d") $$render(consequent_2);
70197
+ if (get(showLayers) && get(mode) === "2d") $$render(consequent_4);
70168
70198
  });
70169
70199
  var node_7 = sibling(node_6, 2);
70170
70200
  {
@@ -70185,8 +70215,8 @@ function App($$anchor, $$props) {
70185
70215
  }
70186
70216
  });
70187
70217
  var node_9 = sibling(node_8, 2);
70188
- var consequent_3 = ($$anchor) => {
70189
- var div_3 = root_5();
70218
+ var consequent_5 = ($$anchor) => {
70219
+ var div_3 = root_7();
70190
70220
  var div_4 = child(div_3);
70191
70221
  var div_5 = child(div_4);
70192
70222
  var div_6 = sibling(child(div_5), 2);
@@ -70256,7 +70286,7 @@ function App($$anchor, $$props) {
70256
70286
  append($$anchor, div_3);
70257
70287
  };
70258
70288
  if_block(node_9, ($$render) => {
70259
- if (get(showHelp)) $$render(consequent_3);
70289
+ if (get(showHelp)) $$render(consequent_5);
70260
70290
  });
70261
70291
  var node_10 = sibling(node_9, 2);
70262
70292
  CommandPalette(node_10, {
@@ -70280,10 +70310,10 @@ function App($$anchor, $$props) {
70280
70310
  append($$anchor, fragment_1);
70281
70311
  };
70282
70312
  var alternate = ($$anchor) => {
70283
- append($$anchor, root_6());
70313
+ append($$anchor, root_8());
70284
70314
  };
70285
70315
  if_block(node, ($$render) => {
70286
- if (get(ready)) $$render(consequent_4);
70316
+ if (get(ready)) $$render(consequent_6);
70287
70317
  else $$render(alternate, -1);
70288
70318
  });
70289
70319
  append($$anchor, fragment);