{"version":3,"file":"events.mjs","sources":["../../../../../node_modules/marks-pane/lib/events.js"],"sourcesContent":["\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.proxyMouse = proxyMouse;\nexports.clone = clone;\n// import 'babelify/polyfill'; // needed for Object.assign\n\nexports.default = {\n    proxyMouse: proxyMouse\n};\n\n/**\n * Start proxying all mouse events that occur on the target node to each node in\n * a set of tracked nodes.\n *\n * The items in tracked do not strictly have to be DOM Nodes, but they do have\n * to have dispatchEvent, getBoundingClientRect, and getClientRects methods.\n *\n * @param target {Node} The node on which to listen for mouse events.\n * @param tracked {Node[]} A (possibly mutable) array of nodes to which to proxy\n *                         events.\n */\n\nfunction proxyMouse(target, tracked) {\n    function dispatch(e) {\n        // We walk through the set of tracked elements in reverse order so that\n        // events are sent to those most recently added first.\n        //\n        // This is the least surprising behaviour as it simulates the way the\n        // browser would work if items added later were drawn \"on top of\"\n        // earlier ones.\n        for (var i = tracked.length - 1; i >= 0; i--) {\n            var t = tracked[i];\n            var x = e.clientX;\n            var y = e.clientY;\n\n            if (e.touches && e.touches.length) {\n                x = e.touches[0].clientX;\n                y = e.touches[0].clientY;\n            }\n\n            if (!contains(t, target, x, y)) {\n                continue;\n            }\n\n            // The event targets this mark, so dispatch a cloned event:\n            t.dispatchEvent(clone(e));\n            // We only dispatch the cloned event to the first matching mark.\n            break;\n        }\n    }\n\n    if (target.nodeName === \"iframe\" || target.nodeName === \"IFRAME\") {\n\n        try {\n            // Try to get the contents if same domain\n            this.target = target.contentDocument;\n        } catch (err) {\n            this.target = target;\n        }\n    } else {\n        this.target = target;\n    }\n\n    var _arr = ['mouseup', 'mousedown', 'click', 'touchstart'];\n    for (var _i = 0; _i < _arr.length; _i++) {\n        var ev = _arr[_i];\n        this.target.addEventListener(ev, function (e) {\n            return dispatch(e);\n        }, false);\n    }\n}\n\n/**\n * Clone a mouse event object.\n *\n * @param e {MouseEvent} A mouse event object to clone.\n * @returns {MouseEvent}\n */\nfunction clone(e) {\n    var opts = Object.assign({}, e, { bubbles: false });\n    try {\n        return new MouseEvent(e.type, opts);\n    } catch (err) {\n        // compat: webkit\n        var copy = document.createEvent('MouseEvents');\n        copy.initMouseEvent(e.type, false, opts.cancelable, opts.view, opts.detail, opts.screenX, opts.screenY, opts.clientX, opts.clientY, opts.ctrlKey, opts.altKey, opts.shiftKey, opts.metaKey, opts.button, opts.relatedTarget);\n        return copy;\n    }\n}\n\n/**\n * Check if the item contains the point denoted by the passed coordinates\n * @param item {Object} An object with getBoundingClientRect and getClientRects\n *                      methods.\n * @param x {Number}\n * @param y {Number}\n * @returns {Boolean}\n */\nfunction contains(item, target, x, y) {\n    // offset\n    var offset = target.getBoundingClientRect();\n\n    function rectContains(r, x, y) {\n        var top = r.top - offset.top;\n        var left = r.left - offset.left;\n        var bottom = top + r.height;\n        var right = left + r.width;\n        return top <= y && left <= x && bottom > y && right > x;\n    }\n\n    // Check overall bounding box first\n    var rect = item.getBoundingClientRect();\n    if (!rectContains(rect, x, y)) {\n        return false;\n    }\n\n    // Then continue to check each child rect\n    var rects = item.getClientRects();\n    for (var i = 0, len = rects.length; i < len; i++) {\n        if (rectContains(rects[i], x, y)) {\n            return true;\n        }\n    }\n    return false;\n}\n"],"names":["events","proxyMouse","clone","target","tracked","dispatch","e","i","t","x","y","contains","_arr","_i","ev","opts","copy","item","offset","rectContains","r","top","left","bottom","right","rect","rects","len"],"mappings":";AAEA,OAAO,eAAeA,GAAS,cAAc;AAAA,EACzC,OAAO;AACX,CAAC;AACDA,EAAA,aAAqBC;AACrBD,EAAA,QAAgBE;AAGhBF,EAAA,UAAkB;AAAA,EACd,YAAYC;AAChB;AAcA,SAASA,EAAWE,GAAQC,GAAS;AACjC,WAASC,EAASC,GAAG;AAOjB,aAASC,IAAIH,EAAQ,SAAS,GAAGG,KAAK,GAAGA,KAAK;AAC1C,UAAIC,IAAIJ,EAAQG,CAAC,GACbE,IAAIH,EAAE,SACNI,IAAIJ,EAAE;AAOV,UALIA,EAAE,WAAWA,EAAE,QAAQ,WACvBG,IAAIH,EAAE,QAAQ,CAAC,EAAE,SACjBI,IAAIJ,EAAE,QAAQ,CAAC,EAAE,UAGjB,EAACK,EAASH,GAAGL,GAAQM,GAAGC,CAAC,GAK7B;AAAA,QAAAF,EAAE,cAAcN,EAAMI,CAAC,CAAC;AAExB;AAAA;AAAA,IACZ;AAAA,EACA;AAEI,MAAIH,EAAO,aAAa,YAAYA,EAAO,aAAa;AAEpD,QAAI;AAEA,WAAK,SAASA,EAAO;AAAA,IACjC,QAAsB;AACV,WAAK,SAASA;AAAA,IAC1B;AAAA;AAEQ,SAAK,SAASA;AAIlB,WADIS,IAAO,CAAC,WAAW,aAAa,SAAS,YAAY,GAChDC,IAAK,GAAGA,IAAKD,EAAK,QAAQC,KAAM;AACrC,QAAIC,IAAKF,EAAKC,CAAE;AAChB,SAAK,OAAO,iBAAiBC,GAAI,SAAUR,GAAG;AAC1C,aAAOD,EAASC,CAAC;AAAA,IAC7B,GAAW,EAAK;AAAA,EAChB;AACA;AAQA,SAASJ,EAAMI,GAAG;AACd,MAAIS,IAAO,OAAO,OAAO,CAAA,GAAIT,GAAG,EAAE,SAAS,IAAO;AAClD,MAAI;AACA,WAAO,IAAI,WAAWA,EAAE,MAAMS,CAAI;AAAA,EAC1C,QAAkB;AAEV,QAAIC,IAAO,SAAS,YAAY,aAAa;AAC7C,WAAAA,EAAK,eAAeV,EAAE,MAAM,IAAOS,EAAK,YAAYA,EAAK,MAAMA,EAAK,QAAQA,EAAK,SAASA,EAAK,SAASA,EAAK,SAASA,EAAK,SAASA,EAAK,SAASA,EAAK,QAAQA,EAAK,UAAUA,EAAK,SAASA,EAAK,QAAQA,EAAK,aAAa,GACpNC;AAAA,EACf;AACA;AAUA,SAASL,EAASM,GAAMd,GAAQM,GAAGC,GAAG;AAElC,MAAIQ,IAASf,EAAO,sBAAqB;AAEzC,WAASgB,EAAaC,GAAGX,GAAGC,GAAG;AAC3B,QAAIW,IAAMD,EAAE,MAAMF,EAAO,KACrBI,IAAOF,EAAE,OAAOF,EAAO,MACvBK,IAASF,IAAMD,EAAE,QACjBI,IAAQF,IAAOF,EAAE;AACrB,WAAOC,KAAOX,KAAKY,KAAQb,KAAKc,IAASb,KAAKc,IAAQf;AAAA,EAC9D;AAGI,MAAIgB,IAAOR,EAAK,sBAAqB;AACrC,MAAI,CAACE,EAAaM,GAAMhB,GAAGC,CAAC;AACxB,WAAO;AAKX,WADIgB,IAAQT,EAAK,eAAc,GACtBV,IAAI,GAAGoB,IAAMD,EAAM,QAAQnB,IAAIoB,GAAKpB;AACzC,QAAIY,EAAaO,EAAMnB,CAAC,GAAGE,GAAGC,CAAC;AAC3B,aAAO;AAGf,SAAO;AACX;","x_google_ignoreList":[0]}