{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-markus/src/external/event-drops/zoom.js"],"names":["getDomainTransform","getShiftedTransform","originalTransform","labelsWidth","labelsPadding","d3","fullLabelWidth","x","y","k","zoomIdentity","translate","scale","config","domain","xScale","width","label","padding","svg","zoom","draw","getEvent","height","onZoomStart","onZoom","onZoomEnd","minimumScale","maximumScale","restrictPan","extentConstraint","scaleExtent","translateExtent","extent","on","args","transform","newScale","rescaleX","call"],"mappings":";;;;;;;;;;;;;;kDAkCgBA,mD;;;;;;;;AAlCT,kBAAMC,sBAAsB,CAC/BC,iBAD+B,EAE/BC,WAF+B,EAG/BC,aAH+B,EAI/BC,EAJ+B,KAK9B;AACD,sBAAMC,iBAAiBH,cAAcC,aAArC;;AAEA,sBAAM,EAAEG,CAAF,EAAKC,CAAL,EAAQC,CAAR,KAAcP,iBAApB;;AAEA,uBAAOG,GAAGK,YAAH,CACFC,SADE,CACQ,CAACL,cADT,EACyB,CADzB,CAC4B;AAD5B,kBAEFK,SAFE,CAEQJ,CAFR,EAEWC,CAFX,CAEc;AAFd,kBAGFI,KAHE,CAGIH,CAHJ,CAGO;AAHP,kBAIFE,SAJE,CAIQR,cAAcC,aAJtB,EAIqC,CAJrC,CAAP,CALC,CAS+C;AACnD,aAfM;;AAiBP;;;;;;;;;;;;;;;;;;;;;;;;;;mDAjBaH,oD;;;;;;;;AAkCN,qBAASD,kBAAT,CAA4BK,EAA5B,EAAgCQ,MAAhC,EAAwCC,MAAxC,EAAgDC,MAAhD,EAAwDC,KAAxD,EAA+D;AAClE,sBAAM,EAAEC,OAAO,EAAED,OAAOb,WAAT,EAAsBe,SAASd,aAA/B,EAAT,KAA4DS,MAAlE;;AAEA,sBAAMP,iBAAiBH,cAAcC,aAArC;AACA;AACA,uBAAOC,GAAGK,YAAH,CACFC,SADE,CACQL,cADR,EACwB,CADxB,EAEFM,KAFE,CAEI,CAACI,QAAQb,WAAT,KAAyBY,OAAOD,OAAO,CAAP,CAAP,IAAoBC,OAAOD,OAAO,CAAP,CAAP,CAA7C,CAFJ,EAGFH,SAHE,CAGQ,CAACI,OAAOD,OAAO,CAAP,CAAP,CAHT,EAG4B,CAH5B,EAIFH,SAJE,CAIQ,CAACL,cAJT,EAIyB,CAJzB,CAAP;AAKH;;;;+BAEc,CACXD,EADW,EAEXc,GAFW,EAGXN,MAHW,EAIXO,IAJW,EAKXL,MALW,EAMXM,IANW,EAOXC,QAPW,EAQXN,KARW,EASXO,MATW,KAUV;AACD,sBAAM;AACFN,2BAAO,EAAED,OAAOb,WAAT,EAAsBe,SAASd,aAA/B,EADL;AAEFgB,0BAAM;AACFI,mCADE;AAEFC,8BAFE;AAGFC,iCAHE;AAIFC,oCAJE;AAKFC,oCALE;AAMFC;AANE;AAFJ,oBAUFhB,MAVJ;;AAYA,sBAAMiB,mBAAmB,CACrB,CAAC3B,cAAcC,aAAf,EAA8B,CAA9B,CADqB,EAErB,CAACY,KAAD,EAAQO,MAAR,CAFqB,CAAzB;;AAKAH,qBAAKW,WAAL,CAAiB,CAACJ,YAAD,EAAeC,YAAf,CAAjB;;AAEA;AACA,oBAAIC,WAAJ,EAAiB;AACbT,yBAAKY,eAAL,CAAqBF,gBAArB,EAAuCG,MAAvC,CAA8CH,gBAA9C;AACH;;AAEDV,qBAAKc,EAAL,CAAQ,YAAR,EAAsBV,WAAtB,EAAmCU,EAAnC,CAAsC,UAAtC,EAAkDR,SAAlD;;AAEAN,qBAAKc,EAAL,CAAQ,MAAR,EAAgBC,QAAQ;AACpB,0BAAMC,YAAYnC,oBACdqB,WAAWc,SADG,EAEdjC,WAFc,EAGdC,aAHc,EAIdC,EAJc,CAAlB;;AAOA,0BAAMgC,WAAWD,UAAUE,QAAV,CAAmBvB,MAAnB,CAAjB;;AAEAI,wBAAIoB,IAAJ,CAASlB,KAAKR,MAAL,EAAawB,QAAb,CAAT;;AAEA,wBAAIZ,MAAJ,EAAY;AACRA,+BAAOU,IAAP;AACH;AACJ,iBAfD;;AAiBA,uBAAOf,IAAP;AACH,a","file":"zoom.js","sourcesContent":["export const getShiftedTransform = (\n    originalTransform,\n    labelsWidth,\n    labelsPadding,\n    d3\n) => {\n    const fullLabelWidth = labelsWidth + labelsPadding;\n\n    const { x, y, k } = originalTransform;\n\n    return d3.zoomIdentity\n        .translate(-fullLabelWidth, 0) // move origin as if there were no labels\n        .translate(x, y) // apply zoom transformation panning\n        .scale(k) // apply zoom transformation scaling\n        .translate(labelsWidth + labelsPadding, 0); // put origin at its original position\n};\n\n/**\n * Given a domain, return a zoomIdentity (transformation) which can be called to zoom to that domain.\n * Translates in reverse direction of the labels before applying the zoom and resets after,\n * which factors out the label when creating zoom.\n *\n * @param {Object} d3 d3 object\n * @param {Object} config configuration\n * @param {Object[]} domain `[date, date]` where first and second is first date and last to zoom to respectively\n * @param {Object} xScale a d3 scaleTime\n * @param {number} width Width of the chart\n * @returns {Object} transform object with x, y, and k (scale)\n *\n * @see https://github.com/d3/d3-zoom#zoomIdentity\n * @example\n *  const transform = getDomainTransform(d3, config, domain, xScale, 1000);\n *  //transform: { x: 1.234, y: 0.323, k: 2.34 }\n */\nexport function getDomainTransform(d3, config, domain, xScale, width) {\n    const { label: { width: labelsWidth, padding: labelsPadding } } = config;\n\n    const fullLabelWidth = labelsWidth + labelsPadding;\n    // For the reason of two additional translate see getShiftedTransform for explanation\n    return d3.zoomIdentity\n        .translate(fullLabelWidth, 0)\n        .scale((width - labelsWidth) / (xScale(domain[1]) - xScale(domain[0])))\n        .translate(-xScale(domain[0]), 0)\n        .translate(-fullLabelWidth, 0);\n}\n\nexport default (\n    d3,\n    svg,\n    config,\n    zoom,\n    xScale,\n    draw,\n    getEvent,\n    width,\n    height\n) => {\n    const {\n        label: { width: labelsWidth, padding: labelsPadding },\n        zoom: {\n            onZoomStart,\n            onZoom,\n            onZoomEnd,\n            minimumScale,\n            maximumScale,\n            restrictPan,\n        },\n    } = config;\n\n    const extentConstraint = [\n        [labelsWidth + labelsPadding, 0],\n        [width, height],\n    ];\n\n    zoom.scaleExtent([minimumScale, maximumScale]);\n\n    //Restricts the pan area to be the specified start/end dates or initial if not set\n    if (restrictPan) {\n        zoom.translateExtent(extentConstraint).extent(extentConstraint);\n    }\n\n    zoom.on('zoom.start', onZoomStart).on('zoom.end', onZoomEnd);\n\n    zoom.on('zoom', args => {\n        const transform = getShiftedTransform(\n            getEvent().transform,\n            labelsWidth,\n            labelsPadding,\n            d3\n        );\n\n        const newScale = transform.rescaleX(xScale);\n\n        svg.call(draw(config, newScale));\n\n        if (onZoom) {\n            onZoom(args);\n        }\n    });\n\n    return zoom;\n};"]}