@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":"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"}
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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"}
@@ -66,6 +66,7 @@ export default class SignaturePad extends SignatureEventTarget {
66
66
  private _lastVelocity;
67
67
  private _lastWidth;
68
68
  private _strokeMoveUpdate;
69
+ private _strokePointerId;
69
70
  constructor(canvas: HTMLCanvasElement, options?: Options);
70
71
  clear(): void;
71
72
  fromDataURL(dataUrl: string, options?: {
@@ -84,7 +85,7 @@ export default class SignaturePad extends SignatureEventTarget {
84
85
  isEmpty(): boolean;
85
86
  fromData(pointGroups: PointGroup[], { clear }?: FromDataOptions): void;
86
87
  toData(): PointGroup[];
87
- _isLeftButtonPressed(event: MouseEvent, only?: boolean): boolean;
88
+ private _isLeftButtonPressed;
88
89
  private _pointerEventToSignatureEvent;
89
90
  private _touchEventToSignatureEvent;
90
91
  private _handleMouseDown;
@@ -93,6 +94,8 @@ export default class SignaturePad extends SignatureEventTarget {
93
94
  private _handleTouchStart;
94
95
  private _handleTouchMove;
95
96
  private _handleTouchEnd;
97
+ private _getPointerId;
98
+ private _allowPointerId;
96
99
  private _handlePointerDown;
97
100
  private _handlePointerMove;
98
101
  private _handlePointerUp;
@@ -1,6 +1,6 @@
1
1
  /*!
2
- * Signature Pad v5.0.7 | https://github.com/szimek/signature_pad
2
+ * Signature Pad v5.0.10 | https://github.com/szimek/signature_pad
3
3
  * (c) 2025 Szymon Nowak | Released under the MIT license
4
4
  */
5
- !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).SignaturePad=e()}(this,(function(){"use strict";class t{constructor(t,e,i,n){if(isNaN(t)||isNaN(e))throw new Error(`Point is invalid: (${t}, ${e})`);this.x=+t,this.y=+e,this.pressure=i||0,this.time=n||Date.now()}distanceTo(t){return Math.sqrt(Math.pow(this.x-t.x,2)+Math.pow(this.y-t.y,2))}equals(t){return this.x===t.x&&this.y===t.y&&this.pressure===t.pressure&&this.time===t.time}velocityFrom(t){return this.time!==t.time?this.distanceTo(t)/(this.time-t.time):0}}class e{static fromPoints(t,i){const n=this.calculateControlPoints(t[0],t[1],t[2]).c2,s=this.calculateControlPoints(t[1],t[2],t[3]).c1;return new e(t[1],n,s,t[2],i.start,i.end)}static calculateControlPoints(e,i,n){const s=e.x-i.x,o=e.y-i.y,r=i.x-n.x,h=i.y-n.y,a=(e.x+i.x)/2,c=(e.y+i.y)/2,d=(i.x+n.x)/2,l=(i.y+n.y)/2,u=Math.sqrt(s*s+o*o),v=Math.sqrt(r*r+h*h),_=u+v==0?0:v/(u+v),p=d+(a-d)*_,m=l+(c-l)*_,g=i.x-p,w=i.y-m;return{c1:new t(a+g,c+w),c2:new t(d+g,l+w)}}constructor(t,e,i,n,s,o){this.startPoint=t,this.control2=e,this.control1=i,this.endPoint=n,this.startWidth=s,this.endWidth=o}length(){let t,e,i=0;for(let n=0;n<=10;n+=1){const s=n/10,o=this.point(s,this.startPoint.x,this.control1.x,this.control2.x,this.endPoint.x),r=this.point(s,this.startPoint.y,this.control1.y,this.control2.y,this.endPoint.y);if(n>0){const n=o-t,s=r-e;i+=Math.sqrt(n*n+s*s)}t=o,e=r}return i}point(t,e,i,n,s){return e*(1-t)*(1-t)*(1-t)+3*i*(1-t)*(1-t)*t+3*n*(1-t)*t*t+s*t*t*t}}class i{constructor(){try{this._et=new EventTarget}catch(t){this._et=document}}addEventListener(t,e,i){this._et.addEventListener(t,e,i)}dispatchEvent(t){return this._et.dispatchEvent(t)}removeEventListener(t,e,i){this._et.removeEventListener(t,e,i)}}class n extends i{constructor(t,e={}){var i,s,o;super(),this.canvas=t,this._drawingStroke=!1,this._isEmpty=!0,this._lastPoints=[],this._data=[],this._lastVelocity=0,this._lastWidth=0,this._handleMouseDown=t=>{this._isLeftButtonPressed(t,!0)&&!this._drawingStroke&&this._strokeBegin(this._pointerEventToSignatureEvent(t))},this._handleMouseMove=t=>{this._isLeftButtonPressed(t,!0)&&this._drawingStroke?this._strokeMoveUpdate(this._pointerEventToSignatureEvent(t)):this._strokeEnd(this._pointerEventToSignatureEvent(t),!1)},this._handleMouseUp=t=>{this._isLeftButtonPressed(t)||this._strokeEnd(this._pointerEventToSignatureEvent(t))},this._handleTouchStart=t=>{1!==t.targetTouches.length||this._drawingStroke||(t.cancelable&&t.preventDefault(),this._strokeBegin(this._touchEventToSignatureEvent(t)))},this._handleTouchMove=t=>{1===t.targetTouches.length&&(t.cancelable&&t.preventDefault(),this._drawingStroke?this._strokeMoveUpdate(this._touchEventToSignatureEvent(t)):this._strokeEnd(this._touchEventToSignatureEvent(t),!1))},this._handleTouchEnd=t=>{0===t.targetTouches.length&&(t.cancelable&&t.preventDefault(),this.canvas.removeEventListener("touchmove",this._handleTouchMove),this._strokeEnd(this._touchEventToSignatureEvent(t)))},this._handlePointerDown=t=>{t.isPrimary&&this._isLeftButtonPressed(t)&&!this._drawingStroke&&(t.preventDefault(),this._strokeBegin(this._pointerEventToSignatureEvent(t)))},this._handlePointerMove=t=>{t.isPrimary&&(this._isLeftButtonPressed(t,!0)&&this._drawingStroke?(t.preventDefault(),this._strokeMoveUpdate(this._pointerEventToSignatureEvent(t))):this._strokeEnd(this._pointerEventToSignatureEvent(t),!1))},this._handlePointerUp=t=>{t.isPrimary&&!this._isLeftButtonPressed(t)&&(t.preventDefault(),this._strokeEnd(this._pointerEventToSignatureEvent(t)))},this.velocityFilterWeight=e.velocityFilterWeight||.7,this.minWidth=e.minWidth||.5,this.maxWidth=e.maxWidth||2.5,this.throttle=null!==(i=e.throttle)&&void 0!==i?i:16,this.minDistance=null!==(s=e.minDistance)&&void 0!==s?s:5,this.dotSize=e.dotSize||0,this.penColor=e.penColor||"black",this.backgroundColor=e.backgroundColor||"rgba(0,0,0,0)",this.compositeOperation=e.compositeOperation||"source-over",this.canvasContextOptions=null!==(o=e.canvasContextOptions)&&void 0!==o?o:{},this._strokeMoveUpdate=this.throttle?function(t,e=250){let i,n,s,o=0,r=null;const h=()=>{o=Date.now(),r=null,i=t.apply(n,s),r||(n=null,s=[])};return function(...a){const c=Date.now(),d=e-(c-o);return n=this,s=a,d<=0||d>e?(r&&(clearTimeout(r),r=null),o=c,i=t.apply(n,s),r||(n=null,s=[])):r||(r=window.setTimeout(h,d)),i}}(n.prototype._strokeUpdate,this.throttle):n.prototype._strokeUpdate,this._ctx=t.getContext("2d",this.canvasContextOptions),this.clear(),this.on()}clear(){const{_ctx:t,canvas:e}=this;t.fillStyle=this.backgroundColor,t.clearRect(0,0,e.width,e.height),t.fillRect(0,0,e.width,e.height),this._data=[],this._reset(this._getPointGroupOptions()),this._isEmpty=!0}fromDataURL(t,e={}){return new Promise(((i,n)=>{const s=new Image,o=e.ratio||window.devicePixelRatio||1,r=e.width||this.canvas.width/o,h=e.height||this.canvas.height/o,a=e.xOffset||0,c=e.yOffset||0;this._reset(this._getPointGroupOptions()),s.onload=()=>{this._ctx.drawImage(s,a,c,r,h),i()},s.onerror=t=>{n(t)},s.crossOrigin="anonymous",s.src=t,this._isEmpty=!1}))}toDataURL(t="image/png",e){return"image/svg+xml"===t?("object"!=typeof e&&(e=void 0),`data:image/svg+xml;base64,${btoa(this.toSVG(e))}`):("number"!=typeof e&&(e=void 0),this.canvas.toDataURL(t,e))}on(){this.canvas.style.touchAction="none",this.canvas.style.msTouchAction="none",this.canvas.style.userSelect="none";const t=/Macintosh/.test(navigator.userAgent)&&"ontouchstart"in document;window.PointerEvent&&!t?this._handlePointerEvents():(this._handleMouseEvents(),"ontouchstart"in window&&this._handleTouchEvents())}off(){this.canvas.style.touchAction="auto",this.canvas.style.msTouchAction="auto",this.canvas.style.userSelect="auto",this.canvas.removeEventListener("pointerdown",this._handlePointerDown),this.canvas.removeEventListener("mousedown",this._handleMouseDown),this.canvas.removeEventListener("touchstart",this._handleTouchStart),this._removeMoveUpEventListeners()}_getListenerFunctions(){var t;const e=window.document===this.canvas.ownerDocument?window:null!==(t=this.canvas.ownerDocument.defaultView)&&void 0!==t?t:this.canvas.ownerDocument;return{addEventListener:e.addEventListener.bind(e),removeEventListener:e.removeEventListener.bind(e)}}_removeMoveUpEventListeners(){const{removeEventListener:t}=this._getListenerFunctions();t("pointermove",this._handlePointerMove),t("pointerup",this._handlePointerUp),t("mousemove",this._handleMouseMove),t("mouseup",this._handleMouseUp),t("touchmove",this._handleTouchMove),t("touchend",this._handleTouchEnd)}isEmpty(){return this._isEmpty}fromData(t,{clear:e=!0}={}){e&&this.clear(),this._fromData(t,this._drawCurve.bind(this),this._drawDot.bind(this)),this._data=this._data.concat(t)}toData(){return this._data}_isLeftButtonPressed(t,e){return e?1===t.buttons:!(1&~t.buttons)}_pointerEventToSignatureEvent(t){return{event:t,type:t.type,x:t.clientX,y:t.clientY,pressure:"pressure"in t?t.pressure:0}}_touchEventToSignatureEvent(t){const e=t.changedTouches[0];return{event:t,type:t.type,x:e.clientX,y:e.clientY,pressure:e.force}}_getPointGroupOptions(t){return{penColor:t&&"penColor"in t?t.penColor:this.penColor,dotSize:t&&"dotSize"in t?t.dotSize:this.dotSize,minWidth:t&&"minWidth"in t?t.minWidth:this.minWidth,maxWidth:t&&"maxWidth"in t?t.maxWidth:this.maxWidth,velocityFilterWeight:t&&"velocityFilterWeight"in t?t.velocityFilterWeight:this.velocityFilterWeight,compositeOperation:t&&"compositeOperation"in t?t.compositeOperation:this.compositeOperation}}_strokeBegin(t){if(!this.dispatchEvent(new CustomEvent("beginStroke",{detail:t,cancelable:!0})))return;const{addEventListener:e}=this._getListenerFunctions();switch(t.event.type){case"mousedown":e("mousemove",this._handleMouseMove),e("mouseup",this._handleMouseUp);break;case"touchstart":e("touchmove",this._handleTouchMove),e("touchend",this._handleTouchEnd);break;case"pointerdown":e("pointermove",this._handlePointerMove),e("pointerup",this._handlePointerUp)}this._drawingStroke=!0;const i=this._getPointGroupOptions(),n=Object.assign(Object.assign({},i),{points:[]});this._data.push(n),this._reset(i),this._strokeUpdate(t)}_strokeUpdate(t){if(!this._drawingStroke)return;if(0===this._data.length)return void this._strokeBegin(t);this.dispatchEvent(new CustomEvent("beforeUpdateStroke",{detail:t}));const e=this._createPoint(t.x,t.y,t.pressure),i=this._data[this._data.length-1],n=i.points,s=n.length>0&&n[n.length-1],o=!!s&&e.distanceTo(s)<=this.minDistance,r=this._getPointGroupOptions(i);if(!s||!s||!o){const t=this._addPoint(e,r);s?t&&this._drawCurve(t,r):this._drawDot(e,r),n.push({time:e.time,x:e.x,y:e.y,pressure:e.pressure})}this.dispatchEvent(new CustomEvent("afterUpdateStroke",{detail:t}))}_strokeEnd(t,e=!0){this._removeMoveUpEventListeners(),this._drawingStroke&&(e&&this._strokeUpdate(t),this._drawingStroke=!1,this.dispatchEvent(new CustomEvent("endStroke",{detail:t})))}_handlePointerEvents(){this._drawingStroke=!1,this.canvas.addEventListener("pointerdown",this._handlePointerDown)}_handleMouseEvents(){this._drawingStroke=!1,this.canvas.addEventListener("mousedown",this._handleMouseDown)}_handleTouchEvents(){this.canvas.addEventListener("touchstart",this._handleTouchStart)}_reset(t){this._lastPoints=[],this._lastVelocity=0,this._lastWidth=(t.minWidth+t.maxWidth)/2,this._ctx.fillStyle=t.penColor,this._ctx.globalCompositeOperation=t.compositeOperation}_createPoint(e,i,n){const s=this.canvas.getBoundingClientRect();return new t(e-s.left,i-s.top,n,(new Date).getTime())}_addPoint(t,i){const{_lastPoints:n}=this;if(n.push(t),n.length>2){3===n.length&&n.unshift(n[0]);const t=this._calculateCurveWidths(n[1],n[2],i),s=e.fromPoints(n,t);return n.shift(),s}return null}_calculateCurveWidths(t,e,i){const n=i.velocityFilterWeight*e.velocityFrom(t)+(1-i.velocityFilterWeight)*this._lastVelocity,s=this._strokeWidth(n,i),o={end:s,start:this._lastWidth};return this._lastVelocity=n,this._lastWidth=s,o}_strokeWidth(t,e){return Math.max(e.maxWidth/(t+1),e.minWidth)}_drawCurveSegment(t,e,i){const n=this._ctx;n.moveTo(t,e),n.arc(t,e,i,0,2*Math.PI,!1),this._isEmpty=!1}_drawCurve(t,e){const i=this._ctx,n=t.endWidth-t.startWidth,s=2*Math.ceil(t.length());i.beginPath(),i.fillStyle=e.penColor;for(let i=0;i<s;i+=1){const o=i/s,r=o*o,h=r*o,a=1-o,c=a*a,d=c*a;let l=d*t.startPoint.x;l+=3*c*o*t.control1.x,l+=3*a*r*t.control2.x,l+=h*t.endPoint.x;let u=d*t.startPoint.y;u+=3*c*o*t.control1.y,u+=3*a*r*t.control2.y,u+=h*t.endPoint.y;const v=Math.min(t.startWidth+h*n,e.maxWidth);this._drawCurveSegment(l,u,v)}i.closePath(),i.fill()}_drawDot(t,e){const i=this._ctx,n=e.dotSize>0?e.dotSize:(e.minWidth+e.maxWidth)/2;i.beginPath(),this._drawCurveSegment(t.x,t.y,n),i.closePath(),i.fillStyle=e.penColor,i.fill()}_fromData(e,i,n){for(const s of e){const{points:e}=s,o=this._getPointGroupOptions(s);if(e.length>1)for(let n=0;n<e.length;n+=1){const s=e[n],r=new t(s.x,s.y,s.pressure,s.time);0===n&&this._reset(o);const h=this._addPoint(r,o);h&&i(h,o)}else this._reset(o),n(e[0],o)}}toSVG({includeBackgroundColor:t=!1}={}){const e=this._data,i=Math.max(window.devicePixelRatio||1,1),n=this.canvas.width/i,s=this.canvas.height/i,o=document.createElementNS("http://www.w3.org/2000/svg","svg");if(o.setAttribute("xmlns","http://www.w3.org/2000/svg"),o.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink"),o.setAttribute("viewBox",`0 0 ${n} ${s}`),o.setAttribute("width",n.toString()),o.setAttribute("height",s.toString()),t&&this.backgroundColor){const t=document.createElement("rect");t.setAttribute("width","100%"),t.setAttribute("height","100%"),t.setAttribute("fill",this.backgroundColor),o.appendChild(t)}return this._fromData(e,((t,{penColor:e})=>{const i=document.createElement("path");if(!(isNaN(t.control1.x)||isNaN(t.control1.y)||isNaN(t.control2.x)||isNaN(t.control2.y))){const n=`M ${t.startPoint.x.toFixed(3)},${t.startPoint.y.toFixed(3)} C ${t.control1.x.toFixed(3)},${t.control1.y.toFixed(3)} ${t.control2.x.toFixed(3)},${t.control2.y.toFixed(3)} ${t.endPoint.x.toFixed(3)},${t.endPoint.y.toFixed(3)}`;i.setAttribute("d",n),i.setAttribute("stroke-width",(2.25*t.endWidth).toFixed(3)),i.setAttribute("stroke",e),i.setAttribute("fill","none"),i.setAttribute("stroke-linecap","round"),o.appendChild(i)}}),((t,{penColor:e,dotSize:i,minWidth:n,maxWidth:s})=>{const r=document.createElement("circle"),h=i>0?i:(n+s)/2;r.setAttribute("r",h.toString()),r.setAttribute("cx",t.x.toString()),r.setAttribute("cy",t.y.toString()),r.setAttribute("fill",e),o.appendChild(r)})),o.outerHTML}}return n}));
5
+ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).SignaturePad=e()}(this,(function(){"use strict";class t{constructor(t,e,i,n){if(isNaN(t)||isNaN(e))throw new Error(`Point is invalid: (${t}, ${e})`);this.x=+t,this.y=+e,this.pressure=i||0,this.time=n||Date.now()}distanceTo(t){return Math.sqrt(Math.pow(this.x-t.x,2)+Math.pow(this.y-t.y,2))}equals(t){return this.x===t.x&&this.y===t.y&&this.pressure===t.pressure&&this.time===t.time}velocityFrom(t){return this.time!==t.time?this.distanceTo(t)/(this.time-t.time):0}}class e{static fromPoints(t,i){const n=this.calculateControlPoints(t[0],t[1],t[2]).c2,s=this.calculateControlPoints(t[1],t[2],t[3]).c1;return new e(t[1],n,s,t[2],i.start,i.end)}static calculateControlPoints(e,i,n){const s=e.x-i.x,o=e.y-i.y,r=i.x-n.x,h=i.y-n.y,a=(e.x+i.x)/2,d=(e.y+i.y)/2,l=(i.x+n.x)/2,c=(i.y+n.y)/2,u=Math.sqrt(s*s+o*o),_=Math.sqrt(r*r+h*h),v=u+_==0?0:_/(u+_),p=l+(a-l)*v,m=c+(d-c)*v,g=i.x-p,w=i.y-m;return{c1:new t(a+g,d+w),c2:new t(l+g,c+w)}}constructor(t,e,i,n,s,o){this.startPoint=t,this.control2=e,this.control1=i,this.endPoint=n,this.startWidth=s,this.endWidth=o}length(){let t,e,i=0;for(let n=0;n<=10;n+=1){const s=n/10,o=this.point(s,this.startPoint.x,this.control1.x,this.control2.x,this.endPoint.x),r=this.point(s,this.startPoint.y,this.control1.y,this.control2.y,this.endPoint.y);if(n>0){const n=o-t,s=r-e;i+=Math.sqrt(n*n+s*s)}t=o,e=r}return i}point(t,e,i,n,s){return e*(1-t)*(1-t)*(1-t)+3*i*(1-t)*(1-t)*t+3*n*(1-t)*t*t+s*t*t*t}}class i{constructor(){try{this._et=new EventTarget}catch(t){this._et=document}}addEventListener(t,e,i){this._et.addEventListener(t,e,i)}dispatchEvent(t){return this._et.dispatchEvent(t)}removeEventListener(t,e,i){this._et.removeEventListener(t,e,i)}}class n extends i{constructor(t,e={}){var i,s,o;super(),this.canvas=t,this._drawingStroke=!1,this._isEmpty=!0,this._lastPoints=[],this._data=[],this._lastVelocity=0,this._lastWidth=0,this.velocityFilterWeight=e.velocityFilterWeight||.7,this.minWidth=e.minWidth||.5,this.maxWidth=e.maxWidth||2.5,this.throttle=null!==(i=e.throttle)&&void 0!==i?i:16,this.minDistance=null!==(s=e.minDistance)&&void 0!==s?s:5,this.dotSize=e.dotSize||0,this.penColor=e.penColor||"black",this.backgroundColor=e.backgroundColor||"rgba(0,0,0,0)",this.compositeOperation=e.compositeOperation||"source-over",this.canvasContextOptions=null!==(o=e.canvasContextOptions)&&void 0!==o?o:{},this._strokeMoveUpdate=this.throttle?function(t,e=250){let i,n,s,o=0,r=null;const h=()=>{o=Date.now(),r=null,i=t.apply(n,s),r||(n=null,s=[])};return function(...a){const d=Date.now(),l=e-(d-o);return n=this,s=a,l<=0||l>e?(r&&(clearTimeout(r),r=null),o=d,i=t.apply(n,s),r||(n=null,s=[])):r||(r=window.setTimeout(h,l)),i}}(n.prototype._strokeUpdate,this.throttle):n.prototype._strokeUpdate,this._handleMouseDown=this._handleMouseDown.bind(this),this._handleMouseMove=this._handleMouseMove.bind(this),this._handleMouseUp=this._handleMouseUp.bind(this),this._handleTouchStart=this._handleTouchStart.bind(this),this._handleTouchMove=this._handleTouchMove.bind(this),this._handleTouchEnd=this._handleTouchEnd.bind(this),this._handlePointerDown=this._handlePointerDown.bind(this),this._handlePointerMove=this._handlePointerMove.bind(this),this._handlePointerUp=this._handlePointerUp.bind(this),this._ctx=t.getContext("2d",this.canvasContextOptions),this.clear(),this.on()}clear(){const{_ctx:t,canvas:e}=this;t.fillStyle=this.backgroundColor,t.clearRect(0,0,e.width,e.height),t.fillRect(0,0,e.width,e.height),this._data=[],this._reset(this._getPointGroupOptions()),this._isEmpty=!0,this._strokePointerId=void 0}fromDataURL(t,e={}){return new Promise(((i,n)=>{const s=new Image,o=e.ratio||window.devicePixelRatio||1,r=e.width||this.canvas.width/o,h=e.height||this.canvas.height/o,a=e.xOffset||0,d=e.yOffset||0;this._reset(this._getPointGroupOptions()),s.onload=()=>{this._ctx.drawImage(s,a,d,r,h),i()},s.onerror=t=>{n(t)},s.crossOrigin="anonymous",s.src=t,this._isEmpty=!1}))}toDataURL(t="image/png",e){return"image/svg+xml"===t?("object"!=typeof e&&(e=void 0),`data:image/svg+xml;base64,${btoa(this.toSVG(e))}`):("number"!=typeof e&&(e=void 0),this.canvas.toDataURL(t,e))}on(){this.canvas.style.touchAction="none",this.canvas.style.msTouchAction="none",this.canvas.style.userSelect="none";const t=/Macintosh/.test(navigator.userAgent)&&"ontouchstart"in document;window.PointerEvent&&!t?this._handlePointerEvents():(this._handleMouseEvents(),"ontouchstart"in window&&this._handleTouchEvents())}off(){this.canvas.style.touchAction="auto",this.canvas.style.msTouchAction="auto",this.canvas.style.userSelect="auto",this.canvas.removeEventListener("pointerdown",this._handlePointerDown),this.canvas.removeEventListener("mousedown",this._handleMouseDown),this.canvas.removeEventListener("touchstart",this._handleTouchStart),this._removeMoveUpEventListeners()}_getListenerFunctions(){var t;const e=window.document===this.canvas.ownerDocument?window:null!==(t=this.canvas.ownerDocument.defaultView)&&void 0!==t?t:this.canvas.ownerDocument;return{addEventListener:e.addEventListener.bind(e),removeEventListener:e.removeEventListener.bind(e)}}_removeMoveUpEventListeners(){const{removeEventListener:t}=this._getListenerFunctions();t("pointermove",this._handlePointerMove),t("pointerup",this._handlePointerUp),t("mousemove",this._handleMouseMove),t("mouseup",this._handleMouseUp),t("touchmove",this._handleTouchMove),t("touchend",this._handleTouchEnd)}isEmpty(){return this._isEmpty}fromData(t,{clear:e=!0}={}){e&&this.clear(),this._fromData(t,this._drawCurve.bind(this),this._drawDot.bind(this)),this._data=this._data.concat(t)}toData(){return this._data}_isLeftButtonPressed(t,e){return e?1===t.buttons:!(1&~t.buttons)}_pointerEventToSignatureEvent(t){return{event:t,type:t.type,x:t.clientX,y:t.clientY,pressure:"pressure"in t?t.pressure:0}}_touchEventToSignatureEvent(t){const e=t.changedTouches[0];return{event:t,type:t.type,x:e.clientX,y:e.clientY,pressure:e.force}}_handleMouseDown(t){this._isLeftButtonPressed(t,!0)&&!this._drawingStroke&&this._strokeBegin(this._pointerEventToSignatureEvent(t))}_handleMouseMove(t){this._isLeftButtonPressed(t,!0)&&this._drawingStroke?this._strokeMoveUpdate(this._pointerEventToSignatureEvent(t)):this._strokeEnd(this._pointerEventToSignatureEvent(t),!1)}_handleMouseUp(t){this._isLeftButtonPressed(t)||this._strokeEnd(this._pointerEventToSignatureEvent(t))}_handleTouchStart(t){1!==t.targetTouches.length||this._drawingStroke||(t.cancelable&&t.preventDefault(),this._strokeBegin(this._touchEventToSignatureEvent(t)))}_handleTouchMove(t){1===t.targetTouches.length&&(t.cancelable&&t.preventDefault(),this._drawingStroke?this._strokeMoveUpdate(this._touchEventToSignatureEvent(t)):this._strokeEnd(this._touchEventToSignatureEvent(t),!1))}_handleTouchEnd(t){0===t.targetTouches.length&&(t.cancelable&&t.preventDefault(),this._strokeEnd(this._touchEventToSignatureEvent(t)))}_getPointerId(t){return t.persistentDeviceId||t.pointerId}_allowPointerId(t,e=!1){return void 0===this._strokePointerId?e:this._getPointerId(t)===this._strokePointerId}_handlePointerDown(t){!this._drawingStroke&&this._isLeftButtonPressed(t)&&this._allowPointerId(t,!0)&&(this._strokePointerId=this._getPointerId(t),t.preventDefault(),this._strokeBegin(this._pointerEventToSignatureEvent(t)))}_handlePointerMove(t){this._allowPointerId(t)&&(this._isLeftButtonPressed(t,!0)&&this._drawingStroke?(t.preventDefault(),this._strokeMoveUpdate(this._pointerEventToSignatureEvent(t))):this._strokeEnd(this._pointerEventToSignatureEvent(t),!1))}_handlePointerUp(t){!this._isLeftButtonPressed(t)&&this._allowPointerId(t)&&(t.preventDefault(),this._strokeEnd(this._pointerEventToSignatureEvent(t)))}_getPointGroupOptions(t){return{penColor:t&&"penColor"in t?t.penColor:this.penColor,dotSize:t&&"dotSize"in t?t.dotSize:this.dotSize,minWidth:t&&"minWidth"in t?t.minWidth:this.minWidth,maxWidth:t&&"maxWidth"in t?t.maxWidth:this.maxWidth,velocityFilterWeight:t&&"velocityFilterWeight"in t?t.velocityFilterWeight:this.velocityFilterWeight,compositeOperation:t&&"compositeOperation"in t?t.compositeOperation:this.compositeOperation}}_strokeBegin(t){if(!this.dispatchEvent(new CustomEvent("beginStroke",{detail:t,cancelable:!0})))return;const{addEventListener:e}=this._getListenerFunctions();switch(t.event.type){case"mousedown":e("mousemove",this._handleMouseMove,{passive:!1}),e("mouseup",this._handleMouseUp,{passive:!1});break;case"touchstart":e("touchmove",this._handleTouchMove,{passive:!1}),e("touchend",this._handleTouchEnd,{passive:!1});break;case"pointerdown":e("pointermove",this._handlePointerMove,{passive:!1}),e("pointerup",this._handlePointerUp,{passive:!1})}this._drawingStroke=!0;const i=this._getPointGroupOptions(),n=Object.assign(Object.assign({},i),{points:[]});this._data.push(n),this._reset(i),this._strokeUpdate(t)}_strokeUpdate(t){if(!this._drawingStroke)return;if(0===this._data.length)return void this._strokeBegin(t);this.dispatchEvent(new CustomEvent("beforeUpdateStroke",{detail:t}));const e=this._createPoint(t.x,t.y,t.pressure),i=this._data[this._data.length-1],n=i.points,s=n.length>0&&n[n.length-1],o=!!s&&e.distanceTo(s)<=this.minDistance,r=this._getPointGroupOptions(i);if(!s||!s||!o){const t=this._addPoint(e,r);s?t&&this._drawCurve(t,r):this._drawDot(e,r),n.push({time:e.time,x:e.x,y:e.y,pressure:e.pressure})}this.dispatchEvent(new CustomEvent("afterUpdateStroke",{detail:t}))}_strokeEnd(t,e=!0){this._removeMoveUpEventListeners(),this._drawingStroke&&(e&&this._strokeUpdate(t),this._drawingStroke=!1,this._strokePointerId=void 0,this.dispatchEvent(new CustomEvent("endStroke",{detail:t})))}_handlePointerEvents(){this._drawingStroke=!1,this.canvas.addEventListener("pointerdown",this._handlePointerDown,{passive:!1})}_handleMouseEvents(){this._drawingStroke=!1,this.canvas.addEventListener("mousedown",this._handleMouseDown,{passive:!1})}_handleTouchEvents(){this.canvas.addEventListener("touchstart",this._handleTouchStart,{passive:!1})}_reset(t){this._lastPoints=[],this._lastVelocity=0,this._lastWidth=(t.minWidth+t.maxWidth)/2,this._ctx.fillStyle=t.penColor,this._ctx.globalCompositeOperation=t.compositeOperation}_createPoint(e,i,n){const s=this.canvas.getBoundingClientRect();return new t(e-s.left,i-s.top,n,(new Date).getTime())}_addPoint(t,i){const{_lastPoints:n}=this;if(n.push(t),n.length>2){3===n.length&&n.unshift(n[0]);const t=this._calculateCurveWidths(n[1],n[2],i),s=e.fromPoints(n,t);return n.shift(),s}return null}_calculateCurveWidths(t,e,i){const n=i.velocityFilterWeight*e.velocityFrom(t)+(1-i.velocityFilterWeight)*this._lastVelocity,s=this._strokeWidth(n,i),o={end:s,start:this._lastWidth};return this._lastVelocity=n,this._lastWidth=s,o}_strokeWidth(t,e){return Math.max(e.maxWidth/(t+1),e.minWidth)}_drawCurveSegment(t,e,i){const n=this._ctx;n.moveTo(t,e),n.arc(t,e,i,0,2*Math.PI,!1),this._isEmpty=!1}_drawCurve(t,e){const i=this._ctx,n=t.endWidth-t.startWidth,s=2*Math.ceil(t.length());i.beginPath(),i.fillStyle=e.penColor;for(let i=0;i<s;i+=1){const o=i/s,r=o*o,h=r*o,a=1-o,d=a*a,l=d*a;let c=l*t.startPoint.x;c+=3*d*o*t.control1.x,c+=3*a*r*t.control2.x,c+=h*t.endPoint.x;let u=l*t.startPoint.y;u+=3*d*o*t.control1.y,u+=3*a*r*t.control2.y,u+=h*t.endPoint.y;const _=Math.min(t.startWidth+h*n,e.maxWidth);this._drawCurveSegment(c,u,_)}i.closePath(),i.fill()}_drawDot(t,e){const i=this._ctx,n=e.dotSize>0?e.dotSize:(e.minWidth+e.maxWidth)/2;i.beginPath(),this._drawCurveSegment(t.x,t.y,n),i.closePath(),i.fillStyle=e.penColor,i.fill()}_fromData(e,i,n){for(const s of e){const{points:e}=s,o=this._getPointGroupOptions(s);if(e.length>1)for(let n=0;n<e.length;n+=1){const s=e[n],r=new t(s.x,s.y,s.pressure,s.time);0===n&&this._reset(o);const h=this._addPoint(r,o);h&&i(h,o)}else this._reset(o),n(e[0],o)}}toSVG({includeBackgroundColor:t=!1}={}){const e=this._data,i=Math.max(window.devicePixelRatio||1,1),n=this.canvas.width/i,s=this.canvas.height/i,o=document.createElementNS("http://www.w3.org/2000/svg","svg");if(o.setAttribute("xmlns","http://www.w3.org/2000/svg"),o.setAttribute("xmlns:xlink","http://www.w3.org/1999/xlink"),o.setAttribute("viewBox",`0 0 ${n} ${s}`),o.setAttribute("width",n.toString()),o.setAttribute("height",s.toString()),t&&this.backgroundColor){const t=document.createElement("rect");t.setAttribute("width","100%"),t.setAttribute("height","100%"),t.setAttribute("fill",this.backgroundColor),o.appendChild(t)}return this._fromData(e,((t,{penColor:e})=>{const i=document.createElement("path");if(!(isNaN(t.control1.x)||isNaN(t.control1.y)||isNaN(t.control2.x)||isNaN(t.control2.y))){const n=`M ${t.startPoint.x.toFixed(3)},${t.startPoint.y.toFixed(3)} C ${t.control1.x.toFixed(3)},${t.control1.y.toFixed(3)} ${t.control2.x.toFixed(3)},${t.control2.y.toFixed(3)} ${t.endPoint.x.toFixed(3)},${t.endPoint.y.toFixed(3)}`;i.setAttribute("d",n),i.setAttribute("stroke-width",(2.25*t.endWidth).toFixed(3)),i.setAttribute("stroke",e),i.setAttribute("fill","none"),i.setAttribute("stroke-linecap","round"),o.appendChild(i)}}),((t,{penColor:e,dotSize:i,minWidth:n,maxWidth:s})=>{const r=document.createElement("circle"),h=i>0?i:(n+s)/2;r.setAttribute("r",h.toString()),r.setAttribute("cx",t.x.toString()),r.setAttribute("cy",t.y.toString()),r.setAttribute("fill",e),o.appendChild(r)})),o.outerHTML}}return n}));
6
6
  //# sourceMappingURL=signature_pad.umd.min.js.map