@embedpdf/utils 2.0.0-next.0 → 2.0.0-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,5 @@
1
+ import { Action } from 'svelte/action';
1
2
  export interface MenuWrapperProps {
2
3
  style: string;
3
- ref: (el: HTMLElement | null) => void;
4
+ action: Action<HTMLElement>;
4
5
  }
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("svelte/internal/client");require("svelte/internal/disclose-version");const e=require("@embedpdf/utils");function i(t){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t)for(const i in t)if("default"!==i){const n=Object.getOwnPropertyDescriptor(t,i);Object.defineProperty(e,i,n.get?n:{enumerable:!0,get:()=>t[i]})}return e.default=t,Object.freeze(e)}const n=i(t);class r{constructor(t,e){this.config=t,this.onUpdate=e,this.state="idle",this.startPoint=null,this.startElement=null,this.activeHandle=null,this.currentPosition=null,this.activeVertexIndex=null,this.startVertices=[],this.currentVertices=[],this.currentVertices=t.vertices||[]}updateConfig(t){this.config={...this.config,...t},this.currentVertices=t.vertices||[]}startDrag(t,e){this.state="dragging",this.startPoint={x:t,y:e},this.startElement={...this.config.element},this.currentPosition={...this.config.element},this.onUpdate({state:"start",transformData:{type:"move",changes:{rect:this.startElement}}})}startResize(t,e,i){this.state="resizing",this.activeHandle=t,this.startPoint={x:e,y:i},this.startElement={...this.config.element},this.currentPosition={...this.config.element},this.onUpdate({state:"start",transformData:{type:"resize",changes:{rect:this.startElement},metadata:{handle:this.activeHandle,maintainAspectRatio:this.config.maintainAspectRatio}}})}startVertexEdit(t,e,i){this.currentVertices=[...this.config.vertices??this.currentVertices],t<0||t>=this.currentVertices.length||(this.state="vertex-editing",this.activeVertexIndex=t,this.startPoint={x:e,y:i},this.startVertices=[...this.currentVertices],this.onUpdate({state:"start",transformData:{type:"vertex-edit",changes:{vertices:this.startVertices},metadata:{vertexIndex:t}}}))}move(t,e){if("idle"!==this.state&&this.startPoint)if("dragging"===this.state&&this.startElement){const i=this.calculateDelta(t,e),n=this.calculateDragPosition(i);this.currentPosition=n,this.onUpdate({state:"move",transformData:{type:"move",changes:{rect:n}}})}else if("resizing"===this.state&&this.activeHandle&&this.startElement){const i=this.calculateDelta(t,e),n=this.calculateResizePosition(i,this.activeHandle);this.currentPosition=n,this.onUpdate({state:"move",transformData:{type:"resize",changes:{rect:n},metadata:{handle:this.activeHandle,maintainAspectRatio:this.config.maintainAspectRatio}}})}else if("vertex-editing"===this.state&&null!==this.activeVertexIndex){const i=this.calculateVertexPosition(t,e);this.currentVertices=i,this.onUpdate({state:"move",transformData:{type:"vertex-edit",changes:{vertices:i},metadata:{vertexIndex:this.activeVertexIndex}}})}}end(){if("idle"===this.state)return;const t=this.state,e=this.activeHandle,i=this.activeVertexIndex;if("vertex-editing"===t)this.onUpdate({state:"end",transformData:{type:"vertex-edit",changes:{vertices:this.currentVertices},metadata:{vertexIndex:i||void 0}}});else{const i=this.getCurrentPosition();this.onUpdate({state:"end",transformData:{type:"dragging"===t?"move":"resize",changes:{rect:i},metadata:"dragging"===t?void 0:{handle:e||void 0,maintainAspectRatio:this.config.maintainAspectRatio}}})}this.reset()}cancel(){"idle"!==this.state&&("vertex-editing"===this.state?this.onUpdate({state:"end",transformData:{type:"vertex-edit",changes:{vertices:this.startVertices},metadata:{vertexIndex:this.activeVertexIndex||void 0}}}):this.startElement&&this.onUpdate({state:"end",transformData:{type:"dragging"===this.state?"move":"resize",changes:{rect:this.startElement},metadata:"dragging"===this.state?void 0:{handle:this.activeHandle||void 0,maintainAspectRatio:this.config.maintainAspectRatio}}}),this.reset())}reset(){this.state="idle",this.startPoint=null,this.startElement=null,this.activeHandle=null,this.currentPosition=null,this.activeVertexIndex=null,this.startVertices=[]}getCurrentPosition(){return this.currentPosition||this.config.element}calculateDelta(t,e){if(!this.startPoint)return{x:0,y:0};const i={x:t-this.startPoint.x,y:e-this.startPoint.y};return this.transformDelta(i)}transformDelta(t){const{pageRotation:e=0,scale:i=1}=this.config,n=e*Math.PI/2,r=Math.cos(n),s=Math.sin(n),a=t.x/i,o=t.y/i;return{x:r*a+s*o,y:-s*a+r*o}}clampPoint(t){var e;const i=null==(e=this.config.constraints)?void 0:e.boundingBox;return i?{x:Math.max(0,Math.min(t.x,i.width)),y:Math.max(0,Math.min(t.y,i.height))}:t}calculateVertexPosition(t,e){if(null===this.activeVertexIndex)return this.startVertices;const i=this.calculateDelta(t,e),n=[...this.startVertices],r=n[this.activeVertexIndex],s={x:r.x+i.x,y:r.y+i.y};return n[this.activeVertexIndex]=this.clampPoint(s),n}calculateDragPosition(t){if(!this.startElement)return this.config.element;const e={origin:{x:this.startElement.origin.x+t.x,y:this.startElement.origin.y+t.y},size:{width:this.startElement.size.width,height:this.startElement.size.height}};return this.applyConstraints(e)}calculateResizePosition(t,e){var i;if(!this.startElement)return this.config.element;let{origin:{x:n,y:r},size:{width:s,height:a}}=this.startElement;switch(e){case"se":s+=t.x,a+=t.y;break;case"sw":n+=t.x,s-=t.x,a+=t.y;break;case"ne":s+=t.x,r+=t.y,a-=t.y;break;case"nw":n+=t.x,s-=t.x,r+=t.y,a-=t.y;break;case"n":r+=t.y,a-=t.y;break;case"s":a+=t.y;break;case"e":s+=t.x;break;case"w":n+=t.x,s-=t.x}if(this.config.maintainAspectRatio&&this.startElement){const t=this.startElement.size.width/this.startElement.size.height;if(["n","s","e","w"].includes(e))if("n"===e||"s"===e){const e=a*t,i=e-s;s=e,n-=i/2}else{const i=s/t,o=i-a;a=i,"w"===e&&(n=this.startElement.origin.x+this.startElement.size.width-s),r-=o/2}else{Math.abs(s-this.startElement.size.width)>Math.abs(a-this.startElement.size.height)?a=s/t:s=a*t,e.includes("w")&&(n=this.startElement.origin.x+this.startElement.size.width-s),e.includes("n")&&(r=this.startElement.origin.y+this.startElement.size.height-a)}}const o=null==(i=this.config.constraints)?void 0:i.boundingBox;if(o)switch(e){case"e":s=Math.min(s,o.width-n);break;case"s":a=Math.min(a,o.height-r);break;case"se":s=Math.min(s,o.width-n),a=Math.min(a,o.height-r);break;case"w":n<0&&(s+=n,n=0);break;case"n":r<0&&(a+=r,r=0);break;case"sw":n<0&&(s+=n,n=0),a=Math.min(a,o.height-r);break;case"nw":n<0&&(s+=n,n=0),r<0&&(a+=r,r=0);break;case"ne":s=Math.min(s,o.width-n),r<0&&(a+=r,r=0)}return this.applyConstraints({origin:{x:n,y:r},size:{width:s,height:a}})}applyConstraints(t){const{constraints:e}=this.config;if(!e)return t;let{origin:{x:i,y:n},size:{width:r,height:s}}=t;return r=Math.max(e.minWidth||1,r),s=Math.max(e.minHeight||1,s),e.maxWidth&&(r=Math.min(e.maxWidth,r)),e.maxHeight&&(s=Math.min(e.maxHeight,s)),e.boundingBox&&(i=Math.max(0,Math.min(i,e.boundingBox.width-r)),n=Math.max(0,Math.min(n,e.boundingBox.height-s))),{origin:{x:i,y:n},size:{width:r,height:s}}}}function s(t,e){return"n"===t||"s"===t?"ns-resize":"e"===t||"w"===t?"ew-resize":e%2==0?{nw:"nwse-resize",ne:"nesw-resize",sw:"nesw-resize",se:"nwse-resize"}[t]:{nw:"nesw-resize",ne:"nwse-resize",sw:"nwse-resize",se:"nesw-resize"}[t]}function a(t,e,i){const n=-t/2;return"center"===i?n:"outside"===i?n-e:n+e}function o(t){const e=n.derived(()=>{const e=t(),{onUpdate:i,enabled:n,...r}=e;return r}),i=n.derived(()=>t().enabled??!0),s=n.derived(()=>t().onUpdate);let a=n.state(null);n.user_effect(()=>{n.get(a)?n.get(a).updateConfig(n.get(e)):n.set(a,new r(n.get(e),t=>{var e;return null==(e=n.get(s))?void 0:e(t)}),!0)});const o=t=>{var e;n.get(i)&&(t.preventDefault(),t.stopPropagation(),null==(e=n.get(a))||e.startDrag(t.clientX,t.clientY),t.currentTarget.setPointerCapture(t.pointerId))},c=t=>{var e;t.preventDefault(),t.stopPropagation(),null==(e=n.get(a))||e.move(t.clientX,t.clientY)},h=t=>{var e,i,r;t.preventDefault(),t.stopPropagation(),null==(e=n.get(a))||e.end(),null==(r=(i=t.currentTarget).releasePointerCapture)||r.call(i,t.pointerId)},l=n.derived(()=>n.get(i)?{onpointerdown:o,onpointermove:c,onpointerup:h,onpointercancel:h}:{});return{get dragProps(){return n.get(l)},createResizeProps:t=>({onpointerdown:e=>{var r;n.get(i)&&(e.preventDefault(),e.stopPropagation(),null==(r=n.get(a))||r.startResize(t,e.clientX,e.clientY),e.currentTarget.setPointerCapture(e.pointerId))},onpointermove:c,onpointerup:h,onpointercancel:h}),createVertexProps:t=>({onpointerdown:e=>{var r;n.get(i)&&(e.preventDefault(),e.stopPropagation(),null==(r=n.get(a))||r.startVertexEdit(t,e.clientX,e.clientY),e.currentTarget.setPointerCapture(e.pointerId))},onpointermove:c,onpointerup:h,onpointercancel:h})}}function c(t){return Object.entries(t).map(([t,e])=>`${t.replace(/[A-Z]/g,t=>`-${t.toLowerCase()}`)}: ${e}`).join("; ")}exports.CounterRotate=function(t,i){n.push(i,!0);const r=n.derived(()=>e.getCounterRotation(i.rect,i.rotation));let s=n.state(null);n.user_effect(()=>{const t=n.get(s);if(!t)return;const e=t=>{t.stopPropagation()},i=t=>{t.stopPropagation()};return t.addEventListener("pointerdown",e,{capture:!0}),t.addEventListener("touchstart",i,{capture:!0}),()=>{t.removeEventListener("pointerdown",e,{capture:!0}),t.removeEventListener("touchstart",i,{capture:!0})}});const a=n.derived(()=>`position: absolute; left: ${i.rect.origin.x}px; top: ${i.rect.origin.y}px; transform: ${n.get(r).matrix}; transform-origin: 0 0; width: ${n.get(r).width}px; height: ${n.get(r).height}px; pointer-events: none; z-index: 3`),o=n.derived(()=>({style:n.get(a),ref:t=>{n.set(s,t,!0)}}));var c=n.comment(),h=n.first_child(c),l=t=>{var e=n.comment(),s=n.first_child(e);n.snippet(s,()=>i.children,()=>({menuWrapperProps:n.get(o),matrix:n.get(r).matrix,rect:{origin:{x:i.rect.origin.x,y:i.rect.origin.y},size:{width:n.get(r).width,height:n.get(r).height}}})),n.append(t,e)};n.if(h,t=>{i.children&&t(l)}),n.append(t,c),n.pop()},exports.deepToRaw=function(t){const e=t=>{if(null==t)return t;if("object"!=typeof t)return t;if(Array.isArray(t))return t.map(t=>e(t));if(t instanceof Date)return new Date(t.getTime());if(t instanceof RegExp)return new RegExp(t.source,t.flags);if("[object Object]"===Object.prototype.toString.call(t))return Object.keys(t).reduce((i,n)=>{const r=t[n];return"function"!=typeof r&&(i[n]=e(r)),i},{});try{return JSON.parse(JSON.stringify(t))}catch{return}};return e(t)},exports.doublePress=function(t,e={}){let{onDouble:i,delay:n=300,tolerancePx:r=18}=e;const s={t:0,x:0,y:0},a=t=>{const e=t;if(!i)return;if("mouse"===e.pointerType||!1===e.isPrimary)return;const a=performance.now(),o=e.clientX,c=e.clientY,h=a-s.t<=n,l=o-s.x,d=c-s.y;h&&l*l+d*d<=r*r&&(null==i||i(e)),s.t=a,s.x=o,s.y=c},o=t=>{null==i||i(t)};return t.addEventListener("pointerup",a,{capture:!0}),t.addEventListener("dblclick",o),{update(t){t&&(i=t.onDouble,n=t.delay??n,r=t.tolerancePx??r)},destroy(){t.removeEventListener("pointerup",a,{capture:!0}),t.removeEventListener("dblclick",o)}}},exports.stylesToString=c,exports.useDragResize=o,exports.useInteractionHandles=function(t){const e=n.derived(()=>t().controller),i=n.derived(()=>t().resizeUI),r=n.derived(()=>t().vertexUI),h=n.derived(()=>t().includeVertices??!1),l=n.derived(()=>t().handleAttrs),d=n.derived(()=>t().vertexAttrs),u=o(()=>n.get(e)),g=n.derived(()=>function(t,e={}){const{handleSize:i=8,spacing:n=1,offsetMode:r="outside",includeSides:o=!1,zIndex:c=3,rotationAwareCursor:h=!0}=e,l=(t.pageRotation??0)%4,d=t=>({[t]:a(i,n,r)+"px"});return[["nw",{...d("top"),...d("left")}],["ne",{...d("top"),...d("right")}],["sw",{...d("bottom"),...d("left")}],["se",{...d("bottom"),...d("right")}],...o?[["n",{...d("top"),left:`calc(50% - ${i/2}px)`}],["s",{...d("bottom"),left:`calc(50% - ${i/2}px)`}],["w",{...d("left"),top:`calc(50% - ${i/2}px)`}],["e",{...d("right"),top:`calc(50% - ${i/2}px)`}]]:[]].map(([t,e])=>({handle:t,style:{position:"absolute",width:i+"px",height:i+"px",borderRadius:"50%",zIndex:c,cursor:h?s(t,l):"default",touchAction:"none",...e},attrs:{"data-epdf-handle":t}}))}(n.get(e),n.get(i)).map(t=>{var e,i;return{key:null==(e=t.attrs)?void 0:e["data-epdf-handle"],style:c(t.style),...u.createResizeProps(t.handle),...t.attrs??{},...(null==(i=n.get(l))?void 0:i(t.handle))??{}}})),p=n.derived(()=>{if(!n.get(h))return[];return function(t,e={},i){const{vertexSize:n=12,zIndex:r=4}=e,s=t.element,a=t.scale??1;return(i??t.vertices??[]).map((t,e)=>({handle:"nw",style:{position:"absolute",left:(t.x-s.origin.x)*a-n/2+"px",top:(t.y-s.origin.y)*a-n/2+"px",width:n+"px",height:n+"px",borderRadius:"50%",cursor:"pointer",zIndex:r,touchAction:"none"},attrs:{"data-epdf-vertex":e}}))}(n.get(e),n.get(r),n.get(e).vertices).map((t,e)=>{var i;return{key:e,style:c(t.style),...u.createVertexProps(e),...t.attrs??{},...(null==(i=n.get(d))?void 0:i(e))??{}}})});return{get dragProps(){return u.dragProps},get resize(){return n.get(g)},get vertices(){return n.get(p)}}};
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("svelte/internal/client");require("svelte/internal/disclose-version");const e=require("@embedpdf/utils");function i(t){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t)for(const i in t)if("default"!==i){const n=Object.getOwnPropertyDescriptor(t,i);Object.defineProperty(e,i,n.get?n:{enumerable:!0,get:()=>t[i]})}return e.default=t,Object.freeze(e)}const n=i(t);class r{constructor(t,e){this.config=t,this.onUpdate=e,this.state="idle",this.startPoint=null,this.startElement=null,this.activeHandle=null,this.currentPosition=null,this.activeVertexIndex=null,this.startVertices=[],this.currentVertices=[],this.currentVertices=t.vertices||[]}updateConfig(t){this.config={...this.config,...t},this.currentVertices=t.vertices||[]}startDrag(t,e){this.state="dragging",this.startPoint={x:t,y:e},this.startElement={...this.config.element},this.currentPosition={...this.config.element},this.onUpdate({state:"start",transformData:{type:"move",changes:{rect:this.startElement}}})}startResize(t,e,i){this.state="resizing",this.activeHandle=t,this.startPoint={x:e,y:i},this.startElement={...this.config.element},this.currentPosition={...this.config.element},this.onUpdate({state:"start",transformData:{type:"resize",changes:{rect:this.startElement},metadata:{handle:this.activeHandle,maintainAspectRatio:this.config.maintainAspectRatio}}})}startVertexEdit(t,e,i){this.currentVertices=[...this.config.vertices??this.currentVertices],t<0||t>=this.currentVertices.length||(this.state="vertex-editing",this.activeVertexIndex=t,this.startPoint={x:e,y:i},this.startVertices=[...this.currentVertices],this.onUpdate({state:"start",transformData:{type:"vertex-edit",changes:{vertices:this.startVertices},metadata:{vertexIndex:t}}}))}move(t,e){if("idle"!==this.state&&this.startPoint)if("dragging"===this.state&&this.startElement){const i=this.calculateDelta(t,e),n=this.calculateDragPosition(i);this.currentPosition=n,this.onUpdate({state:"move",transformData:{type:"move",changes:{rect:n}}})}else if("resizing"===this.state&&this.activeHandle&&this.startElement){const i=this.calculateDelta(t,e),n=this.calculateResizePosition(i,this.activeHandle);this.currentPosition=n,this.onUpdate({state:"move",transformData:{type:"resize",changes:{rect:n},metadata:{handle:this.activeHandle,maintainAspectRatio:this.config.maintainAspectRatio}}})}else if("vertex-editing"===this.state&&null!==this.activeVertexIndex){const i=this.calculateVertexPosition(t,e);this.currentVertices=i,this.onUpdate({state:"move",transformData:{type:"vertex-edit",changes:{vertices:i},metadata:{vertexIndex:this.activeVertexIndex}}})}}end(){if("idle"===this.state)return;const t=this.state,e=this.activeHandle,i=this.activeVertexIndex;if("vertex-editing"===t)this.onUpdate({state:"end",transformData:{type:"vertex-edit",changes:{vertices:this.currentVertices},metadata:{vertexIndex:i||void 0}}});else{const i=this.getCurrentPosition();this.onUpdate({state:"end",transformData:{type:"dragging"===t?"move":"resize",changes:{rect:i},metadata:"dragging"===t?void 0:{handle:e||void 0,maintainAspectRatio:this.config.maintainAspectRatio}}})}this.reset()}cancel(){"idle"!==this.state&&("vertex-editing"===this.state?this.onUpdate({state:"end",transformData:{type:"vertex-edit",changes:{vertices:this.startVertices},metadata:{vertexIndex:this.activeVertexIndex||void 0}}}):this.startElement&&this.onUpdate({state:"end",transformData:{type:"dragging"===this.state?"move":"resize",changes:{rect:this.startElement},metadata:"dragging"===this.state?void 0:{handle:this.activeHandle||void 0,maintainAspectRatio:this.config.maintainAspectRatio}}}),this.reset())}reset(){this.state="idle",this.startPoint=null,this.startElement=null,this.activeHandle=null,this.currentPosition=null,this.activeVertexIndex=null,this.startVertices=[]}getCurrentPosition(){return this.currentPosition||this.config.element}calculateDelta(t,e){if(!this.startPoint)return{x:0,y:0};const i={x:t-this.startPoint.x,y:e-this.startPoint.y};return this.transformDelta(i)}transformDelta(t){const{pageRotation:e=0,scale:i=1}=this.config,n=e*Math.PI/2,r=Math.cos(n),s=Math.sin(n),a=t.x/i,o=t.y/i;return{x:r*a+s*o,y:-s*a+r*o}}clampPoint(t){var e;const i=null==(e=this.config.constraints)?void 0:e.boundingBox;return i?{x:Math.max(0,Math.min(t.x,i.width)),y:Math.max(0,Math.min(t.y,i.height))}:t}calculateVertexPosition(t,e){if(null===this.activeVertexIndex)return this.startVertices;const i=this.calculateDelta(t,e),n=[...this.startVertices],r=n[this.activeVertexIndex],s={x:r.x+i.x,y:r.y+i.y};return n[this.activeVertexIndex]=this.clampPoint(s),n}calculateDragPosition(t){if(!this.startElement)return this.config.element;const e={origin:{x:this.startElement.origin.x+t.x,y:this.startElement.origin.y+t.y},size:{width:this.startElement.size.width,height:this.startElement.size.height}};return this.applyConstraints(e)}calculateResizePosition(t,e){var i;if(!this.startElement)return this.config.element;let{origin:{x:n,y:r},size:{width:s,height:a}}=this.startElement;switch(e){case"se":s+=t.x,a+=t.y;break;case"sw":n+=t.x,s-=t.x,a+=t.y;break;case"ne":s+=t.x,r+=t.y,a-=t.y;break;case"nw":n+=t.x,s-=t.x,r+=t.y,a-=t.y;break;case"n":r+=t.y,a-=t.y;break;case"s":a+=t.y;break;case"e":s+=t.x;break;case"w":n+=t.x,s-=t.x}if(this.config.maintainAspectRatio&&this.startElement){const t=this.startElement.size.width/this.startElement.size.height;if(["n","s","e","w"].includes(e))if("n"===e||"s"===e){const e=a*t,i=e-s;s=e,n-=i/2}else{const i=s/t,o=i-a;a=i,"w"===e&&(n=this.startElement.origin.x+this.startElement.size.width-s),r-=o/2}else{Math.abs(s-this.startElement.size.width)>Math.abs(a-this.startElement.size.height)?a=s/t:s=a*t,e.includes("w")&&(n=this.startElement.origin.x+this.startElement.size.width-s),e.includes("n")&&(r=this.startElement.origin.y+this.startElement.size.height-a)}}const o=null==(i=this.config.constraints)?void 0:i.boundingBox;if(o)switch(e){case"e":s=Math.min(s,o.width-n);break;case"s":a=Math.min(a,o.height-r);break;case"se":s=Math.min(s,o.width-n),a=Math.min(a,o.height-r);break;case"w":n<0&&(s+=n,n=0);break;case"n":r<0&&(a+=r,r=0);break;case"sw":n<0&&(s+=n,n=0),a=Math.min(a,o.height-r);break;case"nw":n<0&&(s+=n,n=0),r<0&&(a+=r,r=0);break;case"ne":s=Math.min(s,o.width-n),r<0&&(a+=r,r=0)}return this.applyConstraints({origin:{x:n,y:r},size:{width:s,height:a}})}applyConstraints(t){const{constraints:e}=this.config;if(!e)return t;let{origin:{x:i,y:n},size:{width:r,height:s}}=t;return r=Math.max(e.minWidth||1,r),s=Math.max(e.minHeight||1,s),e.maxWidth&&(r=Math.min(e.maxWidth,r)),e.maxHeight&&(s=Math.min(e.maxHeight,s)),e.boundingBox&&(i=Math.max(0,Math.min(i,e.boundingBox.width-r)),n=Math.max(0,Math.min(n,e.boundingBox.height-s))),{origin:{x:i,y:n},size:{width:r,height:s}}}}function s(t,e){return"n"===t||"s"===t?"ns-resize":"e"===t||"w"===t?"ew-resize":e%2==0?{nw:"nwse-resize",ne:"nesw-resize",sw:"nesw-resize",se:"nwse-resize"}[t]:{nw:"nesw-resize",ne:"nwse-resize",sw:"nwse-resize",se:"nesw-resize"}[t]}function a(t,e,i){const n=-t/2;return"center"===i?n:"outside"===i?n-e:n+e}function o(t){const e=n.derived(()=>{const e=t(),{onUpdate:i,enabled:n,...r}=e;return r}),i=n.derived(()=>t().enabled??!0),s=n.derived(()=>t().onUpdate);let a=n.state(null);n.user_effect(()=>{n.get(a)?n.get(a).updateConfig(n.get(e)):n.set(a,new r(n.get(e),t=>{var e;return null==(e=n.get(s))?void 0:e(t)}),!0)});const o=t=>{var e;n.get(i)&&(t.preventDefault(),t.stopPropagation(),null==(e=n.get(a))||e.startDrag(t.clientX,t.clientY),t.currentTarget.setPointerCapture(t.pointerId))},c=t=>{var e;t.preventDefault(),t.stopPropagation(),null==(e=n.get(a))||e.move(t.clientX,t.clientY)},h=t=>{var e,i,r;t.preventDefault(),t.stopPropagation(),null==(e=n.get(a))||e.end(),null==(r=(i=t.currentTarget).releasePointerCapture)||r.call(i,t.pointerId)},l=n.derived(()=>n.get(i)?{onpointerdown:o,onpointermove:c,onpointerup:h,onpointercancel:h}:{});return{get dragProps(){return n.get(l)},createResizeProps:t=>({onpointerdown:e=>{var r;n.get(i)&&(e.preventDefault(),e.stopPropagation(),null==(r=n.get(a))||r.startResize(t,e.clientX,e.clientY),e.currentTarget.setPointerCapture(e.pointerId))},onpointermove:c,onpointerup:h,onpointercancel:h}),createVertexProps:t=>({onpointerdown:e=>{var r;n.get(i)&&(e.preventDefault(),e.stopPropagation(),null==(r=n.get(a))||r.startVertexEdit(t,e.clientX,e.clientY),e.currentTarget.setPointerCapture(e.pointerId))},onpointermove:c,onpointerup:h,onpointercancel:h})}}function c(t){return Object.entries(t).map(([t,e])=>`${t.replace(/[A-Z]/g,t=>`-${t.toLowerCase()}`)}: ${e}`).join("; ")}exports.CounterRotate=function(t,i){n.push(i,!0);const r=n.derived(()=>e.getCounterRotation(i.rect,i.rotation)),s=t=>{const e=t=>{t.stopPropagation()},i=t=>{t.stopPropagation()};return t.addEventListener("pointerdown",e,{capture:!0}),t.addEventListener("touchstart",i,{capture:!0}),{destroy(){t.removeEventListener("pointerdown",e,{capture:!0}),t.removeEventListener("touchstart",i,{capture:!0})}}},a=n.derived(()=>`position: absolute; left: ${i.rect.origin.x}px; top: ${i.rect.origin.y}px; transform: ${n.get(r).matrix}; transform-origin: 0 0; width: ${n.get(r).width}px; height: ${n.get(r).height}px; pointer-events: none; z-index: 3`),o=n.derived(()=>({style:n.get(a),action:s}));var c=n.comment(),h=n.first_child(c),l=t=>{var e=n.comment(),s=n.first_child(e);n.snippet(s,()=>i.children,()=>({menuWrapperProps:n.get(o),matrix:n.get(r).matrix,rect:{origin:{x:i.rect.origin.x,y:i.rect.origin.y},size:{width:n.get(r).width,height:n.get(r).height}}})),n.append(t,e)};n.if(h,t=>{i.children&&t(l)}),n.append(t,c),n.pop()},exports.deepToRaw=function(t){const e=t=>{if(null==t)return t;if("object"!=typeof t)return t;if(Array.isArray(t))return t.map(t=>e(t));if(t instanceof Date)return new Date(t.getTime());if(t instanceof RegExp)return new RegExp(t.source,t.flags);if("[object Object]"===Object.prototype.toString.call(t))return Object.keys(t).reduce((i,n)=>{const r=t[n];return"function"!=typeof r&&(i[n]=e(r)),i},{});try{return JSON.parse(JSON.stringify(t))}catch{return}};return e(t)},exports.doublePress=function(t,e={}){let{onDouble:i,delay:n=300,tolerancePx:r=18}=e;const s={t:0,x:0,y:0},a=t=>{const e=t;if(!i)return;if("mouse"===e.pointerType||!1===e.isPrimary)return;const a=performance.now(),o=e.clientX,c=e.clientY,h=a-s.t<=n,l=o-s.x,d=c-s.y;h&&l*l+d*d<=r*r&&(null==i||i(e)),s.t=a,s.x=o,s.y=c},o=t=>{null==i||i(t)};return t.addEventListener("pointerup",a,{capture:!0}),t.addEventListener("dblclick",o),{update(t){t&&(i=t.onDouble,n=t.delay??n,r=t.tolerancePx??r)},destroy(){t.removeEventListener("pointerup",a,{capture:!0}),t.removeEventListener("dblclick",o)}}},exports.stylesToString=c,exports.useDragResize=o,exports.useInteractionHandles=function(t){const e=n.derived(()=>t().controller),i=n.derived(()=>t().resizeUI),r=n.derived(()=>t().vertexUI),h=n.derived(()=>t().includeVertices??!1),l=n.derived(()=>t().handleAttrs),d=n.derived(()=>t().vertexAttrs),u=o(()=>n.get(e)),g=n.derived(()=>function(t,e={}){const{handleSize:i=8,spacing:n=1,offsetMode:r="outside",includeSides:o=!1,zIndex:c=3,rotationAwareCursor:h=!0}=e,l=(t.pageRotation??0)%4,d=t=>({[t]:a(i,n,r)+"px"});return[["nw",{...d("top"),...d("left")}],["ne",{...d("top"),...d("right")}],["sw",{...d("bottom"),...d("left")}],["se",{...d("bottom"),...d("right")}],...o?[["n",{...d("top"),left:`calc(50% - ${i/2}px)`}],["s",{...d("bottom"),left:`calc(50% - ${i/2}px)`}],["w",{...d("left"),top:`calc(50% - ${i/2}px)`}],["e",{...d("right"),top:`calc(50% - ${i/2}px)`}]]:[]].map(([t,e])=>({handle:t,style:{position:"absolute",width:i+"px",height:i+"px",borderRadius:"50%",zIndex:c,cursor:h?s(t,l):"default",touchAction:"none",...e},attrs:{"data-epdf-handle":t}}))}(n.get(e),n.get(i)).map(t=>{var e,i;return{key:null==(e=t.attrs)?void 0:e["data-epdf-handle"],style:c(t.style),...u.createResizeProps(t.handle),...t.attrs??{},...(null==(i=n.get(l))?void 0:i(t.handle))??{}}})),p=n.derived(()=>{if(!n.get(h))return[];return function(t,e={},i){const{vertexSize:n=12,zIndex:r=4}=e,s=t.element,a=t.scale??1;return(i??t.vertices??[]).map((t,e)=>({handle:"nw",style:{position:"absolute",left:(t.x-s.origin.x)*a-n/2+"px",top:(t.y-s.origin.y)*a-n/2+"px",width:n+"px",height:n+"px",borderRadius:"50%",cursor:"pointer",zIndex:r,touchAction:"none"},attrs:{"data-epdf-vertex":e}}))}(n.get(e),n.get(r),n.get(e).vertices).map((t,e)=>{var i;return{key:e,style:c(t.style),...u.createVertexProps(e),...t.attrs??{},...(null==(i=n.get(d))?void 0:i(e))??{}}})});return{get dragProps(){return u.dragProps},get resize(){return n.get(g)},get vertices(){return n.get(p)}}};
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../src/shared/plugin-interaction-primitives/drag-resize-controller.ts","../../src/shared/plugin-interaction-primitives/utils.ts","../../src/svelte/hooks/use-drag-resize.svelte.ts","../../src/svelte/utils/styles-to-string.ts","../../src/svelte/components/CounterRotateContainer.svelte","../../src/svelte/utils/deep-to-raw.ts","../../src/svelte/actions/doublePress.ts","../../src/svelte/hooks/use-interaction-handles.svelte.ts"],"sourcesContent":["import { Position, Rect } from '@embedpdf/models';\n\nexport interface DragResizeConfig {\n element: Rect;\n vertices?: Position[];\n constraints?: {\n minWidth?: number;\n minHeight?: number;\n maxWidth?: number;\n maxHeight?: number;\n boundingBox?: { width: number; height: number }; // page bounds\n };\n maintainAspectRatio?: boolean;\n pageRotation?: number;\n scale?: number;\n}\n\nexport type InteractionState = 'idle' | 'dragging' | 'resizing' | 'vertex-editing';\nexport type ResizeHandle = 'nw' | 'ne' | 'sw' | 'se' | 'n' | 'e' | 's' | 'w';\n\nexport interface TransformData {\n type: 'move' | 'resize' | 'vertex-edit';\n changes: {\n rect?: Rect;\n vertices?: Position[];\n };\n metadata?: {\n handle?: ResizeHandle;\n vertexIndex?: number;\n maintainAspectRatio?: boolean;\n };\n}\n\nexport interface InteractionEvent {\n state: 'start' | 'move' | 'end';\n transformData?: TransformData;\n}\n\n/**\n * Pure geometric controller that manages drag/resize/vertex-edit logic.\n */\nexport class DragResizeController {\n private state: InteractionState = 'idle';\n private startPoint: Position | null = null;\n private startElement: Rect | null = null;\n private activeHandle: ResizeHandle | null = null;\n private currentPosition: Rect | null = null;\n\n // Vertex editing state - pure geometric\n private activeVertexIndex: number | null = null;\n private startVertices: Position[] = [];\n private currentVertices: Position[] = [];\n\n constructor(\n private config: DragResizeConfig,\n private onUpdate: (event: InteractionEvent) => void,\n ) {\n this.currentVertices = config.vertices || [];\n }\n\n updateConfig(config: Partial<DragResizeConfig>) {\n this.config = { ...this.config, ...config };\n this.currentVertices = config.vertices || [];\n }\n\n startDrag(clientX: number, clientY: number) {\n this.state = 'dragging';\n this.startPoint = { x: clientX, y: clientY };\n this.startElement = { ...this.config.element };\n this.currentPosition = { ...this.config.element };\n\n this.onUpdate({\n state: 'start',\n transformData: {\n type: 'move',\n changes: {\n rect: this.startElement,\n },\n },\n });\n }\n\n startResize(handle: ResizeHandle, clientX: number, clientY: number) {\n this.state = 'resizing';\n this.activeHandle = handle;\n this.startPoint = { x: clientX, y: clientY };\n this.startElement = { ...this.config.element };\n this.currentPosition = { ...this.config.element };\n\n this.onUpdate({\n state: 'start',\n transformData: {\n type: 'resize',\n changes: {\n rect: this.startElement,\n },\n metadata: {\n handle: this.activeHandle,\n maintainAspectRatio: this.config.maintainAspectRatio,\n },\n },\n });\n }\n\n startVertexEdit(vertexIndex: number, clientX: number, clientY: number) {\n // Refresh vertices from latest config before validating index\n this.currentVertices = [...(this.config.vertices ?? this.currentVertices)];\n if (vertexIndex < 0 || vertexIndex >= this.currentVertices.length) return;\n\n this.state = 'vertex-editing';\n this.activeVertexIndex = vertexIndex;\n this.startPoint = { x: clientX, y: clientY };\n this.startVertices = [...this.currentVertices];\n\n this.onUpdate({\n state: 'start',\n transformData: {\n type: 'vertex-edit',\n changes: {\n vertices: this.startVertices,\n },\n metadata: {\n vertexIndex,\n },\n },\n });\n }\n\n move(clientX: number, clientY: number) {\n if (this.state === 'idle' || !this.startPoint) return;\n\n if (this.state === 'dragging' && this.startElement) {\n const delta = this.calculateDelta(clientX, clientY);\n const position = this.calculateDragPosition(delta);\n this.currentPosition = position;\n\n this.onUpdate({\n state: 'move',\n transformData: {\n type: 'move',\n changes: {\n rect: position,\n },\n },\n });\n } else if (this.state === 'resizing' && this.activeHandle && this.startElement) {\n const delta = this.calculateDelta(clientX, clientY);\n const position = this.calculateResizePosition(delta, this.activeHandle);\n this.currentPosition = position;\n\n this.onUpdate({\n state: 'move',\n transformData: {\n type: 'resize',\n changes: {\n rect: position,\n },\n metadata: {\n handle: this.activeHandle,\n maintainAspectRatio: this.config.maintainAspectRatio,\n },\n },\n });\n } else if (this.state === 'vertex-editing' && this.activeVertexIndex !== null) {\n const vertices = this.calculateVertexPosition(clientX, clientY);\n this.currentVertices = vertices;\n\n this.onUpdate({\n state: 'move',\n transformData: {\n type: 'vertex-edit',\n changes: {\n vertices,\n },\n metadata: {\n vertexIndex: this.activeVertexIndex,\n },\n },\n });\n }\n }\n\n end() {\n if (this.state === 'idle') return;\n\n const wasState = this.state;\n const handle = this.activeHandle;\n const vertexIndex = this.activeVertexIndex;\n\n if (wasState === 'vertex-editing') {\n this.onUpdate({\n state: 'end',\n transformData: {\n type: 'vertex-edit',\n changes: {\n vertices: this.currentVertices,\n },\n metadata: {\n vertexIndex: vertexIndex || undefined,\n },\n },\n });\n } else {\n const finalPosition = this.getCurrentPosition();\n this.onUpdate({\n state: 'end',\n transformData: {\n type: wasState === 'dragging' ? 'move' : 'resize',\n changes: {\n rect: finalPosition,\n },\n metadata:\n wasState === 'dragging'\n ? undefined\n : {\n handle: handle || undefined,\n maintainAspectRatio: this.config.maintainAspectRatio,\n },\n },\n });\n }\n\n this.reset();\n }\n\n cancel() {\n if (this.state === 'idle') return;\n\n if (this.state === 'vertex-editing') {\n this.onUpdate({\n state: 'end',\n transformData: {\n type: 'vertex-edit',\n changes: {\n vertices: this.startVertices,\n },\n metadata: {\n vertexIndex: this.activeVertexIndex || undefined,\n },\n },\n });\n } else if (this.startElement) {\n this.onUpdate({\n state: 'end',\n transformData: {\n type: this.state === 'dragging' ? 'move' : 'resize',\n changes: {\n rect: this.startElement,\n },\n metadata:\n this.state === 'dragging'\n ? undefined\n : {\n handle: this.activeHandle || undefined,\n maintainAspectRatio: this.config.maintainAspectRatio,\n },\n },\n });\n }\n\n this.reset();\n }\n\n private reset() {\n this.state = 'idle';\n this.startPoint = null;\n this.startElement = null;\n this.activeHandle = null;\n this.currentPosition = null;\n this.activeVertexIndex = null;\n this.startVertices = [];\n }\n\n private getCurrentPosition() {\n return this.currentPosition || this.config.element;\n }\n\n private calculateDelta(clientX: number, clientY: number): Position {\n if (!this.startPoint) return { x: 0, y: 0 };\n\n const rawDelta: Position = {\n x: clientX - this.startPoint.x,\n y: clientY - this.startPoint.y,\n };\n\n return this.transformDelta(rawDelta);\n }\n\n private transformDelta(delta: Position): Position {\n const { pageRotation = 0, scale = 1 } = this.config;\n\n const rad = (pageRotation * Math.PI) / 2;\n const cos = Math.cos(rad);\n const sin = Math.sin(rad);\n\n const scaledX = delta.x / scale;\n const scaledY = delta.y / scale;\n\n return {\n x: cos * scaledX + sin * scaledY,\n y: -sin * scaledX + cos * scaledY,\n };\n }\n\n private clampPoint(p: Position): Position {\n const bbox = this.config.constraints?.boundingBox;\n if (!bbox) return p;\n return {\n x: Math.max(0, Math.min(p.x, bbox.width)),\n y: Math.max(0, Math.min(p.y, bbox.height)),\n };\n }\n\n private calculateVertexPosition(clientX: number, clientY: number): Position[] {\n if (this.activeVertexIndex === null) return this.startVertices;\n\n const delta = this.calculateDelta(clientX, clientY);\n const newVertices = [...this.startVertices];\n const currentVertex = newVertices[this.activeVertexIndex];\n\n const moved = {\n x: currentVertex.x + delta.x,\n y: currentVertex.y + delta.y,\n };\n newVertices[this.activeVertexIndex] = this.clampPoint(moved);\n\n return newVertices;\n }\n\n private calculateDragPosition(delta: Position): Rect {\n if (!this.startElement) return this.config.element;\n\n const position: Rect = {\n origin: {\n x: this.startElement.origin.x + delta.x,\n y: this.startElement.origin.y + delta.y,\n },\n size: {\n width: this.startElement.size.width,\n height: this.startElement.size.height,\n },\n };\n\n return this.applyConstraints(position);\n }\n\n private calculateResizePosition(delta: Position, handle: ResizeHandle): Rect {\n if (!this.startElement) return this.config.element;\n\n let {\n origin: { x, y },\n size: { width, height },\n } = this.startElement;\n\n switch (handle) {\n case 'se':\n width += delta.x;\n height += delta.y;\n break;\n case 'sw':\n x += delta.x;\n width -= delta.x;\n height += delta.y;\n break;\n case 'ne':\n width += delta.x;\n y += delta.y;\n height -= delta.y;\n break;\n case 'nw':\n x += delta.x;\n width -= delta.x;\n y += delta.y;\n height -= delta.y;\n break;\n case 'n':\n y += delta.y;\n height -= delta.y;\n break;\n case 's':\n height += delta.y;\n break;\n case 'e':\n width += delta.x;\n break;\n case 'w':\n x += delta.x;\n width -= delta.x;\n break;\n }\n\n // Maintain aspect ratio if needed\n if (this.config.maintainAspectRatio && this.startElement) {\n const aspectRatio = this.startElement.size.width / this.startElement.size.height;\n\n if (['n', 's', 'e', 'w'].includes(handle)) {\n if (handle === 'n' || handle === 's') {\n const newWidth = height * aspectRatio;\n const widthDiff = newWidth - width;\n width = newWidth;\n x -= widthDiff / 2;\n } else {\n const newHeight = width / aspectRatio;\n const heightDiff = newHeight - height;\n height = newHeight;\n if (handle === 'w') {\n x = this.startElement.origin.x + this.startElement.size.width - width;\n }\n y -= heightDiff / 2;\n }\n } else {\n const widthChange = Math.abs(width - this.startElement.size.width);\n const heightChange = Math.abs(height - this.startElement.size.height);\n if (widthChange > heightChange) {\n height = width / aspectRatio;\n } else {\n width = height * aspectRatio;\n }\n if (handle.includes('w')) {\n x = this.startElement.origin.x + this.startElement.size.width - width;\n }\n if (handle.includes('n')) {\n y = this.startElement.origin.y + this.startElement.size.height - height;\n }\n }\n }\n\n // Handle-aware bounding box clamping to avoid shifting opposite edge\n const bbox = this.config.constraints?.boundingBox;\n if (bbox) {\n switch (handle) {\n case 'e':\n width = Math.min(width, bbox.width - x);\n break;\n case 's':\n height = Math.min(height, bbox.height - y);\n break;\n case 'se':\n width = Math.min(width, bbox.width - x);\n height = Math.min(height, bbox.height - y);\n break;\n case 'w':\n if (x < 0) {\n width += x;\n x = 0;\n }\n break;\n case 'n':\n if (y < 0) {\n height += y;\n y = 0;\n }\n break;\n case 'sw':\n if (x < 0) {\n width += x;\n x = 0;\n }\n height = Math.min(height, bbox.height - y);\n break;\n case 'nw':\n if (x < 0) {\n width += x;\n x = 0;\n }\n if (y < 0) {\n height += y;\n y = 0;\n }\n break;\n case 'ne':\n width = Math.min(width, bbox.width - x);\n if (y < 0) {\n height += y;\n y = 0;\n }\n break;\n }\n }\n\n return this.applyConstraints({ origin: { x, y }, size: { width, height } });\n }\n\n private applyConstraints(position: Rect): Rect {\n const { constraints } = this.config;\n if (!constraints) return position;\n\n let {\n origin: { x, y },\n size: { width, height },\n } = position;\n\n // Apply size constraints\n width = Math.max(constraints.minWidth || 1, width);\n height = Math.max(constraints.minHeight || 1, height);\n\n if (constraints.maxWidth) width = Math.min(constraints.maxWidth, width);\n if (constraints.maxHeight) height = Math.min(constraints.maxHeight, height);\n\n // Apply bounding box constraints\n if (constraints.boundingBox) {\n x = Math.max(0, Math.min(x, constraints.boundingBox.width - width));\n y = Math.max(0, Math.min(y, constraints.boundingBox.height - height));\n }\n\n return { origin: { x, y }, size: { width, height } };\n }\n}\n","import type { Position, Rect } from '@embedpdf/models';\nimport type { ResizeHandle, DragResizeConfig } from './drag-resize-controller';\n\nexport type QuarterTurns = 0 | 1 | 2 | 3;\n\nexport interface ResizeUI {\n handleSize?: number; // px (default 8)\n spacing?: number; // px distance from the box edge (default 1)\n offsetMode?: 'outside' | 'inside' | 'center'; // default 'outside'\n includeSides?: boolean; // default false\n zIndex?: number; // default 3\n rotationAwareCursor?: boolean; // default true\n}\n\nexport interface VertexUI {\n vertexSize?: number; // px (default 12)\n zIndex?: number; // default 4\n}\n\nexport interface HandleDescriptor {\n handle: ResizeHandle;\n style: Record<string, number | string>;\n attrs?: Record<string, any>;\n}\n\nfunction diagonalCursor(handle: ResizeHandle, rot: QuarterTurns): string {\n // Standard cursors; diagonals flip on odd quarter-turns\n const diag0: Record<'nw' | 'ne' | 'sw' | 'se', string> = {\n nw: 'nwse-resize',\n ne: 'nesw-resize',\n sw: 'nesw-resize',\n se: 'nwse-resize',\n };\n if (handle === 'n' || handle === 's') return 'ns-resize';\n if (handle === 'e' || handle === 'w') return 'ew-resize';\n if (rot % 2 === 0) return diag0[handle as 'nw' | 'ne' | 'sw' | 'se'];\n return { nw: 'nesw-resize', ne: 'nwse-resize', sw: 'nwse-resize', se: 'nesw-resize' }[\n handle as 'nw' | 'ne' | 'sw' | 'se'\n ]!;\n}\n\nfunction edgeOffset(k: number, spacing: number, mode: 'outside' | 'inside' | 'center') {\n // Base puts the handle centered on the edge\n const base = -k / 2;\n if (mode === 'center') return base;\n // outside moves further out (more negative), inside moves in (less negative)\n return mode === 'outside' ? base - spacing : base + spacing;\n}\n\nexport function describeResizeFromConfig(\n cfg: DragResizeConfig,\n ui: ResizeUI = {},\n): HandleDescriptor[] {\n const {\n handleSize = 8,\n spacing = 1,\n offsetMode = 'outside',\n includeSides = false,\n zIndex = 3,\n rotationAwareCursor = true,\n } = ui;\n\n const rotation = ((cfg.pageRotation ?? 0) % 4) as QuarterTurns;\n\n const off = (edge: 'top' | 'right' | 'bottom' | 'left') => ({\n [edge]: edgeOffset(handleSize, spacing, offsetMode) + 'px',\n });\n\n const corners: Array<[ResizeHandle, Record<string, number | string>]> = [\n ['nw', { ...off('top'), ...off('left') }],\n ['ne', { ...off('top'), ...off('right') }],\n ['sw', { ...off('bottom'), ...off('left') }],\n ['se', { ...off('bottom'), ...off('right') }],\n ];\n const sides: Array<[ResizeHandle, Record<string, number | string>]> = includeSides\n ? [\n ['n', { ...off('top'), left: `calc(50% - ${handleSize / 2}px)` }],\n ['s', { ...off('bottom'), left: `calc(50% - ${handleSize / 2}px)` }],\n ['w', { ...off('left'), top: `calc(50% - ${handleSize / 2}px)` }],\n ['e', { ...off('right'), top: `calc(50% - ${handleSize / 2}px)` }],\n ]\n : [];\n\n const all = [...corners, ...sides];\n\n return all.map(([handle, pos]) => ({\n handle,\n style: {\n position: 'absolute',\n width: handleSize + 'px',\n height: handleSize + 'px',\n borderRadius: '50%',\n zIndex,\n cursor: rotationAwareCursor ? diagonalCursor(handle, rotation) : 'default',\n touchAction: 'none',\n ...(pos as any),\n },\n attrs: { 'data-epdf-handle': handle },\n }));\n}\n\nexport function describeVerticesFromConfig(\n cfg: DragResizeConfig,\n ui: VertexUI = {},\n liveVertices?: Position[],\n): HandleDescriptor[] {\n const { vertexSize = 12, zIndex = 4 } = ui;\n const rect: Rect = cfg.element;\n const scale = cfg.scale ?? 1;\n const verts = liveVertices ?? cfg.vertices ?? [];\n\n return verts.map((v, i) => {\n const left = (v.x - rect.origin.x) * scale - vertexSize / 2;\n const top = (v.y - rect.origin.y) * scale - vertexSize / 2;\n return {\n handle: 'nw', // not used; kept for type\n style: {\n position: 'absolute',\n left: left + 'px',\n top: top + 'px',\n width: vertexSize + 'px',\n height: vertexSize + 'px',\n borderRadius: '50%',\n cursor: 'pointer',\n zIndex,\n touchAction: 'none',\n },\n attrs: { 'data-epdf-vertex': i },\n };\n });\n}\n","import {\n type DragResizeConfig,\n DragResizeController,\n type InteractionEvent,\n type ResizeHandle,\n} from '../../shared/plugin-interaction-primitives';\n\nexport interface UseDragResizeOptions extends DragResizeConfig {\n onUpdate?: (event: InteractionEvent) => void;\n enabled?: boolean;\n}\n\nexport interface ResizeHandleEventProps {\n onpointerdown: (e: PointerEvent) => void;\n onpointermove: (e: PointerEvent) => void;\n onpointerup: (e: PointerEvent) => void;\n onpointercancel: (e: PointerEvent) => void;\n}\n\nexport function useDragResize(getOptions: () => UseDragResizeOptions) {\n // Use getter function to maintain reactivity\n const config = $derived.by(() => {\n const opts = getOptions();\n const { onUpdate, enabled, ...rest } = opts;\n return rest;\n });\n\n const enabled = $derived(getOptions().enabled ?? true);\n const onUpdate = $derived(getOptions().onUpdate);\n\n let controller = $state<DragResizeController | null>(null);\n\n // Initialize or update controller\n $effect(() => {\n if (!controller) {\n controller = new DragResizeController(config, (event) => onUpdate?.(event));\n } else {\n controller.updateConfig(config);\n }\n });\n\n const handleDragStart = (e: PointerEvent) => {\n if (!enabled) return;\n e.preventDefault();\n e.stopPropagation();\n controller?.startDrag(e.clientX, e.clientY);\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n };\n\n const handleMove = (e: PointerEvent) => {\n e.preventDefault();\n e.stopPropagation();\n controller?.move(e.clientX, e.clientY);\n };\n\n const handleEnd = (e: PointerEvent) => {\n e.preventDefault();\n e.stopPropagation();\n controller?.end();\n (e.currentTarget as HTMLElement).releasePointerCapture?.(e.pointerId);\n };\n\n const createResizeHandler = (handle: ResizeHandle): ResizeHandleEventProps => ({\n onpointerdown: (e: PointerEvent) => {\n if (!enabled) return;\n e.preventDefault();\n e.stopPropagation();\n controller?.startResize(handle, e.clientX, e.clientY);\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n },\n onpointermove: handleMove,\n onpointerup: handleEnd,\n onpointercancel: handleEnd,\n });\n\n const createVertexHandler = (vertexIndex: number): ResizeHandleEventProps => ({\n onpointerdown: (e: PointerEvent) => {\n if (!enabled) return;\n e.preventDefault();\n e.stopPropagation();\n controller?.startVertexEdit(vertexIndex, e.clientX, e.clientY);\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n },\n onpointermove: handleMove,\n onpointerup: handleEnd,\n onpointercancel: handleEnd,\n });\n\n const dragProps = $derived(\n enabled\n ? {\n onpointerdown: handleDragStart,\n onpointermove: handleMove,\n onpointerup: handleEnd,\n onpointercancel: handleEnd,\n }\n : {},\n );\n\n return {\n get dragProps() {\n return dragProps;\n },\n createResizeProps: createResizeHandler,\n createVertexProps: createVertexHandler,\n };\n}\n","/**\n * Converts a style object with camelCase properties to a CSS string with kebab-case properties.\n *\n * This is useful in Svelte 5 where spreading style objects doesn't work with the `style:` directive.\n * Instead, you can convert the entire style object to a string and apply it to the `style` attribute.\n *\n * @param style - An object containing CSS properties in camelCase format with string or number values\n * @returns A CSS string with kebab-case properties suitable for the HTML style attribute\n *\n * @example\n * ```ts\n * const styles = {\n * position: 'absolute',\n * zIndex: 10,\n * borderRadius: '50%',\n * backgroundColor: '#007ACC'\n * };\n *\n * const cssString = stylesToString(styles);\n * // Returns: \"position: absolute; z-index: 10; border-radius: 50%; background-color: #007ACC\"\n * ```\n *\n * @example\n * Usage in Svelte templates:\n * ```svelte\n * <div style=\"{stylesToString(myStyles)}; color: red;\"></div>\n * ```\n */\nexport function stylesToString(style: Record<string, string | number>): string {\n return Object.entries(style)\n .map(([key, value]) => {\n const cssKey = key.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);\n return `${cssKey}: ${value}`;\n })\n .join('; ');\n}\n","<script lang=\"ts\">\n import type { Snippet } from 'svelte';\n import { getCounterRotation } from '@embedpdf/utils';\n import type { Rect, Rotation } from '@embedpdf/models';\n import type { MenuWrapperProps } from './types';\n\n interface CounterRotateProps {\n rect: Rect;\n rotation: Rotation;\n }\n\n interface CounterRotateChildrenProps {\n matrix: string;\n rect: Rect;\n menuWrapperProps: MenuWrapperProps;\n }\n\n interface Props extends CounterRotateProps {\n children?: Snippet<[CounterRotateChildrenProps]>;\n }\n\n let { rect, rotation, children }: Props = $props();\n const counterRotation = $derived(getCounterRotation(rect, rotation));\n let elementRef = $state<HTMLElement | null>(null);\n\n // Use native event listeners with capture phase to prevent event propagation\n $effect(() => {\n const element = elementRef;\n if (!element) return;\n\n const handlePointerDown = (e: Event) => {\n // Stop propagation to prevent underlying layers from receiving the event\n e.stopPropagation();\n // DO NOT use e.preventDefault() here - it breaks click events on mobile/tablet!\n // preventDefault() stops the browser from generating click events from touch,\n // which makes buttons inside this container non-functional on touch devices.\n };\n\n const handleTouchStart = (e: Event) => {\n // Stop propagation to prevent underlying layers from receiving the event\n e.stopPropagation();\n // DO NOT use e.preventDefault() here - it breaks click events on mobile/tablet!\n // preventDefault() stops the browser from generating click events from touch,\n // which makes buttons inside this container non-functional on touch devices.\n };\n\n // Use capture phase to intercept before synthetic events\n element.addEventListener('pointerdown', handlePointerDown, { capture: true });\n element.addEventListener('touchstart', handleTouchStart, { capture: true });\n\n return () => {\n element.removeEventListener('pointerdown', handlePointerDown, { capture: true });\n element.removeEventListener('touchstart', handleTouchStart, { capture: true });\n };\n });\n\n const menuWrapperStyle = $derived(\n `position: absolute; ` +\n `left: ${rect.origin.x}px; ` +\n `top: ${rect.origin.y}px; ` +\n `transform: ${counterRotation.matrix}; ` +\n `transform-origin: 0 0; ` +\n `width: ${counterRotation.width}px; ` +\n `height: ${counterRotation.height}px; ` +\n `pointer-events: none; ` +\n `z-index: 3`,\n );\n\n const menuWrapperProps: MenuWrapperProps = $derived({\n style: menuWrapperStyle,\n ref: (el: HTMLElement | null) => {\n elementRef = el;\n },\n });\n</script>\n\n{#if children}\n {@render children({\n menuWrapperProps,\n matrix: counterRotation.matrix,\n rect: {\n origin: { x: rect.origin.x, y: rect.origin.y },\n size: { width: counterRotation.width, height: counterRotation.height },\n },\n })}\n{/if}\n","/**\n * Converts Svelte proxy objects to plain JavaScript objects.\n * This is useful when passing data to Web Workers or other contexts\n * that cannot handle Svelte's reactive proxies.\n *\n * Inspired by the Vue implementation, this recursively traverses the object\n * and handles primitives, arrays, and plain objects while stripping reactive proxies.\n */\nexport function deepToRaw<T extends Record<string, any>>(sourceObj: T): T {\n const objectIterator = (input: any): any => {\n // Handle null and undefined\n if (input === null || input === undefined) {\n return input;\n }\n\n // Handle primitives (string, number, boolean, bigint, symbol)\n if (typeof input !== 'object') {\n return input;\n }\n\n // Handle Arrays\n if (Array.isArray(input)) {\n return input.map((item) => objectIterator(item));\n }\n\n // Handle Date objects\n if (input instanceof Date) {\n return new Date(input.getTime());\n }\n\n // Handle RegExp\n if (input instanceof RegExp) {\n return new RegExp(input.source, input.flags);\n }\n\n // Handle plain objects (including Svelte proxies)\n // For Svelte proxies, we recursively extract plain values\n if (Object.prototype.toString.call(input) === '[object Object]') {\n return Object.keys(input).reduce((acc, key) => {\n // Skip non-enumerable properties and functions\n const value = input[key];\n if (typeof value !== 'function') {\n acc[key as keyof typeof acc] = objectIterator(value);\n }\n return acc;\n }, {} as T);\n }\n\n // For other object types (Map, Set, etc.), use JSON roundtrip as fallback\n // This will convert them to plain objects/arrays\n try {\n return JSON.parse(JSON.stringify(input));\n } catch {\n // If JSON serialization fails, return undefined\n return undefined;\n }\n };\n\n return objectIterator(sourceObj);\n}\n","export type DoublePressOptions = {\n delay?: number; // ms between taps\n tolerancePx?: number; // spatial tolerance\n onDouble?: (e: PointerEvent | MouseEvent) => void;\n};\n\nexport function doublePress<T extends Element = Element>(\n node: T,\n options: DoublePressOptions = {},\n) {\n let { onDouble, delay = 300, tolerancePx = 18 } = options;\n\n // last pointerup (time & position)\n const last = { t: 0, x: 0, y: 0 };\n\n const handlePointerUp = (e: Event) => {\n const ev = e as PointerEvent;\n if (!onDouble) return;\n\n // ignore mouse (mouse uses native dblclick)\n // ignore non-primary pointers (multi-touch, etc.)\n if (ev.pointerType === 'mouse' || ev.isPrimary === false) return;\n\n const now = performance.now();\n const x = ev.clientX;\n const y = ev.clientY;\n\n const withinTime = now - last.t <= delay;\n const dx = x - last.x;\n const dy = y - last.y;\n const withinDist = dx * dx + dy * dy <= tolerancePx * tolerancePx;\n\n if (withinTime && withinDist) onDouble?.(ev);\n\n last.t = now;\n last.x = x;\n last.y = y;\n };\n\n const handleDblClick = (e: Event) => {\n onDouble?.(e as MouseEvent);\n };\n\n node.addEventListener('pointerup', handlePointerUp, { capture: true });\n node.addEventListener('dblclick', handleDblClick);\n\n return {\n update(next?: DoublePressOptions) {\n if (!next) return;\n onDouble = next.onDouble;\n // use nullish coalescing so 0 isn't swallowed accidentally (even though 0 isn't useful here)\n delay = next.delay ?? delay;\n tolerancePx = next.tolerancePx ?? tolerancePx;\n },\n destroy() {\n node.removeEventListener('pointerup', handlePointerUp, { capture: true } as any);\n node.removeEventListener('dblclick', handleDblClick);\n },\n };\n}\n","import { useDragResize, type UseDragResizeOptions } from './use-drag-resize.svelte';\nimport {\n describeResizeFromConfig,\n describeVerticesFromConfig,\n type ResizeUI,\n type VertexUI,\n} from '../../shared/plugin-interaction-primitives';\nimport { stylesToString } from '../utils/styles-to-string';\n\nexport type HandleElementProps = {\n key: string | number;\n style: string;\n onpointerdown: (e: PointerEvent) => void;\n onpointermove: (e: PointerEvent) => void;\n onpointerup: (e: PointerEvent) => void;\n onpointercancel: (e: PointerEvent) => void;\n} & Record<string, any>;\n\nexport function useInteractionHandles(\n getOpts: () => {\n controller: UseDragResizeOptions;\n resizeUI?: ResizeUI;\n vertexUI?: VertexUI;\n includeVertices?: boolean;\n handleAttrs?: (\n h: 'nw' | 'ne' | 'sw' | 'se' | 'n' | 'e' | 's' | 'w',\n ) => Record<string, any> | void;\n vertexAttrs?: (i: number) => Record<string, any> | void;\n },\n) {\n // Use getter function and $derived to maintain reactivity\n const controller = $derived(getOpts().controller);\n const resizeUI = $derived(getOpts().resizeUI);\n const vertexUI = $derived(getOpts().vertexUI);\n const includeVertices = $derived(getOpts().includeVertices ?? false);\n const handleAttrs = $derived(getOpts().handleAttrs);\n const vertexAttrs = $derived(getOpts().vertexAttrs);\n\n const dragResize = useDragResize(() => controller);\n\n // Resize handles: computed from controller config\n const resize = $derived.by((): HandleElementProps[] => {\n const desc = describeResizeFromConfig(controller, resizeUI);\n return desc.map((d) => ({\n key: d.attrs?.['data-epdf-handle'] as string,\n style: stylesToString(d.style),\n ...dragResize.createResizeProps(d.handle),\n ...(d.attrs ?? {}),\n ...(handleAttrs?.(d.handle) ?? {}),\n }));\n });\n\n // Vertex handles: computed from controller config and vertices\n const vertices = $derived.by((): HandleElementProps[] => {\n if (!includeVertices) return [];\n const desc = describeVerticesFromConfig(controller, vertexUI, controller.vertices);\n return desc.map((d, i) => ({\n key: i,\n style: stylesToString(d.style),\n ...dragResize.createVertexProps(i),\n ...(d.attrs ?? {}),\n ...(vertexAttrs?.(i) ?? {}),\n }));\n });\n\n // Return getters to maintain reactivity when accessed from outside\n return {\n get dragProps() {\n return dragResize.dragProps;\n },\n get resize() {\n return resize;\n },\n get vertices() {\n return vertices;\n },\n };\n}\n"],"names":["DragResizeController","constructor","config","onUpdate","this","state","startPoint","startElement","activeHandle","currentPosition","activeVertexIndex","startVertices","currentVertices","vertices","updateConfig","startDrag","clientX","clientY","x","y","element","transformData","type","changes","rect","startResize","handle","metadata","maintainAspectRatio","startVertexEdit","vertexIndex","length","move","delta","calculateDelta","position","calculateDragPosition","calculateResizePosition","calculateVertexPosition","end","wasState","finalPosition","getCurrentPosition","reset","cancel","rawDelta","transformDelta","pageRotation","scale","rad","Math","PI","cos","sin","scaledX","scaledY","clampPoint","p","bbox","_a","constraints","boundingBox","max","min","width","height","newVertices","currentVertex","moved","origin","size","applyConstraints","aspectRatio","includes","newWidth","widthDiff","newHeight","heightDiff","abs","minWidth","minHeight","maxWidth","maxHeight","diagonalCursor","rot","nw","ne","sw","se","edgeOffset","k","spacing","mode","base","useDragResize","getOptions","opts","enabled","rest","$","derived","controller","user_effect","get","event","handleDragStart","e","preventDefault","stopPropagation","currentTarget","setPointerCapture","pointerId","handleMove","handleEnd","_c","_b","releasePointerCapture","call","dragProps","onpointerdown","onpointermove","onpointerup","onpointercancel","createResizeProps","createVertexProps","stylesToString","style","Object","entries","map","key","value","replace","m","toLowerCase","join","counterRotation","getCounterRotation","$$props","rotation","elementRef","handlePointerDown","handleTouchStart","addEventListener","capture","removeEventListener","menuWrapperStyle","matrix","menuWrapperProps","ref","el","set","sourceObj","objectIterator","input","Array","isArray","item","Date","getTime","RegExp","source","flags","prototype","toString","keys","reduce","acc","JSON","parse","stringify","node","options","onDouble","delay","tolerancePx","last","t","handlePointerUp","ev","pointerType","isPrimary","now","performance","withinTime","dx","dy","handleDblClick","update","next","destroy","getOpts","resizeUI","vertexUI","includeVertices","handleAttrs","vertexAttrs","dragResize","resize","cfg","ui","handleSize","offsetMode","includeSides","zIndex","rotationAwareCursor","off","edge","left","top","pos","borderRadius","cursor","touchAction","attrs","describeResizeFromConfig","d","liveVertices","vertexSize","v","i","describeVerticesFromConfig"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../src/shared/plugin-interaction-primitives/drag-resize-controller.ts","../../src/shared/plugin-interaction-primitives/utils.ts","../../src/svelte/hooks/use-drag-resize.svelte.ts","../../src/svelte/utils/styles-to-string.ts","../../src/svelte/components/CounterRotateContainer.svelte","../../src/svelte/utils/deep-to-raw.ts","../../src/svelte/actions/doublePress.ts","../../src/svelte/hooks/use-interaction-handles.svelte.ts"],"sourcesContent":["import { Position, Rect } from '@embedpdf/models';\n\nexport interface DragResizeConfig {\n element: Rect;\n vertices?: Position[];\n constraints?: {\n minWidth?: number;\n minHeight?: number;\n maxWidth?: number;\n maxHeight?: number;\n boundingBox?: { width: number; height: number }; // page bounds\n };\n maintainAspectRatio?: boolean;\n pageRotation?: number;\n scale?: number;\n}\n\nexport type InteractionState = 'idle' | 'dragging' | 'resizing' | 'vertex-editing';\nexport type ResizeHandle = 'nw' | 'ne' | 'sw' | 'se' | 'n' | 'e' | 's' | 'w';\n\nexport interface TransformData {\n type: 'move' | 'resize' | 'vertex-edit';\n changes: {\n rect?: Rect;\n vertices?: Position[];\n };\n metadata?: {\n handle?: ResizeHandle;\n vertexIndex?: number;\n maintainAspectRatio?: boolean;\n };\n}\n\nexport interface InteractionEvent {\n state: 'start' | 'move' | 'end';\n transformData?: TransformData;\n}\n\n/**\n * Pure geometric controller that manages drag/resize/vertex-edit logic.\n */\nexport class DragResizeController {\n private state: InteractionState = 'idle';\n private startPoint: Position | null = null;\n private startElement: Rect | null = null;\n private activeHandle: ResizeHandle | null = null;\n private currentPosition: Rect | null = null;\n\n // Vertex editing state - pure geometric\n private activeVertexIndex: number | null = null;\n private startVertices: Position[] = [];\n private currentVertices: Position[] = [];\n\n constructor(\n private config: DragResizeConfig,\n private onUpdate: (event: InteractionEvent) => void,\n ) {\n this.currentVertices = config.vertices || [];\n }\n\n updateConfig(config: Partial<DragResizeConfig>) {\n this.config = { ...this.config, ...config };\n this.currentVertices = config.vertices || [];\n }\n\n startDrag(clientX: number, clientY: number) {\n this.state = 'dragging';\n this.startPoint = { x: clientX, y: clientY };\n this.startElement = { ...this.config.element };\n this.currentPosition = { ...this.config.element };\n\n this.onUpdate({\n state: 'start',\n transformData: {\n type: 'move',\n changes: {\n rect: this.startElement,\n },\n },\n });\n }\n\n startResize(handle: ResizeHandle, clientX: number, clientY: number) {\n this.state = 'resizing';\n this.activeHandle = handle;\n this.startPoint = { x: clientX, y: clientY };\n this.startElement = { ...this.config.element };\n this.currentPosition = { ...this.config.element };\n\n this.onUpdate({\n state: 'start',\n transformData: {\n type: 'resize',\n changes: {\n rect: this.startElement,\n },\n metadata: {\n handle: this.activeHandle,\n maintainAspectRatio: this.config.maintainAspectRatio,\n },\n },\n });\n }\n\n startVertexEdit(vertexIndex: number, clientX: number, clientY: number) {\n // Refresh vertices from latest config before validating index\n this.currentVertices = [...(this.config.vertices ?? this.currentVertices)];\n if (vertexIndex < 0 || vertexIndex >= this.currentVertices.length) return;\n\n this.state = 'vertex-editing';\n this.activeVertexIndex = vertexIndex;\n this.startPoint = { x: clientX, y: clientY };\n this.startVertices = [...this.currentVertices];\n\n this.onUpdate({\n state: 'start',\n transformData: {\n type: 'vertex-edit',\n changes: {\n vertices: this.startVertices,\n },\n metadata: {\n vertexIndex,\n },\n },\n });\n }\n\n move(clientX: number, clientY: number) {\n if (this.state === 'idle' || !this.startPoint) return;\n\n if (this.state === 'dragging' && this.startElement) {\n const delta = this.calculateDelta(clientX, clientY);\n const position = this.calculateDragPosition(delta);\n this.currentPosition = position;\n\n this.onUpdate({\n state: 'move',\n transformData: {\n type: 'move',\n changes: {\n rect: position,\n },\n },\n });\n } else if (this.state === 'resizing' && this.activeHandle && this.startElement) {\n const delta = this.calculateDelta(clientX, clientY);\n const position = this.calculateResizePosition(delta, this.activeHandle);\n this.currentPosition = position;\n\n this.onUpdate({\n state: 'move',\n transformData: {\n type: 'resize',\n changes: {\n rect: position,\n },\n metadata: {\n handle: this.activeHandle,\n maintainAspectRatio: this.config.maintainAspectRatio,\n },\n },\n });\n } else if (this.state === 'vertex-editing' && this.activeVertexIndex !== null) {\n const vertices = this.calculateVertexPosition(clientX, clientY);\n this.currentVertices = vertices;\n\n this.onUpdate({\n state: 'move',\n transformData: {\n type: 'vertex-edit',\n changes: {\n vertices,\n },\n metadata: {\n vertexIndex: this.activeVertexIndex,\n },\n },\n });\n }\n }\n\n end() {\n if (this.state === 'idle') return;\n\n const wasState = this.state;\n const handle = this.activeHandle;\n const vertexIndex = this.activeVertexIndex;\n\n if (wasState === 'vertex-editing') {\n this.onUpdate({\n state: 'end',\n transformData: {\n type: 'vertex-edit',\n changes: {\n vertices: this.currentVertices,\n },\n metadata: {\n vertexIndex: vertexIndex || undefined,\n },\n },\n });\n } else {\n const finalPosition = this.getCurrentPosition();\n this.onUpdate({\n state: 'end',\n transformData: {\n type: wasState === 'dragging' ? 'move' : 'resize',\n changes: {\n rect: finalPosition,\n },\n metadata:\n wasState === 'dragging'\n ? undefined\n : {\n handle: handle || undefined,\n maintainAspectRatio: this.config.maintainAspectRatio,\n },\n },\n });\n }\n\n this.reset();\n }\n\n cancel() {\n if (this.state === 'idle') return;\n\n if (this.state === 'vertex-editing') {\n this.onUpdate({\n state: 'end',\n transformData: {\n type: 'vertex-edit',\n changes: {\n vertices: this.startVertices,\n },\n metadata: {\n vertexIndex: this.activeVertexIndex || undefined,\n },\n },\n });\n } else if (this.startElement) {\n this.onUpdate({\n state: 'end',\n transformData: {\n type: this.state === 'dragging' ? 'move' : 'resize',\n changes: {\n rect: this.startElement,\n },\n metadata:\n this.state === 'dragging'\n ? undefined\n : {\n handle: this.activeHandle || undefined,\n maintainAspectRatio: this.config.maintainAspectRatio,\n },\n },\n });\n }\n\n this.reset();\n }\n\n private reset() {\n this.state = 'idle';\n this.startPoint = null;\n this.startElement = null;\n this.activeHandle = null;\n this.currentPosition = null;\n this.activeVertexIndex = null;\n this.startVertices = [];\n }\n\n private getCurrentPosition() {\n return this.currentPosition || this.config.element;\n }\n\n private calculateDelta(clientX: number, clientY: number): Position {\n if (!this.startPoint) return { x: 0, y: 0 };\n\n const rawDelta: Position = {\n x: clientX - this.startPoint.x,\n y: clientY - this.startPoint.y,\n };\n\n return this.transformDelta(rawDelta);\n }\n\n private transformDelta(delta: Position): Position {\n const { pageRotation = 0, scale = 1 } = this.config;\n\n const rad = (pageRotation * Math.PI) / 2;\n const cos = Math.cos(rad);\n const sin = Math.sin(rad);\n\n const scaledX = delta.x / scale;\n const scaledY = delta.y / scale;\n\n return {\n x: cos * scaledX + sin * scaledY,\n y: -sin * scaledX + cos * scaledY,\n };\n }\n\n private clampPoint(p: Position): Position {\n const bbox = this.config.constraints?.boundingBox;\n if (!bbox) return p;\n return {\n x: Math.max(0, Math.min(p.x, bbox.width)),\n y: Math.max(0, Math.min(p.y, bbox.height)),\n };\n }\n\n private calculateVertexPosition(clientX: number, clientY: number): Position[] {\n if (this.activeVertexIndex === null) return this.startVertices;\n\n const delta = this.calculateDelta(clientX, clientY);\n const newVertices = [...this.startVertices];\n const currentVertex = newVertices[this.activeVertexIndex];\n\n const moved = {\n x: currentVertex.x + delta.x,\n y: currentVertex.y + delta.y,\n };\n newVertices[this.activeVertexIndex] = this.clampPoint(moved);\n\n return newVertices;\n }\n\n private calculateDragPosition(delta: Position): Rect {\n if (!this.startElement) return this.config.element;\n\n const position: Rect = {\n origin: {\n x: this.startElement.origin.x + delta.x,\n y: this.startElement.origin.y + delta.y,\n },\n size: {\n width: this.startElement.size.width,\n height: this.startElement.size.height,\n },\n };\n\n return this.applyConstraints(position);\n }\n\n private calculateResizePosition(delta: Position, handle: ResizeHandle): Rect {\n if (!this.startElement) return this.config.element;\n\n let {\n origin: { x, y },\n size: { width, height },\n } = this.startElement;\n\n switch (handle) {\n case 'se':\n width += delta.x;\n height += delta.y;\n break;\n case 'sw':\n x += delta.x;\n width -= delta.x;\n height += delta.y;\n break;\n case 'ne':\n width += delta.x;\n y += delta.y;\n height -= delta.y;\n break;\n case 'nw':\n x += delta.x;\n width -= delta.x;\n y += delta.y;\n height -= delta.y;\n break;\n case 'n':\n y += delta.y;\n height -= delta.y;\n break;\n case 's':\n height += delta.y;\n break;\n case 'e':\n width += delta.x;\n break;\n case 'w':\n x += delta.x;\n width -= delta.x;\n break;\n }\n\n // Maintain aspect ratio if needed\n if (this.config.maintainAspectRatio && this.startElement) {\n const aspectRatio = this.startElement.size.width / this.startElement.size.height;\n\n if (['n', 's', 'e', 'w'].includes(handle)) {\n if (handle === 'n' || handle === 's') {\n const newWidth = height * aspectRatio;\n const widthDiff = newWidth - width;\n width = newWidth;\n x -= widthDiff / 2;\n } else {\n const newHeight = width / aspectRatio;\n const heightDiff = newHeight - height;\n height = newHeight;\n if (handle === 'w') {\n x = this.startElement.origin.x + this.startElement.size.width - width;\n }\n y -= heightDiff / 2;\n }\n } else {\n const widthChange = Math.abs(width - this.startElement.size.width);\n const heightChange = Math.abs(height - this.startElement.size.height);\n if (widthChange > heightChange) {\n height = width / aspectRatio;\n } else {\n width = height * aspectRatio;\n }\n if (handle.includes('w')) {\n x = this.startElement.origin.x + this.startElement.size.width - width;\n }\n if (handle.includes('n')) {\n y = this.startElement.origin.y + this.startElement.size.height - height;\n }\n }\n }\n\n // Handle-aware bounding box clamping to avoid shifting opposite edge\n const bbox = this.config.constraints?.boundingBox;\n if (bbox) {\n switch (handle) {\n case 'e':\n width = Math.min(width, bbox.width - x);\n break;\n case 's':\n height = Math.min(height, bbox.height - y);\n break;\n case 'se':\n width = Math.min(width, bbox.width - x);\n height = Math.min(height, bbox.height - y);\n break;\n case 'w':\n if (x < 0) {\n width += x;\n x = 0;\n }\n break;\n case 'n':\n if (y < 0) {\n height += y;\n y = 0;\n }\n break;\n case 'sw':\n if (x < 0) {\n width += x;\n x = 0;\n }\n height = Math.min(height, bbox.height - y);\n break;\n case 'nw':\n if (x < 0) {\n width += x;\n x = 0;\n }\n if (y < 0) {\n height += y;\n y = 0;\n }\n break;\n case 'ne':\n width = Math.min(width, bbox.width - x);\n if (y < 0) {\n height += y;\n y = 0;\n }\n break;\n }\n }\n\n return this.applyConstraints({ origin: { x, y }, size: { width, height } });\n }\n\n private applyConstraints(position: Rect): Rect {\n const { constraints } = this.config;\n if (!constraints) return position;\n\n let {\n origin: { x, y },\n size: { width, height },\n } = position;\n\n // Apply size constraints\n width = Math.max(constraints.minWidth || 1, width);\n height = Math.max(constraints.minHeight || 1, height);\n\n if (constraints.maxWidth) width = Math.min(constraints.maxWidth, width);\n if (constraints.maxHeight) height = Math.min(constraints.maxHeight, height);\n\n // Apply bounding box constraints\n if (constraints.boundingBox) {\n x = Math.max(0, Math.min(x, constraints.boundingBox.width - width));\n y = Math.max(0, Math.min(y, constraints.boundingBox.height - height));\n }\n\n return { origin: { x, y }, size: { width, height } };\n }\n}\n","import type { Position, Rect } from '@embedpdf/models';\nimport type { ResizeHandle, DragResizeConfig } from './drag-resize-controller';\n\nexport type QuarterTurns = 0 | 1 | 2 | 3;\n\nexport interface ResizeUI {\n handleSize?: number; // px (default 8)\n spacing?: number; // px distance from the box edge (default 1)\n offsetMode?: 'outside' | 'inside' | 'center'; // default 'outside'\n includeSides?: boolean; // default false\n zIndex?: number; // default 3\n rotationAwareCursor?: boolean; // default true\n}\n\nexport interface VertexUI {\n vertexSize?: number; // px (default 12)\n zIndex?: number; // default 4\n}\n\nexport interface HandleDescriptor {\n handle: ResizeHandle;\n style: Record<string, number | string>;\n attrs?: Record<string, any>;\n}\n\nfunction diagonalCursor(handle: ResizeHandle, rot: QuarterTurns): string {\n // Standard cursors; diagonals flip on odd quarter-turns\n const diag0: Record<'nw' | 'ne' | 'sw' | 'se', string> = {\n nw: 'nwse-resize',\n ne: 'nesw-resize',\n sw: 'nesw-resize',\n se: 'nwse-resize',\n };\n if (handle === 'n' || handle === 's') return 'ns-resize';\n if (handle === 'e' || handle === 'w') return 'ew-resize';\n if (rot % 2 === 0) return diag0[handle as 'nw' | 'ne' | 'sw' | 'se'];\n return { nw: 'nesw-resize', ne: 'nwse-resize', sw: 'nwse-resize', se: 'nesw-resize' }[\n handle as 'nw' | 'ne' | 'sw' | 'se'\n ]!;\n}\n\nfunction edgeOffset(k: number, spacing: number, mode: 'outside' | 'inside' | 'center') {\n // Base puts the handle centered on the edge\n const base = -k / 2;\n if (mode === 'center') return base;\n // outside moves further out (more negative), inside moves in (less negative)\n return mode === 'outside' ? base - spacing : base + spacing;\n}\n\nexport function describeResizeFromConfig(\n cfg: DragResizeConfig,\n ui: ResizeUI = {},\n): HandleDescriptor[] {\n const {\n handleSize = 8,\n spacing = 1,\n offsetMode = 'outside',\n includeSides = false,\n zIndex = 3,\n rotationAwareCursor = true,\n } = ui;\n\n const rotation = ((cfg.pageRotation ?? 0) % 4) as QuarterTurns;\n\n const off = (edge: 'top' | 'right' | 'bottom' | 'left') => ({\n [edge]: edgeOffset(handleSize, spacing, offsetMode) + 'px',\n });\n\n const corners: Array<[ResizeHandle, Record<string, number | string>]> = [\n ['nw', { ...off('top'), ...off('left') }],\n ['ne', { ...off('top'), ...off('right') }],\n ['sw', { ...off('bottom'), ...off('left') }],\n ['se', { ...off('bottom'), ...off('right') }],\n ];\n const sides: Array<[ResizeHandle, Record<string, number | string>]> = includeSides\n ? [\n ['n', { ...off('top'), left: `calc(50% - ${handleSize / 2}px)` }],\n ['s', { ...off('bottom'), left: `calc(50% - ${handleSize / 2}px)` }],\n ['w', { ...off('left'), top: `calc(50% - ${handleSize / 2}px)` }],\n ['e', { ...off('right'), top: `calc(50% - ${handleSize / 2}px)` }],\n ]\n : [];\n\n const all = [...corners, ...sides];\n\n return all.map(([handle, pos]) => ({\n handle,\n style: {\n position: 'absolute',\n width: handleSize + 'px',\n height: handleSize + 'px',\n borderRadius: '50%',\n zIndex,\n cursor: rotationAwareCursor ? diagonalCursor(handle, rotation) : 'default',\n touchAction: 'none',\n ...(pos as any),\n },\n attrs: { 'data-epdf-handle': handle },\n }));\n}\n\nexport function describeVerticesFromConfig(\n cfg: DragResizeConfig,\n ui: VertexUI = {},\n liveVertices?: Position[],\n): HandleDescriptor[] {\n const { vertexSize = 12, zIndex = 4 } = ui;\n const rect: Rect = cfg.element;\n const scale = cfg.scale ?? 1;\n const verts = liveVertices ?? cfg.vertices ?? [];\n\n return verts.map((v, i) => {\n const left = (v.x - rect.origin.x) * scale - vertexSize / 2;\n const top = (v.y - rect.origin.y) * scale - vertexSize / 2;\n return {\n handle: 'nw', // not used; kept for type\n style: {\n position: 'absolute',\n left: left + 'px',\n top: top + 'px',\n width: vertexSize + 'px',\n height: vertexSize + 'px',\n borderRadius: '50%',\n cursor: 'pointer',\n zIndex,\n touchAction: 'none',\n },\n attrs: { 'data-epdf-vertex': i },\n };\n });\n}\n","import {\n type DragResizeConfig,\n DragResizeController,\n type InteractionEvent,\n type ResizeHandle,\n} from '../../shared/plugin-interaction-primitives';\n\nexport interface UseDragResizeOptions extends DragResizeConfig {\n onUpdate?: (event: InteractionEvent) => void;\n enabled?: boolean;\n}\n\nexport interface ResizeHandleEventProps {\n onpointerdown: (e: PointerEvent) => void;\n onpointermove: (e: PointerEvent) => void;\n onpointerup: (e: PointerEvent) => void;\n onpointercancel: (e: PointerEvent) => void;\n}\n\nexport function useDragResize(getOptions: () => UseDragResizeOptions) {\n // Use getter function to maintain reactivity\n const config = $derived.by(() => {\n const opts = getOptions();\n const { onUpdate, enabled, ...rest } = opts;\n return rest;\n });\n\n const enabled = $derived(getOptions().enabled ?? true);\n const onUpdate = $derived(getOptions().onUpdate);\n\n let controller = $state<DragResizeController | null>(null);\n\n // Initialize or update controller\n $effect(() => {\n if (!controller) {\n controller = new DragResizeController(config, (event) => onUpdate?.(event));\n } else {\n controller.updateConfig(config);\n }\n });\n\n const handleDragStart = (e: PointerEvent) => {\n if (!enabled) return;\n e.preventDefault();\n e.stopPropagation();\n controller?.startDrag(e.clientX, e.clientY);\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n };\n\n const handleMove = (e: PointerEvent) => {\n e.preventDefault();\n e.stopPropagation();\n controller?.move(e.clientX, e.clientY);\n };\n\n const handleEnd = (e: PointerEvent) => {\n e.preventDefault();\n e.stopPropagation();\n controller?.end();\n (e.currentTarget as HTMLElement).releasePointerCapture?.(e.pointerId);\n };\n\n const createResizeHandler = (handle: ResizeHandle): ResizeHandleEventProps => ({\n onpointerdown: (e: PointerEvent) => {\n if (!enabled) return;\n e.preventDefault();\n e.stopPropagation();\n controller?.startResize(handle, e.clientX, e.clientY);\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n },\n onpointermove: handleMove,\n onpointerup: handleEnd,\n onpointercancel: handleEnd,\n });\n\n const createVertexHandler = (vertexIndex: number): ResizeHandleEventProps => ({\n onpointerdown: (e: PointerEvent) => {\n if (!enabled) return;\n e.preventDefault();\n e.stopPropagation();\n controller?.startVertexEdit(vertexIndex, e.clientX, e.clientY);\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n },\n onpointermove: handleMove,\n onpointerup: handleEnd,\n onpointercancel: handleEnd,\n });\n\n const dragProps = $derived(\n enabled\n ? {\n onpointerdown: handleDragStart,\n onpointermove: handleMove,\n onpointerup: handleEnd,\n onpointercancel: handleEnd,\n }\n : {},\n );\n\n return {\n get dragProps() {\n return dragProps;\n },\n createResizeProps: createResizeHandler,\n createVertexProps: createVertexHandler,\n };\n}\n","/**\n * Converts a style object with camelCase properties to a CSS string with kebab-case properties.\n *\n * This is useful in Svelte 5 where spreading style objects doesn't work with the `style:` directive.\n * Instead, you can convert the entire style object to a string and apply it to the `style` attribute.\n *\n * @param style - An object containing CSS properties in camelCase format with string or number values\n * @returns A CSS string with kebab-case properties suitable for the HTML style attribute\n *\n * @example\n * ```ts\n * const styles = {\n * position: 'absolute',\n * zIndex: 10,\n * borderRadius: '50%',\n * backgroundColor: '#007ACC'\n * };\n *\n * const cssString = stylesToString(styles);\n * // Returns: \"position: absolute; z-index: 10; border-radius: 50%; background-color: #007ACC\"\n * ```\n *\n * @example\n * Usage in Svelte templates:\n * ```svelte\n * <div style=\"{stylesToString(myStyles)}; color: red;\"></div>\n * ```\n */\nexport function stylesToString(style: Record<string, string | number>): string {\n return Object.entries(style)\n .map(([key, value]) => {\n const cssKey = key.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);\n return `${cssKey}: ${value}`;\n })\n .join('; ');\n}\n","<script lang=\"ts\">\n import type { Snippet } from 'svelte';\n import type { Action } from 'svelte/action';\n import { getCounterRotation } from '@embedpdf/utils';\n import type { Rect, Rotation } from '@embedpdf/models';\n import type { MenuWrapperProps } from './types';\n\n interface CounterRotateProps {\n rect: Rect;\n rotation: Rotation;\n }\n\n interface CounterRotateChildrenProps {\n matrix: string;\n rect: Rect;\n menuWrapperProps: MenuWrapperProps;\n }\n\n interface Props extends CounterRotateProps {\n children?: Snippet<[CounterRotateChildrenProps]>;\n }\n\n let { rect, rotation, children }: Props = $props();\n const counterRotation = $derived(getCounterRotation(rect, rotation));\n\n // Svelte action for capture-phase event handling\n // This is the idiomatic way to attach lifecycle-managed behavior to DOM elements\n const menuWrapperAction: Action<HTMLElement> = (node) => {\n const handlePointerDown = (e: Event) => {\n // Stop propagation to prevent underlying layers from receiving the event\n e.stopPropagation();\n // DO NOT use e.preventDefault() here - it breaks click events on mobile/tablet!\n // preventDefault() stops the browser from generating click events from touch,\n // which makes buttons inside this container non-functional on touch devices.\n };\n\n const handleTouchStart = (e: Event) => {\n // Stop propagation to prevent underlying layers from receiving the event\n e.stopPropagation();\n // DO NOT use e.preventDefault() here - it breaks click events on mobile/tablet!\n };\n\n // Use capture phase to intercept before synthetic events\n node.addEventListener('pointerdown', handlePointerDown, { capture: true });\n node.addEventListener('touchstart', handleTouchStart, { capture: true });\n\n return {\n destroy() {\n node.removeEventListener('pointerdown', handlePointerDown, { capture: true });\n node.removeEventListener('touchstart', handleTouchStart, { capture: true });\n },\n };\n };\n\n const menuWrapperStyle = $derived(\n `position: absolute; ` +\n `left: ${rect.origin.x}px; ` +\n `top: ${rect.origin.y}px; ` +\n `transform: ${counterRotation.matrix}; ` +\n `transform-origin: 0 0; ` +\n `width: ${counterRotation.width}px; ` +\n `height: ${counterRotation.height}px; ` +\n `pointer-events: none; ` +\n `z-index: 3`,\n );\n\n const menuWrapperProps: MenuWrapperProps = $derived({\n style: menuWrapperStyle,\n action: menuWrapperAction,\n });\n</script>\n\n{#if children}\n {@render children({\n menuWrapperProps,\n matrix: counterRotation.matrix,\n rect: {\n origin: { x: rect.origin.x, y: rect.origin.y },\n size: { width: counterRotation.width, height: counterRotation.height },\n },\n })}\n{/if}\n","/**\n * Converts Svelte proxy objects to plain JavaScript objects.\n * This is useful when passing data to Web Workers or other contexts\n * that cannot handle Svelte's reactive proxies.\n *\n * Inspired by the Vue implementation, this recursively traverses the object\n * and handles primitives, arrays, and plain objects while stripping reactive proxies.\n */\nexport function deepToRaw<T extends Record<string, any>>(sourceObj: T): T {\n const objectIterator = (input: any): any => {\n // Handle null and undefined\n if (input === null || input === undefined) {\n return input;\n }\n\n // Handle primitives (string, number, boolean, bigint, symbol)\n if (typeof input !== 'object') {\n return input;\n }\n\n // Handle Arrays\n if (Array.isArray(input)) {\n return input.map((item) => objectIterator(item));\n }\n\n // Handle Date objects\n if (input instanceof Date) {\n return new Date(input.getTime());\n }\n\n // Handle RegExp\n if (input instanceof RegExp) {\n return new RegExp(input.source, input.flags);\n }\n\n // Handle plain objects (including Svelte proxies)\n // For Svelte proxies, we recursively extract plain values\n if (Object.prototype.toString.call(input) === '[object Object]') {\n return Object.keys(input).reduce((acc, key) => {\n // Skip non-enumerable properties and functions\n const value = input[key];\n if (typeof value !== 'function') {\n acc[key as keyof typeof acc] = objectIterator(value);\n }\n return acc;\n }, {} as T);\n }\n\n // For other object types (Map, Set, etc.), use JSON roundtrip as fallback\n // This will convert them to plain objects/arrays\n try {\n return JSON.parse(JSON.stringify(input));\n } catch {\n // If JSON serialization fails, return undefined\n return undefined;\n }\n };\n\n return objectIterator(sourceObj);\n}\n","export type DoublePressOptions = {\n delay?: number; // ms between taps\n tolerancePx?: number; // spatial tolerance\n onDouble?: (e: PointerEvent | MouseEvent) => void;\n};\n\nexport function doublePress<T extends Element = Element>(\n node: T,\n options: DoublePressOptions = {},\n) {\n let { onDouble, delay = 300, tolerancePx = 18 } = options;\n\n // last pointerup (time & position)\n const last = { t: 0, x: 0, y: 0 };\n\n const handlePointerUp = (e: Event) => {\n const ev = e as PointerEvent;\n if (!onDouble) return;\n\n // ignore mouse (mouse uses native dblclick)\n // ignore non-primary pointers (multi-touch, etc.)\n if (ev.pointerType === 'mouse' || ev.isPrimary === false) return;\n\n const now = performance.now();\n const x = ev.clientX;\n const y = ev.clientY;\n\n const withinTime = now - last.t <= delay;\n const dx = x - last.x;\n const dy = y - last.y;\n const withinDist = dx * dx + dy * dy <= tolerancePx * tolerancePx;\n\n if (withinTime && withinDist) onDouble?.(ev);\n\n last.t = now;\n last.x = x;\n last.y = y;\n };\n\n const handleDblClick = (e: Event) => {\n onDouble?.(e as MouseEvent);\n };\n\n node.addEventListener('pointerup', handlePointerUp, { capture: true });\n node.addEventListener('dblclick', handleDblClick);\n\n return {\n update(next?: DoublePressOptions) {\n if (!next) return;\n onDouble = next.onDouble;\n // use nullish coalescing so 0 isn't swallowed accidentally (even though 0 isn't useful here)\n delay = next.delay ?? delay;\n tolerancePx = next.tolerancePx ?? tolerancePx;\n },\n destroy() {\n node.removeEventListener('pointerup', handlePointerUp, { capture: true } as any);\n node.removeEventListener('dblclick', handleDblClick);\n },\n };\n}\n","import { useDragResize, type UseDragResizeOptions } from './use-drag-resize.svelte';\nimport {\n describeResizeFromConfig,\n describeVerticesFromConfig,\n type ResizeUI,\n type VertexUI,\n} from '../../shared/plugin-interaction-primitives';\nimport { stylesToString } from '../utils/styles-to-string';\n\nexport type HandleElementProps = {\n key: string | number;\n style: string;\n onpointerdown: (e: PointerEvent) => void;\n onpointermove: (e: PointerEvent) => void;\n onpointerup: (e: PointerEvent) => void;\n onpointercancel: (e: PointerEvent) => void;\n} & Record<string, any>;\n\nexport function useInteractionHandles(\n getOpts: () => {\n controller: UseDragResizeOptions;\n resizeUI?: ResizeUI;\n vertexUI?: VertexUI;\n includeVertices?: boolean;\n handleAttrs?: (\n h: 'nw' | 'ne' | 'sw' | 'se' | 'n' | 'e' | 's' | 'w',\n ) => Record<string, any> | void;\n vertexAttrs?: (i: number) => Record<string, any> | void;\n },\n) {\n // Use getter function and $derived to maintain reactivity\n const controller = $derived(getOpts().controller);\n const resizeUI = $derived(getOpts().resizeUI);\n const vertexUI = $derived(getOpts().vertexUI);\n const includeVertices = $derived(getOpts().includeVertices ?? false);\n const handleAttrs = $derived(getOpts().handleAttrs);\n const vertexAttrs = $derived(getOpts().vertexAttrs);\n\n const dragResize = useDragResize(() => controller);\n\n // Resize handles: computed from controller config\n const resize = $derived.by((): HandleElementProps[] => {\n const desc = describeResizeFromConfig(controller, resizeUI);\n return desc.map((d) => ({\n key: d.attrs?.['data-epdf-handle'] as string,\n style: stylesToString(d.style),\n ...dragResize.createResizeProps(d.handle),\n ...(d.attrs ?? {}),\n ...(handleAttrs?.(d.handle) ?? {}),\n }));\n });\n\n // Vertex handles: computed from controller config and vertices\n const vertices = $derived.by((): HandleElementProps[] => {\n if (!includeVertices) return [];\n const desc = describeVerticesFromConfig(controller, vertexUI, controller.vertices);\n return desc.map((d, i) => ({\n key: i,\n style: stylesToString(d.style),\n ...dragResize.createVertexProps(i),\n ...(d.attrs ?? {}),\n ...(vertexAttrs?.(i) ?? {}),\n }));\n });\n\n // Return getters to maintain reactivity when accessed from outside\n return {\n get dragProps() {\n return dragResize.dragProps;\n },\n get resize() {\n return resize;\n },\n get vertices() {\n return vertices;\n },\n };\n}\n"],"names":["DragResizeController","constructor","config","onUpdate","this","state","startPoint","startElement","activeHandle","currentPosition","activeVertexIndex","startVertices","currentVertices","vertices","updateConfig","startDrag","clientX","clientY","x","y","element","transformData","type","changes","rect","startResize","handle","metadata","maintainAspectRatio","startVertexEdit","vertexIndex","length","move","delta","calculateDelta","position","calculateDragPosition","calculateResizePosition","calculateVertexPosition","end","wasState","finalPosition","getCurrentPosition","reset","cancel","rawDelta","transformDelta","pageRotation","scale","rad","Math","PI","cos","sin","scaledX","scaledY","clampPoint","p","bbox","_a","constraints","boundingBox","max","min","width","height","newVertices","currentVertex","moved","origin","size","applyConstraints","aspectRatio","includes","newWidth","widthDiff","newHeight","heightDiff","abs","minWidth","minHeight","maxWidth","maxHeight","diagonalCursor","rot","nw","ne","sw","se","edgeOffset","k","spacing","mode","base","useDragResize","getOptions","opts","enabled","rest","$","derived","controller","user_effect","get","event","handleDragStart","e","preventDefault","stopPropagation","currentTarget","setPointerCapture","pointerId","handleMove","handleEnd","_c","_b","releasePointerCapture","call","dragProps","onpointerdown","onpointermove","onpointerup","onpointercancel","createResizeProps","createVertexProps","stylesToString","style","Object","entries","map","key","value","replace","m","toLowerCase","join","counterRotation","getCounterRotation","$$props","rotation","menuWrapperAction","node","handlePointerDown","handleTouchStart","addEventListener","capture","destroy","removeEventListener","menuWrapperStyle","matrix","menuWrapperProps","action","sourceObj","objectIterator","input","Array","isArray","item","Date","getTime","RegExp","source","flags","prototype","toString","keys","reduce","acc","JSON","parse","stringify","options","onDouble","delay","tolerancePx","last","t","handlePointerUp","ev","pointerType","isPrimary","now","performance","withinTime","dx","dy","handleDblClick","update","next","getOpts","resizeUI","vertexUI","includeVertices","handleAttrs","vertexAttrs","dragResize","resize","cfg","ui","handleSize","offsetMode","includeSides","zIndex","rotationAwareCursor","off","edge","left","top","pos","borderRadius","cursor","touchAction","attrs","describeResizeFromConfig","d","liveVertices","vertexSize","v","i","describeVerticesFromConfig"],"mappings":"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"}
@@ -662,37 +662,31 @@ function doublePress(node, options = {}) {
662
662
  function CounterRotateContainer($$anchor, $$props) {
663
663
  $.push($$props, true);
664
664
  const counterRotation = $.derived(() => getCounterRotation($$props.rect, $$props.rotation));
665
- let elementRef = $.state(null);
666
- $.user_effect(() => {
667
- const element = $.get(elementRef);
668
- if (!element) return;
665
+ const menuWrapperAction = (node) => {
669
666
  const handlePointerDown = (e) => {
670
667
  e.stopPropagation();
671
668
  };
672
669
  const handleTouchStart = (e) => {
673
670
  e.stopPropagation();
674
671
  };
675
- element.addEventListener("pointerdown", handlePointerDown, { capture: true });
676
- element.addEventListener("touchstart", handleTouchStart, { capture: true });
677
- return () => {
678
- element.removeEventListener("pointerdown", handlePointerDown, { capture: true });
679
- element.removeEventListener("touchstart", handleTouchStart, { capture: true });
672
+ node.addEventListener("pointerdown", handlePointerDown, { capture: true });
673
+ node.addEventListener("touchstart", handleTouchStart, { capture: true });
674
+ return {
675
+ destroy() {
676
+ node.removeEventListener("pointerdown", handlePointerDown, { capture: true });
677
+ node.removeEventListener("touchstart", handleTouchStart, { capture: true });
678
+ }
680
679
  };
681
- });
680
+ };
682
681
  const menuWrapperStyle = $.derived(() => `position: absolute; left: ${$$props.rect.origin.x}px; top: ${$$props.rect.origin.y}px; transform: ${$.get(counterRotation).matrix}; transform-origin: 0 0; width: ${$.get(counterRotation).width}px; height: ${$.get(counterRotation).height}px; pointer-events: none; z-index: 3`);
683
- const menuWrapperProps = $.derived(() => ({
684
- style: $.get(menuWrapperStyle),
685
- ref: (el) => {
686
- $.set(elementRef, el, true);
687
- }
688
- }));
682
+ const menuWrapperProps = $.derived(() => ({ style: $.get(menuWrapperStyle), action: menuWrapperAction }));
689
683
  var fragment = $.comment();
690
- var node = $.first_child(fragment);
684
+ var node_1 = $.first_child(fragment);
691
685
  {
692
686
  var consequent = ($$anchor2) => {
693
687
  var fragment_1 = $.comment();
694
- var node_1 = $.first_child(fragment_1);
695
- $.snippet(node_1, () => $$props.children, () => ({
688
+ var node_2 = $.first_child(fragment_1);
689
+ $.snippet(node_2, () => $$props.children, () => ({
696
690
  menuWrapperProps: $.get(menuWrapperProps),
697
691
  matrix: $.get(counterRotation).matrix,
698
692
  rect: {
@@ -705,7 +699,7 @@ function CounterRotateContainer($$anchor, $$props) {
705
699
  }));
706
700
  $.append($$anchor2, fragment_1);
707
701
  };
708
- $.if(node, ($$render) => {
702
+ $.if(node_1, ($$render) => {
709
703
  if ($$props.children) $$render(consequent);
710
704
  });
711
705
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/shared/plugin-interaction-primitives/drag-resize-controller.ts","../../src/shared/plugin-interaction-primitives/utils.ts","../../src/svelte/hooks/use-drag-resize.svelte.ts","../../src/svelte/utils/styles-to-string.ts","../../src/svelte/hooks/use-interaction-handles.svelte.ts","../../src/svelte/actions/doublePress.ts","../../src/svelte/components/CounterRotateContainer.svelte","../../src/svelte/utils/deep-to-raw.ts"],"sourcesContent":["import { Position, Rect } from '@embedpdf/models';\n\nexport interface DragResizeConfig {\n element: Rect;\n vertices?: Position[];\n constraints?: {\n minWidth?: number;\n minHeight?: number;\n maxWidth?: number;\n maxHeight?: number;\n boundingBox?: { width: number; height: number }; // page bounds\n };\n maintainAspectRatio?: boolean;\n pageRotation?: number;\n scale?: number;\n}\n\nexport type InteractionState = 'idle' | 'dragging' | 'resizing' | 'vertex-editing';\nexport type ResizeHandle = 'nw' | 'ne' | 'sw' | 'se' | 'n' | 'e' | 's' | 'w';\n\nexport interface TransformData {\n type: 'move' | 'resize' | 'vertex-edit';\n changes: {\n rect?: Rect;\n vertices?: Position[];\n };\n metadata?: {\n handle?: ResizeHandle;\n vertexIndex?: number;\n maintainAspectRatio?: boolean;\n };\n}\n\nexport interface InteractionEvent {\n state: 'start' | 'move' | 'end';\n transformData?: TransformData;\n}\n\n/**\n * Pure geometric controller that manages drag/resize/vertex-edit logic.\n */\nexport class DragResizeController {\n private state: InteractionState = 'idle';\n private startPoint: Position | null = null;\n private startElement: Rect | null = null;\n private activeHandle: ResizeHandle | null = null;\n private currentPosition: Rect | null = null;\n\n // Vertex editing state - pure geometric\n private activeVertexIndex: number | null = null;\n private startVertices: Position[] = [];\n private currentVertices: Position[] = [];\n\n constructor(\n private config: DragResizeConfig,\n private onUpdate: (event: InteractionEvent) => void,\n ) {\n this.currentVertices = config.vertices || [];\n }\n\n updateConfig(config: Partial<DragResizeConfig>) {\n this.config = { ...this.config, ...config };\n this.currentVertices = config.vertices || [];\n }\n\n startDrag(clientX: number, clientY: number) {\n this.state = 'dragging';\n this.startPoint = { x: clientX, y: clientY };\n this.startElement = { ...this.config.element };\n this.currentPosition = { ...this.config.element };\n\n this.onUpdate({\n state: 'start',\n transformData: {\n type: 'move',\n changes: {\n rect: this.startElement,\n },\n },\n });\n }\n\n startResize(handle: ResizeHandle, clientX: number, clientY: number) {\n this.state = 'resizing';\n this.activeHandle = handle;\n this.startPoint = { x: clientX, y: clientY };\n this.startElement = { ...this.config.element };\n this.currentPosition = { ...this.config.element };\n\n this.onUpdate({\n state: 'start',\n transformData: {\n type: 'resize',\n changes: {\n rect: this.startElement,\n },\n metadata: {\n handle: this.activeHandle,\n maintainAspectRatio: this.config.maintainAspectRatio,\n },\n },\n });\n }\n\n startVertexEdit(vertexIndex: number, clientX: number, clientY: number) {\n // Refresh vertices from latest config before validating index\n this.currentVertices = [...(this.config.vertices ?? this.currentVertices)];\n if (vertexIndex < 0 || vertexIndex >= this.currentVertices.length) return;\n\n this.state = 'vertex-editing';\n this.activeVertexIndex = vertexIndex;\n this.startPoint = { x: clientX, y: clientY };\n this.startVertices = [...this.currentVertices];\n\n this.onUpdate({\n state: 'start',\n transformData: {\n type: 'vertex-edit',\n changes: {\n vertices: this.startVertices,\n },\n metadata: {\n vertexIndex,\n },\n },\n });\n }\n\n move(clientX: number, clientY: number) {\n if (this.state === 'idle' || !this.startPoint) return;\n\n if (this.state === 'dragging' && this.startElement) {\n const delta = this.calculateDelta(clientX, clientY);\n const position = this.calculateDragPosition(delta);\n this.currentPosition = position;\n\n this.onUpdate({\n state: 'move',\n transformData: {\n type: 'move',\n changes: {\n rect: position,\n },\n },\n });\n } else if (this.state === 'resizing' && this.activeHandle && this.startElement) {\n const delta = this.calculateDelta(clientX, clientY);\n const position = this.calculateResizePosition(delta, this.activeHandle);\n this.currentPosition = position;\n\n this.onUpdate({\n state: 'move',\n transformData: {\n type: 'resize',\n changes: {\n rect: position,\n },\n metadata: {\n handle: this.activeHandle,\n maintainAspectRatio: this.config.maintainAspectRatio,\n },\n },\n });\n } else if (this.state === 'vertex-editing' && this.activeVertexIndex !== null) {\n const vertices = this.calculateVertexPosition(clientX, clientY);\n this.currentVertices = vertices;\n\n this.onUpdate({\n state: 'move',\n transformData: {\n type: 'vertex-edit',\n changes: {\n vertices,\n },\n metadata: {\n vertexIndex: this.activeVertexIndex,\n },\n },\n });\n }\n }\n\n end() {\n if (this.state === 'idle') return;\n\n const wasState = this.state;\n const handle = this.activeHandle;\n const vertexIndex = this.activeVertexIndex;\n\n if (wasState === 'vertex-editing') {\n this.onUpdate({\n state: 'end',\n transformData: {\n type: 'vertex-edit',\n changes: {\n vertices: this.currentVertices,\n },\n metadata: {\n vertexIndex: vertexIndex || undefined,\n },\n },\n });\n } else {\n const finalPosition = this.getCurrentPosition();\n this.onUpdate({\n state: 'end',\n transformData: {\n type: wasState === 'dragging' ? 'move' : 'resize',\n changes: {\n rect: finalPosition,\n },\n metadata:\n wasState === 'dragging'\n ? undefined\n : {\n handle: handle || undefined,\n maintainAspectRatio: this.config.maintainAspectRatio,\n },\n },\n });\n }\n\n this.reset();\n }\n\n cancel() {\n if (this.state === 'idle') return;\n\n if (this.state === 'vertex-editing') {\n this.onUpdate({\n state: 'end',\n transformData: {\n type: 'vertex-edit',\n changes: {\n vertices: this.startVertices,\n },\n metadata: {\n vertexIndex: this.activeVertexIndex || undefined,\n },\n },\n });\n } else if (this.startElement) {\n this.onUpdate({\n state: 'end',\n transformData: {\n type: this.state === 'dragging' ? 'move' : 'resize',\n changes: {\n rect: this.startElement,\n },\n metadata:\n this.state === 'dragging'\n ? undefined\n : {\n handle: this.activeHandle || undefined,\n maintainAspectRatio: this.config.maintainAspectRatio,\n },\n },\n });\n }\n\n this.reset();\n }\n\n private reset() {\n this.state = 'idle';\n this.startPoint = null;\n this.startElement = null;\n this.activeHandle = null;\n this.currentPosition = null;\n this.activeVertexIndex = null;\n this.startVertices = [];\n }\n\n private getCurrentPosition() {\n return this.currentPosition || this.config.element;\n }\n\n private calculateDelta(clientX: number, clientY: number): Position {\n if (!this.startPoint) return { x: 0, y: 0 };\n\n const rawDelta: Position = {\n x: clientX - this.startPoint.x,\n y: clientY - this.startPoint.y,\n };\n\n return this.transformDelta(rawDelta);\n }\n\n private transformDelta(delta: Position): Position {\n const { pageRotation = 0, scale = 1 } = this.config;\n\n const rad = (pageRotation * Math.PI) / 2;\n const cos = Math.cos(rad);\n const sin = Math.sin(rad);\n\n const scaledX = delta.x / scale;\n const scaledY = delta.y / scale;\n\n return {\n x: cos * scaledX + sin * scaledY,\n y: -sin * scaledX + cos * scaledY,\n };\n }\n\n private clampPoint(p: Position): Position {\n const bbox = this.config.constraints?.boundingBox;\n if (!bbox) return p;\n return {\n x: Math.max(0, Math.min(p.x, bbox.width)),\n y: Math.max(0, Math.min(p.y, bbox.height)),\n };\n }\n\n private calculateVertexPosition(clientX: number, clientY: number): Position[] {\n if (this.activeVertexIndex === null) return this.startVertices;\n\n const delta = this.calculateDelta(clientX, clientY);\n const newVertices = [...this.startVertices];\n const currentVertex = newVertices[this.activeVertexIndex];\n\n const moved = {\n x: currentVertex.x + delta.x,\n y: currentVertex.y + delta.y,\n };\n newVertices[this.activeVertexIndex] = this.clampPoint(moved);\n\n return newVertices;\n }\n\n private calculateDragPosition(delta: Position): Rect {\n if (!this.startElement) return this.config.element;\n\n const position: Rect = {\n origin: {\n x: this.startElement.origin.x + delta.x,\n y: this.startElement.origin.y + delta.y,\n },\n size: {\n width: this.startElement.size.width,\n height: this.startElement.size.height,\n },\n };\n\n return this.applyConstraints(position);\n }\n\n private calculateResizePosition(delta: Position, handle: ResizeHandle): Rect {\n if (!this.startElement) return this.config.element;\n\n let {\n origin: { x, y },\n size: { width, height },\n } = this.startElement;\n\n switch (handle) {\n case 'se':\n width += delta.x;\n height += delta.y;\n break;\n case 'sw':\n x += delta.x;\n width -= delta.x;\n height += delta.y;\n break;\n case 'ne':\n width += delta.x;\n y += delta.y;\n height -= delta.y;\n break;\n case 'nw':\n x += delta.x;\n width -= delta.x;\n y += delta.y;\n height -= delta.y;\n break;\n case 'n':\n y += delta.y;\n height -= delta.y;\n break;\n case 's':\n height += delta.y;\n break;\n case 'e':\n width += delta.x;\n break;\n case 'w':\n x += delta.x;\n width -= delta.x;\n break;\n }\n\n // Maintain aspect ratio if needed\n if (this.config.maintainAspectRatio && this.startElement) {\n const aspectRatio = this.startElement.size.width / this.startElement.size.height;\n\n if (['n', 's', 'e', 'w'].includes(handle)) {\n if (handle === 'n' || handle === 's') {\n const newWidth = height * aspectRatio;\n const widthDiff = newWidth - width;\n width = newWidth;\n x -= widthDiff / 2;\n } else {\n const newHeight = width / aspectRatio;\n const heightDiff = newHeight - height;\n height = newHeight;\n if (handle === 'w') {\n x = this.startElement.origin.x + this.startElement.size.width - width;\n }\n y -= heightDiff / 2;\n }\n } else {\n const widthChange = Math.abs(width - this.startElement.size.width);\n const heightChange = Math.abs(height - this.startElement.size.height);\n if (widthChange > heightChange) {\n height = width / aspectRatio;\n } else {\n width = height * aspectRatio;\n }\n if (handle.includes('w')) {\n x = this.startElement.origin.x + this.startElement.size.width - width;\n }\n if (handle.includes('n')) {\n y = this.startElement.origin.y + this.startElement.size.height - height;\n }\n }\n }\n\n // Handle-aware bounding box clamping to avoid shifting opposite edge\n const bbox = this.config.constraints?.boundingBox;\n if (bbox) {\n switch (handle) {\n case 'e':\n width = Math.min(width, bbox.width - x);\n break;\n case 's':\n height = Math.min(height, bbox.height - y);\n break;\n case 'se':\n width = Math.min(width, bbox.width - x);\n height = Math.min(height, bbox.height - y);\n break;\n case 'w':\n if (x < 0) {\n width += x;\n x = 0;\n }\n break;\n case 'n':\n if (y < 0) {\n height += y;\n y = 0;\n }\n break;\n case 'sw':\n if (x < 0) {\n width += x;\n x = 0;\n }\n height = Math.min(height, bbox.height - y);\n break;\n case 'nw':\n if (x < 0) {\n width += x;\n x = 0;\n }\n if (y < 0) {\n height += y;\n y = 0;\n }\n break;\n case 'ne':\n width = Math.min(width, bbox.width - x);\n if (y < 0) {\n height += y;\n y = 0;\n }\n break;\n }\n }\n\n return this.applyConstraints({ origin: { x, y }, size: { width, height } });\n }\n\n private applyConstraints(position: Rect): Rect {\n const { constraints } = this.config;\n if (!constraints) return position;\n\n let {\n origin: { x, y },\n size: { width, height },\n } = position;\n\n // Apply size constraints\n width = Math.max(constraints.minWidth || 1, width);\n height = Math.max(constraints.minHeight || 1, height);\n\n if (constraints.maxWidth) width = Math.min(constraints.maxWidth, width);\n if (constraints.maxHeight) height = Math.min(constraints.maxHeight, height);\n\n // Apply bounding box constraints\n if (constraints.boundingBox) {\n x = Math.max(0, Math.min(x, constraints.boundingBox.width - width));\n y = Math.max(0, Math.min(y, constraints.boundingBox.height - height));\n }\n\n return { origin: { x, y }, size: { width, height } };\n }\n}\n","import type { Position, Rect } from '@embedpdf/models';\nimport type { ResizeHandle, DragResizeConfig } from './drag-resize-controller';\n\nexport type QuarterTurns = 0 | 1 | 2 | 3;\n\nexport interface ResizeUI {\n handleSize?: number; // px (default 8)\n spacing?: number; // px distance from the box edge (default 1)\n offsetMode?: 'outside' | 'inside' | 'center'; // default 'outside'\n includeSides?: boolean; // default false\n zIndex?: number; // default 3\n rotationAwareCursor?: boolean; // default true\n}\n\nexport interface VertexUI {\n vertexSize?: number; // px (default 12)\n zIndex?: number; // default 4\n}\n\nexport interface HandleDescriptor {\n handle: ResizeHandle;\n style: Record<string, number | string>;\n attrs?: Record<string, any>;\n}\n\nfunction diagonalCursor(handle: ResizeHandle, rot: QuarterTurns): string {\n // Standard cursors; diagonals flip on odd quarter-turns\n const diag0: Record<'nw' | 'ne' | 'sw' | 'se', string> = {\n nw: 'nwse-resize',\n ne: 'nesw-resize',\n sw: 'nesw-resize',\n se: 'nwse-resize',\n };\n if (handle === 'n' || handle === 's') return 'ns-resize';\n if (handle === 'e' || handle === 'w') return 'ew-resize';\n if (rot % 2 === 0) return diag0[handle as 'nw' | 'ne' | 'sw' | 'se'];\n return { nw: 'nesw-resize', ne: 'nwse-resize', sw: 'nwse-resize', se: 'nesw-resize' }[\n handle as 'nw' | 'ne' | 'sw' | 'se'\n ]!;\n}\n\nfunction edgeOffset(k: number, spacing: number, mode: 'outside' | 'inside' | 'center') {\n // Base puts the handle centered on the edge\n const base = -k / 2;\n if (mode === 'center') return base;\n // outside moves further out (more negative), inside moves in (less negative)\n return mode === 'outside' ? base - spacing : base + spacing;\n}\n\nexport function describeResizeFromConfig(\n cfg: DragResizeConfig,\n ui: ResizeUI = {},\n): HandleDescriptor[] {\n const {\n handleSize = 8,\n spacing = 1,\n offsetMode = 'outside',\n includeSides = false,\n zIndex = 3,\n rotationAwareCursor = true,\n } = ui;\n\n const rotation = ((cfg.pageRotation ?? 0) % 4) as QuarterTurns;\n\n const off = (edge: 'top' | 'right' | 'bottom' | 'left') => ({\n [edge]: edgeOffset(handleSize, spacing, offsetMode) + 'px',\n });\n\n const corners: Array<[ResizeHandle, Record<string, number | string>]> = [\n ['nw', { ...off('top'), ...off('left') }],\n ['ne', { ...off('top'), ...off('right') }],\n ['sw', { ...off('bottom'), ...off('left') }],\n ['se', { ...off('bottom'), ...off('right') }],\n ];\n const sides: Array<[ResizeHandle, Record<string, number | string>]> = includeSides\n ? [\n ['n', { ...off('top'), left: `calc(50% - ${handleSize / 2}px)` }],\n ['s', { ...off('bottom'), left: `calc(50% - ${handleSize / 2}px)` }],\n ['w', { ...off('left'), top: `calc(50% - ${handleSize / 2}px)` }],\n ['e', { ...off('right'), top: `calc(50% - ${handleSize / 2}px)` }],\n ]\n : [];\n\n const all = [...corners, ...sides];\n\n return all.map(([handle, pos]) => ({\n handle,\n style: {\n position: 'absolute',\n width: handleSize + 'px',\n height: handleSize + 'px',\n borderRadius: '50%',\n zIndex,\n cursor: rotationAwareCursor ? diagonalCursor(handle, rotation) : 'default',\n touchAction: 'none',\n ...(pos as any),\n },\n attrs: { 'data-epdf-handle': handle },\n }));\n}\n\nexport function describeVerticesFromConfig(\n cfg: DragResizeConfig,\n ui: VertexUI = {},\n liveVertices?: Position[],\n): HandleDescriptor[] {\n const { vertexSize = 12, zIndex = 4 } = ui;\n const rect: Rect = cfg.element;\n const scale = cfg.scale ?? 1;\n const verts = liveVertices ?? cfg.vertices ?? [];\n\n return verts.map((v, i) => {\n const left = (v.x - rect.origin.x) * scale - vertexSize / 2;\n const top = (v.y - rect.origin.y) * scale - vertexSize / 2;\n return {\n handle: 'nw', // not used; kept for type\n style: {\n position: 'absolute',\n left: left + 'px',\n top: top + 'px',\n width: vertexSize + 'px',\n height: vertexSize + 'px',\n borderRadius: '50%',\n cursor: 'pointer',\n zIndex,\n touchAction: 'none',\n },\n attrs: { 'data-epdf-vertex': i },\n };\n });\n}\n","import {\n type DragResizeConfig,\n DragResizeController,\n type InteractionEvent,\n type ResizeHandle,\n} from '../../shared/plugin-interaction-primitives';\n\nexport interface UseDragResizeOptions extends DragResizeConfig {\n onUpdate?: (event: InteractionEvent) => void;\n enabled?: boolean;\n}\n\nexport interface ResizeHandleEventProps {\n onpointerdown: (e: PointerEvent) => void;\n onpointermove: (e: PointerEvent) => void;\n onpointerup: (e: PointerEvent) => void;\n onpointercancel: (e: PointerEvent) => void;\n}\n\nexport function useDragResize(getOptions: () => UseDragResizeOptions) {\n // Use getter function to maintain reactivity\n const config = $derived.by(() => {\n const opts = getOptions();\n const { onUpdate, enabled, ...rest } = opts;\n return rest;\n });\n\n const enabled = $derived(getOptions().enabled ?? true);\n const onUpdate = $derived(getOptions().onUpdate);\n\n let controller = $state<DragResizeController | null>(null);\n\n // Initialize or update controller\n $effect(() => {\n if (!controller) {\n controller = new DragResizeController(config, (event) => onUpdate?.(event));\n } else {\n controller.updateConfig(config);\n }\n });\n\n const handleDragStart = (e: PointerEvent) => {\n if (!enabled) return;\n e.preventDefault();\n e.stopPropagation();\n controller?.startDrag(e.clientX, e.clientY);\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n };\n\n const handleMove = (e: PointerEvent) => {\n e.preventDefault();\n e.stopPropagation();\n controller?.move(e.clientX, e.clientY);\n };\n\n const handleEnd = (e: PointerEvent) => {\n e.preventDefault();\n e.stopPropagation();\n controller?.end();\n (e.currentTarget as HTMLElement).releasePointerCapture?.(e.pointerId);\n };\n\n const createResizeHandler = (handle: ResizeHandle): ResizeHandleEventProps => ({\n onpointerdown: (e: PointerEvent) => {\n if (!enabled) return;\n e.preventDefault();\n e.stopPropagation();\n controller?.startResize(handle, e.clientX, e.clientY);\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n },\n onpointermove: handleMove,\n onpointerup: handleEnd,\n onpointercancel: handleEnd,\n });\n\n const createVertexHandler = (vertexIndex: number): ResizeHandleEventProps => ({\n onpointerdown: (e: PointerEvent) => {\n if (!enabled) return;\n e.preventDefault();\n e.stopPropagation();\n controller?.startVertexEdit(vertexIndex, e.clientX, e.clientY);\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n },\n onpointermove: handleMove,\n onpointerup: handleEnd,\n onpointercancel: handleEnd,\n });\n\n const dragProps = $derived(\n enabled\n ? {\n onpointerdown: handleDragStart,\n onpointermove: handleMove,\n onpointerup: handleEnd,\n onpointercancel: handleEnd,\n }\n : {},\n );\n\n return {\n get dragProps() {\n return dragProps;\n },\n createResizeProps: createResizeHandler,\n createVertexProps: createVertexHandler,\n };\n}\n","/**\n * Converts a style object with camelCase properties to a CSS string with kebab-case properties.\n *\n * This is useful in Svelte 5 where spreading style objects doesn't work with the `style:` directive.\n * Instead, you can convert the entire style object to a string and apply it to the `style` attribute.\n *\n * @param style - An object containing CSS properties in camelCase format with string or number values\n * @returns A CSS string with kebab-case properties suitable for the HTML style attribute\n *\n * @example\n * ```ts\n * const styles = {\n * position: 'absolute',\n * zIndex: 10,\n * borderRadius: '50%',\n * backgroundColor: '#007ACC'\n * };\n *\n * const cssString = stylesToString(styles);\n * // Returns: \"position: absolute; z-index: 10; border-radius: 50%; background-color: #007ACC\"\n * ```\n *\n * @example\n * Usage in Svelte templates:\n * ```svelte\n * <div style=\"{stylesToString(myStyles)}; color: red;\"></div>\n * ```\n */\nexport function stylesToString(style: Record<string, string | number>): string {\n return Object.entries(style)\n .map(([key, value]) => {\n const cssKey = key.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);\n return `${cssKey}: ${value}`;\n })\n .join('; ');\n}\n","import { useDragResize, type UseDragResizeOptions } from './use-drag-resize.svelte';\nimport {\n describeResizeFromConfig,\n describeVerticesFromConfig,\n type ResizeUI,\n type VertexUI,\n} from '../../shared/plugin-interaction-primitives';\nimport { stylesToString } from '../utils/styles-to-string';\n\nexport type HandleElementProps = {\n key: string | number;\n style: string;\n onpointerdown: (e: PointerEvent) => void;\n onpointermove: (e: PointerEvent) => void;\n onpointerup: (e: PointerEvent) => void;\n onpointercancel: (e: PointerEvent) => void;\n} & Record<string, any>;\n\nexport function useInteractionHandles(\n getOpts: () => {\n controller: UseDragResizeOptions;\n resizeUI?: ResizeUI;\n vertexUI?: VertexUI;\n includeVertices?: boolean;\n handleAttrs?: (\n h: 'nw' | 'ne' | 'sw' | 'se' | 'n' | 'e' | 's' | 'w',\n ) => Record<string, any> | void;\n vertexAttrs?: (i: number) => Record<string, any> | void;\n },\n) {\n // Use getter function and $derived to maintain reactivity\n const controller = $derived(getOpts().controller);\n const resizeUI = $derived(getOpts().resizeUI);\n const vertexUI = $derived(getOpts().vertexUI);\n const includeVertices = $derived(getOpts().includeVertices ?? false);\n const handleAttrs = $derived(getOpts().handleAttrs);\n const vertexAttrs = $derived(getOpts().vertexAttrs);\n\n const dragResize = useDragResize(() => controller);\n\n // Resize handles: computed from controller config\n const resize = $derived.by((): HandleElementProps[] => {\n const desc = describeResizeFromConfig(controller, resizeUI);\n return desc.map((d) => ({\n key: d.attrs?.['data-epdf-handle'] as string,\n style: stylesToString(d.style),\n ...dragResize.createResizeProps(d.handle),\n ...(d.attrs ?? {}),\n ...(handleAttrs?.(d.handle) ?? {}),\n }));\n });\n\n // Vertex handles: computed from controller config and vertices\n const vertices = $derived.by((): HandleElementProps[] => {\n if (!includeVertices) return [];\n const desc = describeVerticesFromConfig(controller, vertexUI, controller.vertices);\n return desc.map((d, i) => ({\n key: i,\n style: stylesToString(d.style),\n ...dragResize.createVertexProps(i),\n ...(d.attrs ?? {}),\n ...(vertexAttrs?.(i) ?? {}),\n }));\n });\n\n // Return getters to maintain reactivity when accessed from outside\n return {\n get dragProps() {\n return dragResize.dragProps;\n },\n get resize() {\n return resize;\n },\n get vertices() {\n return vertices;\n },\n };\n}\n","export type DoublePressOptions = {\n delay?: number; // ms between taps\n tolerancePx?: number; // spatial tolerance\n onDouble?: (e: PointerEvent | MouseEvent) => void;\n};\n\nexport function doublePress<T extends Element = Element>(\n node: T,\n options: DoublePressOptions = {},\n) {\n let { onDouble, delay = 300, tolerancePx = 18 } = options;\n\n // last pointerup (time & position)\n const last = { t: 0, x: 0, y: 0 };\n\n const handlePointerUp = (e: Event) => {\n const ev = e as PointerEvent;\n if (!onDouble) return;\n\n // ignore mouse (mouse uses native dblclick)\n // ignore non-primary pointers (multi-touch, etc.)\n if (ev.pointerType === 'mouse' || ev.isPrimary === false) return;\n\n const now = performance.now();\n const x = ev.clientX;\n const y = ev.clientY;\n\n const withinTime = now - last.t <= delay;\n const dx = x - last.x;\n const dy = y - last.y;\n const withinDist = dx * dx + dy * dy <= tolerancePx * tolerancePx;\n\n if (withinTime && withinDist) onDouble?.(ev);\n\n last.t = now;\n last.x = x;\n last.y = y;\n };\n\n const handleDblClick = (e: Event) => {\n onDouble?.(e as MouseEvent);\n };\n\n node.addEventListener('pointerup', handlePointerUp, { capture: true });\n node.addEventListener('dblclick', handleDblClick);\n\n return {\n update(next?: DoublePressOptions) {\n if (!next) return;\n onDouble = next.onDouble;\n // use nullish coalescing so 0 isn't swallowed accidentally (even though 0 isn't useful here)\n delay = next.delay ?? delay;\n tolerancePx = next.tolerancePx ?? tolerancePx;\n },\n destroy() {\n node.removeEventListener('pointerup', handlePointerUp, { capture: true } as any);\n node.removeEventListener('dblclick', handleDblClick);\n },\n };\n}\n","<script lang=\"ts\">\n import type { Snippet } from 'svelte';\n import { getCounterRotation } from '@embedpdf/utils';\n import type { Rect, Rotation } from '@embedpdf/models';\n import type { MenuWrapperProps } from './types';\n\n interface CounterRotateProps {\n rect: Rect;\n rotation: Rotation;\n }\n\n interface CounterRotateChildrenProps {\n matrix: string;\n rect: Rect;\n menuWrapperProps: MenuWrapperProps;\n }\n\n interface Props extends CounterRotateProps {\n children?: Snippet<[CounterRotateChildrenProps]>;\n }\n\n let { rect, rotation, children }: Props = $props();\n const counterRotation = $derived(getCounterRotation(rect, rotation));\n let elementRef = $state<HTMLElement | null>(null);\n\n // Use native event listeners with capture phase to prevent event propagation\n $effect(() => {\n const element = elementRef;\n if (!element) return;\n\n const handlePointerDown = (e: Event) => {\n // Stop propagation to prevent underlying layers from receiving the event\n e.stopPropagation();\n // DO NOT use e.preventDefault() here - it breaks click events on mobile/tablet!\n // preventDefault() stops the browser from generating click events from touch,\n // which makes buttons inside this container non-functional on touch devices.\n };\n\n const handleTouchStart = (e: Event) => {\n // Stop propagation to prevent underlying layers from receiving the event\n e.stopPropagation();\n // DO NOT use e.preventDefault() here - it breaks click events on mobile/tablet!\n // preventDefault() stops the browser from generating click events from touch,\n // which makes buttons inside this container non-functional on touch devices.\n };\n\n // Use capture phase to intercept before synthetic events\n element.addEventListener('pointerdown', handlePointerDown, { capture: true });\n element.addEventListener('touchstart', handleTouchStart, { capture: true });\n\n return () => {\n element.removeEventListener('pointerdown', handlePointerDown, { capture: true });\n element.removeEventListener('touchstart', handleTouchStart, { capture: true });\n };\n });\n\n const menuWrapperStyle = $derived(\n `position: absolute; ` +\n `left: ${rect.origin.x}px; ` +\n `top: ${rect.origin.y}px; ` +\n `transform: ${counterRotation.matrix}; ` +\n `transform-origin: 0 0; ` +\n `width: ${counterRotation.width}px; ` +\n `height: ${counterRotation.height}px; ` +\n `pointer-events: none; ` +\n `z-index: 3`,\n );\n\n const menuWrapperProps: MenuWrapperProps = $derived({\n style: menuWrapperStyle,\n ref: (el: HTMLElement | null) => {\n elementRef = el;\n },\n });\n</script>\n\n{#if children}\n {@render children({\n menuWrapperProps,\n matrix: counterRotation.matrix,\n rect: {\n origin: { x: rect.origin.x, y: rect.origin.y },\n size: { width: counterRotation.width, height: counterRotation.height },\n },\n })}\n{/if}\n","/**\n * Converts Svelte proxy objects to plain JavaScript objects.\n * This is useful when passing data to Web Workers or other contexts\n * that cannot handle Svelte's reactive proxies.\n *\n * Inspired by the Vue implementation, this recursively traverses the object\n * and handles primitives, arrays, and plain objects while stripping reactive proxies.\n */\nexport function deepToRaw<T extends Record<string, any>>(sourceObj: T): T {\n const objectIterator = (input: any): any => {\n // Handle null and undefined\n if (input === null || input === undefined) {\n return input;\n }\n\n // Handle primitives (string, number, boolean, bigint, symbol)\n if (typeof input !== 'object') {\n return input;\n }\n\n // Handle Arrays\n if (Array.isArray(input)) {\n return input.map((item) => objectIterator(item));\n }\n\n // Handle Date objects\n if (input instanceof Date) {\n return new Date(input.getTime());\n }\n\n // Handle RegExp\n if (input instanceof RegExp) {\n return new RegExp(input.source, input.flags);\n }\n\n // Handle plain objects (including Svelte proxies)\n // For Svelte proxies, we recursively extract plain values\n if (Object.prototype.toString.call(input) === '[object Object]') {\n return Object.keys(input).reduce((acc, key) => {\n // Skip non-enumerable properties and functions\n const value = input[key];\n if (typeof value !== 'function') {\n acc[key as keyof typeof acc] = objectIterator(value);\n }\n return acc;\n }, {} as T);\n }\n\n // For other object types (Map, Set, etc.), use JSON roundtrip as fallback\n // This will convert them to plain objects/arrays\n try {\n return JSON.parse(JSON.stringify(input));\n } catch {\n // If JSON serialization fails, return undefined\n return undefined;\n }\n };\n\n return objectIterator(sourceObj);\n}\n"],"names":["onUpdate","enabled"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/shared/plugin-interaction-primitives/drag-resize-controller.ts","../../src/shared/plugin-interaction-primitives/utils.ts","../../src/svelte/hooks/use-drag-resize.svelte.ts","../../src/svelte/utils/styles-to-string.ts","../../src/svelte/hooks/use-interaction-handles.svelte.ts","../../src/svelte/actions/doublePress.ts","../../src/svelte/components/CounterRotateContainer.svelte","../../src/svelte/utils/deep-to-raw.ts"],"sourcesContent":["import { Position, Rect } from '@embedpdf/models';\n\nexport interface DragResizeConfig {\n element: Rect;\n vertices?: Position[];\n constraints?: {\n minWidth?: number;\n minHeight?: number;\n maxWidth?: number;\n maxHeight?: number;\n boundingBox?: { width: number; height: number }; // page bounds\n };\n maintainAspectRatio?: boolean;\n pageRotation?: number;\n scale?: number;\n}\n\nexport type InteractionState = 'idle' | 'dragging' | 'resizing' | 'vertex-editing';\nexport type ResizeHandle = 'nw' | 'ne' | 'sw' | 'se' | 'n' | 'e' | 's' | 'w';\n\nexport interface TransformData {\n type: 'move' | 'resize' | 'vertex-edit';\n changes: {\n rect?: Rect;\n vertices?: Position[];\n };\n metadata?: {\n handle?: ResizeHandle;\n vertexIndex?: number;\n maintainAspectRatio?: boolean;\n };\n}\n\nexport interface InteractionEvent {\n state: 'start' | 'move' | 'end';\n transformData?: TransformData;\n}\n\n/**\n * Pure geometric controller that manages drag/resize/vertex-edit logic.\n */\nexport class DragResizeController {\n private state: InteractionState = 'idle';\n private startPoint: Position | null = null;\n private startElement: Rect | null = null;\n private activeHandle: ResizeHandle | null = null;\n private currentPosition: Rect | null = null;\n\n // Vertex editing state - pure geometric\n private activeVertexIndex: number | null = null;\n private startVertices: Position[] = [];\n private currentVertices: Position[] = [];\n\n constructor(\n private config: DragResizeConfig,\n private onUpdate: (event: InteractionEvent) => void,\n ) {\n this.currentVertices = config.vertices || [];\n }\n\n updateConfig(config: Partial<DragResizeConfig>) {\n this.config = { ...this.config, ...config };\n this.currentVertices = config.vertices || [];\n }\n\n startDrag(clientX: number, clientY: number) {\n this.state = 'dragging';\n this.startPoint = { x: clientX, y: clientY };\n this.startElement = { ...this.config.element };\n this.currentPosition = { ...this.config.element };\n\n this.onUpdate({\n state: 'start',\n transformData: {\n type: 'move',\n changes: {\n rect: this.startElement,\n },\n },\n });\n }\n\n startResize(handle: ResizeHandle, clientX: number, clientY: number) {\n this.state = 'resizing';\n this.activeHandle = handle;\n this.startPoint = { x: clientX, y: clientY };\n this.startElement = { ...this.config.element };\n this.currentPosition = { ...this.config.element };\n\n this.onUpdate({\n state: 'start',\n transformData: {\n type: 'resize',\n changes: {\n rect: this.startElement,\n },\n metadata: {\n handle: this.activeHandle,\n maintainAspectRatio: this.config.maintainAspectRatio,\n },\n },\n });\n }\n\n startVertexEdit(vertexIndex: number, clientX: number, clientY: number) {\n // Refresh vertices from latest config before validating index\n this.currentVertices = [...(this.config.vertices ?? this.currentVertices)];\n if (vertexIndex < 0 || vertexIndex >= this.currentVertices.length) return;\n\n this.state = 'vertex-editing';\n this.activeVertexIndex = vertexIndex;\n this.startPoint = { x: clientX, y: clientY };\n this.startVertices = [...this.currentVertices];\n\n this.onUpdate({\n state: 'start',\n transformData: {\n type: 'vertex-edit',\n changes: {\n vertices: this.startVertices,\n },\n metadata: {\n vertexIndex,\n },\n },\n });\n }\n\n move(clientX: number, clientY: number) {\n if (this.state === 'idle' || !this.startPoint) return;\n\n if (this.state === 'dragging' && this.startElement) {\n const delta = this.calculateDelta(clientX, clientY);\n const position = this.calculateDragPosition(delta);\n this.currentPosition = position;\n\n this.onUpdate({\n state: 'move',\n transformData: {\n type: 'move',\n changes: {\n rect: position,\n },\n },\n });\n } else if (this.state === 'resizing' && this.activeHandle && this.startElement) {\n const delta = this.calculateDelta(clientX, clientY);\n const position = this.calculateResizePosition(delta, this.activeHandle);\n this.currentPosition = position;\n\n this.onUpdate({\n state: 'move',\n transformData: {\n type: 'resize',\n changes: {\n rect: position,\n },\n metadata: {\n handle: this.activeHandle,\n maintainAspectRatio: this.config.maintainAspectRatio,\n },\n },\n });\n } else if (this.state === 'vertex-editing' && this.activeVertexIndex !== null) {\n const vertices = this.calculateVertexPosition(clientX, clientY);\n this.currentVertices = vertices;\n\n this.onUpdate({\n state: 'move',\n transformData: {\n type: 'vertex-edit',\n changes: {\n vertices,\n },\n metadata: {\n vertexIndex: this.activeVertexIndex,\n },\n },\n });\n }\n }\n\n end() {\n if (this.state === 'idle') return;\n\n const wasState = this.state;\n const handle = this.activeHandle;\n const vertexIndex = this.activeVertexIndex;\n\n if (wasState === 'vertex-editing') {\n this.onUpdate({\n state: 'end',\n transformData: {\n type: 'vertex-edit',\n changes: {\n vertices: this.currentVertices,\n },\n metadata: {\n vertexIndex: vertexIndex || undefined,\n },\n },\n });\n } else {\n const finalPosition = this.getCurrentPosition();\n this.onUpdate({\n state: 'end',\n transformData: {\n type: wasState === 'dragging' ? 'move' : 'resize',\n changes: {\n rect: finalPosition,\n },\n metadata:\n wasState === 'dragging'\n ? undefined\n : {\n handle: handle || undefined,\n maintainAspectRatio: this.config.maintainAspectRatio,\n },\n },\n });\n }\n\n this.reset();\n }\n\n cancel() {\n if (this.state === 'idle') return;\n\n if (this.state === 'vertex-editing') {\n this.onUpdate({\n state: 'end',\n transformData: {\n type: 'vertex-edit',\n changes: {\n vertices: this.startVertices,\n },\n metadata: {\n vertexIndex: this.activeVertexIndex || undefined,\n },\n },\n });\n } else if (this.startElement) {\n this.onUpdate({\n state: 'end',\n transformData: {\n type: this.state === 'dragging' ? 'move' : 'resize',\n changes: {\n rect: this.startElement,\n },\n metadata:\n this.state === 'dragging'\n ? undefined\n : {\n handle: this.activeHandle || undefined,\n maintainAspectRatio: this.config.maintainAspectRatio,\n },\n },\n });\n }\n\n this.reset();\n }\n\n private reset() {\n this.state = 'idle';\n this.startPoint = null;\n this.startElement = null;\n this.activeHandle = null;\n this.currentPosition = null;\n this.activeVertexIndex = null;\n this.startVertices = [];\n }\n\n private getCurrentPosition() {\n return this.currentPosition || this.config.element;\n }\n\n private calculateDelta(clientX: number, clientY: number): Position {\n if (!this.startPoint) return { x: 0, y: 0 };\n\n const rawDelta: Position = {\n x: clientX - this.startPoint.x,\n y: clientY - this.startPoint.y,\n };\n\n return this.transformDelta(rawDelta);\n }\n\n private transformDelta(delta: Position): Position {\n const { pageRotation = 0, scale = 1 } = this.config;\n\n const rad = (pageRotation * Math.PI) / 2;\n const cos = Math.cos(rad);\n const sin = Math.sin(rad);\n\n const scaledX = delta.x / scale;\n const scaledY = delta.y / scale;\n\n return {\n x: cos * scaledX + sin * scaledY,\n y: -sin * scaledX + cos * scaledY,\n };\n }\n\n private clampPoint(p: Position): Position {\n const bbox = this.config.constraints?.boundingBox;\n if (!bbox) return p;\n return {\n x: Math.max(0, Math.min(p.x, bbox.width)),\n y: Math.max(0, Math.min(p.y, bbox.height)),\n };\n }\n\n private calculateVertexPosition(clientX: number, clientY: number): Position[] {\n if (this.activeVertexIndex === null) return this.startVertices;\n\n const delta = this.calculateDelta(clientX, clientY);\n const newVertices = [...this.startVertices];\n const currentVertex = newVertices[this.activeVertexIndex];\n\n const moved = {\n x: currentVertex.x + delta.x,\n y: currentVertex.y + delta.y,\n };\n newVertices[this.activeVertexIndex] = this.clampPoint(moved);\n\n return newVertices;\n }\n\n private calculateDragPosition(delta: Position): Rect {\n if (!this.startElement) return this.config.element;\n\n const position: Rect = {\n origin: {\n x: this.startElement.origin.x + delta.x,\n y: this.startElement.origin.y + delta.y,\n },\n size: {\n width: this.startElement.size.width,\n height: this.startElement.size.height,\n },\n };\n\n return this.applyConstraints(position);\n }\n\n private calculateResizePosition(delta: Position, handle: ResizeHandle): Rect {\n if (!this.startElement) return this.config.element;\n\n let {\n origin: { x, y },\n size: { width, height },\n } = this.startElement;\n\n switch (handle) {\n case 'se':\n width += delta.x;\n height += delta.y;\n break;\n case 'sw':\n x += delta.x;\n width -= delta.x;\n height += delta.y;\n break;\n case 'ne':\n width += delta.x;\n y += delta.y;\n height -= delta.y;\n break;\n case 'nw':\n x += delta.x;\n width -= delta.x;\n y += delta.y;\n height -= delta.y;\n break;\n case 'n':\n y += delta.y;\n height -= delta.y;\n break;\n case 's':\n height += delta.y;\n break;\n case 'e':\n width += delta.x;\n break;\n case 'w':\n x += delta.x;\n width -= delta.x;\n break;\n }\n\n // Maintain aspect ratio if needed\n if (this.config.maintainAspectRatio && this.startElement) {\n const aspectRatio = this.startElement.size.width / this.startElement.size.height;\n\n if (['n', 's', 'e', 'w'].includes(handle)) {\n if (handle === 'n' || handle === 's') {\n const newWidth = height * aspectRatio;\n const widthDiff = newWidth - width;\n width = newWidth;\n x -= widthDiff / 2;\n } else {\n const newHeight = width / aspectRatio;\n const heightDiff = newHeight - height;\n height = newHeight;\n if (handle === 'w') {\n x = this.startElement.origin.x + this.startElement.size.width - width;\n }\n y -= heightDiff / 2;\n }\n } else {\n const widthChange = Math.abs(width - this.startElement.size.width);\n const heightChange = Math.abs(height - this.startElement.size.height);\n if (widthChange > heightChange) {\n height = width / aspectRatio;\n } else {\n width = height * aspectRatio;\n }\n if (handle.includes('w')) {\n x = this.startElement.origin.x + this.startElement.size.width - width;\n }\n if (handle.includes('n')) {\n y = this.startElement.origin.y + this.startElement.size.height - height;\n }\n }\n }\n\n // Handle-aware bounding box clamping to avoid shifting opposite edge\n const bbox = this.config.constraints?.boundingBox;\n if (bbox) {\n switch (handle) {\n case 'e':\n width = Math.min(width, bbox.width - x);\n break;\n case 's':\n height = Math.min(height, bbox.height - y);\n break;\n case 'se':\n width = Math.min(width, bbox.width - x);\n height = Math.min(height, bbox.height - y);\n break;\n case 'w':\n if (x < 0) {\n width += x;\n x = 0;\n }\n break;\n case 'n':\n if (y < 0) {\n height += y;\n y = 0;\n }\n break;\n case 'sw':\n if (x < 0) {\n width += x;\n x = 0;\n }\n height = Math.min(height, bbox.height - y);\n break;\n case 'nw':\n if (x < 0) {\n width += x;\n x = 0;\n }\n if (y < 0) {\n height += y;\n y = 0;\n }\n break;\n case 'ne':\n width = Math.min(width, bbox.width - x);\n if (y < 0) {\n height += y;\n y = 0;\n }\n break;\n }\n }\n\n return this.applyConstraints({ origin: { x, y }, size: { width, height } });\n }\n\n private applyConstraints(position: Rect): Rect {\n const { constraints } = this.config;\n if (!constraints) return position;\n\n let {\n origin: { x, y },\n size: { width, height },\n } = position;\n\n // Apply size constraints\n width = Math.max(constraints.minWidth || 1, width);\n height = Math.max(constraints.minHeight || 1, height);\n\n if (constraints.maxWidth) width = Math.min(constraints.maxWidth, width);\n if (constraints.maxHeight) height = Math.min(constraints.maxHeight, height);\n\n // Apply bounding box constraints\n if (constraints.boundingBox) {\n x = Math.max(0, Math.min(x, constraints.boundingBox.width - width));\n y = Math.max(0, Math.min(y, constraints.boundingBox.height - height));\n }\n\n return { origin: { x, y }, size: { width, height } };\n }\n}\n","import type { Position, Rect } from '@embedpdf/models';\nimport type { ResizeHandle, DragResizeConfig } from './drag-resize-controller';\n\nexport type QuarterTurns = 0 | 1 | 2 | 3;\n\nexport interface ResizeUI {\n handleSize?: number; // px (default 8)\n spacing?: number; // px distance from the box edge (default 1)\n offsetMode?: 'outside' | 'inside' | 'center'; // default 'outside'\n includeSides?: boolean; // default false\n zIndex?: number; // default 3\n rotationAwareCursor?: boolean; // default true\n}\n\nexport interface VertexUI {\n vertexSize?: number; // px (default 12)\n zIndex?: number; // default 4\n}\n\nexport interface HandleDescriptor {\n handle: ResizeHandle;\n style: Record<string, number | string>;\n attrs?: Record<string, any>;\n}\n\nfunction diagonalCursor(handle: ResizeHandle, rot: QuarterTurns): string {\n // Standard cursors; diagonals flip on odd quarter-turns\n const diag0: Record<'nw' | 'ne' | 'sw' | 'se', string> = {\n nw: 'nwse-resize',\n ne: 'nesw-resize',\n sw: 'nesw-resize',\n se: 'nwse-resize',\n };\n if (handle === 'n' || handle === 's') return 'ns-resize';\n if (handle === 'e' || handle === 'w') return 'ew-resize';\n if (rot % 2 === 0) return diag0[handle as 'nw' | 'ne' | 'sw' | 'se'];\n return { nw: 'nesw-resize', ne: 'nwse-resize', sw: 'nwse-resize', se: 'nesw-resize' }[\n handle as 'nw' | 'ne' | 'sw' | 'se'\n ]!;\n}\n\nfunction edgeOffset(k: number, spacing: number, mode: 'outside' | 'inside' | 'center') {\n // Base puts the handle centered on the edge\n const base = -k / 2;\n if (mode === 'center') return base;\n // outside moves further out (more negative), inside moves in (less negative)\n return mode === 'outside' ? base - spacing : base + spacing;\n}\n\nexport function describeResizeFromConfig(\n cfg: DragResizeConfig,\n ui: ResizeUI = {},\n): HandleDescriptor[] {\n const {\n handleSize = 8,\n spacing = 1,\n offsetMode = 'outside',\n includeSides = false,\n zIndex = 3,\n rotationAwareCursor = true,\n } = ui;\n\n const rotation = ((cfg.pageRotation ?? 0) % 4) as QuarterTurns;\n\n const off = (edge: 'top' | 'right' | 'bottom' | 'left') => ({\n [edge]: edgeOffset(handleSize, spacing, offsetMode) + 'px',\n });\n\n const corners: Array<[ResizeHandle, Record<string, number | string>]> = [\n ['nw', { ...off('top'), ...off('left') }],\n ['ne', { ...off('top'), ...off('right') }],\n ['sw', { ...off('bottom'), ...off('left') }],\n ['se', { ...off('bottom'), ...off('right') }],\n ];\n const sides: Array<[ResizeHandle, Record<string, number | string>]> = includeSides\n ? [\n ['n', { ...off('top'), left: `calc(50% - ${handleSize / 2}px)` }],\n ['s', { ...off('bottom'), left: `calc(50% - ${handleSize / 2}px)` }],\n ['w', { ...off('left'), top: `calc(50% - ${handleSize / 2}px)` }],\n ['e', { ...off('right'), top: `calc(50% - ${handleSize / 2}px)` }],\n ]\n : [];\n\n const all = [...corners, ...sides];\n\n return all.map(([handle, pos]) => ({\n handle,\n style: {\n position: 'absolute',\n width: handleSize + 'px',\n height: handleSize + 'px',\n borderRadius: '50%',\n zIndex,\n cursor: rotationAwareCursor ? diagonalCursor(handle, rotation) : 'default',\n touchAction: 'none',\n ...(pos as any),\n },\n attrs: { 'data-epdf-handle': handle },\n }));\n}\n\nexport function describeVerticesFromConfig(\n cfg: DragResizeConfig,\n ui: VertexUI = {},\n liveVertices?: Position[],\n): HandleDescriptor[] {\n const { vertexSize = 12, zIndex = 4 } = ui;\n const rect: Rect = cfg.element;\n const scale = cfg.scale ?? 1;\n const verts = liveVertices ?? cfg.vertices ?? [];\n\n return verts.map((v, i) => {\n const left = (v.x - rect.origin.x) * scale - vertexSize / 2;\n const top = (v.y - rect.origin.y) * scale - vertexSize / 2;\n return {\n handle: 'nw', // not used; kept for type\n style: {\n position: 'absolute',\n left: left + 'px',\n top: top + 'px',\n width: vertexSize + 'px',\n height: vertexSize + 'px',\n borderRadius: '50%',\n cursor: 'pointer',\n zIndex,\n touchAction: 'none',\n },\n attrs: { 'data-epdf-vertex': i },\n };\n });\n}\n","import {\n type DragResizeConfig,\n DragResizeController,\n type InteractionEvent,\n type ResizeHandle,\n} from '../../shared/plugin-interaction-primitives';\n\nexport interface UseDragResizeOptions extends DragResizeConfig {\n onUpdate?: (event: InteractionEvent) => void;\n enabled?: boolean;\n}\n\nexport interface ResizeHandleEventProps {\n onpointerdown: (e: PointerEvent) => void;\n onpointermove: (e: PointerEvent) => void;\n onpointerup: (e: PointerEvent) => void;\n onpointercancel: (e: PointerEvent) => void;\n}\n\nexport function useDragResize(getOptions: () => UseDragResizeOptions) {\n // Use getter function to maintain reactivity\n const config = $derived.by(() => {\n const opts = getOptions();\n const { onUpdate, enabled, ...rest } = opts;\n return rest;\n });\n\n const enabled = $derived(getOptions().enabled ?? true);\n const onUpdate = $derived(getOptions().onUpdate);\n\n let controller = $state<DragResizeController | null>(null);\n\n // Initialize or update controller\n $effect(() => {\n if (!controller) {\n controller = new DragResizeController(config, (event) => onUpdate?.(event));\n } else {\n controller.updateConfig(config);\n }\n });\n\n const handleDragStart = (e: PointerEvent) => {\n if (!enabled) return;\n e.preventDefault();\n e.stopPropagation();\n controller?.startDrag(e.clientX, e.clientY);\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n };\n\n const handleMove = (e: PointerEvent) => {\n e.preventDefault();\n e.stopPropagation();\n controller?.move(e.clientX, e.clientY);\n };\n\n const handleEnd = (e: PointerEvent) => {\n e.preventDefault();\n e.stopPropagation();\n controller?.end();\n (e.currentTarget as HTMLElement).releasePointerCapture?.(e.pointerId);\n };\n\n const createResizeHandler = (handle: ResizeHandle): ResizeHandleEventProps => ({\n onpointerdown: (e: PointerEvent) => {\n if (!enabled) return;\n e.preventDefault();\n e.stopPropagation();\n controller?.startResize(handle, e.clientX, e.clientY);\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n },\n onpointermove: handleMove,\n onpointerup: handleEnd,\n onpointercancel: handleEnd,\n });\n\n const createVertexHandler = (vertexIndex: number): ResizeHandleEventProps => ({\n onpointerdown: (e: PointerEvent) => {\n if (!enabled) return;\n e.preventDefault();\n e.stopPropagation();\n controller?.startVertexEdit(vertexIndex, e.clientX, e.clientY);\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n },\n onpointermove: handleMove,\n onpointerup: handleEnd,\n onpointercancel: handleEnd,\n });\n\n const dragProps = $derived(\n enabled\n ? {\n onpointerdown: handleDragStart,\n onpointermove: handleMove,\n onpointerup: handleEnd,\n onpointercancel: handleEnd,\n }\n : {},\n );\n\n return {\n get dragProps() {\n return dragProps;\n },\n createResizeProps: createResizeHandler,\n createVertexProps: createVertexHandler,\n };\n}\n","/**\n * Converts a style object with camelCase properties to a CSS string with kebab-case properties.\n *\n * This is useful in Svelte 5 where spreading style objects doesn't work with the `style:` directive.\n * Instead, you can convert the entire style object to a string and apply it to the `style` attribute.\n *\n * @param style - An object containing CSS properties in camelCase format with string or number values\n * @returns A CSS string with kebab-case properties suitable for the HTML style attribute\n *\n * @example\n * ```ts\n * const styles = {\n * position: 'absolute',\n * zIndex: 10,\n * borderRadius: '50%',\n * backgroundColor: '#007ACC'\n * };\n *\n * const cssString = stylesToString(styles);\n * // Returns: \"position: absolute; z-index: 10; border-radius: 50%; background-color: #007ACC\"\n * ```\n *\n * @example\n * Usage in Svelte templates:\n * ```svelte\n * <div style=\"{stylesToString(myStyles)}; color: red;\"></div>\n * ```\n */\nexport function stylesToString(style: Record<string, string | number>): string {\n return Object.entries(style)\n .map(([key, value]) => {\n const cssKey = key.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);\n return `${cssKey}: ${value}`;\n })\n .join('; ');\n}\n","import { useDragResize, type UseDragResizeOptions } from './use-drag-resize.svelte';\nimport {\n describeResizeFromConfig,\n describeVerticesFromConfig,\n type ResizeUI,\n type VertexUI,\n} from '../../shared/plugin-interaction-primitives';\nimport { stylesToString } from '../utils/styles-to-string';\n\nexport type HandleElementProps = {\n key: string | number;\n style: string;\n onpointerdown: (e: PointerEvent) => void;\n onpointermove: (e: PointerEvent) => void;\n onpointerup: (e: PointerEvent) => void;\n onpointercancel: (e: PointerEvent) => void;\n} & Record<string, any>;\n\nexport function useInteractionHandles(\n getOpts: () => {\n controller: UseDragResizeOptions;\n resizeUI?: ResizeUI;\n vertexUI?: VertexUI;\n includeVertices?: boolean;\n handleAttrs?: (\n h: 'nw' | 'ne' | 'sw' | 'se' | 'n' | 'e' | 's' | 'w',\n ) => Record<string, any> | void;\n vertexAttrs?: (i: number) => Record<string, any> | void;\n },\n) {\n // Use getter function and $derived to maintain reactivity\n const controller = $derived(getOpts().controller);\n const resizeUI = $derived(getOpts().resizeUI);\n const vertexUI = $derived(getOpts().vertexUI);\n const includeVertices = $derived(getOpts().includeVertices ?? false);\n const handleAttrs = $derived(getOpts().handleAttrs);\n const vertexAttrs = $derived(getOpts().vertexAttrs);\n\n const dragResize = useDragResize(() => controller);\n\n // Resize handles: computed from controller config\n const resize = $derived.by((): HandleElementProps[] => {\n const desc = describeResizeFromConfig(controller, resizeUI);\n return desc.map((d) => ({\n key: d.attrs?.['data-epdf-handle'] as string,\n style: stylesToString(d.style),\n ...dragResize.createResizeProps(d.handle),\n ...(d.attrs ?? {}),\n ...(handleAttrs?.(d.handle) ?? {}),\n }));\n });\n\n // Vertex handles: computed from controller config and vertices\n const vertices = $derived.by((): HandleElementProps[] => {\n if (!includeVertices) return [];\n const desc = describeVerticesFromConfig(controller, vertexUI, controller.vertices);\n return desc.map((d, i) => ({\n key: i,\n style: stylesToString(d.style),\n ...dragResize.createVertexProps(i),\n ...(d.attrs ?? {}),\n ...(vertexAttrs?.(i) ?? {}),\n }));\n });\n\n // Return getters to maintain reactivity when accessed from outside\n return {\n get dragProps() {\n return dragResize.dragProps;\n },\n get resize() {\n return resize;\n },\n get vertices() {\n return vertices;\n },\n };\n}\n","export type DoublePressOptions = {\n delay?: number; // ms between taps\n tolerancePx?: number; // spatial tolerance\n onDouble?: (e: PointerEvent | MouseEvent) => void;\n};\n\nexport function doublePress<T extends Element = Element>(\n node: T,\n options: DoublePressOptions = {},\n) {\n let { onDouble, delay = 300, tolerancePx = 18 } = options;\n\n // last pointerup (time & position)\n const last = { t: 0, x: 0, y: 0 };\n\n const handlePointerUp = (e: Event) => {\n const ev = e as PointerEvent;\n if (!onDouble) return;\n\n // ignore mouse (mouse uses native dblclick)\n // ignore non-primary pointers (multi-touch, etc.)\n if (ev.pointerType === 'mouse' || ev.isPrimary === false) return;\n\n const now = performance.now();\n const x = ev.clientX;\n const y = ev.clientY;\n\n const withinTime = now - last.t <= delay;\n const dx = x - last.x;\n const dy = y - last.y;\n const withinDist = dx * dx + dy * dy <= tolerancePx * tolerancePx;\n\n if (withinTime && withinDist) onDouble?.(ev);\n\n last.t = now;\n last.x = x;\n last.y = y;\n };\n\n const handleDblClick = (e: Event) => {\n onDouble?.(e as MouseEvent);\n };\n\n node.addEventListener('pointerup', handlePointerUp, { capture: true });\n node.addEventListener('dblclick', handleDblClick);\n\n return {\n update(next?: DoublePressOptions) {\n if (!next) return;\n onDouble = next.onDouble;\n // use nullish coalescing so 0 isn't swallowed accidentally (even though 0 isn't useful here)\n delay = next.delay ?? delay;\n tolerancePx = next.tolerancePx ?? tolerancePx;\n },\n destroy() {\n node.removeEventListener('pointerup', handlePointerUp, { capture: true } as any);\n node.removeEventListener('dblclick', handleDblClick);\n },\n };\n}\n","<script lang=\"ts\">\n import type { Snippet } from 'svelte';\n import type { Action } from 'svelte/action';\n import { getCounterRotation } from '@embedpdf/utils';\n import type { Rect, Rotation } from '@embedpdf/models';\n import type { MenuWrapperProps } from './types';\n\n interface CounterRotateProps {\n rect: Rect;\n rotation: Rotation;\n }\n\n interface CounterRotateChildrenProps {\n matrix: string;\n rect: Rect;\n menuWrapperProps: MenuWrapperProps;\n }\n\n interface Props extends CounterRotateProps {\n children?: Snippet<[CounterRotateChildrenProps]>;\n }\n\n let { rect, rotation, children }: Props = $props();\n const counterRotation = $derived(getCounterRotation(rect, rotation));\n\n // Svelte action for capture-phase event handling\n // This is the idiomatic way to attach lifecycle-managed behavior to DOM elements\n const menuWrapperAction: Action<HTMLElement> = (node) => {\n const handlePointerDown = (e: Event) => {\n // Stop propagation to prevent underlying layers from receiving the event\n e.stopPropagation();\n // DO NOT use e.preventDefault() here - it breaks click events on mobile/tablet!\n // preventDefault() stops the browser from generating click events from touch,\n // which makes buttons inside this container non-functional on touch devices.\n };\n\n const handleTouchStart = (e: Event) => {\n // Stop propagation to prevent underlying layers from receiving the event\n e.stopPropagation();\n // DO NOT use e.preventDefault() here - it breaks click events on mobile/tablet!\n };\n\n // Use capture phase to intercept before synthetic events\n node.addEventListener('pointerdown', handlePointerDown, { capture: true });\n node.addEventListener('touchstart', handleTouchStart, { capture: true });\n\n return {\n destroy() {\n node.removeEventListener('pointerdown', handlePointerDown, { capture: true });\n node.removeEventListener('touchstart', handleTouchStart, { capture: true });\n },\n };\n };\n\n const menuWrapperStyle = $derived(\n `position: absolute; ` +\n `left: ${rect.origin.x}px; ` +\n `top: ${rect.origin.y}px; ` +\n `transform: ${counterRotation.matrix}; ` +\n `transform-origin: 0 0; ` +\n `width: ${counterRotation.width}px; ` +\n `height: ${counterRotation.height}px; ` +\n `pointer-events: none; ` +\n `z-index: 3`,\n );\n\n const menuWrapperProps: MenuWrapperProps = $derived({\n style: menuWrapperStyle,\n action: menuWrapperAction,\n });\n</script>\n\n{#if children}\n {@render children({\n menuWrapperProps,\n matrix: counterRotation.matrix,\n rect: {\n origin: { x: rect.origin.x, y: rect.origin.y },\n size: { width: counterRotation.width, height: counterRotation.height },\n },\n })}\n{/if}\n","/**\n * Converts Svelte proxy objects to plain JavaScript objects.\n * This is useful when passing data to Web Workers or other contexts\n * that cannot handle Svelte's reactive proxies.\n *\n * Inspired by the Vue implementation, this recursively traverses the object\n * and handles primitives, arrays, and plain objects while stripping reactive proxies.\n */\nexport function deepToRaw<T extends Record<string, any>>(sourceObj: T): T {\n const objectIterator = (input: any): any => {\n // Handle null and undefined\n if (input === null || input === undefined) {\n return input;\n }\n\n // Handle primitives (string, number, boolean, bigint, symbol)\n if (typeof input !== 'object') {\n return input;\n }\n\n // Handle Arrays\n if (Array.isArray(input)) {\n return input.map((item) => objectIterator(item));\n }\n\n // Handle Date objects\n if (input instanceof Date) {\n return new Date(input.getTime());\n }\n\n // Handle RegExp\n if (input instanceof RegExp) {\n return new RegExp(input.source, input.flags);\n }\n\n // Handle plain objects (including Svelte proxies)\n // For Svelte proxies, we recursively extract plain values\n if (Object.prototype.toString.call(input) === '[object Object]') {\n return Object.keys(input).reduce((acc, key) => {\n // Skip non-enumerable properties and functions\n const value = input[key];\n if (typeof value !== 'function') {\n acc[key as keyof typeof acc] = objectIterator(value);\n }\n return acc;\n }, {} as T);\n }\n\n // For other object types (Map, Set, etc.), use JSON roundtrip as fallback\n // This will convert them to plain objects/arrays\n try {\n return JSON.parse(JSON.stringify(input));\n } catch {\n // If JSON serialization fails, return undefined\n return undefined;\n }\n };\n\n return objectIterator(sourceObj);\n}\n"],"names":["onUpdate","enabled"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@embedpdf/utils",
3
- "version": "2.0.0-next.0",
3
+ "version": "2.0.0-next.1",
4
4
  "private": false,
5
5
  "description": "Shared utility helpers (geometry, tasks, logging, PDF primitives) that underpin every package in the EmbedPDF ecosystem.",
6
6
  "type": "module",
@@ -53,8 +53,8 @@
53
53
  "devDependencies": {
54
54
  "typescript": "^5.0.0",
55
55
  "@types/react": "^18.2.0",
56
- "@embedpdf/build": "1.1.0",
57
- "@embedpdf/models": "2.0.0-next.0"
56
+ "@embedpdf/models": "2.0.0-next.1",
57
+ "@embedpdf/build": "1.1.0"
58
58
  },
59
59
  "peerDependencies": {
60
60
  "react": ">=16.8.0",