@thewhitehaven04/chartjs-plugin-zoom 2.2.9 → 2.2.10

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.
@@ -1,6 +1,6 @@
1
1
  /*!
2
- * @thewhitehaven04/chartjs-plugin-zoom v2.2.7
3
- * https://www.chartjs.org/chartjs-plugin-zoom/2.2.7/
2
+ * @thewhitehaven04/chartjs-plugin-zoom v2.2.10
3
+ * https://www.chartjs.org/chartjs-plugin-zoom/2.2.10/
4
4
  * (c) 2016-2026 chartjs-plugin-zoom Contributors
5
5
  * Released under the MIT License
6
6
  */
@@ -1043,7 +1043,7 @@ function hammerOptionsChanged(oldOptions, newOptions) {
1043
1043
  return false;
1044
1044
  }
1045
1045
 
1046
- var version = "2.2.7";
1046
+ var version = "2.2.10";
1047
1047
 
1048
1048
  const defaults = {
1049
1049
  pan: {
@@ -1,6 +1,6 @@
1
1
  /*!
2
- * @thewhitehaven04/chartjs-plugin-zoom v2.2.7
3
- * https://www.chartjs.org/chartjs-plugin-zoom/2.2.7/
2
+ * @thewhitehaven04/chartjs-plugin-zoom v2.2.10
3
+ * https://www.chartjs.org/chartjs-plugin-zoom/2.2.10/
4
4
  * (c) 2016-2026 chartjs-plugin-zoom Contributors
5
5
  * Released under the MIT License
6
6
  */
@@ -1046,7 +1046,7 @@ function hammerOptionsChanged(oldOptions, newOptions) {
1046
1046
  return false;
1047
1047
  }
1048
1048
 
1049
- var version = "2.2.7";
1049
+ var version = "2.2.10";
1050
1050
 
1051
1051
  const defaults = {
1052
1052
  pan: {
@@ -1,8 +1,8 @@
1
1
  /*!
2
- * @thewhitehaven04/chartjs-plugin-zoom v2.2.7
3
- * https://www.chartjs.org/chartjs-plugin-zoom/2.2.7/
2
+ * @thewhitehaven04/chartjs-plugin-zoom v2.2.10
3
+ * https://www.chartjs.org/chartjs-plugin-zoom/2.2.10/
4
4
  * (c) 2016-2026 chartjs-plugin-zoom Contributors
5
5
  * Released under the MIT License
6
6
  */
7
- !function(t,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n(require("chart.js"),require("hammerjs"),require("chart.js/helpers")):"function"==typeof define&&define.amd?define(["chart.js","hammerjs","chart.js/helpers"],n):(t="undefined"!=typeof globalThis?globalThis:t||self).ChartZoom=n(t.Chart,t.Hammer,t.Chart.helpers)}(this,(function(t,n,e){"use strict";const o=t=>`${t}Key`,i=t=>t?.enabled&&t.modifierKey?t.modifierKey:void 0,a=(t,n)=>t&&n[o(t)],r=(t,n)=>t&&!n[o(t)];function s(t,n,e){return void 0===t||("string"==typeof t?-1!==t.indexOf(n):"function"==typeof t&&-1!==t({chart:e}).indexOf(n))}function c(t,n){return"function"==typeof t&&(t=t({chart:n})),"string"==typeof t?{x:-1!==t.indexOf("x"),y:-1!==t.indexOf("y")}:{x:!1,y:!1}}function l(t,n,e){const{mode:o="xy",scaleMode:i,overScaleMode:a}=t||{},r=function({x:t,y:n},e){const o=e.scales,i=Object.keys(o);for(let e=0;e<i.length;e++){const a=o[i[e]];if(n>=a.top&&n<=a.bottom&&t>=a.left&&t<=a.right)return a}return null}(n,e),s=c(o,e),l=c(i,e);return((t,n,e,o)=>{if(!n)return;const i=c(n,t);for(const t of["x","y"])i[t]&&(e[t]=o[t],o[t]=!1)})(e,a,l,s),r&&l[r.axis]?[r]:((t,n)=>{const e=[];for(const o of Object.values(t.scales))n[o.axis]&&e.push(o);return e||Object.values(t.scales)})(e,s)}const m=new WeakMap;function u(t){let n=m.get(t);return n||(n={originalScaleLimits:{},updatedScaleLimits:{},handlers:{},options:{},targets:{},panDelta:{},dragging:!1,panning:!1},m.set(t,n)),n}const d=t=>void 0===t||isNaN(t);function f(t,n,o,i){const a=o&&e.isNumber(t)&&e.isNumber(n)?Math.max(0,Math.min(1,(t-n)/o)):0;return{min:i*a,max:i*(1-a)}}function p(t,n){const e=t.isHorizontal()?n.x:n.y;return t.getValueForPixel(e)}function h(t,n,e){const o=t.max-t.min,i=o*(n-1);return f(p(t,e),t.min,o,i)}function g(t,n,o,i,a){let r=o[i];if("original"===r){const o=t.originalScaleLimits[n.id][i];if(e.isNumber(o.options))return o.options;if(!e.isNullOrUndef(o.options)){const t=n.parse(o.options);if(e.isNumber(t))return t}r=o.scale}return e.valueOrDefault(r,a)}function x(t,{min:n,max:o},i,a=!1,r=!1){const s=u(t.chart),{options:c}=t,l=function(t,n){return n?.[t.id]||n?.[t.axis]||{}}(t,i),{minRange:m=0}=l,d=g(s,t,l,"min",-1/0),f=g(s,t,l,"max",1/0);if(r&&(n<d||o>f))return!0;const p=t.max-t.min,h=a?Math.max(o-n,m):p;if(a&&h===m&&p<=m)return!0;const x=function(t,{min:n,max:o,minLimit:i,maxLimit:a},r,s){const c=(t-o+n)/2;n-=c,o+=c;const l={min:"original",max:"original"},m=g(r,s,l,"min",-1/0),u=g(r,s,l,"max",1/0),d=t/1e6;return e.almostEquals(n,m,d)&&(n=m),e.almostEquals(o,u,d)&&(o=u),n<i?(n=i,o=Math.min(i+t,a)):o>a&&(o=a,n=Math.max(a-t,i)),{min:n,max:o}}(h,{min:n,max:o,minLimit:d,maxLimit:f},s,t);return c.min=x.min,c.max=x.max,s.updatedScaleLimits[t.id]=x,t.parse(x.min)!==t.min||t.parse(x.max)!==t.max}const y=t=>0===t||isNaN(t)?0:t<0?Math.min(Math.round(t),-1):Math.max(Math.round(t),1);const b={millisecond:0,second:500,minute:3e4,hour:18e5,day:432e5,week:3024e5,month:1296e6,quarter:5184e6,year:157248e5};function v(t,n,e,o=!1){const{min:i,max:a}=t;let r=0;if((t=>"time"===t.type)(t)){const n=t.options.time?.round;r=n?b[n]:0}const s=t.getValueForPixel(t.getPixelForValue(i+r)-n),c=t.getValueForPixel(t.getPixelForValue(a+r)-n);return!(!d(s)&&!d(c))||x(t,{min:s,max:c},e,o,!0)}function w(t,n,e){return v(t,n,e,!0)}const M={category:function(t,n,e,o){const i=h(t,n,e);return t.min===t.max&&n<1&&function(t){const n=t.getLabels().length-1;t.min>0&&(t.min-=1),t.max<n&&(t.max+=1)}(t),x(t,{min:t.min+y(i.min),max:t.max-y(i.max)},o,!0)},default:function(t,n,e,o){const i=h(t,n,e);return x(t,{min:t.min+i.min,max:t.max-i.max},o,!0)},logarithmic:function(t,n,e,o){const i=function(t,n,e){const o=p(t,e);if(void 0===o)return{min:t.min,max:t.max};const i=Math.log10(t.min),a=Math.log10(t.max),r=a-i,s=f(Math.log10(o),i,r,r*(n-1));return{min:Math.pow(10,i+s.min),max:Math.pow(10,a-s.max)}}(t,n,e);return x(t,i,o,!0)}},z={default:function(t,n,e,o){return x(t,function(t,n,e){const o=t.getValueForPixel(n)??t.min,i=t.getValueForPixel(e)??t.max;return{min:Math.min(o,i),max:Math.max(o,i)}}(t,n,e),o,!0)}},S={category:function(t,n,e){const o=t.getLabels().length-1;let{min:i,max:a}=t;const r=Math.max(a-i,1),s=Math.round(function(t){return t.isHorizontal()?t.width:t.height}(t)/Math.max(r,10)),c=Math.round(Math.abs(n/s));let l;return n<-s?(a=Math.min(a+c,o),i=1===r?a:a-r,l=a===o):n>s&&(i=Math.max(0,i-c),a=1===r?i:i+r,l=0===i),x(t,{min:i,max:a},e)||Boolean(l)},default:v,logarithmic:w,timeseries:w};function P(t,n,e){const{id:o,options:{min:i,max:a}}=t;if(!n[o]||!e[o])return!0;const r=e[o];return r.min!==i||r.max!==a}function j(t,n){for(const e of Object.keys(t))n[e]||delete t[e]}function O(t,n){const{scales:e}=t,{originalScaleLimits:o,updatedScaleLimits:i}=n;for(const t of Object.values(e))P(t,o,i)&&(o[t.id]={min:{scale:t.min,options:t.options.min},max:{scale:t.max,options:t.options.max}});return j(o,e),j(i,e),o}function k(t,n,e,o){const i=M[t.type]||M.default;i?.(t,n,e,o)}function C(t,n,e,o){const i=z[t.type]||z.default;i?.(t,n,e,o)}function Z(t){const n=t.chartArea;return{x:(n.left+n.right)/2,y:(n.top+n.bottom)/2}}function D(t,n,e="none",o="api"){const{x:i=1,y:a=1,focalPoint:r=Z(t)}="number"==typeof n?{x:n,y:n}:n,s=u(t),{options:{limits:c={},zoom:m}}=s;O(t,s);const d=1!==i,f=1!==a,p=l(m,r,t);for(const t of p)t.isHorizontal()&&d?k(t,i,r,c):!t.isHorizontal()&&f&&k(t,a,r,c);t.update(e),m?.onZoom?.({chart:t,trigger:o,amount:{x:i,y:a,focalPoint:r}})}function R(t,n,e,o="none",i="api"){const a=u(t),{options:{limits:r={},zoom:c={}}}=a,{mode:l="xy"}=c;O(t,a);const m=s(l,"x",t),d=s(l,"y",t);for(const o of Object.values(t.scales))o.isHorizontal()&&m?C(o,n.x,e.x,r):!o.isHorizontal()&&d&&C(o,n.y,e.y,r);t.update(o),c.onZoom?.({chart:t,trigger:i})}function L(t,n){const o=t.originalScaleLimits[n];if(!o)return;const{min:i,max:a}=o;return e.isNumber(a.options)&&e.isNumber(i.options)?a.options-i.options:e.isNumber(a.scale)&&e.isNumber(i.scale)?a.scale-i.scale:void 0}function N(t,n,o,i){const{panDelta:a}=i,r=a[t.id]||0;e.sign(r)===e.sign(n)&&(n+=r);const s=S[t.type]||S.default;s?.(t,n,o)?a[t.id]=0:a[t.id]=n}function E(t,n,e,o="none",i="other"){const{x:a=0,y:r=0}="number"==typeof n?{x:n,y:n}:n,s=u(t),{options:{pan:c,limits:l={}}}=s,{onPan:m}=c||{};O(t,s);const d=0!==a,f=0!==r,p=e||Object.values(t.scales);for(const t of p)t.isHorizontal()&&d?N(t,a,l,s):!t.isHorizontal()&&f&&N(t,r,l,s);t.update(o),m?.({chart:t,trigger:i,delta:{x:a,y:r}})}function F(t){const n=u(t);O(t,n);const e={};for(const o of Object.keys(t.scales)){const{min:t,max:i}=n.originalScaleLimits[o]||{min:{},max:{}};e[o]={min:t.scale,max:i.scale}}return e}function A(t){return t.panning||t.dragging}const H=(t,n,e)=>Math.min(e,Math.max(n,t));function T(t,n){const{handlers:e,targets:o}=u(t),i=e[n],a=o[n];i&&a&&(a.removeEventListener(n,i),delete e[n])}function Y(t,n,e,o){const{handlers:i,options:a,targets:r}=u(t);if(i[e]&&r[e]===n)return;T(t,e);const s=i[e]=n=>o(t,n,a);r[e]=n;const c="wheel"!==e&&void 0;n.addEventListener(e,s,{passive:c})}function B(t,n){const e=u(t);e.dragStart&&(e.dragging=!0,e.dragEnd=n,t.draw())}function q(t,n){const e=u(t);e.dragStart&&"Escape"===n.key&&(T(t,"keydown"),e.dragging=!1,e.dragStart=e.dragEnd=void 0,t.draw())}function V(t,n){if(t.target!==n.canvas){const e=n.canvas.getBoundingClientRect();return{x:t.clientX-e.left,y:t.clientY-e.top}}return e.getRelativePosition(t,n)}function X(t,n,e){const{onZoomStart:o,onZoomRejected:i}=e;if(o){const e=V(n,t);if(!1===o?.({chart:t,event:n,point:e}))return i?.({chart:t,event:n}),!1}}function K(t,n){if(t.legend){const o=e.getRelativePosition(n,t);if(e._isPointInArea(o,t.legend))return}const o=u(t),{pan:s,zoom:c={}}=o.options;if(0!==n.button||a(i(s),n)||r(i(c.drag),n))return c.onZoomRejected?.({chart:t,event:n});!1!==X(t,n,c)&&(o.dragStart=n,Y(t,t.canvas.ownerDocument,"mousemove",B),Y(t,window.document,"keydown",q))}function W(t,n,e,{min:o,max:i,prop:a}){t[o]=H(Math.min(e.begin[a],e.end[a]),n[o],n[i]),t[i]=H(Math.max(e.begin[a],e.end[a]),n[o],n[i])}function I(t,n,e){const o={begin:V(n.dragStart,t),end:V(n.dragEnd,t)};if(e){!function({begin:t,end:n},e){let o=n.x-t.x,i=n.y-t.y;const a=Math.abs(o/i);a>e?o=Math.sign(o)*Math.abs(i*e):a<e&&(i=Math.sign(i)*Math.abs(o/e)),n.x=t.x+o,n.y=t.y+i}(o,t.chartArea.width/t.chartArea.height)}return o}function U(t,n,e,o){const i=s(n,"x",t),a=s(n,"y",t),{top:r,left:c,right:l,bottom:m,width:u,height:d}=t.chartArea,f={top:r,left:c,right:l,bottom:m},p=I(t,e,o&&i&&a);i&&W(f,t.chartArea,p,{min:"left",max:"right",prop:"x"}),a&&W(f,t.chartArea,p,{min:"top",max:"bottom",prop:"y"});const h=f.right-f.left,g=f.bottom-f.top;return{...f,width:h,height:g,zoomX:i&&h?1+(u-h)/u:1,zoomY:a&&g?1+(d-g)/d:1}}function $(t,n){const e=u(t);if(!e.dragStart)return;T(t,"mousemove");const{mode:o,onZoomComplete:i,drag:a}=e.options.zoom??{},{threshold:r=0,maintainAspectRatio:c}=a??{},l=U(t,o,{dragStart:e.dragStart,dragEnd:n},c),m=s(o,"x",t)?l.width:0,d=s(o,"y",t)?l.height:0,f=Math.sqrt(m*m+d*d);if(e.dragStart=e.dragEnd=void 0,f<=r)return e.dragging=!1,void t.draw();R(t,{x:l.left,y:l.top},{x:l.right,y:l.bottom},"zoom","drag"),e.dragging=!1,e.filterNextClick=!0,i?.({chart:t})}function _(t,n){const{handlers:{onZoomComplete:e},options:{zoom:o={}}}=u(t);if(!function(t,n,e){if(r(i(e.wheel),n))e.onZoomRejected?.({chart:t,event:n});else if(!1!==X(t,n,e)&&(n.cancelable&&n.preventDefault(),void 0!==n.deltaY))return!0}(t,n,o))return;const a=n.target?.getBoundingClientRect(),s=o?.wheel?.speed??.1,c=n.deltaY>=0?2-1/(1-s):1+s;D(t,{x:c,y:c,focalPoint:{x:n.clientX-a.left,y:n.clientY-a.top}},"zoom","wheel"),e?.(n)}function G(t,n,e,o){e&&(u(t).handlers[n]=function(t,n){let e;return function(){return clearTimeout(e),e=setTimeout(t,n),n}}((()=>e?.({chart:t})),o))}function J(t,n){return function(e,o){const{pan:s,zoom:c={}}=n.options;if(!s||!s.enabled)return!1;const l=o&&o.srcEvent;return!l||(!(!n.panning&&"mouse"===o.pointerType&&(r(i(s),l)||a(i(c.drag),l)))||(s.onPanRejected?.({chart:t,event:o}),!1))}}function Q(t,n,e){if(n.scale){const{center:o,pointers:i}=e,a=1/n.scale*e.scale,r=e.target.getBoundingClientRect(),c=function(t,n){const e=Math.abs(t.clientX-n.clientX),o=Math.abs(t.clientY-n.clientY),i=e/o;let a,r;return i>.3&&i<1.7?a=r=!0:e>o?a=!0:r=!0,{x:a,y:r}}(i[0],i[1]),l=n.options.zoom?.mode;D(t,{x:c.x&&s(l,"x",t)?a:1,y:c.y&&s(l,"y",t)?a:1,focalPoint:{x:o.x-r.left,y:o.y-r.top}},"zoom","pinch"),n.scale=e.scale}}function tt(t,n,e){const o=n.delta;o&&(n.panning=!0,E(t,{x:e.deltaX-o.x,y:e.deltaY-o.y},n.panScales&&n.panScales.map((n=>t.scales[n])).filter(Boolean)),n.delta={x:e.deltaX,y:e.deltaY})}const nt=new WeakMap;function et(t,o){const i=u(t),a=t.canvas,{pan:r,zoom:s}=o,c=new n.Manager(a);s?.pinch?.enabled&&(c.add(new n.Pinch),c.on("pinchstart",(n=>function(t,n,o){if(n.options.zoom?.pinch?.enabled){const i=e.getRelativePosition(o.srcEvent,t);!1===n.options.zoom?.onZoomStart?.({chart:t,event:o.srcEvent,point:i})?(n.scale=null,n.options.zoom?.onZoomRejected?.({chart:t,event:o.srcEvent})):n.scale=1}}(t,i,n))),c.on("pinch",(n=>Q(t,i,n))),c.on("pinchend",(n=>function(t,n,e){n.scale&&(Q(t,n,e),n.scale=null,n.options.zoom?.onZoomComplete?.({chart:t}))}(t,i,n)))),r&&r.enabled&&(c.add(new n.Pan({threshold:r.threshold,enable:J(t,i)})),c.on("panstart",(n=>function(t,n,e){const{enabled:o,onPanStart:i,onPanRejected:a}=n.options.pan??{};if(!o)return;const r=e.target.getBoundingClientRect(),s={x:e.center.x-r.left,y:e.center.y-r.top};if(!1===i?.({chart:t,event:e,point:s}))return a?.({chart:t,event:e});n.panScales=l(n.options.pan,s,t).map((t=>t.id)),n.delta={x:0,y:0},tt(t,n,e)}(t,i,n))),c.on("panmove",(n=>tt(t,i,n))),c.on("panend",(()=>function(t,n){n.delta=null,n.panning&&(n.panning=!1,n.filterNextClick=!0,n.options.pan?.onPanComplete?.({chart:t}))}(t,i)))),nt.set(t,c)}function ot(t){const n=nt.get(t);n&&(n.remove("pinchstart"),n.remove("pinch"),n.remove("pinchend"),n.remove("panstart"),n.remove("pan"),n.remove("panend"),n.destroy(),nt.delete(t))}function it(t,n,e){const o=e.zoom?.drag,{dragStart:i,dragEnd:a}=u(t);if(o?.drawTime!==n||!i||!a)return;const{left:r,top:s,width:c,height:l}=U(t,e.zoom?.mode,{dragStart:i,dragEnd:a},o.maintainAspectRatio),m=t.ctx;m.save(),m.beginPath(),m.fillStyle=o.backgroundColor||"rgba(225,225,225,0.3)",m.fillRect(r,s,c,l),o.borderWidth&&(m.lineWidth=o.borderWidth,m.strokeStyle=o.borderColor||"rgba(225,225,225)",m.strokeRect(r,s,c,l)),m.restore()}const at=t=>{t.pan=(n,e,o)=>E(t,n,e,o,"api"),t.zoom=(n,e)=>D(t,n,e),t.zoomRect=(n,e,o)=>R(t,n,e,o),t.zoomScale=(n,e,o)=>function(t,n,e,o="none",i="api"){const a=u(t);O(t,a),x(t.scales[n],e,void 0,!0),t.update(o),a.options.zoom?.onZoom?.({chart:t,trigger:i})}(t,n,e,o),t.resetZoom=n=>function(t,n="default"){const e=u(t),o=O(t,e);for(const n of Object.values(t.scales)){const t=n.options;o[n.id]?(t.min=o[n.id].min.options,t.max=o[n.id].max.options):(delete t.min,delete t.max),delete e.updatedScaleLimits[n.id]}t.update(n),e.options.zoom?.onZoomComplete?.({chart:t})}(t,n),t.getZoomLevel=()=>function(t){const n=u(t);let e=1,o=1;for(const i of Object.values(t.scales)){const t=L(n,i.id);if(t){const n=Math.round(t/(i.max-i.min)*100)/100;e=Math.min(e,n),o=Math.max(o,n)}}return e<1?e:o}(t),t.getInitialScaleBounds=()=>F(t),t.getZoomedScaleBounds=()=>function(t){const n=u(t),e={};for(const o of Object.keys(t.scales))e[o]=n.updatedScaleLimits[o];return e}(t),t.isZoomedOrPanned=()=>function(t){const n=F(t);for(const e of Object.keys(t.scales)){const{min:o,max:i}=n[e];if(void 0!==o&&t.scales[e].min!==o)return!0;if(void 0!==i&&t.scales[e].max!==i)return!0}return!1}(t),t.isZoomingOrPanning=()=>function(t){const n=u(t);return!(!A(n)&&!n.filterNextClick)}(t)};var rt={id:"zoom",version:"2.2.7",defaults:{pan:{enabled:!1,mode:"xy",threshold:10,modifierKey:null},zoom:{wheel:{enabled:!1,speed:.1,modifierKey:null},drag:{enabled:!1,drawTime:"beforeDatasetsDraw",modifierKey:null},pinch:{enabled:!1},mode:"xy"}},start(t,e,o){u(t).options=o,Object.prototype.hasOwnProperty.call(o.zoom,"enabled")&&console.warn("The option `zoom.enabled` is no longer supported. Please use `zoom.wheel.enabled`, `zoom.drag.enabled`, or `zoom.pinch.enabled`."),(Object.prototype.hasOwnProperty.call(o.zoom,"overScaleMode")||Object.prototype.hasOwnProperty.call(o.pan,"overScaleMode"))&&console.warn("The option `overScaleMode` is deprecated. Please use `scaleMode` instead (and update `mode` as desired)."),n&&et(t,o),at(t)},beforeEvent(t,{event:n}){const e=u(t);return!A(e)&&("click"!==n.type&&"mouseup"!==n.type||!e.filterNextClick?void 0:(e.filterNextClick=!1,!1))},beforeUpdate(t,n,e){const o=u(t),i=o.options;o.options=e,function(t,n){const{pan:e,zoom:o}=t,{pan:i,zoom:a}=n;return o?.pinch?.enabled!==a?.pinch?.enabled||e?.enabled!==i?.enabled||e?.threshold!==i?.threshold}(i,e)&&(ot(t),et(t,e)),function(t,n){const e=t.canvas,{wheel:o,drag:i,onZoomComplete:a}=n.zoom??{};o?.enabled?(Y(t,e,"wheel",_),G(t,"onZoomComplete",a,250)):T(t,"wheel"),i?.enabled?(Y(t,e,"mousedown",K),Y(t,e.ownerDocument,"mouseup",$)):(T(t,"mousedown"),T(t,"mousemove"),T(t,"mouseup"),T(t,"keydown"))}(t,e)},beforeDatasetsDraw(t,n,e){it(t,"beforeDatasetsDraw",e)},afterDatasetsDraw(t,n,e){it(t,"afterDatasetsDraw",e)},beforeDraw(t,n,e){it(t,"beforeDraw",e)},afterDraw(t,n,e){it(t,"afterDraw",e)},stop(t){!function(t){T(t,"mousedown"),T(t,"mousemove"),T(t,"mouseup"),T(t,"wheel"),T(t,"click"),T(t,"keydown")}(t),n&&ot(t),function(t){m.delete(t)}(t)},panFunctions:S,zoomFunctions:M,zoomRectFunctions:z};return t.Chart.register(rt),rt}));
7
+ !function(t,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n(require("chart.js"),require("hammerjs"),require("chart.js/helpers")):"function"==typeof define&&define.amd?define(["chart.js","hammerjs","chart.js/helpers"],n):(t="undefined"!=typeof globalThis?globalThis:t||self).ChartZoom=n(t.Chart,t.Hammer,t.Chart.helpers)}(this,(function(t,n,e){"use strict";const o=t=>`${t}Key`,i=t=>t?.enabled&&t.modifierKey?t.modifierKey:void 0,a=(t,n)=>t&&n[o(t)],r=(t,n)=>t&&!n[o(t)];function s(t,n,e){return void 0===t||("string"==typeof t?-1!==t.indexOf(n):"function"==typeof t&&-1!==t({chart:e}).indexOf(n))}function c(t,n){return"function"==typeof t&&(t=t({chart:n})),"string"==typeof t?{x:-1!==t.indexOf("x"),y:-1!==t.indexOf("y")}:{x:!1,y:!1}}function l(t,n,e){const{mode:o="xy",scaleMode:i,overScaleMode:a}=t||{},r=function({x:t,y:n},e){const o=e.scales,i=Object.keys(o);for(let e=0;e<i.length;e++){const a=o[i[e]];if(n>=a.top&&n<=a.bottom&&t>=a.left&&t<=a.right)return a}return null}(n,e),s=c(o,e),l=c(i,e);return((t,n,e,o)=>{if(!n)return;const i=c(n,t);for(const t of["x","y"])i[t]&&(e[t]=o[t],o[t]=!1)})(e,a,l,s),r&&l[r.axis]?[r]:((t,n)=>{const e=[];for(const o of Object.values(t.scales))n[o.axis]&&e.push(o);return e||Object.values(t.scales)})(e,s)}const m=new WeakMap;function u(t){let n=m.get(t);return n||(n={originalScaleLimits:{},updatedScaleLimits:{},handlers:{},options:{},targets:{},panDelta:{},dragging:!1,panning:!1},m.set(t,n)),n}const d=t=>void 0===t||isNaN(t);function f(t,n,o,i){const a=o&&e.isNumber(t)&&e.isNumber(n)?Math.max(0,Math.min(1,(t-n)/o)):0;return{min:i*a,max:i*(1-a)}}function p(t,n){const e=t.isHorizontal()?n.x:n.y;return t.getValueForPixel(e)}function h(t,n,e){const o=t.max-t.min,i=o*(n-1);return f(p(t,e),t.min,o,i)}function g(t,n,o,i,a){let r=o[i];if("original"===r){const o=t.originalScaleLimits[n.id][i];if(e.isNumber(o.options))return o.options;if(!e.isNullOrUndef(o.options)){const t=n.parse(o.options);if(e.isNumber(t))return t}r=o.scale}return e.valueOrDefault(r,a)}function x(t,{min:n,max:o},i,a=!1,r=!1){const s=u(t.chart),{options:c}=t,l=function(t,n){return n?.[t.id]||n?.[t.axis]||{}}(t,i),{minRange:m=0}=l,d=g(s,t,l,"min",-1/0),f=g(s,t,l,"max",1/0);if(r&&(n<d||o>f))return!0;const p=t.max-t.min,h=a?Math.max(o-n,m):p;if(a&&h===m&&p<=m)return!0;const x=function(t,{min:n,max:o,minLimit:i,maxLimit:a},r,s){const c=(t-o+n)/2;n-=c,o+=c;const l={min:"original",max:"original"},m=g(r,s,l,"min",-1/0),u=g(r,s,l,"max",1/0),d=t/1e6;return e.almostEquals(n,m,d)&&(n=m),e.almostEquals(o,u,d)&&(o=u),n<i?(n=i,o=Math.min(i+t,a)):o>a&&(o=a,n=Math.max(a-t,i)),{min:n,max:o}}(h,{min:n,max:o,minLimit:d,maxLimit:f},s,t);return c.min=x.min,c.max=x.max,s.updatedScaleLimits[t.id]=x,t.parse(x.min)!==t.min||t.parse(x.max)!==t.max}const y=t=>0===t||isNaN(t)?0:t<0?Math.min(Math.round(t),-1):Math.max(Math.round(t),1);const b={millisecond:0,second:500,minute:3e4,hour:18e5,day:432e5,week:3024e5,month:1296e6,quarter:5184e6,year:157248e5};function v(t,n,e,o=!1){const{min:i,max:a}=t;let r=0;if((t=>"time"===t.type)(t)){const n=t.options.time?.round;r=n?b[n]:0}const s=t.getValueForPixel(t.getPixelForValue(i+r)-n),c=t.getValueForPixel(t.getPixelForValue(a+r)-n);return!(!d(s)&&!d(c))||x(t,{min:s,max:c},e,o,!0)}function w(t,n,e){return v(t,n,e,!0)}const M={category:function(t,n,e,o){const i=h(t,n,e);return t.min===t.max&&n<1&&function(t){const n=t.getLabels().length-1;t.min>0&&(t.min-=1),t.max<n&&(t.max+=1)}(t),x(t,{min:t.min+y(i.min),max:t.max-y(i.max)},o,!0)},default:function(t,n,e,o){const i=h(t,n,e);return x(t,{min:t.min+i.min,max:t.max-i.max},o,!0)},logarithmic:function(t,n,e,o){const i=function(t,n,e){const o=p(t,e);if(void 0===o)return{min:t.min,max:t.max};const i=Math.log10(t.min),a=Math.log10(t.max),r=a-i,s=f(Math.log10(o),i,r,r*(n-1));return{min:Math.pow(10,i+s.min),max:Math.pow(10,a-s.max)}}(t,n,e);return x(t,i,o,!0)}},z={default:function(t,n,e,o){return x(t,function(t,n,e){const o=t.getValueForPixel(n)??t.min,i=t.getValueForPixel(e)??t.max;return{min:Math.min(o,i),max:Math.max(o,i)}}(t,n,e),o,!0)}},S={category:function(t,n,e){const o=t.getLabels().length-1;let{min:i,max:a}=t;const r=Math.max(a-i,1),s=Math.round(function(t){return t.isHorizontal()?t.width:t.height}(t)/Math.max(r,10)),c=Math.round(Math.abs(n/s));let l;return n<-s?(a=Math.min(a+c,o),i=1===r?a:a-r,l=a===o):n>s&&(i=Math.max(0,i-c),a=1===r?i:i+r,l=0===i),x(t,{min:i,max:a},e)||Boolean(l)},default:v,logarithmic:w,timeseries:w};function P(t,n,e){const{id:o,options:{min:i,max:a}}=t;if(!n[o]||!e[o])return!0;const r=e[o];return r.min!==i||r.max!==a}function j(t,n){for(const e of Object.keys(t))n[e]||delete t[e]}function O(t,n){const{scales:e}=t,{originalScaleLimits:o,updatedScaleLimits:i}=n;for(const t of Object.values(e))P(t,o,i)&&(o[t.id]={min:{scale:t.min,options:t.options.min},max:{scale:t.max,options:t.options.max}});return j(o,e),j(i,e),o}function k(t,n,e,o){const i=M[t.type]||M.default;i?.(t,n,e,o)}function C(t,n,e,o){const i=z[t.type]||z.default;i?.(t,n,e,o)}function Z(t){const n=t.chartArea;return{x:(n.left+n.right)/2,y:(n.top+n.bottom)/2}}function D(t,n,e="none",o="api"){const{x:i=1,y:a=1,focalPoint:r=Z(t)}="number"==typeof n?{x:n,y:n}:n,s=u(t),{options:{limits:c={},zoom:m}}=s;O(t,s);const d=1!==i,f=1!==a,p=l(m,r,t);for(const t of p)t.isHorizontal()&&d?k(t,i,r,c):!t.isHorizontal()&&f&&k(t,a,r,c);t.update(e),m?.onZoom?.({chart:t,trigger:o,amount:{x:i,y:a,focalPoint:r}})}function R(t,n,e,o="none",i="api"){const a=u(t),{options:{limits:r={},zoom:c={}}}=a,{mode:l="xy"}=c;O(t,a);const m=s(l,"x",t),d=s(l,"y",t);for(const o of Object.values(t.scales))o.isHorizontal()&&m?C(o,n.x,e.x,r):!o.isHorizontal()&&d&&C(o,n.y,e.y,r);t.update(o),c.onZoom?.({chart:t,trigger:i})}function L(t,n){const o=t.originalScaleLimits[n];if(!o)return;const{min:i,max:a}=o;return e.isNumber(a.options)&&e.isNumber(i.options)?a.options-i.options:e.isNumber(a.scale)&&e.isNumber(i.scale)?a.scale-i.scale:void 0}function N(t,n,o,i){const{panDelta:a}=i,r=a[t.id]||0;e.sign(r)===e.sign(n)&&(n+=r);const s=S[t.type]||S.default;s?.(t,n,o)?a[t.id]=0:a[t.id]=n}function E(t,n,e,o="none",i="other"){const{x:a=0,y:r=0}="number"==typeof n?{x:n,y:n}:n,s=u(t),{options:{pan:c,limits:l={}}}=s,{onPan:m}=c||{};O(t,s);const d=0!==a,f=0!==r,p=e||Object.values(t.scales);for(const t of p)t.isHorizontal()&&d?N(t,a,l,s):!t.isHorizontal()&&f&&N(t,r,l,s);t.update(o),m?.({chart:t,trigger:i,delta:{x:a,y:r}})}function F(t){const n=u(t);O(t,n);const e={};for(const o of Object.keys(t.scales)){const{min:t,max:i}=n.originalScaleLimits[o]||{min:{},max:{}};e[o]={min:t.scale,max:i.scale}}return e}function A(t){return t.panning||t.dragging}const H=(t,n,e)=>Math.min(e,Math.max(n,t));function T(t,n){const{handlers:e,targets:o}=u(t),i=e[n],a=o[n];i&&a&&(a.removeEventListener(n,i),delete e[n])}function Y(t,n,e,o){const{handlers:i,options:a,targets:r}=u(t);if(i[e]&&r[e]===n)return;T(t,e);const s=i[e]=n=>o(t,n,a);r[e]=n;const c="wheel"!==e&&void 0;n.addEventListener(e,s,{passive:c})}function B(t,n){const e=u(t);e.dragStart&&(e.dragging=!0,e.dragEnd=n,t.draw())}function q(t,n){const e=u(t);e.dragStart&&"Escape"===n.key&&(T(t,"keydown"),e.dragging=!1,e.dragStart=e.dragEnd=void 0,t.draw())}function V(t,n){if(t.target!==n.canvas){const e=n.canvas.getBoundingClientRect();return{x:t.clientX-e.left,y:t.clientY-e.top}}return e.getRelativePosition(t,n)}function X(t,n,e){const{onZoomStart:o,onZoomRejected:i}=e;if(o){const e=V(n,t);if(!1===o?.({chart:t,event:n,point:e}))return i?.({chart:t,event:n}),!1}}function K(t,n){if(t.legend){const o=e.getRelativePosition(n,t);if(e._isPointInArea(o,t.legend))return}const o=u(t),{pan:s,zoom:c={}}=o.options;if(0!==n.button||a(i(s),n)||r(i(c.drag),n))return c.onZoomRejected?.({chart:t,event:n});!1!==X(t,n,c)&&(o.dragStart=n,Y(t,t.canvas.ownerDocument,"mousemove",B),Y(t,window.document,"keydown",q))}function W(t,n,e,{min:o,max:i,prop:a}){t[o]=H(Math.min(e.begin[a],e.end[a]),n[o],n[i]),t[i]=H(Math.max(e.begin[a],e.end[a]),n[o],n[i])}function I(t,n,e){const o={begin:V(n.dragStart,t),end:V(n.dragEnd,t)};if(e){!function({begin:t,end:n},e){let o=n.x-t.x,i=n.y-t.y;const a=Math.abs(o/i);a>e?o=Math.sign(o)*Math.abs(i*e):a<e&&(i=Math.sign(i)*Math.abs(o/e)),n.x=t.x+o,n.y=t.y+i}(o,t.chartArea.width/t.chartArea.height)}return o}function U(t,n,e,o){const i=s(n,"x",t),a=s(n,"y",t),{top:r,left:c,right:l,bottom:m,width:u,height:d}=t.chartArea,f={top:r,left:c,right:l,bottom:m},p=I(t,e,o&&i&&a);i&&W(f,t.chartArea,p,{min:"left",max:"right",prop:"x"}),a&&W(f,t.chartArea,p,{min:"top",max:"bottom",prop:"y"});const h=f.right-f.left,g=f.bottom-f.top;return{...f,width:h,height:g,zoomX:i&&h?1+(u-h)/u:1,zoomY:a&&g?1+(d-g)/d:1}}function $(t,n){const e=u(t);if(!e.dragStart)return;T(t,"mousemove");const{mode:o,onZoomComplete:i,drag:a}=e.options.zoom??{},{threshold:r=0,maintainAspectRatio:c}=a??{},l=U(t,o,{dragStart:e.dragStart,dragEnd:n},c),m=s(o,"x",t)?l.width:0,d=s(o,"y",t)?l.height:0,f=Math.sqrt(m*m+d*d);if(e.dragStart=e.dragEnd=void 0,f<=r)return e.dragging=!1,void t.draw();R(t,{x:l.left,y:l.top},{x:l.right,y:l.bottom},"zoom","drag"),e.dragging=!1,e.filterNextClick=!0,i?.({chart:t})}function _(t,n){const{handlers:{onZoomComplete:e},options:{zoom:o={}}}=u(t);if(!function(t,n,e){if(r(i(e.wheel),n))e.onZoomRejected?.({chart:t,event:n});else if(!1!==X(t,n,e)&&(n.cancelable&&n.preventDefault(),void 0!==n.deltaY))return!0}(t,n,o))return;const a=n.target?.getBoundingClientRect(),s=o?.wheel?.speed??.1,c=n.deltaY>=0?2-1/(1-s):1+s;D(t,{x:c,y:c,focalPoint:{x:n.clientX-a.left,y:n.clientY-a.top}},"zoom","wheel"),e?.(n)}function G(t,n,e,o){e&&(u(t).handlers[n]=function(t,n){let e;return function(){return clearTimeout(e),e=setTimeout(t,n),n}}((()=>e?.({chart:t})),o))}function J(t,n){return function(e,o){const{pan:s,zoom:c={}}=n.options;if(!s||!s.enabled)return!1;const l=o&&o.srcEvent;return!l||(!(!n.panning&&"mouse"===o.pointerType&&(r(i(s),l)||a(i(c.drag),l)))||(s.onPanRejected?.({chart:t,event:o}),!1))}}function Q(t,n,e){if(n.scale){const{center:o,pointers:i}=e,a=1/n.scale*e.scale,r=e.target.getBoundingClientRect(),c=function(t,n){const e=Math.abs(t.clientX-n.clientX),o=Math.abs(t.clientY-n.clientY),i=e/o;let a,r;return i>.3&&i<1.7?a=r=!0:e>o?a=!0:r=!0,{x:a,y:r}}(i[0],i[1]),l=n.options.zoom?.mode;D(t,{x:c.x&&s(l,"x",t)?a:1,y:c.y&&s(l,"y",t)?a:1,focalPoint:{x:o.x-r.left,y:o.y-r.top}},"zoom","pinch"),n.scale=e.scale}}function tt(t,n,e){const o=n.delta;o&&(n.panning=!0,E(t,{x:e.deltaX-o.x,y:e.deltaY-o.y},n.panScales&&n.panScales.map((n=>t.scales[n])).filter(Boolean)),n.delta={x:e.deltaX,y:e.deltaY})}const nt=new WeakMap;function et(t,o){const i=u(t),a=t.canvas,{pan:r,zoom:s}=o,c=new n.Manager(a);s?.pinch?.enabled&&(c.add(new n.Pinch),c.on("pinchstart",(n=>function(t,n,o){if(n.options.zoom?.pinch?.enabled){const i=e.getRelativePosition(o.srcEvent,t);!1===n.options.zoom?.onZoomStart?.({chart:t,event:o.srcEvent,point:i})?(n.scale=null,n.options.zoom?.onZoomRejected?.({chart:t,event:o.srcEvent})):n.scale=1}}(t,i,n))),c.on("pinch",(n=>Q(t,i,n))),c.on("pinchend",(n=>function(t,n,e){n.scale&&(Q(t,n,e),n.scale=null,n.options.zoom?.onZoomComplete?.({chart:t}))}(t,i,n)))),r&&r.enabled&&(c.add(new n.Pan({threshold:r.threshold,enable:J(t,i)})),c.on("panstart",(n=>function(t,n,e){const{enabled:o,onPanStart:i,onPanRejected:a}=n.options.pan??{};if(!o)return;const r=e.target.getBoundingClientRect(),s={x:e.center.x-r.left,y:e.center.y-r.top};if(!1===i?.({chart:t,event:e,point:s}))return a?.({chart:t,event:e});n.panScales=l(n.options.pan,s,t).map((t=>t.id)),n.delta={x:0,y:0},tt(t,n,e)}(t,i,n))),c.on("panmove",(n=>tt(t,i,n))),c.on("panend",(()=>function(t,n){n.delta=null,n.panning&&(n.panning=!1,n.filterNextClick=!0,n.options.pan?.onPanComplete?.({chart:t}))}(t,i)))),nt.set(t,c)}function ot(t){const n=nt.get(t);n&&(n.remove("pinchstart"),n.remove("pinch"),n.remove("pinchend"),n.remove("panstart"),n.remove("pan"),n.remove("panend"),n.destroy(),nt.delete(t))}function it(t,n,e){const o=e.zoom?.drag,{dragStart:i,dragEnd:a}=u(t);if(o?.drawTime!==n||!i||!a)return;const{left:r,top:s,width:c,height:l}=U(t,e.zoom?.mode,{dragStart:i,dragEnd:a},o.maintainAspectRatio),m=t.ctx;m.save(),m.beginPath(),m.fillStyle=o.backgroundColor||"rgba(225,225,225,0.3)",m.fillRect(r,s,c,l),o.borderWidth&&(m.lineWidth=o.borderWidth,m.strokeStyle=o.borderColor||"rgba(225,225,225)",m.strokeRect(r,s,c,l)),m.restore()}const at=t=>{t.pan=(n,e,o)=>E(t,n,e,o,"api"),t.zoom=(n,e)=>D(t,n,e),t.zoomRect=(n,e,o)=>R(t,n,e,o),t.zoomScale=(n,e,o)=>function(t,n,e,o="none",i="api"){const a=u(t);O(t,a),x(t.scales[n],e,void 0,!0),t.update(o),a.options.zoom?.onZoom?.({chart:t,trigger:i})}(t,n,e,o),t.resetZoom=n=>function(t,n="default"){const e=u(t),o=O(t,e);for(const n of Object.values(t.scales)){const t=n.options;o[n.id]?(t.min=o[n.id].min.options,t.max=o[n.id].max.options):(delete t.min,delete t.max),delete e.updatedScaleLimits[n.id]}t.update(n),e.options.zoom?.onZoomComplete?.({chart:t})}(t,n),t.getZoomLevel=()=>function(t){const n=u(t);let e=1,o=1;for(const i of Object.values(t.scales)){const t=L(n,i.id);if(t){const n=Math.round(t/(i.max-i.min)*100)/100;e=Math.min(e,n),o=Math.max(o,n)}}return e<1?e:o}(t),t.getInitialScaleBounds=()=>F(t),t.getZoomedScaleBounds=()=>function(t){const n=u(t),e={};for(const o of Object.keys(t.scales))e[o]=n.updatedScaleLimits[o];return e}(t),t.isZoomedOrPanned=()=>function(t){const n=F(t);for(const e of Object.keys(t.scales)){const{min:o,max:i}=n[e];if(void 0!==o&&t.scales[e].min!==o)return!0;if(void 0!==i&&t.scales[e].max!==i)return!0}return!1}(t),t.isZoomingOrPanning=()=>function(t){const n=u(t);return!(!A(n)&&!n.filterNextClick)}(t)};var rt={id:"zoom",version:"2.2.10",defaults:{pan:{enabled:!1,mode:"xy",threshold:10,modifierKey:null},zoom:{wheel:{enabled:!1,speed:.1,modifierKey:null},drag:{enabled:!1,drawTime:"beforeDatasetsDraw",modifierKey:null},pinch:{enabled:!1},mode:"xy"}},start(t,e,o){u(t).options=o,Object.prototype.hasOwnProperty.call(o.zoom,"enabled")&&console.warn("The option `zoom.enabled` is no longer supported. Please use `zoom.wheel.enabled`, `zoom.drag.enabled`, or `zoom.pinch.enabled`."),(Object.prototype.hasOwnProperty.call(o.zoom,"overScaleMode")||Object.prototype.hasOwnProperty.call(o.pan,"overScaleMode"))&&console.warn("The option `overScaleMode` is deprecated. Please use `scaleMode` instead (and update `mode` as desired)."),n&&et(t,o),at(t)},beforeEvent(t,{event:n}){const e=u(t);return!A(e)&&("click"!==n.type&&"mouseup"!==n.type||!e.filterNextClick?void 0:(e.filterNextClick=!1,!1))},beforeUpdate(t,n,e){const o=u(t),i=o.options;o.options=e,function(t,n){const{pan:e,zoom:o}=t,{pan:i,zoom:a}=n;return o?.pinch?.enabled!==a?.pinch?.enabled||e?.enabled!==i?.enabled||e?.threshold!==i?.threshold}(i,e)&&(ot(t),et(t,e)),function(t,n){const e=t.canvas,{wheel:o,drag:i,onZoomComplete:a}=n.zoom??{};o?.enabled?(Y(t,e,"wheel",_),G(t,"onZoomComplete",a,250)):T(t,"wheel"),i?.enabled?(Y(t,e,"mousedown",K),Y(t,e.ownerDocument,"mouseup",$)):(T(t,"mousedown"),T(t,"mousemove"),T(t,"mouseup"),T(t,"keydown"))}(t,e)},beforeDatasetsDraw(t,n,e){it(t,"beforeDatasetsDraw",e)},afterDatasetsDraw(t,n,e){it(t,"afterDatasetsDraw",e)},beforeDraw(t,n,e){it(t,"beforeDraw",e)},afterDraw(t,n,e){it(t,"afterDraw",e)},stop(t){!function(t){T(t,"mousedown"),T(t,"mousemove"),T(t,"mouseup"),T(t,"wheel"),T(t,"click"),T(t,"keydown")}(t),n&&ot(t),function(t){m.delete(t)}(t)},panFunctions:S,zoomFunctions:M,zoomRectFunctions:z};return t.Chart.register(rt),rt}));
8
8
  //# sourceMappingURL=chartjs-plugin-zoom.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chartjs-plugin-zoom.min.js","sources":["../../src/utils.ts","../../src/state.ts","../../src/scale.types.ts","../../src/core.ts","../../src/handlers.ts","../../src/hammer.ts","../../src/plugin.ts","../../src/defaults.ts","../../src/index.umd.ts"],"sourcesContent":["import type { Chart, Point, Scale } from 'chart.js'\nimport type { DragOptions, ModeOption, ModifierKey, PanOptions } from './options'\n\nconst eventKey = (key: ModifierKey): 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey' => `${key}Key`\n\nexport const getModifierKey = (opts?: DragOptions | PanOptions): ModifierKey | undefined =>\n opts?.enabled && opts.modifierKey ? opts.modifierKey : undefined\nexport const keyPressed = (key: ModifierKey | undefined, event: TouchEvent | MouseEvent | PointerEvent) =>\n key && event[eventKey(key)]\nexport const keyNotPressed = (key: ModifierKey | undefined, event: TouchEvent | MouseEvent | PointerEvent) =>\n key && !event[eventKey(key)]\n\nexport function directionEnabled(mode: ModeOption | undefined, dir: 'x' | 'y', chart: Chart): boolean {\n if (mode === undefined) {\n return true\n } else if (typeof mode === 'string') {\n return mode.indexOf(dir) !== -1\n } else if (typeof mode === 'function') {\n return mode({ chart }).indexOf(dir) !== -1\n }\n\n return false\n}\n\nfunction directionsEnabled(mode: ModeOption | undefined, chart: Chart) {\n if (typeof mode === 'function') {\n mode = mode({ chart })\n }\n if (typeof mode === 'string') {\n return { x: mode.indexOf('x') !== -1, y: mode.indexOf('y') !== -1 }\n }\n\n return { x: false, y: false }\n}\n\nexport function debounce(fn: () => void, delay: number | undefined) {\n let timeout: number | NodeJS.Timeout\n return function () {\n clearTimeout(timeout)\n timeout = setTimeout(fn, delay)\n return delay\n }\n}\n\nfunction getScaleUnderPoint({ x, y }: Point, chart: Chart): Scale | null {\n const scales = chart.scales\n const scaleIds = Object.keys(scales)\n for (let i = 0; i < scaleIds.length; i++) {\n const scale = scales[scaleIds[i]]\n if (y >= scale.top && y <= scale.bottom && x >= scale.left && x <= scale.right) {\n return scale\n }\n }\n return null\n}\n\ntype EnabledDirections = { x: boolean; y: boolean }\n\nconst convertOverScaleMode = (\n chart: Chart,\n overScaleMode: ModeOption | undefined,\n scaleEnabled: EnabledDirections,\n enabled: EnabledDirections\n) => {\n if (!overScaleMode) {\n return\n }\n\n const overScaleEnabled = directionsEnabled(overScaleMode, chart)\n for (const axis of ['x', 'y'] as const) {\n if (overScaleEnabled[axis]) {\n scaleEnabled[axis] = enabled[axis]\n enabled[axis] = false\n }\n }\n}\n\nconst getEnabledScales = (chart: Chart, enabled: EnabledDirections): Scale[] => {\n const enabledScales: Scale[] = []\n\n for (const scaleItem of Object.values(chart.scales)) {\n if (enabled[scaleItem.axis as 'x' | 'y']) {\n enabledScales.push(scaleItem)\n }\n }\n\n return enabledScales || Object.values(chart.scales)\n}\n\n/**\n * Evaluate the chart's mode, scaleMode, and overScaleMode properties to\n * determine which axes are eligible for scaling.\n * options.overScaleMode can be a function if user want zoom only one scale of many for example.\n */\nexport function getEnabledScalesByPoint(options: PanOptions | undefined, point: Point, chart: Chart): Scale[] {\n const { mode = 'xy', scaleMode, overScaleMode } = options || {}\n const scale = getScaleUnderPoint(point, chart)\n\n const enabled = directionsEnabled(mode, chart)\n const scaleEnabled = directionsEnabled(scaleMode, chart)\n\n // Convert deprecated overScaleEnabled to new scaleEnabled.\n convertOverScaleMode(chart, overScaleMode, scaleEnabled, enabled)\n\n if (scale && scaleEnabled[scale.axis as 'x' | 'y']) {\n return [scale]\n }\n\n return getEnabledScales(chart, enabled)\n}\n","import { Chart, type Point } from 'chart.js'\nimport type { ZoomPluginOptions } from './options'\n\nexport type ScaleRange = { min: number; max: number }\nexport type OriginalLimits = { min: { scale?: number; options?: unknown }; max: { scale?: number; options?: unknown } }\nexport type OriginalScaleLimits = Record<string, OriginalLimits>\nexport type UpdatedScaleLimits = Record<string, ScaleRange>\n\nexport type HandlerFunctions = {\n click: (chart: Chart, event: MouseEvent, options: ZoomPluginOptions) => void\n keydown: (chart: Chart, event: KeyboardEvent) => void\n mousedown: (chart: Chart, event: MouseEvent, options: ZoomPluginOptions) => void\n mousemove: (chart: Chart, event: MouseEvent, options: ZoomPluginOptions) => void\n mouseup: (chart: Chart, event: MouseEvent, options: ZoomPluginOptions) => void\n onZoomComplete: ({ chart }: { chart: Chart }) => void\n wheel: (chart: Chart, event: WheelEvent) => void\n}\nexport type HandlerName = keyof HandlerFunctions\nexport type HandlerFunction = HandlerFunctions[HandlerName]\nexport type Handler = EventListener\nexport type Handlers = Partial<Record<HandlerName, Handler>>\n\nexport type HandlerTarget = Partial<Record<HandlerName, HTMLCanvasElement | Document>>\n\nexport interface State {\n originalScaleLimits: OriginalScaleLimits\n updatedScaleLimits: UpdatedScaleLimits\n handlers: Handlers\n targets: HandlerTarget\n panDelta: Record<string, number>\n dragging: boolean\n panning: boolean\n options: ZoomPluginOptions\n dragStart?: MouseEvent\n dragEnd?: MouseEvent\n filterNextClick?: boolean\n scale?: number | null\n delta?: Point | null\n panScales?: string[]\n}\n\nconst chartStates = new WeakMap<Chart, State>()\n\nexport function getState(chart: Chart): State {\n let state = chartStates.get(chart)\n if (!state) {\n state = {\n originalScaleLimits: {},\n updatedScaleLimits: {},\n handlers: {},\n options: {},\n targets: {},\n panDelta: {},\n dragging: false,\n panning: false,\n }\n chartStates.set(chart, state)\n }\n return state\n}\n\nexport function removeState(chart: Chart) {\n chartStates.delete(chart)\n}\n","import { almostEquals, isNullOrUndef, isNumber, valueOrDefault } from 'chart.js/helpers'\nimport { getState, type ScaleRange, type State } from './state'\nimport type { Point, Scale, TimeScale, TimeUnit } from 'chart.js'\nimport type { LimitOptions, ScaleLimits } from './options'\n\nexport type ZoomFunction = (scale: Scale, zoom: number, center: Point, limits: LimitOptions) => boolean\nexport type ZoomRectFunction = (scale: Scale, from: number, to: number, limits: LimitOptions) => boolean\nexport type PanFunction = (scale: Scale, delta: number, limits: LimitOptions) => boolean\n\nconst isTimeScale = (scale: Scale): scale is TimeScale => scale.type === 'time'\n\nconst isNotNumber = (value?: number): value is undefined => value === undefined || isNaN(value)\n\nexport function zoomDelta(\n val: number | undefined,\n min: number | undefined,\n range: number,\n newRange: number\n): ScaleRange {\n const minPercent = range && isNumber(val) && isNumber(min) ? Math.max(0, Math.min(1, (val - min) / range)) : 0\n const maxPercent = 1 - minPercent\n\n return {\n min: newRange * minPercent,\n max: newRange * maxPercent,\n }\n}\n\nfunction getValueAtPoint(scale: Scale, point: Point): number | undefined {\n const pixel = scale.isHorizontal() ? point.x : point.y\n\n return scale.getValueForPixel(pixel)\n}\n\nfunction linearZoomDelta(scale: Scale, zoom: number, center: Point): ScaleRange {\n const range = scale.max - scale.min\n const newRange = range * (zoom - 1)\n const centerValue = getValueAtPoint(scale, center)\n\n return zoomDelta(centerValue, scale.min, range, newRange)\n}\n\nfunction logarithmicZoomRange(scale: Scale, zoom: number, center: Point) {\n const centerValue = getValueAtPoint(scale, center)\n\n // Return the original range, if value could not be determined.\n if (centerValue === undefined) {\n return { min: scale.min, max: scale.max }\n }\n\n const logMin = Math.log10(scale.min)\n const logMax = Math.log10(scale.max)\n const logCenter = Math.log10(centerValue)\n const logRange = logMax - logMin\n const newLogRange = logRange * (zoom - 1)\n const delta = zoomDelta(logCenter, logMin, logRange, newLogRange)\n\n return {\n min: Math.pow(10, logMin + delta.min),\n max: Math.pow(10, logMax - delta.max),\n }\n}\n\nfunction getScaleLimits(scale: Scale, limits?: LimitOptions): ScaleLimits {\n return limits?.[scale.id] || limits?.[scale.axis] || {}\n}\n\nfunction getLimit(state: State, scale: Scale, scaleLimits: ScaleLimits, prop: 'min' | 'max', fallback: number): number {\n let limit = scaleLimits[prop]\n if (limit === 'original') {\n const original = state.originalScaleLimits[scale.id][prop]\n if (isNumber(original.options)) {\n return original.options\n }\n\n if (!isNullOrUndef(original.options)) {\n const parsed = scale.parse(original.options)\n if (isNumber(parsed)) {\n return parsed\n }\n }\n\n limit = original.scale\n }\n return valueOrDefault(limit, fallback)\n}\n\nfunction linearRange(scale: Scale, pixel0: number, pixel1: number): ScaleRange {\n const v0 = scale.getValueForPixel(pixel0) ?? scale.min\n const v1 = scale.getValueForPixel(pixel1) ?? scale.max\n return {\n min: Math.min(v0, v1),\n max: Math.max(v0, v1),\n }\n}\n\nfunction fixRange(\n range: number,\n { min, max, minLimit, maxLimit }: { min: number; max: number; minLimit: number; maxLimit: number },\n state: State,\n scale: Scale\n) {\n const offset = (range - max + min) / 2\n min -= offset\n max += offset\n\n // In case the values are really close to the original values, use the original values.\n const origLimits: ScaleLimits = { min: 'original', max: 'original' }\n const origMin = getLimit(state, scale, origLimits, 'min', -Infinity)\n const origMax = getLimit(state, scale, origLimits, 'max', Infinity)\n\n const epsilon = range / 1e6\n if (almostEquals(min, origMin, epsilon)) {\n min = origMin\n }\n if (almostEquals(max, origMax, epsilon)) {\n max = origMax\n }\n\n // Apply limits\n if (min < minLimit) {\n min = minLimit\n max = Math.min(minLimit + range, maxLimit)\n } else if (max > maxLimit) {\n max = maxLimit\n min = Math.max(maxLimit - range, minLimit)\n }\n\n return { min, max }\n}\n\nexport function updateRange(\n scale: Scale,\n { min, max }: ScaleRange,\n limits?: LimitOptions,\n zoom = false,\n pan = false\n): boolean {\n const state = getState(scale.chart)\n const { options: scaleOpts } = scale\n\n const scaleLimits = getScaleLimits(scale, limits)\n const { minRange = 0 } = scaleLimits\n const minLimit = getLimit(state, scale, scaleLimits, 'min', -Infinity)\n const maxLimit = getLimit(state, scale, scaleLimits, 'max', Infinity)\n\n if (pan && (min < minLimit || max > maxLimit)) {\n // At limit: No change but return true to indicate no need to store the delta.\n return true\n }\n\n const scaleRange = scale.max - scale.min\n const range = zoom ? Math.max(max - min, minRange) : scaleRange\n\n if (zoom && range === minRange && scaleRange <= minRange) {\n // At range limit: No change but return true to indicate no need to store the delta.\n return true\n }\n\n const newRange = fixRange(range, { min, max, minLimit, maxLimit }, state, scale)\n\n scaleOpts.min = newRange.min\n scaleOpts.max = newRange.max\n\n state.updatedScaleLimits[scale.id] = newRange\n\n // return true if the scale range is changed\n return scale.parse(newRange.min) !== scale.min || scale.parse(newRange.max) !== scale.max\n}\n\nfunction zoomNumericalScale(scale: Scale, zoom: number, center: Point, limits: LimitOptions) {\n const delta = linearZoomDelta(scale, zoom, center)\n const newRange = { min: scale.min + delta.min, max: scale.max - delta.max }\n return updateRange(scale, newRange, limits, true)\n}\n\nfunction zoomLogarithmicScale(scale: Scale, zoom: number, center: Point, limits: LimitOptions) {\n const newRange = logarithmicZoomRange(scale, zoom, center)\n return updateRange(scale, newRange, limits, true)\n}\n\nfunction zoomRectNumericalScale(scale: Scale, from: number, to: number, limits: LimitOptions) {\n return updateRange(scale, linearRange(scale, from, to), limits, true)\n}\n\nconst integerChange = (v: number) =>\n v === 0 || isNaN(v) ? 0 : v < 0 ? Math.min(Math.round(v), -1) : Math.max(Math.round(v), 1)\n\nfunction existCategoryFromMaxZoom(scale: Scale) {\n const labels = scale.getLabels()\n const maxIndex = labels.length - 1\n\n if (scale.min > 0) {\n scale.min -= 1\n }\n if (scale.max < maxIndex) {\n scale.max += 1\n }\n}\n\nfunction zoomCategoryScale(scale: Scale, zoom: number, center: Point, limits: LimitOptions) {\n const delta = linearZoomDelta(scale, zoom, center)\n if (scale.min === scale.max && zoom < 1) {\n existCategoryFromMaxZoom(scale)\n }\n const newRange = { min: scale.min + integerChange(delta.min), max: scale.max - integerChange(delta.max) }\n\n return updateRange(scale, newRange, limits, true)\n}\n\nfunction scaleLength(scale: Scale) {\n return scale.isHorizontal() ? scale.width : scale.height\n}\n\nfunction panCategoryScale(scale: Scale, delta: number, limits: LimitOptions) {\n const labels = scale.getLabels()\n const lastLabelIndex = labels.length - 1\n let { min, max } = scale\n // The visible range. Ticks can be skipped, and thus not reliable.\n const range = Math.max(max - min, 1)\n // How many pixels of delta is required before making a step. stepSize, but limited to max 1/10 of the scale length.\n const stepDelta = Math.round(scaleLength(scale) / Math.max(range, 10))\n const stepSize = Math.round(Math.abs(delta / stepDelta))\n let applied\n if (delta < -stepDelta) {\n max = Math.min(max + stepSize, lastLabelIndex)\n min = range === 1 ? max : max - range\n applied = max === lastLabelIndex\n } else if (delta > stepDelta) {\n min = Math.max(0, min - stepSize)\n max = range === 1 ? min : min + range\n applied = min === 0\n }\n\n return updateRange(scale, { min, max }, limits) || Boolean(applied)\n}\n\nconst OFFSETS: Record<TimeUnit, number> = {\n millisecond: 0,\n second: 500, // 500 ms\n minute: 30 * 1000, // 30 s\n hour: 30 * 60 * 1000, // 30 m\n day: 12 * 60 * 60 * 1000, // 12 h\n week: 3.5 * 24 * 60 * 60 * 1000, // 3.5 d\n month: 15 * 24 * 60 * 60 * 1000, // 15 d\n quarter: 60 * 24 * 60 * 60 * 1000, // 60 d\n year: 182 * 24 * 60 * 60 * 1000, // 182 d\n}\n\nfunction panNumericalScale(scale: Scale, delta: number, limits: LimitOptions, canZoom = false) {\n const { min: prevStart, max: prevEnd } = scale\n let offset = 0\n if (isTimeScale(scale)) {\n const round = scale.options.time?.round\n offset = round ? OFFSETS[round] : 0\n }\n const newMin = scale.getValueForPixel(scale.getPixelForValue(prevStart + offset) - delta)\n const newMax = scale.getValueForPixel(scale.getPixelForValue(prevEnd + offset) - delta)\n if (isNotNumber(newMin) || isNotNumber(newMax)) {\n // NaN can happen for 0-dimension scales (either because they were configured\n // with min === max or because the chart has 0 plottable area).\n return true\n }\n return updateRange(scale, { min: newMin, max: newMax }, limits, canZoom, true)\n}\n\nfunction panNonLinearScale(scale: Scale, delta: number, limits: LimitOptions) {\n return panNumericalScale(scale, delta, limits, true)\n}\n\nexport const zoomFunctions: Record<string, ZoomFunction> = {\n category: zoomCategoryScale,\n default: zoomNumericalScale,\n logarithmic: zoomLogarithmicScale,\n}\n\nexport const zoomRectFunctions: Record<string, ZoomRectFunction> = {\n default: zoomRectNumericalScale,\n}\n\nexport const panFunctions: Record<string, PanFunction> = {\n category: panCategoryScale,\n default: panNumericalScale,\n logarithmic: panNonLinearScale,\n timeseries: panNonLinearScale,\n}\n","import { isNumber, sign } from 'chart.js/helpers'\nimport { panFunctions, updateRange, zoomFunctions, zoomRectFunctions } from './scale.types.js'\nimport { getState, type OriginalScaleLimits, type ScaleRange, type State, type UpdatedScaleLimits } from './state.js'\nimport { directionEnabled, getEnabledScalesByPoint } from './utils.js'\nimport type { Chart, Point, Scale, UpdateMode } from 'chart.js'\nimport type { LimitOptions, PanTrigger, ZoomTrigger } from './options.js'\nimport type { ZoomAmount } from './types.js'\n\nfunction shouldUpdateScaleLimits(\n scale: Scale,\n originalScaleLimits: OriginalScaleLimits,\n updatedScaleLimits: UpdatedScaleLimits\n) {\n const {\n id,\n options: { min, max },\n } = scale\n if (!originalScaleLimits[id] || !updatedScaleLimits[id]) {\n return true\n }\n const previous = updatedScaleLimits[id]\n return previous.min !== min || previous.max !== max\n}\n\nfunction removeMissingScales(limits: OriginalScaleLimits | UpdatedScaleLimits, scales: Record<string, Scale>) {\n for (const key of Object.keys(limits)) {\n if (!scales[key]) {\n delete limits[key]\n }\n }\n}\n\nfunction storeOriginalScaleLimits(chart: Chart, state: State) {\n const { scales } = chart\n const { originalScaleLimits, updatedScaleLimits } = state\n\n for (const scale of Object.values(scales)) {\n if (shouldUpdateScaleLimits(scale, originalScaleLimits, updatedScaleLimits)) {\n originalScaleLimits[scale.id] = {\n min: { scale: scale.min, options: scale.options.min },\n max: { scale: scale.max, options: scale.options.max },\n }\n }\n }\n\n removeMissingScales(originalScaleLimits, scales)\n removeMissingScales(updatedScaleLimits, scales)\n return originalScaleLimits\n}\n\nfunction doZoom(scale: Scale, amount: number, center: Point, limits: LimitOptions) {\n const fn = zoomFunctions[scale.type] || zoomFunctions.default\n fn?.(scale, amount, center, limits)\n}\n\nfunction doZoomRect(scale: Scale, from: number, to: number, limits: LimitOptions) {\n const fn = zoomRectFunctions[scale.type] || zoomRectFunctions.default\n fn?.(scale, from, to, limits)\n}\n\nfunction getCenter(chart: Chart) {\n const ca = chart.chartArea\n return {\n x: (ca.left + ca.right) / 2,\n y: (ca.top + ca.bottom) / 2,\n }\n}\n\nexport function zoom(chart: Chart, amount: ZoomAmount, transition: UpdateMode = 'none', trigger: ZoomTrigger = 'api') {\n const { x = 1, y = 1, focalPoint = getCenter(chart) } = typeof amount === 'number' ? { x: amount, y: amount } : amount\n const state = getState(chart)\n const {\n options: { limits = {}, zoom: zoomOptions },\n } = state\n\n storeOriginalScaleLimits(chart, state)\n\n const xEnabled = x !== 1\n const yEnabled = y !== 1\n const enabledScales = getEnabledScalesByPoint(zoomOptions, focalPoint, chart)\n\n for (const scale of enabledScales) {\n if (scale.isHorizontal() && xEnabled) {\n doZoom(scale, x, focalPoint, limits)\n } else if (!scale.isHorizontal() && yEnabled) {\n doZoom(scale, y, focalPoint, limits)\n }\n }\n\n chart.update(transition)\n\n zoomOptions?.onZoom?.({ chart, trigger, amount: { x, y, focalPoint } })\n}\n\nexport function zoomRect(\n chart: Chart,\n p0: Point,\n p1: Point,\n transition: UpdateMode = 'none',\n trigger: ZoomTrigger = 'api'\n) {\n const state = getState(chart)\n const {\n options: { limits = {}, zoom: zoomOptions = {} },\n } = state\n const { mode = 'xy' } = zoomOptions\n\n storeOriginalScaleLimits(chart, state)\n const xEnabled = directionEnabled(mode, 'x', chart)\n const yEnabled = directionEnabled(mode, 'y', chart)\n\n for (const scale of Object.values(chart.scales)) {\n if (scale.isHorizontal() && xEnabled) {\n doZoomRect(scale, p0.x, p1.x, limits)\n } else if (!scale.isHorizontal() && yEnabled) {\n doZoomRect(scale, p0.y, p1.y, limits)\n }\n }\n\n chart.update(transition)\n\n zoomOptions.onZoom?.({ chart, trigger })\n}\n\nexport function zoomScale(\n chart: Chart,\n scaleId: string,\n range: ScaleRange,\n transition: UpdateMode = 'none',\n trigger: ZoomTrigger = 'api'\n) {\n const state = getState(chart)\n storeOriginalScaleLimits(chart, state)\n const scale = chart.scales[scaleId]\n updateRange(scale, range, undefined, true)\n chart.update(transition)\n\n state.options.zoom?.onZoom?.({ chart, trigger })\n}\n\nexport function resetZoom(chart: Chart, transition: UpdateMode = 'default') {\n const state = getState(chart)\n const originalScaleLimits = storeOriginalScaleLimits(chart, state)\n\n for (const scale of Object.values(chart.scales)) {\n const scaleOptions = scale.options\n if (originalScaleLimits[scale.id]) {\n scaleOptions.min = originalScaleLimits[scale.id].min.options\n scaleOptions.max = originalScaleLimits[scale.id].max.options\n } else {\n delete scaleOptions.min\n delete scaleOptions.max\n }\n delete state.updatedScaleLimits[scale.id]\n }\n chart.update(transition)\n\n state.options.zoom?.onZoomComplete?.({ chart })\n}\n\nfunction getOriginalRange(state: State, scaleId: string): number | undefined {\n const original = state.originalScaleLimits[scaleId]\n if (!original) {\n return undefined\n }\n const { min, max } = original\n if (isNumber(max.options) && isNumber(min.options)) {\n return max.options - min.options\n }\n if (isNumber(max.scale) && isNumber(min.scale)) {\n return max.scale - min.scale\n }\n return undefined\n}\n\nexport function getZoomLevel(chart: Chart) {\n const state = getState(chart)\n let min = 1\n let max = 1\n for (const scale of Object.values(chart.scales)) {\n const origRange = getOriginalRange(state, scale.id)\n if (origRange) {\n const level = Math.round((origRange / (scale.max - scale.min)) * 100) / 100\n min = Math.min(min, level)\n max = Math.max(max, level)\n }\n }\n return min < 1 ? min : max\n}\n\nfunction panScale(scale: Scale, delta: number, limits: LimitOptions, state: State) {\n const { panDelta } = state\n // Add possible cumulative delta from previous pan attempts where scale did not change\n const storedDelta = panDelta[scale.id] || 0\n if (sign(storedDelta) === sign(delta)) {\n delta += storedDelta\n }\n const fn = panFunctions[scale.type] || panFunctions.default\n if (fn?.(scale, delta, limits)) {\n // The scale changed, reset cumulative delta\n panDelta[scale.id] = 0\n } else {\n // The scale did not change, store cumulative delta\n panDelta[scale.id] = delta\n }\n}\n\ntype PanAmount = number | Partial<Point>\n\nexport function pan(\n chart: Chart,\n delta: PanAmount,\n enabledScales?: Scale[],\n transition: UpdateMode = 'none',\n trigger: PanTrigger = 'other'\n) {\n const { x = 0, y = 0 } = typeof delta === 'number' ? { x: delta, y: delta } : delta\n const state = getState(chart)\n const {\n options: { pan: panOptions, limits = {} },\n } = state\n const { onPan } = panOptions || {}\n\n storeOriginalScaleLimits(chart, state)\n\n const xEnabled = x !== 0\n const yEnabled = y !== 0\n\n const scales = enabledScales || Object.values(chart.scales)\n\n for (const scale of scales) {\n if (scale.isHorizontal() && xEnabled) {\n panScale(scale, x, limits, state)\n } else if (!scale.isHorizontal() && yEnabled) {\n panScale(scale, y, limits, state)\n }\n }\n\n chart.update(transition)\n\n onPan?.({ chart, trigger, delta: { x, y } })\n}\n\nexport function getInitialScaleBounds(chart: Chart) {\n const state = getState(chart)\n storeOriginalScaleLimits(chart, state)\n const scaleBounds: Record<string, { min?: number; max?: number }> = {}\n for (const scaleId of Object.keys(chart.scales)) {\n const { min, max } = state.originalScaleLimits[scaleId] || { min: {}, max: {} }\n scaleBounds[scaleId] = { min: min.scale, max: max.scale }\n }\n\n return scaleBounds\n}\n\nexport function getZoomedScaleBounds(chart: Chart) {\n const state = getState(chart)\n const scaleBounds: Record<string, { min?: number; max?: number }> = {}\n for (const scaleId of Object.keys(chart.scales)) {\n scaleBounds[scaleId] = state.updatedScaleLimits[scaleId]\n }\n\n return scaleBounds\n}\n\nexport function isZoomedOrPanned(chart: Chart) {\n const scaleBounds = getInitialScaleBounds(chart)\n for (const scaleId of Object.keys(chart.scales)) {\n const { min: originalMin, max: originalMax } = scaleBounds[scaleId]\n\n if (originalMin !== undefined && chart.scales[scaleId].min !== originalMin) {\n return true\n }\n\n if (originalMax !== undefined && chart.scales[scaleId].max !== originalMax) {\n return true\n }\n }\n\n return false\n}\n\nexport function isZoomingOrPanningState(state: State) {\n return state.panning || state.dragging\n}\n\nexport function isZoomingOrPanning(chart: Chart) {\n const state = getState(chart)\n // From the perspective of outside callers, zooming and panning are still\n // active if we haven't yet cleared the next click.\n return !!(isZoomingOrPanningState(state) || state.filterNextClick)\n}\n","import { directionEnabled, debounce, keyNotPressed, getModifierKey, keyPressed } from './utils'\nimport { zoom, zoomRect } from './core'\nimport { getRelativePosition, _isPointInArea } from 'chart.js/helpers'\nimport { getState, type HandlerFunctions, type HandlerName } from './state'\nimport type { Chart, ChartArea, Point } from 'chart.js'\nimport type { ModeOption, ZoomOptions, ZoomPluginOptions } from './options'\n\nconst clamp = (x: number, from: number, to: number): number => Math.min(to, Math.max(from, x))\n\nfunction removeHandler(chart: Chart, type: HandlerName) {\n const { handlers, targets } = getState(chart)\n const handler = handlers[type]\n const target = targets[type]\n if (handler && target) {\n target.removeEventListener(type, handler)\n delete handlers[type]\n }\n}\n\ntype EventHandler<T extends Event> = (chart: Chart, event: T, options: ZoomPluginOptions) => void\n\nfunction addHandler<T extends Event>(\n chart: Chart,\n target: HTMLCanvasElement | Document,\n type: HandlerName,\n handler: EventHandler<T>\n) {\n const { handlers, options, targets } = getState(chart)\n const oldHandler = handlers[type]\n if (oldHandler && targets[type] === target) {\n // already attached\n return\n }\n removeHandler(chart, type)\n const listener = (handlers[type] = (event) => handler(chart, event as T, options))\n targets[type] = target\n\n // `passive: false` for wheel events, to prevent chrome warnings. Use default value for other events.\n const passive = type === 'wheel' ? false : undefined\n target.addEventListener(type, listener, { passive })\n}\n\nexport function mouseMove(chart: Chart, event: MouseEvent) {\n const state = getState(chart)\n if (state.dragStart) {\n state.dragging = true\n state.dragEnd = event\n chart.draw()\n }\n}\n\nfunction keyDown(chart: Chart, event: KeyboardEvent) {\n const state = getState(chart)\n if (!state.dragStart || event.key !== 'Escape') {\n return\n }\n\n removeHandler(chart, 'keydown')\n state.dragging = false\n state.dragStart = state.dragEnd = undefined\n chart.draw()\n}\n\nfunction getPointPosition(event: MouseEvent, chart: Chart) {\n if (event.target !== chart.canvas) {\n const canvasArea = chart.canvas.getBoundingClientRect()\n return {\n x: event.clientX - canvasArea.left,\n y: event.clientY - canvasArea.top,\n }\n }\n return getRelativePosition(event, chart as any) // TODO: would expect Chart type to be valid for getRelativePosition\n}\n\nfunction zoomStart(chart: Chart, event: MouseEvent, zoomOptions: ZoomOptions): boolean | void {\n const { onZoomStart, onZoomRejected } = zoomOptions\n if (onZoomStart) {\n const point = getPointPosition(event, chart)\n if (onZoomStart?.({ chart, event, point }) === false) {\n onZoomRejected?.({ chart, event })\n return false\n }\n }\n}\n\nexport function mouseDown(chart: Chart, event: MouseEvent): void {\n if (chart.legend) {\n const point = getRelativePosition(event, chart as any) // TODO: would expect Chart type to be valid for getRelativePosition\n if (_isPointInArea(point, chart.legend)) {\n return\n }\n }\n const state = getState(chart)\n const { pan: panOptions, zoom: zoomOptions = {} } = state.options\n if (\n event.button !== 0 ||\n keyPressed(getModifierKey(panOptions), event) ||\n keyNotPressed(getModifierKey(zoomOptions.drag), event)\n ) {\n return zoomOptions.onZoomRejected?.({ chart, event })\n }\n\n if (zoomStart(chart, event, zoomOptions) === false) {\n return\n }\n state.dragStart = event\n\n addHandler(chart, chart.canvas.ownerDocument, 'mousemove', mouseMove)\n addHandler(chart, window.document, 'keydown', keyDown)\n}\n\nfunction applyAspectRatio(\n { begin, end }: { begin: { x: number; y: number }; end: { x: number; y: number } },\n aspectRatio: number\n) {\n let width = end.x - begin.x\n let height = end.y - begin.y\n const ratio = Math.abs(width / height)\n\n if (ratio > aspectRatio) {\n width = Math.sign(width) * Math.abs(height * aspectRatio)\n } else if (ratio < aspectRatio) {\n height = Math.sign(height) * Math.abs(width / aspectRatio)\n }\n\n end.x = begin.x + width\n end.y = begin.y + height\n}\n\ntype Rect = { top?: number; left?: number; right?: number; bottom?: number }\nfunction applyMinMaxProps(\n rect: Rect,\n chartArea: ChartArea,\n points: { begin: Point; end: Point },\n { min, max, prop }: { min: keyof Rect; max: keyof Rect; prop: 'x' | 'y' }\n) {\n rect[min] = clamp(Math.min(points.begin[prop], points.end[prop]), chartArea[min], chartArea[max])\n rect[max] = clamp(Math.max(points.begin[prop], points.end[prop]), chartArea[min], chartArea[max])\n}\n\nfunction getRelativePoints(\n chart: Chart,\n pointEvents: { dragStart: MouseEvent; dragEnd: MouseEvent },\n maintainAspectRatio?: boolean\n) {\n const points = {\n begin: getPointPosition(pointEvents.dragStart, chart),\n end: getPointPosition(pointEvents.dragEnd, chart),\n }\n\n if (maintainAspectRatio) {\n const aspectRatio = chart.chartArea.width / chart.chartArea.height\n applyAspectRatio(points, aspectRatio)\n }\n\n return points\n}\n\nexport function computeDragRect(\n chart: Chart,\n mode: ModeOption | undefined,\n pointEvents: { dragStart: MouseEvent; dragEnd: MouseEvent },\n maintainAspectRatio: boolean | undefined\n) {\n const xEnabled = directionEnabled(mode, 'x', chart)\n const yEnabled = directionEnabled(mode, 'y', chart)\n const { top, left, right, bottom, width: chartWidth, height: chartHeight } = chart.chartArea\n const rect = { top, left, right, bottom }\n\n const points = getRelativePoints(chart, pointEvents, maintainAspectRatio && xEnabled && yEnabled)\n\n if (xEnabled) {\n applyMinMaxProps(rect, chart.chartArea, points, { min: 'left', max: 'right', prop: 'x' })\n }\n\n if (yEnabled) {\n applyMinMaxProps(rect, chart.chartArea, points, { min: 'top', max: 'bottom', prop: 'y' })\n }\n\n const width = rect.right - rect.left\n const height = rect.bottom - rect.top\n\n return {\n ...rect,\n width,\n height,\n zoomX: xEnabled && width ? 1 + (chartWidth - width) / chartWidth : 1,\n zoomY: yEnabled && height ? 1 + (chartHeight - height) / chartHeight : 1,\n }\n}\n\nexport function mouseUp(chart: Chart, event: MouseEvent) {\n const state = getState(chart)\n if (!state.dragStart) {\n return\n }\n\n removeHandler(chart, 'mousemove')\n const { mode, onZoomComplete, drag } = state.options.zoom ?? {}\n const { threshold = 0, maintainAspectRatio } = drag ?? {}\n const rect = computeDragRect(chart, mode, { dragStart: state.dragStart, dragEnd: event }, maintainAspectRatio)\n const distanceX = directionEnabled(mode, 'x', chart) ? rect.width : 0\n const distanceY = directionEnabled(mode, 'y', chart) ? rect.height : 0\n const distance = Math.sqrt(distanceX * distanceX + distanceY * distanceY)\n\n // Remove drag start and end before chart render to stop drawing selected area\n state.dragStart = state.dragEnd = undefined\n\n if (distance <= threshold) {\n state.dragging = false\n chart.draw()\n return\n }\n\n zoomRect(chart, { x: rect.left, y: rect.top }, { x: rect.right, y: rect.bottom }, 'zoom', 'drag')\n\n state.dragging = false\n state.filterNextClick = true\n onZoomComplete?.({ chart })\n}\n\nfunction wheelPreconditions(chart: Chart, event: WheelEvent, zoomOptions: ZoomOptions): true | void {\n // Before preventDefault, check if the modifier key required and pressed\n if (keyNotPressed(getModifierKey(zoomOptions.wheel), event)) {\n zoomOptions.onZoomRejected?.({ chart, event })\n return\n }\n\n if (zoomStart(chart, event, zoomOptions) === false) {\n return\n }\n\n // Prevent the event from triggering the default behavior (e.g. content scrolling).\n if (event.cancelable) {\n event.preventDefault()\n }\n\n // Firefox always fires the wheel event twice:\n // First without the delta and right after that once with the delta properties.\n if (event.deltaY === undefined) {\n return\n }\n return true\n}\n\nexport function wheel(chart: Chart, event: WheelEvent & { target?: HTMLCanvasElement }) {\n const {\n handlers: { onZoomComplete },\n options: { zoom: zoomOptions = {} },\n } = getState(chart)\n\n if (!wheelPreconditions(chart, event, zoomOptions)) {\n return\n }\n\n const rect = event.target?.getBoundingClientRect()\n const speed = zoomOptions?.wheel?.speed ?? 0.1\n const percentage = event.deltaY >= 0 ? 2 - 1 / (1 - speed) : 1 + speed\n const amount = {\n x: percentage,\n y: percentage,\n focalPoint: {\n x: event.clientX - rect.left,\n y: event.clientY - rect.top,\n },\n }\n\n zoom(chart, amount, 'zoom', 'wheel')\n\n onZoomComplete?.(event)\n}\n\nfunction addDebouncedHandler(\n chart: Chart,\n name: HandlerName,\n handler: HandlerFunctions['onZoomComplete'] | undefined,\n delay: number\n) {\n if (handler) {\n getState(chart).handlers[name] = debounce(() => handler?.({ chart }), delay)\n }\n}\n\nexport function addListeners(chart: Chart, options: ZoomPluginOptions) {\n const canvas = chart.canvas\n const { wheel: wheelOptions, drag: dragOptions, onZoomComplete } = options.zoom ?? {}\n\n // Install listeners. Do this dynamically based on options so that we can turn zoom on and off\n // We also want to make sure listeners aren't always on. E.g. if you're scrolling down a page\n // and the mouse goes over a chart you don't want it intercepted unless the plugin is enabled\n if (wheelOptions?.enabled) {\n addHandler(chart, canvas, 'wheel', wheel)\n addDebouncedHandler(chart, 'onZoomComplete', onZoomComplete, 250)\n } else {\n removeHandler(chart, 'wheel')\n }\n if (dragOptions?.enabled) {\n addHandler(chart, canvas, 'mousedown', mouseDown)\n addHandler(chart, canvas.ownerDocument, 'mouseup', mouseUp)\n } else {\n removeHandler(chart, 'mousedown')\n removeHandler(chart, 'mousemove')\n removeHandler(chart, 'mouseup')\n removeHandler(chart, 'keydown')\n }\n}\n\nexport function removeListeners(chart: Chart) {\n removeHandler(chart, 'mousedown')\n removeHandler(chart, 'mousemove')\n removeHandler(chart, 'mouseup')\n removeHandler(chart, 'wheel')\n removeHandler(chart, 'click')\n removeHandler(chart, 'keydown')\n}\n","import { getRelativePosition } from 'chart.js/helpers'\nimport Hammer from 'hammerjs'\nimport { pan, zoom } from './core'\nimport { getState, type State } from './state'\nimport { directionEnabled, getEnabledScalesByPoint, getModifierKey, keyNotPressed, keyPressed } from './utils'\nimport type { Chart } from 'chart.js'\nimport type { ZoomPluginOptions } from './options'\n\nfunction createEnabler(chart: Chart, state: State) {\n return function (_recognizer: any, event: HammerInput) {\n const { pan: panOptions, zoom: zoomOptions = {} } = state.options\n if (!panOptions || !panOptions.enabled) {\n return false\n }\n const srcEvent = event && event.srcEvent\n if (!srcEvent) {\n // Sometimes Hammer queries this with a null event.\n return true\n }\n if (\n !state.panning &&\n event.pointerType === 'mouse' &&\n (keyNotPressed(getModifierKey(panOptions), srcEvent) || keyPressed(getModifierKey(zoomOptions.drag), srcEvent))\n ) {\n panOptions.onPanRejected?.({ chart, event })\n return false\n }\n return true\n }\n}\n\nfunction pinchAxes(p0: { clientX: number; clientY: number }, p1: { clientX: number; clientY: number }) {\n // fingers position difference\n const pinchX = Math.abs(p0.clientX - p1.clientX)\n const pinchY = Math.abs(p0.clientY - p1.clientY)\n\n // diagonal fingers will change both (xy) axes\n const p = pinchX / pinchY\n let x, y\n if (p > 0.3 && p < 1.7) {\n x = y = true\n } else if (pinchX > pinchY) {\n x = true\n } else {\n y = true\n }\n return { x, y }\n}\n\nfunction handlePinch(chart: Chart, state: State, e: HammerInput) {\n if (state.scale) {\n const { center, pointers } = e\n // Hammer reports the total scaling. We need the incremental amount\n const zoomPercent = (1 / state.scale) * e.scale\n const rect = e.target.getBoundingClientRect()\n const pinch = pinchAxes(pointers[0], pointers[1])\n const mode = state.options.zoom?.mode\n const amount = {\n x: pinch.x && directionEnabled(mode, 'x', chart) ? zoomPercent : 1,\n y: pinch.y && directionEnabled(mode, 'y', chart) ? zoomPercent : 1,\n focalPoint: {\n x: center.x - rect.left,\n y: center.y - rect.top,\n },\n }\n\n zoom(chart, amount, 'zoom', 'pinch')\n\n // Keep track of overall scale\n state.scale = e.scale\n }\n}\n\nfunction startPinch(chart: Chart, state: State, e: HammerInput) {\n if (state.options.zoom?.pinch?.enabled) {\n const point = getRelativePosition(e.srcEvent, chart as any) // TODO: would expect Chart type to be valid for getRelativePosition\n if (state.options.zoom?.onZoomStart?.({ chart, event: e.srcEvent, point }) === false) {\n state.scale = null\n state.options.zoom?.onZoomRejected?.({ chart, event: e.srcEvent })\n } else {\n state.scale = 1\n }\n }\n}\n\nfunction endPinch(chart: Chart, state: State, e: HammerInput) {\n if (state.scale) {\n handlePinch(chart, state, e)\n state.scale = null // reset\n state.options.zoom?.onZoomComplete?.({ chart })\n }\n}\n\nfunction handlePan(chart: Chart, state: State, e: HammerInput) {\n const delta = state.delta\n if (delta) {\n state.panning = true\n pan(\n chart,\n { x: e.deltaX - delta.x, y: e.deltaY - delta.y },\n state.panScales && state.panScales.map((i) => chart.scales[i]).filter(Boolean)\n )\n state.delta = { x: e.deltaX, y: e.deltaY }\n }\n}\n\nfunction startPan(chart: Chart, state: State, event: HammerInput) {\n const { enabled, onPanStart, onPanRejected } = state.options.pan ?? {}\n if (!enabled) {\n return\n }\n const rect = event.target.getBoundingClientRect()\n const point = {\n x: event.center.x - rect.left,\n y: event.center.y - rect.top,\n }\n\n if (onPanStart?.({ chart, event, point }) === false) {\n return onPanRejected?.({ chart, event })\n }\n\n state.panScales = getEnabledScalesByPoint(state.options.pan, point, chart).map((i) => i.id)\n state.delta = { x: 0, y: 0 }\n handlePan(chart, state, event)\n}\n\nfunction endPan(chart: Chart, state: State) {\n state.delta = null\n if (state.panning) {\n state.panning = false\n state.filterNextClick = true\n state.options.pan?.onPanComplete?.({ chart })\n }\n}\n\nconst hammers = new WeakMap()\nexport function startHammer(chart: Chart, options: ZoomPluginOptions) {\n const state = getState(chart)\n const canvas = chart.canvas\n const { pan: panOptions, zoom: zoomOptions } = options\n\n const mc = new Hammer.Manager(canvas)\n if (zoomOptions?.pinch?.enabled) {\n mc.add(new Hammer.Pinch())\n mc.on('pinchstart', (e) => startPinch(chart, state, e))\n mc.on('pinch', (e) => handlePinch(chart, state, e))\n mc.on('pinchend', (e) => endPinch(chart, state, e))\n }\n\n if (panOptions && panOptions.enabled) {\n mc.add(\n new Hammer.Pan({\n threshold: panOptions.threshold,\n enable: createEnabler(chart, state),\n })\n )\n mc.on('panstart', (e) => startPan(chart, state, e))\n mc.on('panmove', (e) => handlePan(chart, state, e))\n mc.on('panend', () => endPan(chart, state))\n }\n\n hammers.set(chart, mc)\n}\n\nexport function stopHammer(chart: Chart) {\n const mc = hammers.get(chart)\n if (mc) {\n mc.remove('pinchstart')\n mc.remove('pinch')\n mc.remove('pinchend')\n mc.remove('panstart')\n mc.remove('pan')\n mc.remove('panend')\n mc.destroy()\n hammers.delete(chart)\n }\n}\n\nexport function hammerOptionsChanged(oldOptions: ZoomPluginOptions, newOptions: ZoomPluginOptions) {\n const { pan: oldPan, zoom: oldZoom } = oldOptions\n const { pan: newPan, zoom: newZoom } = newOptions\n\n if (oldZoom?.pinch?.enabled !== newZoom?.pinch?.enabled) {\n return true\n }\n if (oldPan?.enabled !== newPan?.enabled) {\n return true\n }\n if (oldPan?.threshold !== newPan?.threshold) {\n return true\n }\n\n return false\n}\n","import Hammer from 'hammerjs'\nimport { addListeners, computeDragRect, removeListeners } from './handlers'\nimport { hammerOptionsChanged, startHammer, stopHammer } from './hammer'\nimport {\n pan,\n zoom,\n resetZoom,\n zoomScale,\n getZoomLevel,\n getInitialScaleBounds,\n getZoomedScaleBounds,\n isZoomedOrPanned,\n isZoomingOrPanning,\n isZoomingOrPanningState,\n zoomRect,\n} from './core'\nimport { panFunctions, zoomFunctions, zoomRectFunctions } from './scale.types'\nimport { getState, removeState } from './state'\nimport { version } from '../package.json'\nimport type { Chart, ChartEvent } from 'chart.js'\nimport type { ZoomPluginOptions } from './options'\nimport { defaults } from './defaults'\n\nfunction draw(chart: Chart, caller: string, options: ZoomPluginOptions) {\n const dragOptions = options.zoom?.drag\n const { dragStart, dragEnd } = getState(chart)\n\n if (dragOptions?.drawTime !== caller || !dragStart || !dragEnd) {\n return\n }\n const { left, top, width, height } = computeDragRect(\n chart,\n options.zoom?.mode,\n { dragStart, dragEnd },\n dragOptions.maintainAspectRatio\n )\n const ctx = chart.ctx\n\n ctx.save()\n ctx.beginPath()\n ctx.fillStyle = dragOptions.backgroundColor || 'rgba(225,225,225,0.3)'\n ctx.fillRect(left, top, width, height)\n\n if (dragOptions.borderWidth) {\n ctx.lineWidth = dragOptions.borderWidth\n ctx.strokeStyle = dragOptions.borderColor || 'rgba(225,225,225)'\n ctx.strokeRect(left, top, width, height)\n }\n ctx.restore()\n}\n\nconst bindApi = (chart: Chart) => {\n chart.pan = (delta, panScales, transition) => pan(chart, delta, panScales, transition, 'api')\n chart.zoom = (args, transition) => zoom(chart, args, transition)\n chart.zoomRect = (p0, p1, transition) => zoomRect(chart, p0, p1, transition)\n chart.zoomScale = (id, range, transition) => zoomScale(chart, id, range, transition)\n chart.resetZoom = (transition) => resetZoom(chart, transition)\n chart.getZoomLevel = () => getZoomLevel(chart)\n chart.getInitialScaleBounds = () => getInitialScaleBounds(chart)\n chart.getZoomedScaleBounds = () => getZoomedScaleBounds(chart)\n chart.isZoomedOrPanned = () => isZoomedOrPanned(chart)\n chart.isZoomingOrPanning = () => isZoomingOrPanning(chart)\n}\n\nexport default {\n id: 'zoom',\n\n version,\n\n defaults,\n\n start(chart: Chart, _args: unknown, options: ZoomPluginOptions) {\n const state = getState(chart)\n state.options = options\n\n if (Object.prototype.hasOwnProperty.call(options.zoom, 'enabled')) {\n console.warn(\n 'The option `zoom.enabled` is no longer supported. Please use `zoom.wheel.enabled`, `zoom.drag.enabled`, or `zoom.pinch.enabled`.'\n )\n }\n if (\n Object.prototype.hasOwnProperty.call(options.zoom, 'overScaleMode') ||\n Object.prototype.hasOwnProperty.call(options.pan, 'overScaleMode')\n ) {\n console.warn(\n 'The option `overScaleMode` is deprecated. Please use `scaleMode` instead (and update `mode` as desired).'\n )\n }\n\n if (Hammer) {\n startHammer(chart, options)\n }\n\n bindApi(chart)\n },\n\n beforeEvent(\n chart: Chart,\n { event }: { event: ChartEvent; replay: boolean; cancelable: true; inChartArea: boolean }\n ): boolean | void {\n const state = getState(chart)\n if (isZoomingOrPanningState(state)) {\n // cancel any event handling while panning or dragging\n return false\n }\n // cancel the next click or mouseup after drag or pan\n if (event.type === 'click' || event.type === 'mouseup') {\n if (state.filterNextClick) {\n state.filterNextClick = false\n return false\n }\n }\n },\n\n beforeUpdate(chart: Chart, _args: unknown, options: ZoomPluginOptions) {\n const state = getState(chart)\n const previousOptions = state.options\n state.options = options\n\n // Hammer needs to be restarted when certain options change.\n if (hammerOptionsChanged(previousOptions, options)) {\n stopHammer(chart)\n startHammer(chart, options)\n }\n\n addListeners(chart, options)\n },\n\n beforeDatasetsDraw(chart: Chart, _args: unknown, options: ZoomPluginOptions) {\n draw(chart, 'beforeDatasetsDraw', options)\n },\n\n afterDatasetsDraw(chart: Chart, _args: unknown, options: ZoomPluginOptions) {\n draw(chart, 'afterDatasetsDraw', options)\n },\n\n beforeDraw(chart: Chart, _args: unknown, options: ZoomPluginOptions) {\n draw(chart, 'beforeDraw', options)\n },\n\n afterDraw(chart: Chart, _args: unknown, options: ZoomPluginOptions) {\n draw(chart, 'afterDraw', options)\n },\n\n stop(chart: Chart) {\n removeListeners(chart)\n\n if (Hammer) {\n stopHammer(chart)\n }\n removeState(chart)\n },\n\n panFunctions,\n zoomFunctions,\n zoomRectFunctions,\n}\n","import type { ZoomPluginOptions } from './options'\n\nexport const defaults: ZoomPluginOptions = {\n pan: {\n enabled: false,\n mode: 'xy',\n threshold: 10,\n modifierKey: null,\n },\n zoom: {\n wheel: {\n enabled: false,\n speed: 0.1,\n modifierKey: null,\n },\n drag: {\n enabled: false,\n drawTime: 'beforeDatasetsDraw',\n modifierKey: null,\n },\n pinch: {\n enabled: false,\n },\n mode: 'xy',\n },\n}\n","import { Chart } from 'chart.js'\nimport Zoom from './plugin'\n\nChart.register(Zoom)\n\nexport default Zoom\n"],"names":["eventKey","key","getModifierKey","opts","enabled","modifierKey","undefined","keyPressed","event","keyNotPressed","directionEnabled","mode","dir","chart","indexOf","directionsEnabled","x","y","getEnabledScalesByPoint","options","point","scaleMode","overScaleMode","scale","scales","scaleIds","Object","keys","i","length","top","bottom","left","right","getScaleUnderPoint","scaleEnabled","overScaleEnabled","axis","convertOverScaleMode","enabledScales","scaleItem","values","push","getEnabledScales","chartStates","WeakMap","getState","state","get","originalScaleLimits","updatedScaleLimits","handlers","targets","panDelta","dragging","panning","set","isNotNumber","value","isNaN","zoomDelta","val","min","range","newRange","minPercent","isNumber","Math","max","getValueAtPoint","pixel","isHorizontal","getValueForPixel","linearZoomDelta","zoom","center","getLimit","scaleLimits","prop","fallback","limit","original","id","isNullOrUndef","parsed","parse","valueOrDefault","updateRange","limits","pan","scaleOpts","getScaleLimits","minRange","minLimit","Infinity","maxLimit","scaleRange","offset","origLimits","origMin","origMax","epsilon","almostEquals","fixRange","integerChange","v","round","OFFSETS","millisecond","second","minute","hour","day","week","month","quarter","year","panNumericalScale","delta","canZoom","prevStart","prevEnd","type","isTimeScale","time","newMin","getPixelForValue","newMax","panNonLinearScale","zoomFunctions","category","maxIndex","getLabels","existCategoryFromMaxZoom","default","logarithmic","centerValue","logMin","log10","logMax","logRange","pow","logarithmicZoomRange","zoomRectFunctions","from","to","pixel0","pixel1","v0","v1","linearRange","panFunctions","lastLabelIndex","stepDelta","width","height","scaleLength","stepSize","abs","applied","Boolean","timeseries","shouldUpdateScaleLimits","previous","removeMissingScales","storeOriginalScaleLimits","doZoom","amount","fn","doZoomRect","getCenter","ca","chartArea","transition","trigger","focalPoint","zoomOptions","xEnabled","yEnabled","update","onZoom","zoomRect","p0","p1","getOriginalRange","scaleId","panScale","storedDelta","sign","panOptions","onPan","getInitialScaleBounds","scaleBounds","isZoomingOrPanningState","clamp","removeHandler","handler","target","removeEventListener","addHandler","listener","passive","addEventListener","mouseMove","dragStart","dragEnd","draw","keyDown","getPointPosition","canvas","canvasArea","getBoundingClientRect","clientX","clientY","getRelativePosition","zoomStart","onZoomStart","onZoomRejected","mouseDown","legend","_isPointInArea","button","drag","ownerDocument","window","document","applyMinMaxProps","rect","points","begin","end","getRelativePoints","pointEvents","maintainAspectRatio","aspectRatio","ratio","applyAspectRatio","computeDragRect","chartWidth","chartHeight","zoomX","zoomY","mouseUp","onZoomComplete","threshold","distanceX","distanceY","distance","sqrt","filterNextClick","wheel","cancelable","preventDefault","deltaY","wheelPreconditions","speed","percentage","addDebouncedHandler","name","delay","timeout","clearTimeout","setTimeout","debounce","createEnabler","_recognizer","srcEvent","pointerType","onPanRejected","handlePinch","e","pointers","zoomPercent","pinch","pinchX","pinchY","p","pinchAxes","handlePan","deltaX","panScales","map","filter","hammers","startHammer","mc","Hammer","Manager","add","Pinch","on","startPinch","endPinch","Pan","enable","onPanStart","startPan","onPanComplete","endPan","stopHammer","remove","destroy","delete","caller","dragOptions","drawTime","ctx","save","beginPath","fillStyle","backgroundColor","fillRect","borderWidth","lineWidth","strokeStyle","borderColor","strokeRect","restore","bindApi","args","zoomScale","resetZoom","scaleOptions","getZoomLevel","origRange","level","getZoomedScaleBounds","isZoomedOrPanned","originalMin","originalMax","isZoomingOrPanning","Zoom","version","defaults","start","_args","prototype","hasOwnProperty","call","console","warn","beforeEvent","beforeUpdate","previousOptions","oldOptions","newOptions","oldPan","oldZoom","newPan","newZoom","hammerOptionsChanged","wheelOptions","addListeners","beforeDatasetsDraw","afterDatasetsDraw","beforeDraw","afterDraw","stop","removeListeners","removeState","Chart","register"],"mappings":"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"}
1
+ {"version":3,"file":"chartjs-plugin-zoom.min.js","sources":["../../src/utils.ts","../../src/state.ts","../../src/scale.types.ts","../../src/core.ts","../../src/handlers.ts","../../src/hammer.ts","../../src/plugin.ts","../../src/defaults.ts","../../src/index.umd.ts"],"sourcesContent":["import type { Chart, Point, Scale } from 'chart.js'\nimport type { DragOptions, ModeOption, ModifierKey, PanOptions } from './options'\n\nconst eventKey = (key: ModifierKey): 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey' => `${key}Key`\n\nexport const getModifierKey = (opts?: DragOptions | PanOptions): ModifierKey | undefined =>\n opts?.enabled && opts.modifierKey ? opts.modifierKey : undefined\nexport const keyPressed = (key: ModifierKey | undefined, event: TouchEvent | MouseEvent | PointerEvent) =>\n key && event[eventKey(key)]\nexport const keyNotPressed = (key: ModifierKey | undefined, event: TouchEvent | MouseEvent | PointerEvent) =>\n key && !event[eventKey(key)]\n\nexport function directionEnabled(mode: ModeOption | undefined, dir: 'x' | 'y', chart: Chart): boolean {\n if (mode === undefined) {\n return true\n } else if (typeof mode === 'string') {\n return mode.indexOf(dir) !== -1\n } else if (typeof mode === 'function') {\n return mode({ chart }).indexOf(dir) !== -1\n }\n\n return false\n}\n\nfunction directionsEnabled(mode: ModeOption | undefined, chart: Chart) {\n if (typeof mode === 'function') {\n mode = mode({ chart })\n }\n if (typeof mode === 'string') {\n return { x: mode.indexOf('x') !== -1, y: mode.indexOf('y') !== -1 }\n }\n\n return { x: false, y: false }\n}\n\nexport function debounce(fn: () => void, delay: number | undefined) {\n let timeout: number | NodeJS.Timeout\n return function () {\n clearTimeout(timeout)\n timeout = setTimeout(fn, delay)\n return delay\n }\n}\n\nfunction getScaleUnderPoint({ x, y }: Point, chart: Chart): Scale | null {\n const scales = chart.scales\n const scaleIds = Object.keys(scales)\n for (let i = 0; i < scaleIds.length; i++) {\n const scale = scales[scaleIds[i]]\n if (y >= scale.top && y <= scale.bottom && x >= scale.left && x <= scale.right) {\n return scale\n }\n }\n return null\n}\n\ntype EnabledDirections = { x: boolean; y: boolean }\n\nconst convertOverScaleMode = (\n chart: Chart,\n overScaleMode: ModeOption | undefined,\n scaleEnabled: EnabledDirections,\n enabled: EnabledDirections\n) => {\n if (!overScaleMode) {\n return\n }\n\n const overScaleEnabled = directionsEnabled(overScaleMode, chart)\n for (const axis of ['x', 'y'] as const) {\n if (overScaleEnabled[axis]) {\n scaleEnabled[axis] = enabled[axis]\n enabled[axis] = false\n }\n }\n}\n\nconst getEnabledScales = (chart: Chart, enabled: EnabledDirections): Scale[] => {\n const enabledScales: Scale[] = []\n\n for (const scaleItem of Object.values(chart.scales)) {\n if (enabled[scaleItem.axis as 'x' | 'y']) {\n enabledScales.push(scaleItem)\n }\n }\n\n return enabledScales || Object.values(chart.scales)\n}\n\n/**\n * Evaluate the chart's mode, scaleMode, and overScaleMode properties to\n * determine which axes are eligible for scaling.\n * options.overScaleMode can be a function if user want zoom only one scale of many for example.\n */\nexport function getEnabledScalesByPoint(options: PanOptions | undefined, point: Point, chart: Chart): Scale[] {\n const { mode = 'xy', scaleMode, overScaleMode } = options || {}\n const scale = getScaleUnderPoint(point, chart)\n\n const enabled = directionsEnabled(mode, chart)\n const scaleEnabled = directionsEnabled(scaleMode, chart)\n\n // Convert deprecated overScaleEnabled to new scaleEnabled.\n convertOverScaleMode(chart, overScaleMode, scaleEnabled, enabled)\n\n if (scale && scaleEnabled[scale.axis as 'x' | 'y']) {\n return [scale]\n }\n\n return getEnabledScales(chart, enabled)\n}\n","import { Chart, type Point } from 'chart.js'\nimport type { ZoomPluginOptions } from './options'\n\nexport type ScaleRange = { min: number; max: number }\nexport type OriginalLimits = { min: { scale?: number; options?: unknown }; max: { scale?: number; options?: unknown } }\nexport type OriginalScaleLimits = Record<string, OriginalLimits>\nexport type UpdatedScaleLimits = Record<string, ScaleRange>\n\nexport type HandlerFunctions = {\n click: (chart: Chart, event: MouseEvent, options: ZoomPluginOptions) => void\n keydown: (chart: Chart, event: KeyboardEvent) => void\n mousedown: (chart: Chart, event: MouseEvent, options: ZoomPluginOptions) => void\n mousemove: (chart: Chart, event: MouseEvent, options: ZoomPluginOptions) => void\n mouseup: (chart: Chart, event: MouseEvent, options: ZoomPluginOptions) => void\n onZoomComplete: ({ chart }: { chart: Chart }) => void\n wheel: (chart: Chart, event: WheelEvent) => void\n}\nexport type HandlerName = keyof HandlerFunctions\nexport type HandlerFunction = HandlerFunctions[HandlerName]\nexport type Handler = EventListener\nexport type Handlers = Partial<Record<HandlerName, Handler>>\n\nexport type HandlerTarget = Partial<Record<HandlerName, HTMLCanvasElement | Document>>\n\nexport interface State {\n originalScaleLimits: OriginalScaleLimits\n updatedScaleLimits: UpdatedScaleLimits\n handlers: Handlers\n targets: HandlerTarget\n panDelta: Record<string, number>\n dragging: boolean\n panning: boolean\n options: ZoomPluginOptions\n dragStart?: MouseEvent\n dragEnd?: MouseEvent\n filterNextClick?: boolean\n scale?: number | null\n delta?: Point | null\n panScales?: string[]\n}\n\nconst chartStates = new WeakMap<Chart, State>()\n\nexport function getState(chart: Chart): State {\n let state = chartStates.get(chart)\n if (!state) {\n state = {\n originalScaleLimits: {},\n updatedScaleLimits: {},\n handlers: {},\n options: {},\n targets: {},\n panDelta: {},\n dragging: false,\n panning: false,\n }\n chartStates.set(chart, state)\n }\n return state\n}\n\nexport function removeState(chart: Chart) {\n chartStates.delete(chart)\n}\n","import { almostEquals, isNullOrUndef, isNumber, valueOrDefault } from 'chart.js/helpers'\nimport { getState, type ScaleRange, type State } from './state'\nimport type { Point, Scale, TimeScale, TimeUnit } from 'chart.js'\nimport type { LimitOptions, ScaleLimits } from './options'\n\nexport type ZoomFunction = (scale: Scale, zoom: number, center: Point, limits: LimitOptions) => boolean\nexport type ZoomRectFunction = (scale: Scale, from: number, to: number, limits: LimitOptions) => boolean\nexport type PanFunction = (scale: Scale, delta: number, limits: LimitOptions) => boolean\n\nconst isTimeScale = (scale: Scale): scale is TimeScale => scale.type === 'time'\n\nconst isNotNumber = (value?: number): value is undefined => value === undefined || isNaN(value)\n\nexport function zoomDelta(\n val: number | undefined,\n min: number | undefined,\n range: number,\n newRange: number\n): ScaleRange {\n const minPercent = range && isNumber(val) && isNumber(min) ? Math.max(0, Math.min(1, (val - min) / range)) : 0\n const maxPercent = 1 - minPercent\n\n return {\n min: newRange * minPercent,\n max: newRange * maxPercent,\n }\n}\n\nfunction getValueAtPoint(scale: Scale, point: Point): number | undefined {\n const pixel = scale.isHorizontal() ? point.x : point.y\n\n return scale.getValueForPixel(pixel)\n}\n\nfunction linearZoomDelta(scale: Scale, zoom: number, center: Point): ScaleRange {\n const range = scale.max - scale.min\n const newRange = range * (zoom - 1)\n const centerValue = getValueAtPoint(scale, center)\n\n return zoomDelta(centerValue, scale.min, range, newRange)\n}\n\nfunction logarithmicZoomRange(scale: Scale, zoom: number, center: Point) {\n const centerValue = getValueAtPoint(scale, center)\n\n // Return the original range, if value could not be determined.\n if (centerValue === undefined) {\n return { min: scale.min, max: scale.max }\n }\n\n const logMin = Math.log10(scale.min)\n const logMax = Math.log10(scale.max)\n const logCenter = Math.log10(centerValue)\n const logRange = logMax - logMin\n const newLogRange = logRange * (zoom - 1)\n const delta = zoomDelta(logCenter, logMin, logRange, newLogRange)\n\n return {\n min: Math.pow(10, logMin + delta.min),\n max: Math.pow(10, logMax - delta.max),\n }\n}\n\nfunction getScaleLimits(scale: Scale, limits?: LimitOptions): ScaleLimits {\n return limits?.[scale.id] || limits?.[scale.axis] || {}\n}\n\nfunction getLimit(state: State, scale: Scale, scaleLimits: ScaleLimits, prop: 'min' | 'max', fallback: number): number {\n let limit = scaleLimits[prop]\n if (limit === 'original') {\n const original = state.originalScaleLimits[scale.id][prop]\n if (isNumber(original.options)) {\n return original.options\n }\n\n if (!isNullOrUndef(original.options)) {\n const parsed = scale.parse(original.options)\n if (isNumber(parsed)) {\n return parsed\n }\n }\n\n limit = original.scale\n }\n return valueOrDefault(limit, fallback)\n}\n\nfunction linearRange(scale: Scale, pixel0: number, pixel1: number): ScaleRange {\n const v0 = scale.getValueForPixel(pixel0) ?? scale.min\n const v1 = scale.getValueForPixel(pixel1) ?? scale.max\n return {\n min: Math.min(v0, v1),\n max: Math.max(v0, v1),\n }\n}\n\nfunction fixRange(\n range: number,\n { min, max, minLimit, maxLimit }: { min: number; max: number; minLimit: number; maxLimit: number },\n state: State,\n scale: Scale\n) {\n const offset = (range - max + min) / 2\n min -= offset\n max += offset\n\n // In case the values are really close to the original values, use the original values.\n const origLimits: ScaleLimits = { min: 'original', max: 'original' }\n const origMin = getLimit(state, scale, origLimits, 'min', -Infinity)\n const origMax = getLimit(state, scale, origLimits, 'max', Infinity)\n\n const epsilon = range / 1e6\n if (almostEquals(min, origMin, epsilon)) {\n min = origMin\n }\n if (almostEquals(max, origMax, epsilon)) {\n max = origMax\n }\n\n // Apply limits\n if (min < minLimit) {\n min = minLimit\n max = Math.min(minLimit + range, maxLimit)\n } else if (max > maxLimit) {\n max = maxLimit\n min = Math.max(maxLimit - range, minLimit)\n }\n\n return { min, max }\n}\n\nexport function updateRange(\n scale: Scale,\n { min, max }: ScaleRange,\n limits?: LimitOptions,\n zoom = false,\n pan = false\n): boolean {\n const state = getState(scale.chart)\n const { options: scaleOpts } = scale\n\n const scaleLimits = getScaleLimits(scale, limits)\n const { minRange = 0 } = scaleLimits\n const minLimit = getLimit(state, scale, scaleLimits, 'min', -Infinity)\n const maxLimit = getLimit(state, scale, scaleLimits, 'max', Infinity)\n\n if (pan && (min < minLimit || max > maxLimit)) {\n // At limit: No change but return true to indicate no need to store the delta.\n return true\n }\n\n const scaleRange = scale.max - scale.min\n const range = zoom ? Math.max(max - min, minRange) : scaleRange\n\n if (zoom && range === minRange && scaleRange <= minRange) {\n // At range limit: No change but return true to indicate no need to store the delta.\n return true\n }\n\n const newRange = fixRange(range, { min, max, minLimit, maxLimit }, state, scale)\n\n scaleOpts.min = newRange.min\n scaleOpts.max = newRange.max\n\n state.updatedScaleLimits[scale.id] = newRange\n\n // return true if the scale range is changed\n return scale.parse(newRange.min) !== scale.min || scale.parse(newRange.max) !== scale.max\n}\n\nfunction zoomNumericalScale(scale: Scale, zoom: number, center: Point, limits: LimitOptions) {\n const delta = linearZoomDelta(scale, zoom, center)\n const newRange = { min: scale.min + delta.min, max: scale.max - delta.max }\n return updateRange(scale, newRange, limits, true)\n}\n\nfunction zoomLogarithmicScale(scale: Scale, zoom: number, center: Point, limits: LimitOptions) {\n const newRange = logarithmicZoomRange(scale, zoom, center)\n return updateRange(scale, newRange, limits, true)\n}\n\nfunction zoomRectNumericalScale(scale: Scale, from: number, to: number, limits: LimitOptions) {\n return updateRange(scale, linearRange(scale, from, to), limits, true)\n}\n\nconst integerChange = (v: number) =>\n v === 0 || isNaN(v) ? 0 : v < 0 ? Math.min(Math.round(v), -1) : Math.max(Math.round(v), 1)\n\nfunction existCategoryFromMaxZoom(scale: Scale) {\n const labels = scale.getLabels()\n const maxIndex = labels.length - 1\n\n if (scale.min > 0) {\n scale.min -= 1\n }\n if (scale.max < maxIndex) {\n scale.max += 1\n }\n}\n\nfunction zoomCategoryScale(scale: Scale, zoom: number, center: Point, limits: LimitOptions) {\n const delta = linearZoomDelta(scale, zoom, center)\n if (scale.min === scale.max && zoom < 1) {\n existCategoryFromMaxZoom(scale)\n }\n const newRange = { min: scale.min + integerChange(delta.min), max: scale.max - integerChange(delta.max) }\n\n return updateRange(scale, newRange, limits, true)\n}\n\nfunction scaleLength(scale: Scale) {\n return scale.isHorizontal() ? scale.width : scale.height\n}\n\nfunction panCategoryScale(scale: Scale, delta: number, limits: LimitOptions) {\n const labels = scale.getLabels()\n const lastLabelIndex = labels.length - 1\n let { min, max } = scale\n // The visible range. Ticks can be skipped, and thus not reliable.\n const range = Math.max(max - min, 1)\n // How many pixels of delta is required before making a step. stepSize, but limited to max 1/10 of the scale length.\n const stepDelta = Math.round(scaleLength(scale) / Math.max(range, 10))\n const stepSize = Math.round(Math.abs(delta / stepDelta))\n let applied\n if (delta < -stepDelta) {\n max = Math.min(max + stepSize, lastLabelIndex)\n min = range === 1 ? max : max - range\n applied = max === lastLabelIndex\n } else if (delta > stepDelta) {\n min = Math.max(0, min - stepSize)\n max = range === 1 ? min : min + range\n applied = min === 0\n }\n\n return updateRange(scale, { min, max }, limits) || Boolean(applied)\n}\n\nconst OFFSETS: Record<TimeUnit, number> = {\n millisecond: 0,\n second: 500, // 500 ms\n minute: 30 * 1000, // 30 s\n hour: 30 * 60 * 1000, // 30 m\n day: 12 * 60 * 60 * 1000, // 12 h\n week: 3.5 * 24 * 60 * 60 * 1000, // 3.5 d\n month: 15 * 24 * 60 * 60 * 1000, // 15 d\n quarter: 60 * 24 * 60 * 60 * 1000, // 60 d\n year: 182 * 24 * 60 * 60 * 1000, // 182 d\n}\n\nfunction panNumericalScale(scale: Scale, delta: number, limits: LimitOptions, canZoom = false) {\n const { min: prevStart, max: prevEnd } = scale\n let offset = 0\n if (isTimeScale(scale)) {\n const round = scale.options.time?.round\n offset = round ? OFFSETS[round] : 0\n }\n const newMin = scale.getValueForPixel(scale.getPixelForValue(prevStart + offset) - delta)\n const newMax = scale.getValueForPixel(scale.getPixelForValue(prevEnd + offset) - delta)\n if (isNotNumber(newMin) || isNotNumber(newMax)) {\n // NaN can happen for 0-dimension scales (either because they were configured\n // with min === max or because the chart has 0 plottable area).\n return true\n }\n return updateRange(scale, { min: newMin, max: newMax }, limits, canZoom, true)\n}\n\nfunction panNonLinearScale(scale: Scale, delta: number, limits: LimitOptions) {\n return panNumericalScale(scale, delta, limits, true)\n}\n\nexport const zoomFunctions: Record<string, ZoomFunction> = {\n category: zoomCategoryScale,\n default: zoomNumericalScale,\n logarithmic: zoomLogarithmicScale,\n}\n\nexport const zoomRectFunctions: Record<string, ZoomRectFunction> = {\n default: zoomRectNumericalScale,\n}\n\nexport const panFunctions: Record<string, PanFunction> = {\n category: panCategoryScale,\n default: panNumericalScale,\n logarithmic: panNonLinearScale,\n timeseries: panNonLinearScale,\n}\n","import { isNumber, sign } from 'chart.js/helpers'\nimport { panFunctions, updateRange, zoomFunctions, zoomRectFunctions } from './scale.types.js'\nimport { getState, type OriginalScaleLimits, type ScaleRange, type State, type UpdatedScaleLimits } from './state.js'\nimport { directionEnabled, getEnabledScalesByPoint } from './utils.js'\nimport type { Chart, Point, Scale, UpdateMode } from 'chart.js'\nimport type { LimitOptions, PanTrigger, ZoomTrigger } from './options.js'\nimport type { ZoomAmount } from './types.js'\n\nfunction shouldUpdateScaleLimits(\n scale: Scale,\n originalScaleLimits: OriginalScaleLimits,\n updatedScaleLimits: UpdatedScaleLimits\n) {\n const {\n id,\n options: { min, max },\n } = scale\n if (!originalScaleLimits[id] || !updatedScaleLimits[id]) {\n return true\n }\n const previous = updatedScaleLimits[id]\n return previous.min !== min || previous.max !== max\n}\n\nfunction removeMissingScales(limits: OriginalScaleLimits | UpdatedScaleLimits, scales: Record<string, Scale>) {\n for (const key of Object.keys(limits)) {\n if (!scales[key]) {\n delete limits[key]\n }\n }\n}\n\nfunction storeOriginalScaleLimits(chart: Chart, state: State) {\n const { scales } = chart\n const { originalScaleLimits, updatedScaleLimits } = state\n\n for (const scale of Object.values(scales)) {\n if (shouldUpdateScaleLimits(scale, originalScaleLimits, updatedScaleLimits)) {\n originalScaleLimits[scale.id] = {\n min: { scale: scale.min, options: scale.options.min },\n max: { scale: scale.max, options: scale.options.max },\n }\n }\n }\n\n removeMissingScales(originalScaleLimits, scales)\n removeMissingScales(updatedScaleLimits, scales)\n return originalScaleLimits\n}\n\nfunction doZoom(scale: Scale, amount: number, center: Point, limits: LimitOptions) {\n const fn = zoomFunctions[scale.type] || zoomFunctions.default\n fn?.(scale, amount, center, limits)\n}\n\nfunction doZoomRect(scale: Scale, from: number, to: number, limits: LimitOptions) {\n const fn = zoomRectFunctions[scale.type] || zoomRectFunctions.default\n fn?.(scale, from, to, limits)\n}\n\nfunction getCenter(chart: Chart) {\n const ca = chart.chartArea\n return {\n x: (ca.left + ca.right) / 2,\n y: (ca.top + ca.bottom) / 2,\n }\n}\n\nexport function zoom(chart: Chart, amount: ZoomAmount, transition: UpdateMode = 'none', trigger: ZoomTrigger = 'api') {\n const { x = 1, y = 1, focalPoint = getCenter(chart) } = typeof amount === 'number' ? { x: amount, y: amount } : amount\n const state = getState(chart)\n const {\n options: { limits = {}, zoom: zoomOptions },\n } = state\n\n storeOriginalScaleLimits(chart, state)\n\n const xEnabled = x !== 1\n const yEnabled = y !== 1\n const enabledScales = getEnabledScalesByPoint(zoomOptions, focalPoint, chart)\n\n for (const scale of enabledScales) {\n if (scale.isHorizontal() && xEnabled) {\n doZoom(scale, x, focalPoint, limits)\n } else if (!scale.isHorizontal() && yEnabled) {\n doZoom(scale, y, focalPoint, limits)\n }\n }\n\n chart.update(transition)\n\n zoomOptions?.onZoom?.({ chart, trigger, amount: { x, y, focalPoint } })\n}\n\nexport function zoomRect(\n chart: Chart,\n p0: Point,\n p1: Point,\n transition: UpdateMode = 'none',\n trigger: ZoomTrigger = 'api'\n) {\n const state = getState(chart)\n const {\n options: { limits = {}, zoom: zoomOptions = {} },\n } = state\n const { mode = 'xy' } = zoomOptions\n\n storeOriginalScaleLimits(chart, state)\n const xEnabled = directionEnabled(mode, 'x', chart)\n const yEnabled = directionEnabled(mode, 'y', chart)\n\n for (const scale of Object.values(chart.scales)) {\n if (scale.isHorizontal() && xEnabled) {\n doZoomRect(scale, p0.x, p1.x, limits)\n } else if (!scale.isHorizontal() && yEnabled) {\n doZoomRect(scale, p0.y, p1.y, limits)\n }\n }\n\n chart.update(transition)\n\n zoomOptions.onZoom?.({ chart, trigger })\n}\n\nexport function zoomScale(\n chart: Chart,\n scaleId: string,\n range: ScaleRange,\n transition: UpdateMode = 'none',\n trigger: ZoomTrigger = 'api'\n) {\n const state = getState(chart)\n storeOriginalScaleLimits(chart, state)\n const scale = chart.scales[scaleId]\n updateRange(scale, range, undefined, true)\n chart.update(transition)\n\n state.options.zoom?.onZoom?.({ chart, trigger })\n}\n\nexport function resetZoom(chart: Chart, transition: UpdateMode = 'default') {\n const state = getState(chart)\n const originalScaleLimits = storeOriginalScaleLimits(chart, state)\n\n for (const scale of Object.values(chart.scales)) {\n const scaleOptions = scale.options\n if (originalScaleLimits[scale.id]) {\n scaleOptions.min = originalScaleLimits[scale.id].min.options\n scaleOptions.max = originalScaleLimits[scale.id].max.options\n } else {\n delete scaleOptions.min\n delete scaleOptions.max\n }\n delete state.updatedScaleLimits[scale.id]\n }\n chart.update(transition)\n\n state.options.zoom?.onZoomComplete?.({ chart })\n}\n\nfunction getOriginalRange(state: State, scaleId: string): number | undefined {\n const original = state.originalScaleLimits[scaleId]\n if (!original) {\n return undefined\n }\n const { min, max } = original\n if (isNumber(max.options) && isNumber(min.options)) {\n return max.options - min.options\n }\n if (isNumber(max.scale) && isNumber(min.scale)) {\n return max.scale - min.scale\n }\n return undefined\n}\n\nexport function getZoomLevel(chart: Chart) {\n const state = getState(chart)\n let min = 1\n let max = 1\n for (const scale of Object.values(chart.scales)) {\n const origRange = getOriginalRange(state, scale.id)\n if (origRange) {\n const level = Math.round((origRange / (scale.max - scale.min)) * 100) / 100\n min = Math.min(min, level)\n max = Math.max(max, level)\n }\n }\n return min < 1 ? min : max\n}\n\nfunction panScale(scale: Scale, delta: number, limits: LimitOptions, state: State) {\n const { panDelta } = state\n // Add possible cumulative delta from previous pan attempts where scale did not change\n const storedDelta = panDelta[scale.id] || 0\n if (sign(storedDelta) === sign(delta)) {\n delta += storedDelta\n }\n const fn = panFunctions[scale.type] || panFunctions.default\n if (fn?.(scale, delta, limits)) {\n // The scale changed, reset cumulative delta\n panDelta[scale.id] = 0\n } else {\n // The scale did not change, store cumulative delta\n panDelta[scale.id] = delta\n }\n}\n\ntype PanAmount = number | Partial<Point>\n\nexport function pan(\n chart: Chart,\n delta: PanAmount,\n enabledScales?: Scale[],\n transition: UpdateMode = 'none',\n trigger: PanTrigger = 'other'\n) {\n const { x = 0, y = 0 } = typeof delta === 'number' ? { x: delta, y: delta } : delta\n const state = getState(chart)\n const {\n options: { pan: panOptions, limits = {} },\n } = state\n const { onPan } = panOptions || {}\n\n storeOriginalScaleLimits(chart, state)\n\n const xEnabled = x !== 0\n const yEnabled = y !== 0\n\n const scales = enabledScales || Object.values(chart.scales)\n\n for (const scale of scales) {\n if (scale.isHorizontal() && xEnabled) {\n panScale(scale, x, limits, state)\n } else if (!scale.isHorizontal() && yEnabled) {\n panScale(scale, y, limits, state)\n }\n }\n\n chart.update(transition)\n\n onPan?.({ chart, trigger, delta: { x, y } })\n}\n\nexport function getInitialScaleBounds(chart: Chart) {\n const state = getState(chart)\n storeOriginalScaleLimits(chart, state)\n const scaleBounds: Record<string, { min?: number; max?: number }> = {}\n for (const scaleId of Object.keys(chart.scales)) {\n const { min, max } = state.originalScaleLimits[scaleId] || { min: {}, max: {} }\n scaleBounds[scaleId] = { min: min.scale, max: max.scale }\n }\n\n return scaleBounds\n}\n\nexport function getZoomedScaleBounds(chart: Chart) {\n const state = getState(chart)\n const scaleBounds: Record<string, { min?: number; max?: number }> = {}\n for (const scaleId of Object.keys(chart.scales)) {\n scaleBounds[scaleId] = state.updatedScaleLimits[scaleId]\n }\n\n return scaleBounds\n}\n\nexport function isZoomedOrPanned(chart: Chart) {\n const scaleBounds = getInitialScaleBounds(chart)\n for (const scaleId of Object.keys(chart.scales)) {\n const { min: originalMin, max: originalMax } = scaleBounds[scaleId]\n\n if (originalMin !== undefined && chart.scales[scaleId].min !== originalMin) {\n return true\n }\n\n if (originalMax !== undefined && chart.scales[scaleId].max !== originalMax) {\n return true\n }\n }\n\n return false\n}\n\nexport function isZoomingOrPanningState(state: State) {\n return state.panning || state.dragging\n}\n\nexport function isZoomingOrPanning(chart: Chart) {\n const state = getState(chart)\n // From the perspective of outside callers, zooming and panning are still\n // active if we haven't yet cleared the next click.\n return !!(isZoomingOrPanningState(state) || state.filterNextClick)\n}\n","import { directionEnabled, debounce, keyNotPressed, getModifierKey, keyPressed } from './utils'\nimport { zoom, zoomRect } from './core'\nimport { getRelativePosition, _isPointInArea } from 'chart.js/helpers'\nimport { getState, type HandlerFunctions, type HandlerName } from './state'\nimport type { Chart, ChartArea, Point } from 'chart.js'\nimport type { ModeOption, ZoomOptions, ZoomPluginOptions } from './options'\n\nconst clamp = (x: number, from: number, to: number): number => Math.min(to, Math.max(from, x))\n\nfunction removeHandler(chart: Chart, type: HandlerName) {\n const { handlers, targets } = getState(chart)\n const handler = handlers[type]\n const target = targets[type]\n if (handler && target) {\n target.removeEventListener(type, handler)\n delete handlers[type]\n }\n}\n\ntype EventHandler<T extends Event> = (chart: Chart, event: T, options: ZoomPluginOptions) => void\n\nfunction addHandler<T extends Event>(\n chart: Chart,\n target: HTMLCanvasElement | Document,\n type: HandlerName,\n handler: EventHandler<T>\n) {\n const { handlers, options, targets } = getState(chart)\n const oldHandler = handlers[type]\n if (oldHandler && targets[type] === target) {\n // already attached\n return\n }\n removeHandler(chart, type)\n const listener = (handlers[type] = (event) => handler(chart, event as T, options))\n targets[type] = target\n\n // `passive: false` for wheel events, to prevent chrome warnings. Use default value for other events.\n const passive = type === 'wheel' ? false : undefined\n target.addEventListener(type, listener, { passive })\n}\n\nexport function mouseMove(chart: Chart, event: MouseEvent) {\n const state = getState(chart)\n if (state.dragStart) {\n state.dragging = true\n state.dragEnd = event\n chart.draw()\n }\n}\n\nfunction keyDown(chart: Chart, event: KeyboardEvent) {\n const state = getState(chart)\n if (!state.dragStart || event.key !== 'Escape') {\n return\n }\n\n removeHandler(chart, 'keydown')\n state.dragging = false\n state.dragStart = state.dragEnd = undefined\n chart.draw()\n}\n\nfunction getPointPosition(event: MouseEvent, chart: Chart) {\n if (event.target !== chart.canvas) {\n const canvasArea = chart.canvas.getBoundingClientRect()\n return {\n x: event.clientX - canvasArea.left,\n y: event.clientY - canvasArea.top,\n }\n }\n return getRelativePosition(event, chart as any) // TODO: would expect Chart type to be valid for getRelativePosition\n}\n\nfunction zoomStart(chart: Chart, event: MouseEvent, zoomOptions: ZoomOptions): boolean | void {\n const { onZoomStart, onZoomRejected } = zoomOptions\n if (onZoomStart) {\n const point = getPointPosition(event, chart)\n if (onZoomStart?.({ chart, event, point }) === false) {\n onZoomRejected?.({ chart, event })\n return false\n }\n }\n}\n\nexport function mouseDown(chart: Chart, event: MouseEvent): void {\n if (chart.legend) {\n const point = getRelativePosition(event, chart as any) // TODO: would expect Chart type to be valid for getRelativePosition\n if (_isPointInArea(point, chart.legend)) {\n return\n }\n }\n const state = getState(chart)\n const { pan: panOptions, zoom: zoomOptions = {} } = state.options\n if (\n event.button !== 0 ||\n keyPressed(getModifierKey(panOptions), event) ||\n keyNotPressed(getModifierKey(zoomOptions.drag), event)\n ) {\n return zoomOptions.onZoomRejected?.({ chart, event })\n }\n\n if (zoomStart(chart, event, zoomOptions) === false) {\n return\n }\n state.dragStart = event\n\n addHandler(chart, chart.canvas.ownerDocument, 'mousemove', mouseMove)\n addHandler(chart, window.document, 'keydown', keyDown)\n}\n\nfunction applyAspectRatio(\n { begin, end }: { begin: { x: number; y: number }; end: { x: number; y: number } },\n aspectRatio: number\n) {\n let width = end.x - begin.x\n let height = end.y - begin.y\n const ratio = Math.abs(width / height)\n\n if (ratio > aspectRatio) {\n width = Math.sign(width) * Math.abs(height * aspectRatio)\n } else if (ratio < aspectRatio) {\n height = Math.sign(height) * Math.abs(width / aspectRatio)\n }\n\n end.x = begin.x + width\n end.y = begin.y + height\n}\n\ntype Rect = { top?: number; left?: number; right?: number; bottom?: number }\nfunction applyMinMaxProps(\n rect: Rect,\n chartArea: ChartArea,\n points: { begin: Point; end: Point },\n { min, max, prop }: { min: keyof Rect; max: keyof Rect; prop: 'x' | 'y' }\n) {\n rect[min] = clamp(Math.min(points.begin[prop], points.end[prop]), chartArea[min], chartArea[max])\n rect[max] = clamp(Math.max(points.begin[prop], points.end[prop]), chartArea[min], chartArea[max])\n}\n\nfunction getRelativePoints(\n chart: Chart,\n pointEvents: { dragStart: MouseEvent; dragEnd: MouseEvent },\n maintainAspectRatio?: boolean\n) {\n const points = {\n begin: getPointPosition(pointEvents.dragStart, chart),\n end: getPointPosition(pointEvents.dragEnd, chart),\n }\n\n if (maintainAspectRatio) {\n const aspectRatio = chart.chartArea.width / chart.chartArea.height\n applyAspectRatio(points, aspectRatio)\n }\n\n return points\n}\n\nexport function computeDragRect(\n chart: Chart,\n mode: ModeOption | undefined,\n pointEvents: { dragStart: MouseEvent; dragEnd: MouseEvent },\n maintainAspectRatio: boolean | undefined\n) {\n const xEnabled = directionEnabled(mode, 'x', chart)\n const yEnabled = directionEnabled(mode, 'y', chart)\n const { top, left, right, bottom, width: chartWidth, height: chartHeight } = chart.chartArea\n const rect = { top, left, right, bottom }\n\n const points = getRelativePoints(chart, pointEvents, maintainAspectRatio && xEnabled && yEnabled)\n\n if (xEnabled) {\n applyMinMaxProps(rect, chart.chartArea, points, { min: 'left', max: 'right', prop: 'x' })\n }\n\n if (yEnabled) {\n applyMinMaxProps(rect, chart.chartArea, points, { min: 'top', max: 'bottom', prop: 'y' })\n }\n\n const width = rect.right - rect.left\n const height = rect.bottom - rect.top\n\n return {\n ...rect,\n width,\n height,\n zoomX: xEnabled && width ? 1 + (chartWidth - width) / chartWidth : 1,\n zoomY: yEnabled && height ? 1 + (chartHeight - height) / chartHeight : 1,\n }\n}\n\nexport function mouseUp(chart: Chart, event: MouseEvent) {\n const state = getState(chart)\n if (!state.dragStart) {\n return\n }\n\n removeHandler(chart, 'mousemove')\n const { mode, onZoomComplete, drag } = state.options.zoom ?? {}\n const { threshold = 0, maintainAspectRatio } = drag ?? {}\n const rect = computeDragRect(chart, mode, { dragStart: state.dragStart, dragEnd: event }, maintainAspectRatio)\n const distanceX = directionEnabled(mode, 'x', chart) ? rect.width : 0\n const distanceY = directionEnabled(mode, 'y', chart) ? rect.height : 0\n const distance = Math.sqrt(distanceX * distanceX + distanceY * distanceY)\n\n // Remove drag start and end before chart render to stop drawing selected area\n state.dragStart = state.dragEnd = undefined\n\n if (distance <= threshold) {\n state.dragging = false\n chart.draw()\n return\n }\n\n zoomRect(chart, { x: rect.left, y: rect.top }, { x: rect.right, y: rect.bottom }, 'zoom', 'drag')\n\n state.dragging = false\n state.filterNextClick = true\n onZoomComplete?.({ chart })\n}\n\nfunction wheelPreconditions(chart: Chart, event: WheelEvent, zoomOptions: ZoomOptions): true | void {\n // Before preventDefault, check if the modifier key required and pressed\n if (keyNotPressed(getModifierKey(zoomOptions.wheel), event)) {\n zoomOptions.onZoomRejected?.({ chart, event })\n return\n }\n\n if (zoomStart(chart, event, zoomOptions) === false) {\n return\n }\n\n // Prevent the event from triggering the default behavior (e.g. content scrolling).\n if (event.cancelable) {\n event.preventDefault()\n }\n\n // Firefox always fires the wheel event twice:\n // First without the delta and right after that once with the delta properties.\n if (event.deltaY === undefined) {\n return\n }\n return true\n}\n\nexport function wheel(chart: Chart, event: WheelEvent & { target?: HTMLCanvasElement }) {\n const {\n handlers: { onZoomComplete },\n options: { zoom: zoomOptions = {} },\n } = getState(chart)\n\n if (!wheelPreconditions(chart, event, zoomOptions)) {\n return\n }\n\n const rect = event.target?.getBoundingClientRect()\n const speed = zoomOptions?.wheel?.speed ?? 0.1\n const percentage = event.deltaY >= 0 ? 2 - 1 / (1 - speed) : 1 + speed\n const amount = {\n x: percentage,\n y: percentage,\n focalPoint: {\n x: event.clientX - rect.left,\n y: event.clientY - rect.top,\n },\n }\n\n zoom(chart, amount, 'zoom', 'wheel')\n\n onZoomComplete?.(event)\n}\n\nfunction addDebouncedHandler(\n chart: Chart,\n name: HandlerName,\n handler: HandlerFunctions['onZoomComplete'] | undefined,\n delay: number\n) {\n if (handler) {\n getState(chart).handlers[name] = debounce(() => handler?.({ chart }), delay)\n }\n}\n\nexport function addListeners(chart: Chart, options: ZoomPluginOptions) {\n const canvas = chart.canvas\n const { wheel: wheelOptions, drag: dragOptions, onZoomComplete } = options.zoom ?? {}\n\n // Install listeners. Do this dynamically based on options so that we can turn zoom on and off\n // We also want to make sure listeners aren't always on. E.g. if you're scrolling down a page\n // and the mouse goes over a chart you don't want it intercepted unless the plugin is enabled\n if (wheelOptions?.enabled) {\n addHandler(chart, canvas, 'wheel', wheel)\n addDebouncedHandler(chart, 'onZoomComplete', onZoomComplete, 250)\n } else {\n removeHandler(chart, 'wheel')\n }\n if (dragOptions?.enabled) {\n addHandler(chart, canvas, 'mousedown', mouseDown)\n addHandler(chart, canvas.ownerDocument, 'mouseup', mouseUp)\n } else {\n removeHandler(chart, 'mousedown')\n removeHandler(chart, 'mousemove')\n removeHandler(chart, 'mouseup')\n removeHandler(chart, 'keydown')\n }\n}\n\nexport function removeListeners(chart: Chart) {\n removeHandler(chart, 'mousedown')\n removeHandler(chart, 'mousemove')\n removeHandler(chart, 'mouseup')\n removeHandler(chart, 'wheel')\n removeHandler(chart, 'click')\n removeHandler(chart, 'keydown')\n}\n","import { getRelativePosition } from 'chart.js/helpers'\nimport Hammer from 'hammerjs'\nimport { pan, zoom } from './core'\nimport { getState, type State } from './state'\nimport { directionEnabled, getEnabledScalesByPoint, getModifierKey, keyNotPressed, keyPressed } from './utils'\nimport type { Chart } from 'chart.js'\nimport type { ZoomPluginOptions } from './options'\n\nfunction createEnabler(chart: Chart, state: State) {\n return function (_recognizer: any, event: HammerInput) {\n const { pan: panOptions, zoom: zoomOptions = {} } = state.options\n if (!panOptions || !panOptions.enabled) {\n return false\n }\n const srcEvent = event && event.srcEvent\n if (!srcEvent) {\n // Sometimes Hammer queries this with a null event.\n return true\n }\n if (\n !state.panning &&\n event.pointerType === 'mouse' &&\n (keyNotPressed(getModifierKey(panOptions), srcEvent) || keyPressed(getModifierKey(zoomOptions.drag), srcEvent))\n ) {\n panOptions.onPanRejected?.({ chart, event })\n return false\n }\n return true\n }\n}\n\nfunction pinchAxes(p0: { clientX: number; clientY: number }, p1: { clientX: number; clientY: number }) {\n // fingers position difference\n const pinchX = Math.abs(p0.clientX - p1.clientX)\n const pinchY = Math.abs(p0.clientY - p1.clientY)\n\n // diagonal fingers will change both (xy) axes\n const p = pinchX / pinchY\n let x, y\n if (p > 0.3 && p < 1.7) {\n x = y = true\n } else if (pinchX > pinchY) {\n x = true\n } else {\n y = true\n }\n return { x, y }\n}\n\nfunction handlePinch(chart: Chart, state: State, e: HammerInput) {\n if (state.scale) {\n const { center, pointers } = e\n // Hammer reports the total scaling. We need the incremental amount\n const zoomPercent = (1 / state.scale) * e.scale\n const rect = e.target.getBoundingClientRect()\n const pinch = pinchAxes(pointers[0], pointers[1])\n const mode = state.options.zoom?.mode\n const amount = {\n x: pinch.x && directionEnabled(mode, 'x', chart) ? zoomPercent : 1,\n y: pinch.y && directionEnabled(mode, 'y', chart) ? zoomPercent : 1,\n focalPoint: {\n x: center.x - rect.left,\n y: center.y - rect.top,\n },\n }\n\n zoom(chart, amount, 'zoom', 'pinch')\n\n // Keep track of overall scale\n state.scale = e.scale\n }\n}\n\nfunction startPinch(chart: Chart, state: State, e: HammerInput) {\n if (state.options.zoom?.pinch?.enabled) {\n const point = getRelativePosition(e.srcEvent, chart as any) // TODO: would expect Chart type to be valid for getRelativePosition\n if (state.options.zoom?.onZoomStart?.({ chart, event: e.srcEvent, point }) === false) {\n state.scale = null\n state.options.zoom?.onZoomRejected?.({ chart, event: e.srcEvent })\n } else {\n state.scale = 1\n }\n }\n}\n\nfunction endPinch(chart: Chart, state: State, e: HammerInput) {\n if (state.scale) {\n handlePinch(chart, state, e)\n state.scale = null // reset\n state.options.zoom?.onZoomComplete?.({ chart })\n }\n}\n\nfunction handlePan(chart: Chart, state: State, e: HammerInput) {\n const delta = state.delta\n if (delta) {\n state.panning = true\n pan(\n chart,\n { x: e.deltaX - delta.x, y: e.deltaY - delta.y },\n state.panScales && state.panScales.map((i) => chart.scales[i]).filter(Boolean)\n )\n state.delta = { x: e.deltaX, y: e.deltaY }\n }\n}\n\nfunction startPan(chart: Chart, state: State, event: HammerInput) {\n const { enabled, onPanStart, onPanRejected } = state.options.pan ?? {}\n if (!enabled) {\n return\n }\n const rect = event.target.getBoundingClientRect()\n const point = {\n x: event.center.x - rect.left,\n y: event.center.y - rect.top,\n }\n\n if (onPanStart?.({ chart, event, point }) === false) {\n return onPanRejected?.({ chart, event })\n }\n\n state.panScales = getEnabledScalesByPoint(state.options.pan, point, chart).map((i) => i.id)\n state.delta = { x: 0, y: 0 }\n handlePan(chart, state, event)\n}\n\nfunction endPan(chart: Chart, state: State) {\n state.delta = null\n if (state.panning) {\n state.panning = false\n state.filterNextClick = true\n state.options.pan?.onPanComplete?.({ chart })\n }\n}\n\nconst hammers = new WeakMap()\nexport function startHammer(chart: Chart, options: ZoomPluginOptions) {\n const state = getState(chart)\n const canvas = chart.canvas\n const { pan: panOptions, zoom: zoomOptions } = options\n\n const mc = new Hammer.Manager(canvas)\n if (zoomOptions?.pinch?.enabled) {\n mc.add(new Hammer.Pinch())\n mc.on('pinchstart', (e) => startPinch(chart, state, e))\n mc.on('pinch', (e) => handlePinch(chart, state, e))\n mc.on('pinchend', (e) => endPinch(chart, state, e))\n }\n\n if (panOptions && panOptions.enabled) {\n mc.add(\n new Hammer.Pan({\n threshold: panOptions.threshold,\n enable: createEnabler(chart, state),\n })\n )\n mc.on('panstart', (e) => startPan(chart, state, e))\n mc.on('panmove', (e) => handlePan(chart, state, e))\n mc.on('panend', () => endPan(chart, state))\n }\n\n hammers.set(chart, mc)\n}\n\nexport function stopHammer(chart: Chart) {\n const mc = hammers.get(chart)\n if (mc) {\n mc.remove('pinchstart')\n mc.remove('pinch')\n mc.remove('pinchend')\n mc.remove('panstart')\n mc.remove('pan')\n mc.remove('panend')\n mc.destroy()\n hammers.delete(chart)\n }\n}\n\nexport function hammerOptionsChanged(oldOptions: ZoomPluginOptions, newOptions: ZoomPluginOptions) {\n const { pan: oldPan, zoom: oldZoom } = oldOptions\n const { pan: newPan, zoom: newZoom } = newOptions\n\n if (oldZoom?.pinch?.enabled !== newZoom?.pinch?.enabled) {\n return true\n }\n if (oldPan?.enabled !== newPan?.enabled) {\n return true\n }\n if (oldPan?.threshold !== newPan?.threshold) {\n return true\n }\n\n return false\n}\n","import Hammer from 'hammerjs'\nimport { addListeners, computeDragRect, removeListeners } from './handlers'\nimport { hammerOptionsChanged, startHammer, stopHammer } from './hammer'\nimport {\n pan,\n zoom,\n resetZoom,\n zoomScale,\n getZoomLevel,\n getInitialScaleBounds,\n getZoomedScaleBounds,\n isZoomedOrPanned,\n isZoomingOrPanning,\n isZoomingOrPanningState,\n zoomRect,\n} from './core'\nimport { panFunctions, zoomFunctions, zoomRectFunctions } from './scale.types'\nimport { getState, removeState } from './state'\nimport { version } from '../package.json'\nimport type { Chart, ChartEvent } from 'chart.js'\nimport type { ZoomPluginOptions } from './options'\nimport { defaults } from './defaults'\n\nfunction draw(chart: Chart, caller: string, options: ZoomPluginOptions) {\n const dragOptions = options.zoom?.drag\n const { dragStart, dragEnd } = getState(chart)\n\n if (dragOptions?.drawTime !== caller || !dragStart || !dragEnd) {\n return\n }\n const { left, top, width, height } = computeDragRect(\n chart,\n options.zoom?.mode,\n { dragStart, dragEnd },\n dragOptions.maintainAspectRatio\n )\n const ctx = chart.ctx\n\n ctx.save()\n ctx.beginPath()\n ctx.fillStyle = dragOptions.backgroundColor || 'rgba(225,225,225,0.3)'\n ctx.fillRect(left, top, width, height)\n\n if (dragOptions.borderWidth) {\n ctx.lineWidth = dragOptions.borderWidth\n ctx.strokeStyle = dragOptions.borderColor || 'rgba(225,225,225)'\n ctx.strokeRect(left, top, width, height)\n }\n ctx.restore()\n}\n\nconst bindApi = (chart: Chart) => {\n chart.pan = (delta, panScales, transition) => pan(chart, delta, panScales, transition, 'api')\n chart.zoom = (args, transition) => zoom(chart, args, transition)\n chart.zoomRect = (p0, p1, transition) => zoomRect(chart, p0, p1, transition)\n chart.zoomScale = (id, range, transition) => zoomScale(chart, id, range, transition)\n chart.resetZoom = (transition) => resetZoom(chart, transition)\n chart.getZoomLevel = () => getZoomLevel(chart)\n chart.getInitialScaleBounds = () => getInitialScaleBounds(chart)\n chart.getZoomedScaleBounds = () => getZoomedScaleBounds(chart)\n chart.isZoomedOrPanned = () => isZoomedOrPanned(chart)\n chart.isZoomingOrPanning = () => isZoomingOrPanning(chart)\n}\n\nexport default {\n id: 'zoom',\n\n version,\n\n defaults,\n\n start(chart: Chart, _args: unknown, options: ZoomPluginOptions) {\n const state = getState(chart)\n state.options = options\n\n if (Object.prototype.hasOwnProperty.call(options.zoom, 'enabled')) {\n console.warn(\n 'The option `zoom.enabled` is no longer supported. Please use `zoom.wheel.enabled`, `zoom.drag.enabled`, or `zoom.pinch.enabled`.'\n )\n }\n if (\n Object.prototype.hasOwnProperty.call(options.zoom, 'overScaleMode') ||\n Object.prototype.hasOwnProperty.call(options.pan, 'overScaleMode')\n ) {\n console.warn(\n 'The option `overScaleMode` is deprecated. Please use `scaleMode` instead (and update `mode` as desired).'\n )\n }\n\n if (Hammer) {\n startHammer(chart, options)\n }\n\n bindApi(chart)\n },\n\n beforeEvent(\n chart: Chart,\n { event }: { event: ChartEvent; replay: boolean; cancelable: true; inChartArea: boolean }\n ): boolean | void {\n const state = getState(chart)\n if (isZoomingOrPanningState(state)) {\n // cancel any event handling while panning or dragging\n return false\n }\n // cancel the next click or mouseup after drag or pan\n if (event.type === 'click' || event.type === 'mouseup') {\n if (state.filterNextClick) {\n state.filterNextClick = false\n return false\n }\n }\n },\n\n beforeUpdate(chart: Chart, _args: unknown, options: ZoomPluginOptions) {\n const state = getState(chart)\n const previousOptions = state.options\n state.options = options\n\n // Hammer needs to be restarted when certain options change.\n if (hammerOptionsChanged(previousOptions, options)) {\n stopHammer(chart)\n startHammer(chart, options)\n }\n\n addListeners(chart, options)\n },\n\n beforeDatasetsDraw(chart: Chart, _args: unknown, options: ZoomPluginOptions) {\n draw(chart, 'beforeDatasetsDraw', options)\n },\n\n afterDatasetsDraw(chart: Chart, _args: unknown, options: ZoomPluginOptions) {\n draw(chart, 'afterDatasetsDraw', options)\n },\n\n beforeDraw(chart: Chart, _args: unknown, options: ZoomPluginOptions) {\n draw(chart, 'beforeDraw', options)\n },\n\n afterDraw(chart: Chart, _args: unknown, options: ZoomPluginOptions) {\n draw(chart, 'afterDraw', options)\n },\n\n stop(chart: Chart) {\n removeListeners(chart)\n\n if (Hammer) {\n stopHammer(chart)\n }\n removeState(chart)\n },\n\n panFunctions,\n zoomFunctions,\n zoomRectFunctions,\n}\n","import type { ZoomPluginOptions } from './options'\n\nexport const defaults: ZoomPluginOptions = {\n pan: {\n enabled: false,\n mode: 'xy',\n threshold: 10,\n modifierKey: null,\n },\n zoom: {\n wheel: {\n enabled: false,\n speed: 0.1,\n modifierKey: null,\n },\n drag: {\n enabled: false,\n drawTime: 'beforeDatasetsDraw',\n modifierKey: null,\n },\n pinch: {\n enabled: false,\n },\n mode: 'xy',\n },\n}\n","import { Chart } from 'chart.js'\nimport Zoom from './plugin'\n\nChart.register(Zoom)\n\nexport default Zoom\n"],"names":["eventKey","key","getModifierKey","opts","enabled","modifierKey","undefined","keyPressed","event","keyNotPressed","directionEnabled","mode","dir","chart","indexOf","directionsEnabled","x","y","getEnabledScalesByPoint","options","point","scaleMode","overScaleMode","scale","scales","scaleIds","Object","keys","i","length","top","bottom","left","right","getScaleUnderPoint","scaleEnabled","overScaleEnabled","axis","convertOverScaleMode","enabledScales","scaleItem","values","push","getEnabledScales","chartStates","WeakMap","getState","state","get","originalScaleLimits","updatedScaleLimits","handlers","targets","panDelta","dragging","panning","set","isNotNumber","value","isNaN","zoomDelta","val","min","range","newRange","minPercent","isNumber","Math","max","getValueAtPoint","pixel","isHorizontal","getValueForPixel","linearZoomDelta","zoom","center","getLimit","scaleLimits","prop","fallback","limit","original","id","isNullOrUndef","parsed","parse","valueOrDefault","updateRange","limits","pan","scaleOpts","getScaleLimits","minRange","minLimit","Infinity","maxLimit","scaleRange","offset","origLimits","origMin","origMax","epsilon","almostEquals","fixRange","integerChange","v","round","OFFSETS","millisecond","second","minute","hour","day","week","month","quarter","year","panNumericalScale","delta","canZoom","prevStart","prevEnd","type","isTimeScale","time","newMin","getPixelForValue","newMax","panNonLinearScale","zoomFunctions","category","maxIndex","getLabels","existCategoryFromMaxZoom","default","logarithmic","centerValue","logMin","log10","logMax","logRange","pow","logarithmicZoomRange","zoomRectFunctions","from","to","pixel0","pixel1","v0","v1","linearRange","panFunctions","lastLabelIndex","stepDelta","width","height","scaleLength","stepSize","abs","applied","Boolean","timeseries","shouldUpdateScaleLimits","previous","removeMissingScales","storeOriginalScaleLimits","doZoom","amount","fn","doZoomRect","getCenter","ca","chartArea","transition","trigger","focalPoint","zoomOptions","xEnabled","yEnabled","update","onZoom","zoomRect","p0","p1","getOriginalRange","scaleId","panScale","storedDelta","sign","panOptions","onPan","getInitialScaleBounds","scaleBounds","isZoomingOrPanningState","clamp","removeHandler","handler","target","removeEventListener","addHandler","listener","passive","addEventListener","mouseMove","dragStart","dragEnd","draw","keyDown","getPointPosition","canvas","canvasArea","getBoundingClientRect","clientX","clientY","getRelativePosition","zoomStart","onZoomStart","onZoomRejected","mouseDown","legend","_isPointInArea","button","drag","ownerDocument","window","document","applyMinMaxProps","rect","points","begin","end","getRelativePoints","pointEvents","maintainAspectRatio","aspectRatio","ratio","applyAspectRatio","computeDragRect","chartWidth","chartHeight","zoomX","zoomY","mouseUp","onZoomComplete","threshold","distanceX","distanceY","distance","sqrt","filterNextClick","wheel","cancelable","preventDefault","deltaY","wheelPreconditions","speed","percentage","addDebouncedHandler","name","delay","timeout","clearTimeout","setTimeout","debounce","createEnabler","_recognizer","srcEvent","pointerType","onPanRejected","handlePinch","e","pointers","zoomPercent","pinch","pinchX","pinchY","p","pinchAxes","handlePan","deltaX","panScales","map","filter","hammers","startHammer","mc","Hammer","Manager","add","Pinch","on","startPinch","endPinch","Pan","enable","onPanStart","startPan","onPanComplete","endPan","stopHammer","remove","destroy","delete","caller","dragOptions","drawTime","ctx","save","beginPath","fillStyle","backgroundColor","fillRect","borderWidth","lineWidth","strokeStyle","borderColor","strokeRect","restore","bindApi","args","zoomScale","resetZoom","scaleOptions","getZoomLevel","origRange","level","getZoomedScaleBounds","isZoomedOrPanned","originalMin","originalMax","isZoomingOrPanning","Zoom","version","defaults","start","_args","prototype","hasOwnProperty","call","console","warn","beforeEvent","beforeUpdate","previousOptions","oldOptions","newOptions","oldPan","oldZoom","newPan","newZoom","hammerOptionsChanged","wheelOptions","addListeners","beforeDatasetsDraw","afterDatasetsDraw","beforeDraw","afterDraw","stop","removeListeners","removeState","Chart","register"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thewhitehaven04/chartjs-plugin-zoom",
3
- "version": "2.2.9",
3
+ "version": "2.2.10",
4
4
  "description": "A fork of the ChartJS Zoom plugin that enables zoom and pan functionality in Chart.js charts",
5
5
  "homepage": "https://www.chartjs.org/chartjs-plugin-zoom/",
6
6
  "repository": {
@@ -22,9 +22,9 @@
22
22
  }
23
23
  },
24
24
  "files": [
25
- "dist/**/*.js",
26
- "dist/**/*.d.ts",
27
- "dist/**/*.map"
25
+ "dist/@thewhitehaven04/*.js",
26
+ "dist/src/*.d.ts",
27
+ "dist/@thewhitehaven04/*.map"
28
28
  ],
29
29
  "scripts": {
30
30
  "autobuild": "rollup -c -w",
@@ -1 +0,0 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/core.ts"],"names":[],"mappings":"AAEA,OAAO,EAAsC,KAAK,UAAU,EAAE,KAAK,KAAK,EAA2B,MAAM,YAAY,CAAA;AAErH,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAC/D,OAAO,KAAK,EAAgB,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AACzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AA8D5C,wBAAgB,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAE,UAAmB,EAAE,OAAO,GAAE,WAAmB,QAwBnH;AAED,wBAAgB,QAAQ,CACtB,KAAK,EAAE,KAAK,EACZ,EAAE,EAAE,KAAK,EACT,EAAE,EAAE,KAAK,EACT,UAAU,GAAE,UAAmB,EAC/B,OAAO,GAAE,WAAmB,QAuB7B;AAED,wBAAgB,SAAS,CACvB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,UAAU,EACjB,UAAU,GAAE,UAAmB,EAC/B,OAAO,GAAE,WAAmB,QAS7B;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,GAAE,UAAsB,QAkBzE;AAiBD,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,UAaxC;AAmBD,KAAK,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;AAExC,wBAAgB,GAAG,CACjB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,SAAS,EAChB,aAAa,CAAC,EAAE,KAAK,EAAE,EACvB,UAAU,GAAE,UAAmB,EAC/B,OAAO,GAAE,UAAoB,QA2B9B;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,KAAK;;;GAUjD;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,KAAK;;;GAQhD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,WAe5C;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,KAAK,WAEnD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,WAK9C"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAElD,eAAO,MAAM,QAAQ,EAAE,iBAuBtB,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"hammer.d.ts","sourceRoot":"","sources":["../../src/hammer.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AACrC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAkIlD,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,iBAAiB,QA0BnE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,QAYtC;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,iBAAiB,EAAE,UAAU,EAAE,iBAAiB,WAehG"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/handlers.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAoB,MAAM,UAAU,CAAA;AACvD,OAAO,KAAK,EAAE,UAAU,EAAe,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAqC3E,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,QAOxD;AAoCD,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAwB/D;AAiDD,wBAAgB,eAAe,CAC7B,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,UAAU,GAAG,SAAS,EAC5B,WAAW,EAAE;IAAE,SAAS,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,UAAU,CAAA;CAAE,EAC3D,mBAAmB,EAAE,OAAO,GAAG,SAAS;;;;;;;;;EA2BzC;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,QA4BtD;AA0BD,wBAAgB,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,GAAG;IAAE,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAAE,QAyBrF;AAaD,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,iBAAiB,QAsBpE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,QAO3C"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,UAAU,CAAA;AAE7B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACzC,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAEtF,OAAO,QAAQ,UAAU,CAAC;IACxB,UAAU,mBAAmB,CAAC,KAAK,SAAS,SAAS;QACnD,IAAI,EAAE,iBAAiB,CAAA;KACxB;IAGD,KAAK,cAAc;QACjB,IAAI,SAAS;KACd;IAED,UAAU,KAAK,CACb,KAAK,SAAS,SAAS,GAAG,MAAM,iBAAiB,EACjD,KAAK,GAAG,iBAAiB,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,kBAAkB,CAAC,CAAC,EACvE,MAAM,GAAG,OAAO;QAEhB,GAAG,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;QAC9D,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;QAC/C,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;QACvD,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;QACjE,SAAS,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,IAAI,CAAA;QAClC,YAAY,IAAI,MAAM,CAAA;QACtB,qBAAqB,IAAI,MAAM,CAAC,MAAM,EAAE;YAAE,GAAG,CAAC,EAAE,MAAM,CAAC;YAAC,GAAG,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;QACvE,oBAAoB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAA;QAC3D,gBAAgB,IAAI,OAAO,CAAA;QAC3B,kBAAkB,IAAI,OAAO,CAAA;KAC9B;CACF;AAED,eAAe,MAAM,CAAA;AACrB,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.umd.d.ts","sourceRoot":"","sources":["../../src/index.umd.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,UAAU,CAAA;AAI3B,eAAe,IAAI,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/options.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;;;;;iBAmDnC,KAAK,SAAS,OAAO,WAAW,iBAAiB;uBA0BrD,KAAK;eACQ,UAAU;gBAAU,OAAO;oBAAc,IAAI;qBAAe,OAAO;QACtF,OAAO,GAAG,IAAI;wBAeG,KAAK,SAAS,OAAO,WAAW,iBAAiB;8BAc3C,KAAK,SAAS,OAAO,WAAW,iBAAiB;6BAIlD,KAAK,SAAS,OAAO,WAAW,iBAAiB;sBAIxD,KAAK,SAAS,OAAO,WAAW,iBAAiB;qBAIlD,KAAK,SAAS,OAAO,WAAW,iBAAiB;gBAItD,KAAK;;;;;AAhFnB,wBA4FC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"scale.types.d.ts","sourceRoot":"","sources":["../../src/scale.types.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,KAAK,UAAU,EAAc,MAAM,SAAS,CAAA;AAC/D,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAuB,MAAM,UAAU,CAAA;AACjE,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,WAAW,CAAA;AAE1D,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,KAAK,OAAO,CAAA;AACvG,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,OAAO,CAAA;AACxG,MAAM,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,OAAO,CAAA;AAMxF,wBAAgB,SAAS,CACvB,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACf,UAAU,CAQZ;AAyGD,wBAAgB,WAAW,CACzB,KAAK,EAAE,KAAK,EACZ,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,UAAU,EACxB,MAAM,CAAC,EAAE,YAAY,EACrB,IAAI,UAAQ,EACZ,GAAG,UAAQ,GACV,OAAO,CA+BT;AAsGD,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAItD,CAAA;AAED,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAE9D,CAAA;AAED,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAKpD,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"scale.types.test.d.ts","sourceRoot":"","sources":["../../src/scale.types.test.ts"],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/state.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AAErC,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG;IAAE,UAAU,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC,CAAA;AAC3E,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;AAC/C,MAAM,MAAM,UAAU,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAA;AACrD,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAIjF,eAAO,MAAM,cAAc,UAAW,WAAW,GAAG,UAAU,KAAG,WAAW,GAAG,SACb,CAAA;AAClE,eAAO,MAAM,UAAU,QAAS,WAAW,GAAG,SAAS,SAAS,UAAU,GAAG,UAAU,GAAG,YAAY,wBACzE,CAAA;AAC7B,eAAO,MAAM,aAAa,QAAS,WAAW,GAAG,SAAS,SAAS,UAAU,GAAG,UAAU,GAAG,YAAY,wBAC3E,CAAA;AAE9B,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAUpG;AAaD,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,4BAOjE;AA+CD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,UAAU,GAAG,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,CAe5G"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.test.d.ts","sourceRoot":"","sources":["../../src/utils.test.ts"],"names":[],"mappings":""}