@tabler/core 1.3.1 → 1.4.0

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.
Files changed (142) hide show
  1. package/README.md +42 -0
  2. package/dist/css/tabler-flags.css +1 -1
  3. package/dist/css/tabler-flags.min.css +1 -1
  4. package/dist/css/tabler-flags.rtl.css +1 -1
  5. package/dist/css/tabler-flags.rtl.min.css +1 -1
  6. package/dist/css/tabler-marketing.css +1 -1
  7. package/dist/css/tabler-marketing.min.css +1 -1
  8. package/dist/css/tabler-marketing.rtl.css +1 -1
  9. package/dist/css/tabler-marketing.rtl.min.css +1 -1
  10. package/dist/css/tabler-payments.css +1 -1
  11. package/dist/css/tabler-payments.min.css +1 -1
  12. package/dist/css/tabler-payments.rtl.css +1 -1
  13. package/dist/css/tabler-payments.rtl.min.css +1 -1
  14. package/dist/css/tabler-props.css +74 -74
  15. package/dist/css/tabler-props.css.map +1 -1
  16. package/dist/css/tabler-props.min.css +2 -2
  17. package/dist/css/tabler-props.min.css.map +1 -1
  18. package/dist/css/tabler-props.rtl.css +74 -74
  19. package/dist/css/tabler-props.rtl.css.map +1 -1
  20. package/dist/css/tabler-props.rtl.min.css +2 -2
  21. package/dist/css/tabler-props.rtl.min.css.map +1 -1
  22. package/dist/css/tabler-socials.css +1 -1
  23. package/dist/css/tabler-socials.min.css +1 -1
  24. package/dist/css/tabler-socials.rtl.css +1 -1
  25. package/dist/css/tabler-socials.rtl.min.css +1 -1
  26. package/dist/css/tabler-themes.css +1 -1
  27. package/dist/css/tabler-themes.min.css +1 -1
  28. package/dist/css/tabler-themes.rtl.css +1 -1
  29. package/dist/css/tabler-themes.rtl.min.css +1 -1
  30. package/dist/css/tabler-vendors.css +1 -1
  31. package/dist/css/tabler-vendors.min.css +1 -1
  32. package/dist/css/tabler-vendors.rtl.css +1 -1
  33. package/dist/css/tabler-vendors.rtl.min.css +1 -1
  34. package/dist/css/tabler.css +649 -428
  35. package/dist/css/tabler.css.map +1 -1
  36. package/dist/css/tabler.min.css +2 -2
  37. package/dist/css/tabler.min.css.map +1 -1
  38. package/dist/css/tabler.rtl.css +647 -428
  39. package/dist/css/tabler.rtl.css.map +1 -1
  40. package/dist/css/tabler.rtl.min.css +2 -2
  41. package/dist/css/tabler.rtl.min.css.map +1 -1
  42. package/dist/js/tabler-theme.esm.js +1 -1
  43. package/dist/js/tabler-theme.esm.js.map +1 -1
  44. package/dist/js/tabler-theme.esm.min.js +1 -1
  45. package/dist/js/tabler-theme.js +1 -1
  46. package/dist/js/tabler-theme.js.map +1 -1
  47. package/dist/js/tabler-theme.min.js +2 -2
  48. package/dist/js/tabler-theme.min.js.map +1 -1
  49. package/dist/js/tabler.esm.js +4 -4
  50. package/dist/js/tabler.esm.js.map +1 -1
  51. package/dist/js/tabler.esm.min.js +4 -4
  52. package/dist/js/tabler.esm.min.js.map +1 -1
  53. package/dist/js/tabler.js +4 -4
  54. package/dist/js/tabler.js.map +1 -1
  55. package/dist/js/tabler.min.js +4 -4
  56. package/dist/js/tabler.min.js.map +1 -1
  57. package/dist/libs/@melloware/coloris/dist/esm/coloris.js +9 -3
  58. package/dist/libs/@melloware/coloris/dist/esm/coloris.min.js +1 -1
  59. package/dist/libs/@melloware/coloris/dist/umd/coloris.js +9 -3
  60. package/dist/libs/@melloware/coloris/dist/umd/coloris.min.js +1 -1
  61. package/dist/libs/@melloware/coloris/package.json +1 -1
  62. package/dist/libs/countup.js/README.md +2 -2
  63. package/dist/libs/countup.js/dist/countUp.d.ts +3 -2
  64. package/dist/libs/countup.js/dist/countUp.js +11 -2
  65. package/dist/libs/countup.js/dist/countUp.min.js +1 -1
  66. package/dist/libs/countup.js/dist/countUp.umd.js +1 -1
  67. package/dist/libs/countup.js/package.json +1 -1
  68. package/dist/libs/countup.js/src/countUp.spec.ts +75 -25
  69. package/dist/libs/countup.js/src/countUp.ts +13 -3
  70. package/dist/libs/fslightbox/index.js +1 -1
  71. package/dist/libs/fslightbox/package.json +1 -1
  72. package/dist/libs/fullcalendar/index.global.js +49 -20
  73. package/dist/libs/fullcalendar/index.global.min.js +2 -2
  74. package/dist/libs/fullcalendar/package.json +7 -7
  75. package/dist/libs/jsvectormap/dist/jsvectormap.cjs +240 -224
  76. package/dist/libs/jsvectormap/dist/jsvectormap.css +83 -57
  77. package/dist/libs/jsvectormap/dist/jsvectormap.esm.js +240 -224
  78. package/dist/libs/jsvectormap/dist/jsvectormap.js +240 -224
  79. package/dist/libs/jsvectormap/dist/jsvectormap.min.css +1 -1
  80. package/dist/libs/jsvectormap/dist/jsvectormap.min.js +1 -1
  81. package/dist/libs/jsvectormap/package.json +1 -1
  82. package/dist/libs/jsvectormap/src/js/components/base.js +0 -5
  83. package/dist/libs/jsvectormap/src/js/components/concerns/interactable.js +2 -7
  84. package/dist/libs/jsvectormap/src/js/components/line.js +38 -10
  85. package/dist/libs/jsvectormap/src/js/components/marker.js +72 -33
  86. package/dist/libs/jsvectormap/src/js/components/region.js +0 -5
  87. package/dist/libs/jsvectormap/src/js/components/route.js +76 -0
  88. package/dist/libs/jsvectormap/src/js/components/tooltip.js +0 -5
  89. package/dist/libs/jsvectormap/src/js/core/createLines.js +25 -24
  90. package/dist/libs/jsvectormap/src/js/core/createMarkers.js +15 -20
  91. package/dist/libs/jsvectormap/src/js/core/createRoutes.js +16 -0
  92. package/dist/libs/jsvectormap/src/js/core/repositionLines.js +22 -18
  93. package/dist/libs/jsvectormap/src/js/core/setupContainerEvents.js +2 -2
  94. package/dist/libs/jsvectormap/src/js/core/setupContainerTouchEvents.js +2 -2
  95. package/dist/libs/jsvectormap/src/js/core/setupElementEvents.js +7 -3
  96. package/dist/libs/jsvectormap/src/js/core/setupZoomButtons.js +23 -6
  97. package/dist/libs/jsvectormap/src/js/defaults/options.js +1 -0
  98. package/dist/libs/jsvectormap/src/js/eventHandler.js +0 -5
  99. package/dist/libs/jsvectormap/src/js/index.js +0 -5
  100. package/dist/libs/jsvectormap/src/js/legend.js +1 -9
  101. package/dist/libs/jsvectormap/src/js/map.js +36 -13
  102. package/dist/libs/jsvectormap/src/js/scales/ordinalScale.js +0 -5
  103. package/dist/libs/jsvectormap/src/js/series.js +0 -5
  104. package/dist/libs/jsvectormap/src/js/svg/baseElement.js +0 -5
  105. package/dist/libs/jsvectormap/src/js/svg/canvasElement.js +2 -7
  106. package/dist/libs/jsvectormap/src/js/svg/imageElement.js +0 -5
  107. package/dist/libs/jsvectormap/src/js/svg/shapeElement.js +0 -5
  108. package/dist/libs/jsvectormap/src/js/svg/textElement.js +0 -5
  109. package/dist/libs/jsvectormap/src/scss/_variables.scss +37 -0
  110. package/dist/libs/jsvectormap/src/scss/jsvectormap.scss +104 -112
  111. package/dist/libs/signature_pad/dist/signature_pad.js +133 -87
  112. package/dist/libs/signature_pad/dist/signature_pad.js.map +1 -1
  113. package/dist/libs/signature_pad/dist/signature_pad.min.js +2 -2
  114. package/dist/libs/signature_pad/dist/signature_pad.min.js.map +1 -1
  115. package/dist/libs/signature_pad/dist/signature_pad.umd.js +133 -87
  116. package/dist/libs/signature_pad/dist/signature_pad.umd.js.map +1 -1
  117. package/dist/libs/signature_pad/dist/signature_pad.umd.min.js +2 -2
  118. package/dist/libs/signature_pad/dist/signature_pad.umd.min.js.map +1 -1
  119. package/dist/libs/signature_pad/dist/types/signature_pad.d.ts +4 -1
  120. package/dist/libs/signature_pad/docs/js/signature_pad.umd.min.js +2 -2
  121. package/dist/libs/signature_pad/docs/js/signature_pad.umd.min.js.map +1 -1
  122. package/dist/libs/signature_pad/package.json +19 -19
  123. package/dist/libs/signature_pad/src/signature_pad.ts +84 -28
  124. package/package.json +9 -9
  125. package/scss/_bootstrap-components.scss +0 -1
  126. package/scss/_core.scss +1 -0
  127. package/scss/_variables.scss +78 -48
  128. package/scss/layout/_animations.scss +52 -17
  129. package/scss/layout/_navbar.scss +8 -4
  130. package/scss/ui/_breadcrumbs.scss +31 -0
  131. package/scss/ui/_buttons.scss +92 -20
  132. package/scss/ui/_cards.scss +4 -2
  133. package/scss/ui/_dropdowns.scss +1 -1
  134. package/scss/ui/_grid.scss +2 -2
  135. package/scss/ui/_lists.scss +8 -8
  136. package/scss/ui/_nav.scss +1 -1
  137. package/scss/ui/_pagination.scss +4 -4
  138. package/scss/ui/_stars.scss +0 -4
  139. package/scss/ui/_switch-icon.scss +6 -2
  140. package/scss/ui/_tables.scss +1 -1
  141. package/scss/utils/_hover.scss +47 -0
  142. package/scss/vendor/_nouislider.scss +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"signature_pad.umd.min.js","sources":["../src/point.ts","../src/bezier.ts","../src/signature_event_target.ts","../src/signature_pad.ts","../src/throttle.ts"],"sourcesContent":["// Interface for point data structure used e.g. in SignaturePad#fromData method\nexport interface BasicPoint {\n x: number;\n y: number;\n pressure: number;\n time: number;\n}\n\nexport class Point implements BasicPoint {\n public x: number;\n public y: number;\n public pressure: number;\n public time: number;\n\n constructor(x: number, y: number, pressure?: number, time?: number) {\n if (isNaN(x) || isNaN(y)) {\n throw new Error(`Point is invalid: (${x}, ${y})`);\n }\n this.x = +x;\n this.y = +y;\n this.pressure = pressure || 0;\n this.time = time || Date.now();\n }\n\n public distanceTo(start: BasicPoint): number {\n return Math.sqrt(\n Math.pow(this.x - start.x, 2) + Math.pow(this.y - start.y, 2),\n );\n }\n\n public equals(other: BasicPoint): boolean {\n return (\n this.x === other.x &&\n this.y === other.y &&\n this.pressure === other.pressure &&\n this.time === other.time\n );\n }\n\n public velocityFrom(start: BasicPoint): number {\n return this.time !== start.time\n ? this.distanceTo(start) / (this.time - start.time)\n : 0;\n }\n}\n","import { BasicPoint, Point } from './point';\n\nexport class Bezier {\n public static fromPoints(\n points: Point[],\n widths: { start: number; end: number },\n ): Bezier {\n const c2 = this.calculateControlPoints(points[0], points[1], points[2]).c2;\n const c3 = this.calculateControlPoints(points[1], points[2], points[3]).c1;\n\n return new Bezier(points[1], c2, c3, points[2], widths.start, widths.end);\n }\n\n private static calculateControlPoints(\n s1: BasicPoint,\n s2: BasicPoint,\n s3: BasicPoint,\n ): {\n c1: BasicPoint;\n c2: BasicPoint;\n } {\n const dx1 = s1.x - s2.x;\n const dy1 = s1.y - s2.y;\n const dx2 = s2.x - s3.x;\n const dy2 = s2.y - s3.y;\n\n const m1 = { x: (s1.x + s2.x) / 2.0, y: (s1.y + s2.y) / 2.0 };\n const m2 = { x: (s2.x + s3.x) / 2.0, y: (s2.y + s3.y) / 2.0 };\n\n const l1 = Math.sqrt(dx1 * dx1 + dy1 * dy1);\n const l2 = Math.sqrt(dx2 * dx2 + dy2 * dy2);\n\n const dxm = m1.x - m2.x;\n const dym = m1.y - m2.y;\n\n const k = l1 + l2 == 0 ? 0 : l2 / (l1 + l2);\n const cm = { x: m2.x + dxm * k, y: m2.y + dym * k };\n\n const tx = s2.x - cm.x;\n const ty = s2.y - cm.y;\n\n return {\n c1: new Point(m1.x + tx, m1.y + ty),\n c2: new Point(m2.x + tx, m2.y + ty),\n };\n }\n\n constructor(\n public startPoint: Point,\n public control2: BasicPoint,\n public control1: BasicPoint,\n public endPoint: Point,\n public startWidth: number,\n public endWidth: number,\n ) {}\n\n // Returns approximated length. Code taken from https://www.lemoda.net/maths/bezier-length/index.html.\n public length(): number {\n const steps = 10;\n let length = 0;\n let px;\n let py;\n\n for (let i = 0; i <= steps; i += 1) {\n const t = i / steps;\n const cx = this.point(\n t,\n this.startPoint.x,\n this.control1.x,\n this.control2.x,\n this.endPoint.x,\n );\n const cy = this.point(\n t,\n this.startPoint.y,\n this.control1.y,\n this.control2.y,\n this.endPoint.y,\n );\n\n if (i > 0) {\n const xdiff = cx - (px as number);\n const ydiff = cy - (py as number);\n\n length += Math.sqrt(xdiff * xdiff + ydiff * ydiff);\n }\n\n px = cx;\n py = cy;\n }\n\n return length;\n }\n\n // Calculate parametric value of x or y given t and the four point coordinates of a cubic bezier curve.\n private point(\n t: number,\n start: number,\n c1: number,\n c2: number,\n end: number,\n ): number {\n // prettier-ignore\n return ( start * (1.0 - t) * (1.0 - t) * (1.0 - t))\n + (3.0 * c1 * (1.0 - t) * (1.0 - t) * t)\n + (3.0 * c2 * (1.0 - t) * t * t)\n + ( end * t * t * t);\n }\n}\n","export class SignatureEventTarget {\n /* tslint:disable: variable-name */\n private _et: EventTarget;\n /* tslint:enable: variable-name */\n\n constructor() {\n try {\n this._et = new EventTarget();\n } catch {\n // Using document as EventTarget to support iOS 13 and older.\n // Because EventTarget constructor just exists at iOS 14 and later.\n this._et = document;\n }\n }\n\n addEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject | null,\n options?: boolean | AddEventListenerOptions,\n ): void {\n this._et.addEventListener(type, listener, options);\n }\n\n dispatchEvent(event: Event): boolean {\n return this._et.dispatchEvent(event);\n }\n\n removeEventListener(\n type: string,\n callback: EventListenerOrEventListenerObject | null,\n options?: boolean | EventListenerOptions,\n ): void {\n this._et.removeEventListener(type, callback, options);\n }\n}\n","/**\n * The main idea and some parts of the code (e.g. drawing variable width Bézier curve) are taken from:\n * http://corner.squareup.com/2012/07/smoother-signatures.html\n *\n * Implementation of interpolation using cubic Bézier curves is taken from:\n * https://web.archive.org/web/20160323213433/http://www.benknowscode.com/2012/09/path-interpolation-using-cubic-bezier_9742.html\n *\n * Algorithm for approximated length of a Bézier curve is taken from:\n * http://www.lemoda.net/maths/bezier-length/index.html\n */\n\nimport { Bezier } from './bezier';\nimport { BasicPoint, Point } from './point';\nimport { SignatureEventTarget } from './signature_event_target';\nimport { throttle } from './throttle';\n\nexport { BasicPoint } from './point';\n\nexport interface SignatureEvent {\n event: MouseEvent | TouchEvent | PointerEvent;\n type: string;\n x: number;\n y: number;\n pressure: number;\n}\n\nexport interface FromDataOptions {\n clear?: boolean;\n}\n\nexport interface ToSVGOptions {\n includeBackgroundColor?: boolean;\n}\n\nexport interface PointGroupOptions {\n dotSize: number;\n minWidth: number;\n maxWidth: number;\n penColor: string;\n velocityFilterWeight: number;\n /**\n * This is the globalCompositeOperation for the line.\n * *default: 'source-over'*\n * @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation\n */\n compositeOperation: GlobalCompositeOperation;\n}\n\nexport interface Options extends Partial<PointGroupOptions> {\n minDistance?: number;\n backgroundColor?: string;\n throttle?: number;\n canvasContextOptions?: CanvasRenderingContext2DSettings;\n}\n\nexport interface PointGroup extends PointGroupOptions {\n points: BasicPoint[];\n}\n\nexport default class SignaturePad extends SignatureEventTarget {\n // Public stuff\n public dotSize: number;\n public minWidth: number;\n public maxWidth: number;\n public penColor: string;\n public minDistance: number;\n public velocityFilterWeight: number;\n public compositeOperation: GlobalCompositeOperation;\n public backgroundColor: string;\n public throttle: number;\n public canvasContextOptions: CanvasRenderingContext2DSettings;\n\n // Private stuff\n /* tslint:disable: variable-name */\n private _ctx: CanvasRenderingContext2D;\n private _drawingStroke = false;\n private _isEmpty = true;\n private _lastPoints: Point[] = []; // Stores up to 4 most recent points; used to generate a new curve\n private _data: PointGroup[] = []; // Stores all points in groups (one group per line or dot)\n private _lastVelocity = 0;\n private _lastWidth = 0;\n private _strokeMoveUpdate: (event: SignatureEvent) => void;\n /* tslint:enable: variable-name */\n\n constructor(\n private canvas: HTMLCanvasElement,\n options: Options = {},\n ) {\n super();\n this.velocityFilterWeight = options.velocityFilterWeight || 0.7;\n this.minWidth = options.minWidth || 0.5;\n this.maxWidth = options.maxWidth || 2.5;\n\n // We need to handle 0 value, so use `??` instead of `||`\n this.throttle = options.throttle ?? 16; // in milliseconds\n this.minDistance = options.minDistance ?? 5; // in pixels\n this.dotSize = options.dotSize || 0;\n this.penColor = options.penColor || 'black';\n this.backgroundColor = options.backgroundColor || 'rgba(0,0,0,0)';\n this.compositeOperation = options.compositeOperation || 'source-over';\n this.canvasContextOptions = options.canvasContextOptions ?? {};\n\n this._strokeMoveUpdate = this.throttle\n ? throttle(SignaturePad.prototype._strokeUpdate, this.throttle)\n : SignaturePad.prototype._strokeUpdate;\n this._ctx = canvas.getContext(\n '2d',\n this.canvasContextOptions,\n ) as CanvasRenderingContext2D;\n\n this.clear();\n\n // Enable mouse and touch event handlers\n this.on();\n }\n\n public clear(): void {\n const { _ctx: ctx, canvas } = this;\n\n // Clear canvas using background color\n ctx.fillStyle = this.backgroundColor;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n this._data = [];\n this._reset(this._getPointGroupOptions());\n this._isEmpty = true;\n }\n\n public fromDataURL(\n dataUrl: string,\n options: {\n ratio?: number;\n width?: number;\n height?: number;\n xOffset?: number;\n yOffset?: number;\n } = {},\n ): Promise<void> {\n return new Promise((resolve, reject) => {\n const image = new Image();\n const ratio = options.ratio || window.devicePixelRatio || 1;\n const width = options.width || this.canvas.width / ratio;\n const height = options.height || this.canvas.height / ratio;\n const xOffset = options.xOffset || 0;\n const yOffset = options.yOffset || 0;\n\n this._reset(this._getPointGroupOptions());\n\n image.onload = (): void => {\n this._ctx.drawImage(image, xOffset, yOffset, width, height);\n resolve();\n };\n image.onerror = (error): void => {\n reject(error);\n };\n image.crossOrigin = 'anonymous';\n image.src = dataUrl;\n\n this._isEmpty = false;\n });\n }\n\n public toDataURL(\n type: 'image/svg+xml',\n encoderOptions?: ToSVGOptions,\n ): string;\n public toDataURL(type?: string, encoderOptions?: number): string;\n public toDataURL(\n type = 'image/png',\n encoderOptions?: number | ToSVGOptions | undefined,\n ): string {\n switch (type) {\n case 'image/svg+xml':\n if (typeof encoderOptions !== 'object') {\n encoderOptions = undefined;\n }\n return `data:image/svg+xml;base64,${btoa(\n this.toSVG(encoderOptions as ToSVGOptions),\n )}`;\n default:\n if (typeof encoderOptions !== 'number') {\n encoderOptions = undefined;\n }\n return this.canvas.toDataURL(type, encoderOptions);\n }\n }\n\n public on(): void {\n // Disable panning/zooming when touching canvas element\n this.canvas.style.touchAction = 'none';\n (this.canvas.style as CSSStyleDeclaration & { msTouchAction: string | null }).msTouchAction = 'none';\n this.canvas.style.userSelect = 'none';\n\n const isIOS =\n /Macintosh/.test(navigator.userAgent) && 'ontouchstart' in document;\n\n // The \"Scribble\" feature of iOS intercepts point events. So that we can\n // lose some of them when tapping rapidly. Use touch events for iOS\n // platforms to prevent it. See\n // https://developer.apple.com/forums/thread/664108 for more information.\n if (window.PointerEvent && !isIOS) {\n this._handlePointerEvents();\n } else {\n this._handleMouseEvents();\n\n if ('ontouchstart' in window) {\n this._handleTouchEvents();\n }\n }\n }\n\n public off(): void {\n // Enable panning/zooming when touching canvas element\n this.canvas.style.touchAction = 'auto';\n (this.canvas.style as CSSStyleDeclaration & { msTouchAction: string | null }).msTouchAction = 'auto';\n this.canvas.style.userSelect = 'auto';\n\n this.canvas.removeEventListener('pointerdown', this._handlePointerDown);\n this.canvas.removeEventListener('mousedown', this._handleMouseDown);\n this.canvas.removeEventListener('touchstart', this._handleTouchStart);\n\n this._removeMoveUpEventListeners();\n }\n\n private _getListenerFunctions() {\n const canvasWindow =\n window.document === this.canvas.ownerDocument\n ? window\n : this.canvas.ownerDocument.defaultView ?? this.canvas.ownerDocument;\n\n return {\n addEventListener: canvasWindow.addEventListener.bind(\n canvasWindow,\n ) as typeof window.addEventListener,\n removeEventListener: canvasWindow.removeEventListener.bind(\n canvasWindow,\n ) as typeof window.removeEventListener,\n };\n }\n\n private _removeMoveUpEventListeners(): void {\n const { removeEventListener } = this._getListenerFunctions();\n removeEventListener('pointermove', this._handlePointerMove);\n removeEventListener('pointerup', this._handlePointerUp);\n\n removeEventListener('mousemove', this._handleMouseMove);\n removeEventListener('mouseup', this._handleMouseUp);\n\n removeEventListener('touchmove', this._handleTouchMove);\n removeEventListener('touchend', this._handleTouchEnd);\n }\n\n public isEmpty(): boolean {\n return this._isEmpty;\n }\n\n public fromData(\n pointGroups: PointGroup[],\n { clear = true }: FromDataOptions = {},\n ): void {\n if (clear) {\n this.clear();\n }\n\n this._fromData(\n pointGroups,\n this._drawCurve.bind(this),\n this._drawDot.bind(this),\n );\n\n this._data = this._data.concat(pointGroups);\n }\n\n public toData(): PointGroup[] {\n return this._data;\n }\n\n public _isLeftButtonPressed(event: MouseEvent, only?: boolean): boolean {\n if (only) {\n return event.buttons === 1;\n }\n\n return (event.buttons & 1) === 1;\n }\n private _pointerEventToSignatureEvent(\n event: MouseEvent | PointerEvent,\n ): SignatureEvent {\n return {\n event: event,\n type: event.type,\n x: event.clientX,\n y: event.clientY,\n pressure: 'pressure' in event ? event.pressure : 0,\n };\n }\n\n private _touchEventToSignatureEvent(event: TouchEvent): SignatureEvent {\n const touch = event.changedTouches[0];\n return {\n event: event,\n type: event.type,\n x: touch.clientX,\n y: touch.clientY,\n pressure: touch.force,\n };\n }\n\n // Event handlers\n private _handleMouseDown = (event: MouseEvent): void => {\n if (!this._isLeftButtonPressed(event, true) || this._drawingStroke) {\n return;\n }\n this._strokeBegin(this._pointerEventToSignatureEvent(event));\n };\n\n private _handleMouseMove = (event: MouseEvent): void => {\n if (!this._isLeftButtonPressed(event, true) || !this._drawingStroke) {\n // Stop when not pressing primary button or pressing multiple buttons\n this._strokeEnd(this._pointerEventToSignatureEvent(event), false);\n return;\n }\n\n this._strokeMoveUpdate(this._pointerEventToSignatureEvent(event));\n };\n\n private _handleMouseUp = (event: MouseEvent): void => {\n if (this._isLeftButtonPressed(event)) {\n return;\n }\n\n this._strokeEnd(this._pointerEventToSignatureEvent(event));\n };\n\n private _handleTouchStart = (event: TouchEvent): void => {\n if (event.targetTouches.length !== 1 || this._drawingStroke) {\n return;\n }\n\n // Prevent scrolling.\n if (event.cancelable) {\n event.preventDefault();\n }\n\n this._strokeBegin(this._touchEventToSignatureEvent(event));\n };\n\n private _handleTouchMove = (event: TouchEvent): void => {\n if (event.targetTouches.length !== 1) {\n return;\n }\n\n // Prevent scrolling.\n if (event.cancelable) {\n event.preventDefault();\n }\n\n if (!this._drawingStroke) {\n this._strokeEnd(this._touchEventToSignatureEvent(event), false);\n return;\n }\n\n this._strokeMoveUpdate(this._touchEventToSignatureEvent(event));\n };\n\n private _handleTouchEnd = (event: TouchEvent): void => {\n if (event.targetTouches.length !== 0) {\n return;\n }\n\n if (event.cancelable) {\n event.preventDefault();\n }\n\n this.canvas.removeEventListener('touchmove', this._handleTouchMove);\n\n this._strokeEnd(this._touchEventToSignatureEvent(event));\n };\n\n private _handlePointerDown = (event: PointerEvent): void => {\n if (!event.isPrimary || !this._isLeftButtonPressed(event) || this._drawingStroke) {\n return;\n }\n\n event.preventDefault();\n\n this._strokeBegin(this._pointerEventToSignatureEvent(event));\n };\n\n private _handlePointerMove = (event: PointerEvent): void => {\n if (!event.isPrimary) {\n return;\n }\n if (!this._isLeftButtonPressed(event, true) || !this._drawingStroke) {\n // Stop when primary button not pressed or multiple buttons pressed\n this._strokeEnd(this._pointerEventToSignatureEvent(event), false);\n return;\n }\n\n event.preventDefault();\n this._strokeMoveUpdate(this._pointerEventToSignatureEvent(event));\n };\n\n private _handlePointerUp = (event: PointerEvent): void => {\n if (!event.isPrimary || this._isLeftButtonPressed(event)) {\n return;\n }\n\n event.preventDefault();\n this._strokeEnd(this._pointerEventToSignatureEvent(event));\n };\n\n private _getPointGroupOptions(group?: PointGroup): PointGroupOptions {\n return {\n penColor: group && 'penColor' in group ? group.penColor : this.penColor,\n dotSize: group && 'dotSize' in group ? group.dotSize : this.dotSize,\n minWidth: group && 'minWidth' in group ? group.minWidth : this.minWidth,\n maxWidth: group && 'maxWidth' in group ? group.maxWidth : this.maxWidth,\n velocityFilterWeight:\n group && 'velocityFilterWeight' in group\n ? group.velocityFilterWeight\n : this.velocityFilterWeight,\n compositeOperation:\n group && 'compositeOperation' in group\n ? group.compositeOperation\n : this.compositeOperation,\n };\n }\n\n // Private methods\n private _strokeBegin(event: SignatureEvent): void {\n const cancelled = !this.dispatchEvent(\n new CustomEvent('beginStroke', { detail: event, cancelable: true }),\n );\n if (cancelled) {\n return;\n }\n\n const { addEventListener } = this._getListenerFunctions();\n switch (event.event.type) {\n case 'mousedown':\n addEventListener('mousemove', this._handleMouseMove);\n addEventListener('mouseup', this._handleMouseUp);\n break;\n case 'touchstart':\n addEventListener('touchmove', this._handleTouchMove);\n addEventListener('touchend', this._handleTouchEnd);\n break;\n case 'pointerdown':\n addEventListener('pointermove', this._handlePointerMove);\n addEventListener('pointerup', this._handlePointerUp);\n break;\n default:\n // do nothing\n }\n\n this._drawingStroke = true;\n\n const pointGroupOptions = this._getPointGroupOptions();\n\n const newPointGroup: PointGroup = {\n ...pointGroupOptions,\n points: [],\n };\n\n this._data.push(newPointGroup);\n this._reset(pointGroupOptions);\n this._strokeUpdate(event);\n }\n\n private _strokeUpdate(event: SignatureEvent): void {\n if (!this._drawingStroke) {\n return;\n }\n\n if (this._data.length === 0) {\n // This can happen if clear() was called while a signature is still in progress,\n // or if there is a race condition between start/update events.\n this._strokeBegin(event);\n return;\n }\n\n this.dispatchEvent(\n new CustomEvent('beforeUpdateStroke', { detail: event }),\n );\n\n const point = this._createPoint(event.x, event.y, event.pressure);\n const lastPointGroup = this._data[this._data.length - 1];\n const lastPoints = lastPointGroup.points;\n const lastPoint =\n lastPoints.length > 0 && lastPoints[lastPoints.length - 1];\n const isLastPointTooClose = lastPoint\n ? point.distanceTo(lastPoint) <= this.minDistance\n : false;\n const pointGroupOptions = this._getPointGroupOptions(lastPointGroup);\n\n // Skip this point if it's too close to the previous one\n if (!lastPoint || !(lastPoint && isLastPointTooClose)) {\n const curve = this._addPoint(point, pointGroupOptions);\n\n if (!lastPoint) {\n this._drawDot(point, pointGroupOptions);\n } else if (curve) {\n this._drawCurve(curve, pointGroupOptions);\n }\n\n lastPoints.push({\n time: point.time,\n x: point.x,\n y: point.y,\n pressure: point.pressure,\n });\n }\n\n this.dispatchEvent(new CustomEvent('afterUpdateStroke', { detail: event }));\n }\n\n private _strokeEnd(event: SignatureEvent, shouldUpdate = true): void {\n this._removeMoveUpEventListeners();\n\n if (!this._drawingStroke) {\n return;\n }\n\n if (shouldUpdate) {\n this._strokeUpdate(event);\n }\n\n this._drawingStroke = false;\n this.dispatchEvent(new CustomEvent('endStroke', { detail: event }));\n }\n\n private _handlePointerEvents(): void {\n this._drawingStroke = false;\n\n this.canvas.addEventListener('pointerdown', this._handlePointerDown);\n }\n\n private _handleMouseEvents(): void {\n this._drawingStroke = false;\n\n this.canvas.addEventListener('mousedown', this._handleMouseDown);\n }\n\n private _handleTouchEvents(): void {\n this.canvas.addEventListener('touchstart', this._handleTouchStart);\n }\n\n // Called when a new line is started\n private _reset(options: PointGroupOptions): void {\n this._lastPoints = [];\n this._lastVelocity = 0;\n this._lastWidth = (options.minWidth + options.maxWidth) / 2;\n this._ctx.fillStyle = options.penColor;\n this._ctx.globalCompositeOperation = options.compositeOperation;\n }\n\n private _createPoint(x: number, y: number, pressure: number): Point {\n const rect = this.canvas.getBoundingClientRect();\n\n return new Point(\n x - rect.left,\n y - rect.top,\n pressure,\n new Date().getTime(),\n );\n }\n\n // Add point to _lastPoints array and generate a new curve if there are enough points (i.e. 3)\n private _addPoint(point: Point, options: PointGroupOptions): Bezier | null {\n const { _lastPoints } = this;\n\n _lastPoints.push(point);\n\n if (_lastPoints.length > 2) {\n // To reduce the initial lag make it work with 3 points\n // by copying the first point to the beginning.\n if (_lastPoints.length === 3) {\n _lastPoints.unshift(_lastPoints[0]);\n }\n\n // _points array will always have 4 points here.\n const widths = this._calculateCurveWidths(\n _lastPoints[1],\n _lastPoints[2],\n options,\n );\n const curve = Bezier.fromPoints(_lastPoints, widths);\n\n // Remove the first element from the list, so that there are no more than 4 points at any time.\n _lastPoints.shift();\n\n return curve;\n }\n\n return null;\n }\n\n private _calculateCurveWidths(\n startPoint: Point,\n endPoint: Point,\n options: PointGroupOptions,\n ): { start: number; end: number } {\n const velocity =\n options.velocityFilterWeight * endPoint.velocityFrom(startPoint) +\n (1 - options.velocityFilterWeight) * this._lastVelocity;\n\n const newWidth = this._strokeWidth(velocity, options);\n\n const widths = {\n end: newWidth,\n start: this._lastWidth,\n };\n\n this._lastVelocity = velocity;\n this._lastWidth = newWidth;\n\n return widths;\n }\n\n private _strokeWidth(velocity: number, options: PointGroupOptions): number {\n return Math.max(options.maxWidth / (velocity + 1), options.minWidth);\n }\n\n private _drawCurveSegment(x: number, y: number, width: number): void {\n const ctx = this._ctx;\n\n ctx.moveTo(x, y);\n ctx.arc(x, y, width, 0, 2 * Math.PI, false);\n this._isEmpty = false;\n }\n\n private _drawCurve(curve: Bezier, options: PointGroupOptions): void {\n const ctx = this._ctx;\n const widthDelta = curve.endWidth - curve.startWidth;\n // '2' is just an arbitrary number here. If only length is used, then\n // there are gaps between curve segments :/\n const drawSteps = Math.ceil(curve.length()) * 2;\n\n ctx.beginPath();\n ctx.fillStyle = options.penColor;\n\n for (let i = 0; i < drawSteps; i += 1) {\n // Calculate the Bezier (x, y) coordinate for this step.\n const t = i / drawSteps;\n const tt = t * t;\n const ttt = tt * t;\n const u = 1 - t;\n const uu = u * u;\n const uuu = uu * u;\n\n let x = uuu * curve.startPoint.x;\n x += 3 * uu * t * curve.control1.x;\n x += 3 * u * tt * curve.control2.x;\n x += ttt * curve.endPoint.x;\n\n let y = uuu * curve.startPoint.y;\n y += 3 * uu * t * curve.control1.y;\n y += 3 * u * tt * curve.control2.y;\n y += ttt * curve.endPoint.y;\n\n const width = Math.min(\n curve.startWidth + ttt * widthDelta,\n options.maxWidth,\n );\n this._drawCurveSegment(x, y, width);\n }\n\n ctx.closePath();\n ctx.fill();\n }\n\n private _drawDot(point: BasicPoint, options: PointGroupOptions): void {\n const ctx = this._ctx;\n const width =\n options.dotSize > 0\n ? options.dotSize\n : (options.minWidth + options.maxWidth) / 2;\n\n ctx.beginPath();\n this._drawCurveSegment(point.x, point.y, width);\n ctx.closePath();\n ctx.fillStyle = options.penColor;\n ctx.fill();\n }\n\n private _fromData(\n pointGroups: PointGroup[],\n drawCurve: SignaturePad['_drawCurve'],\n drawDot: SignaturePad['_drawDot'],\n ): void {\n for (const group of pointGroups) {\n const { points } = group;\n const pointGroupOptions = this._getPointGroupOptions(group);\n\n if (points.length > 1) {\n for (let j = 0; j < points.length; j += 1) {\n const basicPoint = points[j];\n const point = new Point(\n basicPoint.x,\n basicPoint.y,\n basicPoint.pressure,\n basicPoint.time,\n );\n\n if (j === 0) {\n this._reset(pointGroupOptions);\n }\n\n const curve = this._addPoint(point, pointGroupOptions);\n\n if (curve) {\n drawCurve(curve, pointGroupOptions);\n }\n }\n } else {\n this._reset(pointGroupOptions);\n\n drawDot(points[0], pointGroupOptions);\n }\n }\n }\n\n public toSVG({ includeBackgroundColor = false }: ToSVGOptions = {}): string {\n const pointGroups = this._data;\n const ratio = Math.max(window.devicePixelRatio || 1, 1);\n const minX = 0;\n const minY = 0;\n const maxX = this.canvas.width / ratio;\n const maxY = this.canvas.height / ratio;\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n\n svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n svg.setAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink');\n svg.setAttribute('viewBox', `${minX} ${minY} ${maxX} ${maxY}`);\n svg.setAttribute('width', maxX.toString());\n svg.setAttribute('height', maxY.toString());\n\n if (includeBackgroundColor && this.backgroundColor) {\n const rect = document.createElement('rect');\n rect.setAttribute('width', '100%');\n rect.setAttribute('height', '100%');\n rect.setAttribute('fill', this.backgroundColor);\n\n svg.appendChild(rect);\n }\n\n this._fromData(\n pointGroups,\n\n (curve, { penColor }) => {\n const path = document.createElement('path');\n\n // Need to check curve for NaN values, these pop up when drawing\n // lines on the canvas that are not continuous. E.g. Sharp corners\n // or stopping mid-stroke and than continuing without lifting mouse.\n if (\n !isNaN(curve.control1.x) &&\n !isNaN(curve.control1.y) &&\n !isNaN(curve.control2.x) &&\n !isNaN(curve.control2.y)\n ) {\n const attr =\n `M ${curve.startPoint.x.toFixed(3)},${curve.startPoint.y.toFixed(\n 3,\n )} ` +\n `C ${curve.control1.x.toFixed(3)},${curve.control1.y.toFixed(3)} ` +\n `${curve.control2.x.toFixed(3)},${curve.control2.y.toFixed(3)} ` +\n `${curve.endPoint.x.toFixed(3)},${curve.endPoint.y.toFixed(3)}`;\n path.setAttribute('d', attr);\n path.setAttribute('stroke-width', (curve.endWidth * 2.25).toFixed(3));\n path.setAttribute('stroke', penColor);\n path.setAttribute('fill', 'none');\n path.setAttribute('stroke-linecap', 'round');\n\n svg.appendChild(path);\n }\n },\n\n (point, { penColor, dotSize, minWidth, maxWidth }) => {\n const circle = document.createElement('circle');\n const size = dotSize > 0 ? dotSize : (minWidth + maxWidth) / 2;\n circle.setAttribute('r', size.toString());\n circle.setAttribute('cx', point.x.toString());\n circle.setAttribute('cy', point.y.toString());\n circle.setAttribute('fill', penColor);\n\n svg.appendChild(circle);\n },\n );\n\n return svg.outerHTML;\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-this-alias */\n// Slightly simplified version of http://stackoverflow.com/a/27078401/815507\n\nexport function throttle(\n fn: (...args: any[]) => any,\n wait = 250,\n): (this: any, ...args: any[]) => any {\n let previous = 0;\n let timeout: number | null = null;\n let result: any;\n let storedContext: any;\n let storedArgs: any[];\n\n const later = (): void => {\n previous = Date.now();\n timeout = null;\n result = fn.apply(storedContext, storedArgs);\n\n if (!timeout) {\n storedContext = null;\n storedArgs = [];\n }\n };\n\n return function wrapper(this: any, ...args: any[]): any {\n const now = Date.now();\n const remaining = wait - (now - previous);\n\n storedContext = this;\n storedArgs = args;\n\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n\n previous = now;\n result = fn.apply(storedContext, storedArgs);\n\n if (!timeout) {\n storedContext = null;\n storedArgs = [];\n }\n } else if (!timeout) {\n timeout = window.setTimeout(later, remaining);\n }\n\n return result;\n };\n}\n"],"names":["Point","constructor","x","y","pressure","time","isNaN","Error","this","Date","now","distanceTo","start","Math","sqrt","pow","equals","other","velocityFrom","Bezier","fromPoints","points","widths","c2","calculateControlPoints","c3","c1","end","s1","s2","s3","dx1","dy1","dx2","dy2","m1","m2","l1","l2","k","cm","tx","ty","startPoint","control2","control1","endPoint","startWidth","endWidth","length","px","py","i","t","cx","point","cy","xdiff","ydiff","SignatureEventTarget","_et","EventTarget","_a","document","addEventListener","type","listener","options","dispatchEvent","event","removeEventListener","callback","SignaturePad","canvas","super","_drawingStroke","_isEmpty","_lastPoints","_data","_lastVelocity","_lastWidth","_handleMouseDown","_isLeftButtonPressed","_strokeBegin","_pointerEventToSignatureEvent","_handleMouseMove","_strokeMoveUpdate","_strokeEnd","_handleMouseUp","_handleTouchStart","targetTouches","cancelable","preventDefault","_touchEventToSignatureEvent","_handleTouchMove","_handleTouchEnd","_handlePointerDown","isPrimary","_handlePointerMove","_handlePointerUp","velocityFilterWeight","minWidth","maxWidth","throttle","minDistance","_b","dotSize","penColor","backgroundColor","compositeOperation","canvasContextOptions","_c","fn","wait","result","storedContext","storedArgs","previous","timeout","later","apply","args","remaining","clearTimeout","window","setTimeout","prototype","_strokeUpdate","_ctx","getContext","clear","on","ctx","fillStyle","clearRect","width","height","fillRect","_reset","_getPointGroupOptions","fromDataURL","dataUrl","Promise","resolve","reject","image","Image","ratio","devicePixelRatio","xOffset","yOffset","onload","drawImage","onerror","error","crossOrigin","src","toDataURL","encoderOptions","undefined","btoa","toSVG","style","touchAction","msTouchAction","userSelect","isIOS","test","navigator","userAgent","PointerEvent","_handlePointerEvents","_handleMouseEvents","_handleTouchEvents","off","_removeMoveUpEventListeners","_getListenerFunctions","canvasWindow","ownerDocument","defaultView","bind","isEmpty","fromData","pointGroups","_fromData","_drawCurve","_drawDot","concat","toData","only","buttons","clientX","clientY","touch","changedTouches","force","group","CustomEvent","detail","pointGroupOptions","newPointGroup","push","_createPoint","lastPointGroup","lastPoints","lastPoint","isLastPointTooClose","curve","_addPoint","shouldUpdate","globalCompositeOperation","rect","getBoundingClientRect","left","top","getTime","unshift","_calculateCurveWidths","shift","velocity","newWidth","_strokeWidth","max","_drawCurveSegment","moveTo","arc","PI","widthDelta","drawSteps","ceil","beginPath","tt","ttt","u","uu","uuu","min","closePath","fill","drawCurve","drawDot","j","basicPoint","includeBackgroundColor","maxX","maxY","svg","createElementNS","setAttribute","toString","createElement","appendChild","path","attr","toFixed","circle","size","outerHTML"],"mappings":";;;;mPAQaA,EAMX,WAAAC,CAAYC,EAAWC,EAAWC,EAAmBC,GACnD,GAAIC,MAAMJ,IAAMI,MAAMH,GACpB,MAAM,IAAII,MAAM,sBAAsBL,MAAMC,MAE9CK,KAAKN,GAAKA,EACVM,KAAKL,GAAKA,EACVK,KAAKJ,SAAWA,GAAY,EAC5BI,KAAKH,KAAOA,GAAQI,KAAKC,KAC1B,CAEM,UAAAC,CAAWC,GAChB,OAAOC,KAAKC,KACVD,KAAKE,IAAIP,KAAKN,EAAIU,EAAMV,EAAG,GAAKW,KAAKE,IAAIP,KAAKL,EAAIS,EAAMT,EAAG,GAE9D,CAEM,MAAAa,CAAOC,GACZ,OACET,KAAKN,IAAMe,EAAMf,GACjBM,KAAKL,IAAMc,EAAMd,GACjBK,KAAKJ,WAAaa,EAAMb,UACxBI,KAAKH,OAASY,EAAMZ,IAEvB,CAEM,YAAAa,CAAaN,GAClB,OAAOJ,KAAKH,OAASO,EAAMP,KACvBG,KAAKG,WAAWC,IAAUJ,KAAKH,KAAOO,EAAMP,MAC5C,CACL,QCzCUc,EACJ,iBAAOC,CACZC,EACAC,GAEA,MAAMC,EAAKf,KAAKgB,uBAAuBH,EAAO,GAAIA,EAAO,GAAIA,EAAO,IAAIE,GAClEE,EAAKjB,KAAKgB,uBAAuBH,EAAO,GAAIA,EAAO,GAAIA,EAAO,IAAIK,GAExE,OAAO,IAAIP,EAAOE,EAAO,GAAIE,EAAIE,EAAIJ,EAAO,GAAIC,EAAOV,MAAOU,EAAOK,IACtE,CAEO,6BAAOH,CACbI,EACAC,EACAC,GAKA,MAAMC,EAAMH,EAAG1B,EAAI2B,EAAG3B,EAChB8B,EAAMJ,EAAGzB,EAAI0B,EAAG1B,EAChB8B,EAAMJ,EAAG3B,EAAI4B,EAAG5B,EAChBgC,EAAML,EAAG1B,EAAI2B,EAAG3B,EAEhBgC,GAAWP,EAAG1B,EAAI2B,EAAG3B,GAAK,EAA1BiC,GAAmCP,EAAGzB,EAAI0B,EAAG1B,GAAK,EAClDiC,GAAWP,EAAG3B,EAAI4B,EAAG5B,GAAK,EAA1BkC,GAAmCP,EAAG1B,EAAI2B,EAAG3B,GAAK,EAElDkC,EAAKxB,KAAKC,KAAKiB,EAAMA,EAAMC,EAAMA,GACjCM,EAAKzB,KAAKC,KAAKmB,EAAMA,EAAMC,EAAMA,GAKjCK,EAAIF,EAAKC,GAAM,EAAI,EAAIA,GAAMD,EAAKC,GAClCE,EAAUJ,GAJJD,EAAOC,GAIUG,EAAvBC,EAA6BJ,GAHvBD,EAAOC,GAG6BG,EAE1CE,EAAKZ,EAAG3B,EAAIsC,EACZE,EAAKb,EAAG1B,EAAIqC,EAElB,MAAO,CACLd,GAAI,IAAI1B,EAAMmC,EAAOM,EAAIN,EAAOO,GAChCnB,GAAI,IAAIvB,EAAMoC,EAAOK,EAAIL,EAAOM,GAEnC,CAED,WAAAzC,CACS0C,EACAC,EACAC,EACAC,EACAC,EACAC,GALAxC,KAAUmC,WAAVA,EACAnC,KAAQoC,SAARA,EACApC,KAAQqC,SAARA,EACArC,KAAQsC,SAARA,EACAtC,KAAUuC,WAAVA,EACAvC,KAAQwC,SAARA,CACL,CAGG,MAAAC,GAEL,IACIC,EACAC,EAFAF,EAAS,EAIb,IAAK,IAAIG,EAAI,EAAGA,GALF,GAKcA,GAAK,EAAG,CAClC,MAAMC,EAAID,EANE,GAONE,EAAK9C,KAAK+C,MACdF,EACA7C,KAAKmC,WAAWzC,EAChBM,KAAKqC,SAAS3C,EACdM,KAAKoC,SAAS1C,EACdM,KAAKsC,SAAS5C,GAEVsD,EAAKhD,KAAK+C,MACdF,EACA7C,KAAKmC,WAAWxC,EAChBK,KAAKqC,SAAS1C,EACdK,KAAKoC,SAASzC,EACdK,KAAKsC,SAAS3C,GAGhB,GAAIiD,EAAI,EAAG,CACT,MAAMK,EAAQH,EAAMJ,EACdQ,EAAQF,EAAML,EAEpBF,GAAUpC,KAAKC,KAAK2C,EAAQA,EAAQC,EAAQA,EAC7C,CAEDR,EAAKI,EACLH,EAAKK,CACN,CAED,OAAOP,CACR,CAGO,KAAAM,CACNF,EACAzC,EACAc,EACAH,EACAI,GAGA,OAAef,GAAS,EAAMyC,IAAM,EAAMA,IAAO,EAAMA,GAC/C,EAAO3B,GAAS,EAAM2B,IAAM,EAAMA,GAAMA,EACxC,EAAO9B,GAAS,EAAM8B,GAAKA,EAAaA,EACjC1B,EAAQ0B,EAAYA,EAAaA,CACjD,QC3GUM,EAKX,WAAA1D,GACE,IACEO,KAAKoD,IAAM,IAAIC,WAChB,CAAC,MAAAC,GAGAtD,KAAKoD,IAAMG,QACZ,CACF,CAED,gBAAAC,CACEC,EACAC,EACAC,GAEA3D,KAAKoD,IAAII,iBAAiBC,EAAMC,EAAUC,EAC3C,CAED,aAAAC,CAAcC,GACZ,OAAO7D,KAAKoD,IAAIQ,cAAcC,EAC/B,CAED,mBAAAC,CACEL,EACAM,EACAJ,GAEA3D,KAAKoD,IAAIU,oBAAoBL,EAAMM,EAAUJ,EAC9C,EC0BkB,MAAAK,UAAqBb,EAyBxC,WAAA1D,CACUwE,EACRN,EAAmB,cAEnBO,QAHQlE,KAAMiE,OAANA,EAVFjE,KAAcmE,gBAAG,EACjBnE,KAAQoE,UAAG,EACXpE,KAAWqE,YAAY,GACvBrE,KAAKsE,MAAiB,GACtBtE,KAAauE,cAAG,EAChBvE,KAAUwE,WAAG,EAqObxE,KAAAyE,iBAAoBZ,IACrB7D,KAAK0E,qBAAqBb,GAAO,KAAS7D,KAAKmE,gBAGpDnE,KAAK2E,aAAa3E,KAAK4E,8BAA8Bf,GAAO,EAGtD7D,KAAA6E,iBAAoBhB,IACrB7D,KAAK0E,qBAAqBb,GAAO,IAAU7D,KAAKmE,eAMrDnE,KAAK8E,kBAAkB9E,KAAK4E,8BAA8Bf,IAJxD7D,KAAK+E,WAAW/E,KAAK4E,8BAA8Bf,IAAQ,EAII,EAG3D7D,KAAAgF,eAAkBnB,IACpB7D,KAAK0E,qBAAqBb,IAI9B7D,KAAK+E,WAAW/E,KAAK4E,8BAA8Bf,GAAO,EAGpD7D,KAAAiF,kBAAqBpB,IACQ,IAA/BA,EAAMqB,cAAczC,QAAgBzC,KAAKmE,iBAKzCN,EAAMsB,YACRtB,EAAMuB,iBAGRpF,KAAK2E,aAAa3E,KAAKqF,4BAA4BxB,IAAO,EAGpD7D,KAAAsF,iBAAoBzB,IACS,IAA/BA,EAAMqB,cAAczC,SAKpBoB,EAAMsB,YACRtB,EAAMuB,iBAGHpF,KAAKmE,eAKVnE,KAAK8E,kBAAkB9E,KAAKqF,4BAA4BxB,IAJtD7D,KAAK+E,WAAW/E,KAAKqF,4BAA4BxB,IAAQ,GAII,EAGzD7D,KAAAuF,gBAAmB1B,IACU,IAA/BA,EAAMqB,cAAczC,SAIpBoB,EAAMsB,YACRtB,EAAMuB,iBAGRpF,KAAKiE,OAAOH,oBAAoB,YAAa9D,KAAKsF,kBAElDtF,KAAK+E,WAAW/E,KAAKqF,4BAA4BxB,IAAO,EAGlD7D,KAAAwF,mBAAsB3B,IACvBA,EAAM4B,WAAczF,KAAK0E,qBAAqBb,KAAU7D,KAAKmE,iBAIlEN,EAAMuB,iBAENpF,KAAK2E,aAAa3E,KAAK4E,8BAA8Bf,IAAO,EAGtD7D,KAAA0F,mBAAsB7B,IACvBA,EAAM4B,YAGNzF,KAAK0E,qBAAqBb,GAAO,IAAU7D,KAAKmE,gBAMrDN,EAAMuB,iBACNpF,KAAK8E,kBAAkB9E,KAAK4E,8BAA8Bf,KALxD7D,KAAK+E,WAAW/E,KAAK4E,8BAA8Bf,IAAQ,GAKI,EAG3D7D,KAAA2F,iBAAoB9B,IACrBA,EAAM4B,YAAazF,KAAK0E,qBAAqBb,KAIlDA,EAAMuB,iBACNpF,KAAK+E,WAAW/E,KAAK4E,8BAA8Bf,IAAO,EAhU1D7D,KAAK4F,qBAAuBjC,EAAQiC,sBAAwB,GAC5D5F,KAAK6F,SAAWlC,EAAQkC,UAAY,GACpC7F,KAAK8F,SAAWnC,EAAQmC,UAAY,IAGpC9F,KAAK+F,SAA+B,QAApBzC,EAAAK,EAAQoC,gBAAY,IAAAzC,EAAAA,EAAA,GACpCtD,KAAKgG,YAAqC,QAAvBC,EAAAtC,EAAQqC,mBAAe,IAAAC,EAAAA,EAAA,EAC1CjG,KAAKkG,QAAUvC,EAAQuC,SAAW,EAClClG,KAAKmG,SAAWxC,EAAQwC,UAAY,QACpCnG,KAAKoG,gBAAkBzC,EAAQyC,iBAAmB,gBAClDpG,KAAKqG,mBAAqB1C,EAAQ0C,oBAAsB,cACxDrG,KAAKsG,qBAAuD,QAAhCC,EAAA5C,EAAQ2C,4BAAwB,IAAAC,EAAAA,EAAA,CAAA,EAE5DvG,KAAK8E,kBAAoB9E,KAAK+F,kBClGhCS,EACAC,EAAO,KAEP,IAEIC,EACAC,EACAC,EAJAC,EAAW,EACXC,EAAyB,KAK7B,MAAMC,EAAQ,KACZF,EAAW5G,KAAKC,MAChB4G,EAAU,KACVJ,EAASF,EAAGQ,MAAML,EAAeC,GAE5BE,IACHH,EAAgB,KAChBC,EAAa,GACd,EAGH,OAAO,YAA+BK,GACpC,MAAM/G,EAAMD,KAAKC,MACXgH,EAAYT,GAAQvG,EAAM2G,GAsBhC,OApBAF,EAAgB3G,KAChB4G,EAAaK,EAETC,GAAa,GAAKA,EAAYT,GAC5BK,IACFK,aAAaL,GACbA,EAAU,MAGZD,EAAW3G,EACXwG,EAASF,EAAGQ,MAAML,EAAeC,GAE5BE,IACHH,EAAgB,KAChBC,EAAa,KAELE,IACVA,EAAUM,OAAOC,WAAWN,EAAOG,IAG9BR,CACT,CACF,CDqDQX,CAAS/B,EAAasD,UAAUC,cAAevH,KAAK+F,UACpD/B,EAAasD,UAAUC,cAC3BvH,KAAKwH,KAAOvD,EAAOwD,WACjB,KACAzH,KAAKsG,sBAGPtG,KAAK0H,QAGL1H,KAAK2H,IACN,CAEM,KAAAD,GACL,MAAQF,KAAMI,EAAG3D,OAAEA,GAAWjE,KAG9B4H,EAAIC,UAAY7H,KAAKoG,gBACrBwB,EAAIE,UAAU,EAAG,EAAG7D,EAAO8D,MAAO9D,EAAO+D,QACzCJ,EAAIK,SAAS,EAAG,EAAGhE,EAAO8D,MAAO9D,EAAO+D,QAExChI,KAAKsE,MAAQ,GACbtE,KAAKkI,OAAOlI,KAAKmI,yBACjBnI,KAAKoE,UAAW,CACjB,CAEM,WAAAgE,CACLC,EACA1E,EAMI,IAEJ,OAAO,IAAI2E,SAAQ,CAACC,EAASC,KAC3B,MAAMC,EAAQ,IAAIC,MACZC,EAAQhF,EAAQgF,OAASvB,OAAOwB,kBAAoB,EACpDb,EAAQpE,EAAQoE,OAAS/H,KAAKiE,OAAO8D,MAAQY,EAC7CX,EAASrE,EAAQqE,QAAUhI,KAAKiE,OAAO+D,OAASW,EAChDE,EAAUlF,EAAQkF,SAAW,EAC7BC,EAAUnF,EAAQmF,SAAW,EAEnC9I,KAAKkI,OAAOlI,KAAKmI,yBAEjBM,EAAMM,OAAS,KACb/I,KAAKwH,KAAKwB,UAAUP,EAAOI,EAASC,EAASf,EAAOC,GACpDO,GAAS,EAEXE,EAAMQ,QAAWC,IACfV,EAAOU,EAAM,EAEfT,EAAMU,YAAc,YACpBV,EAAMW,IAAMf,EAEZrI,KAAKoE,UAAW,CAAK,GAExB,CAOM,SAAAiF,CACL5F,EAAO,YACP6F,GAEA,MACO,kBADC7F,GAE0B,iBAAnB6F,IACTA,OAAiBC,GAEZ,6BAA6BC,KAClCxJ,KAAKyJ,MAAMH,QAGiB,iBAAnBA,IACTA,OAAiBC,GAEZvJ,KAAKiE,OAAOoF,UAAU5F,EAAM6F,GAExC,CAEM,EAAA3B,GAEL3H,KAAKiE,OAAOyF,MAAMC,YAAc,OAC/B3J,KAAKiE,OAAOyF,MAAiEE,cAAgB,OAC9F5J,KAAKiE,OAAOyF,MAAMG,WAAa,OAE/B,MAAMC,EACJ,YAAYC,KAAKC,UAAUC,YAAc,iBAAkB1G,SAMzD6D,OAAO8C,eAAiBJ,EAC1B9J,KAAKmK,wBAELnK,KAAKoK,qBAED,iBAAkBhD,QACpBpH,KAAKqK,qBAGV,CAEM,GAAAC,GAELtK,KAAKiE,OAAOyF,MAAMC,YAAc,OAC/B3J,KAAKiE,OAAOyF,MAAiEE,cAAgB,OAC9F5J,KAAKiE,OAAOyF,MAAMG,WAAa,OAE/B7J,KAAKiE,OAAOH,oBAAoB,cAAe9D,KAAKwF,oBACpDxF,KAAKiE,OAAOH,oBAAoB,YAAa9D,KAAKyE,kBAClDzE,KAAKiE,OAAOH,oBAAoB,aAAc9D,KAAKiF,mBAEnDjF,KAAKuK,6BACN,CAEO,qBAAAC,SACN,MAAMC,EACJrD,OAAO7D,WAAavD,KAAKiE,OAAOyG,cAC5BtD,eACA9D,EAAAtD,KAAKiE,OAAOyG,cAAcC,2BAAe3K,KAAKiE,OAAOyG,cAE3D,MAAO,CACLlH,iBAAkBiH,EAAajH,iBAAiBoH,KAC9CH,GAEF3G,oBAAqB2G,EAAa3G,oBAAoB8G,KACpDH,GAGL,CAEO,2BAAAF,GACN,MAAMzG,oBAAEA,GAAwB9D,KAAKwK,wBACrC1G,EAAoB,cAAe9D,KAAK0F,oBACxC5B,EAAoB,YAAa9D,KAAK2F,kBAEtC7B,EAAoB,YAAa9D,KAAK6E,kBACtCf,EAAoB,UAAW9D,KAAKgF,gBAEpClB,EAAoB,YAAa9D,KAAKsF,kBACtCxB,EAAoB,WAAY9D,KAAKuF,gBACtC,CAEM,OAAAsF,GACL,OAAO7K,KAAKoE,QACb,CAEM,QAAA0G,CACLC,GACArD,MAAEA,GAAQ,GAA0B,CAAA,GAEhCA,GACF1H,KAAK0H,QAGP1H,KAAKgL,UACHD,EACA/K,KAAKiL,WAAWL,KAAK5K,MACrBA,KAAKkL,SAASN,KAAK5K,OAGrBA,KAAKsE,MAAQtE,KAAKsE,MAAM6G,OAAOJ,EAChC,CAEM,MAAAK,GACL,OAAOpL,KAAKsE,KACb,CAEM,oBAAAI,CAAqBb,EAAmBwH,GAC7C,OAAIA,EACuB,IAAlBxH,EAAMyH,UAGgB,GAAvBzH,EAAMyH,QACf,CACO,6BAAA1G,CACNf,GAEA,MAAO,CACLA,MAAOA,EACPJ,KAAMI,EAAMJ,KACZ/D,EAAGmE,EAAM0H,QACT5L,EAAGkE,EAAM2H,QACT5L,SAAU,aAAciE,EAAQA,EAAMjE,SAAW,EAEpD,CAEO,2BAAAyF,CAA4BxB,GAClC,MAAM4H,EAAQ5H,EAAM6H,eAAe,GACnC,MAAO,CACL7H,MAAOA,EACPJ,KAAMI,EAAMJ,KACZ/D,EAAG+L,EAAMF,QACT5L,EAAG8L,EAAMD,QACT5L,SAAU6L,EAAME,MAEnB,CA0GO,qBAAAxD,CAAsByD,GAC5B,MAAO,CACLzF,SAAUyF,GAAS,aAAcA,EAAQA,EAAMzF,SAAWnG,KAAKmG,SAC/DD,QAAS0F,GAAS,YAAaA,EAAQA,EAAM1F,QAAUlG,KAAKkG,QAC5DL,SAAU+F,GAAS,aAAcA,EAAQA,EAAM/F,SAAW7F,KAAK6F,SAC/DC,SAAU8F,GAAS,aAAcA,EAAQA,EAAM9F,SAAW9F,KAAK8F,SAC/DF,qBACEgG,GAAS,yBAA0BA,EAC/BA,EAAMhG,qBACN5F,KAAK4F,qBACXS,mBACEuF,GAAS,uBAAwBA,EAC7BA,EAAMvF,mBACNrG,KAAKqG,mBAEd,CAGO,YAAA1B,CAAad,GAInB,IAHmB7D,KAAK4D,cACtB,IAAIiI,YAAY,cAAe,CAAEC,OAAQjI,EAAOsB,YAAY,KAG5D,OAGF,MAAM3B,iBAAEA,GAAqBxD,KAAKwK,wBAClC,OAAQ3G,EAAMA,MAAMJ,MAClB,IAAK,YACHD,EAAiB,YAAaxD,KAAK6E,kBACnCrB,EAAiB,UAAWxD,KAAKgF,gBACjC,MACF,IAAK,aACHxB,EAAiB,YAAaxD,KAAKsF,kBACnC9B,EAAiB,WAAYxD,KAAKuF,iBAClC,MACF,IAAK,cACH/B,EAAiB,cAAexD,KAAK0F,oBACrClC,EAAiB,YAAaxD,KAAK2F,kBAMvC3F,KAAKmE,gBAAiB,EAEtB,MAAM4H,EAAoB/L,KAAKmI,wBAEzB6D,iCACDD,GAAiB,CACpBlL,OAAQ,KAGVb,KAAKsE,MAAM2H,KAAKD,GAChBhM,KAAKkI,OAAO6D,GACZ/L,KAAKuH,cAAc1D,EACpB,CAEO,aAAA0D,CAAc1D,GACpB,IAAK7D,KAAKmE,eACR,OAGF,GAA0B,IAAtBnE,KAAKsE,MAAM7B,OAIb,YADAzC,KAAK2E,aAAad,GAIpB7D,KAAK4D,cACH,IAAIiI,YAAY,qBAAsB,CAAEC,OAAQjI,KAGlD,MAAMd,EAAQ/C,KAAKkM,aAAarI,EAAMnE,EAAGmE,EAAMlE,EAAGkE,EAAMjE,UAClDuM,EAAiBnM,KAAKsE,MAAMtE,KAAKsE,MAAM7B,OAAS,GAChD2J,EAAaD,EAAetL,OAC5BwL,EACJD,EAAW3J,OAAS,GAAK2J,EAAWA,EAAW3J,OAAS,GACpD6J,IAAsBD,GACxBtJ,EAAM5C,WAAWkM,IAAcrM,KAAKgG,YAElC+F,EAAoB/L,KAAKmI,sBAAsBgE,GAGrD,IAAKE,IAAeA,IAAaC,EAAsB,CACrD,MAAMC,EAAQvM,KAAKwM,UAAUzJ,EAAOgJ,GAE/BM,EAEME,GACTvM,KAAKiL,WAAWsB,EAAOR,GAFvB/L,KAAKkL,SAASnI,EAAOgJ,GAKvBK,EAAWH,KAAK,CACdpM,KAAMkD,EAAMlD,KACZH,EAAGqD,EAAMrD,EACTC,EAAGoD,EAAMpD,EACTC,SAAUmD,EAAMnD,UAEnB,CAEDI,KAAK4D,cAAc,IAAIiI,YAAY,oBAAqB,CAAEC,OAAQjI,IACnE,CAEO,UAAAkB,CAAWlB,EAAuB4I,GAAe,GACvDzM,KAAKuK,8BAEAvK,KAAKmE,iBAINsI,GACFzM,KAAKuH,cAAc1D,GAGrB7D,KAAKmE,gBAAiB,EACtBnE,KAAK4D,cAAc,IAAIiI,YAAY,YAAa,CAAEC,OAAQjI,KAC3D,CAEO,oBAAAsG,GACNnK,KAAKmE,gBAAiB,EAEtBnE,KAAKiE,OAAOT,iBAAiB,cAAexD,KAAKwF,mBAClD,CAEO,kBAAA4E,GACNpK,KAAKmE,gBAAiB,EAEtBnE,KAAKiE,OAAOT,iBAAiB,YAAaxD,KAAKyE,iBAChD,CAEO,kBAAA4F,GACNrK,KAAKiE,OAAOT,iBAAiB,aAAcxD,KAAKiF,kBACjD,CAGO,MAAAiD,CAAOvE,GACb3D,KAAKqE,YAAc,GACnBrE,KAAKuE,cAAgB,EACrBvE,KAAKwE,YAAcb,EAAQkC,SAAWlC,EAAQmC,UAAY,EAC1D9F,KAAKwH,KAAKK,UAAYlE,EAAQwC,SAC9BnG,KAAKwH,KAAKkF,yBAA2B/I,EAAQ0C,kBAC9C,CAEO,YAAA6F,CAAaxM,EAAWC,EAAWC,GACzC,MAAM+M,EAAO3M,KAAKiE,OAAO2I,wBAEzB,OAAO,IAAIpN,EACTE,EAAIiN,EAAKE,KACTlN,EAAIgN,EAAKG,IACTlN,GACA,IAAIK,MAAO8M,UAEd,CAGO,SAAAP,CAAUzJ,EAAcY,GAC9B,MAAMU,YAAEA,GAAgBrE,KAIxB,GAFAqE,EAAY4H,KAAKlJ,GAEbsB,EAAY5B,OAAS,EAAG,CAGC,IAAvB4B,EAAY5B,QACd4B,EAAY2I,QAAQ3I,EAAY,IAIlC,MAAMvD,EAASd,KAAKiN,sBAClB5I,EAAY,GACZA,EAAY,GACZV,GAEI4I,EAAQ5L,EAAOC,WAAWyD,EAAavD,GAK7C,OAFAuD,EAAY6I,QAELX,CACR,CAED,OAAO,IACR,CAEO,qBAAAU,CACN9K,EACAG,EACAqB,GAEA,MAAMwJ,EACJxJ,EAAQiC,qBAAuBtD,EAAS5B,aAAayB,IACpD,EAAIwB,EAAQiC,sBAAwB5F,KAAKuE,cAEtC6I,EAAWpN,KAAKqN,aAAaF,EAAUxJ,GAEvC7C,EAAS,CACbK,IAAKiM,EACLhN,MAAOJ,KAAKwE,YAMd,OAHAxE,KAAKuE,cAAgB4I,EACrBnN,KAAKwE,WAAa4I,EAEXtM,CACR,CAEO,YAAAuM,CAAaF,EAAkBxJ,GACrC,OAAOtD,KAAKiN,IAAI3J,EAAQmC,UAAYqH,EAAW,GAAIxJ,EAAQkC,SAC5D,CAEO,iBAAA0H,CAAkB7N,EAAWC,EAAWoI,GAC9C,MAAMH,EAAM5H,KAAKwH,KAEjBI,EAAI4F,OAAO9N,EAAGC,GACdiI,EAAI6F,IAAI/N,EAAGC,EAAGoI,EAAO,EAAG,EAAI1H,KAAKqN,IAAI,GACrC1N,KAAKoE,UAAW,CACjB,CAEO,UAAA6G,CAAWsB,EAAe5I,GAChC,MAAMiE,EAAM5H,KAAKwH,KACXmG,EAAapB,EAAM/J,SAAW+J,EAAMhK,WAGpCqL,EAAwC,EAA5BvN,KAAKwN,KAAKtB,EAAM9J,UAElCmF,EAAIkG,YACJlG,EAAIC,UAAYlE,EAAQwC,SAExB,IAAK,IAAIvD,EAAI,EAAGA,EAAIgL,EAAWhL,GAAK,EAAG,CAErC,MAAMC,EAAID,EAAIgL,EACRG,EAAKlL,EAAIA,EACTmL,EAAMD,EAAKlL,EACXoL,EAAI,EAAIpL,EACRqL,EAAKD,EAAIA,EACTE,EAAMD,EAAKD,EAEjB,IAAIvO,EAAIyO,EAAM5B,EAAMpK,WAAWzC,EAC/BA,GAAK,EAAIwO,EAAKrL,EAAI0J,EAAMlK,SAAS3C,EACjCA,GAAK,EAAIuO,EAAIF,EAAKxB,EAAMnK,SAAS1C,EACjCA,GAAKsO,EAAMzB,EAAMjK,SAAS5C,EAE1B,IAAIC,EAAIwO,EAAM5B,EAAMpK,WAAWxC,EAC/BA,GAAK,EAAIuO,EAAKrL,EAAI0J,EAAMlK,SAAS1C,EACjCA,GAAK,EAAIsO,EAAIF,EAAKxB,EAAMnK,SAASzC,EACjCA,GAAKqO,EAAMzB,EAAMjK,SAAS3C,EAE1B,MAAMoI,EAAQ1H,KAAK+N,IACjB7B,EAAMhK,WAAayL,EAAML,EACzBhK,EAAQmC,UAEV9F,KAAKuN,kBAAkB7N,EAAGC,EAAGoI,EAC9B,CAEDH,EAAIyG,YACJzG,EAAI0G,MACL,CAEO,QAAApD,CAASnI,EAAmBY,GAClC,MAAMiE,EAAM5H,KAAKwH,KACXO,EACJpE,EAAQuC,QAAU,EACdvC,EAAQuC,SACPvC,EAAQkC,SAAWlC,EAAQmC,UAAY,EAE9C8B,EAAIkG,YACJ9N,KAAKuN,kBAAkBxK,EAAMrD,EAAGqD,EAAMpD,EAAGoI,GACzCH,EAAIyG,YACJzG,EAAIC,UAAYlE,EAAQwC,SACxByB,EAAI0G,MACL,CAEO,SAAAtD,CACND,EACAwD,EACAC,GAEA,IAAK,MAAM5C,KAASb,EAAa,CAC/B,MAAMlK,OAAEA,GAAW+K,EACbG,EAAoB/L,KAAKmI,sBAAsByD,GAErD,GAAI/K,EAAO4B,OAAS,EAClB,IAAK,IAAIgM,EAAI,EAAGA,EAAI5N,EAAO4B,OAAQgM,GAAK,EAAG,CACzC,MAAMC,EAAa7N,EAAO4N,GACpB1L,EAAQ,IAAIvD,EAChBkP,EAAWhP,EACXgP,EAAW/O,EACX+O,EAAW9O,SACX8O,EAAW7O,MAGH,IAAN4O,GACFzO,KAAKkI,OAAO6D,GAGd,MAAMQ,EAAQvM,KAAKwM,UAAUzJ,EAAOgJ,GAEhCQ,GACFgC,EAAUhC,EAAOR,EAEpB,MAED/L,KAAKkI,OAAO6D,GAEZyC,EAAQ3N,EAAO,GAAIkL,EAEtB,CACF,CAEM,KAAAtC,EAAMkF,uBAAEA,GAAyB,GAAwB,CAAA,GAC9D,MAAM5D,EAAc/K,KAAKsE,MACnBqE,EAAQtI,KAAKiN,IAAIlG,OAAOwB,kBAAoB,EAAG,GAG/CgG,EAAO5O,KAAKiE,OAAO8D,MAAQY,EAC3BkG,EAAO7O,KAAKiE,OAAO+D,OAASW,EAC5BmG,EAAMvL,SAASwL,gBAAgB,6BAA8B,OAQnE,GANAD,EAAIE,aAAa,QAAS,8BAC1BF,EAAIE,aAAa,cAAe,gCAChCF,EAAIE,aAAa,UAAW,OAAmBJ,KAAQC,KACvDC,EAAIE,aAAa,QAASJ,EAAKK,YAC/BH,EAAIE,aAAa,SAAUH,EAAKI,YAE5BN,GAA0B3O,KAAKoG,gBAAiB,CAClD,MAAMuG,EAAOpJ,SAAS2L,cAAc,QACpCvC,EAAKqC,aAAa,QAAS,QAC3BrC,EAAKqC,aAAa,SAAU,QAC5BrC,EAAKqC,aAAa,OAAQhP,KAAKoG,iBAE/B0I,EAAIK,YAAYxC,EACjB,CA8CD,OA5CA3M,KAAKgL,UACHD,GAEA,CAACwB,GAASpG,eACR,MAAMiJ,EAAO7L,SAAS2L,cAAc,QAKpC,KACGpP,MAAMyM,EAAMlK,SAAS3C,IACrBI,MAAMyM,EAAMlK,SAAS1C,IACrBG,MAAMyM,EAAMnK,SAAS1C,IACrBI,MAAMyM,EAAMnK,SAASzC,IACtB,CACA,MAAM0P,EACJ,KAAK9C,EAAMpK,WAAWzC,EAAE4P,QAAQ,MAAM/C,EAAMpK,WAAWxC,EAAE2P,QACvD,QAEG/C,EAAMlK,SAAS3C,EAAE4P,QAAQ,MAAM/C,EAAMlK,SAAS1C,EAAE2P,QAAQ,MAC1D/C,EAAMnK,SAAS1C,EAAE4P,QAAQ,MAAM/C,EAAMnK,SAASzC,EAAE2P,QAAQ,MACxD/C,EAAMjK,SAAS5C,EAAE4P,QAAQ,MAAM/C,EAAMjK,SAAS3C,EAAE2P,QAAQ,KAC7DF,EAAKJ,aAAa,IAAKK,GACvBD,EAAKJ,aAAa,gBAAkC,KAAjBzC,EAAM/J,UAAiB8M,QAAQ,IAClEF,EAAKJ,aAAa,SAAU7I,GAC5BiJ,EAAKJ,aAAa,OAAQ,QAC1BI,EAAKJ,aAAa,iBAAkB,SAEpCF,EAAIK,YAAYC,EACjB,KAGH,CAACrM,GAASoD,WAAUD,UAASL,WAAUC,eACrC,MAAMyJ,EAAShM,SAAS2L,cAAc,UAChCM,EAAOtJ,EAAU,EAAIA,GAAWL,EAAWC,GAAY,EAC7DyJ,EAAOP,aAAa,IAAKQ,EAAKP,YAC9BM,EAAOP,aAAa,KAAMjM,EAAMrD,EAAEuP,YAClCM,EAAOP,aAAa,KAAMjM,EAAMpD,EAAEsP,YAClCM,EAAOP,aAAa,OAAQ7I,GAE5B2I,EAAIK,YAAYI,EAAO,IAIpBT,EAAIW,SACZ"}
