fabric
Version:
Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.
1 lines • 5.82 kB
Source Map (JSON)
{"version":3,"file":"CanvasDOMManager.mjs","names":[],"sources":["../../../../src/canvas/DOMManagers/CanvasDOMManager.ts"],"sourcesContent":["import { getEnv, getFabricDocument } from '../../env';\nimport type { TSize } from '../../typedefs';\nimport { createCanvasElement } from '../../util/misc/dom';\nimport { setStyle } from '../../util/internals/dom_style';\nimport type { CSSDimensions } from './util';\nimport { makeElementUnselectable, setCSSDimensions } from './util';\nimport type { CanvasItem } from './StaticCanvasDOMManager';\nimport { StaticCanvasDOMManager } from './StaticCanvasDOMManager';\nimport { setCanvasDimensions } from './util';\nimport { NONE } from '../../constants';\n\nexport class CanvasDOMManager extends StaticCanvasDOMManager {\n upper: CanvasItem;\n container: HTMLDivElement;\n\n constructor(\n arg0?: string | HTMLCanvasElement,\n {\n allowTouchScrolling = false,\n containerClass = '',\n }: {\n allowTouchScrolling?: boolean;\n /**\n * @deprecated here only for backward compatibility\n */\n containerClass?: string;\n } = {},\n ) {\n super(arg0);\n const { el: lowerCanvasEl } = this.lower;\n const upperCanvasEl = this.createUpperCanvas();\n this.upper = { el: upperCanvasEl, ctx: upperCanvasEl.getContext('2d')! };\n this.applyCanvasStyle(lowerCanvasEl, {\n allowTouchScrolling,\n });\n this.applyCanvasStyle(upperCanvasEl, {\n allowTouchScrolling,\n styles: {\n position: 'absolute',\n left: '0',\n top: '0',\n },\n });\n const container = this.createContainerElement();\n container.classList.add(containerClass);\n if (lowerCanvasEl.parentNode) {\n lowerCanvasEl.parentNode.replaceChild(container, lowerCanvasEl);\n }\n container.append(lowerCanvasEl, upperCanvasEl);\n this.container = container;\n }\n\n protected createUpperCanvas() {\n const { el: lowerCanvasEl } = this.lower;\n const el = createCanvasElement();\n // we assign the same classname of the lowerCanvas\n el.className = lowerCanvasEl.className;\n // but then we remove the lower-canvas specific className\n el.classList.remove('lower-canvas');\n // we add the specific upper-canvas class\n el.classList.add('upper-canvas');\n el.setAttribute('data-fabric', 'top');\n el.style.cssText = lowerCanvasEl.style.cssText;\n el.setAttribute('draggable', 'true');\n return el;\n }\n\n protected createContainerElement() {\n const container = getFabricDocument().createElement('div');\n container.setAttribute('data-fabric', 'wrapper');\n setStyle(container, {\n position: 'relative',\n });\n makeElementUnselectable(container);\n return container;\n }\n\n /**\n * @private\n * @param {HTMLCanvasElement} element canvas element to apply styles on\n */\n protected applyCanvasStyle(\n element: HTMLCanvasElement,\n options: {\n allowTouchScrolling?: boolean;\n styles?: Record<string, string>;\n },\n ) {\n const { styles, allowTouchScrolling } = options;\n setStyle(element, {\n ...styles,\n 'touch-action': allowTouchScrolling ? 'manipulation' : NONE,\n });\n makeElementUnselectable(element);\n }\n\n setDimensions(size: TSize, retinaScaling: number) {\n super.setDimensions(size, retinaScaling);\n const { el, ctx } = this.upper;\n setCanvasDimensions(el, ctx, size, retinaScaling);\n }\n\n setCSSDimensions(size: Partial<CSSDimensions>): void {\n super.setCSSDimensions(size);\n setCSSDimensions(this.upper.el, size);\n setCSSDimensions(this.container, size);\n }\n\n cleanupDOM(size: TSize) {\n const container = this.container,\n { el: lowerCanvasEl } = this.lower,\n { el: upperCanvasEl } = this.upper;\n super.cleanupDOM(size);\n container.removeChild(upperCanvasEl);\n container.removeChild(lowerCanvasEl);\n if (container.parentNode) {\n container.parentNode.replaceChild(lowerCanvasEl, container);\n }\n }\n\n dispose() {\n super.dispose();\n getEnv().dispose(this.upper.el);\n // @ts-expect-error disposing\n delete this.upper;\n // @ts-expect-error disposing\n delete this.container;\n }\n}\n"],"mappings":";;;;;;;;AAWA,IAAa,mBAAb,cAAsC,uBAAuB;CAI3D,YACE,MACA,EACE,sBAAsB,OACtB,iBAAiB,OAOf,EAAE,EACN;AACA,QAAM,KAAK;wBAhBb,SAAA,KAAA,EAAkB;wBAClB,aAAA,KAAA,EAA0B;EAgBxB,MAAM,EAAE,IAAI,kBAAkB,KAAK;EACnC,MAAM,gBAAgB,KAAK,mBAAmB;AAC9C,OAAK,QAAQ;GAAE,IAAI;GAAe,KAAK,cAAc,WAAW,KAAK;GAAG;AACxE,OAAK,iBAAiB,eAAe,EACnC,qBACD,CAAC;AACF,OAAK,iBAAiB,eAAe;GACnC;GACA,QAAQ;IACN,UAAU;IACV,MAAM;IACN,KAAK;IACN;GACF,CAAC;EACF,MAAM,YAAY,KAAK,wBAAwB;AAC/C,YAAU,UAAU,IAAI,eAAe;AACvC,MAAI,cAAc,WAChB,eAAc,WAAW,aAAa,WAAW,cAAc;AAEjE,YAAU,OAAO,eAAe,cAAc;AAC9C,OAAK,YAAY;;CAGnB,oBAA8B;EAC5B,MAAM,EAAE,IAAI,kBAAkB,KAAK;EACnC,MAAM,KAAK,qBAAqB;AAEhC,KAAG,YAAY,cAAc;AAE7B,KAAG,UAAU,OAAO,eAAe;AAEnC,KAAG,UAAU,IAAI,eAAe;AAChC,KAAG,aAAa,eAAe,MAAM;AACrC,KAAG,MAAM,UAAU,cAAc,MAAM;AACvC,KAAG,aAAa,aAAa,OAAO;AACpC,SAAO;;CAGT,yBAAmC;EACjC,MAAM,YAAY,mBAAmB,CAAC,cAAc,MAAM;AAC1D,YAAU,aAAa,eAAe,UAAU;AAChD,WAAS,WAAW,EAClB,UAAU,YACX,CAAC;AACF,0BAAwB,UAAU;AAClC,SAAO;;;;;;CAOT,iBACE,SACA,SAIA;EACA,MAAM,EAAE,QAAQ,wBAAwB;AACxC,WAAS,SAAS;GAChB,GAAG;GACH,gBAAgB,sBAAsB,iBAAiB;GACxD,CAAC;AACF,0BAAwB,QAAQ;;CAGlC,cAAc,MAAa,eAAuB;AAChD,QAAM,cAAc,MAAM,cAAc;EACxC,MAAM,EAAE,IAAI,QAAQ,KAAK;AACzB,sBAAoB,IAAI,KAAK,MAAM,cAAc;;CAGnD,iBAAiB,MAAoC;AACnD,QAAM,iBAAiB,KAAK;AAC5B,mBAAiB,KAAK,MAAM,IAAI,KAAK;AACrC,mBAAiB,KAAK,WAAW,KAAK;;CAGxC,WAAW,MAAa;EACtB,MAAM,YAAY,KAAK,WACrB,EAAE,IAAI,kBAAkB,KAAK,OAC7B,EAAE,IAAI,kBAAkB,KAAK;AAC/B,QAAM,WAAW,KAAK;AACtB,YAAU,YAAY,cAAc;AACpC,YAAU,YAAY,cAAc;AACpC,MAAI,UAAU,WACZ,WAAU,WAAW,aAAa,eAAe,UAAU;;CAI/D,UAAU;AACR,QAAM,SAAS;AACf,UAAQ,CAAC,QAAQ,KAAK,MAAM,GAAG;AAE/B,SAAO,KAAK;AAEZ,SAAO,KAAK"}