@node-edit-utils/core 2.0.3 → 2.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.
@@ -0,0 +1 @@
1
+ export declare const processPostMessage: (event: MessageEvent, onNodeSelected?: (node: HTMLElement | null) => void) => void;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Markup Canvas
3
3
  * High-performance markup canvas with zoom and pan capabilities
4
- * @version 2.0.3
4
+ * @version 2.0.5
5
5
  */
6
6
  'use strict';
7
7
 
@@ -97,13 +97,24 @@ const bindToWindow = (key, value) => {
97
97
  }
98
98
  };
99
99
 
100
- const handlePostMessage = (event) => {
100
+ const processPostMessage = (event, onNodeSelected) => {
101
101
  if (event.data.source === "markup-canvas" && event.data.canvasName === "canvas") {
102
102
  if (event.data.action === "zoom") {
103
103
  const zoom = event.data.data;
104
104
  console.log("zoom", zoom);
105
105
  }
106
106
  }
107
+ if (event.data.source === "application") {
108
+ if (event.data.action === "selectedNodeChanged") {
109
+ const nodeId = event.data.data;
110
+ console.log("selectedNodeChanged in node-edit-utils", nodeId);
111
+ const selectedNode = document.querySelector(`[data-node-id="${nodeId}"]`);
112
+ if (selectedNode) {
113
+ console.log("selectedNode", selectedNode);
114
+ onNodeSelected?.(selectedNode);
115
+ }
116
+ }
117
+ }
107
118
  };
108
119
 
109
120
  function getHighlightFrameElement(nodeProvider) {
@@ -180,7 +191,7 @@ const handleNodeClick = (event, nodeProvider, editableNode, onNodeSelected) => {
180
191
 
181
192
  const setupEventListener$1 = (nodeProvider, onNodeSelected, onEscapePressed, getEditableNode) => {
182
193
  const messageHandler = (event) => {
183
- handlePostMessage(event);
194
+ processPostMessage(event, onNodeSelected);
184
195
  };
185
196
  const documentClickHandler = (event) => {
186
197
  handleNodeClick(event, nodeProvider, getEditableNode(), onNodeSelected);
@@ -459,7 +470,7 @@ const createNodeTools = (element) => {
459
470
  });
460
471
  }
461
472
  selectedNode = node;
462
- sendPostMessage("selectedNodeChanged", node?.getAttribute("data-layer-id") ?? null);
473
+ sendPostMessage("selectedNodeChanged", node?.getAttribute("data-node-id") ?? null);
463
474
  highlightNode(node, nodeProvider) ?? null;
464
475
  };
465
476
  // Setup event listener
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Markup Canvas
3
3
  * High-performance markup canvas with zoom and pan capabilities
4
- * @version 2.0.3
4
+ * @version 2.0.5
5
5
  */
6
6
  // biome-ignore lint/suspicious/noExplicitAny: generic constraint requires flexibility
7
7
  function withRAFThrottle(func) {
@@ -95,13 +95,24 @@ const bindToWindow = (key, value) => {
95
95
  }
96
96
  };
97
97
 
98
- const handlePostMessage = (event) => {
98
+ const processPostMessage = (event, onNodeSelected) => {
99
99
  if (event.data.source === "markup-canvas" && event.data.canvasName === "canvas") {
100
100
  if (event.data.action === "zoom") {
101
101
  const zoom = event.data.data;
102
102
  console.log("zoom", zoom);
103
103
  }
104
104
  }
105
+ if (event.data.source === "application") {
106
+ if (event.data.action === "selectedNodeChanged") {
107
+ const nodeId = event.data.data;
108
+ console.log("selectedNodeChanged in node-edit-utils", nodeId);
109
+ const selectedNode = document.querySelector(`[data-node-id="${nodeId}"]`);
110
+ if (selectedNode) {
111
+ console.log("selectedNode", selectedNode);
112
+ onNodeSelected?.(selectedNode);
113
+ }
114
+ }
115
+ }
105
116
  };
106
117
 
107
118
  function getHighlightFrameElement(nodeProvider) {
@@ -178,7 +189,7 @@ const handleNodeClick = (event, nodeProvider, editableNode, onNodeSelected) => {
178
189
 
179
190
  const setupEventListener$1 = (nodeProvider, onNodeSelected, onEscapePressed, getEditableNode) => {
180
191
  const messageHandler = (event) => {
181
- handlePostMessage(event);
192
+ processPostMessage(event, onNodeSelected);
182
193
  };
183
194
  const documentClickHandler = (event) => {
184
195
  handleNodeClick(event, nodeProvider, getEditableNode(), onNodeSelected);
@@ -457,7 +468,7 @@ const createNodeTools = (element) => {
457
468
  });
458
469
  }
459
470
  selectedNode = node;
460
- sendPostMessage("selectedNodeChanged", node?.getAttribute("data-layer-id") ?? null);
471
+ sendPostMessage("selectedNodeChanged", node?.getAttribute("data-node-id") ?? null);
461
472
  highlightNode(node, nodeProvider) ?? null;
462
473
  };
463
474
  // Setup event listener
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Markup Canvas
3
3
  * High-performance markup canvas with zoom and pan capabilities
4
- * @version 2.0.3
4
+ * @version 2.0.5
5
5
  */
6
6
  (function (global, factory) {
7
7
  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
@@ -101,13 +101,24 @@
101
101
  }
102
102
  };
103
103
 
104
- const handlePostMessage = (event) => {
104
+ const processPostMessage = (event, onNodeSelected) => {
105
105
  if (event.data.source === "markup-canvas" && event.data.canvasName === "canvas") {
106
106
  if (event.data.action === "zoom") {
107
107
  const zoom = event.data.data;
108
108
  console.log("zoom", zoom);
109
109
  }
110
110
  }
111
+ if (event.data.source === "application") {
112
+ if (event.data.action === "selectedNodeChanged") {
113
+ const nodeId = event.data.data;
114
+ console.log("selectedNodeChanged in node-edit-utils", nodeId);
115
+ const selectedNode = document.querySelector(`[data-node-id="${nodeId}"]`);
116
+ if (selectedNode) {
117
+ console.log("selectedNode", selectedNode);
118
+ onNodeSelected?.(selectedNode);
119
+ }
120
+ }
121
+ }
111
122
  };
112
123
 
113
124
  function getHighlightFrameElement(nodeProvider) {
@@ -184,7 +195,7 @@
184
195
 
185
196
  const setupEventListener$1 = (nodeProvider, onNodeSelected, onEscapePressed, getEditableNode) => {
186
197
  const messageHandler = (event) => {
187
- handlePostMessage(event);
198
+ processPostMessage(event, onNodeSelected);
188
199
  };
189
200
  const documentClickHandler = (event) => {
190
201
  handleNodeClick(event, nodeProvider, getEditableNode(), onNodeSelected);
@@ -463,7 +474,7 @@
463
474
  });
464
475
  }
465
476
  selectedNode = node;
466
- sendPostMessage("selectedNodeChanged", node?.getAttribute("data-layer-id") ?? null);
477
+ sendPostMessage("selectedNodeChanged", node?.getAttribute("data-node-id") ?? null);
467
478
  highlightNode(node, nodeProvider) ?? null;
468
479
  };
469
480
  // Setup event listener
@@ -1 +1 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).MarkupCanvas={})}(this,function(e){"use strict";function t(e){let t=null,n=null;const o=(...o)=>{n=o,null===t&&(t=requestAnimationFrame(()=>{n&&e(...n),t=null,n=null}))};return o.cleanup=()=>{null!==t&&(cancelAnimationFrame(t),t=null,n=null)},o}const n=e=>{const t=window.canvas;return e.reduce((e,t)=>e?.[t],t)};function o(e){return e.querySelector(".highlight-frame")}const r=e=>{if(!e)return;const t=o(e);t&&t.remove()},s=["path","rect","circle","ellipse","polygon","line","polyline","text","text-noci"];let a=[],l=0;const i=(e,t)=>{let n=null;const o=e.clientX,r=e.clientY,i=e.metaKey||e.ctrlKey,d=((e,t)=>{const n=document.elementsFromPoint(e,t);return Array.from(n).reduce((e,t)=>e.found?e:"node-provider"===t.getAttribute("data-role")?(e.found=!0,e):(e.elements.push(t),e),{elements:[],found:!1}).elements})(o,r).filter(e=>!s.includes(e.tagName.toLowerCase()));if(t&&d.includes(t))return t;if(i)return a=[],n=d[0],n;var c,u;u=d,(c=a).length===u.length&&c.every((e,t)=>e===u[t])?l<=d.length&&l++:l=0;return n=d[d.length-1-l],a=d,n},d=(e,t,n,o)=>{const s=e=>{(e=>{if("markup-canvas"===e.data.source&&"canvas"===e.data.canvasName&&"zoom"===e.data.action){const t=e.data.data;console.log("zoom",t)}})(e)},a=n=>{((e,t,n,o)=>{if(e.preventDefault(),e.stopPropagation(),t&&!t.contains(e.target))return r(t),void o(null);o(i(e,n))})(n,e,o(),t)},l=e=>{"Escape"===e.key&&(e.preventDefault(),e.stopPropagation(),n?.())};return window.addEventListener("message",s),document.addEventListener("click",a),document.addEventListener("keydown",l),()=>{window.removeEventListener("message",s),document.removeEventListener("click",a),document.removeEventListener("keydown",l)}};function c(e,t){const o=e.getBoundingClientRect(),r=t.getBoundingClientRect(),s=o.top-r.top,a=o.left-r.left,l=n(["zoom","current"])??1;return{top:parseFloat((s/l).toFixed(5)),left:parseFloat((a/l).toFixed(5)),width:Math.max(4,parseFloat((o.width/l).toFixed(5))),height:parseFloat((o.height/l).toFixed(5))}}const u=(e,t)=>{const n=document.createElement("div");n.className="node-tools",t.appendChild(n),((e,t)=>{const n=document.createElement("div");n.className="tag-label",n.textContent=e.tagName.toLowerCase(),t.appendChild(n)})(e,n)},m=(e,t)=>{if(!e)return;const r=o(t);r&&r.remove();const s=((e,t)=>{const{top:o,left:r,width:s,height:a}=c(e,t),l=n(["zoom","current"])??1;document.body.style.setProperty("--zoom",l.toString()),document.body.style.setProperty("--stroke-width",(2/l).toFixed(3));const i=document.createElement("div");i.classList.add("highlight-frame"),i.style.setProperty("--frame-top",`${o}px`),i.style.setProperty("--frame-left",`${r}px`),i.style.setProperty("--frame-width",`${s}px`),i.style.setProperty("--frame-height",`${a}px`);const d=document.createElementNS("http://www.w3.org/2000/svg","svg");d.classList.add("highlight-frame-svg");const u=document.createElementNS("http://www.w3.org/2000/svg","rect");return u.setAttribute("x","0"),u.setAttribute("y","0"),u.setAttribute("width","100%"),u.setAttribute("height","100%"),u.classList.add("highlight-frame-rect"),d.appendChild(u),i.appendChild(d),i})(e,t);"true"===e.contentEditable&&s.classList.add("is-editable"),u(e,s),t.appendChild(s)},p=(e,t)=>{const r=o(t),s=n(["zoom","current"])??1;if(!r)return;s>=.3?t.style.setProperty("--tool-opacity","1"):t.style.setProperty("--tool-opacity","0");const{top:a,left:l,width:i,height:d}=c(e,t);r.style.setProperty("--frame-top",`${a}px`),r.style.setProperty("--frame-left",`${l}px`),r.style.setProperty("--frame-width",`${i}px`),r.style.setProperty("--frame-height",`${d}px`)},v=e=>{const t=e=>{"Enter"===e.key&&(e.preventDefault(),e.stopPropagation(),(()=>{const e=window.getSelection();if(e&&e.rangeCount>0){const t=e.getRangeAt(0);t.deleteContents();const n=document.createElement("br");t.insertNode(n),t.setStartAfter(n),t.setEndAfter(n),e.removeAllRanges(),e.addRange(t)}})())};return e.addEventListener("keydown",t),()=>{e.removeEventListener("keydown",t)}},h=(e,t)=>{const n=((e,t)=>{const n=new MutationObserver(e=>{t(e)});return n.observe(e,{subtree:!0,childList:!0,characterData:!0}),n})(e,()=>{p(e,t)});return()=>n.disconnect()},f=()=>{let e=null,t=!1,o=null;const r=()=>{if(t||!e)return;t=!0;var r;(r=e).contentEditable="false",r.classList.remove("is-editable"),r.style.outline="none",(()=>{const e=n(["keyboard","enable"]);e?.()})(),o?.(),e=null,t=!1};return{enableEditMode:(t,s)=>{if(e===t)return;e&&e!==t&&r();const a=(e=>Array.from(e.childNodes).some(e=>e.nodeType===Node.TEXT_NODE&&e.textContent?.trim()))(t);a&&(e=t,(e=>{e.contentEditable="true",e.classList.add("is-editable"),e.style.outline="none"})(t),(()=>{const e=n(["keyboard","disable"]);e?.()})(),o=((e,t,n)=>{if(!t)return()=>{};e.addEventListener("blur",n);const o=v(e),r=h(e,t);return()=>{e.removeEventListener("blur",n),o(),r?.()}})(t,s,r))},blurEditMode:r,getEditableNode:()=>e,isEditing:()=>null!==e}},y=320,g=1680,b=[{name:"Mobile",rawValue:390,value:"320px"},{name:"Tablet Portrait",rawValue:768,value:"768px"},{name:"Tablet Landscape",rawValue:1024,value:"1024px"},{name:"Notebook",rawValue:1280,value:"1280px"},{name:"Desktop",rawValue:1680,value:"1680px"}],w=(e,t,n)=>{const o=parseFloat(document.body.dataset.zoom||"1"),r=((e,t)=>{const n=e+Math.round(t);return Math.max(y,Math.min(g,n))})(n,(e.clientX-t)/o);return r},E=(e,t)=>{e.style.setProperty("--container-width",`${t}px`),((e,t)=>{console.log("updateActivePreset",t);const n=e.querySelectorAll(".resize-preset-button");console.log("presetButtons",n),n.forEach((e,n)=>{n<b.length&&(b[n].rawValue===t?e.classList.add("is-active"):e.classList.remove("is-active"))})})(e,t)};e.createCanvasObserver=function(){const e=document.querySelector(".transform-layer");if(!e)return{disconnect:()=>{}};const o=t(()=>{(()=>{const e=n(["zoom","current"]);document.body.style.setProperty("--zoom",e.toFixed(5)),document.body.style.setProperty("--stroke-width",(2/e).toFixed(3)),document.body.dataset.zoom=e.toFixed(5),document.body.dataset.strokeWidth=(2/e).toFixed(3)})()}),r=new MutationObserver(()=>{o()});return r.observe(e,{attributes:!0,attributeOldValue:!0,subtree:!0,childList:!0}),{disconnect:function(){o.cleanup(),r.disconnect()}}},e.createNodeTools=e=>{const n=e;let o=null,s=null;const a=f(),l=t(p),i=e=>{if(a.isEditing()){const t=a.getEditableNode();t&&t!==e&&a.blurEditMode()}var t,r;o?.disconnect(),e&&n&&(a.enableEditMode(e,n),o=((e,t)=>{const n=new ResizeObserver(e=>{t(e)});return n.observe(e),n})(n,()=>{l(e,n)})),s=e,t="selectedNodeChanged",r=e?.getAttribute("data-layer-id")??null,window.parent.postMessage({source:"node-edit-utils",action:t,data:r,timestamp:Date.now()},"*"),m(e,n)},c=d(n,i,()=>{a.isEditing()&&a.blurEditMode(),s&&n&&(r(n),s=null,o?.disconnect())},a.getEditableNode),u={selectNode:i,getSelectedNode:()=>s,refreshHighlightFrame:()=>{l(s,n)},clearSelectedNode:()=>{r(n),s=null,o?.disconnect()},getEditableNode:()=>a.getEditableNode(),cleanup:()=>{c(),o?.disconnect(),a.blurEditMode(),l.cleanup()}};var v,h;return v="nodeTools",h=u,"undefined"!=typeof window&&(window[v]=h),u},e.createViewport=e=>{const n=document.querySelector(".canvas-container"),o=e.querySelector(".resize-handle");o&&o.remove();const r=(e=>{const t=document.createElement("div");return t.className="resize-handle",e.appendChild(t),t})(e);e.style.setProperty("--container-width","400px"),((e,t,n)=>{const o=document.createElement("div");o.className="resize-presets",b.forEach(e=>{const r=document.createElement("button");r.textContent=e.name,r.className="resize-preset-button",r.addEventListener("click",()=>{n(t,e.rawValue)}),o.appendChild(r)}),e.appendChild(o)})(r,e,E);let s=!1,a=0,l=0;const i=t(t=>{if(!s)return;n&&(n.style.cursor="ew-resize");const o=w(t,a,l);E(e,o)}),d=((e,t,n,o,r)=>(e.addEventListener("mousedown",t),document.addEventListener("mousemove",n),document.addEventListener("mouseup",o),window.addEventListener("blur",r),()=>{e.removeEventListener("mousedown",t),document.removeEventListener("mousemove",n),document.removeEventListener("mouseup",o),window.removeEventListener("blur",r)}))(r,t=>{t.preventDefault(),t.stopPropagation(),s=!0,a=t.clientX,l=e.offsetWidth},i,e=>{e.preventDefault(),e.stopPropagation(),n&&(n.style.cursor="default"),s=!1},()=>{s=!1});return{setWidth:t=>{E(e,t)},cleanup:()=>{s=!1,i?.cleanup(),d(),r.remove()}}}});
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).MarkupCanvas={})}(this,function(e){"use strict";function t(e){let t=null,n=null;const o=(...o)=>{n=o,null===t&&(t=requestAnimationFrame(()=>{n&&e(...n),t=null,n=null}))};return o.cleanup=()=>{null!==t&&(cancelAnimationFrame(t),t=null,n=null)},o}const n=e=>{const t=window.canvas;return e.reduce((e,t)=>e?.[t],t)};function o(e){return e.querySelector(".highlight-frame")}const r=e=>{if(!e)return;const t=o(e);t&&t.remove()},s=["path","rect","circle","ellipse","polygon","line","polyline","text","text-noci"];let a=[],d=0;const l=(e,t)=>{let n=null;const o=e.clientX,r=e.clientY,l=e.metaKey||e.ctrlKey,i=((e,t)=>{const n=document.elementsFromPoint(e,t);return Array.from(n).reduce((e,t)=>e.found?e:"node-provider"===t.getAttribute("data-role")?(e.found=!0,e):(e.elements.push(t),e),{elements:[],found:!1}).elements})(o,r).filter(e=>!s.includes(e.tagName.toLowerCase()));if(t&&i.includes(t))return t;if(l)return a=[],n=i[0],n;var c,u;u=i,(c=a).length===u.length&&c.every((e,t)=>e===u[t])?d<=i.length&&d++:d=0;return n=i[i.length-1-d],a=i,n},i=(e,t,n,o)=>{const s=e=>{((e,t)=>{if("markup-canvas"===e.data.source&&"canvas"===e.data.canvasName&&"zoom"===e.data.action){const t=e.data.data;console.log("zoom",t)}if("application"===e.data.source&&"selectedNodeChanged"===e.data.action){const n=e.data.data;console.log("selectedNodeChanged in node-edit-utils",n);const o=document.querySelector(`[data-node-id="${n}"]`);o&&(console.log("selectedNode",o),t?.(o))}})(e,t)},a=n=>{((e,t,n,o)=>{if(e.preventDefault(),e.stopPropagation(),t&&!t.contains(e.target))return r(t),void o(null);o(l(e,n))})(n,e,o(),t)},d=e=>{"Escape"===e.key&&(e.preventDefault(),e.stopPropagation(),n?.())};return window.addEventListener("message",s),document.addEventListener("click",a),document.addEventListener("keydown",d),()=>{window.removeEventListener("message",s),document.removeEventListener("click",a),document.removeEventListener("keydown",d)}};function c(e,t){const o=e.getBoundingClientRect(),r=t.getBoundingClientRect(),s=o.top-r.top,a=o.left-r.left,d=n(["zoom","current"])??1;return{top:parseFloat((s/d).toFixed(5)),left:parseFloat((a/d).toFixed(5)),width:Math.max(4,parseFloat((o.width/d).toFixed(5))),height:parseFloat((o.height/d).toFixed(5))}}const u=(e,t)=>{const n=document.createElement("div");n.className="node-tools",t.appendChild(n),((e,t)=>{const n=document.createElement("div");n.className="tag-label",n.textContent=e.tagName.toLowerCase(),t.appendChild(n)})(e,n)},m=(e,t)=>{if(!e)return;const r=o(t);r&&r.remove();const s=((e,t)=>{const{top:o,left:r,width:s,height:a}=c(e,t),d=n(["zoom","current"])??1;document.body.style.setProperty("--zoom",d.toString()),document.body.style.setProperty("--stroke-width",(2/d).toFixed(3));const l=document.createElement("div");l.classList.add("highlight-frame"),l.style.setProperty("--frame-top",`${o}px`),l.style.setProperty("--frame-left",`${r}px`),l.style.setProperty("--frame-width",`${s}px`),l.style.setProperty("--frame-height",`${a}px`);const i=document.createElementNS("http://www.w3.org/2000/svg","svg");i.classList.add("highlight-frame-svg");const u=document.createElementNS("http://www.w3.org/2000/svg","rect");return u.setAttribute("x","0"),u.setAttribute("y","0"),u.setAttribute("width","100%"),u.setAttribute("height","100%"),u.classList.add("highlight-frame-rect"),i.appendChild(u),l.appendChild(i),l})(e,t);"true"===e.contentEditable&&s.classList.add("is-editable"),u(e,s),t.appendChild(s)},p=(e,t)=>{const r=o(t),s=n(["zoom","current"])??1;if(!r)return;s>=.3?t.style.setProperty("--tool-opacity","1"):t.style.setProperty("--tool-opacity","0");const{top:a,left:d,width:l,height:i}=c(e,t);r.style.setProperty("--frame-top",`${a}px`),r.style.setProperty("--frame-left",`${d}px`),r.style.setProperty("--frame-width",`${l}px`),r.style.setProperty("--frame-height",`${i}px`)},v=e=>{const t=e=>{"Enter"===e.key&&(e.preventDefault(),e.stopPropagation(),(()=>{const e=window.getSelection();if(e&&e.rangeCount>0){const t=e.getRangeAt(0);t.deleteContents();const n=document.createElement("br");t.insertNode(n),t.setStartAfter(n),t.setEndAfter(n),e.removeAllRanges(),e.addRange(t)}})())};return e.addEventListener("keydown",t),()=>{e.removeEventListener("keydown",t)}},h=(e,t)=>{const n=((e,t)=>{const n=new MutationObserver(e=>{t(e)});return n.observe(e,{subtree:!0,childList:!0,characterData:!0}),n})(e,()=>{p(e,t)});return()=>n.disconnect()},f=()=>{let e=null,t=!1,o=null;const r=()=>{if(t||!e)return;t=!0;var r;(r=e).contentEditable="false",r.classList.remove("is-editable"),r.style.outline="none",(()=>{const e=n(["keyboard","enable"]);e?.()})(),o?.(),e=null,t=!1};return{enableEditMode:(t,s)=>{if(e===t)return;e&&e!==t&&r();const a=(e=>Array.from(e.childNodes).some(e=>e.nodeType===Node.TEXT_NODE&&e.textContent?.trim()))(t);a&&(e=t,(e=>{e.contentEditable="true",e.classList.add("is-editable"),e.style.outline="none"})(t),(()=>{const e=n(["keyboard","disable"]);e?.()})(),o=((e,t,n)=>{if(!t)return()=>{};e.addEventListener("blur",n);const o=v(e),r=h(e,t);return()=>{e.removeEventListener("blur",n),o(),r?.()}})(t,s,r))},blurEditMode:r,getEditableNode:()=>e,isEditing:()=>null!==e}},y=320,g=1680,b=[{name:"Mobile",rawValue:390,value:"320px"},{name:"Tablet Portrait",rawValue:768,value:"768px"},{name:"Tablet Landscape",rawValue:1024,value:"1024px"},{name:"Notebook",rawValue:1280,value:"1280px"},{name:"Desktop",rawValue:1680,value:"1680px"}],w=(e,t,n)=>{const o=parseFloat(document.body.dataset.zoom||"1"),r=((e,t)=>{const n=e+Math.round(t);return Math.max(y,Math.min(g,n))})(n,(e.clientX-t)/o);return r},E=(e,t)=>{e.style.setProperty("--container-width",`${t}px`),((e,t)=>{console.log("updateActivePreset",t);const n=e.querySelectorAll(".resize-preset-button");console.log("presetButtons",n),n.forEach((e,n)=>{n<b.length&&(b[n].rawValue===t?e.classList.add("is-active"):e.classList.remove("is-active"))})})(e,t)};e.createCanvasObserver=function(){const e=document.querySelector(".transform-layer");if(!e)return{disconnect:()=>{}};const o=t(()=>{(()=>{const e=n(["zoom","current"]);document.body.style.setProperty("--zoom",e.toFixed(5)),document.body.style.setProperty("--stroke-width",(2/e).toFixed(3)),document.body.dataset.zoom=e.toFixed(5),document.body.dataset.strokeWidth=(2/e).toFixed(3)})()}),r=new MutationObserver(()=>{o()});return r.observe(e,{attributes:!0,attributeOldValue:!0,subtree:!0,childList:!0}),{disconnect:function(){o.cleanup(),r.disconnect()}}},e.createNodeTools=e=>{const n=e;let o=null,s=null;const a=f(),d=t(p),l=e=>{if(a.isEditing()){const t=a.getEditableNode();t&&t!==e&&a.blurEditMode()}var t,r;o?.disconnect(),e&&n&&(a.enableEditMode(e,n),o=((e,t)=>{const n=new ResizeObserver(e=>{t(e)});return n.observe(e),n})(n,()=>{d(e,n)})),s=e,t="selectedNodeChanged",r=e?.getAttribute("data-node-id")??null,window.parent.postMessage({source:"node-edit-utils",action:t,data:r,timestamp:Date.now()},"*"),m(e,n)},c=i(n,l,()=>{a.isEditing()&&a.blurEditMode(),s&&n&&(r(n),s=null,o?.disconnect())},a.getEditableNode),u={selectNode:l,getSelectedNode:()=>s,refreshHighlightFrame:()=>{d(s,n)},clearSelectedNode:()=>{r(n),s=null,o?.disconnect()},getEditableNode:()=>a.getEditableNode(),cleanup:()=>{c(),o?.disconnect(),a.blurEditMode(),d.cleanup()}};var v,h;return v="nodeTools",h=u,"undefined"!=typeof window&&(window[v]=h),u},e.createViewport=e=>{const n=document.querySelector(".canvas-container"),o=e.querySelector(".resize-handle");o&&o.remove();const r=(e=>{const t=document.createElement("div");return t.className="resize-handle",e.appendChild(t),t})(e);e.style.setProperty("--container-width","400px"),((e,t,n)=>{const o=document.createElement("div");o.className="resize-presets",b.forEach(e=>{const r=document.createElement("button");r.textContent=e.name,r.className="resize-preset-button",r.addEventListener("click",()=>{n(t,e.rawValue)}),o.appendChild(r)}),e.appendChild(o)})(r,e,E);let s=!1,a=0,d=0;const l=t(t=>{if(!s)return;n&&(n.style.cursor="ew-resize");const o=w(t,a,d);E(e,o)}),i=((e,t,n,o,r)=>(e.addEventListener("mousedown",t),document.addEventListener("mousemove",n),document.addEventListener("mouseup",o),window.addEventListener("blur",r),()=>{e.removeEventListener("mousedown",t),document.removeEventListener("mousemove",n),document.removeEventListener("mouseup",o),window.removeEventListener("blur",r)}))(r,t=>{t.preventDefault(),t.stopPropagation(),s=!0,a=t.clientX,d=e.offsetWidth},l,e=>{e.preventDefault(),e.stopPropagation(),n&&(n.style.cursor="default"),s=!1},()=>{s=!1});return{setWidth:t=>{E(e,t)},cleanup:()=>{s=!1,l?.cleanup(),i(),r.remove()}}}});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@node-edit-utils/core",
3
- "version": "2.0.3",
3
+ "version": "2.0.5",
4
4
  "description": "Utilities for editing nodes in a dom tree.",