1
+ {"version":3,"file":"signature_pad.umd.min.js","sources":["../src/point.ts","../src/bezier.ts","../src/signature_event_target.ts","../src/signature_pad.ts","../src/throttle.ts"],"sourcesContent":["// Interface for point data structure used e.g. in SignaturePad#fromData method\nexport interface BasicPoint {\n x: number;\n y: number;\n pressure: number;\n time: number;\n}\n\nexport class Point implements BasicPoint {\n public x: number;\n public y: number;\n public pressure: number;\n public time: number;\n\n constructor(x: number, y: number, pressure?: number, time?: number) {\n if (isNaN(x) || isNaN(y)) {\n throw new Error(`Point is invalid: (${x}, ${y})`);\n }\n this.x = +x;\n this.y = +y;\n this.pressure = pressure || 0;\n this.time = time || Date.now();\n }\n\n public distanceTo(start: BasicPoint): number {\n return Math.sqrt(\n Math.pow(this.x - start.x, 2) + Math.pow(this.y - start.y, 2),\n );\n }\n\n public equals(other: BasicPoint): boolean {\n return (\n this.x === other.x &&\n this.y === other.y &&\n this.pressure === other.pressure &&\n this.time === other.time\n );\n }\n\n public velocityFrom(start: BasicPoint): number {\n return this.time !== start.time\n ? this.distanceTo(start) / (this.time - start.time)\n : 0;\n }\n}\n","import { BasicPoint, Point } from './point';\n\nexport class Bezier {\n public static fromPoints(\n points: Point[],\n widths: { start: number; end: number },\n ): Bezier {\n const c2 = this.calculateControlPoints(points[0], points[1], points[2]).c2;\n const c3 = this.calculateControlPoints(points[1], points[2], points[3]).c1;\n\n return new Bezier(points[1], c2, c3, points[2], widths.start, widths.end);\n }\n\n private static calculateControlPoints(\n s1: BasicPoint,\n s2: BasicPoint,\n s3: BasicPoint,\n ): {\n c1: BasicPoint;\n c2: BasicPoint;\n } {\n const dx1 = s1.x - s2.x;\n const dy1 = s1.y - s2.y;\n const dx2 = s2.x - s3.x;\n const dy2 = s2.y - s3.y;\n\n const m1 = { x: (s1.x + s2.x) / 2.0, y: (s1.y + s2.y) / 2.0 };\n const m2 = { x: (s2.x + s3.x) / 2.0, y: (s2.y + s3.y) / 2.0 };\n\n const l1 = Math.sqrt(dx1 * dx1 + dy1 * dy1);\n const l2 = Math.sqrt(dx2 * dx2 + dy2 * dy2);\n\n const dxm = m1.x - m2.x;\n const dym = m1.y - m2.y;\n\n const k = l1 + l2 == 0 ? 0 : l2 / (l1 + l2);\n const cm = { x: m2.x + dxm * k, y: m2.y + dym * k };\n\n const tx = s2.x - cm.x;\n const ty = s2.y - cm.y;\n\n return {\n c1: new Point(m1.x + tx, m1.y + ty),\n c2: new Point(m2.x + tx, m2.y + ty),\n };\n }\n\n constructor(\n public startPoint: Point,\n public control2: BasicPoint,\n public control1: BasicPoint,\n public endPoint: Point,\n public startWidth: number,\n public endWidth: number,\n ) {}\n\n // Returns approximated length. Code taken from https://www.lemoda.net/maths/bezier-length/index.html.\n public length(): number {\n const steps = 10;\n let length = 0;\n let px;\n let py;\n\n for (let i = 0; i <= steps; i += 1) {\n const t = i / steps;\n const cx = this.point(\n t,\n this.startPoint.x,\n this.control1.x,\n this.control2.x,\n this.endPoint.x,\n );\n const cy = this.point(\n t,\n this.startPoint.y,\n this.control1.y,\n this.control2.y,\n this.endPoint.y,\n );\n\n if (i > 0) {\n const xdiff = cx - (px as number);\n const ydiff = cy - (py as number);\n\n length += Math.sqrt(xdiff * xdiff + ydiff * ydiff);\n }\n\n px = cx;\n py = cy;\n }\n\n return length;\n }\n\n // Calculate parametric value of x or y given t and the four point coordinates of a cubic bezier curve.\n private point(\n t: number,\n start: number,\n c1: number,\n c2: number,\n end: number,\n ): number {\n // prettier-ignore\n return ( start * (1.0 - t) * (1.0 - t) * (1.0 - t))\n + (3.0 * c1 * (1.0 - t) * (1.0 - t) * t)\n + (3.0 * c2 * (1.0 - t) * t * t)\n + ( end * t * t * t);\n }\n}\n","export class SignatureEventTarget {\n /* tslint:disable: variable-name */\n private _et: EventTarget;\n /* tslint:enable: variable-name */\n\n constructor() {\n try {\n this._et = new EventTarget();\n } catch {\n // Using document as EventTarget to support iOS 13 and older.\n // Because EventTarget constructor just exists at iOS 14 and later.\n this._et = document;\n }\n }\n\n addEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject | null,\n options?: boolean | AddEventListenerOptions,\n ): void {\n this._et.addEventListener(type, listener, options);\n }\n\n dispatchEvent(event: Event): boolean {\n return this._et.dispatchEvent(event);\n }\n\n removeEventListener(\n type: string,\n callback: EventListenerOrEventListenerObject | null,\n options?: boolean | EventListenerOptions,\n ): void {\n this._et.removeEventListener(type, callback, options);\n }\n}\n","/**\n * The main idea and some parts of the code (e.g. drawing variable width Bézier curve) are taken from:\n * http://corner.squareup.com/2012/07/smoother-signatures.html\n *\n * Implementation of interpolation using cubic Bézier curves is taken from:\n * https://web.archive.org/web/20160323213433/http://www.benknowscode.com/2012/09/path-interpolation-using-cubic-bezier_9742.html\n *\n * Algorithm for approximated length of a Bézier curve is taken from:\n * http://www.lemoda.net/maths/bezier-length/index.html\n */\n\nimport { Bezier } from './bezier';\nimport { BasicPoint, Point } from './point';\nimport { SignatureEventTarget } from './signature_event_target';\nimport { throttle } from './throttle';\n\nexport { BasicPoint } from './point';\n\nexport interface SignatureEvent {\n event: MouseEvent | TouchEvent | PointerEvent;\n type: string;\n x: number;\n y: number;\n pressure: number;\n}\n\nexport interface FromDataOptions {\n clear?: boolean;\n}\n\nexport interface ToSVGOptions {\n includeBackgroundColor?: boolean;\n}\n\nexport interface PointGroupOptions {\n dotSize: number;\n minWidth: number;\n maxWidth: number;\n penColor: string;\n velocityFilterWeight: number;\n /**\n * This is the globalCompositeOperation for the line.\n * *default: 'source-over'*\n * @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation\n */\n compositeOperation: GlobalCompositeOperation;\n}\n\nexport interface Options extends Partial<PointGroupOptions> {\n minDistance?: number;\n backgroundColor?: string;\n throttle?: number;\n canvasContextOptions?: CanvasRenderingContext2DSettings;\n}\n\nexport interface PointGroup extends PointGroupOptions {\n points: BasicPoint[];\n}\n\nexport default class SignaturePad extends SignatureEventTarget {\n // Public stuff\n public dotSize: number;\n public minWidth: number;\n public maxWidth: number;\n public penColor: string;\n public minDistance: number;\n public velocityFilterWeight: number;\n public compositeOperation: GlobalCompositeOperation;\n public backgroundColor: string;\n public throttle: number;\n public canvasContextOptions: CanvasRenderingContext2DSettings;\n\n // Private stuff\n /* tslint:disable: variable-name */\n private _ctx: CanvasRenderingContext2D;\n private _drawingStroke = false;\n private _isEmpty = true;\n private _lastPoints: Point[] = []; // Stores up to 4 most recent points; used to generate a new curve\n private _data: PointGroup[] = []; // Stores all points in groups (one group per line or dot)\n private _lastVelocity = 0;\n private _lastWidth = 0;\n private _strokeMoveUpdate: (event: SignatureEvent) => void;\n private _strokePointerId: number | undefined;\n /* tslint:enable: variable-name */\n\n constructor(\n private canvas: HTMLCanvasElement,\n options: Options = {},\n ) {\n super();\n this.velocityFilterWeight = options.velocityFilterWeight || 0.7;\n this.minWidth = options.minWidth || 0.5;\n this.maxWidth = options.maxWidth || 2.5;\n\n // We need to handle 0 value, so use `??` instead of `||`\n this.throttle = options.throttle ?? 16; // in milliseconds\n this.minDistance = options.minDistance ?? 5; // in pixels\n this.dotSize = options.dotSize || 0;\n this.penColor = options.penColor || 'black';\n this.backgroundColor = options.backgroundColor || 'rgba(0,0,0,0)';\n this.compositeOperation = options.compositeOperation || 'source-over';\n this.canvasContextOptions = options.canvasContextOptions ?? {};\n\n this._strokeMoveUpdate = this.throttle\n ? throttle(SignaturePad.prototype._strokeUpdate, this.throttle)\n : SignaturePad.prototype._strokeUpdate;\n\n this._handleMouseDown = this._handleMouseDown.bind(this);\n this._handleMouseMove = this._handleMouseMove.bind(this);\n this._handleMouseUp = this._handleMouseUp.bind(this);\n this._handleTouchStart = this._handleTouchStart.bind(this);\n this._handleTouchMove = this._handleTouchMove.bind(this);\n this._handleTouchEnd = this._handleTouchEnd.bind(this);\n this._handlePointerDown = this._handlePointerDown.bind(this);\n this._handlePointerMove = this._handlePointerMove.bind(this);\n this._handlePointerUp = this._handlePointerUp.bind(this);\n\n this._ctx = canvas.getContext(\n '2d',\n this.canvasContextOptions,\n ) as CanvasRenderingContext2D;\n\n this.clear();\n\n // Enable mouse and touch event handlers\n this.on();\n }\n\n public clear(): void {\n const { _ctx: ctx, canvas } = this;\n\n // Clear canvas using background color\n ctx.fillStyle = this.backgroundColor;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n this._data = [];\n this._reset(this._getPointGroupOptions());\n this._isEmpty = true;\n this._strokePointerId = undefined;\n }\n\n public fromDataURL(\n dataUrl: string,\n options: {\n ratio?: number;\n width?: number;\n height?: number;\n xOffset?: number;\n yOffset?: number;\n } = {},\n ): Promise<void> {\n return new Promise((resolve, reject) => {\n const image = new Image();\n const ratio = options.ratio || window.devicePixelRatio || 1;\n const width = options.width || this.canvas.width / ratio;\n const height = options.height || this.canvas.height / ratio;\n const xOffset = options.xOffset || 0;\n const yOffset = options.yOffset || 0;\n\n this._reset(this._getPointGroupOptions());\n\n image.onload = (): void => {\n this._ctx.drawImage(image, xOffset, yOffset, width, height);\n resolve();\n };\n image.onerror = (error): void => {\n reject(error);\n };\n image.crossOrigin = 'anonymous';\n image.src = dataUrl;\n\n this._isEmpty = false;\n });\n }\n\n public toDataURL(\n type: 'image/svg+xml',\n encoderOptions?: ToSVGOptions,\n ): string;\n public toDataURL(type?: string, encoderOptions?: number): string;\n public toDataURL(\n type = 'image/png',\n encoderOptions?: number | ToSVGOptions | undefined,\n ): string {\n switch (type) {\n case 'image/svg+xml':\n if (typeof encoderOptions !== 'object') {\n encoderOptions = undefined;\n }\n return `data:image/svg+xml;base64,${btoa(\n this.toSVG(encoderOptions as ToSVGOptions),\n )}`;\n default:\n if (typeof encoderOptions !== 'number') {\n encoderOptions = undefined;\n }\n return this.canvas.toDataURL(type, encoderOptions as number);\n }\n }\n\n public on(): void {\n // Disable panning/zooming when touching canvas element\n this.canvas.style.touchAction = 'none';\n (\n this.canvas.style as CSSStyleDeclaration & {\n msTouchAction: string | null;\n }\n ).msTouchAction = 'none';\n this.canvas.style.userSelect = 'none';\n\n const isIOS =\n /Macintosh/.test(navigator.userAgent) && 'ontouchstart' in document;\n\n // The \"Scribble\" feature of iOS intercepts point events. So that we can\n // lose some of them when tapping rapidly. Use touch events for iOS\n // platforms to prevent it. See\n // https://developer.apple.com/forums/thread/664108 for more information.\n if (window.PointerEvent && !isIOS) {\n this._handlePointerEvents();\n } else {\n this._handleMouseEvents();\n\n if ('ontouchstart' in window) {\n this._handleTouchEvents();\n }\n }\n }\n\n public off(): void {\n // Enable panning/zooming when touching canvas element\n this.canvas.style.touchAction = 'auto';\n (\n this.canvas.style as CSSStyleDeclaration & {\n msTouchAction: string | null;\n }\n ).msTouchAction = 'auto';\n this.canvas.style.userSelect = 'auto';\n\n this.canvas.removeEventListener('pointerdown', this._handlePointerDown);\n this.canvas.removeEventListener('mousedown', this._handleMouseDown);\n this.canvas.removeEventListener('touchstart', this._handleTouchStart);\n\n this._removeMoveUpEventListeners();\n }\n\n private _getListenerFunctions() {\n const canvasWindow =\n window.document === this.canvas.ownerDocument\n ? window\n : (this.canvas.ownerDocument.defaultView ?? this.canvas.ownerDocument);\n\n return {\n addEventListener: canvasWindow.addEventListener.bind(\n canvasWindow,\n ) as typeof window.addEventListener,\n removeEventListener: canvasWindow.removeEventListener.bind(\n canvasWindow,\n ) as typeof window.removeEventListener,\n };\n }\n\n private _removeMoveUpEventListeners(): void {\n const { removeEventListener } = this._getListenerFunctions();\n removeEventListener('pointermove', this._handlePointerMove);\n removeEventListener('pointerup', this._handlePointerUp);\n\n removeEventListener('mousemove', this._handleMouseMove);\n removeEventListener('mouseup', this._handleMouseUp);\n\n removeEventListener('touchmove', this._handleTouchMove);\n removeEventListener('touchend', this._handleTouchEnd);\n }\n\n public isEmpty(): boolean {\n return this._isEmpty;\n }\n\n public fromData(\n pointGroups: PointGroup[],\n { clear = true }: FromDataOptions = {},\n ): void {\n if (clear) {\n this.clear();\n }\n\n this._fromData(\n pointGroups,\n this._drawCurve.bind(this),\n this._drawDot.bind(this),\n );\n\n this._data = this._data.concat(pointGroups);\n }\n\n public toData(): PointGroup[] {\n return this._data;\n }\n\n private _isLeftButtonPressed(event: MouseEvent, only?: boolean): boolean {\n if (only) {\n return event.buttons === 1;\n }\n\n return (event.buttons & 1) === 1;\n }\n private _pointerEventToSignatureEvent(\n event: MouseEvent | PointerEvent,\n ): SignatureEvent {\n return {\n event: event,\n type: event.type,\n x: event.clientX,\n y: event.clientY,\n pressure: 'pressure' in event ? event.pressure : 0,\n };\n }\n\n private _touchEventToSignatureEvent(event: TouchEvent): SignatureEvent {\n const touch = event.changedTouches[0];\n return {\n event: event,\n type: event.type,\n x: touch.clientX,\n y: touch.clientY,\n pressure: touch.force,\n };\n }\n\n // Event handlers\n private _handleMouseDown(event: MouseEvent): void {\n if (!this._isLeftButtonPressed(event, true) || this._drawingStroke) {\n return;\n }\n this._strokeBegin(this._pointerEventToSignatureEvent(event));\n };\n\n private _handleMouseMove(event: MouseEvent): void {\n if (!this._isLeftButtonPressed(event, true) || !this._drawingStroke) {\n // Stop when not pressing primary button or pressing multiple buttons\n this._strokeEnd(this._pointerEventToSignatureEvent(event), false);\n return;\n }\n\n this._strokeMoveUpdate(this._pointerEventToSignatureEvent(event));\n };\n\n private _handleMouseUp(event: MouseEvent): void {\n if (this._isLeftButtonPressed(event)) {\n return;\n }\n\n this._strokeEnd(this._pointerEventToSignatureEvent(event));\n };\n\n private _handleTouchStart(event: TouchEvent): void {\n if (event.targetTouches.length !== 1 || this._drawingStroke) {\n return;\n }\n\n // Prevent scrolling.\n if (event.cancelable) {\n event.preventDefault();\n }\n\n this._strokeBegin(this._touchEventToSignatureEvent(event));\n };\n\n private _handleTouchMove(event: TouchEvent): void {\n if (event.targetTouches.length !== 1) {\n return;\n }\n\n // Prevent scrolling.\n if (event.cancelable) {\n event.preventDefault();\n }\n\n if (!this._drawingStroke) {\n this._strokeEnd(this._touchEventToSignatureEvent(event), false);\n return;\n }\n\n this._strokeMoveUpdate(this._touchEventToSignatureEvent(event));\n };\n\n private _handleTouchEnd(event: TouchEvent): void {\n if (event.targetTouches.length !== 0) {\n return;\n }\n\n if (event.cancelable) {\n event.preventDefault();\n }\n\n this._strokeEnd(this._touchEventToSignatureEvent(event));\n };\n\n private _getPointerId(event: PointerEvent) {\n // @ts-expect-error persistentDeviceId is not available yet but we want to use it when it is available\n return event.persistentDeviceId || event.pointerId;\n }\n\n private _allowPointerId(event: PointerEvent, allowUndefined = false): boolean {\n if (typeof this._strokePointerId === 'undefined') {\n return allowUndefined;\n }\n\n return this._getPointerId(event) === this._strokePointerId;\n }\n\n private _handlePointerDown(event: PointerEvent): void {\n if (\n this._drawingStroke ||\n !this._isLeftButtonPressed(event) ||\n !this._allowPointerId(event, true)\n ) {\n return;\n }\n\n this._strokePointerId = this._getPointerId(event);\n\n event.preventDefault();\n\n this._strokeBegin(this._pointerEventToSignatureEvent(event));\n };\n\n private _handlePointerMove(event: PointerEvent): void {\n if (!this._allowPointerId(event)) {\n return;\n }\n if (!this._isLeftButtonPressed(event, true) || !this._drawingStroke) {\n // Stop when primary button not pressed or multiple buttons pressed\n this._strokeEnd(this._pointerEventToSignatureEvent(event), false);\n return;\n }\n\n event.preventDefault();\n this._strokeMoveUpdate(this._pointerEventToSignatureEvent(event));\n };\n\n private _handlePointerUp(event: PointerEvent): void {\n if (\n this._isLeftButtonPressed(event) ||\n !this._allowPointerId(event)\n ) {\n return;\n }\n\n event.preventDefault();\n this._strokeEnd(this._pointerEventToSignatureEvent(event));\n };\n\n private _getPointGroupOptions(group?: PointGroup): PointGroupOptions {\n return {\n penColor: group && 'penColor' in group ? group.penColor : this.penColor,\n dotSize: group && 'dotSize' in group ? group.dotSize : this.dotSize,\n minWidth: group && 'minWidth' in group ? group.minWidth : this.minWidth,\n maxWidth: group && 'maxWidth' in group ? group.maxWidth : this.maxWidth,\n velocityFilterWeight:\n group && 'velocityFilterWeight' in group\n ? group.velocityFilterWeight\n : this.velocityFilterWeight,\n compositeOperation:\n group && 'compositeOperation' in group\n ? group.compositeOperation\n : this.compositeOperation,\n };\n }\n\n // Private methods\n private _strokeBegin(event: SignatureEvent): void {\n const cancelled = !this.dispatchEvent(\n new CustomEvent('beginStroke', { detail: event, cancelable: true }),\n );\n if (cancelled) {\n return;\n }\n\n const { addEventListener } = this._getListenerFunctions();\n switch (event.event.type) {\n case 'mousedown':\n addEventListener('mousemove', this._handleMouseMove, {\n passive: false,\n });\n addEventListener('mouseup', this._handleMouseUp, { passive: false });\n break;\n case 'touchstart':\n addEventListener('touchmove', this._handleTouchMove, {\n passive: false,\n });\n addEventListener('touchend', this._handleTouchEnd, { passive: false });\n break;\n case 'pointerdown':\n addEventListener('pointermove', this._handlePointerMove, {\n passive: false,\n });\n addEventListener('pointerup', this._handlePointerUp, {\n passive: false,\n });\n break;\n default:\n // do nothing\n }\n\n this._drawingStroke = true;\n\n const pointGroupOptions = this._getPointGroupOptions();\n\n const newPointGroup: PointGroup = {\n ...pointGroupOptions,\n points: [],\n };\n\n this._data.push(newPointGroup);\n this._reset(pointGroupOptions);\n this._strokeUpdate(event);\n }\n\n private _strokeUpdate(event: SignatureEvent): void {\n if (!this._drawingStroke) {\n return;\n }\n\n if (this._data.length === 0) {\n // This can happen if clear() was called while a signature is still in progress,\n // or if there is a race condition between start/update events.\n this._strokeBegin(event);\n return;\n }\n\n this.dispatchEvent(\n new CustomEvent('beforeUpdateStroke', { detail: event }),\n );\n\n const point = this._createPoint(event.x, event.y, event.pressure);\n const lastPointGroup = this._data[this._data.length - 1];\n const lastPoints = lastPointGroup.points;\n const lastPoint =\n lastPoints.length > 0 && lastPoints[lastPoints.length - 1];\n const isLastPointTooClose = lastPoint\n ? point.distanceTo(lastPoint) <= this.minDistance\n : false;\n const pointGroupOptions = this._getPointGroupOptions(lastPointGroup);\n\n // Skip this point if it's too close to the previous one\n if (!lastPoint || !(lastPoint && isLastPointTooClose)) {\n const curve = this._addPoint(point, pointGroupOptions);\n\n if (!lastPoint) {\n this._drawDot(point, pointGroupOptions);\n } else if (curve) {\n this._drawCurve(curve, pointGroupOptions);\n }\n\n lastPoints.push({\n time: point.time,\n x: point.x,\n y: point.y,\n pressure: point.pressure,\n });\n }\n\n this.dispatchEvent(new CustomEvent('afterUpdateStroke', { detail: event }));\n }\n\n private _strokeEnd(event: SignatureEvent, shouldUpdate = true): void {\n this._removeMoveUpEventListeners();\n\n if (!this._drawingStroke) {\n return;\n }\n\n if (shouldUpdate) {\n this._strokeUpdate(event);\n }\n\n this._drawingStroke = false;\n this._strokePointerId = undefined;\n this.dispatchEvent(new CustomEvent('endStroke', { detail: event }));\n }\n\n private _handlePointerEvents(): void {\n this._drawingStroke = false;\n\n this.canvas.addEventListener('pointerdown', this._handlePointerDown, {\n passive: false,\n });\n }\n\n private _handleMouseEvents(): void {\n this._drawingStroke = false;\n\n this.canvas.addEventListener('mousedown', this._handleMouseDown, {\n passive: false,\n });\n }\n\n private _handleTouchEvents(): void {\n this.canvas.addEventListener('touchstart', this._handleTouchStart, {\n passive: false,\n });\n }\n\n // Called when a new line is started\n private _reset(options: PointGroupOptions): void {\n this._lastPoints = [];\n this._lastVelocity = 0;\n this._lastWidth = (options.minWidth + options.maxWidth) / 2;\n this._ctx.fillStyle = options.penColor;\n this._ctx.globalCompositeOperation = options.compositeOperation;\n }\n\n private _createPoint(x: number, y: number, pressure: number): Point {\n const rect = this.canvas.getBoundingClientRect();\n\n return new Point(\n x - rect.left,\n y - rect.top,\n pressure,\n new Date().getTime(),\n );\n }\n\n // Add point to _lastPoints array and generate a new curve if there are enough points (i.e. 3)\n private _addPoint(point: Point, options: PointGroupOptions): Bezier | null {\n const { _lastPoints } = this;\n\n _lastPoints.push(point);\n\n if (_lastPoints.length > 2) {\n // To reduce the initial lag make it work with 3 points\n // by copying the first point to the beginning.\n if (_lastPoints.length === 3) {\n _lastPoints.unshift(_lastPoints[0]);\n }\n\n // _points array will always have 4 points here.\n const widths = this._calculateCurveWidths(\n _lastPoints[1],\n _lastPoints[2],\n options,\n );\n const curve = Bezier.fromPoints(_lastPoints, widths);\n\n // Remove the first element from the list, so that there are no more than 4 points at any time.\n _lastPoints.shift();\n\n return curve;\n }\n\n return null;\n }\n\n private _calculateCurveWidths(\n startPoint: Point,\n endPoint: Point,\n options: PointGroupOptions,\n ): { start: number; end: number } {\n const velocity =\n options.velocityFilterWeight * endPoint.velocityFrom(startPoint) +\n (1 - options.velocityFilterWeight) * this._lastVelocity;\n\n const newWidth = this._strokeWidth(velocity, options);\n\n const widths = {\n end: newWidth,\n start: this._lastWidth,\n };\n\n this._lastVelocity = velocity;\n this._lastWidth = newWidth;\n\n return widths;\n }\n\n private _strokeWidth(velocity: number, options: PointGroupOptions): number {\n return Math.max(options.maxWidth / (velocity + 1), options.minWidth);\n }\n\n private _drawCurveSegment(x: number, y: number, width: number): void {\n const ctx = this._ctx;\n\n ctx.moveTo(x, y);\n ctx.arc(x, y, width, 0, 2 * Math.PI, false);\n this._isEmpty = false;\n }\n\n private _drawCurve(curve: Bezier, options: PointGroupOptions): void {\n const ctx = this._ctx;\n const widthDelta = curve.endWidth - curve.startWidth;\n // '2' is just an arbitrary number here. If only length is used, then\n // there are gaps between curve segments :/\n const drawSteps = Math.ceil(curve.length()) * 2;\n\n ctx.beginPath();\n ctx.fillStyle = options.penColor;\n\n for (let i = 0; i < drawSteps; i += 1) {\n // Calculate the Bezier (x, y) coordinate for this step.\n const t = i / drawSteps;\n const tt = t * t;\n const ttt = tt * t;\n const u = 1 - t;\n const uu = u * u;\n const uuu = uu * u;\n\n let x = uuu * curve.startPoint.x;\n x += 3 * uu * t * curve.control1.x;\n x += 3 * u * tt * curve.control2.x;\n x += ttt * curve.endPoint.x;\n\n let y = uuu * curve.startPoint.y;\n y += 3 * uu * t * curve.control1.y;\n y += 3 * u * tt * curve.control2.y;\n y += ttt * curve.endPoint.y;\n\n const width = Math.min(\n curve.startWidth + ttt * widthDelta,\n options.maxWidth,\n );\n this._drawCurveSegment(x, y, width);\n }\n\n ctx.closePath();\n ctx.fill();\n }\n\n private _drawDot(point: BasicPoint, options: PointGroupOptions): void {\n const ctx = this._ctx;\n const width =\n options.dotSize > 0\n ? options.dotSize\n : (options.minWidth + options.maxWidth) / 2;\n\n ctx.beginPath();\n this._drawCurveSegment(point.x, point.y, width);\n ctx.closePath();\n ctx.fillStyle = options.penColor;\n ctx.fill();\n }\n\n private _fromData(\n pointGroups: PointGroup[],\n drawCurve: SignaturePad['_drawCurve'],\n drawDot: SignaturePad['_drawDot'],\n ): void {\n for (const group of pointGroups) {\n const { points } = group;\n const pointGroupOptions = this._getPointGroupOptions(group);\n\n if (points.length > 1) {\n for (let j = 0; j < points.length; j += 1) {\n const basicPoint = points[j];\n const point = new Point(\n basicPoint.x,\n basicPoint.y,\n basicPoint.pressure,\n basicPoint.time,\n );\n\n if (j === 0) {\n this._reset(pointGroupOptions);\n }\n\n const curve = this._addPoint(point, pointGroupOptions);\n\n if (curve) {\n drawCurve(curve, pointGroupOptions);\n }\n }\n } else {\n this._reset(pointGroupOptions);\n\n drawDot(points[0], pointGroupOptions);\n }\n }\n }\n\n public toSVG({ includeBackgroundColor = false }: ToSVGOptions = {}): string {\n const pointGroups = this._data;\n const ratio = Math.max(window.devicePixelRatio || 1, 1);\n const minX = 0;\n const minY = 0;\n const maxX = this.canvas.width / ratio;\n const maxY = this.canvas.height / ratio;\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n\n svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n svg.setAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink');\n svg.setAttribute('viewBox', `${minX} ${minY} ${maxX} ${maxY}`);\n svg.setAttribute('width', maxX.toString());\n svg.setAttribute('height', maxY.toString());\n\n if (includeBackgroundColor && this.backgroundColor) {\n const rect = document.createElement('rect');\n rect.setAttribute('width', '100%');\n rect.setAttribute('height', '100%');\n rect.setAttribute('fill', this.backgroundColor);\n\n svg.appendChild(rect);\n }\n\n this._fromData(\n pointGroups,\n\n (curve, { penColor }) => {\n const path = document.createElement('path');\n\n // Need to check curve for NaN values, these pop up when drawing\n // lines on the canvas that are not continuous. E.g. Sharp corners\n // or stopping mid-stroke and than continuing without lifting mouse.\n if (\n !isNaN(curve.control1.x) &&\n !isNaN(curve.control1.y) &&\n !isNaN(curve.control2.x) &&\n !isNaN(curve.control2.y)\n ) {\n const attr =\n `M ${curve.startPoint.x.toFixed(3)},${curve.startPoint.y.toFixed(\n 3,\n )} ` +\n `C ${curve.control1.x.toFixed(3)},${curve.control1.y.toFixed(3)} ` +\n `${curve.control2.x.toFixed(3)},${curve.control2.y.toFixed(3)} ` +\n `${curve.endPoint.x.toFixed(3)},${curve.endPoint.y.toFixed(3)}`;\n path.setAttribute('d', attr);\n path.setAttribute('stroke-width', (curve.endWidth * 2.25).toFixed(3));\n path.setAttribute('stroke', penColor);\n path.setAttribute('fill', 'none');\n path.setAttribute('stroke-linecap', 'round');\n\n svg.appendChild(path);\n }\n },\n\n (point, { penColor, dotSize, minWidth, maxWidth }) => {\n const circle = document.createElement('circle');\n const size = dotSize > 0 ? dotSize : (minWidth + maxWidth) / 2;\n circle.setAttribute('r', size.toString());\n circle.setAttribute('cx', point.x.toString());\n circle.setAttribute('cy', point.y.toString());\n circle.setAttribute('fill', penColor);\n\n svg.appendChild(circle);\n },\n );\n\n return svg.outerHTML;\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-this-alias */\n// Slightly simplified version of http://stackoverflow.com/a/27078401/815507\n\nexport function throttle(\n fn: (...args: any[]) => any,\n wait = 250,\n): (this: any, ...args: any[]) => any {\n let previous = 0;\n let timeout: number | null = null;\n let result: any;\n let storedContext: any;\n let storedArgs: any[];\n\n const later = (): void => {\n previous = Date.now();\n timeout = null;\n result = fn.apply(storedContext, storedArgs);\n\n if (!timeout) {\n storedContext = null;\n storedArgs = [];\n }\n };\n\n return function wrapper(this: any, ...args: any[]): any {\n const now = Date.now();\n const remaining = wait - (now - previous);\n\n storedContext = this;\n storedArgs = args;\n\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n\n previous = now;\n result = fn.apply(storedContext, storedArgs);\n\n if (!timeout) {\n storedContext = null;\n storedArgs = [];\n }\n } else if (!timeout) {\n timeout = window.setTimeout(later, remaining);\n }\n\n return result;\n };\n}\n"],"names":["Point","constructor","x","y","pressure","time","isNaN","Error","this","Date","now","distanceTo","start","Math","sqrt","pow","equals","other","velocityFrom","Bezier","fromPoints","points","widths","c2","calculateControlPoints","c3","c1","end","s1","s2","s3","dx1","dy1","dx2","dy2","m1","m2","l1","l2","k","cm","tx","ty","startPoint","control2","control1","endPoint","startWidth","endWidth","length","px","py","i","t","cx","point","cy","xdiff","ydiff","SignatureEventTarget","_et","EventTarget","_a","document","addEventListener","type","listener","options","dispatchEvent","event","removeEventListener","callback","SignaturePad","canvas","super","_drawingStroke","_isEmpty","_lastPoints","_data","_lastVelocity","_lastWidth","velocityFilterWeight","minWidth","maxWidth","throttle","minDistance","_b","dotSize","penColor","backgroundColor","compositeOperation","canvasContextOptions","_c","_strokeMoveUpdate","fn","wait","result","storedContext","storedArgs","previous","timeout","later","apply","args","remaining","clearTimeout","window","setTimeout","prototype","_strokeUpdate","_handleMouseDown","bind","_handleMouseMove","_handleMouseUp","_handleTouchStart","_handleTouchMove","_handleTouchEnd","_handlePointerDown","_handlePointerMove","_handlePointerUp","_ctx","getContext","clear","on","ctx","fillStyle","clearRect","width","height","fillRect","_reset","_getPointGroupOptions","_strokePointerId","undefined","fromDataURL","dataUrl","Promise","resolve","reject","image","Image","ratio","devicePixelRatio","xOffset","yOffset","onload","drawImage","onerror","error","crossOrigin","src","toDataURL","encoderOptions","btoa","toSVG","style","touchAction","msTouchAction","userSelect","isIOS","test","navigator","userAgent","PointerEvent","_handlePointerEvents","_handleMouseEvents","_handleTouchEvents","off","_removeMoveUpEventListeners","_getListenerFunctions","canvasWindow","ownerDocument","defaultView","isEmpty","fromData","pointGroups","_fromData","_drawCurve","_drawDot","concat","toData","_isLeftButtonPressed","only","buttons","_pointerEventToSignatureEvent","clientX","clientY","_touchEventToSignatureEvent","touch","changedTouches","force","_strokeBegin","_strokeEnd","targetTouches","cancelable","preventDefault","_getPointerId","persistentDeviceId","pointerId","_allowPointerId","allowUndefined","group","CustomEvent","detail","passive","pointGroupOptions","newPointGroup","push","_createPoint","lastPointGroup","lastPoints","lastPoint","isLastPointTooClose","curve","_addPoint","shouldUpdate","globalCompositeOperation","rect","getBoundingClientRect","left","top","getTime","unshift","_calculateCurveWidths","shift","velocity","newWidth","_strokeWidth","max","_drawCurveSegment","moveTo","arc","PI","widthDelta","drawSteps","ceil","beginPath","tt","ttt","u","uu","uuu","min","closePath","fill","drawCurve","drawDot","j","basicPoint","includeBackgroundColor","maxX","maxY","svg","createElementNS","setAttribute","toString","createElement","appendChild","path","attr","toFixed","circle","size","outerHTML"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "signature_pad",
3
3
  "description": "Library for drawing smooth signatures.",
4
- "version": "5.0.7",
4
+ "version": "5.0.10",
5
5
  "homepage": "https://github.com/szimek/signature_pad",
6
6
  "author": {
7
7
  "name": "Szymon Nowak",
@@ -41,34 +41,34 @@
41
41
  "docs"
42
42
  ],
43
43
  "devDependencies": {
44
- "@eslint/js": "^9.12.0",
44
+ "@eslint/js": "^9.28.0",
45
45
  "@rollup/plugin-terser": "^0.4.4",
46
- "@rollup/plugin-typescript": "^12.1.1",
46
+ "@rollup/plugin-typescript": "^12.1.2",
47
47
  "@semantic-release/changelog": "^6.0.3",
48
- "@semantic-release/commit-analyzer": "^13.0.0",
48
+ "@semantic-release/commit-analyzer": "^13.0.1",
49
49
  "@semantic-release/git": "^10.0.1",
50
- "@semantic-release/github": "^11.0.0",
50
+ "@semantic-release/github": "^11.0.3",
51
51
  "@semantic-release/npm": "^12.0.1",
52
- "@semantic-release/release-notes-generator": "^14.0.1",
53
- "@types/jest": "^29.5.13",
54
- "@types/node": "^22.7.6",
52
+ "@semantic-release/release-notes-generator": "^14.0.3",
53
+ "@types/jest": "^29.5.14",
54
+ "@types/node": "^22.15.29",
55
55
  "cpy-cli": "^5.0.0",
56
56
  "del": "^8.0.0",
57
57
  "del-cli": "^6.0.0",
58
- "eslint": "^9.12.0",
59
- "eslint-config-prettier": "^9.1.0",
60
- "globals": "^15.11.0",
58
+ "eslint": "^9.28.0",
59
+ "eslint-config-prettier": "^10.1.5",
60
+ "globals": "^16.2.0",
61
61
  "jest": "^29.7.0",
62
62
  "jest-canvas-mock": "^2.5.2",
63
63
  "jest-environment-jsdom": "^29.7.0",
64
- "prettier": "^3.3.3",
65
- "rollup": "^4.24.0",
66
- "semantic-release": "^24.1.2",
64
+ "prettier": "^3.5.3",
65
+ "rollup": "^4.41.1",
66
+ "semantic-release": "^24.2.5",
67
67
  "serve": "^14.2.4",
68
- "ts-jest": "^29.2.5",
69
- "tslib": "^2.8.0",
70
- "typescript": "~5.6.3",
71
- "typescript-eslint": "^8.9.0"
68
+ "ts-jest": "^29.3.4",
69
+ "tslib": "^2.8.1",
70
+ "typescript": "~5.8.3",
71
+ "typescript-eslint": "^8.33.1"
72
72
  },
73
73
  "jest": {
74
74
  "moduleFileExtensions": [
@@ -100,5 +100,5 @@
100
100
  "@semantic-release/git"
101
101
  ]
102
102
  },
103
- "packageManager": "yarn@4.2.1"
103
+ "packageManager": "yarn@4.9.2"
104
104
  }
@@ -80,6 +80,7 @@ export default class SignaturePad extends SignatureEventTarget {
80
80
  private _lastVelocity = 0;
81
81
  private _lastWidth = 0;
82
82
  private _strokeMoveUpdate: (event: SignatureEvent) => void;
83
+ private _strokePointerId: number | undefined;
83
84
  /* tslint:enable: variable-name */
84
85
 
85
86
  constructor(
@@ -103,6 +104,17 @@ export default class SignaturePad extends SignatureEventTarget {
103
104
  this._strokeMoveUpdate = this.throttle
104
105
  ? throttle(SignaturePad.prototype._strokeUpdate, this.throttle)
105
106
  : SignaturePad.prototype._strokeUpdate;
107
+
108
+ this._handleMouseDown = this._handleMouseDown.bind(this);
109
+ this._handleMouseMove = this._handleMouseMove.bind(this);
110
+ this._handleMouseUp = this._handleMouseUp.bind(this);
111
+ this._handleTouchStart = this._handleTouchStart.bind(this);
112
+ this._handleTouchMove = this._handleTouchMove.bind(this);
113
+ this._handleTouchEnd = this._handleTouchEnd.bind(this);
114
+ this._handlePointerDown = this._handlePointerDown.bind(this);
115
+ this._handlePointerMove = this._handlePointerMove.bind(this);
116
+ this._handlePointerUp = this._handlePointerUp.bind(this);
117
+
106
118
  this._ctx = canvas.getContext(
107
119
  '2d',
108
120
  this.canvasContextOptions,
@@ -125,6 +137,7 @@ export default class SignaturePad extends SignatureEventTarget {
125
137
  this._data = [];
126
138
  this._reset(this._getPointGroupOptions());
127
139
  this._isEmpty = true;
140
+ this._strokePointerId = undefined;
128
141
  }
129
142
 
130
143
  public fromDataURL(
@@ -182,14 +195,18 @@ export default class SignaturePad extends SignatureEventTarget {
182
195
  if (typeof encoderOptions !== 'number') {
183
196
  encoderOptions = undefined;
184
197
  }
185
- return this.canvas.toDataURL(type, encoderOptions);
198
+ return this.canvas.toDataURL(type, encoderOptions as number);
186
199
  }
187
200
  }
188
201
 
189
202
  public on(): void {
190
203
  // Disable panning/zooming when touching canvas element
191
204
  this.canvas.style.touchAction = 'none';
192
- (this.canvas.style as CSSStyleDeclaration & { msTouchAction: string | null }).msTouchAction = 'none';
205
+ (
206
+ this.canvas.style as CSSStyleDeclaration & {
207
+ msTouchAction: string | null;
208
+ }
209
+ ).msTouchAction = 'none';
193
210
  this.canvas.style.userSelect = 'none';
194
211
 
195
212
  const isIOS =
@@ -213,7 +230,11 @@ export default class SignaturePad extends SignatureEventTarget {
213
230
  public off(): void {
214
231
  // Enable panning/zooming when touching canvas element
215
232
  this.canvas.style.touchAction = 'auto';
216
- (this.canvas.style as CSSStyleDeclaration & { msTouchAction: string | null }).msTouchAction = 'auto';
233
+ (
234
+ this.canvas.style as CSSStyleDeclaration & {
235
+ msTouchAction: string | null;
236
+ }
237
+ ).msTouchAction = 'auto';
217
238
  this.canvas.style.userSelect = 'auto';
218
239
 
219
240
  this.canvas.removeEventListener('pointerdown', this._handlePointerDown);
@@ -227,7 +248,7 @@ export default class SignaturePad extends SignatureEventTarget {
227
248
  const canvasWindow =
228
249
  window.document === this.canvas.ownerDocument
229
250
  ? window
230
- : this.canvas.ownerDocument.defaultView ?? this.canvas.ownerDocument;
251
+ : (this.canvas.ownerDocument.defaultView ?? this.canvas.ownerDocument);
231
252
 
232
253
  return {
233
254
  addEventListener: canvasWindow.addEventListener.bind(
@@ -276,7 +297,7 @@ export default class SignaturePad extends SignatureEventTarget {
276
297
  return this._data;
277
298
  }
278
299
 
279
- public _isLeftButtonPressed(event: MouseEvent, only?: boolean): boolean {
300
+ private _isLeftButtonPressed(event: MouseEvent, only?: boolean): boolean {
280
301
  if (only) {
281
302
  return event.buttons === 1;
282
303
  }
@@ -307,14 +328,14 @@ export default class SignaturePad extends SignatureEventTarget {
307
328
  }
308
329
 
309
330
  // Event handlers
310
- private _handleMouseDown = (event: MouseEvent): void => {
331
+ private _handleMouseDown(event: MouseEvent): void {
311
332
  if (!this._isLeftButtonPressed(event, true) || this._drawingStroke) {
312
333
  return;
313
334
  }
314
335
  this._strokeBegin(this._pointerEventToSignatureEvent(event));
315
336
  };
316
337
 
317
- private _handleMouseMove = (event: MouseEvent): void => {
338
+ private _handleMouseMove(event: MouseEvent): void {
318
339
  if (!this._isLeftButtonPressed(event, true) || !this._drawingStroke) {
319
340
  // Stop when not pressing primary button or pressing multiple buttons
320
341
  this._strokeEnd(this._pointerEventToSignatureEvent(event), false);
@@ -324,7 +345,7 @@ export default class SignaturePad extends SignatureEventTarget {
324
345
  this._strokeMoveUpdate(this._pointerEventToSignatureEvent(event));
325
346
  };
326
347
 
327
- private _handleMouseUp = (event: MouseEvent): void => {
348
+ private _handleMouseUp(event: MouseEvent): void {
328
349
  if (this._isLeftButtonPressed(event)) {
329
350
  return;
330
351
  }
@@ -332,7 +353,7 @@ export default class SignaturePad extends SignatureEventTarget {
332
353
  this._strokeEnd(this._pointerEventToSignatureEvent(event));
333
354
  };
334
355
 
335
- private _handleTouchStart = (event: TouchEvent): void => {
356
+ private _handleTouchStart(event: TouchEvent): void {
336
357
  if (event.targetTouches.length !== 1 || this._drawingStroke) {
337
358
  return;
338
359
  }
@@ -345,7 +366,7 @@ export default class SignaturePad extends SignatureEventTarget {
345
366
  this._strokeBegin(this._touchEventToSignatureEvent(event));
346
367
  };
347
368
 
348
- private _handleTouchMove = (event: TouchEvent): void => {
369
+ private _handleTouchMove(event: TouchEvent): void {
349
370
  if (event.targetTouches.length !== 1) {
350
371
  return;
351
372
  }
@@ -363,7 +384,7 @@ export default class SignaturePad extends SignatureEventTarget {
363
384
  this._strokeMoveUpdate(this._touchEventToSignatureEvent(event));
364
385
  };
365
386
 
366
- private _handleTouchEnd = (event: TouchEvent): void => {
387
+ private _handleTouchEnd(event: TouchEvent): void {
367
388
  if (event.targetTouches.length !== 0) {
368
389
  return;
369
390
  }
@@ -372,23 +393,40 @@ export default class SignaturePad extends SignatureEventTarget {
372
393
  event.preventDefault();
373
394
  }
374
395
 
375
- this.canvas.removeEventListener('touchmove', this._handleTouchMove);
376
-
377
396
  this._strokeEnd(this._touchEventToSignatureEvent(event));
378
397
  };
379
398
 
380
- private _handlePointerDown = (event: PointerEvent): void => {
381
- if (!event.isPrimary || !this._isLeftButtonPressed(event) || this._drawingStroke) {
399
+ private _getPointerId(event: PointerEvent) {
400
+ // @ts-expect-error persistentDeviceId is not available yet but we want to use it when it is available
401
+ return event.persistentDeviceId || event.pointerId;
402
+ }
403
+
404
+ private _allowPointerId(event: PointerEvent, allowUndefined = false): boolean {
405
+ if (typeof this._strokePointerId === 'undefined') {
406
+ return allowUndefined;
407
+ }
408
+
409
+ return this._getPointerId(event) === this._strokePointerId;
410
+ }
411
+
412
+ private _handlePointerDown(event: PointerEvent): void {
413
+ if (
414
+ this._drawingStroke ||
415
+ !this._isLeftButtonPressed(event) ||
416
+ !this._allowPointerId(event, true)
417
+ ) {
382
418
  return;
383
419
  }
384
420
 
421
+ this._strokePointerId = this._getPointerId(event);
422
+
385
423
  event.preventDefault();
386
424
 
387
425
  this._strokeBegin(this._pointerEventToSignatureEvent(event));
388
426
  };
389
427
 
390
- private _handlePointerMove = (event: PointerEvent): void => {
391
- if (!event.isPrimary) {
428
+ private _handlePointerMove(event: PointerEvent): void {
429
+ if (!this._allowPointerId(event)) {
392
430
  return;
393
431
  }
394
432
  if (!this._isLeftButtonPressed(event, true) || !this._drawingStroke) {
@@ -401,8 +439,11 @@ export default class SignaturePad extends SignatureEventTarget {
401
439
  this._strokeMoveUpdate(this._pointerEventToSignatureEvent(event));
402
440
  };
403
441
 
404
- private _handlePointerUp = (event: PointerEvent): void => {
405
- if (!event.isPrimary || this._isLeftButtonPressed(event)) {
442
+ private _handlePointerUp(event: PointerEvent): void {
443
+ if (
444
+ this._isLeftButtonPressed(event) ||
445
+ !this._allowPointerId(event)
446
+ ) {
406
447
  return;
407
448
  }
408
449
 
@@ -439,16 +480,24 @@ export default class SignaturePad extends SignatureEventTarget {
439
480
  const { addEventListener } = this._getListenerFunctions();
440
481
  switch (event.event.type) {
441
482
  case 'mousedown':
442
- addEventListener('mousemove', this._handleMouseMove);
443
- addEventListener('mouseup', this._handleMouseUp);
483
+ addEventListener('mousemove', this._handleMouseMove, {
484
+ passive: false,
485
+ });
486
+ addEventListener('mouseup', this._handleMouseUp, { passive: false });
444
487
  break;
445
488
  case 'touchstart':
446
- addEventListener('touchmove', this._handleTouchMove);
447
- addEventListener('touchend', this._handleTouchEnd);
489
+ addEventListener('touchmove', this._handleTouchMove, {
490
+ passive: false,
491
+ });
492
+ addEventListener('touchend', this._handleTouchEnd, { passive: false });
448
493
  break;
449
494
  case 'pointerdown':
450
- addEventListener('pointermove', this._handlePointerMove);
451
- addEventListener('pointerup', this._handlePointerUp);
495
+ addEventListener('pointermove', this._handlePointerMove, {
496
+ passive: false,
497
+ });
498
+ addEventListener('pointerup', this._handlePointerUp, {
499
+ passive: false,
500
+ });
452
501
  break;
453
502
  default:
454
503
  // do nothing
@@ -527,23 +576,30 @@ export default class SignaturePad extends SignatureEventTarget {
527
576
  }
528
577
 
529
578
  this._drawingStroke = false;
579
+ this._strokePointerId = undefined;
530
580
  this.dispatchEvent(new CustomEvent('endStroke', { detail: event }));
531
581
  }
532
582
 
533
583
  private _handlePointerEvents(): void {
534
584
  this._drawingStroke = false;
535
585
 
536
- this.canvas.addEventListener('pointerdown', this._handlePointerDown);
586
+ this.canvas.addEventListener('pointerdown', this._handlePointerDown, {
587
+ passive: false,
588
+ });
537
589
  }
538
590
 
539
591
  private _handleMouseEvents(): void {
540
592
  this._drawingStroke = false;
541
593
 
542
- this.canvas.addEventListener('mousedown', this._handleMouseDown);
594
+ this.canvas.addEventListener('mousedown', this._handleMouseDown, {
595
+ passive: false,
596
+ });
543
597
  }
544
598
 
545
599
  private _handleTouchEvents(): void {
546
- this.canvas.addEventListener('touchstart', this._handleTouchStart);
600
+ this.canvas.addEventListener('touchstart', this._handleTouchStart, {
601
+ passive: false,
602
+ });
547
603
  }
548
604
 
549
605
  // Called when a new line is started
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tabler/core",
3
- "version": "1.3.1",
3
+ "version": "1.4.0",
4
4
  "description": "Premium and Open Source dashboard template with responsive and high quality UI.",
5
5
  "homepage": "https://tabler.io",
6
6
  "repository": {
@@ -112,28 +112,28 @@
112
112
  },
113
113
  "dependencies": {
114
114
  "@popperjs/core": "^2.11.8",
115
- "bootstrap": "5.3.6"
115
+ "bootstrap": "5.3.7"
116
116
  },
117
117
  "devDependencies": {
118
118
  "@hotwired/turbo": "^8.0.13",
119
- "@melloware/coloris": "^0.24.2",
119
+ "@melloware/coloris": "^0.25.0",
120
120
  "apexcharts": "3.54.1",
121
121
  "autosize": "^6.0.1",
122
122
  "choices.js": "^11.1.0",
123
123
  "clipboard": "^2.0.11",
124
- "countup.js": "^2.8.2",
124
+ "countup.js": "^2.9.0",
125
125
  "dropzone": "^6.0.0-beta.2",
126
126
  "flatpickr": "^4.6.13",
127
- "fslightbox": "^3.6.0",
128
- "fullcalendar": "^6.1.17",
127
+ "fslightbox": "^3.6.1",
128
+ "fullcalendar": "^6.1.18",
129
129
  "hugerte": "^1.0.9",
130
130
  "imask": "^7.6.1",
131
- "jsvectormap": "^1.6.0",
131
+ "jsvectormap": "^1.7.0",
132
132
  "list.js": "^2.3.1",
133
133
  "litepicker": "^2.0.12",
134
134
  "nouislider": "^15.8.1",
135
135
  "plyr": "^3.7.8",
136
- "signature_pad": "^5.0.7",
136
+ "signature_pad": "^5.0.10",
137
137
  "star-rating.js": "^4.3.1",
138
138
  "tom-select": "^2.4.3",
139
139
  "typed.js": "^2.1.0"
@@ -146,7 +146,7 @@
146
146
  "build": "pnpm run clean && pnpm run css && pnpm run js && pnpm run copy && pnpm run generate-sri",
147
147
  "clean": "shx rm -rf dist demo",
148
148
  "css": "pnpm run css-compile && pnpm run css-prefix && pnpm run css-rtl && pnpm run css-minify && pnpm run css-banner",
149
- "css-compile": "sass scss/:dist/css/ --no-source-map --load-path=node_modules",
149
+ "css-compile": "sass --no-source-map --load-path=node_modules --style expanded scss/:dist/css/",
150
150
  "css-banner": "node .build/add-banner.mjs",
151
151
  "css-prefix": "postcss --config .build/postcss.config.mjs --replace \"dist/css/*.css\" \"!dist/css/*.rtl*.css\" \"!dist/css/*.min.css\"",
152
152
  "css-rtl": "cross-env NODE_ENV=RTL postcss --config .build/postcss.config.mjs --dir \"dist/css\" --ext \".rtl.css\" \"dist/css/*.css\" \"!dist/css/*.min.css\" \"!dist/css/*.rtl.css\"",
@@ -14,7 +14,6 @@
14
14
  @import "bootstrap/scss/nav";
15
15
  @import "bootstrap/scss/navbar";
16
16
  @import "bootstrap/scss/card";
17
- @import "bootstrap/scss/breadcrumb";
18
17
  @import "bootstrap/scss/pagination";
19
18
  @import "bootstrap/scss/progress";
20
19
  @import "bootstrap/scss/list-group";