@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.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.min.js","sources":["../src/point.ts","../src/bezier.ts","../src/signature_event_target.ts","../src/signature_pad.ts","../src/throttle.ts"],"sourcesContent":["// Interface for point data structure used e.g. in SignaturePad#fromData method\nexport interface BasicPoint {\n x: number;\n y: number;\n pressure: number;\n time: number;\n}\n\nexport class Point implements BasicPoint {\n public x: number;\n public y: number;\n public pressure: number;\n public time: number;\n\n constructor(x: number, y: number, pressure?: number, time?: number) {\n if (isNaN(x) || isNaN(y)) {\n throw new Error(`Point is invalid: (${x}, ${y})`);\n }\n this.x = +x;\n this.y = +y;\n this.pressure = pressure || 0;\n this.time = time || Date.now();\n }\n\n public distanceTo(start: BasicPoint): number {\n return Math.sqrt(\n Math.pow(this.x - start.x, 2) + Math.pow(this.y - start.y, 2),\n );\n }\n\n public equals(other: BasicPoint): boolean {\n return (\n this.x === other.x &&\n this.y === other.y &&\n this.pressure === other.pressure &&\n this.time === other.time\n );\n }\n\n public velocityFrom(start: BasicPoint): number {\n return this.time !== start.time\n ? this.distanceTo(start) / (this.time - start.time)\n : 0;\n }\n}\n","import { BasicPoint, Point } from './point';\n\nexport class Bezier {\n public static fromPoints(\n points: Point[],\n widths: { start: number; end: number },\n ): Bezier {\n const c2 = this.calculateControlPoints(points[0], points[1], points[2]).c2;\n const c3 = this.calculateControlPoints(points[1], points[2], points[3]).c1;\n\n return new Bezier(points[1], c2, c3, points[2], widths.start, widths.end);\n }\n\n private static calculateControlPoints(\n s1: BasicPoint,\n s2: BasicPoint,\n s3: BasicPoint,\n ): {\n c1: BasicPoint;\n c2: BasicPoint;\n } {\n const dx1 = s1.x - s2.x;\n const dy1 = s1.y - s2.y;\n const dx2 = s2.x - s3.x;\n const dy2 = s2.y - s3.y;\n\n const m1 = { x: (s1.x + s2.x) / 2.0, y: (s1.y + s2.y) / 2.0 };\n const m2 = { x: (s2.x + s3.x) / 2.0, y: (s2.y + s3.y) / 2.0 };\n\n const l1 = Math.sqrt(dx1 * dx1 + dy1 * dy1);\n const l2 = Math.sqrt(dx2 * dx2 + dy2 * dy2);\n\n const dxm = m1.x - m2.x;\n const dym = m1.y - m2.y;\n\n const k = l1 + l2 == 0 ? 0 : l2 / (l1 + l2);\n const cm = { x: m2.x + dxm * k, y: m2.y + dym * k };\n\n const tx = s2.x - cm.x;\n const ty = s2.y - cm.y;\n\n return {\n c1: new Point(m1.x + tx, m1.y + ty),\n c2: new Point(m2.x + tx, m2.y + ty),\n };\n }\n\n constructor(\n public startPoint: Point,\n public control2: BasicPoint,\n public control1: BasicPoint,\n public endPoint: Point,\n public startWidth: number,\n public endWidth: number,\n ) {}\n\n // Returns approximated length. Code taken from https://www.lemoda.net/maths/bezier-length/index.html.\n public length(): number {\n const steps = 10;\n let length = 0;\n let px;\n let py;\n\n for (let i = 0; i <= steps; i += 1) {\n const t = i / steps;\n const cx = this.point(\n t,\n this.startPoint.x,\n this.control1.x,\n this.control2.x,\n this.endPoint.x,\n );\n const cy = this.point(\n t,\n this.startPoint.y,\n this.control1.y,\n this.control2.y,\n this.endPoint.y,\n );\n\n if (i > 0) {\n const xdiff = cx - (px as number);\n const ydiff = cy - (py as number);\n\n length += Math.sqrt(xdiff * xdiff + ydiff * ydiff);\n }\n\n px = cx;\n py = cy;\n }\n\n return length;\n }\n\n // Calculate parametric value of x or y given t and the four point coordinates of a cubic bezier curve.\n private point(\n t: number,\n start: number,\n c1: number,\n c2: number,\n end: number,\n ): number {\n // prettier-ignore\n return ( start * (1.0 - t) * (1.0 - t) * (1.0 - t))\n + (3.0 * c1 * (1.0 - t) * (1.0 - t) * t)\n + (3.0 * c2 * (1.0 - t) * t * t)\n + ( end * t * t * t);\n }\n}\n","export class SignatureEventTarget {\n /* tslint:disable: variable-name */\n private _et: EventTarget;\n /* tslint:enable: variable-name */\n\n constructor() {\n try {\n this._et = new EventTarget();\n } catch {\n // Using document as EventTarget to support iOS 13 and older.\n // Because EventTarget constructor just exists at iOS 14 and later.\n this._et = document;\n }\n }\n\n addEventListener(\n type: string,\n listener: EventListenerOrEventListenerObject | null,\n options?: boolean | AddEventListenerOptions,\n ): void {\n this._et.addEventListener(type, listener, options);\n }\n\n dispatchEvent(event: Event): boolean {\n return this._et.dispatchEvent(event);\n }\n\n removeEventListener(\n type: string,\n callback: EventListenerOrEventListenerObject | null,\n options?: boolean | EventListenerOptions,\n ): void {\n this._et.removeEventListener(type, callback, options);\n }\n}\n","/**\n * The main idea and some parts of the code (e.g. drawing variable width Bézier curve) are taken from:\n * http://corner.squareup.com/2012/07/smoother-signatures.html\n *\n * Implementation of interpolation using cubic Bézier curves is taken from:\n * https://web.archive.org/web/20160323213433/http://www.benknowscode.com/2012/09/path-interpolation-using-cubic-bezier_9742.html\n *\n * Algorithm for approximated length of a Bézier curve is taken from:\n * http://www.lemoda.net/maths/bezier-length/index.html\n */\n\nimport { Bezier } from './bezier';\nimport { BasicPoint, Point } from './point';\nimport { SignatureEventTarget } from './signature_event_target';\nimport { throttle } from './throttle';\n\nexport { BasicPoint } from './point';\n\nexport interface SignatureEvent {\n event: MouseEvent | TouchEvent | PointerEvent;\n type: string;\n x: number;\n y: number;\n pressure: number;\n}\n\nexport interface FromDataOptions {\n clear?: boolean;\n}\n\nexport interface ToSVGOptions {\n includeBackgroundColor?: boolean;\n}\n\nexport interface PointGroupOptions {\n dotSize: number;\n minWidth: number;\n maxWidth: number;\n penColor: string;\n velocityFilterWeight: number;\n /**\n * This is the globalCompositeOperation for the line.\n * *default: 'source-over'*\n * @see https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation\n */\n compositeOperation: GlobalCompositeOperation;\n}\n\nexport interface Options extends Partial<PointGroupOptions> {\n minDistance?: number;\n backgroundColor?: string;\n throttle?: number;\n canvasContextOptions?: CanvasRenderingContext2DSettings;\n}\n\nexport interface PointGroup extends PointGroupOptions {\n points: BasicPoint[];\n}\n\nexport default class SignaturePad extends SignatureEventTarget {\n // Public stuff\n public dotSize: number;\n public minWidth: number;\n public maxWidth: number;\n public penColor: string;\n public minDistance: number;\n public velocityFilterWeight: number;\n public compositeOperation: GlobalCompositeOperation;\n public backgroundColor: string;\n public throttle: number;\n public canvasContextOptions: CanvasRenderingContext2DSettings;\n\n // Private stuff\n /* tslint:disable: variable-name */\n private _ctx: CanvasRenderingContext2D;\n private _drawingStroke = false;\n private _isEmpty = true;\n private _lastPoints: Point[] = []; // Stores up to 4 most recent points; used to generate a new curve\n private _data: PointGroup[] = []; // Stores all points in groups (one group per line or dot)\n private _lastVelocity = 0;\n private _lastWidth = 0;\n private _strokeMoveUpdate: (event: SignatureEvent) => void;\n private _strokePointerId: number | undefined;\n /* tslint:enable: variable-name */\n\n constructor(\n private canvas: HTMLCanvasElement,\n options: Options = {},\n ) {\n super();\n this.velocityFilterWeight = options.velocityFilterWeight || 0.7;\n this.minWidth = options.minWidth || 0.5;\n this.maxWidth = options.maxWidth || 2.5;\n\n // We need to handle 0 value, so use `??` instead of `||`\n this.throttle = options.throttle ?? 16; // in milliseconds\n this.minDistance = options.minDistance ?? 5; // in pixels\n this.dotSize = options.dotSize || 0;\n this.penColor = options.penColor || 'black';\n this.backgroundColor = options.backgroundColor || 'rgba(0,0,0,0)';\n this.compositeOperation = options.compositeOperation || 'source-over';\n this.canvasContextOptions = options.canvasContextOptions ?? {};\n\n this._strokeMoveUpdate = this.throttle\n ? throttle(SignaturePad.prototype._strokeUpdate, this.throttle)\n : SignaturePad.prototype._strokeUpdate;\n\n this._handleMouseDown = this._handleMouseDown.bind(this);\n this._handleMouseMove = this._handleMouseMove.bind(this);\n this._handleMouseUp = this._handleMouseUp.bind(this);\n this._handleTouchStart = this._handleTouchStart.bind(this);\n this._handleTouchMove = this._handleTouchMove.bind(this);\n this._handleTouchEnd = this._handleTouchEnd.bind(this);\n this._handlePointerDown = this._handlePointerDown.bind(this);\n this._handlePointerMove = this._handlePointerMove.bind(this);\n this._handlePointerUp = this._handlePointerUp.bind(this);\n\n this._ctx = canvas.getContext(\n '2d',\n this.canvasContextOptions,\n ) as CanvasRenderingContext2D;\n\n this.clear();\n\n // Enable mouse and touch event handlers\n this.on();\n }\n\n public clear(): void {\n const { _ctx: ctx, canvas } = this;\n\n // Clear canvas using background color\n ctx.fillStyle = this.backgroundColor;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n this._data = [];\n this._reset(this._getPointGroupOptions());\n this._isEmpty = true;\n this._strokePointerId = undefined;\n }\n\n public fromDataURL(\n dataUrl: string,\n options: {\n ratio?: number;\n width?: number;\n height?: number;\n xOffset?: number;\n yOffset?: number;\n } = {},\n ): Promise<void> {\n return new Promise((resolve, reject) => {\n const image = new Image();\n const ratio = options.ratio || window.devicePixelRatio || 1;\n const width = options.width || this.canvas.width / ratio;\n const height = options.height || this.canvas.height / ratio;\n const xOffset = options.xOffset || 0;\n const yOffset = options.yOffset || 0;\n\n this._reset(this._getPointGroupOptions());\n\n image.onload = (): void => {\n this._ctx.drawImage(image, xOffset, yOffset, width, height);\n resolve();\n };\n image.onerror = (error): void => {\n reject(error);\n };\n image.crossOrigin = 'anonymous';\n image.src = dataUrl;\n\n this._isEmpty = false;\n });\n }\n\n public toDataURL(\n type: 'image/svg+xml',\n encoderOptions?: ToSVGOptions,\n ): string;\n public toDataURL(type?: string, encoderOptions?: number): string;\n public toDataURL(\n type = 'image/png',\n encoderOptions?: number | ToSVGOptions | undefined,\n ): string {\n switch (type) {\n case 'image/svg+xml':\n if (typeof encoderOptions !== 'object') {\n encoderOptions = undefined;\n }\n return `data:image/svg+xml;base64,${btoa(\n this.toSVG(encoderOptions as ToSVGOptions),\n )}`;\n default:\n if (typeof encoderOptions !== 'number') {\n encoderOptions = undefined;\n }\n return this.canvas.toDataURL(type, encoderOptions as number);\n }\n }\n\n public on(): void {\n // Disable panning/zooming when touching canvas element\n this.canvas.style.touchAction = 'none';\n (\n this.canvas.style as CSSStyleDeclaration & {\n msTouchAction: string | null;\n }\n ).msTouchAction = 'none';\n this.canvas.style.userSelect = 'none';\n\n const isIOS =\n /Macintosh/.test(navigator.userAgent) && 'ontouchstart' in document;\n\n // The \"Scribble\" feature of iOS intercepts point events. So that we can\n // lose some of them when tapping rapidly. Use touch events for iOS\n // platforms to prevent it. See\n // https://developer.apple.com/forums/thread/664108 for more information.\n if (window.PointerEvent && !isIOS) {\n this._handlePointerEvents();\n } else {\n this._handleMouseEvents();\n\n if ('ontouchstart' in window) {\n this._handleTouchEvents();\n }\n }\n }\n\n public off(): void {\n // Enable panning/zooming when touching canvas element\n this.canvas.style.touchAction = 'auto';\n (\n this.canvas.style as CSSStyleDeclaration & {\n msTouchAction: string | null;\n }\n ).msTouchAction = 'auto';\n this.canvas.style.userSelect = 'auto';\n\n this.canvas.removeEventListener('pointerdown', this._handlePointerDown);\n this.canvas.removeEventListener('mousedown', this._handleMouseDown);\n this.canvas.removeEventListener('touchstart', this._handleTouchStart);\n\n this._removeMoveUpEventListeners();\n }\n\n private _getListenerFunctions() {\n const canvasWindow =\n window.document === this.canvas.ownerDocument\n ? window\n : (this.canvas.ownerDocument.defaultView ?? this.canvas.ownerDocument);\n\n return {\n addEventListener: canvasWindow.addEventListener.bind(\n canvasWindow,\n ) as typeof window.addEventListener,\n removeEventListener: canvasWindow.removeEventListener.bind(\n canvasWindow,\n ) as typeof window.removeEventListener,\n };\n }\n\n private _removeMoveUpEventListeners(): void {\n const { removeEventListener } = this._getListenerFunctions();\n removeEventListener('pointermove', this._handlePointerMove);\n removeEventListener('pointerup', this._handlePointerUp);\n\n removeEventListener('mousemove', this._handleMouseMove);\n removeEventListener('mouseup', this._handleMouseUp);\n\n removeEventListener('touchmove', this._handleTouchMove);\n removeEventListener('touchend', this._handleTouchEnd);\n }\n\n public isEmpty(): boolean {\n return this._isEmpty;\n }\n\n public fromData(\n pointGroups: PointGroup[],\n { clear = true }: FromDataOptions = {},\n ): void {\n if (clear) {\n this.clear();\n }\n\n this._fromData(\n pointGroups,\n this._drawCurve.bind(this),\n this._drawDot.bind(this),\n );\n\n this._data = this._data.concat(pointGroups);\n }\n\n public toData(): PointGroup[] {\n return this._data;\n }\n\n private _isLeftButtonPressed(event: MouseEvent, only?: boolean): boolean {\n if (only) {\n return event.buttons === 1;\n }\n\n return (event.buttons & 1) === 1;\n }\n private _pointerEventToSignatureEvent(\n event: MouseEvent | PointerEvent,\n ): SignatureEvent {\n return {\n event: event,\n type: event.type,\n x: event.clientX,\n y: event.clientY,\n pressure: 'pressure' in event ? event.pressure : 0,\n };\n }\n\n private _touchEventToSignatureEvent(event: TouchEvent): SignatureEvent {\n const touch = event.changedTouches[0];\n return {\n event: event,\n type: event.type,\n x: touch.clientX,\n y: touch.clientY,\n pressure: touch.force,\n };\n }\n\n // Event handlers\n private _handleMouseDown(event: MouseEvent): void {\n if (!this._isLeftButtonPressed(event, true) || this._drawingStroke) {\n return;\n }\n this._strokeBegin(this._pointerEventToSignatureEvent(event));\n };\n\n private _handleMouseMove(event: MouseEvent): void {\n if (!this._isLeftButtonPressed(event, true) || !this._drawingStroke) {\n // Stop when not pressing primary button or pressing multiple buttons\n this._strokeEnd(this._pointerEventToSignatureEvent(event), false);\n return;\n }\n\n this._strokeMoveUpdate(this._pointerEventToSignatureEvent(event));\n };\n\n private _handleMouseUp(event: MouseEvent): void {\n if (this._isLeftButtonPressed(event)) {\n return;\n }\n\n this._strokeEnd(this._pointerEventToSignatureEvent(event));\n };\n\n private _handleTouchStart(event: TouchEvent): void {\n if (event.targetTouches.length !== 1 || this._drawingStroke) {\n return;\n }\n\n // Prevent scrolling.\n if (event.cancelable) {\n event.preventDefault();\n }\n\n this._strokeBegin(this._touchEventToSignatureEvent(event));\n };\n\n private _handleTouchMove(event: TouchEvent): void {\n if (event.targetTouches.length !== 1) {\n return;\n }\n\n // Prevent scrolling.\n if (event.cancelable) {\n event.preventDefault();\n }\n\n if (!this._drawingStroke) {\n this._strokeEnd(this._touchEventToSignatureEvent(event), false);\n return;\n }\n\n this._strokeMoveUpdate(this._touchEventToSignatureEvent(event));\n };\n\n private _handleTouchEnd(event: TouchEvent): void {\n if (event.targetTouches.length !== 0) {\n return;\n }\n\n if (event.cancelable) {\n event.preventDefault();\n }\n\n this._strokeEnd(this._touchEventToSignatureEvent(event));\n };\n\n private _getPointerId(event: PointerEvent) {\n // @ts-expect-error persistentDeviceId is not available yet but we want to use it when it is available\n return event.persistentDeviceId || event.pointerId;\n }\n\n private _allowPointerId(event: PointerEvent, allowUndefined = false): boolean {\n if (typeof this._strokePointerId === 'undefined') {\n return allowUndefined;\n }\n\n return this._getPointerId(event) === this._strokePointerId;\n }\n\n private _handlePointerDown(event: PointerEvent): void {\n if (\n this._drawingStroke ||\n !this._isLeftButtonPressed(event) ||\n !this._allowPointerId(event, true)\n ) {\n return;\n }\n\n this._strokePointerId = this._getPointerId(event);\n\n event.preventDefault();\n\n this._strokeBegin(this._pointerEventToSignatureEvent(event));\n };\n\n private _handlePointerMove(event: PointerEvent): void {\n if (!this._allowPointerId(event)) {\n return;\n }\n if (!this._isLeftButtonPressed(event, true) || !this._drawingStroke) {\n // Stop when primary button not pressed or multiple buttons pressed\n this._strokeEnd(this._pointerEventToSignatureEvent(event), false);\n return;\n }\n\n event.preventDefault();\n this._strokeMoveUpdate(this._pointerEventToSignatureEvent(event));\n };\n\n private _handlePointerUp(event: PointerEvent): void {\n if (\n this._isLeftButtonPressed(event) ||\n !this._allowPointerId(event)\n ) {\n return;\n }\n\n event.preventDefault();\n this._strokeEnd(this._pointerEventToSignatureEvent(event));\n };\n\n private _getPointGroupOptions(group?: PointGroup): PointGroupOptions {\n return {\n penColor: group && 'penColor' in group ? group.penColor : this.penColor,\n dotSize: group && 'dotSize' in group ? group.dotSize : this.dotSize,\n minWidth: group && 'minWidth' in group ? group.minWidth : this.minWidth,\n maxWidth: group && 'maxWidth' in group ? group.maxWidth : this.maxWidth,\n velocityFilterWeight:\n group && 'velocityFilterWeight' in group\n ? group.velocityFilterWeight\n : this.velocityFilterWeight,\n compositeOperation:\n group && 'compositeOperation' in group\n ? group.compositeOperation\n : this.compositeOperation,\n };\n }\n\n // Private methods\n private _strokeBegin(event: SignatureEvent): void {\n const cancelled = !this.dispatchEvent(\n new CustomEvent('beginStroke', { detail: event, cancelable: true }),\n );\n if (cancelled) {\n return;\n }\n\n const { addEventListener } = this._getListenerFunctions();\n switch (event.event.type) {\n case 'mousedown':\n addEventListener('mousemove', this._handleMouseMove, {\n passive: false,\n });\n addEventListener('mouseup', this._handleMouseUp, { passive: false });\n break;\n case 'touchstart':\n addEventListener('touchmove', this._handleTouchMove, {\n passive: false,\n });\n addEventListener('touchend', this._handleTouchEnd, { passive: false });\n break;\n case 'pointerdown':\n addEventListener('pointermove', this._handlePointerMove, {\n passive: false,\n });\n addEventListener('pointerup', this._handlePointerUp, {\n passive: false,\n });\n break;\n default:\n // do nothing\n }\n\n this._drawingStroke = true;\n\n const pointGroupOptions = this._getPointGroupOptions();\n\n const newPointGroup: PointGroup = {\n ...pointGroupOptions,\n points: [],\n };\n\n this._data.push(newPointGroup);\n this._reset(pointGroupOptions);\n this._strokeUpdate(event);\n }\n\n private _strokeUpdate(event: SignatureEvent): void {\n if (!this._drawingStroke) {\n return;\n }\n\n if (this._data.length === 0) {\n // This can happen if clear() was called while a signature is still in progress,\n // or if there is a race condition between start/update events.\n this._strokeBegin(event);\n return;\n }\n\n this.dispatchEvent(\n new CustomEvent('beforeUpdateStroke', { detail: event }),\n );\n\n const point = this._createPoint(event.x, event.y, event.pressure);\n const lastPointGroup = this._data[this._data.length - 1];\n const lastPoints = lastPointGroup.points;\n const lastPoint =\n lastPoints.length > 0 && lastPoints[lastPoints.length - 1];\n const isLastPointTooClose = lastPoint\n ? point.distanceTo(lastPoint) <= this.minDistance\n : false;\n const pointGroupOptions = this._getPointGroupOptions(lastPointGroup);\n\n // Skip this point if it's too close to the previous one\n if (!lastPoint || !(lastPoint && isLastPointTooClose)) {\n const curve = this._addPoint(point, pointGroupOptions);\n\n if (!lastPoint) {\n this._drawDot(point, pointGroupOptions);\n } else if (curve) {\n this._drawCurve(curve, pointGroupOptions);\n }\n\n lastPoints.push({\n time: point.time,\n x: point.x,\n y: point.y,\n pressure: point.pressure,\n });\n }\n\n this.dispatchEvent(new CustomEvent('afterUpdateStroke', { detail: event }));\n }\n\n private _strokeEnd(event: SignatureEvent, shouldUpdate = true): void {\n this._removeMoveUpEventListeners();\n\n if (!this._drawingStroke) {\n return;\n }\n\n if (shouldUpdate) {\n this._strokeUpdate(event);\n }\n\n this._drawingStroke = false;\n this._strokePointerId = undefined;\n this.dispatchEvent(new CustomEvent('endStroke', { detail: event }));\n }\n\n private _handlePointerEvents(): void {\n this._drawingStroke = false;\n\n this.canvas.addEventListener('pointerdown', this._handlePointerDown, {\n passive: false,\n });\n }\n\n private _handleMouseEvents(): void {\n this._drawingStroke = false;\n\n this.canvas.addEventListener('mousedown', this._handleMouseDown, {\n passive: false,\n });\n }\n\n private _handleTouchEvents(): void {\n this.canvas.addEventListener('touchstart', this._handleTouchStart, {\n passive: false,\n });\n }\n\n // Called when a new line is started\n private _reset(options: PointGroupOptions): void {\n this._lastPoints = [];\n this._lastVelocity = 0;\n this._lastWidth = (options.minWidth + options.maxWidth) / 2;\n this._ctx.fillStyle = options.penColor;\n this._ctx.globalCompositeOperation = options.compositeOperation;\n }\n\n private _createPoint(x: number, y: number, pressure: number): Point {\n const rect = this.canvas.getBoundingClientRect();\n\n return new Point(\n x - rect.left,\n y - rect.top,\n pressure,\n new Date().getTime(),\n );\n }\n\n // Add point to _lastPoints array and generate a new curve if there are enough points (i.e. 3)\n private _addPoint(point: Point, options: PointGroupOptions): Bezier | null {\n const { _lastPoints } = this;\n\n _lastPoints.push(point);\n\n if (_lastPoints.length > 2) {\n // To reduce the initial lag make it work with 3 points\n // by copying the first point to the beginning.\n if (_lastPoints.length === 3) {\n _lastPoints.unshift(_lastPoints[0]);\n }\n\n // _points array will always have 4 points here.\n const widths = this._calculateCurveWidths(\n _lastPoints[1],\n _lastPoints[2],\n options,\n );\n const curve = Bezier.fromPoints(_lastPoints, widths);\n\n // Remove the first element from the list, so that there are no more than 4 points at any time.\n _lastPoints.shift();\n\n return curve;\n }\n\n return null;\n }\n\n private _calculateCurveWidths(\n startPoint: Point,\n endPoint: Point,\n options: PointGroupOptions,\n ): { start: number; end: number } {\n const velocity =\n options.velocityFilterWeight * endPoint.velocityFrom(startPoint) +\n (1 - options.velocityFilterWeight) * this._lastVelocity;\n\n const newWidth = this._strokeWidth(velocity, options);\n\n const widths = {\n end: newWidth,\n start: this._lastWidth,\n };\n\n this._lastVelocity = velocity;\n this._lastWidth = newWidth;\n\n return widths;\n }\n\n private _strokeWidth(velocity: number, options: PointGroupOptions): number {\n return Math.max(options.maxWidth / (velocity + 1), options.minWidth);\n }\n\n private _drawCurveSegment(x: number, y: number, width: number): void {\n const ctx = this._ctx;\n\n ctx.moveTo(x, y);\n ctx.arc(x, y, width, 0, 2 * Math.PI, false);\n this._isEmpty = false;\n }\n\n private _drawCurve(curve: Bezier, options: PointGroupOptions): void {\n const ctx = this._ctx;\n const widthDelta = curve.endWidth - curve.startWidth;\n // '2' is just an arbitrary number here. If only length is used, then\n // there are gaps between curve segments :/\n const drawSteps = Math.ceil(curve.length()) * 2;\n\n ctx.beginPath();\n ctx.fillStyle = options.penColor;\n\n for (let i = 0; i < drawSteps; i += 1) {\n // Calculate the Bezier (x, y) coordinate for this step.\n const t = i / drawSteps;\n const tt = t * t;\n const ttt = tt * t;\n const u = 1 - t;\n const uu = u * u;\n const uuu = uu * u;\n\n let x = uuu * curve.startPoint.x;\n x += 3 * uu * t * curve.control1.x;\n x += 3 * u * tt * curve.control2.x;\n x += ttt * curve.endPoint.x;\n\n let y = uuu * curve.startPoint.y;\n y += 3 * uu * t * curve.control1.y;\n y += 3 * u * tt * curve.control2.y;\n y += ttt * curve.endPoint.y;\n\n const width = Math.min(\n curve.startWidth + ttt * widthDelta,\n options.maxWidth,\n );\n this._drawCurveSegment(x, y, width);\n }\n\n ctx.closePath();\n ctx.fill();\n }\n\n private _drawDot(point: BasicPoint, options: PointGroupOptions): void {\n const ctx = this._ctx;\n const width =\n options.dotSize > 0\n ? options.dotSize\n : (options.minWidth + options.maxWidth) / 2;\n\n ctx.beginPath();\n this._drawCurveSegment(point.x, point.y, width);\n ctx.closePath();\n ctx.fillStyle = options.penColor;\n ctx.fill();\n }\n\n private _fromData(\n pointGroups: PointGroup[],\n drawCurve: SignaturePad['_drawCurve'],\n drawDot: SignaturePad['_drawDot'],\n ): void {\n for (const group of pointGroups) {\n const { points } = group;\n const pointGroupOptions = this._getPointGroupOptions(group);\n\n if (points.length > 1) {\n for (let j = 0; j < points.length; j += 1) {\n const basicPoint = points[j];\n const point = new Point(\n basicPoint.x,\n basicPoint.y,\n basicPoint.pressure,\n basicPoint.time,\n );\n\n if (j === 0) {\n this._reset(pointGroupOptions);\n }\n\n const curve = this._addPoint(point, pointGroupOptions);\n\n if (curve) {\n drawCurve(curve, pointGroupOptions);\n }\n }\n } else {\n this._reset(pointGroupOptions);\n\n drawDot(points[0], pointGroupOptions);\n }\n }\n }\n\n public toSVG({ includeBackgroundColor = false }: ToSVGOptions = {}): string {\n const pointGroups = this._data;\n const ratio = Math.max(window.devicePixelRatio || 1, 1);\n const minX = 0;\n const minY = 0;\n const maxX = this.canvas.width / ratio;\n const maxY = this.canvas.height / ratio;\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n\n svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n svg.setAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink');\n svg.setAttribute('viewBox', `${minX} ${minY} ${maxX} ${maxY}`);\n svg.setAttribute('width', maxX.toString());\n svg.setAttribute('height', maxY.toString());\n\n if (includeBackgroundColor && this.backgroundColor) {\n const rect = document.createElement('rect');\n rect.setAttribute('width', '100%');\n rect.setAttribute('height', '100%');\n rect.setAttribute('fill', this.backgroundColor);\n\n svg.appendChild(rect);\n }\n\n this._fromData(\n pointGroups,\n\n (curve, { penColor }) => {\n const path = document.createElement('path');\n\n // Need to check curve for NaN values, these pop up when drawing\n // lines on the canvas that are not continuous. E.g. Sharp corners\n // or stopping mid-stroke and than continuing without lifting mouse.\n if (\n !isNaN(curve.control1.x) &&\n !isNaN(curve.control1.y) &&\n !isNaN(curve.control2.x) &&\n !isNaN(curve.control2.y)\n ) {\n const attr =\n `M ${curve.startPoint.x.toFixed(3)},${curve.startPoint.y.toFixed(\n 3,\n )} ` +\n `C ${curve.control1.x.toFixed(3)},${curve.control1.y.toFixed(3)} ` +\n `${curve.control2.x.toFixed(3)},${curve.control2.y.toFixed(3)} ` +\n `${curve.endPoint.x.toFixed(3)},${curve.endPoint.y.toFixed(3)}`;\n path.setAttribute('d', attr);\n path.setAttribute('stroke-width', (curve.endWidth * 2.25).toFixed(3));\n path.setAttribute('stroke', penColor);\n path.setAttribute('fill', 'none');\n path.setAttribute('stroke-linecap', 'round');\n\n svg.appendChild(path);\n }\n },\n\n (point, { penColor, dotSize, minWidth, maxWidth }) => {\n const circle = document.createElement('circle');\n const size = dotSize > 0 ? dotSize : (minWidth + maxWidth) / 2;\n circle.setAttribute('r', size.toString());\n circle.setAttribute('cx', point.x.toString());\n circle.setAttribute('cy', point.y.toString());\n circle.setAttribute('fill', penColor);\n\n svg.appendChild(circle);\n },\n );\n\n return svg.outerHTML;\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-this-alias */\n// Slightly simplified version of http://stackoverflow.com/a/27078401/815507\n\nexport function throttle(\n fn: (...args: any[]) => any,\n wait = 250,\n): (this: any, ...args: any[]) => any {\n let previous = 0;\n let timeout: number | null = null;\n let result: any;\n let storedContext: any;\n let storedArgs: any[];\n\n const later = (): void => {\n previous = Date.now();\n timeout = null;\n result = fn.apply(storedContext, storedArgs);\n\n if (!timeout) {\n storedContext = null;\n storedArgs = [];\n }\n };\n\n return function wrapper(this: any, ...args: any[]): any {\n const now = Date.now();\n const remaining = wait - (now - previous);\n\n storedContext = this;\n storedArgs = args;\n\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n\n previous = now;\n result = fn.apply(storedContext, storedArgs);\n\n if (!timeout) {\n storedContext = null;\n storedArgs = [];\n }\n } else if (!timeout) {\n timeout = window.setTimeout(later, remaining);\n }\n\n return result;\n };\n}\n"],"names":["Point","constructor","x","y","pressure","time","isNaN","Error","this","Date","now","distanceTo","start","Math","sqrt","pow","equals","other","velocityFrom","Bezier","fromPoints","points","widths","c2","calculateControlPoints","c3","c1","end","s1","s2","s3","dx1","dy1","dx2","dy2","m1","m2","l1","l2","k","cm","tx","ty","startPoint","control2","control1","endPoint","startWidth","endWidth","length","px","py","i","t","cx","point","cy","xdiff","ydiff","SignatureEventTarget","_et","EventTarget","_a","document","addEventListener","type","listener","options","dispatchEvent","event","removeEventListener","callback","SignaturePad","canvas","super","_drawingStroke","_isEmpty","_lastPoints","_data","_lastVelocity","_lastWidth","velocityFilterWeight","minWidth","maxWidth","throttle","minDistance","_b","dotSize","penColor","backgroundColor","compositeOperation","canvasContextOptions","_c","_strokeMoveUpdate","fn","wait","result","storedContext","storedArgs","previous","timeout","later","apply","args","remaining","clearTimeout","window","setTimeout","prototype","_strokeUpdate","_handleMouseDown","bind","_handleMouseMove","_handleMouseUp","_handleTouchStart","_handleTouchMove","_handleTouchEnd","_handlePointerDown","_handlePointerMove","_handlePointerUp","_ctx","getContext","clear","on","ctx","fillStyle","clearRect","width","height","fillRect","_reset","_getPointGroupOptions","_strokePointerId","undefined","fromDataURL","dataUrl","Promise","resolve","reject","image","Image","ratio","devicePixelRatio","xOffset","yOffset","onload","drawImage","onerror","error","crossOrigin","src","toDataURL","encoderOptions","btoa","toSVG","style","touchAction","msTouchAction","userSelect","isIOS","test","navigator","userAgent","PointerEvent","_handlePointerEvents","_handleMouseEvents","_handleTouchEvents","off","_removeMoveUpEventListeners","_getListenerFunctions","canvasWindow","ownerDocument","defaultView","isEmpty","fromData","pointGroups","_fromData","_drawCurve","_drawDot","concat","toData","_isLeftButtonPressed","only","buttons","_pointerEventToSignatureEvent","clientX","clientY","_touchEventToSignatureEvent","touch","changedTouches","force","_strokeBegin","_strokeEnd","targetTouches","cancelable","preventDefault","_getPointerId","persistentDeviceId","pointerId","_allowPointerId","allowUndefined","group","CustomEvent","detail","passive","pointGroupOptions","newPointGroup","push","_createPoint","lastPointGroup","lastPoints","lastPoint","isLastPointTooClose","curve","_addPoint","shouldUpdate","globalCompositeOperation","rect","getBoundingClientRect","left","top","getTime","unshift","_calculateCurveWidths","shift","velocity","newWidth","_strokeWidth","max","_drawCurveSegment","moveTo","arc","PI","widthDelta","drawSteps","ceil","beginPath","tt","ttt","u","uu","uuu","min","closePath","fill","drawCurve","drawDot","j","basicPoint","includeBackgroundColor","maxX","maxY","svg","createElementNS","setAttribute","toString","createElement","appendChild","path","attr","toFixed","circle","size","outerHTML"],"mappings":"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"}
@@ -1,5 +1,5 @@
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
5
 