5
5
  "type": "module",
6
6
  "main": "dist/node-edit-utils.cjs.js",
@@ -52,7 +52,7 @@ export const createNodeTools = (element: HTMLElement | null): NodeTools => {
52
52
  }
53
53
 
54
54
  selectedNode = node;
55
- sendPostMessage("selectedNodeChanged", node?.getAttribute("data-layer-id") ?? null);
55
+ sendPostMessage("selectedNodeChanged", node?.getAttribute("data-node-id") ?? null);
56
56
  highlightNode(node, nodeProvider as HTMLElement) ?? null;
57
57
  };
58
58
 
@@ -1,4 +1,4 @@
1
- import { handlePostMessage } from "../../post-message/handlePostMessage";
1
+ import { processPostMessage } from "@/lib/post-message/processPostMessage";
2
2
  import { handleNodeClick } from "./click/handleNodeClick";
3
3
 
4
4
  export const setupEventListener = (
@@ -8,7 +8,7 @@ export const setupEventListener = (
8
8
  getEditableNode: () => HTMLElement | null
9
9
  ): (() => void) => {
10
10
  const messageHandler = (event: MessageEvent) => {
11
- handlePostMessage(event);
11
+ processPostMessage(event, onNodeSelected);
12
12
  };
13
13
 
14
14
  const documentClickHandler = (event: MouseEvent) => {
@@ -0,0 +1,21 @@
1
+ export const processPostMessage = (event: MessageEvent, onNodeSelected?: (node: HTMLElement | null) => void) => {
2
+ if (event.data.source === "markup-canvas" && event.data.canvasName === "canvas") {
3
+ if (event.data.action === "zoom") {
4
+ const zoom = event.data.data;
5
+ console.log("zoom", zoom);
6
+ }
7
+ }
8
+
9
+ if (event.data.source === "application") {
10
+ if (event.data.action === "selectedNodeChanged") {
11
+ const nodeId = event.data.data;
12
+ console.log("selectedNodeChanged in node-edit-utils", nodeId);
13
+ const selectedNode = document.querySelector(`[data-node-id="${nodeId}"]`);
14
+
15
+ if (selectedNode) {
16
+ console.log("selectedNode", selectedNode);
17
+ onNodeSelected?.(selectedNode as HTMLElement);
18
+ }
19
+ }
20
+ }
21
+ };
@@ -1 +0,0 @@
1
- export declare const handlePostMessage: (event: MessageEvent) => void;
@@ -1,8 +0,0 @@
1
- export const handlePostMessage = (event: MessageEvent) => {
2
- if (event.data.source === "markup-canvas" && event.data.canvasName === "canvas") {
3
- if (event.data.action === "zoom") {
4
- const zoom = event.data.data;
5
- console.log("zoom", zoom);
6
- }
7
- }
8
- };