{"version":3,"file":"util.mjs","names":[],"sources":["../../../../src/canvas/DOMManagers/util.ts"],"sourcesContent":["import { NONE } from '../../constants';\nimport type { TSize } from '../../typedefs';\nimport {\n  getDocumentFromElement,\n  getWindowFromElement,\n  getScrollLeftTop,\n} from '../../util/dom_misc';\n\nexport const setCanvasDimensions = (\n  el: HTMLCanvasElement,\n  ctx: CanvasRenderingContext2D,\n  { width, height }: TSize,\n  retinaScaling = 1,\n) => {\n  el.width = width;\n  el.height = height;\n  if (retinaScaling > 1) {\n    el.setAttribute('width', (width * retinaScaling).toString());\n    el.setAttribute('height', (height * retinaScaling).toString());\n    ctx.scale(retinaScaling, retinaScaling);\n  }\n};\n\nexport type CSSDimensions = {\n  width: number | string;\n  height: number | string;\n};\n\nexport const setCSSDimensions = (\n  el: HTMLElement,\n  { width, height }: Partial<CSSDimensions>,\n) => {\n  width && (el.style.width = typeof width === 'number' ? `${width}px` : width);\n  height &&\n    (el.style.height = typeof height === 'number' ? `${height}px` : height);\n};\n\n/**\n * Returns offset for a given element\n * @param {HTMLElement} element Element to get offset for\n * @return {Object} Object with \"left\" and \"top\" properties\n */\nexport function getElementOffset(element: HTMLElement) {\n  const doc = element && getDocumentFromElement(element),\n    offset = { left: 0, top: 0 };\n\n  if (!doc) {\n    return offset;\n  }\n  const elemStyle: CSSStyleDeclaration =\n    getWindowFromElement(element)?.getComputedStyle(element, null) ||\n    ({} as CSSStyleDeclaration);\n  offset.left += parseInt(elemStyle.borderLeftWidth, 10) || 0;\n  offset.top += parseInt(elemStyle.borderTopWidth, 10) || 0;\n  offset.left += parseInt(elemStyle.paddingLeft, 10) || 0;\n  offset.top += parseInt(elemStyle.paddingTop, 10) || 0;\n\n  let box = { left: 0, top: 0 };\n\n  const docElem = doc.documentElement;\n  if (typeof element.getBoundingClientRect !== 'undefined') {\n    box = element.getBoundingClientRect();\n  }\n\n  const scrollLeftTop = getScrollLeftTop(element);\n\n  return {\n    left:\n      box.left + scrollLeftTop.left - (docElem.clientLeft || 0) + offset.left,\n    top: box.top + scrollLeftTop.top - (docElem.clientTop || 0) + offset.top,\n  };\n}\n\n/**\n * Makes element unselectable\n * @param {HTMLElement} element Element to make unselectable\n * @return {HTMLElement} Element that was passed in\n */\nexport function makeElementUnselectable(element: HTMLElement) {\n  if (typeof element.onselectstart !== 'undefined') {\n    element.onselectstart = () => false;\n  }\n  element.style.userSelect = NONE;\n  return element;\n}\n"],"mappings":";;;AAQA,MAAa,uBACX,IACA,KACA,EAAE,OAAO,UACT,gBAAgB,MACb;AACH,IAAG,QAAQ;AACX,IAAG,SAAS;AACZ,KAAI,gBAAgB,GAAG;AACrB,KAAG,aAAa,UAAU,QAAQ,eAAe,UAAU,CAAC;AAC5D,KAAG,aAAa,WAAW,SAAS,eAAe,UAAU,CAAC;AAC9D,MAAI,MAAM,eAAe,cAAc;;;AAS3C,MAAa,oBACX,IACA,EAAE,OAAO,aACN;AACH,WAAU,GAAG,MAAM,QAAQ,OAAO,UAAU,WAAW,GAAG,MAAM,MAAM;AACtE,YACG,GAAG,MAAM,SAAS,OAAO,WAAW,WAAW,GAAG,OAAO,MAAM;;;;;;;AAQpE,SAAgB,iBAAiB,SAAsB;;CACrD,MAAM,MAAM,WAAW,uBAAuB,QAAQ,EACpD,SAAS;EAAE,MAAM;EAAG,KAAK;EAAG;AAE9B,KAAI,CAAC,IACH,QAAO;CAET,MAAM,cAAA,wBACJ,qBAAqB,QAAQ,MAAA,QAAA,0BAAA,KAAA,IAAA,KAAA,IAAA,sBAAE,iBAAiB,SAAS,KAAK,KAC7D,EAAE;AACL,QAAO,QAAQ,SAAS,UAAU,iBAAiB,GAAG,IAAI;AAC1D,QAAO,OAAO,SAAS,UAAU,gBAAgB,GAAG,IAAI;AACxD,QAAO,QAAQ,SAAS,UAAU,aAAa,GAAG,IAAI;AACtD,QAAO,OAAO,SAAS,UAAU,YAAY,GAAG,IAAI;CAEpD,IAAI,MAAM;EAAE,MAAM;EAAG,KAAK;EAAG;CAE7B,MAAM,UAAU,IAAI;AACpB,KAAI,OAAO,QAAQ,0BAA0B,YAC3C,OAAM,QAAQ,uBAAuB;CAGvC,MAAM,gBAAgB,iBAAiB,QAAQ;AAE/C,QAAO;EACL,MACE,IAAI,OAAO,cAAc,QAAQ,QAAQ,cAAc,KAAK,OAAO;EACrE,KAAK,IAAI,MAAM,cAAc,OAAO,QAAQ,aAAa,KAAK,OAAO;EACtE;;;;;;;AAQH,SAAgB,wBAAwB,SAAsB;AAC5D,KAAI,OAAO,QAAQ,kBAAkB,YACnC,SAAQ,sBAAsB;AAEhC,SAAQ,MAAM,aAAa;AAC3B,QAAO"}