@@ -166,82 +166,6 @@
166
166
  this._data = [];
167
167
  this._lastVelocity = 0;
168
168
  this._lastWidth = 0;
169
- this._handleMouseDown = (event) => {
170
- if (!this._isLeftButtonPressed(event, true) || this._drawingStroke) {
171
- return;
172
- }
173
- this._strokeBegin(this._pointerEventToSignatureEvent(event));
174
- };
175
- this._handleMouseMove = (event) => {
176
- if (!this._isLeftButtonPressed(event, true) || !this._drawingStroke) {
177
- this._strokeEnd(this._pointerEventToSignatureEvent(event), false);
178
- return;
179
- }
180
- this._strokeMoveUpdate(this._pointerEventToSignatureEvent(event));
181
- };
182
- this._handleMouseUp = (event) => {
183
- if (this._isLeftButtonPressed(event)) {
184
- return;
185
- }
186
- this._strokeEnd(this._pointerEventToSignatureEvent(event));
187
- };
188
- this._handleTouchStart = (event) => {
189
- if (event.targetTouches.length !== 1 || this._drawingStroke) {
190
- return;
191
- }
192
- if (event.cancelable) {
193
- event.preventDefault();
194
- }
195
- this._strokeBegin(this._touchEventToSignatureEvent(event));
196
- };
197
- this._handleTouchMove = (event) => {
198
- if (event.targetTouches.length !== 1) {
199
- return;
200
- }
201
- if (event.cancelable) {
202
- event.preventDefault();
203
- }
204
- if (!this._drawingStroke) {
205
- this._strokeEnd(this._touchEventToSignatureEvent(event), false);
206
- return;
207
- }
208
- this._strokeMoveUpdate(this._touchEventToSignatureEvent(event));
209
- };
210
- this._handleTouchEnd = (event) => {
211
- if (event.targetTouches.length !== 0) {
212
- return;
213
- }
214
- if (event.cancelable) {
215
- event.preventDefault();
216
- }
217
- this.canvas.removeEventListener('touchmove', this._handleTouchMove);
218
- this._strokeEnd(this._touchEventToSignatureEvent(event));
219
- };
220
- this._handlePointerDown = (event) => {
221
- if (!event.isPrimary || !this._isLeftButtonPressed(event) || this._drawingStroke) {
222
- return;
223
- }
224
- event.preventDefault();
225
- this._strokeBegin(this._pointerEventToSignatureEvent(event));
226
- };
227
- this._handlePointerMove = (event) => {
228
- if (!event.isPrimary) {
229
- return;
230
- }
231
- if (!this._isLeftButtonPressed(event, true) || !this._drawingStroke) {
232
- this._strokeEnd(this._pointerEventToSignatureEvent(event), false);
233
- return;
234
- }
235
- event.preventDefault();
236
- this._strokeMoveUpdate(this._pointerEventToSignatureEvent(event));
237
- };
238
- this._handlePointerUp = (event) => {
239
- if (!event.isPrimary || this._isLeftButtonPressed(event)) {
240
- return;
241
- }
242
- event.preventDefault();
243
- this._strokeEnd(this._pointerEventToSignatureEvent(event));
244
- };
245
169
  this.velocityFilterWeight = options.velocityFilterWeight || 0.7;
