@markup-canvas/core 1.4.3 → 1.4.4

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,2 +1,2 @@
1
1
  import type { MarkupCanvasConfig, RulerSystem } from "@/types/index.js";
2
- export declare function updateThemeMode(canvasContainer: HTMLElement, config: Required<MarkupCanvasConfig>, rulers: RulerSystem | null, mode: "light" | "dark"): void;
2
+ export declare function updateThemeMode(config: Required<MarkupCanvasConfig>, rulers: RulerSystem | null, mode: "light" | "dark"): void;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Markup Canvas
3
3
  * High-performance markup canvas with zoom and pan capabilities
4
- * @version 1.4.3
4
+ * @version 1.4.4
5
5
  */
6
6
  'use strict';
7
7
 
@@ -662,14 +662,12 @@ function createMarkupCanvasConfig(options = {}) {
662
662
  return config;
663
663
  }
664
664
 
665
- function updateThemeMode(canvasContainer, config, rulers, mode) {
665
+ function updateThemeMode(config, rulers, mode) {
666
666
  const newConfig = {
667
667
  ...config,
668
668
  themeMode: mode,
669
669
  };
670
670
  const updatedConfig = createMarkupCanvasConfig(newConfig);
671
- // Update color-scheme CSS property
672
- canvasContainer.style.colorScheme = mode;
673
671
  // Update rulers if they exist
674
672
  if (rulers) {
675
673
  rulers.updateTheme(updatedConfig);
@@ -841,8 +839,6 @@ function setupCanvasContainer(container, config) {
841
839
  if (config) {
842
840
  const backgroundColor = `light-dark(${config.canvasBackgroundColor}, ${config.canvasBackgroundColorDark})`;
843
841
  container.style.backgroundColor = backgroundColor;
844
- // Set color-scheme to enable light-dark() function
845
- container.style.colorScheme = config.themeMode;
846
842
  }
847
843
  if (!container.hasAttribute("tabindex")) {
848
844
  container.setAttribute("tabindex", "0");
@@ -2052,7 +2048,6 @@ function updateRulerTheme(elements, config) {
2052
2048
  elements.horizontalRuler.style.setProperty("--ruler-border-color", borderColor);
2053
2049
  elements.horizontalRuler.style.setProperty("--ruler-text-color", textColor);
2054
2050
  elements.horizontalRuler.style.setProperty("--ruler-tick-color", tickColor);
2055
- elements.horizontalRuler.style.colorScheme = config.themeMode;
2056
2051
  }
2057
2052
  // Update vertical ruler with CSS variables
2058
2053
  if (elements.verticalRuler) {
@@ -2060,19 +2055,16 @@ function updateRulerTheme(elements, config) {
2060
2055
  elements.verticalRuler.style.setProperty("--ruler-border-color", borderColor);
2061
2056
  elements.verticalRuler.style.setProperty("--ruler-text-color", textColor);
2062
2057
  elements.verticalRuler.style.setProperty("--ruler-tick-color", tickColor);
2063
- elements.verticalRuler.style.colorScheme = config.themeMode;
2064
2058
  }
2065
2059
  // Update corner box with CSS variables
2066
2060
  if (elements.cornerBox) {
2067
2061
  elements.cornerBox.style.setProperty("--ruler-background-color", backgroundColor);
2068
2062
  elements.cornerBox.style.setProperty("--ruler-border-color", borderColor);
2069
2063
  elements.cornerBox.style.setProperty("--ruler-text-color", textColor);
2070
- elements.cornerBox.style.colorScheme = config.themeMode;
2071
2064
  }
2072
2065
  // Update grid overlay with CSS variables
2073
2066
  if (elements.gridOverlay) {
2074
2067
  elements.gridOverlay.style.setProperty("--grid-color", gridColor);
2075
- elements.gridOverlay.style.colorScheme = config.themeMode;
2076
2068
  }
2077
2069
  }
2078
2070
 
@@ -2354,8 +2346,6 @@ class MarkupCanvas {
2354
2346
  }
2355
2347
  });
2356
2348
  });
2357
- // Always set initial color-scheme
2358
- updateThemeMode(this.canvas.container, this.config, this.rulers, this.config.themeMode);
2359
2349
  // Always bind canvas to window
2360
2350
  this.event.setEmitInterceptor((event, data) => {
2361
2351
  broadcastEvent(event, data, this.config);
@@ -2646,7 +2636,7 @@ class MarkupCanvas {
2646
2636
  // Theme management
2647
2637
  updateThemeMode(mode) {
2648
2638
  this.config = createMarkupCanvasConfig({ ...this.config, themeMode: mode });
2649
- updateThemeMode(this.canvas.container, this.config, this.rulers, mode);
2639
+ updateThemeMode(this.config, this.rulers, mode);
2650
2640
  }
2651
2641
  toggleThemeMode() {
2652
2642
  const currentMode = this.config.themeMode;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Markup Canvas
3
3
  * High-performance markup canvas with zoom and pan capabilities
4
- * @version 1.4.3
4
+ * @version 1.4.4
5
5
  */
6
6
  const EDITOR_PRESET = {
7
7
  // Canvas dimensions
@@ -658,14 +658,12 @@ function createMarkupCanvasConfig(options = {}) {
658
658
  return config;
659
659
  }
660
660
 
661
- function updateThemeMode(canvasContainer, config, rulers, mode) {
661
+ function updateThemeMode(config, rulers, mode) {
662
662
  const newConfig = {
663
663
  ...config,
664
664
  themeMode: mode,
665
665
  };
666
666
  const updatedConfig = createMarkupCanvasConfig(newConfig);
667
- // Update color-scheme CSS property
668
- canvasContainer.style.colorScheme = mode;
669
667
  // Update rulers if they exist
670
668
  if (rulers) {
671
669
  rulers.updateTheme(updatedConfig);
@@ -837,8 +835,6 @@ function setupCanvasContainer(container, config) {
837
835
  if (config) {
838
836
  const backgroundColor = `light-dark(${config.canvasBackgroundColor}, ${config.canvasBackgroundColorDark})`;
839
837
  container.style.backgroundColor = backgroundColor;
840
- // Set color-scheme to enable light-dark() function
841
- container.style.colorScheme = config.themeMode;
842
838
  }
843
839
  if (!container.hasAttribute("tabindex")) {
844
840
  container.setAttribute("tabindex", "0");
@@ -2048,7 +2044,6 @@ function updateRulerTheme(elements, config) {
2048
2044
  elements.horizontalRuler.style.setProperty("--ruler-border-color", borderColor);
2049
2045
  elements.horizontalRuler.style.setProperty("--ruler-text-color", textColor);
2050
2046
  elements.horizontalRuler.style.setProperty("--ruler-tick-color", tickColor);
2051
- elements.horizontalRuler.style.colorScheme = config.themeMode;
2052
2047
  }
2053
2048
  // Update vertical ruler with CSS variables
2054
2049
  if (elements.verticalRuler) {
@@ -2056,19 +2051,16 @@ function updateRulerTheme(elements, config) {
2056
2051
  elements.verticalRuler.style.setProperty("--ruler-border-color", borderColor);
2057
2052
  elements.verticalRuler.style.setProperty("--ruler-text-color", textColor);
2058
2053
  elements.verticalRuler.style.setProperty("--ruler-tick-color", tickColor);
2059
- elements.verticalRuler.style.colorScheme = config.themeMode;
2060
2054
  }
2061
2055
  // Update corner box with CSS variables
2062
2056
  if (elements.cornerBox) {
2063
2057
  elements.cornerBox.style.setProperty("--ruler-background-color", backgroundColor);
2064
2058
  elements.cornerBox.style.setProperty("--ruler-border-color", borderColor);
2065
2059
  elements.cornerBox.style.setProperty("--ruler-text-color", textColor);
2066
- elements.cornerBox.style.colorScheme = config.themeMode;
2067
2060
  }
2068
2061
  // Update grid overlay with CSS variables
2069
2062
  if (elements.gridOverlay) {
2070
2063
  elements.gridOverlay.style.setProperty("--grid-color", gridColor);
2071
- elements.gridOverlay.style.colorScheme = config.themeMode;
2072
2064
  }
2073
2065
  }
2074
2066
 
@@ -2350,8 +2342,6 @@ class MarkupCanvas {
2350
2342
  }
2351
2343
  });
2352
2344
  });
2353
- // Always set initial color-scheme
2354
- updateThemeMode(this.canvas.container, this.config, this.rulers, this.config.themeMode);
2355
2345
  // Always bind canvas to window
2356
2346
  this.event.setEmitInterceptor((event, data) => {
2357
2347
  broadcastEvent(event, data, this.config);
@@ -2642,7 +2632,7 @@ class MarkupCanvas {
2642
2632
  // Theme management
2643
2633
  updateThemeMode(mode) {
2644
2634
  this.config = createMarkupCanvasConfig({ ...this.config, themeMode: mode });
2645
- updateThemeMode(this.canvas.container, this.config, this.rulers, mode);
2635
+ updateThemeMode(this.config, this.rulers, mode);
2646
2636
  }
2647
2637
  toggleThemeMode() {
2648
2638
  const currentMode = this.config.themeMode;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Markup Canvas
3
3
  * High-performance markup canvas with zoom and pan capabilities
4
- * @version 1.4.3
4
+ * @version 1.4.4
5
5
  */
6
6
  (function (global, factory) {
7
7
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
@@ -602,14 +602,12 @@
602
602
  return config;
603
603
  }
604
604
 
605
- function updateThemeMode(canvasContainer, config, rulers, mode) {
605
+ function updateThemeMode(config, rulers, mode) {
606
606
  const newConfig = {
607
607
  ...config,
608
608
  themeMode: mode,
609
609
  };
610
610
  const updatedConfig = createMarkupCanvasConfig(newConfig);
611
- // Update color-scheme CSS property
612
- canvasContainer.style.colorScheme = mode;
613
611
  // Update rulers if they exist
614
612
  if (rulers) {
615
613
  rulers.updateTheme(updatedConfig);
@@ -781,8 +779,6 @@
781
779
  if (config) {
782
780
  const backgroundColor = `light-dark(${config.canvasBackgroundColor}, ${config.canvasBackgroundColorDark})`;
783
781
  container.style.backgroundColor = backgroundColor;
784
- // Set color-scheme to enable light-dark() function
785
- container.style.colorScheme = config.themeMode;
786
782
  }
787
783
  if (!container.hasAttribute("tabindex")) {
788
784
  container.setAttribute("tabindex", "0");
@@ -1992,7 +1988,6 @@
1992
1988
  elements.horizontalRuler.style.setProperty("--ruler-border-color", borderColor);
1993
1989
  elements.horizontalRuler.style.setProperty("--ruler-text-color", textColor);
1994
1990
  elements.horizontalRuler.style.setProperty("--ruler-tick-color", tickColor);
1995
- elements.horizontalRuler.style.colorScheme = config.themeMode;
1996
1991
  }
1997
1992
  // Update vertical ruler with CSS variables
1998
1993
  if (elements.verticalRuler) {
@@ -2000,19 +1995,16 @@
2000
1995
  elements.verticalRuler.style.setProperty("--ruler-border-color", borderColor);
2001
1996
  elements.verticalRuler.style.setProperty("--ruler-text-color", textColor);
2002
1997
  elements.verticalRuler.style.setProperty("--ruler-tick-color", tickColor);
2003
- elements.verticalRuler.style.colorScheme = config.themeMode;
2004
1998
  }
2005
1999
  // Update corner box with CSS variables
2006
2000
  if (elements.cornerBox) {
2007
2001
  elements.cornerBox.style.setProperty("--ruler-background-color", backgroundColor);
2008
2002
  elements.cornerBox.style.setProperty("--ruler-border-color", borderColor);
2009
2003
  elements.cornerBox.style.setProperty("--ruler-text-color", textColor);
2010
- elements.cornerBox.style.colorScheme = config.themeMode;
2011
2004
  }
2012
2005
  // Update grid overlay with CSS variables
2013
2006
  if (elements.gridOverlay) {
2014
2007
  elements.gridOverlay.style.setProperty("--grid-color", gridColor);
2015
- elements.gridOverlay.style.colorScheme = config.themeMode;
2016
2008
  }
2017
2009
  }
2018
2010
 
@@ -2294,8 +2286,6 @@
2294
2286
  }
2295
2287
  });
2296
2288
  });
2297
- // Always set initial color-scheme
2298
- updateThemeMode(this.canvas.container, this.config, this.rulers, this.config.themeMode);
2299
2289
  // Always bind canvas to window
2300
2290
  this.event.setEmitInterceptor((event, data) => {
2301
2291
  broadcastEvent(event, data, this.config);
@@ -2586,7 +2576,7 @@
2586
2576
  // Theme management
2587
2577
  updateThemeMode(mode) {
2588
2578
  this.config = createMarkupCanvasConfig({ ...this.config, themeMode: mode });
2589
- updateThemeMode(this.canvas.container, this.config, this.rulers, mode);
2579
+ updateThemeMode(this.config, this.rulers, mode);
2590
2580
  }
2591
2581
  toggleThemeMode() {
2592
2582
  const currentMode = this.config.themeMode;
@@ -1 +1 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).MarkupCanvas=t()}(this,function(){"use strict";function e(e,t,n){if(!n?.inverse)return{x:e,y:t};try{const r=n.inverse(),a=new DOMPoint(e,t).matrixTransform(r);return{x:a.x,y:a.y}}catch(n){return console.warn("Canvas to content conversion failed:",n),{x:e,y:t}}}function t(e,t){return Math.max(t.minZoom,Math.min(t.maxZoom,e))}function n(e,t,n){return new DOMMatrix([e,0,0,e,t,n])}const r="canvas-container",a="transform-layer",o="content-layer";function i(e,n,r,a,o){const i=o.enableRulers?-o.rulerSize:0,s=r||{scale:1,translateX:i,translateY:i},{scale:l,translateX:c,translateY:u}=s,d=t(l*a,o);if(Math.abs(d-l)<.001)return{scale:l,translateX:c,translateY:u};return{scale:d,translateX:e-(e-c)/l*d,translateY:n-(n-u)/l*d}}function s(e){return e.getBounds().visibleArea}function l(e,n){return n(n=>t(n,e))}const c=new Map;function u(e,t,n){return e[t]?n():null}function d(e){let t=null,n=null;const r=(...r)=>{n=r,null===t&&(t=requestAnimationFrame(()=>{n&&e(...n),t=null,n=null}))};return r.cleanup=()=>{null!==t&&(cancelAnimationFrame(t),t=null,n=null)},r}function h(e,t,n){return n(null!==e.container.querySelector(".canvas-ruler")?t:0)}function m(e,t,n,r,a){const o=null!==e.container.querySelector(".canvas-ruler");return a(o?t-r:t,o?n-r:n)}const g={width:8e3,height:8e3,enableAcceleration:!0,initialZoom:1,initialPan:{x:0,y:0},name:"markupCanvas",enablePostMessageAPI:!1,enableZoom:!0,enablePan:!0,enableTouch:!0,enableKeyboard:!0,bindKeyboardEventsTo:"document",sendKeyboardEventsToParent:!1,zoomSpeed:1.5,minZoom:.05,maxZoom:80,enableTransition:!0,transitionDuration:.2,enableAdaptiveSpeed:!0,enableLeftDrag:!0,enableMiddleDrag:!0,requireSpaceForMouseDrag:!1,keyboardPanStep:50,keyboardFastMultiplier:20,keyboardZoomStep:.2,enableClickToZoom:!0,clickZoomLevel:1,requireOptionForClickZoom:!1,enableRulers:!0,enableGrid:!1,showRulers:!0,showGrid:!1,rulerFontSize:9,rulerFontFamily:"Monaco, Menlo, monospace",rulerUnits:"px",rulerSize:20,canvasBackgroundColor:"rgba(250, 250, 250, 1)",canvasBackgroundColorDark:"rgba(40, 40, 40, 1)",rulerBackgroundColor:"rgba(255, 255, 255, 0.95)",rulerBorderColor:"rgba(240, 240, 240, 1)",rulerTextColor:"rgba(102, 102, 102, 1)",rulerTickColor:"rgba(204, 204, 204, 1)",gridColor:"rgba(232, 86, 193, 0.5)",rulerBackgroundColorDark:"rgba(30, 30, 30, 0.95)",rulerBorderColorDark:"rgba(68, 68, 68, 1)",rulerTextColorDark:"rgba(170, 170, 170, 1)",rulerTickColorDark:"rgba(104, 104, 104, 1)",gridColorDark:"rgba(232, 86, 193, 0.5)",themeMode:"light"};function p(t,r){try{const a=t.container,o=t.transform||{scale:1,translateX:0,translateY:0},i=a.getBoundingClientRect(),s=i.width||a.clientWidth||0,l=i.height||a.clientHeight||0,c=h({container:a},r.rulerSize,e=>Math.max(0,s-e)),u=h({container:a},r.rulerSize,e=>Math.max(0,l-e)),d=r.width||g.width,m=r.height||g.height,p=function(t,r,a,o,i){const s=e(0,0,n(i.scale,i.translateX,i.translateY)),l=e(t,r,n(i.scale,i.translateX,i.translateY));return{x:Math.max(0,Math.min(a,s.x)),y:Math.max(0,Math.min(o,s.y)),width:Math.max(0,Math.min(a-s.x,l.x-s.x)),height:Math.max(0,Math.min(o-s.y,l.y-s.y))}}(c,u,d,m,o);return{width:c,height:u,contentWidth:d,contentHeight:m,scale:o.scale,translateX:o.translateX,translateY:o.translateY,visibleArea:p,scaledContentWidth:d*o.scale,scaledContentHeight:m*o.scale,canPanLeft:o.translateX<0,canPanRight:o.translateX+d*o.scale>c,canPanUp:o.translateY<0,canPanDown:o.translateY+m*o.scale>u,canZoomIn:o.scale<3.5,canZoomOut:o.scale>.1}}catch(e){return console.error("Failed to calculate canvas bounds:",e),{width:0,height:0,contentWidth:0,contentHeight:0,scale:1,translateX:0,translateY:0,visibleArea:{x:0,y:0,width:0,height:0},scaledContentWidth:0,scaledContentHeight:0,canPanLeft:!1,canPanRight:!1,canPanUp:!1,canPanDown:!1,canZoomIn:!1,canZoomOut:!1}}}function f(e,t){try{if(t.enableTransition){window.__markupCanvasTransitionTimeout&&(clearTimeout(window.__markupCanvasTransitionTimeout),window.__markupCanvasTransitionTimeout=void 0);return function(e,t,n){const r=c.get(e);r&&clearTimeout(r);const a=window.setTimeout(()=>{n(),c.delete(e)},t);c.set(e,a)}("disableTransition",1e3*(t.transitionDuration??.2),()=>{e.style.transition="none",window.__markupCanvasTransitionTimeout=void 0}),!0}return!1}catch(e){return console.error("Failed to disable transitions:",e),!0}}function b(e,t,n){!function(e,t){try{return!!t.enableTransition&&(window.__markupCanvasTransitionTimeout&&(clearTimeout(window.__markupCanvasTransitionTimeout),window.__markupCanvasTransitionTimeout=void 0),e.style.transition=`transform ${t.transitionDuration}s linear`,!0)}catch(e){return console.error("Failed to enable transitions:",e),!1}}(e,t);try{return n()}finally{f(e,t)}}function y(e,t,n){const r=t.keyboardPanStep;return n({translateY:e.transform.translateY-r})}function v(e,t,n){const r=t.keyboardPanStep;return n({translateX:e.transform.translateX+r})}function k(e,t,n){const r=t.keyboardPanStep;return n({translateX:e.transform.translateX-r})}function w(e,t,n){const r=t.keyboardPanStep;return n({translateY:e.transform.translateY+r})}function x(e,t){if(!e?.style||!t)return!1;try{return e.style.transform=function(e){return`matrix3d(${e.m11}, ${e.m12}, ${e.m13}, ${e.m14}, ${e.m21}, ${e.m22}, ${e.m23}, ${e.m24}, ${e.m31}, ${e.m32}, ${e.m33}, ${e.m34}, ${e.m41}, ${e.m42}, ${e.m43}, ${e.m44})`}(t),!0}catch(e){return console.warn("Transform application failed:",e),!1}}function T(e,t){e.transform={...e.transform,...t};const r=n(e.transform.scale,e.transform.translateX,e.transform.translateY);return x(e.transformLayer,r)}function C(e={}){const t={...g,...e};return("number"!=typeof t.width||t.width<=0)&&(console.warn("Invalid width, using default"),t.width=g.width),("number"!=typeof t.height||t.height<=0)&&(console.warn("Invalid height, using default"),t.height=g.height),("number"!=typeof t.zoomSpeed||t.zoomSpeed<=0)&&(console.warn("Invalid zoomSpeed, using default"),t.zoomSpeed=g.zoomSpeed),("number"!=typeof t.minZoom||t.minZoom<=0)&&(console.warn("Invalid minZoom, using default"),t.minZoom=g.minZoom),("number"!=typeof t.maxZoom||t.maxZoom<=t.minZoom)&&(console.warn("Invalid maxZoom, using default"),t.maxZoom=g.maxZoom),("number"!=typeof t.keyboardPanStep||t.keyboardPanStep<=0)&&(console.warn("Invalid keyboardPanStep, using default"),t.keyboardPanStep=g.keyboardPanStep),("number"!=typeof t.keyboardFastMultiplier||t.keyboardFastMultiplier<=0)&&(console.warn("Invalid keyboardFastMultiplier, using default"),t.keyboardFastMultiplier=g.keyboardFastMultiplier),("number"!=typeof t.clickZoomLevel||t.clickZoomLevel<=0)&&(console.warn("Invalid clickZoomLevel, using default"),t.clickZoomLevel=g.clickZoomLevel),("number"!=typeof t.rulerFontSize||t.rulerFontSize<=0)&&(console.warn("Invalid rulerFontSize, using default"),t.rulerFontSize=g.rulerFontSize),("number"!=typeof t.rulerSize||t.rulerSize<=0)&&(console.warn("Invalid rulerSize, using default"),t.rulerSize=g.rulerSize),t}function M(e,t,n,r){const a=C({...t,themeMode:r});e.style.colorScheme=r,n&&n.updateTheme(a)}function S(e){try{const t=e.getBounds();return{x:t.width/2,y:t.height/2}}catch(e){return console.warn("Failed to calculate viewport center:",e),{x:0,y:0}}}function D(e,t){const n=Array.from(e.children);let r=e.querySelector(`.${a}`);r||(r=document.createElement("div"),r.className=a,e.appendChild(r)),function(e,t){e.style.position="absolute";const n=t.rulerSize;e.style.top=`${n}px`,e.style.left=`${n}px`,e.style.width=`${t.width}px`,e.style.height=`${t.height}px`,e.style.transformOrigin="0 0"}(r,t);let i=r.querySelector(`.${o}`);return i||(i=document.createElement("div"),i.className=o,r.appendChild(i),function(e,t,n){e.forEach(e=>{e===n||e.classList.contains(a)||t.appendChild(e)})}(n,i,r)),function(e){e.style.position="relative",e.style.width="100%",e.style.height="100%",e.style.pointerEvents="auto"}(i),{transformLayer:r,contentLayer:i}}function E(e,t){if("static"===getComputedStyle(e).position&&(e.style.position="relative"),e.style.overflow="hidden",e.style.cursor="grab",e.style.overscrollBehavior="none",t){const n=`light-dark(${t.canvasBackgroundColor}, ${t.canvasBackgroundColorDark})`;e.style.backgroundColor=n,e.style.colorScheme=t.themeMode}e.hasAttribute("tabindex")||e.setAttribute("tabindex","0"),function(e){const t=e.getBoundingClientRect(),n=getComputedStyle(e);0===t.height&&"auto"===n.height&&console.error("MarkupCanvas: Container height is 0. Please set a height on your container element using CSS.","Examples: height: 100vh, height: 500px, or use flexbox/grid layout.",e),0===t.width&&"auto"===n.width&&console.error("MarkupCanvas: Container width is 0. Please set a width on your container element using CSS.","Examples: width: 100vw, width: 800px, or use flexbox/grid layout.",e)}(e),e.classList.contains(r)||e.classList.add(r)}function z(e,t){if(!e?.appendChild)return console.error("Invalid container element provided to createCanvas"),null;try{E(e,t);const{transformLayer:r,contentLayer:a}=D(e,t);u(t,"enableAcceleration",()=>{!function(e){try{return e.style.transform=e.style.transform||"translateZ(0)",e.style.backfaceVisibility="hidden",!0}catch(e){return console.error("Failed to enable hardware acceleration:",e),!1}}(r)});const o=t.enableRulers?-t.rulerSize:0,i={scale:t.initialZoom??1,translateX:(t.initialPan?.x??0)+o,translateY:(t.initialPan?.y??0)+o},s=n(i.scale,i.translateX,i.translateY);x(r,s);return{container:e,transformLayer:r,contentLayer:a,transform:i}}catch(e){return console.error("Failed to create canvas:",e),null}}class L{constructor(){this.listeners=new Map}setEmitInterceptor(e){this.emitInterceptor=e}on(e,t){this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t)}off(e,t){const n=this.listeners.get(e);n&&n.delete(t)}emit(e,t){this.emitInterceptor?.(e,t);const n=this.listeners.get(e);n&&n.forEach(n=>{try{n(t)}catch(t){console.error(`Error in event handler for "${String(e)}":`,t)}})}removeAllListeners(){this.listeners.clear()}}function R(e,t){const n=t.transform;e.emit("transform",n),e.emit("zoom",n.scale),e.emit("pan",{x:n.translateX,y:n.translateY})}const P=300,$=5;function Y(e,t){if(!e?.getBounds)return t;try{const n=e.getBounds(),r=n.width*n.height;return t*(r/2073600)**1}catch(e){return console.warn("Failed to calculate adaptive zoom speed, using base speed:",e),t}}function X(e,t,n){const r=n?.textEditModeEnabled??!1;function a(n){if(!(n instanceof KeyboardEvent))return;if("canvas"===t.bindKeyboardEventsTo&&document.activeElement!==e.container)return;if(u(t,"sendKeyboardEventsToParent",()=>{r&&!function(e){return!("0"!==e.key||!e.ctrlKey&&!e.metaKey)||!("+"!==e.key||!e.ctrlKey&&!e.metaKey)||!("-"!==e.key||!e.ctrlKey&&!e.metaKey)}(n)||(!function(e,t){if("undefined"==typeof window||!window.parent)return;const n=t.name||"markupCanvas";window.parent.postMessage({source:"markup-canvas",action:"keyboardShortcut",data:{key:e.key,ctrlKey:e.ctrlKey,metaKey:e.metaKey,shiftKey:e.shiftKey,altKey:e.altKey,code:e.code},timestamp:Date.now(),canvasName:n},"*")}(n,t),n.preventDefault())}),t.sendKeyboardEventsToParent)return;let a=!1;const o={};switch(n.key){case"ArrowLeft":if(r)return;o.translateX=e.transform.translateX+t.keyboardPanStep,a=!0;break;case"ArrowRight":if(r)return;o.translateX=e.transform.translateX-t.keyboardPanStep,a=!0;break;case"ArrowUp":if(r)return;o.translateY=e.transform.translateY+t.keyboardPanStep,a=!0;break;case"ArrowDown":if(r)return;o.translateY=e.transform.translateY-t.keyboardPanStep,a=!0;break;case"=":case"+":if(r)return;{const n=t.enableAdaptiveSpeed?Y(e,t.keyboardZoomStep):t.keyboardZoomStep;e.zoomIn(n),a=!0}break;case"-":if(r)return;{const n=t.enableAdaptiveSpeed?Y(e,t.keyboardZoomStep):t.keyboardZoomStep;e.zoomOut(n),a=!0}break;case"0":n.ctrlKey?(e.resetView&&e.resetView(),a=!0):n.metaKey&&(e.resetViewToCenter&&e.resetViewToCenter(),a=!0);break;case"g":case"G":!n.shiftKey||n.ctrlKey||n.metaKey||n.altKey||!e.toggleGrid||(e.toggleGrid(),a=!0);break;case"r":case"R":!n.shiftKey||n.metaKey||n.ctrlKey||n.altKey||!e.toggleRulers||(e.toggleRulers(),a=!0)}a&&(n.preventDefault(),Object.keys(o).length>0&&e.updateTransform(o))}const o="canvas"===t.bindKeyboardEventsTo?e.container:document;return o.addEventListener("keydown",a),()=>{o.removeEventListener("keydown",a)}}function I(e,t,n,r,a){n?t.requireSpaceForMouseDrag?e.container.style.cursor=r?"grab":"default":e.container.style.cursor=a?"grabbing":"grab":e.container.style.cursor="default"}function B(e,t,n,r,a){a.setIsDragging(!1),a.setDragButton(-1),I(e,t,n,r,!1)}function Z(e,t,n,r,a,o,i,s,l,c){o&&e.button===i&&B(t,n,r,a,{setIsDragging:c.setIsDragging,setDragButton:c.setDragButton}),r&&0===e.button&&n.enableClickToZoom&&s>0&&function(e,t,n,r,a,o){const i=Date.now()-r,s=e.altKey,l=!n.requireOptionForClickZoom||s;if(i<P&&!a&&!o&&l){e.preventDefault();const r=t.container.getBoundingClientRect(),a=e.clientX-r.left,o=e.clientY-r.top,{clickX:i,clickY:s}=m(t,a,o,n.rulerSize,(e,t)=>({clickX:e,clickY:t})),l=t.canvasToContent(i,s),c=r.width/2,u=r.height/2,d=n.clickZoomLevel,h={scale:d,translateX:c-l.x*d,translateY:u-l.y*d};b(t.transformLayer,t.config,()=>{t.updateTransform(h)})}}(e,t,n,s,l,o),0===e.button&&function(e){e.setMouseDownTime(0),e.setHasDragged(!1)}({setMouseDownTime:c.setMouseDownTime,setHasDragged:c.setHasDragged})}function F(e,t,n=!0){let r=!0,a=!1,o=0,i=0,s=-1,l=!1,c=0,u=0,h=0,m=!1;const g={setIsDragging:e=>{a=e},setDragButton:e=>{s=e},setIsSpacePressed:e=>{l=e},setMouseDownTime:e=>{c=e},setMouseDownX:e=>{u=e},setMouseDownY:e=>{h=e},setHasDragged:e=>{m=e},setLastMouseX:e=>{o=e},setLastMouseY:e=>{i=e}},p=n=>{!function(e,t,n,r,a,o){n.requireSpaceForMouseDrag&&" "===e.key&&(o.setIsSpacePressed(!0),I(t,n,r,!0,a))}(n,e,t,r,a,{setIsSpacePressed:g.setIsSpacePressed})},f=n=>{!function(e,t,n,r,a,o){n.requireSpaceForMouseDrag&&" "===e.key&&(o.setIsSpacePressed(!1),I(t,n,r,!1,a),a&&B(t,n,r,!1,{setIsDragging:o.setIsDragging,setDragButton:o.setDragButton}))}(n,e,t,r,a,{setIsSpacePressed:g.setIsSpacePressed,setIsDragging:g.setIsDragging,setDragButton:g.setDragButton})},b=n=>{!function(e,t,n,r,a,o){const i=0===e.button,s=1===e.button;if(i&&(o.setMouseDownTime(Date.now()),o.setMouseDownX(e.clientX),o.setMouseDownY(e.clientY),o.setHasDragged(!1)),!r)return;(!n.requireSpaceForMouseDrag||a)&&(i&&n.enableLeftDrag||s&&n.enableMiddleDrag)&&(e.preventDefault(),o.setDragButton(e.button),o.setLastMouseX(e.clientX),o.setLastMouseY(e.clientY),I(t,n,r,a,!1))}(n,e,t,r,l,g)},y=n=>{!function(e,t,n,r,a,o,i,s,l,c,u,h){if(i>0){const t=Math.abs(e.clientX-s),i=Math.abs(e.clientY-l);if(t>$||i>$){h.setHasDragged(!0);const e=!n.requireSpaceForMouseDrag||o;!a&&r&&e&&h.setIsDragging(!0)}}if(!a||!r)return;e.preventDefault(),d((...e)=>{const n=e[0];if(!a||!r)return;const o=n.clientX-c,i=n.clientY-u,s={translateX:t.transform.translateX+o,translateY:t.transform.translateY+i};t.updateTransform(s),h.setLastMouseX(n.clientX),h.setLastMouseY(n.clientY)})(e)}(n,e,t,r,a,l,c,u,h,o,i,{setHasDragged:g.setHasDragged,setIsDragging:g.setIsDragging,setLastMouseX:g.setLastMouseX,setLastMouseY:g.setLastMouseY})},v=n=>{Z(n,e,t,r,l,a,s,c,m,{setIsDragging:g.setIsDragging,setDragButton:g.setDragButton,setMouseDownTime:g.setMouseDownTime,setHasDragged:g.setHasDragged})},k=()=>{!function(e,t,n,r,a,o){a&&B(e,t,n,r,o)}(e,t,r,l,a,{setIsDragging:g.setIsDragging,setDragButton:g.setDragButton})};e.container.addEventListener("mousedown",b),document.addEventListener("mousemove",y),document.addEventListener("mouseup",v),e.container.addEventListener("mouseleave",k),t.requireSpaceForMouseDrag&&(document.addEventListener("keydown",p),document.addEventListener("keyup",f)),I(e,t,r,l,a);const w=()=>{e.container.removeEventListener("mousedown",b),document.removeEventListener("mousemove",y),document.removeEventListener("mouseup",v),e.container.removeEventListener("mouseleave",k),t.requireSpaceForMouseDrag&&(document.removeEventListener("keydown",p),document.removeEventListener("keyup",f))};return n?{cleanup:w,enable:()=>(r=!0,I(e,t,r,l,a),!0),disable:()=>(r=!1,a&&B(e,t,r,l,{setIsDragging:g.setIsDragging,setDragButton:g.setDragButton}),I(e,t,r,l,a),!0),isEnabled:()=>r}:w}function K(e,t,n,r){try{switch(t){case"zoomIn":e.zoomIn(n);break;case"zoomOut":e.zoomOut(n);break;case"setZoom":{const t=n;if("number"!=typeof t||t<=0)throw new Error(`Invalid zoom level: ${t}. Must be a positive number.`);e.setZoom(t);break}case"resetZoom":e.resetZoom();break;case"panLeft":e.panLeft(n);break;case"panRight":e.panRight(n);break;case"panUp":e.panUp(n);break;case"panDown":e.panDown(n);break;case"fitToScreen":e.fitToScreen();break;case"centerContent":e.centerContent();break;case"panToPoint":{const t=n;e.panToPoint(t.x,t.y);break}case"resetView":e.resetView();break;case"resetViewToCenter":e.resetViewToCenter();break;case"resetToInitial":e.resetToInitial();break;case"toggleRulers":e.toggleRulers();break;case"showRulers":e.showRulers();break;case"hideRulers":e.hideRulers();break;case"toggleGrid":e.toggleGrid();break;case"showGrid":e.showGrid();break;case"hideGrid":e.hideGrid();break;case"updateThemeMode":{const t=n;if("light"!==t&&"dark"!==t)throw new Error(`Invalid theme mode: ${t}`);e.updateThemeMode(t);break}case"toggleThemeMode":{const t="light"===e.getConfig().themeMode?"dark":"light";e.updateThemeMode(t);break}case"updateTransition":{const t=n;if("boolean"!=typeof t)throw new Error(`Invalid transition enabled value: ${t}. Must be a boolean.`);e.updateTransition(t);break}case"toggleTransitionMode":e.toggleTransitionMode();break;default:throw new Error(`Unknown action: ${t}`)}}catch(e){!function(e,t,n){window.postMessage({source:"markup-canvas-error",canvasName:e,action:t,error:n,timestamp:Date.now()},"*")}(r,t,e instanceof Error?e.message:String(e))}}function O(e,t){return{x:(e.clientX+t.clientX)/2,y:(e.clientY+t.clientY)/2}}function V(e,t){const n=e.clientX-t.clientX,r=e.clientY-t.clientY;return Math.sqrt(n*n+r*r)}function A(e,t,n,r){const a=i(n,r,e.transform,t,e.config);return e.updateTransform(a)}function _(e,t,n){e.preventDefault();const r=Array.from(e.touches);d((...e)=>{const r=e[0];if(1===r.length){if(1===n.touches.length){const e=r[0].clientX-n.touches[0].clientX,a=r[0].clientY-n.touches[0].clientY,o={translateX:t.transform.translateX+e,translateY:t.transform.translateY+a};t.updateTransform(o)}}else if(2===r.length){const e=V(r[0],r[1]),a=O(r[0],r[1]);if(n.lastDistance>0){const r=e/n.lastDistance,o=t.container.getBoundingClientRect();let i=a.x-o.left,s=a.y-o.top;const l=function(e,t,n,r){return h(e,t,e=>{const t={...n,x:n.x-e,y:n.y-e};return r(t)})}(t,t.config.rulerSize,{x:i,y:s},e=>e);i=l.x,s=l.y,A(t,r,i,s)}n.lastDistance=e,n.lastCenter=a}n.touches=r})(r)}function G(e){const t={touches:[],lastDistance:0,lastCenter:{}},n=e=>{!function(e,t){e.preventDefault(),t.touches=Array.from(e.touches),2===t.touches.length&&(t.lastDistance=V(t.touches[0],t.touches[1]),t.lastCenter=O(t.touches[0],t.touches[1]))}(e,t)},r=n=>{_(n,e,t)},a=e=>{!function(e,t){t.touches=Array.from(e.touches),t.touches.length<2&&(t.lastDistance=0)}(e,t)};return e.container.addEventListener("touchstart",n,{passive:!1}),e.container.addEventListener("touchmove",r,{passive:!1}),e.container.addEventListener("touchend",a,{passive:!1}),()=>{e.container.removeEventListener("touchstart",n),e.container.removeEventListener("touchmove",r),e.container.removeEventListener("touchend",a)}}function N(e){const t=e.ctrlKey||e.metaKey,n=[0===e.deltaMode,Math.abs(e.deltaY)<50,e.deltaY%1!=0,Math.abs(e.deltaX)>0&&Math.abs(e.deltaY)>0].filter(Boolean).length>=2;return{isTrackpad:n,isMouseWheel:!n,isTrackpadScroll:n&&!t,isTrackpadPinch:n&&t,isZoomGesture:t}}function H(e,t){const n=(e=>d((...t)=>{const n=t[0];if(!n||!e?.updateTransform)return!1;try{const t=e.transform,r=1,a=n.deltaX*r,o=n.deltaY*r,i={scale:t.scale,translateX:t.translateX-a,translateY:t.translateY-o};return f(e.transformLayer,e.config),e.updateTransform(i)}catch(e){return console.error("Error handling trackpad pan:",e),!1}}))(e),r=r=>N(r).isTrackpadScroll?n(r):function(e,t,n){if(!e||"number"!=typeof e.deltaY)return console.warn("Invalid wheel event provided"),!1;if(!t?.updateTransform)return console.warn("Invalid canvas provided to handleWheelEvent"),!1;try{e.preventDefault();const r=t.container.getBoundingClientRect(),a=e.clientX-r.left,o=e.clientY-r.top,{mouseX:i,mouseY:s}=m(t,a,o,n.rulerSize,(e,t)=>({mouseX:e,mouseY:t})),l=n.zoomSpeed,c=N(e);if(!c.isZoomGesture)return!1;let u=n.enableAdaptiveSpeed?Y(t,l):l;if(c.isTrackpadPinch){const e=.05*n.zoomSpeed;u=n.enableAdaptiveSpeed?Y(t,e):e}return A(t,(e.deltaY<0?1:-1)>0?1+u:1/(1+u),i,s)}catch(e){return console.error("Error handling wheel event:",e),!1}}(r,e,t);return e.container.addEventListener("wheel",r,{passive:!1}),()=>{e.container.removeEventListener("wheel",r)}}const q=100,U=1e3,W=1001,j=4,J=4,Q=100,ee=100,te=20,ne=200;function re(e,t){const n=function(e){const t=document.createElement("div");return t.className="canvas-ruler horizontal-ruler",t.style.cssText=`\n\tposition: absolute;\n\ttop: 0;\n\tleft: ${e.rulerSize}px;\n\tright: 0;\n\theight: ${e.rulerSize}px;\n\tbackground: var(--ruler-background-color);\n\tborder-bottom: 1px solid var(--ruler-border-color);\n\tz-index: ${U};\n\tpointer-events: none;\n\tfont-family: ${e.rulerFontFamily};\n\tfont-size: ${e.rulerFontSize}px;\n\tcolor: var(--ruler-text-color);\n\toverflow: hidden;\n `,t}(t),r=function(e){const t=document.createElement("div");return t.className="canvas-ruler vertical-ruler",t.style.cssText=`\n\tposition: absolute;\n\ttop: ${e.rulerSize}px;\n\tleft: 0;\n\tbottom: 0;\n\twidth: ${e.rulerSize}px;\n\tbackground: var(--ruler-background-color);\n\tborder-right: 1px solid var(--ruler-border-color);\n\tz-index: ${U};\n\tpointer-events: none;\n\tfont-family: ${e.rulerFontFamily};\n\tfont-size: ${e.rulerFontSize}px;\n\tcolor: var(--ruler-text-color);\n\toverflow: hidden;\n `,t}(t),a=function(e){const t=document.createElement("div");return t.className="canvas-ruler corner-box",t.style.cssText=`\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\twidth: ${e.rulerSize}px;\n\t\theight: ${e.rulerSize}px;\n\t\tbackground: var(--ruler-background-color);\n\t\tborder-right: 1px solid var(--ruler-border-color);\n\t\tborder-bottom: 1px solid var(--ruler-border-color);\n\t\tz-index: ${W};\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tfont-family: ${e.rulerFontFamily};\n\t\tfont-size: ${e.rulerFontSize-2}px;\n\t\tcolor: var(--ruler-text-color);\n\t\tpointer-events: none;\n\t`,t.textContent=e.rulerUnits,t}(t),o=t.enableGrid?function(e){const t=document.createElement("div");return t.className="canvas-ruler grid-overlay",t.style.cssText=`\n\t\tposition: absolute;\n\t\ttop: ${e.rulerSize}px;\n\t\tleft: ${e.rulerSize}px;\n\t\tright: 0;\n\t\tbottom: 0;\n\t\tpointer-events: none;\n\t\tz-index: ${q};\n\t\tbackground-image: \n\t\t\tlinear-gradient(var(--grid-color) 1px, transparent 1px),\n\t\t\tlinear-gradient(90deg, var(--grid-color) 1px, transparent 1px);\n\t\tbackground-size: 100px 100px;\n\t\topacity: 0.5;\n\t`,t}(t):void 0;return e.appendChild(n),e.appendChild(r),e.appendChild(a),o&&e.appendChild(o),{horizontalRuler:n,verticalRuler:r,cornerBox:a,gridOverlay:o}}function ae(e,t){const n=e/Math.max(5,Math.min(20,t/50)),r=10**Math.floor(Math.log10(n)),a=n/r;let o;return o=a<=1?1:a<=2?2:a<=5?5:10,o*r}function oe(e,t,n,r,a){const o=document.createElement("div");o.className="tick",o.style.cssText=`\n\t\tposition: absolute;\n\t\tleft: ${n}px;\n\t\tbottom: 0;\n\t\twidth: 1px;\n\t\theight: ${j}px;\n\t\tbackground: var(--ruler-tick-color);\n\t`,e.appendChild(o);if(t%Q===0){const r=document.createElement("div");r.style.cssText=`\n\t\t\tposition: absolute;\n\t\t\tleft: ${n}px;\n\t\t\tbottom: ${j+2}px;\n\t\t\tfont-size: ${a.rulerFontSize}px;\n\t\t\tline-height: 1;\n\t\t\tcolor: var(--ruler-text-color);\n\t\t\twhite-space: nowrap;\n\t\t\tpointer-events: none;\n\t\t`,r.textContent=Math.round(t).toString(),e.appendChild(r)}}function ie(e,t,n,r,a){const o=document.createElement("div");o.className="tick",o.style.cssText=`\n\t\tposition: absolute;\n\t\ttop: ${n}px;\n\t\tright: 0;\n\t\twidth: ${J}px;\n\t\theight: 1px;\n\t\tbackground: var(--ruler-tick-color);\n\t`,e.appendChild(o);if(t%Q===0){const r=document.createElement("div");r.style.cssText=`\n\t\t\tposition: absolute;\n\t\t\ttop: ${n-6}px;\n\t\t\tright: ${J+6}px;\n\t\t\tfont-size: ${a.rulerFontSize}px;\n\t\t\tline-height: 1;\n\t\t\tcolor: var(--ruler-text-color);\n\t\t\twhite-space: nowrap;\n\t\t\tpointer-events: none;\n\t\t\ttransform: rotate(-90deg);\n\t\t\ttransform-origin: right center;\n\t\t`,r.textContent=Math.round(t).toString(),e.appendChild(r)}}function se(e,t,n,r,a){const o=e.getBounds(),i=o.scale||1,s=o.translateX||0,l=o.translateY||0,c=o.width-a.rulerSize,u=o.height-a.rulerSize,d=-s/i,h=-l/i,m=h+u/i;!function(e,t,n,r,a,o){const i=r,s=ae(n-t,i),l=document.createDocumentFragment(),c=Math.floor(t/s)*s,u=Math.ceil(n/s)*s;for(let e=c;e<=u;e+=s){const n=(e-t)*a;n>=-50&&n<=i+50&&oe(l,e,n,0,o)}e.innerHTML="",e.appendChild(l)}(t,d,d+c/i,c,i,a),function(e,t,n,r,a,o){const i=r,s=ae(n-t,i),l=document.createDocumentFragment(),c=Math.floor(t/s)*s,u=Math.ceil(n/s)*s;for(let e=c;e<=u;e+=s){const n=(e-t)*a;n>=-50&&n<=i+50&&ie(l,e,n,0,o)}e.innerHTML="",e.appendChild(l)}(n,h,m,u,i,a),r&&function(e,t,n,r){let a=ee*t;for(;a<te;)a*=2;for(;a>ne;)a/=2;e.style.backgroundSize=`${a}px ${a}px`,e.style.backgroundPosition=`${n%a}px ${r%a}px`}(r,i,s,l)}function le(e,t){const n=`light-dark(${t.rulerBackgroundColor}, ${t.rulerBackgroundColorDark})`,r=`light-dark(${t.rulerBorderColor}, ${t.rulerBorderColorDark})`,a=`light-dark(${t.rulerTextColor}, ${t.rulerTextColorDark})`,o=`light-dark(${t.rulerTickColor}, ${t.rulerTickColorDark})`,i=`light-dark(${t.gridColor}, ${t.gridColorDark})`;e.horizontalRuler&&(e.horizontalRuler.style.setProperty("--ruler-background-color",n),e.horizontalRuler.style.setProperty("--ruler-border-color",r),e.horizontalRuler.style.setProperty("--ruler-text-color",a),e.horizontalRuler.style.setProperty("--ruler-tick-color",o),e.horizontalRuler.style.colorScheme=t.themeMode),e.verticalRuler&&(e.verticalRuler.style.setProperty("--ruler-background-color",n),e.verticalRuler.style.setProperty("--ruler-border-color",r),e.verticalRuler.style.setProperty("--ruler-text-color",a),e.verticalRuler.style.setProperty("--ruler-tick-color",o),e.verticalRuler.style.colorScheme=t.themeMode),e.cornerBox&&(e.cornerBox.style.setProperty("--ruler-background-color",n),e.cornerBox.style.setProperty("--ruler-border-color",r),e.cornerBox.style.setProperty("--ruler-text-color",a),e.cornerBox.style.colorScheme=t.themeMode),e.gridOverlay&&(e.gridOverlay.style.setProperty("--grid-color",i),e.gridOverlay.style.colorScheme=t.themeMode)}function ce(e,t){if(!e?.container)return console.error("Invalid canvas provided to createRulers"),null;let n,r=null,a=!1;const o=()=>{!a&&n.horizontalRuler&&n.verticalRuler&&se(e,n.horizontalRuler,n.verticalRuler,n.gridOverlay,t)};try{return n=re(e.container,t),r=function(e,t){const n=d(t),r=e.updateTransform;e.updateTransform=function(e){const t=r.call(this,e);return n(),t};const a=d(t);return window.addEventListener("resize",a),()=>{window.removeEventListener("resize",a),e.updateTransform=r,n.cleanup(),a.cleanup()}}(e,o),le(n,t),o(),t.showRulers||(n.horizontalRuler.style.display="none",n.verticalRuler.style.display="none",n.cornerBox.style.display="none"),!t.showGrid&&n.gridOverlay&&(n.gridOverlay.style.display="none"),{horizontalRuler:n.horizontalRuler,verticalRuler:n.verticalRuler,cornerBox:n.cornerBox,gridOverlay:n.gridOverlay,update:o,updateTheme:e=>{a||le(n,e)},show:()=>{n.horizontalRuler&&(n.horizontalRuler.style.display="block"),n.verticalRuler&&(n.verticalRuler.style.display="block"),n.cornerBox&&(n.cornerBox.style.display="flex")},hide:()=>{n.horizontalRuler&&(n.horizontalRuler.style.display="none"),n.verticalRuler&&(n.verticalRuler.style.display="none"),n.cornerBox&&(n.cornerBox.style.display="none"),n.gridOverlay&&(n.gridOverlay.style.display="none")},toggleGrid:()=>{if(n.gridOverlay){const e="none"!==n.gridOverlay.style.display;n.gridOverlay.style.display=e?"none":"block"}},destroy:()=>{a=!0,r&&r(),n.horizontalRuler?.parentNode&&n.horizontalRuler.parentNode.removeChild(n.horizontalRuler),n.verticalRuler?.parentNode&&n.verticalRuler.parentNode.removeChild(n.verticalRuler),n.cornerBox?.parentNode&&n.cornerBox.parentNode.removeChild(n.cornerBox),n.gridOverlay?.parentNode&&n.gridOverlay.parentNode.removeChild(n.gridOverlay)}}}catch(e){return console.error("Failed to create rulers:",e),null}}return class{constructor(e,t={}){if(this.cleanupCallbacks=[],this.rulers=null,this.dragSetup=null,this.keyboardCleanup=null,this.textEditModeEnabled=!1,this.event=new L,this._isReady=!1,!e)throw new Error("Container element is required");this.config=C(t);const n=z(e,this.config);if(!n)throw new Error("Failed to create canvas");if(this.canvas=n,u(this.config,"enableRulers",()=>{this.rulers=ce(this,this.config),this.cleanupCallbacks.push(()=>{this.rulers&&this.rulers.destroy()})}),M(this.canvas.container,this.config,this.rulers,this.config.themeMode),this.event.setEmitInterceptor((e,t)=>{!function(e,t,n){if("undefined"==typeof window)return;let r=t;"ready"===e&&(r={ready:!0});const a=n.name||"markupCanvas";window.postMessage({source:"markup-canvas",action:e,data:r,timestamp:Date.now(),canvasName:a},"*"),window.parent&&window.parent.postMessage({source:"markup-canvas",action:e,data:r,timestamp:Date.now(),canvasName:a},"*")}(e,t,this.config)}),function(e,t){if("undefined"==typeof window)return;const n=t.name||"markupCanvas",r=window,a={config:{get current(){return e.config},get:e.getConfig.bind(e),update:e.updateConfig.bind(e)},transform:{update:e.updateTransform.bind(e),reset:e.reset.bind(e),resetToInitial:e.resetToInitial.bind(e)},zoom:{get current(){return e.transform.scale||1},set:e.setZoom.bind(e),toPoint:e.zoomToPoint.bind(e),in:e.zoomIn.bind(e),out:e.zoomOut.bind(e),reset:e.resetZoom.bind(e),resetToCenter:e.resetViewToCenter.bind(e),fitToScreen:e.fitToScreen.bind(e)},pan:{left:e.panLeft.bind(e),right:e.panRight.bind(e),up:e.panUp.bind(e),down:e.panDown.bind(e),toPoint:e.panToPoint.bind(e),toCenter:e.centerContent.bind(e)},mouseDrag:{enable:e.enableMouseDrag.bind(e),disable:e.disableMouseDrag.bind(e),isEnabled:e.isMouseDragEnabled.bind(e)},keyboard:{enable:e.enableKeyboard.bind(e),disable:e.disableKeyboard.bind(e),isEnabled:e.isKeyboardEnabled.bind(e),enableTextEditMode:e.enableTextEditMode.bind(e),disableTextEditMode:e.disableTextEditMode.bind(e),isTextEditModeEnabled:e.isTextEditModeEnabled.bind(e)},grid:{toggle:e.toggleGrid.bind(e),show:e.showGrid.bind(e),hide:e.hideGrid.bind(e),isVisible:e.isGridVisible.bind(e)},rulers:{toggle:e.toggleRulers.bind(e),show:e.showRulers.bind(e),hide:e.hideRulers.bind(e),isVisible:e.areRulersVisible.bind(e)},canvas:{canvasToContent:e.canvasToContent.bind(e),getVisibleArea:e.getVisibleArea.bind(e),isPointVisible:e.isPointVisible.bind(e),getBounds:e.getBounds.bind(e)},theme:{get current(){return e.config.themeMode},update:e.updateThemeMode.bind(e),toggle:e.toggleThemeMode.bind(e)},transition:{get current(){return e.config.enableTransition},set:e.updateTransition.bind(e),toggle:e.toggleTransitionMode.bind(e)},event:e.event,lifecycle:{cleanup:e.cleanup.bind(e),destroy:e.destroy.bind(e)},state:{get isReady(){return e.isReady},get isTransforming(){return e.isTransforming},get visibleBounds(){return e.visibleBounds},get transform(){return e.transform}}};r[n]=a,r.__markupCanvasInstances||(r.__markupCanvasInstances=new Map),r.__markupCanvasInstances.set(n,a)}(this,this.config),this.config.enablePostMessageAPI){const e=function(e){const t=t=>{const n=t.data;if(!["markup-canvas","application"].includes(n.source))return;const r=e.config.name||"markupCanvas";if(n.canvasName!==r)return;const a=n.action,o=n.data;K(e,a,o,r)};return"undefined"!=typeof window&&window.addEventListener("message",t),()=>{"undefined"!=typeof window&&window.removeEventListener("message",t)}}(this);this.cleanupCallbacks.push(e)}this.setupEventHandlers(),this._isReady=!0,this.event.emit("ready",this)}setupEventHandlers(){try{u(this.config,"enableZoom",()=>{const e=H(this,this.config);this.cleanupCallbacks.push(e)}),(this.config.enablePan||this.config.enableClickToZoom)&&(this.dragSetup=F(this,this.config,!0),this.cleanupCallbacks.push(this.dragSetup.cleanup)),u(this.config,"enableKeyboard",()=>{const e=X(this,this.config,{textEditModeEnabled:this.textEditModeEnabled});this.keyboardCleanup=e,this.cleanupCallbacks.push(e)}),u(this.config,"enableTouch",()=>{const e=G(this);this.cleanupCallbacks.push(e)})}catch(e){throw console.error("Failed to set up event handlers:",e),this.cleanup(),e}}get container(){return this.canvas.container}get transformLayer(){return this.canvas.transformLayer}get contentLayer(){return this.canvas.contentLayer}get transform(){return this.canvas.transform}get isReady(){return this._isReady}get isTransforming(){return this.dragSetup?.isEnabled()||!1}get visibleBounds(){return s(this)}getBounds(){return p(this.canvas,this.config)}updateTransform(e){const t=T(this.canvas,e);return t&&R(this.event,this.canvas),t}reset(){const e=T(this.canvas,{scale:1,translateX:0,translateY:0});return e&&R(this.event,this.canvas),e}resetToInitial(){const e=(t=this.canvas,n=this.transformLayer,r=this.config,b(n,r,()=>h(t,r.rulerSize,e=>{const n=r.initialZoom??1,a=r.initialPan??{x:0,y:0},o=-1*e,i={scale:n,translateX:a.x+o,translateY:a.y+o};return T(t,i)})));var t,n,r;return e&&R(this.event,this.canvas),e}setZoom(e){return function(e,t,n,r,a){return b(t,n,()=>l(n,t=>{const n=t(a),o=S(e);return r(o.x,o.y,n)}))}(this,this.transformLayer,this.config,this.zoomToPoint.bind(this),e)}canvasToContent(t,r){return e(t,r,n(this.canvas.transform.scale,this.canvas.transform.translateX,this.canvas.transform.translateY))}zoomToPoint(e,t,n){const r=function(e,t,n,r,a,o){return b(t,n,()=>{const t=i(r,a,e.transform,o/e.transform.scale,n);return T(e,t)})}(this.canvas,this.transformLayer,this.config,e,t,n);return r&&R(this.event,this.canvas),r}resetView(){return e=this.canvas,t=this.transformLayer,n=this.config,b(t,n,()=>h(e,n.rulerSize,t=>T(e,{scale:1,translateX:-1*t,translateY:-1*t})));var e,t,n}resetViewToCenter(){return function(e,t,n,r){return b(t,n,()=>l(n,t=>{const n=t(1),a=S(e);return r(a.x,a.y,n)}))}(this,this.transformLayer,this.config,this.zoomToPoint.bind(this))}panLeft(e){return v(this.canvas,this.config,this.updateTransform.bind(this))||!!e&&v(this.canvas,{...this.config,keyboardPanStep:e},this.updateTransform.bind(this))}panRight(e){return k(this.canvas,this.config,this.updateTransform.bind(this))||!!e&&k(this.canvas,{...this.config,keyboardPanStep:e},this.updateTransform.bind(this))}panUp(e){return w(this.canvas,this.config,this.updateTransform.bind(this))||!!e&&w(this.canvas,{...this.config,keyboardPanStep:e},this.updateTransform.bind(this))}panDown(e){return y(this.canvas,this.config,this.updateTransform.bind(this))||!!e&&y(this.canvas,{...this.config,keyboardPanStep:e},this.updateTransform.bind(this))}zoomIn(e=.5){return function(e,t,n,r,a=.5){return b(t,n,()=>l(n,t=>{const n=t(e.transform.scale*(1+a)),o=S(e);return r(o.x,o.y,n)}))}(this,this.transformLayer,this.config,this.zoomToPoint.bind(this),e)}zoomOut(e=.5){return function(e,t,n,r,a=.5){return b(t,n,()=>l(n,t=>{const n=t(e.transform.scale*(1-a)),o=S(e);return r(o.x,o.y,n)}))}(this,this.transformLayer,this.config,this.zoomToPoint.bind(this),e)}resetZoom(){return this.resetViewToCenter()}enableMouseDrag(){return this.dragSetup?.enable()??!1}disableMouseDrag(){return this.dragSetup?.disable()??!1}isMouseDragEnabled(){return this.dragSetup?.isEnabled()??!1}enableKeyboard(){return this.keyboardCleanup||(this.keyboardCleanup=X(this,this.config,{textEditModeEnabled:this.textEditModeEnabled}),this.cleanupCallbacks.push(this.keyboardCleanup)),!0}disableKeyboard(){return!!this.keyboardCleanup&&(this.keyboardCleanup(),this.keyboardCleanup=null,!0)}isKeyboardEnabled(){return null!==this.keyboardCleanup}enableTextEditMode(){if(this.textEditModeEnabled)return!0;if(this.textEditModeEnabled=!0,this.keyboardCleanup){const e=this.cleanupCallbacks.indexOf(this.keyboardCleanup);e>-1&&this.cleanupCallbacks.splice(e,1),this.keyboardCleanup(),this.keyboardCleanup=X(this,this.config,{textEditModeEnabled:!0}),this.cleanupCallbacks.push(this.keyboardCleanup)}return!0}disableTextEditMode(){if(!this.textEditModeEnabled)return!0;if(this.textEditModeEnabled=!1,this.keyboardCleanup){const e=this.cleanupCallbacks.indexOf(this.keyboardCleanup);e>-1&&this.cleanupCallbacks.splice(e,1),this.keyboardCleanup(),this.keyboardCleanup=X(this,this.config,{textEditModeEnabled:!1}),this.cleanupCallbacks.push(this.keyboardCleanup)}return!0}isTextEditModeEnabled(){return this.textEditModeEnabled}toggleGrid(){const e=(t=this.rulers,!!t?.toggleGrid&&(t.toggleGrid(),!0));var t;return e&&this.event.emit("gridVisibility",this.isGridVisible()),e}showGrid(){const e=(t=this.rulers,!!t?.gridOverlay&&(t.gridOverlay.style.display="block",!0));var t;return e&&this.event.emit("gridVisibility",!0),e}hideGrid(){const e=(t=this.rulers,!!t?.gridOverlay&&(t.gridOverlay.style.display="none",!0));var t;return e&&this.event.emit("gridVisibility",!1),e}isGridVisible(){return e=this.rulers,!!e?.gridOverlay&&"none"!==e.gridOverlay.style.display;var e}toggleRulers(){const e=function(e,t){if(e)return t()?e.hide():e.show(),!0;return!1}(this.rulers,()=>this.areRulersVisible());return e&&this.event.emit("rulersVisibility",this.areRulersVisible()),e}showRulers(){const e=!!(t=this.rulers)&&(t.show(),!0);var t;return e&&this.event.emit("rulersVisibility",!0),e}hideRulers(){const e=!!(t=this.rulers)&&(t.hide(),!0);var t;return e&&this.event.emit("rulersVisibility",!1),e}areRulersVisible(){return e=this.rulers,!!e?.horizontalRuler&&"none"!==e.horizontalRuler.style.display;var e}centerContent(){return e=this.canvas,t=this.config,n=this.updateTransform.bind(this),b(this.transformLayer,t,()=>{const r=p(e,t),a=(r.width-r.contentWidth*e.transform.scale)/2,o=(r.height-r.contentHeight*e.transform.scale)/2;return n({translateX:a,translateY:o})});var e,t,n}fitToScreen(){return e=this.canvas,t=this.transformLayer,n=this.config,b(t,n,()=>{const t=p(e,n),r=t.width/n.width,a=t.height/n.height,o=l(n,e=>e(.9*Math.min(r,a))),i=n.width*o,s=n.height*o,c=(t.width-i)/2,u=(t.height-s)/2;return T(e,{scale:o,translateX:c,translateY:u})});var e,t,n}getVisibleArea(){return s(this)}isPointVisible(e,t){return function(e,t,n){const r=s(e);return t>=r.x&&t<=r.x+r.width&&n>=r.y&&n<=r.y+r.height}(this,e,t)}panToPoint(e,t){return function(e,t,n,r,a,o){return b(o,t,()=>{const o=p(e,t),i=o.width/2,s=o.height/2,l=i-n*e.transform.scale,c=s-r*e.transform.scale;return a({translateX:l,translateY:c})})}(this.canvas,this.config,e,t,this.updateTransform.bind(this),this.transformLayer)}getConfig(){return{...this.config}}updateConfig(e){this.config=C({...this.config,...e})}updateThemeMode(e){this.config=C({...this.config,themeMode:e}),M(this.canvas.container,this.config,this.rulers,e)}toggleThemeMode(){const e="light"===this.config.themeMode?"dark":"light";return this.updateThemeMode(e),e}updateTransition(e){this.config=C({...this.config,enableTransition:e})}toggleTransitionMode(){const e=function(e){return!e}(this.config.enableTransition);return this.updateTransition(e),e}cleanup(){!function(e){if("undefined"==typeof window)return;const t=e.name||"markupCanvas",n=window;delete n[t],n.__markupCanvasInstances&&n.__markupCanvasInstances.delete(t)}(this.config),this.cleanupCallbacks.forEach(e=>{try{e()}catch(e){console.warn("Error during cleanup:",e)}}),this.cleanupCallbacks=[],this.removeAllListeners()}on(e,t){this.event.on(e,t)}off(e,t){this.event.off(e,t)}emit(e,t){this.event.emit(e,t)}removeAllListeners(){this.event.removeAllListeners()}destroy(){this.cleanup(),window.__markupCanvasTransitionTimeout&&clearTimeout(window.__markupCanvasTransitionTimeout)}}});
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).MarkupCanvas=t()}(this,function(){"use strict";function e(e,t,n){if(!n?.inverse)return{x:e,y:t};try{const r=n.inverse(),a=new DOMPoint(e,t).matrixTransform(r);return{x:a.x,y:a.y}}catch(n){return console.warn("Canvas to content conversion failed:",n),{x:e,y:t}}}function t(e,t){return Math.max(t.minZoom,Math.min(t.maxZoom,e))}function n(e,t,n){return new DOMMatrix([e,0,0,e,t,n])}const r="canvas-container",a="transform-layer",o="content-layer";function i(e,n,r,a,o){const i=o.enableRulers?-o.rulerSize:0,s=r||{scale:1,translateX:i,translateY:i},{scale:l,translateX:c,translateY:u}=s,d=t(l*a,o);if(Math.abs(d-l)<.001)return{scale:l,translateX:c,translateY:u};return{scale:d,translateX:e-(e-c)/l*d,translateY:n-(n-u)/l*d}}function s(e){return e.getBounds().visibleArea}function l(e,n){return n(n=>t(n,e))}const c=new Map;function u(e,t,n){return e[t]?n():null}function d(e){let t=null,n=null;const r=(...r)=>{n=r,null===t&&(t=requestAnimationFrame(()=>{n&&e(...n),t=null,n=null}))};return r.cleanup=()=>{null!==t&&(cancelAnimationFrame(t),t=null,n=null)},r}function h(e,t,n){return n(null!==e.container.querySelector(".canvas-ruler")?t:0)}function g(e,t,n,r,a){const o=null!==e.container.querySelector(".canvas-ruler");return a(o?t-r:t,o?n-r:n)}const m={width:8e3,height:8e3,enableAcceleration:!0,initialZoom:1,initialPan:{x:0,y:0},name:"markupCanvas",enablePostMessageAPI:!1,enableZoom:!0,enablePan:!0,enableTouch:!0,enableKeyboard:!0,bindKeyboardEventsTo:"document",sendKeyboardEventsToParent:!1,zoomSpeed:1.5,minZoom:.05,maxZoom:80,enableTransition:!0,transitionDuration:.2,enableAdaptiveSpeed:!0,enableLeftDrag:!0,enableMiddleDrag:!0,requireSpaceForMouseDrag:!1,keyboardPanStep:50,keyboardFastMultiplier:20,keyboardZoomStep:.2,enableClickToZoom:!0,clickZoomLevel:1,requireOptionForClickZoom:!1,enableRulers:!0,enableGrid:!1,showRulers:!0,showGrid:!1,rulerFontSize:9,rulerFontFamily:"Monaco, Menlo, monospace",rulerUnits:"px",rulerSize:20,canvasBackgroundColor:"rgba(250, 250, 250, 1)",canvasBackgroundColorDark:"rgba(40, 40, 40, 1)",rulerBackgroundColor:"rgba(255, 255, 255, 0.95)",rulerBorderColor:"rgba(240, 240, 240, 1)",rulerTextColor:"rgba(102, 102, 102, 1)",rulerTickColor:"rgba(204, 204, 204, 1)",gridColor:"rgba(232, 86, 193, 0.5)",rulerBackgroundColorDark:"rgba(30, 30, 30, 0.95)",rulerBorderColorDark:"rgba(68, 68, 68, 1)",rulerTextColorDark:"rgba(170, 170, 170, 1)",rulerTickColorDark:"rgba(104, 104, 104, 1)",gridColorDark:"rgba(232, 86, 193, 0.5)",themeMode:"light"};function p(t,r){try{const a=t.container,o=t.transform||{scale:1,translateX:0,translateY:0},i=a.getBoundingClientRect(),s=i.width||a.clientWidth||0,l=i.height||a.clientHeight||0,c=h({container:a},r.rulerSize,e=>Math.max(0,s-e)),u=h({container:a},r.rulerSize,e=>Math.max(0,l-e)),d=r.width||m.width,g=r.height||m.height,p=function(t,r,a,o,i){const s=e(0,0,n(i.scale,i.translateX,i.translateY)),l=e(t,r,n(i.scale,i.translateX,i.translateY));return{x:Math.max(0,Math.min(a,s.x)),y:Math.max(0,Math.min(o,s.y)),width:Math.max(0,Math.min(a-s.x,l.x-s.x)),height:Math.max(0,Math.min(o-s.y,l.y-s.y))}}(c,u,d,g,o);return{width:c,height:u,contentWidth:d,contentHeight:g,scale:o.scale,translateX:o.translateX,translateY:o.translateY,visibleArea:p,scaledContentWidth:d*o.scale,scaledContentHeight:g*o.scale,canPanLeft:o.translateX<0,canPanRight:o.translateX+d*o.scale>c,canPanUp:o.translateY<0,canPanDown:o.translateY+g*o.scale>u,canZoomIn:o.scale<3.5,canZoomOut:o.scale>.1}}catch(e){return console.error("Failed to calculate canvas bounds:",e),{width:0,height:0,contentWidth:0,contentHeight:0,scale:1,translateX:0,translateY:0,visibleArea:{x:0,y:0,width:0,height:0},scaledContentWidth:0,scaledContentHeight:0,canPanLeft:!1,canPanRight:!1,canPanUp:!1,canPanDown:!1,canZoomIn:!1,canZoomOut:!1}}}function f(e,t){try{if(t.enableTransition){window.__markupCanvasTransitionTimeout&&(clearTimeout(window.__markupCanvasTransitionTimeout),window.__markupCanvasTransitionTimeout=void 0);return function(e,t,n){const r=c.get(e);r&&clearTimeout(r);const a=window.setTimeout(()=>{n(),c.delete(e)},t);c.set(e,a)}("disableTransition",1e3*(t.transitionDuration??.2),()=>{e.style.transition="none",window.__markupCanvasTransitionTimeout=void 0}),!0}return!1}catch(e){return console.error("Failed to disable transitions:",e),!0}}function b(e,t,n){!function(e,t){try{return!!t.enableTransition&&(window.__markupCanvasTransitionTimeout&&(clearTimeout(window.__markupCanvasTransitionTimeout),window.__markupCanvasTransitionTimeout=void 0),e.style.transition=`transform ${t.transitionDuration}s linear`,!0)}catch(e){return console.error("Failed to enable transitions:",e),!1}}(e,t);try{return n()}finally{f(e,t)}}function y(e,t,n){const r=t.keyboardPanStep;return n({translateY:e.transform.translateY-r})}function v(e,t,n){const r=t.keyboardPanStep;return n({translateX:e.transform.translateX+r})}function k(e,t,n){const r=t.keyboardPanStep;return n({translateX:e.transform.translateX-r})}function w(e,t,n){const r=t.keyboardPanStep;return n({translateY:e.transform.translateY+r})}function x(e,t){if(!e?.style||!t)return!1;try{return e.style.transform=function(e){return`matrix3d(${e.m11}, ${e.m12}, ${e.m13}, ${e.m14}, ${e.m21}, ${e.m22}, ${e.m23}, ${e.m24}, ${e.m31}, ${e.m32}, ${e.m33}, ${e.m34}, ${e.m41}, ${e.m42}, ${e.m43}, ${e.m44})`}(t),!0}catch(e){return console.warn("Transform application failed:",e),!1}}function T(e,t){e.transform={...e.transform,...t};const r=n(e.transform.scale,e.transform.translateX,e.transform.translateY);return x(e.transformLayer,r)}function C(e={}){const t={...m,...e};return("number"!=typeof t.width||t.width<=0)&&(console.warn("Invalid width, using default"),t.width=m.width),("number"!=typeof t.height||t.height<=0)&&(console.warn("Invalid height, using default"),t.height=m.height),("number"!=typeof t.zoomSpeed||t.zoomSpeed<=0)&&(console.warn("Invalid zoomSpeed, using default"),t.zoomSpeed=m.zoomSpeed),("number"!=typeof t.minZoom||t.minZoom<=0)&&(console.warn("Invalid minZoom, using default"),t.minZoom=m.minZoom),("number"!=typeof t.maxZoom||t.maxZoom<=t.minZoom)&&(console.warn("Invalid maxZoom, using default"),t.maxZoom=m.maxZoom),("number"!=typeof t.keyboardPanStep||t.keyboardPanStep<=0)&&(console.warn("Invalid keyboardPanStep, using default"),t.keyboardPanStep=m.keyboardPanStep),("number"!=typeof t.keyboardFastMultiplier||t.keyboardFastMultiplier<=0)&&(console.warn("Invalid keyboardFastMultiplier, using default"),t.keyboardFastMultiplier=m.keyboardFastMultiplier),("number"!=typeof t.clickZoomLevel||t.clickZoomLevel<=0)&&(console.warn("Invalid clickZoomLevel, using default"),t.clickZoomLevel=m.clickZoomLevel),("number"!=typeof t.rulerFontSize||t.rulerFontSize<=0)&&(console.warn("Invalid rulerFontSize, using default"),t.rulerFontSize=m.rulerFontSize),("number"!=typeof t.rulerSize||t.rulerSize<=0)&&(console.warn("Invalid rulerSize, using default"),t.rulerSize=m.rulerSize),t}function M(e){try{const t=e.getBounds();return{x:t.width/2,y:t.height/2}}catch(e){return console.warn("Failed to calculate viewport center:",e),{x:0,y:0}}}function S(e,t){const n=Array.from(e.children);let r=e.querySelector(`.${a}`);r||(r=document.createElement("div"),r.className=a,e.appendChild(r)),function(e,t){e.style.position="absolute";const n=t.rulerSize;e.style.top=`${n}px`,e.style.left=`${n}px`,e.style.width=`${t.width}px`,e.style.height=`${t.height}px`,e.style.transformOrigin="0 0"}(r,t);let i=r.querySelector(`.${o}`);return i||(i=document.createElement("div"),i.className=o,r.appendChild(i),function(e,t,n){e.forEach(e=>{e===n||e.classList.contains(a)||t.appendChild(e)})}(n,i,r)),function(e){e.style.position="relative",e.style.width="100%",e.style.height="100%",e.style.pointerEvents="auto"}(i),{transformLayer:r,contentLayer:i}}function D(e,t){if("static"===getComputedStyle(e).position&&(e.style.position="relative"),e.style.overflow="hidden",e.style.cursor="grab",e.style.overscrollBehavior="none",t){const n=`light-dark(${t.canvasBackgroundColor}, ${t.canvasBackgroundColorDark})`;e.style.backgroundColor=n}e.hasAttribute("tabindex")||e.setAttribute("tabindex","0"),function(e){const t=e.getBoundingClientRect(),n=getComputedStyle(e);0===t.height&&"auto"===n.height&&console.error("MarkupCanvas: Container height is 0. Please set a height on your container element using CSS.","Examples: height: 100vh, height: 500px, or use flexbox/grid layout.",e),0===t.width&&"auto"===n.width&&console.error("MarkupCanvas: Container width is 0. Please set a width on your container element using CSS.","Examples: width: 100vw, width: 800px, or use flexbox/grid layout.",e)}(e),e.classList.contains(r)||e.classList.add(r)}function E(e,t){if(!e?.appendChild)return console.error("Invalid container element provided to createCanvas"),null;try{D(e,t);const{transformLayer:r,contentLayer:a}=S(e,t);u(t,"enableAcceleration",()=>{!function(e){try{return e.style.transform=e.style.transform||"translateZ(0)",e.style.backfaceVisibility="hidden",!0}catch(e){return console.error("Failed to enable hardware acceleration:",e),!1}}(r)});const o=t.enableRulers?-t.rulerSize:0,i={scale:t.initialZoom??1,translateX:(t.initialPan?.x??0)+o,translateY:(t.initialPan?.y??0)+o},s=n(i.scale,i.translateX,i.translateY);x(r,s);return{container:e,transformLayer:r,contentLayer:a,transform:i}}catch(e){return console.error("Failed to create canvas:",e),null}}class z{constructor(){this.listeners=new Map}setEmitInterceptor(e){this.emitInterceptor=e}on(e,t){this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t)}off(e,t){const n=this.listeners.get(e);n&&n.delete(t)}emit(e,t){this.emitInterceptor?.(e,t);const n=this.listeners.get(e);n&&n.forEach(n=>{try{n(t)}catch(t){console.error(`Error in event handler for "${String(e)}":`,t)}})}removeAllListeners(){this.listeners.clear()}}function L(e,t){const n=t.transform;e.emit("transform",n),e.emit("zoom",n.scale),e.emit("pan",{x:n.translateX,y:n.translateY})}const R=300,P=5;function $(e,t){if(!e?.getBounds)return t;try{const n=e.getBounds(),r=n.width*n.height;return t*(r/2073600)**1}catch(e){return console.warn("Failed to calculate adaptive zoom speed, using base speed:",e),t}}function Y(e,t,n){const r=n?.textEditModeEnabled??!1;function a(n){if(!(n instanceof KeyboardEvent))return;if("canvas"===t.bindKeyboardEventsTo&&document.activeElement!==e.container)return;if(u(t,"sendKeyboardEventsToParent",()=>{r&&!function(e){return!("0"!==e.key||!e.ctrlKey&&!e.metaKey)||!("+"!==e.key||!e.ctrlKey&&!e.metaKey)||!("-"!==e.key||!e.ctrlKey&&!e.metaKey)}(n)||(!function(e,t){if("undefined"==typeof window||!window.parent)return;const n=t.name||"markupCanvas";window.parent.postMessage({source:"markup-canvas",action:"keyboardShortcut",data:{key:e.key,ctrlKey:e.ctrlKey,metaKey:e.metaKey,shiftKey:e.shiftKey,altKey:e.altKey,code:e.code},timestamp:Date.now(),canvasName:n},"*")}(n,t),n.preventDefault())}),t.sendKeyboardEventsToParent)return;let a=!1;const o={};switch(n.key){case"ArrowLeft":if(r)return;o.translateX=e.transform.translateX+t.keyboardPanStep,a=!0;break;case"ArrowRight":if(r)return;o.translateX=e.transform.translateX-t.keyboardPanStep,a=!0;break;case"ArrowUp":if(r)return;o.translateY=e.transform.translateY+t.keyboardPanStep,a=!0;break;case"ArrowDown":if(r)return;o.translateY=e.transform.translateY-t.keyboardPanStep,a=!0;break;case"=":case"+":if(r)return;{const n=t.enableAdaptiveSpeed?$(e,t.keyboardZoomStep):t.keyboardZoomStep;e.zoomIn(n),a=!0}break;case"-":if(r)return;{const n=t.enableAdaptiveSpeed?$(e,t.keyboardZoomStep):t.keyboardZoomStep;e.zoomOut(n),a=!0}break;case"0":n.ctrlKey?(e.resetView&&e.resetView(),a=!0):n.metaKey&&(e.resetViewToCenter&&e.resetViewToCenter(),a=!0);break;case"g":case"G":!n.shiftKey||n.ctrlKey||n.metaKey||n.altKey||!e.toggleGrid||(e.toggleGrid(),a=!0);break;case"r":case"R":!n.shiftKey||n.metaKey||n.ctrlKey||n.altKey||!e.toggleRulers||(e.toggleRulers(),a=!0)}a&&(n.preventDefault(),Object.keys(o).length>0&&e.updateTransform(o))}const o="canvas"===t.bindKeyboardEventsTo?e.container:document;return o.addEventListener("keydown",a),()=>{o.removeEventListener("keydown",a)}}function X(e,t,n,r,a){n?t.requireSpaceForMouseDrag?e.container.style.cursor=r?"grab":"default":e.container.style.cursor=a?"grabbing":"grab":e.container.style.cursor="default"}function I(e,t,n,r,a){a.setIsDragging(!1),a.setDragButton(-1),X(e,t,n,r,!1)}function B(e,t,n,r,a,o,i,s,l,c){o&&e.button===i&&I(t,n,r,a,{setIsDragging:c.setIsDragging,setDragButton:c.setDragButton}),r&&0===e.button&&n.enableClickToZoom&&s>0&&function(e,t,n,r,a,o){const i=Date.now()-r,s=e.altKey,l=!n.requireOptionForClickZoom||s;if(i<R&&!a&&!o&&l){e.preventDefault();const r=t.container.getBoundingClientRect(),a=e.clientX-r.left,o=e.clientY-r.top,{clickX:i,clickY:s}=g(t,a,o,n.rulerSize,(e,t)=>({clickX:e,clickY:t})),l=t.canvasToContent(i,s),c=r.width/2,u=r.height/2,d=n.clickZoomLevel,h={scale:d,translateX:c-l.x*d,translateY:u-l.y*d};b(t.transformLayer,t.config,()=>{t.updateTransform(h)})}}(e,t,n,s,l,o),0===e.button&&function(e){e.setMouseDownTime(0),e.setHasDragged(!1)}({setMouseDownTime:c.setMouseDownTime,setHasDragged:c.setHasDragged})}function Z(e,t,n=!0){let r=!0,a=!1,o=0,i=0,s=-1,l=!1,c=0,u=0,h=0,g=!1;const m={setIsDragging:e=>{a=e},setDragButton:e=>{s=e},setIsSpacePressed:e=>{l=e},setMouseDownTime:e=>{c=e},setMouseDownX:e=>{u=e},setMouseDownY:e=>{h=e},setHasDragged:e=>{g=e},setLastMouseX:e=>{o=e},setLastMouseY:e=>{i=e}},p=n=>{!function(e,t,n,r,a,o){n.requireSpaceForMouseDrag&&" "===e.key&&(o.setIsSpacePressed(!0),X(t,n,r,!0,a))}(n,e,t,r,a,{setIsSpacePressed:m.setIsSpacePressed})},f=n=>{!function(e,t,n,r,a,o){n.requireSpaceForMouseDrag&&" "===e.key&&(o.setIsSpacePressed(!1),X(t,n,r,!1,a),a&&I(t,n,r,!1,{setIsDragging:o.setIsDragging,setDragButton:o.setDragButton}))}(n,e,t,r,a,{setIsSpacePressed:m.setIsSpacePressed,setIsDragging:m.setIsDragging,setDragButton:m.setDragButton})},b=n=>{!function(e,t,n,r,a,o){const i=0===e.button,s=1===e.button;if(i&&(o.setMouseDownTime(Date.now()),o.setMouseDownX(e.clientX),o.setMouseDownY(e.clientY),o.setHasDragged(!1)),!r)return;(!n.requireSpaceForMouseDrag||a)&&(i&&n.enableLeftDrag||s&&n.enableMiddleDrag)&&(e.preventDefault(),o.setDragButton(e.button),o.setLastMouseX(e.clientX),o.setLastMouseY(e.clientY),X(t,n,r,a,!1))}(n,e,t,r,l,m)},y=n=>{!function(e,t,n,r,a,o,i,s,l,c,u,h){if(i>0){const t=Math.abs(e.clientX-s),i=Math.abs(e.clientY-l);if(t>P||i>P){h.setHasDragged(!0);const e=!n.requireSpaceForMouseDrag||o;!a&&r&&e&&h.setIsDragging(!0)}}if(!a||!r)return;e.preventDefault(),d((...e)=>{const n=e[0];if(!a||!r)return;const o=n.clientX-c,i=n.clientY-u,s={translateX:t.transform.translateX+o,translateY:t.transform.translateY+i};t.updateTransform(s),h.setLastMouseX(n.clientX),h.setLastMouseY(n.clientY)})(e)}(n,e,t,r,a,l,c,u,h,o,i,{setHasDragged:m.setHasDragged,setIsDragging:m.setIsDragging,setLastMouseX:m.setLastMouseX,setLastMouseY:m.setLastMouseY})},v=n=>{B(n,e,t,r,l,a,s,c,g,{setIsDragging:m.setIsDragging,setDragButton:m.setDragButton,setMouseDownTime:m.setMouseDownTime,setHasDragged:m.setHasDragged})},k=()=>{!function(e,t,n,r,a,o){a&&I(e,t,n,r,o)}(e,t,r,l,a,{setIsDragging:m.setIsDragging,setDragButton:m.setDragButton})};e.container.addEventListener("mousedown",b),document.addEventListener("mousemove",y),document.addEventListener("mouseup",v),e.container.addEventListener("mouseleave",k),t.requireSpaceForMouseDrag&&(document.addEventListener("keydown",p),document.addEventListener("keyup",f)),X(e,t,r,l,a);const w=()=>{e.container.removeEventListener("mousedown",b),document.removeEventListener("mousemove",y),document.removeEventListener("mouseup",v),e.container.removeEventListener("mouseleave",k),t.requireSpaceForMouseDrag&&(document.removeEventListener("keydown",p),document.removeEventListener("keyup",f))};return n?{cleanup:w,enable:()=>(r=!0,X(e,t,r,l,a),!0),disable:()=>(r=!1,a&&I(e,t,r,l,{setIsDragging:m.setIsDragging,setDragButton:m.setDragButton}),X(e,t,r,l,a),!0),isEnabled:()=>r}:w}function F(e,t,n,r){try{switch(t){case"zoomIn":e.zoomIn(n);break;case"zoomOut":e.zoomOut(n);break;case"setZoom":{const t=n;if("number"!=typeof t||t<=0)throw new Error(`Invalid zoom level: ${t}. Must be a positive number.`);e.setZoom(t);break}case"resetZoom":e.resetZoom();break;case"panLeft":e.panLeft(n);break;case"panRight":e.panRight(n);break;case"panUp":e.panUp(n);break;case"panDown":e.panDown(n);break;case"fitToScreen":e.fitToScreen();break;case"centerContent":e.centerContent();break;case"panToPoint":{const t=n;e.panToPoint(t.x,t.y);break}case"resetView":e.resetView();break;case"resetViewToCenter":e.resetViewToCenter();break;case"resetToInitial":e.resetToInitial();break;case"toggleRulers":e.toggleRulers();break;case"showRulers":e.showRulers();break;case"hideRulers":e.hideRulers();break;case"toggleGrid":e.toggleGrid();break;case"showGrid":e.showGrid();break;case"hideGrid":e.hideGrid();break;case"updateThemeMode":{const t=n;if("light"!==t&&"dark"!==t)throw new Error(`Invalid theme mode: ${t}`);e.updateThemeMode(t);break}case"toggleThemeMode":{const t="light"===e.getConfig().themeMode?"dark":"light";e.updateThemeMode(t);break}case"updateTransition":{const t=n;if("boolean"!=typeof t)throw new Error(`Invalid transition enabled value: ${t}. Must be a boolean.`);e.updateTransition(t);break}case"toggleTransitionMode":e.toggleTransitionMode();break;default:throw new Error(`Unknown action: ${t}`)}}catch(e){!function(e,t,n){window.postMessage({source:"markup-canvas-error",canvasName:e,action:t,error:n,timestamp:Date.now()},"*")}(r,t,e instanceof Error?e.message:String(e))}}function K(e,t){return{x:(e.clientX+t.clientX)/2,y:(e.clientY+t.clientY)/2}}function O(e,t){const n=e.clientX-t.clientX,r=e.clientY-t.clientY;return Math.sqrt(n*n+r*r)}function V(e,t,n,r){const a=i(n,r,e.transform,t,e.config);return e.updateTransform(a)}function A(e,t,n){e.preventDefault();const r=Array.from(e.touches);d((...e)=>{const r=e[0];if(1===r.length){if(1===n.touches.length){const e=r[0].clientX-n.touches[0].clientX,a=r[0].clientY-n.touches[0].clientY,o={translateX:t.transform.translateX+e,translateY:t.transform.translateY+a};t.updateTransform(o)}}else if(2===r.length){const e=O(r[0],r[1]),a=K(r[0],r[1]);if(n.lastDistance>0){const r=e/n.lastDistance,o=t.container.getBoundingClientRect();let i=a.x-o.left,s=a.y-o.top;const l=function(e,t,n,r){return h(e,t,e=>{const t={...n,x:n.x-e,y:n.y-e};return r(t)})}(t,t.config.rulerSize,{x:i,y:s},e=>e);i=l.x,s=l.y,V(t,r,i,s)}n.lastDistance=e,n.lastCenter=a}n.touches=r})(r)}function _(e){const t={touches:[],lastDistance:0,lastCenter:{}},n=e=>{!function(e,t){e.preventDefault(),t.touches=Array.from(e.touches),2===t.touches.length&&(t.lastDistance=O(t.touches[0],t.touches[1]),t.lastCenter=K(t.touches[0],t.touches[1]))}(e,t)},r=n=>{A(n,e,t)},a=e=>{!function(e,t){t.touches=Array.from(e.touches),t.touches.length<2&&(t.lastDistance=0)}(e,t)};return e.container.addEventListener("touchstart",n,{passive:!1}),e.container.addEventListener("touchmove",r,{passive:!1}),e.container.addEventListener("touchend",a,{passive:!1}),()=>{e.container.removeEventListener("touchstart",n),e.container.removeEventListener("touchmove",r),e.container.removeEventListener("touchend",a)}}function G(e){const t=e.ctrlKey||e.metaKey,n=[0===e.deltaMode,Math.abs(e.deltaY)<50,e.deltaY%1!=0,Math.abs(e.deltaX)>0&&Math.abs(e.deltaY)>0].filter(Boolean).length>=2;return{isTrackpad:n,isMouseWheel:!n,isTrackpadScroll:n&&!t,isTrackpadPinch:n&&t,isZoomGesture:t}}function N(e,t){const n=(e=>d((...t)=>{const n=t[0];if(!n||!e?.updateTransform)return!1;try{const t=e.transform,r=1,a=n.deltaX*r,o=n.deltaY*r,i={scale:t.scale,translateX:t.translateX-a,translateY:t.translateY-o};return f(e.transformLayer,e.config),e.updateTransform(i)}catch(e){return console.error("Error handling trackpad pan:",e),!1}}))(e),r=r=>G(r).isTrackpadScroll?n(r):function(e,t,n){if(!e||"number"!=typeof e.deltaY)return console.warn("Invalid wheel event provided"),!1;if(!t?.updateTransform)return console.warn("Invalid canvas provided to handleWheelEvent"),!1;try{e.preventDefault();const r=t.container.getBoundingClientRect(),a=e.clientX-r.left,o=e.clientY-r.top,{mouseX:i,mouseY:s}=g(t,a,o,n.rulerSize,(e,t)=>({mouseX:e,mouseY:t})),l=n.zoomSpeed,c=G(e);if(!c.isZoomGesture)return!1;let u=n.enableAdaptiveSpeed?$(t,l):l;if(c.isTrackpadPinch){const e=.05*n.zoomSpeed;u=n.enableAdaptiveSpeed?$(t,e):e}return V(t,(e.deltaY<0?1:-1)>0?1+u:1/(1+u),i,s)}catch(e){return console.error("Error handling wheel event:",e),!1}}(r,e,t);return e.container.addEventListener("wheel",r,{passive:!1}),()=>{e.container.removeEventListener("wheel",r)}}const H=100,q=1e3,U=1001,W=4,j=4,J=100,Q=100,ee=20,te=200;function ne(e,t){const n=function(e){const t=document.createElement("div");return t.className="canvas-ruler horizontal-ruler",t.style.cssText=`\n\tposition: absolute;\n\ttop: 0;\n\tleft: ${e.rulerSize}px;\n\tright: 0;\n\theight: ${e.rulerSize}px;\n\tbackground: var(--ruler-background-color);\n\tborder-bottom: 1px solid var(--ruler-border-color);\n\tz-index: ${q};\n\tpointer-events: none;\n\tfont-family: ${e.rulerFontFamily};\n\tfont-size: ${e.rulerFontSize}px;\n\tcolor: var(--ruler-text-color);\n\toverflow: hidden;\n `,t}(t),r=function(e){const t=document.createElement("div");return t.className="canvas-ruler vertical-ruler",t.style.cssText=`\n\tposition: absolute;\n\ttop: ${e.rulerSize}px;\n\tleft: 0;\n\tbottom: 0;\n\twidth: ${e.rulerSize}px;\n\tbackground: var(--ruler-background-color);\n\tborder-right: 1px solid var(--ruler-border-color);\n\tz-index: ${q};\n\tpointer-events: none;\n\tfont-family: ${e.rulerFontFamily};\n\tfont-size: ${e.rulerFontSize}px;\n\tcolor: var(--ruler-text-color);\n\toverflow: hidden;\n `,t}(t),a=function(e){const t=document.createElement("div");return t.className="canvas-ruler corner-box",t.style.cssText=`\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\twidth: ${e.rulerSize}px;\n\t\theight: ${e.rulerSize}px;\n\t\tbackground: var(--ruler-background-color);\n\t\tborder-right: 1px solid var(--ruler-border-color);\n\t\tborder-bottom: 1px solid var(--ruler-border-color);\n\t\tz-index: ${U};\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tfont-family: ${e.rulerFontFamily};\n\t\tfont-size: ${e.rulerFontSize-2}px;\n\t\tcolor: var(--ruler-text-color);\n\t\tpointer-events: none;\n\t`,t.textContent=e.rulerUnits,t}(t),o=t.enableGrid?function(e){const t=document.createElement("div");return t.className="canvas-ruler grid-overlay",t.style.cssText=`\n\t\tposition: absolute;\n\t\ttop: ${e.rulerSize}px;\n\t\tleft: ${e.rulerSize}px;\n\t\tright: 0;\n\t\tbottom: 0;\n\t\tpointer-events: none;\n\t\tz-index: ${H};\n\t\tbackground-image: \n\t\t\tlinear-gradient(var(--grid-color) 1px, transparent 1px),\n\t\t\tlinear-gradient(90deg, var(--grid-color) 1px, transparent 1px);\n\t\tbackground-size: 100px 100px;\n\t\topacity: 0.5;\n\t`,t}(t):void 0;return e.appendChild(n),e.appendChild(r),e.appendChild(a),o&&e.appendChild(o),{horizontalRuler:n,verticalRuler:r,cornerBox:a,gridOverlay:o}}function re(e,t){const n=e/Math.max(5,Math.min(20,t/50)),r=10**Math.floor(Math.log10(n)),a=n/r;let o;return o=a<=1?1:a<=2?2:a<=5?5:10,o*r}function ae(e,t,n,r,a){const o=document.createElement("div");o.className="tick",o.style.cssText=`\n\t\tposition: absolute;\n\t\tleft: ${n}px;\n\t\tbottom: 0;\n\t\twidth: 1px;\n\t\theight: ${W}px;\n\t\tbackground: var(--ruler-tick-color);\n\t`,e.appendChild(o);if(t%J===0){const r=document.createElement("div");r.style.cssText=`\n\t\t\tposition: absolute;\n\t\t\tleft: ${n}px;\n\t\t\tbottom: ${W+2}px;\n\t\t\tfont-size: ${a.rulerFontSize}px;\n\t\t\tline-height: 1;\n\t\t\tcolor: var(--ruler-text-color);\n\t\t\twhite-space: nowrap;\n\t\t\tpointer-events: none;\n\t\t`,r.textContent=Math.round(t).toString(),e.appendChild(r)}}function oe(e,t,n,r,a){const o=document.createElement("div");o.className="tick",o.style.cssText=`\n\t\tposition: absolute;\n\t\ttop: ${n}px;\n\t\tright: 0;\n\t\twidth: ${j}px;\n\t\theight: 1px;\n\t\tbackground: var(--ruler-tick-color);\n\t`,e.appendChild(o);if(t%J===0){const r=document.createElement("div");r.style.cssText=`\n\t\t\tposition: absolute;\n\t\t\ttop: ${n-6}px;\n\t\t\tright: ${j+6}px;\n\t\t\tfont-size: ${a.rulerFontSize}px;\n\t\t\tline-height: 1;\n\t\t\tcolor: var(--ruler-text-color);\n\t\t\twhite-space: nowrap;\n\t\t\tpointer-events: none;\n\t\t\ttransform: rotate(-90deg);\n\t\t\ttransform-origin: right center;\n\t\t`,r.textContent=Math.round(t).toString(),e.appendChild(r)}}function ie(e,t,n,r,a){const o=e.getBounds(),i=o.scale||1,s=o.translateX||0,l=o.translateY||0,c=o.width-a.rulerSize,u=o.height-a.rulerSize,d=-s/i,h=-l/i,g=h+u/i;!function(e,t,n,r,a,o){const i=r,s=re(n-t,i),l=document.createDocumentFragment(),c=Math.floor(t/s)*s,u=Math.ceil(n/s)*s;for(let e=c;e<=u;e+=s){const n=(e-t)*a;n>=-50&&n<=i+50&&ae(l,e,n,0,o)}e.innerHTML="",e.appendChild(l)}(t,d,d+c/i,c,i,a),function(e,t,n,r,a,o){const i=r,s=re(n-t,i),l=document.createDocumentFragment(),c=Math.floor(t/s)*s,u=Math.ceil(n/s)*s;for(let e=c;e<=u;e+=s){const n=(e-t)*a;n>=-50&&n<=i+50&&oe(l,e,n,0,o)}e.innerHTML="",e.appendChild(l)}(n,h,g,u,i,a),r&&function(e,t,n,r){let a=Q*t;for(;a<ee;)a*=2;for(;a>te;)a/=2;e.style.backgroundSize=`${a}px ${a}px`,e.style.backgroundPosition=`${n%a}px ${r%a}px`}(r,i,s,l)}function se(e,t){const n=`light-dark(${t.rulerBackgroundColor}, ${t.rulerBackgroundColorDark})`,r=`light-dark(${t.rulerBorderColor}, ${t.rulerBorderColorDark})`,a=`light-dark(${t.rulerTextColor}, ${t.rulerTextColorDark})`,o=`light-dark(${t.rulerTickColor}, ${t.rulerTickColorDark})`,i=`light-dark(${t.gridColor}, ${t.gridColorDark})`;e.horizontalRuler&&(e.horizontalRuler.style.setProperty("--ruler-background-color",n),e.horizontalRuler.style.setProperty("--ruler-border-color",r),e.horizontalRuler.style.setProperty("--ruler-text-color",a),e.horizontalRuler.style.setProperty("--ruler-tick-color",o)),e.verticalRuler&&(e.verticalRuler.style.setProperty("--ruler-background-color",n),e.verticalRuler.style.setProperty("--ruler-border-color",r),e.verticalRuler.style.setProperty("--ruler-text-color",a),e.verticalRuler.style.setProperty("--ruler-tick-color",o)),e.cornerBox&&(e.cornerBox.style.setProperty("--ruler-background-color",n),e.cornerBox.style.setProperty("--ruler-border-color",r),e.cornerBox.style.setProperty("--ruler-text-color",a)),e.gridOverlay&&e.gridOverlay.style.setProperty("--grid-color",i)}function le(e,t){if(!e?.container)return console.error("Invalid canvas provided to createRulers"),null;let n,r=null,a=!1;const o=()=>{!a&&n.horizontalRuler&&n.verticalRuler&&ie(e,n.horizontalRuler,n.verticalRuler,n.gridOverlay,t)};try{return n=ne(e.container,t),r=function(e,t){const n=d(t),r=e.updateTransform;e.updateTransform=function(e){const t=r.call(this,e);return n(),t};const a=d(t);return window.addEventListener("resize",a),()=>{window.removeEventListener("resize",a),e.updateTransform=r,n.cleanup(),a.cleanup()}}(e,o),se(n,t),o(),t.showRulers||(n.horizontalRuler.style.display="none",n.verticalRuler.style.display="none",n.cornerBox.style.display="none"),!t.showGrid&&n.gridOverlay&&(n.gridOverlay.style.display="none"),{horizontalRuler:n.horizontalRuler,verticalRuler:n.verticalRuler,cornerBox:n.cornerBox,gridOverlay:n.gridOverlay,update:o,updateTheme:e=>{a||se(n,e)},show:()=>{n.horizontalRuler&&(n.horizontalRuler.style.display="block"),n.verticalRuler&&(n.verticalRuler.style.display="block"),n.cornerBox&&(n.cornerBox.style.display="flex")},hide:()=>{n.horizontalRuler&&(n.horizontalRuler.style.display="none"),n.verticalRuler&&(n.verticalRuler.style.display="none"),n.cornerBox&&(n.cornerBox.style.display="none"),n.gridOverlay&&(n.gridOverlay.style.display="none")},toggleGrid:()=>{if(n.gridOverlay){const e="none"!==n.gridOverlay.style.display;n.gridOverlay.style.display=e?"none":"block"}},destroy:()=>{a=!0,r&&r(),n.horizontalRuler?.parentNode&&n.horizontalRuler.parentNode.removeChild(n.horizontalRuler),n.verticalRuler?.parentNode&&n.verticalRuler.parentNode.removeChild(n.verticalRuler),n.cornerBox?.parentNode&&n.cornerBox.parentNode.removeChild(n.cornerBox),n.gridOverlay?.parentNode&&n.gridOverlay.parentNode.removeChild(n.gridOverlay)}}}catch(e){return console.error("Failed to create rulers:",e),null}}return class{constructor(e,t={}){if(this.cleanupCallbacks=[],this.rulers=null,this.dragSetup=null,this.keyboardCleanup=null,this.textEditModeEnabled=!1,this.event=new z,this._isReady=!1,!e)throw new Error("Container element is required");this.config=C(t);const n=E(e,this.config);if(!n)throw new Error("Failed to create canvas");if(this.canvas=n,u(this.config,"enableRulers",()=>{this.rulers=le(this,this.config),this.cleanupCallbacks.push(()=>{this.rulers&&this.rulers.destroy()})}),this.event.setEmitInterceptor((e,t)=>{!function(e,t,n){if("undefined"==typeof window)return;let r=t;"ready"===e&&(r={ready:!0});const a=n.name||"markupCanvas";window.postMessage({source:"markup-canvas",action:e,data:r,timestamp:Date.now(),canvasName:a},"*"),window.parent&&window.parent.postMessage({source:"markup-canvas",action:e,data:r,timestamp:Date.now(),canvasName:a},"*")}(e,t,this.config)}),function(e,t){if("undefined"==typeof window)return;const n=t.name||"markupCanvas",r=window,a={config:{get current(){return e.config},get:e.getConfig.bind(e),update:e.updateConfig.bind(e)},transform:{update:e.updateTransform.bind(e),reset:e.reset.bind(e),resetToInitial:e.resetToInitial.bind(e)},zoom:{get current(){return e.transform.scale||1},set:e.setZoom.bind(e),toPoint:e.zoomToPoint.bind(e),in:e.zoomIn.bind(e),out:e.zoomOut.bind(e),reset:e.resetZoom.bind(e),resetToCenter:e.resetViewToCenter.bind(e),fitToScreen:e.fitToScreen.bind(e)},pan:{left:e.panLeft.bind(e),right:e.panRight.bind(e),up:e.panUp.bind(e),down:e.panDown.bind(e),toPoint:e.panToPoint.bind(e),toCenter:e.centerContent.bind(e)},mouseDrag:{enable:e.enableMouseDrag.bind(e),disable:e.disableMouseDrag.bind(e),isEnabled:e.isMouseDragEnabled.bind(e)},keyboard:{enable:e.enableKeyboard.bind(e),disable:e.disableKeyboard.bind(e),isEnabled:e.isKeyboardEnabled.bind(e),enableTextEditMode:e.enableTextEditMode.bind(e),disableTextEditMode:e.disableTextEditMode.bind(e),isTextEditModeEnabled:e.isTextEditModeEnabled.bind(e)},grid:{toggle:e.toggleGrid.bind(e),show:e.showGrid.bind(e),hide:e.hideGrid.bind(e),isVisible:e.isGridVisible.bind(e)},rulers:{toggle:e.toggleRulers.bind(e),show:e.showRulers.bind(e),hide:e.hideRulers.bind(e),isVisible:e.areRulersVisible.bind(e)},canvas:{canvasToContent:e.canvasToContent.bind(e),getVisibleArea:e.getVisibleArea.bind(e),isPointVisible:e.isPointVisible.bind(e),getBounds:e.getBounds.bind(e)},theme:{get current(){return e.config.themeMode},update:e.updateThemeMode.bind(e),toggle:e.toggleThemeMode.bind(e)},transition:{get current(){return e.config.enableTransition},set:e.updateTransition.bind(e),toggle:e.toggleTransitionMode.bind(e)},event:e.event,lifecycle:{cleanup:e.cleanup.bind(e),destroy:e.destroy.bind(e)},state:{get isReady(){return e.isReady},get isTransforming(){return e.isTransforming},get visibleBounds(){return e.visibleBounds},get transform(){return e.transform}}};r[n]=a,r.__markupCanvasInstances||(r.__markupCanvasInstances=new Map),r.__markupCanvasInstances.set(n,a)}(this,this.config),this.config.enablePostMessageAPI){const e=function(e){const t=t=>{const n=t.data;if(!["markup-canvas","application"].includes(n.source))return;const r=e.config.name||"markupCanvas";if(n.canvasName!==r)return;const a=n.action,o=n.data;F(e,a,o,r)};return"undefined"!=typeof window&&window.addEventListener("message",t),()=>{"undefined"!=typeof window&&window.removeEventListener("message",t)}}(this);this.cleanupCallbacks.push(e)}this.setupEventHandlers(),this._isReady=!0,this.event.emit("ready",this)}setupEventHandlers(){try{u(this.config,"enableZoom",()=>{const e=N(this,this.config);this.cleanupCallbacks.push(e)}),(this.config.enablePan||this.config.enableClickToZoom)&&(this.dragSetup=Z(this,this.config,!0),this.cleanupCallbacks.push(this.dragSetup.cleanup)),u(this.config,"enableKeyboard",()=>{const e=Y(this,this.config,{textEditModeEnabled:this.textEditModeEnabled});this.keyboardCleanup=e,this.cleanupCallbacks.push(e)}),u(this.config,"enableTouch",()=>{const e=_(this);this.cleanupCallbacks.push(e)})}catch(e){throw console.error("Failed to set up event handlers:",e),this.cleanup(),e}}get container(){return this.canvas.container}get transformLayer(){return this.canvas.transformLayer}get contentLayer(){return this.canvas.contentLayer}get transform(){return this.canvas.transform}get isReady(){return this._isReady}get isTransforming(){return this.dragSetup?.isEnabled()||!1}get visibleBounds(){return s(this)}getBounds(){return p(this.canvas,this.config)}updateTransform(e){const t=T(this.canvas,e);return t&&L(this.event,this.canvas),t}reset(){const e=T(this.canvas,{scale:1,translateX:0,translateY:0});return e&&L(this.event,this.canvas),e}resetToInitial(){const e=(t=this.canvas,n=this.transformLayer,r=this.config,b(n,r,()=>h(t,r.rulerSize,e=>{const n=r.initialZoom??1,a=r.initialPan??{x:0,y:0},o=-1*e,i={scale:n,translateX:a.x+o,translateY:a.y+o};return T(t,i)})));var t,n,r;return e&&L(this.event,this.canvas),e}setZoom(e){return function(e,t,n,r,a){return b(t,n,()=>l(n,t=>{const n=t(a),o=M(e);return r(o.x,o.y,n)}))}(this,this.transformLayer,this.config,this.zoomToPoint.bind(this),e)}canvasToContent(t,r){return e(t,r,n(this.canvas.transform.scale,this.canvas.transform.translateX,this.canvas.transform.translateY))}zoomToPoint(e,t,n){const r=function(e,t,n,r,a,o){return b(t,n,()=>{const t=i(r,a,e.transform,o/e.transform.scale,n);return T(e,t)})}(this.canvas,this.transformLayer,this.config,e,t,n);return r&&L(this.event,this.canvas),r}resetView(){return e=this.canvas,t=this.transformLayer,n=this.config,b(t,n,()=>h(e,n.rulerSize,t=>T(e,{scale:1,translateX:-1*t,translateY:-1*t})));var e,t,n}resetViewToCenter(){return function(e,t,n,r){return b(t,n,()=>l(n,t=>{const n=t(1),a=M(e);return r(a.x,a.y,n)}))}(this,this.transformLayer,this.config,this.zoomToPoint.bind(this))}panLeft(e){return v(this.canvas,this.config,this.updateTransform.bind(this))||!!e&&v(this.canvas,{...this.config,keyboardPanStep:e},this.updateTransform.bind(this))}panRight(e){return k(this.canvas,this.config,this.updateTransform.bind(this))||!!e&&k(this.canvas,{...this.config,keyboardPanStep:e},this.updateTransform.bind(this))}panUp(e){return w(this.canvas,this.config,this.updateTransform.bind(this))||!!e&&w(this.canvas,{...this.config,keyboardPanStep:e},this.updateTransform.bind(this))}panDown(e){return y(this.canvas,this.config,this.updateTransform.bind(this))||!!e&&y(this.canvas,{...this.config,keyboardPanStep:e},this.updateTransform.bind(this))}zoomIn(e=.5){return function(e,t,n,r,a=.5){return b(t,n,()=>l(n,t=>{const n=t(e.transform.scale*(1+a)),o=M(e);return r(o.x,o.y,n)}))}(this,this.transformLayer,this.config,this.zoomToPoint.bind(this),e)}zoomOut(e=.5){return function(e,t,n,r,a=.5){return b(t,n,()=>l(n,t=>{const n=t(e.transform.scale*(1-a)),o=M(e);return r(o.x,o.y,n)}))}(this,this.transformLayer,this.config,this.zoomToPoint.bind(this),e)}resetZoom(){return this.resetViewToCenter()}enableMouseDrag(){return this.dragSetup?.enable()??!1}disableMouseDrag(){return this.dragSetup?.disable()??!1}isMouseDragEnabled(){return this.dragSetup?.isEnabled()??!1}enableKeyboard(){return this.keyboardCleanup||(this.keyboardCleanup=Y(this,this.config,{textEditModeEnabled:this.textEditModeEnabled}),this.cleanupCallbacks.push(this.keyboardCleanup)),!0}disableKeyboard(){return!!this.keyboardCleanup&&(this.keyboardCleanup(),this.keyboardCleanup=null,!0)}isKeyboardEnabled(){return null!==this.keyboardCleanup}enableTextEditMode(){if(this.textEditModeEnabled)return!0;if(this.textEditModeEnabled=!0,this.keyboardCleanup){const e=this.cleanupCallbacks.indexOf(this.keyboardCleanup);e>-1&&this.cleanupCallbacks.splice(e,1),this.keyboardCleanup(),this.keyboardCleanup=Y(this,this.config,{textEditModeEnabled:!0}),this.cleanupCallbacks.push(this.keyboardCleanup)}return!0}disableTextEditMode(){if(!this.textEditModeEnabled)return!0;if(this.textEditModeEnabled=!1,this.keyboardCleanup){const e=this.cleanupCallbacks.indexOf(this.keyboardCleanup);e>-1&&this.cleanupCallbacks.splice(e,1),this.keyboardCleanup(),this.keyboardCleanup=Y(this,this.config,{textEditModeEnabled:!1}),this.cleanupCallbacks.push(this.keyboardCleanup)}return!0}isTextEditModeEnabled(){return this.textEditModeEnabled}toggleGrid(){const e=(t=this.rulers,!!t?.toggleGrid&&(t.toggleGrid(),!0));var t;return e&&this.event.emit("gridVisibility",this.isGridVisible()),e}showGrid(){const e=(t=this.rulers,!!t?.gridOverlay&&(t.gridOverlay.style.display="block",!0));var t;return e&&this.event.emit("gridVisibility",!0),e}hideGrid(){const e=(t=this.rulers,!!t?.gridOverlay&&(t.gridOverlay.style.display="none",!0));var t;return e&&this.event.emit("gridVisibility",!1),e}isGridVisible(){return e=this.rulers,!!e?.gridOverlay&&"none"!==e.gridOverlay.style.display;var e}toggleRulers(){const e=function(e,t){if(e)return t()?e.hide():e.show(),!0;return!1}(this.rulers,()=>this.areRulersVisible());return e&&this.event.emit("rulersVisibility",this.areRulersVisible()),e}showRulers(){const e=!!(t=this.rulers)&&(t.show(),!0);var t;return e&&this.event.emit("rulersVisibility",!0),e}hideRulers(){const e=!!(t=this.rulers)&&(t.hide(),!0);var t;return e&&this.event.emit("rulersVisibility",!1),e}areRulersVisible(){return e=this.rulers,!!e?.horizontalRuler&&"none"!==e.horizontalRuler.style.display;var e}centerContent(){return e=this.canvas,t=this.config,n=this.updateTransform.bind(this),b(this.transformLayer,t,()=>{const r=p(e,t),a=(r.width-r.contentWidth*e.transform.scale)/2,o=(r.height-r.contentHeight*e.transform.scale)/2;return n({translateX:a,translateY:o})});var e,t,n}fitToScreen(){return e=this.canvas,t=this.transformLayer,n=this.config,b(t,n,()=>{const t=p(e,n),r=t.width/n.width,a=t.height/n.height,o=l(n,e=>e(.9*Math.min(r,a))),i=n.width*o,s=n.height*o,c=(t.width-i)/2,u=(t.height-s)/2;return T(e,{scale:o,translateX:c,translateY:u})});var e,t,n}getVisibleArea(){return s(this)}isPointVisible(e,t){return function(e,t,n){const r=s(e);return t>=r.x&&t<=r.x+r.width&&n>=r.y&&n<=r.y+r.height}(this,e,t)}panToPoint(e,t){return function(e,t,n,r,a,o){return b(o,t,()=>{const o=p(e,t),i=o.width/2,s=o.height/2,l=i-n*e.transform.scale,c=s-r*e.transform.scale;return a({translateX:l,translateY:c})})}(this.canvas,this.config,e,t,this.updateTransform.bind(this),this.transformLayer)}getConfig(){return{...this.config}}updateConfig(e){this.config=C({...this.config,...e})}updateThemeMode(e){this.config=C({...this.config,themeMode:e}),function(e,t,n){const r=C({...e,themeMode:n});t&&t.updateTheme(r)}(this.config,this.rulers,e)}toggleThemeMode(){const e="light"===this.config.themeMode?"dark":"light";return this.updateThemeMode(e),e}updateTransition(e){this.config=C({...this.config,enableTransition:e})}toggleTransitionMode(){const e=function(e){return!e}(this.config.enableTransition);return this.updateTransition(e),e}cleanup(){!function(e){if("undefined"==typeof window)return;const t=e.name||"markupCanvas",n=window;delete n[t],n.__markupCanvasInstances&&n.__markupCanvasInstances.delete(t)}(this.config),this.cleanupCallbacks.forEach(e=>{try{e()}catch(e){console.warn("Error during cleanup:",e)}}),this.cleanupCallbacks=[],this.removeAllListeners()}on(e,t){this.event.on(e,t)}off(e,t){this.event.off(e,t)}emit(e,t){this.event.emit(e,t)}removeAllListeners(){this.event.removeAllListeners()}destroy(){this.cleanup(),window.__markupCanvasTransitionTimeout&&clearTimeout(window.__markupCanvasTransitionTimeout)}}});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@markup-canvas/core",
3
- "version": "1.4.3",
3
+ "version": "1.4.4",
4
4
  "description": "High-performance canvas-like container with pan and zoom capabilities",
5
5
  "type": "module",
6
6
  "main": "dist/markup-canvas.cjs.js",
@@ -59,9 +59,6 @@ export class MarkupCanvas {
59
59
  });
60
60
  });
61
61
 
62
- // Always set initial color-scheme
63
- updateThemeMode(this.canvas.container, this.config, this.rulers, this.config.themeMode);
64
-
65
62
  // Always bind canvas to window
66
63
  this.event.setEmitInterceptor((event, data) => {
67
64
  broadcastEvent(event as string, data, this.config);
@@ -420,7 +417,7 @@ export class MarkupCanvas {
420
417
  // Theme management
421
418
  updateThemeMode(mode: "light" | "dark"): void {
422
419
  this.config = createMarkupCanvasConfig({ ...this.config, themeMode: mode });
423
- updateThemeMode(this.canvas.container, this.config, this.rulers, mode);
420
+ updateThemeMode(this.config, this.rulers, mode);
424
421
  }
425
422
 
426
423
  toggleThemeMode(): "light" | "dark" {
@@ -2,7 +2,6 @@ import { createMarkupCanvasConfig } from "@/lib/config/createMarkupCanvasConfig.
2
2
  import type { MarkupCanvasConfig, RulerSystem } from "@/types/index.js";
3
3
 
4
4
  export function updateThemeMode(
5
- canvasContainer: HTMLElement,
6
5
  config: Required<MarkupCanvasConfig>,
7
6
  rulers: RulerSystem | null,
8
7
  mode: "light" | "dark"
@@ -13,9 +12,6 @@ export function updateThemeMode(
13
12
  };
14
13
  const updatedConfig = createMarkupCanvasConfig(newConfig);
15
14
 
16
- // Update color-scheme CSS property
17
- canvasContainer.style.colorScheme = mode;
18
-
19
15
  // Update rulers if they exist
20
16
  if (rulers) {
21
17
  rulers.updateTheme(updatedConfig);
@@ -15,8 +15,6 @@ export function setupCanvasContainer(container: HTMLElement, config?: Required<M
15
15
  if (config) {
16
16
  const backgroundColor = `light-dark(${config.canvasBackgroundColor}, ${config.canvasBackgroundColorDark})`;
17
17
  container.style.backgroundColor = backgroundColor;
18
- // Set color-scheme to enable light-dark() function
19
- container.style.colorScheme = config.themeMode;
20
18
  }
21
19
 
22
20
  if (!container.hasAttribute("tabindex")) {
@@ -21,7 +21,6 @@ export function updateRulerTheme(elements: RulerThemeUpdater, config: Required<M
21
21
  elements.horizontalRuler.style.setProperty("--ruler-border-color", borderColor);
22
22
  elements.horizontalRuler.style.setProperty("--ruler-text-color", textColor);
23
23
  elements.horizontalRuler.style.setProperty("--ruler-tick-color", tickColor);
24
- elements.horizontalRuler.style.colorScheme = config.themeMode;
25
24
  }
26
25
 
27
26
  // Update vertical ruler with CSS variables
@@ -30,7 +29,6 @@ export function updateRulerTheme(elements: RulerThemeUpdater, config: Required<M
30
29
  elements.verticalRuler.style.setProperty("--ruler-border-color", borderColor);
31
30
  elements.verticalRuler.style.setProperty("--ruler-text-color", textColor);
32
31
  elements.verticalRuler.style.setProperty("--ruler-tick-color", tickColor);
33
- elements.verticalRuler.style.colorScheme = config.themeMode;
34
32
  }
35
33
 
36
34
  // Update corner box with CSS variables
@@ -38,12 +36,10 @@ export function updateRulerTheme(elements: RulerThemeUpdater, config: Required<M
38
36
  elements.cornerBox.style.setProperty("--ruler-background-color", backgroundColor);
39
37
  elements.cornerBox.style.setProperty("--ruler-border-color", borderColor);
40
38
  elements.cornerBox.style.setProperty("--ruler-text-color", textColor);
41
- elements.cornerBox.style.colorScheme = config.themeMode;
42
39
  }
43
40
 
44
41
  // Update grid overlay with CSS variables
45
42
  if (elements.gridOverlay) {
46
43
  elements.gridOverlay.style.setProperty("--grid-color", gridColor);
47
- elements.gridOverlay.style.colorScheme = config.themeMode;
48
44
  }
49
45
  }