@tabler/core 1.3.2 → 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.
- package/dist/css/tabler-flags.css +1 -1
- package/dist/css/tabler-flags.min.css +1 -1
- package/dist/css/tabler-flags.rtl.css +1 -1
- package/dist/css/tabler-flags.rtl.min.css +1 -1
- package/dist/css/tabler-marketing.css +1 -1
- package/dist/css/tabler-marketing.min.css +1 -1
- package/dist/css/tabler-marketing.rtl.css +1 -1
- package/dist/css/tabler-marketing.rtl.min.css +1 -1
- package/dist/css/tabler-payments.css +1 -1
- package/dist/css/tabler-payments.min.css +1 -1
- package/dist/css/tabler-payments.rtl.css +1 -1
- package/dist/css/tabler-payments.rtl.min.css +1 -1
- package/dist/css/tabler-props.css +74 -74
- package/dist/css/tabler-props.css.map +1 -1
- package/dist/css/tabler-props.min.css +2 -2
- package/dist/css/tabler-props.min.css.map +1 -1
- package/dist/css/tabler-props.rtl.css +74 -74
- package/dist/css/tabler-props.rtl.css.map +1 -1
- package/dist/css/tabler-props.rtl.min.css +2 -2
- package/dist/css/tabler-props.rtl.min.css.map +1 -1
- package/dist/css/tabler-socials.css +1 -1
- package/dist/css/tabler-socials.min.css +1 -1
- package/dist/css/tabler-socials.rtl.css +1 -1
- package/dist/css/tabler-socials.rtl.min.css +1 -1
- package/dist/css/tabler-themes.css +1 -1
- package/dist/css/tabler-themes.min.css +1 -1
- package/dist/css/tabler-themes.rtl.css +1 -1
- package/dist/css/tabler-themes.rtl.min.css +1 -1
- package/dist/css/tabler-vendors.css +1 -1
- package/dist/css/tabler-vendors.min.css +1 -1
- package/dist/css/tabler-vendors.rtl.css +1 -1
- package/dist/css/tabler-vendors.rtl.min.css +1 -1
- package/dist/css/tabler.css +649 -428
- package/dist/css/tabler.css.map +1 -1
- package/dist/css/tabler.min.css +2 -2
- package/dist/css/tabler.min.css.map +1 -1
- package/dist/css/tabler.rtl.css +647 -428
- package/dist/css/tabler.rtl.css.map +1 -1
- package/dist/css/tabler.rtl.min.css +2 -2
- package/dist/css/tabler.rtl.min.css.map +1 -1
- package/dist/js/tabler-theme.esm.js +1 -1
- package/dist/js/tabler-theme.esm.js.map +1 -1
- package/dist/js/tabler-theme.esm.min.js +1 -1
- package/dist/js/tabler-theme.js +1 -1
- package/dist/js/tabler-theme.js.map +1 -1
- package/dist/js/tabler-theme.min.js +2 -2
- package/dist/js/tabler-theme.min.js.map +1 -1
- package/dist/js/tabler.esm.js +4 -4
- package/dist/js/tabler.esm.js.map +1 -1
- package/dist/js/tabler.esm.min.js +4 -4
- package/dist/js/tabler.esm.min.js.map +1 -1
- package/dist/js/tabler.js +4 -4
- package/dist/js/tabler.js.map +1 -1
- package/dist/js/tabler.min.js +4 -4
- package/dist/js/tabler.min.js.map +1 -1
- package/dist/libs/@melloware/coloris/dist/esm/coloris.js +9 -3
- package/dist/libs/@melloware/coloris/dist/esm/coloris.min.js +1 -1
- package/dist/libs/@melloware/coloris/dist/umd/coloris.js +9 -3
- package/dist/libs/@melloware/coloris/dist/umd/coloris.min.js +1 -1
- package/dist/libs/@melloware/coloris/package.json +1 -1
- package/dist/libs/countup.js/README.md +2 -2
- package/dist/libs/countup.js/dist/countUp.d.ts +3 -2
- package/dist/libs/countup.js/dist/countUp.js +11 -2
- package/dist/libs/countup.js/dist/countUp.min.js +1 -1
- package/dist/libs/countup.js/dist/countUp.umd.js +1 -1
- package/dist/libs/countup.js/package.json +1 -1
- package/dist/libs/countup.js/src/countUp.spec.ts +75 -25
- package/dist/libs/countup.js/src/countUp.ts +13 -3
- package/dist/libs/fslightbox/index.js +1 -1
- package/dist/libs/fslightbox/package.json +1 -1
- package/dist/libs/fullcalendar/index.global.js +49 -20
- package/dist/libs/fullcalendar/index.global.min.js +2 -2
- package/dist/libs/fullcalendar/package.json +7 -7
- package/dist/libs/jsvectormap/dist/jsvectormap.cjs +240 -224
- package/dist/libs/jsvectormap/dist/jsvectormap.css +83 -57
- package/dist/libs/jsvectormap/dist/jsvectormap.esm.js +240 -224
- package/dist/libs/jsvectormap/dist/jsvectormap.js +240 -224
- package/dist/libs/jsvectormap/dist/jsvectormap.min.css +1 -1
- package/dist/libs/jsvectormap/dist/jsvectormap.min.js +1 -1
- package/dist/libs/jsvectormap/package.json +1 -1
- package/dist/libs/jsvectormap/src/js/components/base.js +0 -5
- package/dist/libs/jsvectormap/src/js/components/concerns/interactable.js +2 -7
- package/dist/libs/jsvectormap/src/js/components/line.js +38 -10
- package/dist/libs/jsvectormap/src/js/components/marker.js +72 -33
- package/dist/libs/jsvectormap/src/js/components/region.js +0 -5
- package/dist/libs/jsvectormap/src/js/components/route.js +76 -0
- package/dist/libs/jsvectormap/src/js/components/tooltip.js +0 -5
- package/dist/libs/jsvectormap/src/js/core/createLines.js +25 -24
- package/dist/libs/jsvectormap/src/js/core/createMarkers.js +15 -20
- package/dist/libs/jsvectormap/src/js/core/createRoutes.js +16 -0
- package/dist/libs/jsvectormap/src/js/core/repositionLines.js +22 -18
- package/dist/libs/jsvectormap/src/js/core/setupContainerEvents.js +2 -2
- package/dist/libs/jsvectormap/src/js/core/setupContainerTouchEvents.js +2 -2
- package/dist/libs/jsvectormap/src/js/core/setupElementEvents.js +7 -3
- package/dist/libs/jsvectormap/src/js/core/setupZoomButtons.js +23 -6
- package/dist/libs/jsvectormap/src/js/defaults/options.js +1 -0
- package/dist/libs/jsvectormap/src/js/eventHandler.js +0 -5
- package/dist/libs/jsvectormap/src/js/index.js +0 -5
- package/dist/libs/jsvectormap/src/js/legend.js +1 -9
- package/dist/libs/jsvectormap/src/js/map.js +36 -13
- package/dist/libs/jsvectormap/src/js/scales/ordinalScale.js +0 -5
- package/dist/libs/jsvectormap/src/js/series.js +0 -5
- package/dist/libs/jsvectormap/src/js/svg/baseElement.js +0 -5
- package/dist/libs/jsvectormap/src/js/svg/canvasElement.js +2 -7
- package/dist/libs/jsvectormap/src/js/svg/imageElement.js +0 -5
- package/dist/libs/jsvectormap/src/js/svg/shapeElement.js +0 -5
- package/dist/libs/jsvectormap/src/js/svg/textElement.js +0 -5
- package/dist/libs/jsvectormap/src/scss/_variables.scss +37 -0
- package/dist/libs/jsvectormap/src/scss/jsvectormap.scss +104 -112
- package/dist/libs/signature_pad/dist/signature_pad.js +133 -87
- package/dist/libs/signature_pad/dist/signature_pad.js.map +1 -1
- package/dist/libs/signature_pad/dist/signature_pad.min.js +2 -2
- package/dist/libs/signature_pad/dist/signature_pad.min.js.map +1 -1
- package/dist/libs/signature_pad/dist/signature_pad.umd.js +133 -87
- package/dist/libs/signature_pad/dist/signature_pad.umd.js.map +1 -1
- package/dist/libs/signature_pad/dist/signature_pad.umd.min.js +2 -2
- package/dist/libs/signature_pad/dist/signature_pad.umd.min.js.map +1 -1
- package/dist/libs/signature_pad/dist/types/signature_pad.d.ts +4 -1
- package/dist/libs/signature_pad/docs/js/signature_pad.umd.min.js +2 -2
- package/dist/libs/signature_pad/docs/js/signature_pad.umd.min.js.map +1 -1
- package/dist/libs/signature_pad/package.json +19 -19
- package/dist/libs/signature_pad/src/signature_pad.ts +84 -28
- package/package.json +9 -9
- package/scss/_bootstrap-components.scss +0 -1
- package/scss/_core.scss +1 -0
- package/scss/_variables.scss +78 -48
- package/scss/layout/_animations.scss +52 -17
- package/scss/layout/_navbar.scss +8 -4
- package/scss/ui/_breadcrumbs.scss +31 -0
- package/scss/ui/_buttons.scss +92 -20
- package/scss/ui/_cards.scss +4 -2
- package/scss/ui/_dropdowns.scss +1 -1
- package/scss/ui/_grid.scss +2 -2
- package/scss/ui/_lists.scss +8 -8
- package/scss/ui/_nav.scss +1 -1
- package/scss/ui/_pagination.scss +4 -4
- package/scss/ui/_stars.scss +0 -4
- package/scss/ui/_switch-icon.scss +6 -2
- package/scss/ui/_tables.scss +1 -1
- package/scss/utils/_hover.scss +47 -0
- 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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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "signature_pad",
|
|
3
3
|
"description": "Library for drawing smooth signatures.",
|
|
4
|
-
"version": "5.0.
|
|
4
|
+
"version": "5.0.10",
|
|
5
5
|
"homepage": "https://github.com/szimek/signature_pad",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Szymon Nowak",
|
|
@@ -41,34 +41,34 @@
|
|
|
41
41
|
"docs"
|
|
42
42
|
],
|
|
43
43
|
"devDependencies": {
|
|
44
|
-
"@eslint/js": "^9.
|
|
44
|
+
"@eslint/js": "^9.28.0",
|
|
45
45
|
"@rollup/plugin-terser": "^0.4.4",
|
|
46
|
-
"@rollup/plugin-typescript": "^12.1.
|
|
46
|
+
"@rollup/plugin-typescript": "^12.1.2",
|
|
47
47
|
"@semantic-release/changelog": "^6.0.3",
|
|
48
|
-
"@semantic-release/commit-analyzer": "^13.0.
|
|
48
|
+
"@semantic-release/commit-analyzer": "^13.0.1",
|
|
49
49
|
"@semantic-release/git": "^10.0.1",
|
|
50
|
-
"@semantic-release/github": "^11.0.
|
|
50
|
+
"@semantic-release/github": "^11.0.3",
|
|
51
51
|
"@semantic-release/npm": "^12.0.1",
|
|
52
|
-
"@semantic-release/release-notes-generator": "^14.0.
|
|
53
|
-
"@types/jest": "^29.5.
|
|
54
|
-
"@types/node": "^22.
|
|
52
|
+
"@semantic-release/release-notes-generator": "^14.0.3",
|
|
53
|
+
"@types/jest": "^29.5.14",
|
|
54
|
+
"@types/node": "^22.15.29",
|
|
55
55
|
"cpy-cli": "^5.0.0",
|
|
56
56
|
"del": "^8.0.0",
|
|
57
57
|
"del-cli": "^6.0.0",
|
|
58
|
-
"eslint": "^9.
|
|
59
|
-
"eslint-config-prettier": "^
|
|
60
|
-
"globals": "^
|
|
58
|
+
"eslint": "^9.28.0",
|
|
59
|
+
"eslint-config-prettier": "^10.1.5",
|
|
60
|
+
"globals": "^16.2.0",
|
|
61
61
|
"jest": "^29.7.0",
|
|
62
62
|
"jest-canvas-mock": "^2.5.2",
|
|
63
63
|
"jest-environment-jsdom": "^29.7.0",
|
|
64
|
-
"prettier": "^3.
|
|
65
|
-
"rollup": "^4.
|
|
66
|
-
"semantic-release": "^24.
|
|
64
|
+
"prettier": "^3.5.3",
|
|
65
|
+
"rollup": "^4.41.1",
|
|
66
|
+
"semantic-release": "^24.2.5",
|
|
67
67
|
"serve": "^14.2.4",
|
|
68
|
-
"ts-jest": "^29.
|
|
69
|
-
"tslib": "^2.8.
|
|
70
|
-
"typescript": "~5.
|
|
71
|
-
"typescript-eslint": "^8.
|
|
68
|
+
"ts-jest": "^29.3.4",
|
|
69
|
+
"tslib": "^2.8.1",
|
|
70
|
+
"typescript": "~5.8.3",
|
|
71
|
+
"typescript-eslint": "^8.33.1"
|
|
72
72
|
},
|
|
73
73
|
"jest": {
|
|
74
74
|
"moduleFileExtensions": [
|
|
@@ -100,5 +100,5 @@
|
|
|
100
100
|
"@semantic-release/git"
|
|
101
101
|
]
|
|
102
102
|
},
|
|
103
|
-
"packageManager": "yarn@4.2
|
|
103
|
+
"packageManager": "yarn@4.9.2"
|
|
104
104
|
}
|
|
@@ -80,6 +80,7 @@ export default class SignaturePad extends SignatureEventTarget {
|
|
|
80
80
|
private _lastVelocity = 0;
|
|
81
81
|
private _lastWidth = 0;
|
|
82
82
|
private _strokeMoveUpdate: (event: SignatureEvent) => void;
|
|
83
|
+
private _strokePointerId: number | undefined;
|
|
83
84
|
/* tslint:enable: variable-name */
|
|
84
85
|
|
|
85
86
|
constructor(
|
|
@@ -103,6 +104,17 @@ export default class SignaturePad extends SignatureEventTarget {
|
|
|
103
104
|
this._strokeMoveUpdate = this.throttle
|
|
104
105
|
? throttle(SignaturePad.prototype._strokeUpdate, this.throttle)
|
|
105
106
|
: SignaturePad.prototype._strokeUpdate;
|
|
107
|
+
|
|
108
|
+
this._handleMouseDown = this._handleMouseDown.bind(this);
|
|
109
|
+
this._handleMouseMove = this._handleMouseMove.bind(this);
|
|
110
|
+
this._handleMouseUp = this._handleMouseUp.bind(this);
|
|
111
|
+
this._handleTouchStart = this._handleTouchStart.bind(this);
|
|
112
|
+
this._handleTouchMove = this._handleTouchMove.bind(this);
|
|
113
|
+
this._handleTouchEnd = this._handleTouchEnd.bind(this);
|
|
114
|
+
this._handlePointerDown = this._handlePointerDown.bind(this);
|
|
115
|
+
this._handlePointerMove = this._handlePointerMove.bind(this);
|
|
116
|
+
this._handlePointerUp = this._handlePointerUp.bind(this);
|
|
117
|
+
|
|
106
118
|
this._ctx = canvas.getContext(
|
|
107
119
|
'2d',
|
|
108
120
|
this.canvasContextOptions,
|
|
@@ -125,6 +137,7 @@ export default class SignaturePad extends SignatureEventTarget {
|
|
|
125
137
|
this._data = [];
|
|
126
138
|
this._reset(this._getPointGroupOptions());
|
|
127
139
|
this._isEmpty = true;
|
|
140
|
+
this._strokePointerId = undefined;
|
|
128
141
|
}
|
|
129
142
|
|
|
130
143
|
public fromDataURL(
|
|
@@ -182,14 +195,18 @@ export default class SignaturePad extends SignatureEventTarget {
|
|
|
182
195
|
if (typeof encoderOptions !== 'number') {
|
|
183
196
|
encoderOptions = undefined;
|
|
184
197
|
}
|
|
185
|
-
return this.canvas.toDataURL(type, encoderOptions);
|
|
198
|
+
return this.canvas.toDataURL(type, encoderOptions as number);
|
|
186
199
|
}
|
|
187
200
|
}
|
|
188
201
|
|
|
189
202
|
public on(): void {
|
|
190
203
|
// Disable panning/zooming when touching canvas element
|
|
191
204
|
this.canvas.style.touchAction = 'none';
|
|
192
|
-
(
|
|
205
|
+
(
|
|
206
|
+
this.canvas.style as CSSStyleDeclaration & {
|
|
207
|
+
msTouchAction: string | null;
|
|
208
|
+
}
|
|
209
|
+
).msTouchAction = 'none';
|
|
193
210
|
this.canvas.style.userSelect = 'none';
|
|
194
211
|
|
|
195
212
|
const isIOS =
|
|
@@ -213,7 +230,11 @@ export default class SignaturePad extends SignatureEventTarget {
|
|
|
213
230
|
public off(): void {
|
|
214
231
|
// Enable panning/zooming when touching canvas element
|
|
215
232
|
this.canvas.style.touchAction = 'auto';
|
|
216
|
-
(
|
|
233
|
+
(
|
|
234
|
+
this.canvas.style as CSSStyleDeclaration & {
|
|
235
|
+
msTouchAction: string | null;
|
|
236
|
+
}
|
|
237
|
+
).msTouchAction = 'auto';
|
|
217
238
|
this.canvas.style.userSelect = 'auto';
|
|
218
239
|
|
|
219
240
|
this.canvas.removeEventListener('pointerdown', this._handlePointerDown);
|
|
@@ -227,7 +248,7 @@ export default class SignaturePad extends SignatureEventTarget {
|
|
|
227
248
|
const canvasWindow =
|
|
228
249
|
window.document === this.canvas.ownerDocument
|
|
229
250
|
? window
|
|
230
|
-
: this.canvas.ownerDocument.defaultView ?? this.canvas.ownerDocument;
|
|
251
|
+
: (this.canvas.ownerDocument.defaultView ?? this.canvas.ownerDocument);
|
|
231
252
|
|
|
232
253
|
return {
|
|
233
254
|
addEventListener: canvasWindow.addEventListener.bind(
|
|
@@ -276,7 +297,7 @@ export default class SignaturePad extends SignatureEventTarget {
|
|
|
276
297
|
return this._data;
|
|
277
298
|
}
|
|
278
299
|
|
|
279
|
-
|
|
300
|
+
private _isLeftButtonPressed(event: MouseEvent, only?: boolean): boolean {
|
|
280
301
|
if (only) {
|
|
281
302
|
return event.buttons === 1;
|
|
282
303
|
}
|
|
@@ -307,14 +328,14 @@ export default class SignaturePad extends SignatureEventTarget {
|
|
|
307
328
|
}
|
|
308
329
|
|
|
309
330
|
// Event handlers
|
|
310
|
-
private _handleMouseDown
|
|
331
|
+
private _handleMouseDown(event: MouseEvent): void {
|
|
311
332
|
if (!this._isLeftButtonPressed(event, true) || this._drawingStroke) {
|
|
312
333
|
return;
|
|
313
334
|
}
|
|
314
335
|
this._strokeBegin(this._pointerEventToSignatureEvent(event));
|
|
315
336
|
};
|
|
316
337
|
|
|
317
|
-
private _handleMouseMove
|
|
338
|
+
private _handleMouseMove(event: MouseEvent): void {
|
|
318
339
|
if (!this._isLeftButtonPressed(event, true) || !this._drawingStroke) {
|
|
319
340
|
// Stop when not pressing primary button or pressing multiple buttons
|
|
320
341
|
this._strokeEnd(this._pointerEventToSignatureEvent(event), false);
|
|
@@ -324,7 +345,7 @@ export default class SignaturePad extends SignatureEventTarget {
|
|
|
324
345
|
this._strokeMoveUpdate(this._pointerEventToSignatureEvent(event));
|
|
325
346
|
};
|
|
326
347
|
|
|
327
|
-
private _handleMouseUp
|
|
348
|
+
private _handleMouseUp(event: MouseEvent): void {
|
|
328
349
|
if (this._isLeftButtonPressed(event)) {
|
|
329
350
|
return;
|
|
330
351
|
}
|
|
@@ -332,7 +353,7 @@ export default class SignaturePad extends SignatureEventTarget {
|
|
|
332
353
|
this._strokeEnd(this._pointerEventToSignatureEvent(event));
|
|
333
354
|
};
|
|
334
355
|
|
|
335
|
-
private _handleTouchStart
|
|
356
|
+
private _handleTouchStart(event: TouchEvent): void {
|
|
336
357
|
if (event.targetTouches.length !== 1 || this._drawingStroke) {
|
|
337
358
|
return;
|
|
338
359
|
}
|
|
@@ -345,7 +366,7 @@ export default class SignaturePad extends SignatureEventTarget {
|
|
|
345
366
|
this._strokeBegin(this._touchEventToSignatureEvent(event));
|
|
346
367
|
};
|
|
347
368
|
|
|
348
|
-
private _handleTouchMove
|
|
369
|
+
private _handleTouchMove(event: TouchEvent): void {
|
|
349
370
|
if (event.targetTouches.length !== 1) {
|
|
350
371
|
return;
|
|
351
372
|
}
|
|
@@ -363,7 +384,7 @@ export default class SignaturePad extends SignatureEventTarget {
|
|
|
363
384
|
this._strokeMoveUpdate(this._touchEventToSignatureEvent(event));
|
|
364
385
|
};
|
|
365
386
|
|
|
366
|
-
private _handleTouchEnd
|
|
387
|
+
private _handleTouchEnd(event: TouchEvent): void {
|
|
367
388
|
if (event.targetTouches.length !== 0) {
|
|
368
389
|
return;
|
|
369
390
|
}
|
|
@@ -372,23 +393,40 @@ export default class SignaturePad extends SignatureEventTarget {
|
|
|
372
393
|
event.preventDefault();
|
|
373
394
|
}
|
|
374
395
|
|
|
375
|
-
this.canvas.removeEventListener('touchmove', this._handleTouchMove);
|
|
376
|
-
|
|
377
396
|
this._strokeEnd(this._touchEventToSignatureEvent(event));
|
|
378
397
|
};
|
|
379
398
|
|
|
380
|
-
private
|
|
381
|
-
|
|
399
|
+
private _getPointerId(event: PointerEvent) {
|
|
400
|
+
// @ts-expect-error persistentDeviceId is not available yet but we want to use it when it is available
|
|
401
|
+
return event.persistentDeviceId || event.pointerId;
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
private _allowPointerId(event: PointerEvent, allowUndefined = false): boolean {
|
|
405
|
+
if (typeof this._strokePointerId === 'undefined') {
|
|
406
|
+
return allowUndefined;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
return this._getPointerId(event) === this._strokePointerId;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
private _handlePointerDown(event: PointerEvent): void {
|
|
413
|
+
if (
|
|
414
|
+
this._drawingStroke ||
|
|
415
|
+
!this._isLeftButtonPressed(event) ||
|
|
416
|
+
!this._allowPointerId(event, true)
|
|
417
|
+
) {
|
|
382
418
|
return;
|
|
383
419
|
}
|
|
384
420
|
|
|
421
|
+
this._strokePointerId = this._getPointerId(event);
|
|
422
|
+
|
|
385
423
|
event.preventDefault();
|
|
386
424
|
|
|
387
425
|
this._strokeBegin(this._pointerEventToSignatureEvent(event));
|
|
388
426
|
};
|
|
389
427
|
|
|
390
|
-
private _handlePointerMove
|
|
391
|
-
if (!event
|
|
428
|
+
private _handlePointerMove(event: PointerEvent): void {
|
|
429
|
+
if (!this._allowPointerId(event)) {
|
|
392
430
|
return;
|
|
393
431
|
}
|
|
394
432
|
if (!this._isLeftButtonPressed(event, true) || !this._drawingStroke) {
|
|
@@ -401,8 +439,11 @@ export default class SignaturePad extends SignatureEventTarget {
|
|
|
401
439
|
this._strokeMoveUpdate(this._pointerEventToSignatureEvent(event));
|
|
402
440
|
};
|
|
403
441
|
|
|
404
|
-
private _handlePointerUp
|
|
405
|
-
if (
|
|
442
|
+
private _handlePointerUp(event: PointerEvent): void {
|
|
443
|
+
if (
|
|
444
|
+
this._isLeftButtonPressed(event) ||
|
|
445
|
+
!this._allowPointerId(event)
|
|
446
|
+
) {
|
|
406
447
|
return;
|
|
407
448
|
}
|
|
408
449
|
|
|
@@ -439,16 +480,24 @@ export default class SignaturePad extends SignatureEventTarget {
|
|
|
439
480
|
const { addEventListener } = this._getListenerFunctions();
|
|
440
481
|
switch (event.event.type) {
|
|
441
482
|
case 'mousedown':
|
|
442
|
-
addEventListener('mousemove', this._handleMouseMove
|
|
443
|
-
|
|
483
|
+
addEventListener('mousemove', this._handleMouseMove, {
|
|
484
|
+
passive: false,
|
|
485
|
+
});
|
|
486
|
+
addEventListener('mouseup', this._handleMouseUp, { passive: false });
|
|
444
487
|
break;
|
|
445
488
|
case 'touchstart':
|
|
446
|
-
addEventListener('touchmove', this._handleTouchMove
|
|
447
|
-
|
|
489
|
+
addEventListener('touchmove', this._handleTouchMove, {
|
|
490
|
+
passive: false,
|
|
491
|
+
});
|
|
492
|
+
addEventListener('touchend', this._handleTouchEnd, { passive: false });
|
|
448
493
|
break;
|
|
449
494
|
case 'pointerdown':
|
|
450
|
-
addEventListener('pointermove', this._handlePointerMove
|
|
451
|
-
|
|
495
|
+
addEventListener('pointermove', this._handlePointerMove, {
|
|
496
|
+
passive: false,
|
|
497
|
+
});
|
|
498
|
+
addEventListener('pointerup', this._handlePointerUp, {
|
|
499
|
+
passive: false,
|
|
500
|
+
});
|
|
452
501
|
break;
|
|
453
502
|
default:
|
|
454
503
|
// do nothing
|
|
@@ -527,23 +576,30 @@ export default class SignaturePad extends SignatureEventTarget {
|
|
|
527
576
|
}
|
|
528
577
|
|
|
529
578
|
this._drawingStroke = false;
|
|
579
|
+
this._strokePointerId = undefined;
|
|
530
580
|
this.dispatchEvent(new CustomEvent('endStroke', { detail: event }));
|
|
531
581
|
}
|
|
532
582
|
|
|
533
583
|
private _handlePointerEvents(): void {
|
|
534
584
|
this._drawingStroke = false;
|
|
535
585
|
|
|
536
|
-
this.canvas.addEventListener('pointerdown', this._handlePointerDown
|
|
586
|
+
this.canvas.addEventListener('pointerdown', this._handlePointerDown, {
|
|
587
|
+
passive: false,
|
|
588
|
+
});
|
|
537
589
|
}
|
|
538
590
|
|
|
539
591
|
private _handleMouseEvents(): void {
|
|
540
592
|
this._drawingStroke = false;
|
|
541
593
|
|
|
542
|
-
this.canvas.addEventListener('mousedown', this._handleMouseDown
|
|
594
|
+
this.canvas.addEventListener('mousedown', this._handleMouseDown, {
|
|
595
|
+
passive: false,
|
|
596
|
+
});
|
|
543
597
|
}
|
|
544
598
|
|
|
545
599
|
private _handleTouchEvents(): void {
|
|
546
|
-
this.canvas.addEventListener('touchstart', this._handleTouchStart
|
|
600
|
+
this.canvas.addEventListener('touchstart', this._handleTouchStart, {
|
|
601
|
+
passive: false,
|
|
602
|
+
});
|
|
547
603
|
}
|
|
548
604
|
|
|
549
605
|
// Called when a new line is started
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tabler/core",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "Premium and Open Source dashboard template with responsive and high quality UI.",
|
|
5
5
|
"homepage": "https://tabler.io",
|
|
6
6
|
"repository": {
|
|
@@ -112,28 +112,28 @@
|
|
|
112
112
|
},
|
|
113
113
|
"dependencies": {
|
|
114
114
|
"@popperjs/core": "^2.11.8",
|
|
115
|
-
"bootstrap": "5.3.
|
|
115
|
+
"bootstrap": "5.3.7"
|
|
116
116
|
},
|
|
117
117
|
"devDependencies": {
|
|
118
118
|
"@hotwired/turbo": "^8.0.13",
|
|
119
|
-
"@melloware/coloris": "^0.
|
|
119
|
+
"@melloware/coloris": "^0.25.0",
|
|
120
120
|
"apexcharts": "3.54.1",
|
|
121
121
|
"autosize": "^6.0.1",
|
|
122
122
|
"choices.js": "^11.1.0",
|
|
123
123
|
"clipboard": "^2.0.11",
|
|
124
|
-
"countup.js": "^2.
|
|
124
|
+
"countup.js": "^2.9.0",
|
|
125
125
|
"dropzone": "^6.0.0-beta.2",
|
|
126
126
|
"flatpickr": "^4.6.13",
|
|
127
|
-
"fslightbox": "^3.6.
|
|
128
|
-
"fullcalendar": "^6.1.
|
|
127
|
+
"fslightbox": "^3.6.1",
|
|
128
|
+
"fullcalendar": "^6.1.18",
|
|
129
129
|
"hugerte": "^1.0.9",
|
|
130
130
|
"imask": "^7.6.1",
|
|
131
|
-
"jsvectormap": "^1.
|
|
131
|
+
"jsvectormap": "^1.7.0",
|
|
132
132
|
"list.js": "^2.3.1",
|
|
133
133
|
"litepicker": "^2.0.12",
|
|
134
134
|
"nouislider": "^15.8.1",
|
|
135
135
|
"plyr": "^3.7.8",
|
|
136
|
-
"signature_pad": "^5.0.
|
|
136
|
+
"signature_pad": "^5.0.10",
|
|
137
137
|
"star-rating.js": "^4.3.1",
|
|
138
138
|
"tom-select": "^2.4.3",
|
|
139
139
|
"typed.js": "^2.1.0"
|
|
@@ -146,7 +146,7 @@
|
|
|
146
146
|
"build": "pnpm run clean && pnpm run css && pnpm run js && pnpm run copy && pnpm run generate-sri",
|
|
147
147
|
"clean": "shx rm -rf dist demo",
|
|
148
148
|
"css": "pnpm run css-compile && pnpm run css-prefix && pnpm run css-rtl && pnpm run css-minify && pnpm run css-banner",
|
|
149
|
-
"css-compile": "sass
|
|
149
|
+
"css-compile": "sass --no-source-map --load-path=node_modules --style expanded scss/:dist/css/",
|
|
150
150
|
"css-banner": "node .build/add-banner.mjs",
|
|
151
151
|
"css-prefix": "postcss --config .build/postcss.config.mjs --replace \"dist/css/*.css\" \"!dist/css/*.rtl*.css\" \"!dist/css/*.min.css\"",
|
|
152
152
|
"css-rtl": "cross-env NODE_ENV=RTL postcss --config .build/postcss.config.mjs --dir \"dist/css\" --ext \".rtl.css\" \"dist/css/*.css\" \"!dist/css/*.min.css\" \"!dist/css/*.rtl.css\"",
|