246
170
  this.minWidth = options.minWidth || 0.5;
247
171
  this.maxWidth = options.maxWidth || 2.5;
@@ -255,6 +179,15 @@
255
179
  this._strokeMoveUpdate = this.throttle
256
180
  ? throttle(SignaturePad.prototype._strokeUpdate, this.throttle)
257
181
  : SignaturePad.prototype._strokeUpdate;
182
+ this._handleMouseDown = this._handleMouseDown.bind(this);
183
+ this._handleMouseMove = this._handleMouseMove.bind(this);
184
+ this._handleMouseUp = this._handleMouseUp.bind(this);
185
+ this._handleTouchStart = this._handleTouchStart.bind(this);
186
+ this._handleTouchMove = this._handleTouchMove.bind(this);
187
+ this._handleTouchEnd = this._handleTouchEnd.bind(this);
188
+ this._handlePointerDown = this._handlePointerDown.bind(this);
189
+ this._handlePointerMove = this._handlePointerMove.bind(this);
190
+ this._handlePointerUp = this._handlePointerUp.bind(this);
258
191
  this._ctx = canvas.getContext('2d', this.canvasContextOptions);
259
192
  this.clear();
260
193
  this.on();
@@ -267,6 +200,7 @@
267
200
  this._data = [];
268
201
  this._reset(this._getPointGroupOptions());
269
202
  this._isEmpty = true;
203
+ this._strokePointerId = undefined;
270
204
  }
271
205
  fromDataURL(dataUrl, options = {}) {
272
206
  return new Promise((resolve, reject) => {
@@ -331,7 +265,7 @@
331
265
  var _a;
332
266
  const canvasWindow = window.document === this.canvas.ownerDocument
333
267
  ? window
334
- : (_a = this.canvas.ownerDocument.defaultView) !== null && _a !== void 0 ? _a : this.canvas.ownerDocument;
268
+ : ((_a = this.canvas.ownerDocument.defaultView) !== null && _a !== void 0 ? _a : this.canvas.ownerDocument);
335
269
  return {
336
270
  addEventListener: canvasWindow.addEventListener.bind(canvasWindow),
337
271
  removeEventListener: canvasWindow.removeEventListener.bind(canvasWindow),
@@ -384,6 +318,103 @@
384
318
  pressure: touch.force,
385
319
  };
386
320
  }
321
+ _handleMouseDown(event) {
322
+ if (!this._isLeftButtonPressed(event, true) || this._drawingStroke) {
323
+ return;
324
+ }
325
+ this._strokeBegin(this._pointerEventToSignatureEvent(event));
326
+ }
327
+ ;
328
+ _handleMouseMove(event) {
329
+ if (!this._isLeftButtonPressed(event, true) || !this._drawingStroke) {
330
+ this._strokeEnd(this._pointerEventToSignatureEvent(event), false);
331
+ return;
332
+ }
333
+ this._strokeMoveUpdate(this._pointerEventToSignatureEvent(event));
334
+ }
335
+ ;
336
+ _handleMouseUp(event) {
337
+ if (this._isLeftButtonPressed(event)) {
338
+ return;
339
+ }
340
+ this._strokeEnd(this._pointerEventToSignatureEvent(event));
341
+ }
342
+ ;
343
+ _handleTouchStart(event) {
344
+ if (event.targetTouches.length !== 1 || this._drawingStroke) {
345
+ return;
346
+ }
347
+ if (event.cancelable) {
348
+ event.preventDefault();
349
+ }
350
+ this._strokeBegin(this._touchEventToSignatureEvent(event));
351
+ }
352
+ ;
353
+ _handleTouchMove(event) {
354
+ if (event.targetTouches.length !== 1) {
355
+ return;
356
+ }
357
+ if (event.cancelable) {
358
+ event.preventDefault();
359
+ }
360
+ if (!this._drawingStroke) {
361
+ this._strokeEnd(this._touchEventToSignatureEvent(event), false);
362
+ return;
363
+ }
364
+ this._strokeMoveUpdate(this._touchEventToSignatureEvent(event));
365
+ }
366
+ ;
367
+ _handleTouchEnd(event) {
368
+ if (event.targetTouches.length !== 0) {
369
+ return;
370
+ }
371
+ if (event.cancelable) {
372
+ event.preventDefault();
373
+ }
374
+ this._strokeEnd(this._touchEventToSignatureEvent(event));
375
+ }
376
+ ;
377
+ _getPointerId(event) {
378
+ return event.persistentDeviceId || event.pointerId;
379
+ }
380
+ _allowPointerId(event, allowUndefined = false) {
381
+ if (typeof this._strokePointerId === 'undefined') {
382
+ return allowUndefined;
383
+ }
384
+ return this._getPointerId(event) === this._strokePointerId;
385
+ }
386
+ _handlePointerDown(event) {
387
+ if (this._drawingStroke ||
388
+ !this._isLeftButtonPressed(event) ||
389
+ !this._allowPointerId(event, true)) {
390
+ return;
391
+ }
392
+ this._strokePointerId = this._getPointerId(event);
393
+ event.preventDefault();
394
+ this._strokeBegin(this._pointerEventToSignatureEvent(event));
395
+ }
396
+ ;
397
+ _handlePointerMove(event) {
398
+ if (!this._allowPointerId(event)) {
399
+ return;
400
+ }
401
+ if (!this._isLeftButtonPressed(event, true) || !this._drawingStroke) {
402
+ this._strokeEnd(this._pointerEventToSignatureEvent(event), false);
403
+ return;
404
+ }
405
+ event.preventDefault();
406
+ this._strokeMoveUpdate(this._pointerEventToSignatureEvent(event));
407
+ }
408
+ ;
409
+ _handlePointerUp(event) {
410
+ if (this._isLeftButtonPressed(event) ||
411
+ !this._allowPointerId(event)) {
412
+ return;
413
+ }
414
+ event.preventDefault();
415
+ this._strokeEnd(this._pointerEventToSignatureEvent(event));
416
+ }
417
+ ;
387
418
  _getPointGroupOptions(group) {
388
419
  return {
389
420
  penColor: group && 'penColor' in group ? group.penColor : this.penColor,
@@ -406,16 +437,24 @@
406
437
  const { addEventListener } = this._getListenerFunctions();
407
438
  switch (event.event.type) {
408
439
  case 'mousedown':
409
- addEventListener('mousemove', this._handleMouseMove);
410
- addEventListener('mouseup', this._handleMouseUp);
440
+ addEventListener('mousemove', this._handleMouseMove, {
441
+ passive: false,
442
+ });
443
+ addEventListener('mouseup', this._handleMouseUp, { passive: false });
411
444
  break;
412
445
  case 'touchstart':
413
- addEventListener('touchmove', this._handleTouchMove);
414
- addEventListener('touchend', this._handleTouchEnd);
446
+ addEventListener('touchmove', this._handleTouchMove, {
447
+ passive: false,
448
+ });
449
+ addEventListener('touchend', this._handleTouchEnd, { passive: false });
415
450
  break;
416
451
  case 'pointerdown':
417
- addEventListener('pointermove', this._handlePointerMove);
418
- addEventListener('pointerup', this._handlePointerUp);
452
+ addEventListener('pointermove', this._handlePointerMove, {
453
+ passive: false,
454
+ });
455
+ addEventListener('pointerup', this._handlePointerUp, {
456
+ passive: false,
457
+ });
419
458
  break;
420
459
  }
421
460
  this._drawingStroke = true;
@@ -468,18 +507,25 @@
468
507
  this._strokeUpdate(event);
469
508
  }
470
509
  this._drawingStroke = false;
510
+ this._strokePointerId = undefined;
471
511
  this.dispatchEvent(new CustomEvent('endStroke', { detail: event }));
472
512
  }
473
513
  _handlePointerEvents() {
474
514
  this._drawingStroke = false;
475
- this.canvas.addEventListener('pointerdown', this._handlePointerDown);
515
+ this.canvas.addEventListener('pointerdown', this._handlePointerDown, {
516
+ passive: false,
517
+ });
476
518
  }
477
519
  _handleMouseEvents() {
478
520
  this._drawingStroke = false;
479
- this.canvas.addEventListener('mousedown', this._handleMouseDown);
521
+ this.canvas.addEventListener('mousedown', this._handleMouseDown, {
522
+ passive: false,
523
+ });
480
524
  }
481
525
  _handleTouchEvents() {
482
- this.canvas.addEventListener('touchstart', this._handleTouchStart);
526
+ this.canvas.addEventListener('touchstart', this._handleTouchStart, {
527
+ passive: false,
528
+ });
483
529
  }
484
530
  _reset(options) {
485
531
  this._lastPoints = [];